1; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck -check-prefixes=GCN,SICIVI,FUNC %s
2; RUN: llc -march=amdgcn -mcpu=tonga -mattr=-flat-for-global,-enable-ds128 -verify-machineinstrs < %s | FileCheck -check-prefixes=GCN,SICIVI,FUNC %s
3; RUN: llc -march=amdgcn -mcpu=gfx900 -mattr=-flat-for-global,-enable-ds128 -verify-machineinstrs < %s | FileCheck -check-prefixes=GCN,VI,FUNC %s
4; RUN: llc -march=amdgcn -mcpu=gfx908 -mattr=-flat-for-global,-enable-ds128 -verify-machineinstrs < %s | FileCheck -check-prefixes=GCN,VI,FUNC %s
5; RUN: llc -march=r600 -mcpu=redwood < %s | FileCheck -check-prefix=EG -check-prefix=FUNC %s
6
7; Testing for ds_read/write_128
8; RUN: llc -march=amdgcn -mcpu=tahiti -mattr=+enable-ds128 < %s | FileCheck -check-prefixes=SI,FUNC %s
9; RUN: llc -march=amdgcn -mcpu=tonga -mattr=+enable-ds128 < %s | FileCheck -check-prefixes=CIVI,FUNC %s
10; RUN: llc -march=amdgcn -mcpu=gfx900 -mattr=+enable-ds128 < %s | FileCheck -check-prefixes=CIVI,FUNC %s
11
12; FUNC-LABEL: {{^}}local_load_i32:
13; GCN-NOT: s_wqm_b64
14; SICIVI: s_mov_b32 m0, -1
15; GFX9-NOT: m0
16; GCN: ds_read_b32
17
18; EG: LDS_READ_RET
19define amdgpu_kernel void @local_load_i32(i32 addrspace(3)* %out, i32 addrspace(3)* %in) #0 {
20entry:
21  %ld = load i32, i32 addrspace(3)* %in
22  store i32 %ld, i32 addrspace(3)* %out
23  ret void
24}
25
26; FUNC-LABEL: {{^}}local_load_v2i32:
27; SICIVI: s_mov_b32 m0, -1
28; GFX9-NOT: m0
29
30; GCN: ds_read_b64
31define amdgpu_kernel void @local_load_v2i32(<2 x i32> addrspace(3)* %out, <2 x i32> addrspace(3)* %in) #0 {
32entry:
33  %ld = load <2 x i32>, <2 x i32> addrspace(3)* %in
34  store <2 x i32> %ld, <2 x i32> addrspace(3)* %out
35  ret void
36}
37
38; FUNC-LABEL: {{^}}local_load_v3i32:
39; SICIVI: s_mov_b32 m0, -1
40; GFX9-NOT: m0
41
42; GCN-DAG: ds_read_b64
43; GCN-DAG: ds_read_b32
44define amdgpu_kernel void @local_load_v3i32(<3 x i32> addrspace(3)* %out, <3 x i32> addrspace(3)* %in) #0 {
45entry:
46  %ld = load <3 x i32>, <3 x i32> addrspace(3)* %in
47  store <3 x i32> %ld, <3 x i32> addrspace(3)* %out
48  ret void
49}
50
51; FUNC-LABEL: {{^}}local_load_v4i32:
52; SICIVI: s_mov_b32 m0, -1
53; GFX9-NOT: m0
54
55; GCN: ds_read2_b64 v{{\[[0-9]+:[0-9]+\]}}, v{{[0-9]+}} offset1:1{{$}}
56
57define amdgpu_kernel void @local_load_v4i32(<4 x i32> addrspace(3)* %out, <4 x i32> addrspace(3)* %in) #0 {
58entry:
59  %ld = load <4 x i32>, <4 x i32> addrspace(3)* %in
60  store <4 x i32> %ld, <4 x i32> addrspace(3)* %out
61  ret void
62}
63
64; FUNC-LABEL: {{^}}local_load_v8i32:
65; SICIVI: s_mov_b32 m0, -1
66; GFX9-NOT: m0
67
68; GCN-DAG: ds_read2_b64 v{{\[[0-9]+:[0-9]+\]}}, v{{[0-9]+}} offset0:2 offset1:3{{$}}
69; GCN-DAG: ds_read2_b64 v{{\[[0-9]+:[0-9]+\]}}, v{{[0-9]+}} offset1:1{{$}}
70define amdgpu_kernel void @local_load_v8i32(<8 x i32> addrspace(3)* %out, <8 x i32> addrspace(3)* %in) #0 {
71entry:
72  %ld = load <8 x i32>, <8 x i32> addrspace(3)* %in
73  store <8 x i32> %ld, <8 x i32> addrspace(3)* %out
74  ret void
75}
76
77; FUNC-LABEL: {{^}}local_load_v16i32:
78; SICIVI: s_mov_b32 m0, -1
79; GFX9-NOT: m0
80
81; GCN-DAG: ds_read2_b64 v{{\[[0-9]+:[0-9]+\]}}, v{{[0-9]+}} offset0:6 offset1:7{{$}}
82; GCN-DAG: ds_read2_b64 v{{\[[0-9]+:[0-9]+\]}}, v{{[0-9]+}} offset0:4 offset1:5{{$}}
83; GCN-DAG: ds_read2_b64 v{{\[[0-9]+:[0-9]+\]}}, v{{[0-9]+}} offset0:2 offset1:3{{$}}
84; GCN-DAG: ds_read2_b64 v{{\[[0-9]+:[0-9]+\]}}, v{{[0-9]+}} offset1:1{{$}}
85; GCN-DAG: ds_write2_b64 v{{[0-9]+}}, v{{\[[0-9]+:[0-9]+\]}}, v{{\[[0-9]+:[0-9]+\]}} offset0:6 offset1:7
86; GCN-DAG: ds_write2_b64 v{{[0-9]+}}, v{{\[[0-9]+:[0-9]+\]}}, v{{\[[0-9]+:[0-9]+\]}} offset0:4 offset1:5
87; GCN-DAG: ds_write2_b64 v{{[0-9]+}}, v{{\[[0-9]+:[0-9]+\]}}, v{{\[[0-9]+:[0-9]+\]}} offset0:2 offset1:3
88; GCN-DAG: ds_write2_b64 v{{[0-9]+}}, v{{\[[0-9]+:[0-9]+\]}}, v{{\[[0-9]+:[0-9]+\]}} offset1:1
89define amdgpu_kernel void @local_load_v16i32(<16 x i32> addrspace(3)* %out, <16 x i32> addrspace(3)* %in) #0 {
90entry:
91  %ld = load <16 x i32>, <16 x i32> addrspace(3)* %in
92  store <16 x i32> %ld, <16 x i32> addrspace(3)* %out
93  ret void
94}
95
96; FUNC-LABEL: {{^}}local_zextload_i32_to_i64:
97; SICIVI: s_mov_b32 m0, -1
98; GFX9-NOT: m0
99
100define amdgpu_kernel void @local_zextload_i32_to_i64(i64 addrspace(3)* %out, i32 addrspace(3)* %in) #0 {
101  %ld = load i32, i32 addrspace(3)* %in
102  %ext = zext i32 %ld to i64
103  store i64 %ext, i64 addrspace(3)* %out
104  ret void
105}
106
107; FUNC-LABEL: {{^}}local_sextload_i32_to_i64:
108; SICIVI: s_mov_b32 m0, -1
109; GFX9-NOT: m0
110
111define amdgpu_kernel void @local_sextload_i32_to_i64(i64 addrspace(3)* %out, i32 addrspace(3)* %in) #0 {
112  %ld = load i32, i32 addrspace(3)* %in
113  %ext = sext i32 %ld to i64
114  store i64 %ext, i64 addrspace(3)* %out
115  ret void
116}
117
118; FUNC-LABEL: {{^}}local_zextload_v1i32_to_v1i64:
119; SICIVI: s_mov_b32 m0, -1
120; GFX9-NOT: m0
121
122define amdgpu_kernel void @local_zextload_v1i32_to_v1i64(<1 x i64> addrspace(3)* %out, <1 x i32> addrspace(3)* %in) #0 {
123  %ld = load <1 x i32>, <1 x i32> addrspace(3)* %in
124  %ext = zext <1 x i32> %ld to <1 x i64>
125  store <1 x i64> %ext, <1 x i64> addrspace(3)* %out
126  ret void
127}
128
129; FUNC-LABEL: {{^}}local_sextload_v1i32_to_v1i64:
130; SICIVI: s_mov_b32 m0, -1
131; GFX9-NOT: m0
132
133define amdgpu_kernel void @local_sextload_v1i32_to_v1i64(<1 x i64> addrspace(3)* %out, <1 x i32> addrspace(3)* %in) #0 {
134  %ld = load <1 x i32>, <1 x i32> addrspace(3)* %in
135  %ext = sext <1 x i32> %ld to <1 x i64>
136  store <1 x i64> %ext, <1 x i64> addrspace(3)* %out
137  ret void
138}
139
140; FUNC-LABEL: {{^}}local_zextload_v2i32_to_v2i64:
141; SICIVI: s_mov_b32 m0, -1
142; GFX9-NOT: m0
143
144define amdgpu_kernel void @local_zextload_v2i32_to_v2i64(<2 x i64> addrspace(3)* %out, <2 x i32> addrspace(3)* %in) #0 {
145  %ld = load <2 x i32>, <2 x i32> addrspace(3)* %in
146  %ext = zext <2 x i32> %ld to <2 x i64>
147  store <2 x i64> %ext, <2 x i64> addrspace(3)* %out
148  ret void
149}
150
151; FUNC-LABEL: {{^}}local_sextload_v2i32_to_v2i64:
152; SICIVI: s_mov_b32 m0, -1
153; GFX9-NOT: m0
154
155define amdgpu_kernel void @local_sextload_v2i32_to_v2i64(<2 x i64> addrspace(3)* %out, <2 x i32> addrspace(3)* %in) #0 {
156  %ld = load <2 x i32>, <2 x i32> addrspace(3)* %in
157  %ext = sext <2 x i32> %ld to <2 x i64>
158  store <2 x i64> %ext, <2 x i64> addrspace(3)* %out
159  ret void
160}
161
162; FUNC-LABEL: {{^}}local_zextload_v4i32_to_v4i64:
163; SICIVI: s_mov_b32 m0, -1
164; GFX9-NOT: m0
165
166define amdgpu_kernel void @local_zextload_v4i32_to_v4i64(<4 x i64> addrspace(3)* %out, <4 x i32> addrspace(3)* %in) #0 {
167  %ld = load <4 x i32>, <4 x i32> addrspace(3)* %in
168  %ext = zext <4 x i32> %ld to <4 x i64>
169  store <4 x i64> %ext, <4 x i64> addrspace(3)* %out
170  ret void
171}
172
173; FUNC-LABEL: {{^}}local_sextload_v4i32_to_v4i64:
174; SICIVI: s_mov_b32 m0, -1
175; GFX9-NOT: m0
176
177define amdgpu_kernel void @local_sextload_v4i32_to_v4i64(<4 x i64> addrspace(3)* %out, <4 x i32> addrspace(3)* %in) #0 {
178  %ld = load <4 x i32>, <4 x i32> addrspace(3)* %in
179  %ext = sext <4 x i32> %ld to <4 x i64>
180  store <4 x i64> %ext, <4 x i64> addrspace(3)* %out
181  ret void
182}
183
184; Tests if ds_read/write_b128 gets generated for the 16 byte aligned load.
185; FUNC-LABEL: {{^}}local_v4i32_to_128:
186
187; SI-NOT: ds_read_b128
188; SI-NOT: ds_write_b128
189
190; CIVI: ds_read_b128
191; CIVI: ds_write_b128
192
193; EG: LDS_READ_RET
194; EG: LDS_READ_RET
195; EG: LDS_READ_RET
196; EG: LDS_READ_RET
197define amdgpu_kernel void @local_v4i32_to_128(<4 x i32> addrspace(3)* %out, <4 x i32> addrspace(3)* %in) {
198  %ld = load <4 x i32>, <4 x i32> addrspace(3)* %in, align 16
199  store <4 x i32> %ld, <4 x i32> addrspace(3)* %out, align 16
200  ret void
201}
202
203; FUNC-LABEL: {{^}}local_zextload_v8i32_to_v8i64:
204; SICIVI: s_mov_b32 m0, -1
205; GFX9-NOT: m0
206
207define amdgpu_kernel void @local_zextload_v8i32_to_v8i64(<8 x i64> addrspace(3)* %out, <8 x i32> addrspace(3)* %in) #0 {
208  %ld = load <8 x i32>, <8 x i32> addrspace(3)* %in
209  %ext = zext <8 x i32> %ld to <8 x i64>
210  store <8 x i64> %ext, <8 x i64> addrspace(3)* %out
211  ret void
212}
213
214; FUNC-LABEL: {{^}}local_sextload_v8i32_to_v8i64:
215; SICIVI: s_mov_b32 m0, -1
216; GFX9-NOT: m0
217
218define amdgpu_kernel void @local_sextload_v8i32_to_v8i64(<8 x i64> addrspace(3)* %out, <8 x i32> addrspace(3)* %in) #0 {
219  %ld = load <8 x i32>, <8 x i32> addrspace(3)* %in
220  %ext = sext <8 x i32> %ld to <8 x i64>
221  store <8 x i64> %ext, <8 x i64> addrspace(3)* %out
222  ret void
223}
224
225; FUNC-LABEL: {{^}}local_sextload_v16i32_to_v16i64:
226; SICIVI: s_mov_b32 m0, -1
227; GFX9-NOT: m0
228
229define amdgpu_kernel void @local_sextload_v16i32_to_v16i64(<16 x i64> addrspace(3)* %out, <16 x i32> addrspace(3)* %in) #0 {
230  %ld = load <16 x i32>, <16 x i32> addrspace(3)* %in
231  %ext = sext <16 x i32> %ld to <16 x i64>
232  store <16 x i64> %ext, <16 x i64> addrspace(3)* %out
233  ret void
234}
235
236; FUNC-LABEL: {{^}}local_zextload_v16i32_to_v16i64
237; SICIVI: s_mov_b32 m0, -1
238; GFX9-NOT: m0
239
240define amdgpu_kernel void @local_zextload_v16i32_to_v16i64(<16 x i64> addrspace(3)* %out, <16 x i32> addrspace(3)* %in) #0 {
241  %ld = load <16 x i32>, <16 x i32> addrspace(3)* %in
242  %ext = zext <16 x i32> %ld to <16 x i64>
243  store <16 x i64> %ext, <16 x i64> addrspace(3)* %out
244  ret void
245}
246
247; FUNC-LABEL: {{^}}local_sextload_v32i32_to_v32i64:
248; SICIVI: s_mov_b32 m0, -1
249; GFX9-NOT: m0
250
251define amdgpu_kernel void @local_sextload_v32i32_to_v32i64(<32 x i64> addrspace(3)* %out, <32 x i32> addrspace(3)* %in) #0 {
252  %ld = load <32 x i32>, <32 x i32> addrspace(3)* %in
253  %ext = sext <32 x i32> %ld to <32 x i64>
254  store <32 x i64> %ext, <32 x i64> addrspace(3)* %out
255  ret void
256}
257
258; FUNC-LABEL: {{^}}local_zextload_v32i32_to_v32i64:
259; SICIVI: s_mov_b32 m0, -1
260; GFX9-NOT: m0
261
262define amdgpu_kernel void @local_zextload_v32i32_to_v32i64(<32 x i64> addrspace(3)* %out, <32 x i32> addrspace(3)* %in) #0 {
263  %ld = load <32 x i32>, <32 x i32> addrspace(3)* %in
264  %ext = zext <32 x i32> %ld to <32 x i64>
265  store <32 x i64> %ext, <32 x i64> addrspace(3)* %out
266  ret void
267}
268
269; FUNC-LABEL: {{^}}local_load_v32i32:
270; SICIVI: s_mov_b32 m0, -1
271; GFX9-NOT: m0
272; GFX9-NOT: accvgpr
273
274define amdgpu_kernel void @local_load_v32i32(<32 x i32> addrspace(3)* %out, <32 x i32> addrspace(3)* %in) #0 {
275  %ld = load <32 x i32>, <32 x i32> addrspace(3)* %in
276  store <32 x i32> %ld, <32 x i32> addrspace(3)* %out
277  ret void
278}
279
280attributes #0 = { nounwind }
281