1; RUN: llc -march=amdgcn -mcpu=verde -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=FUNC %s
2; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=FUNC %s
3; RUN: llc -march=r600 -mcpu=redwood < %s | FileCheck -check-prefix=EG -check-prefix=FUNC %s
4; RUN: llc -march=r600 -mcpu=cayman < %s | FileCheck -check-prefix=CM -check-prefix=FUNC %s
5
6; FUNC-LABEL: {{^}}store_local_i1:
7; EG: LDS_BYTE_WRITE
8
9; CM: LDS_BYTE_WRITE
10
11; GCN: ds_write_b8
12define void @store_local_i1(i1 addrspace(3)* %out) {
13entry:
14  store i1 true, i1 addrspace(3)* %out
15  ret void
16}
17
18; FUNC-LABEL: {{^}}store_local_i8:
19; EG: LDS_BYTE_WRITE
20
21; CM: LDS_BYTE_WRITE
22
23; GCN: ds_write_b8
24define void @store_local_i8(i8 addrspace(3)* %out, i8 %in) {
25  store i8 %in, i8 addrspace(3)* %out
26  ret void
27}
28
29; FUNC-LABEL: {{^}}store_local_i16:
30; EG: LDS_SHORT_WRITE
31
32; CM: LDS_SHORT_WRITE
33
34; GCN: ds_write_b16
35define void @store_local_i16(i16 addrspace(3)* %out, i16 %in) {
36  store i16 %in, i16 addrspace(3)* %out
37  ret void
38}
39
40; FUNC-LABEL: {{^}}store_local_v2i16:
41; EG: LDS_WRITE
42
43; CM: LDS_WRITE
44
45; GCN: ds_write_b32
46define void @store_local_v2i16(<2 x i16> addrspace(3)* %out, <2 x i16> %in) {
47entry:
48  store <2 x i16> %in, <2 x i16> addrspace(3)* %out
49  ret void
50}
51
52; FUNC-LABEL: {{^}}store_local_v4i8:
53; EG: LDS_WRITE
54
55; CM: LDS_WRITE
56
57; GCN: ds_write_b32
58define void @store_local_v4i8(<4 x i8> addrspace(3)* %out, <4 x i8> %in) {
59entry:
60  store <4 x i8> %in, <4 x i8> addrspace(3)* %out
61  ret void
62}
63
64; FUNC-LABEL: {{^}}store_local_v4i8_unaligned:
65; EG: LDS_BYTE_WRITE
66; EG: LDS_BYTE_WRITE
67; EG: LDS_BYTE_WRITE
68; EG: LDS_BYTE_WRITE
69; EG-NOT: LDS_WRITE
70
71; CM: LDS_BYTE_WRITE
72; CM: LDS_BYTE_WRITE
73; CM: LDS_BYTE_WRITE
74; CM: LDS_BYTE_WRITE
75; CM-NOT: LDS_WRITE
76
77; GCN: ds_write_b8
78; GCN: ds_write_b8
79; GCN: ds_write_b8
80; GCN: ds_write_b8
81define void @store_local_v4i8_unaligned(<4 x i8> addrspace(3)* %out, <4 x i8> %in) {
82entry:
83  store <4 x i8> %in, <4 x i8> addrspace(3)* %out, align 1
84  ret void
85}
86
87; FUNC-LABEL: {{^}}store_local_v4i8_halfaligned:
88; EG: LDS_SHORT_WRITE
89; EG: LDS_SHORT_WRITE
90; EG-NOT: LDS_WRITE
91
92; CM: LDS_SHORT_WRITE
93; CM: LDS_SHORT_WRITE
94; CM-NOT: LDS_WRITE
95
96; GCN: ds_write_b16
97; GCN: ds_write_b16
98define void @store_local_v4i8_halfaligned(<4 x i8> addrspace(3)* %out, <4 x i8> %in) {
99entry:
100  store <4 x i8> %in, <4 x i8> addrspace(3)* %out, align 2
101  ret void
102}
103
104; FUNC-LABEL: {{^}}store_local_v2i32:
105; EG: LDS_WRITE
106; EG: LDS_WRITE
107; EG-NOT: LDS_WRITE
108
109; CM: LDS_WRITE
110; CM: LDS_WRITE
111; CM-NOT: LDS_WRITE
112
113; GCN: ds_write_b64
114define void @store_local_v2i32(<2 x i32> addrspace(3)* %out, <2 x i32> %in) {
115entry:
116  store <2 x i32> %in, <2 x i32> addrspace(3)* %out
117  ret void
118}
119
120; FUNC-LABEL: {{^}}store_local_v4i32:
121; EG: LDS_WRITE
122; EG: LDS_WRITE
123; EG: LDS_WRITE
124; EG: LDS_WRITE
125
126; CM: LDS_WRITE
127; CM: LDS_WRITE
128; CM: LDS_WRITE
129; CM: LDS_WRITE
130
131; GCN: ds_write2_b64
132define void @store_local_v4i32(<4 x i32> addrspace(3)* %out, <4 x i32> %in) {
133entry:
134  store <4 x i32> %in, <4 x i32> addrspace(3)* %out
135  ret void
136}
137
138; FUNC-LABEL: {{^}}store_local_v4i32_align4:
139; EG: LDS_WRITE
140; EG: LDS_WRITE
141; EG: LDS_WRITE
142; EG: LDS_WRITE
143
144; CM: LDS_WRITE
145; CM: LDS_WRITE
146; CM: LDS_WRITE
147; CM: LDS_WRITE
148
149; GCN: ds_write2_b32
150; GCN: ds_write2_b32
151define void @store_local_v4i32_align4(<4 x i32> addrspace(3)* %out, <4 x i32> %in) {
152entry:
153  store <4 x i32> %in, <4 x i32> addrspace(3)* %out, align 4
154  ret void
155}
156
157; FUNC-LABEL: {{^}}store_local_i64_i8:
158; EG: LDS_BYTE_WRITE
159; GCN: ds_write_b8
160define void @store_local_i64_i8(i8 addrspace(3)* %out, i64 %in) {
161entry:
162  %0 = trunc i64 %in to i8
163  store i8 %0, i8 addrspace(3)* %out
164  ret void
165}
166
167; FUNC-LABEL: {{^}}store_local_i64_i16:
168; EG: LDS_SHORT_WRITE
169; GCN: ds_write_b16
170define void @store_local_i64_i16(i16 addrspace(3)* %out, i64 %in) {
171entry:
172  %0 = trunc i64 %in to i16
173  store i16 %0, i16 addrspace(3)* %out
174  ret void
175}
176