1 ; RUN: llc -march=amdgcn -mcpu=SI -verify-machineinstrs< %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s
2 ; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs< %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s
3 ; RUN: llc -march=r600 -mcpu=cypress < %s | FileCheck -check-prefix=EG -check-prefix=FUNC %s
5 ; FUNC-LABEL: {{^}}zextload_global_i32_to_i64:
6 ; SI: buffer_load_dword v[[LO:[0-9]+]],
7 ; SI: v_mov_b32_e32 v[[HI:[0-9]+]], 0{{$}}
8 ; SI: buffer_store_dwordx2 v{{\[}}[[LO]]:[[HI]]]
9 define void @zextload_global_i32_to_i64(i64 addrspace(1)* %out, i32 addrspace(1)* %in) nounwind {
10 %a = load i32, i32 addrspace(1)* %in
11 %ext = zext i32 %a to i64
12 store i64 %ext, i64 addrspace(1)* %out
16 ; FUNC-LABEL: {{^}}sextload_global_i32_to_i64:
17 ; SI: buffer_load_dword [[LOAD:v[0-9]+]],
18 ; SI: v_ashrrev_i32_e32 v{{[0-9]+}}, 31, [[LOAD]]
19 ; SI: buffer_store_dwordx2
20 define void @sextload_global_i32_to_i64(i64 addrspace(1)* %out, i32 addrspace(1)* %in) nounwind {
21 %a = load i32, i32 addrspace(1)* %in
22 %ext = sext i32 %a to i64
23 store i64 %ext, i64 addrspace(1)* %out
27 ; FUNC-LABEL: {{^}}zextload_global_v1i32_to_v1i64:
28 ; SI: buffer_load_dword
29 ; SI: buffer_store_dwordx2
31 define void @zextload_global_v1i32_to_v1i64(<1 x i64> addrspace(1)* %out, <1 x i32> addrspace(1)* nocapture %in) nounwind {
32 %load = load <1 x i32>, <1 x i32> addrspace(1)* %in
33 %ext = zext <1 x i32> %load to <1 x i64>
34 store <1 x i64> %ext, <1 x i64> addrspace(1)* %out
38 ; FUNC-LABEL: {{^}}sextload_global_v1i32_to_v1i64:
39 ; SI: buffer_load_dword
41 ; SI: buffer_store_dwordx2
43 define void @sextload_global_v1i32_to_v1i64(<1 x i64> addrspace(1)* %out, <1 x i32> addrspace(1)* nocapture %in) nounwind {
44 %load = load <1 x i32>, <1 x i32> addrspace(1)* %in
45 %ext = sext <1 x i32> %load to <1 x i64>
46 store <1 x i64> %ext, <1 x i64> addrspace(1)* %out
50 ; FUNC-LABEL: {{^}}zextload_global_v2i32_to_v2i64:
51 ; SI: buffer_load_dwordx2
52 ; SI: buffer_store_dwordx2
53 ; SI: buffer_store_dwordx2
55 define void @zextload_global_v2i32_to_v2i64(<2 x i64> addrspace(1)* %out, <2 x i32> addrspace(1)* nocapture %in) nounwind {
56 %load = load <2 x i32>, <2 x i32> addrspace(1)* %in
57 %ext = zext <2 x i32> %load to <2 x i64>
58 store <2 x i64> %ext, <2 x i64> addrspace(1)* %out
62 ; FUNC-LABEL: {{^}}sextload_global_v2i32_to_v2i64:
63 ; SI: buffer_load_dwordx2
64 ; SI-DAG: v_ashrrev_i32
65 ; SI-DAG: v_ashrrev_i32
66 ; SI-DAG: buffer_store_dwordx2
67 ; SI-DAG: buffer_store_dwordx2
69 define void @sextload_global_v2i32_to_v2i64(<2 x i64> addrspace(1)* %out, <2 x i32> addrspace(1)* nocapture %in) nounwind {
70 %load = load <2 x i32>, <2 x i32> addrspace(1)* %in
71 %ext = sext <2 x i32> %load to <2 x i64>
72 store <2 x i64> %ext, <2 x i64> addrspace(1)* %out
76 ; FUNC-LABEL: {{^}}zextload_global_v4i32_to_v4i64:
77 ; SI: buffer_load_dwordx4
78 ; SI: buffer_store_dwordx2
79 ; SI: buffer_store_dwordx2
80 ; SI: buffer_store_dwordx2
81 ; SI: buffer_store_dwordx2
83 define void @zextload_global_v4i32_to_v4i64(<4 x i64> addrspace(1)* %out, <4 x i32> addrspace(1)* nocapture %in) nounwind {
84 %load = load <4 x i32>, <4 x i32> addrspace(1)* %in
85 %ext = zext <4 x i32> %load to <4 x i64>
86 store <4 x i64> %ext, <4 x i64> addrspace(1)* %out
90 ; FUNC-LABEL: {{^}}sextload_global_v4i32_to_v4i64:
91 ; SI: buffer_load_dwordx4
92 ; SI-DAG: v_ashrrev_i32
93 ; SI-DAG: v_ashrrev_i32
94 ; SI-DAG: v_ashrrev_i32
95 ; SI-DAG: v_ashrrev_i32
96 ; SI-DAG: buffer_store_dwordx2
97 ; SI-DAG: buffer_store_dwordx2
98 ; SI-DAG: buffer_store_dwordx2
99 ; SI-DAG: buffer_store_dwordx2
101 define void @sextload_global_v4i32_to_v4i64(<4 x i64> addrspace(1)* %out, <4 x i32> addrspace(1)* nocapture %in) nounwind {
102 %load = load <4 x i32>, <4 x i32> addrspace(1)* %in
103 %ext = sext <4 x i32> %load to <4 x i64>
104 store <4 x i64> %ext, <4 x i64> addrspace(1)* %out
108 ; FUNC-LABEL: {{^}}zextload_global_v8i32_to_v8i64:
109 ; SI: buffer_load_dword
110 ; SI: buffer_load_dword
111 ; SI: buffer_load_dword
112 ; SI: buffer_load_dword
113 ; SI: buffer_load_dword
114 ; SI: buffer_load_dword
115 ; SI: buffer_load_dword
116 ; SI: buffer_load_dword
117 ; SI-DAG: buffer_store_dwordx2
118 ; SI-DAG: buffer_store_dwordx2
119 ; SI-DAG: buffer_store_dwordx2
120 ; SI-DAG: buffer_store_dwordx2
121 ; SI-DAG: buffer_store_dwordx2
122 ; SI-DAG: buffer_store_dwordx2
123 ; SI-DAG: buffer_store_dwordx2
124 ; SI-DAG: buffer_store_dwordx2
126 define void @zextload_global_v8i32_to_v8i64(<8 x i64> addrspace(1)* %out, <8 x i32> addrspace(1)* nocapture %in) nounwind {
127 %load = load <8 x i32>, <8 x i32> addrspace(1)* %in
128 %ext = zext <8 x i32> %load to <8 x i64>
129 store <8 x i64> %ext, <8 x i64> addrspace(1)* %out
133 ; FUNC-LABEL: {{^}}sextload_global_v8i32_to_v8i64:
134 ; SI: buffer_load_dword
135 ; SI: buffer_load_dword
136 ; SI: buffer_load_dword
137 ; SI: buffer_load_dword
138 ; SI: buffer_load_dword
139 ; SI: buffer_load_dword
140 ; SI: buffer_load_dword
141 ; SI: buffer_load_dword
143 ; SI-DAG: v_ashrrev_i32
144 ; SI-DAG: v_ashrrev_i32
145 ; SI-DAG: v_ashrrev_i32
146 ; SI-DAG: v_ashrrev_i32
147 ; SI-DAG: v_ashrrev_i32
148 ; SI-DAG: v_ashrrev_i32
149 ; SI-DAG: v_ashrrev_i32
150 ; SI-DAG: v_ashrrev_i32
151 ; SI-DAG: buffer_store_dwordx2
152 ; SI-DAG: buffer_store_dwordx2
153 ; SI-DAG: buffer_store_dwordx2
154 ; SI-DAG: buffer_store_dwordx2
155 ; SI-DAG: buffer_store_dwordx2
156 ; SI-DAG: buffer_store_dwordx2
157 ; SI-DAG: buffer_store_dwordx2
158 ; SI-DAG: buffer_store_dwordx2
161 define void @sextload_global_v8i32_to_v8i64(<8 x i64> addrspace(1)* %out, <8 x i32> addrspace(1)* nocapture %in) nounwind {
162 %load = load <8 x i32>, <8 x i32> addrspace(1)* %in
163 %ext = sext <8 x i32> %load to <8 x i64>
164 store <8 x i64> %ext, <8 x i64> addrspace(1)* %out
168 ; FUNC-LABEL: {{^}}sextload_global_v16i32_to_v16i64:
169 ; SI: buffer_load_dword
170 ; SI: buffer_load_dword
171 ; SI: buffer_load_dword
172 ; SI: buffer_load_dword
173 ; SI: buffer_load_dword
174 ; SI: buffer_load_dword
175 ; SI: buffer_load_dword
176 ; SI: buffer_load_dword
177 ; SI: buffer_load_dword
178 ; SI: buffer_load_dword
179 ; SI: buffer_load_dword
180 ; SI: buffer_load_dword
181 ; SI: buffer_load_dword
182 ; SI: buffer_load_dword
183 ; SI: buffer_load_dword
184 ; SI: buffer_load_dword
186 ; SI-DAG: v_ashrrev_i32
187 ; SI-DAG: v_ashrrev_i32
188 ; SI-DAG: v_ashrrev_i32
189 ; SI-DAG: v_ashrrev_i32
190 ; SI-DAG: buffer_store_dwordx2
191 ; SI-DAG: buffer_store_dwordx2
193 ; SI-DAG: v_ashrrev_i32
194 ; SI-DAG: v_ashrrev_i32
195 ; SI-DAG: v_ashrrev_i32
196 ; SI-DAG: v_ashrrev_i32
197 ; SI-DAG: buffer_store_dwordx2
198 ; SI-DAG: buffer_store_dwordx2
200 ; SI-DAG: v_ashrrev_i32
201 ; SI-DAG: v_ashrrev_i32
202 ; SI-DAG: v_ashrrev_i32
203 ; SI-DAG: v_ashrrev_i32
204 ; SI-DAG: buffer_store_dwordx2
205 ; SI-DAG: buffer_store_dwordx2
207 ; SI-DAG: v_ashrrev_i32
208 ; SI-DAG: v_ashrrev_i32
209 ; SI-DAG: v_ashrrev_i32
210 ; SI-DAG: v_ashrrev_i32
211 ; SI-DAG: buffer_store_dwordx2
212 ; SI-DAG: buffer_store_dwordx2
214 define void @sextload_global_v16i32_to_v16i64(<16 x i64> addrspace(1)* %out, <16 x i32> addrspace(1)* nocapture %in) nounwind {
215 %load = load <16 x i32>, <16 x i32> addrspace(1)* %in
216 %ext = sext <16 x i32> %load to <16 x i64>
217 store <16 x i64> %ext, <16 x i64> addrspace(1)* %out
221 ; FUNC-LABEL: {{^}}zextload_global_v16i32_to_v16i64
222 ; SI: buffer_load_dword
223 ; SI: buffer_load_dword
224 ; SI: buffer_load_dword
225 ; SI: buffer_load_dword
226 ; SI: buffer_load_dword
227 ; SI: buffer_load_dword
228 ; SI: buffer_load_dword
229 ; SI: buffer_load_dword
230 ; SI: buffer_load_dword
231 ; SI: buffer_load_dword
232 ; SI: buffer_load_dword
233 ; SI: buffer_load_dword
234 ; SI: buffer_load_dword
235 ; SI: buffer_load_dword
236 ; SI: buffer_load_dword
237 ; SI: buffer_load_dword
239 ; SI: buffer_store_dwordx2
240 ; SI: buffer_store_dwordx2
241 ; SI: buffer_store_dwordx2
242 ; SI: buffer_store_dwordx2
243 ; SI: buffer_store_dwordx2
244 ; SI: buffer_store_dwordx2
245 ; SI: buffer_store_dwordx2
246 ; SI: buffer_store_dwordx2
247 ; SI: buffer_store_dwordx2
248 ; SI: buffer_store_dwordx2
249 ; SI: buffer_store_dwordx2
250 ; SI: buffer_store_dwordx2
251 ; SI: buffer_store_dwordx2
252 ; SI: buffer_store_dwordx2
253 ; SI: buffer_store_dwordx2
254 ; SI: buffer_store_dwordx2
257 define void @zextload_global_v16i32_to_v16i64(<16 x i64> addrspace(1)* %out, <16 x i32> addrspace(1)* nocapture %in) nounwind {
258 %load = load <16 x i32>, <16 x i32> addrspace(1)* %in
259 %ext = zext <16 x i32> %load to <16 x i64>
260 store <16 x i64> %ext, <16 x i64> addrspace(1)* %out
264 ; FUNC-LABEL: {{^}}sextload_global_v32i32_to_v32i64:
265 ; SI: buffer_load_dword
266 ; SI: buffer_load_dword
267 ; SI: buffer_load_dword
268 ; SI: buffer_load_dword
269 ; SI: buffer_load_dword
270 ; SI: buffer_load_dword
271 ; SI: buffer_load_dword
272 ; SI: buffer_load_dword
274 ; SI: buffer_load_dword
275 ; SI: buffer_load_dword
276 ; SI: buffer_load_dword
277 ; SI: buffer_load_dword
278 ; SI: buffer_load_dword
279 ; SI: buffer_load_dword
280 ; SI: buffer_load_dword
281 ; SI: buffer_load_dword
283 ; SI: buffer_load_dword
284 ; SI: buffer_load_dword
285 ; SI: buffer_load_dword
286 ; SI: buffer_load_dword
287 ; SI: buffer_load_dword
288 ; SI: buffer_load_dword
289 ; SI: buffer_load_dword
290 ; SI: buffer_load_dword
292 ; SI: buffer_load_dword
293 ; SI: buffer_load_dword
294 ; SI: buffer_load_dword
295 ; SI: buffer_load_dword
296 ; SI: buffer_load_dword
297 ; SI: buffer_load_dword
298 ; SI: buffer_load_dword
299 ; SI: buffer_load_dword
301 ; SI-DAG: v_ashrrev_i32
302 ; SI-DAG: v_ashrrev_i32
303 ; SI-DAG: v_ashrrev_i32
304 ; SI-DAG: v_ashrrev_i32
305 ; SI-DAG: v_ashrrev_i32
306 ; SI-DAG: v_ashrrev_i32
307 ; SI-DAG: v_ashrrev_i32
308 ; SI-DAG: v_ashrrev_i32
309 ; SI-DAG: v_ashrrev_i32
310 ; SI-DAG: v_ashrrev_i32
311 ; SI-DAG: v_ashrrev_i32
312 ; SI-DAG: v_ashrrev_i32
313 ; SI-DAG: v_ashrrev_i32
314 ; SI-DAG: v_ashrrev_i32
315 ; SI-DAG: v_ashrrev_i32
316 ; SI-DAG: v_ashrrev_i32
317 ; SI-DAG: v_ashrrev_i32
318 ; SI-DAG: v_ashrrev_i32
319 ; SI-DAG: v_ashrrev_i32
320 ; SI-DAG: v_ashrrev_i32
321 ; SI-DAG: v_ashrrev_i32
322 ; SI-DAG: v_ashrrev_i32
323 ; SI-DAG: v_ashrrev_i32
324 ; SI-DAG: v_ashrrev_i32
325 ; SI-DAG: v_ashrrev_i32
326 ; SI-DAG: v_ashrrev_i32
327 ; SI-DAG: v_ashrrev_i32
328 ; SI-DAG: v_ashrrev_i32
329 ; SI-DAG: v_ashrrev_i32
330 ; SI-DAG: v_ashrrev_i32
331 ; SI-DAG: v_ashrrev_i32
332 ; SI-DAG: v_ashrrev_i32
334 ; SI-DAG: buffer_store_dwordx2
335 ; SI-DAG: buffer_store_dwordx2
336 ; SI-DAG: buffer_store_dwordx2
337 ; SI-DAG: buffer_store_dwordx2
338 ; SI-DAG: buffer_store_dwordx2
339 ; SI-DAG: buffer_store_dwordx2
340 ; SI-DAG: buffer_store_dwordx2
341 ; SI-DAG: buffer_store_dwordx2
343 ; SI-DAG: buffer_store_dwordx2
344 ; SI-DAG: buffer_store_dwordx2
345 ; SI-DAG: buffer_store_dwordx2
346 ; SI-DAG: buffer_store_dwordx2
347 ; SI-DAG: buffer_store_dwordx2
348 ; SI-DAG: buffer_store_dwordx2
349 ; SI-DAG: buffer_store_dwordx2
350 ; SI-DAG: buffer_store_dwordx2
352 ; SI-DAG: buffer_store_dwordx2
353 ; SI-DAG: buffer_store_dwordx2
354 ; SI-DAG: buffer_store_dwordx2
355 ; SI-DAG: buffer_store_dwordx2
356 ; SI-DAG: buffer_store_dwordx2
357 ; SI-DAG: buffer_store_dwordx2
358 ; SI-DAG: buffer_store_dwordx2
359 ; SI-DAG: buffer_store_dwordx2
361 ; SI-DAG: buffer_store_dwordx2
362 ; SI-DAG: buffer_store_dwordx2
363 ; SI-DAG: buffer_store_dwordx2
364 ; SI-DAG: buffer_store_dwordx2
365 ; SI-DAG: buffer_store_dwordx2
366 ; SI-DAG: buffer_store_dwordx2
367 ; SI-DAG: buffer_store_dwordx2
368 ; SI-DAG: buffer_store_dwordx2
371 define void @sextload_global_v32i32_to_v32i64(<32 x i64> addrspace(1)* %out, <32 x i32> addrspace(1)* nocapture %in) nounwind {
372 %load = load <32 x i32>, <32 x i32> addrspace(1)* %in
373 %ext = sext <32 x i32> %load to <32 x i64>
374 store <32 x i64> %ext, <32 x i64> addrspace(1)* %out
378 ; FUNC-LABEL: {{^}}zextload_global_v32i32_to_v32i64:
379 ; SI: buffer_load_dword
380 ; SI: buffer_load_dword
381 ; SI: buffer_load_dword
382 ; SI: buffer_load_dword
383 ; SI: buffer_load_dword
384 ; SI: buffer_load_dword
385 ; SI: buffer_load_dword
386 ; SI: buffer_load_dword
388 ; SI: buffer_load_dword
389 ; SI: buffer_load_dword
390 ; SI: buffer_load_dword
391 ; SI: buffer_load_dword
392 ; SI: buffer_load_dword
393 ; SI: buffer_load_dword
394 ; SI: buffer_load_dword
395 ; SI: buffer_load_dword
397 ; SI: buffer_load_dword
398 ; SI: buffer_load_dword
399 ; SI: buffer_load_dword
400 ; SI: buffer_load_dword
401 ; SI: buffer_load_dword
402 ; SI: buffer_load_dword
403 ; SI: buffer_load_dword
404 ; SI: buffer_load_dword
406 ; SI: buffer_load_dword
407 ; SI: buffer_load_dword
408 ; SI: buffer_load_dword
409 ; SI: buffer_load_dword
410 ; SI: buffer_load_dword
411 ; SI: buffer_load_dword
412 ; SI: buffer_load_dword
413 ; SI: buffer_load_dword
415 ; SI-DAG: buffer_store_dwordx2
416 ; SI-DAG: buffer_store_dwordx2
417 ; SI-DAG: buffer_store_dwordx2
418 ; SI-DAG: buffer_store_dwordx2
419 ; SI-DAG: buffer_store_dwordx2
420 ; SI-DAG: buffer_store_dwordx2
421 ; SI-DAG: buffer_store_dwordx2
422 ; SI-DAG: buffer_store_dwordx2
424 ; SI-DAG: buffer_store_dwordx2
425 ; SI-DAG: buffer_store_dwordx2
426 ; SI-DAG: buffer_store_dwordx2
427 ; SI-DAG: buffer_store_dwordx2
428 ; SI-DAG: buffer_store_dwordx2
429 ; SI-DAG: buffer_store_dwordx2
430 ; SI-DAG: buffer_store_dwordx2
431 ; SI-DAG: buffer_store_dwordx2
433 ; SI-DAG: buffer_store_dwordx2
434 ; SI-DAG: buffer_store_dwordx2
435 ; SI-DAG: buffer_store_dwordx2
436 ; SI-DAG: buffer_store_dwordx2
437 ; SI-DAG: buffer_store_dwordx2
438 ; SI-DAG: buffer_store_dwordx2
439 ; SI-DAG: buffer_store_dwordx2
440 ; SI-DAG: buffer_store_dwordx2
442 ; SI-DAG: buffer_store_dwordx2
443 ; SI-DAG: buffer_store_dwordx2
444 ; SI-DAG: buffer_store_dwordx2
445 ; SI-DAG: buffer_store_dwordx2
446 ; SI-DAG: buffer_store_dwordx2
447 ; SI-DAG: buffer_store_dwordx2
448 ; SI-DAG: buffer_store_dwordx2
449 ; SI-DAG: buffer_store_dwordx2
452 define void @zextload_global_v32i32_to_v32i64(<32 x i64> addrspace(1)* %out, <32 x i32> addrspace(1)* nocapture %in) nounwind {
453 %load = load <32 x i32>, <32 x i32> addrspace(1)* %in
454 %ext = zext <32 x i32> %load to <32 x i64>
455 store <32 x i64> %ext, <32 x i64> addrspace(1)* %out