PTX: Add support for i8 type and introduce associated .b8 registers
[oota-llvm.git] / test / CodeGen / PTX / ld.ll
1 ; RUN: llc < %s -march=ptx32 | FileCheck %s
2
3 ;CHECK: .extern .global .b8 array_i8[10];
4 @array_i8 = external global [10 x i8]
5
6 ;CHECK: .extern .const .b8 array_constant_i8[10];
7 @array_constant_i8 = external addrspace(1) constant [10 x i8]
8
9 ;CHECK: .extern .local .b8 array_local_i8[10];
10 @array_local_i8 = external addrspace(2) global [10 x i8]
11
12 ;CHECK: .extern .shared .b8 array_shared_i8[10];
13 @array_shared_i8 = external addrspace(4) global [10 x i8]
14
15 ;CHECK: .extern .global .b8 array_i16[20];
16 @array_i16 = external global [10 x i16]
17
18 ;CHECK: .extern .const .b8 array_constant_i16[20];
19 @array_constant_i16 = external addrspace(1) constant [10 x i16]
20
21 ;CHECK: .extern .local .b8 array_local_i16[20];
22 @array_local_i16 = external addrspace(2) global [10 x i16]
23
24 ;CHECK: .extern .shared .b8 array_shared_i16[20];
25 @array_shared_i16 = external addrspace(4) global [10 x i16]
26
27 ;CHECK: .extern .global .b8 array_i32[40];
28 @array_i32 = external global [10 x i32]
29
30 ;CHECK: .extern .const .b8 array_constant_i32[40];
31 @array_constant_i32 = external addrspace(1) constant [10 x i32]
32
33 ;CHECK: .extern .local .b8 array_local_i32[40];
34 @array_local_i32 = external addrspace(2) global [10 x i32]
35
36 ;CHECK: .extern .shared .b8 array_shared_i32[40];
37 @array_shared_i32 = external addrspace(4) global [10 x i32]
38
39 ;CHECK: .extern .global .b8 array_i64[80];
40 @array_i64 = external global [10 x i64]
41
42 ;CHECK: .extern .const .b8 array_constant_i64[80];
43 @array_constant_i64 = external addrspace(1) constant [10 x i64]
44
45 ;CHECK: .extern .local .b8 array_local_i64[80];
46 @array_local_i64 = external addrspace(2) global [10 x i64]
47
48 ;CHECK: .extern .shared .b8 array_shared_i64[80];
49 @array_shared_i64 = external addrspace(4) global [10 x i64]
50
51 ;CHECK: .extern .global .b8 array_float[40];
52 @array_float = external global [10 x float]
53
54 ;CHECK: .extern .const .b8 array_constant_float[40];
55 @array_constant_float = external addrspace(1) constant [10 x float]
56
57 ;CHECK: .extern .local .b8 array_local_float[40];
58 @array_local_float = external addrspace(2) global [10 x float]
59
60 ;CHECK: .extern .shared .b8 array_shared_float[40];
61 @array_shared_float = external addrspace(4) global [10 x float]
62
63 ;CHECK: .extern .global .b8 array_double[80];
64 @array_double = external global [10 x double]
65
66 ;CHECK: .extern .const .b8 array_constant_double[80];
67 @array_constant_double = external addrspace(1) constant [10 x double]
68
69 ;CHECK: .extern .local .b8 array_local_double[80];
70 @array_local_double = external addrspace(2) global [10 x double]
71
72 ;CHECK: .extern .shared .b8 array_shared_double[80];
73 @array_shared_double = external addrspace(4) global [10 x double]
74
75 define ptx_device i8 @t1_u8(i8* %p) {
76 entry:
77 ;CHECK: ld.global.u8 rq{{[0-9]+}}, [r{{[0-9]+}}];
78 ;CHECK-NEXT: ret;
79   %x = load i8* %p
80   ret i8 %x
81 }
82
83 define ptx_device i16 @t1_u16(i16* %p) {
84 entry:
85 ;CHECK: ld.global.u16 rh{{[0-9]+}}, [r{{[0-9]+}}];
86 ;CHECK-NEXT: ret;
87   %x = load i16* %p
88   ret i16 %x
89 }
90
91 define ptx_device i32 @t1_u32(i32* %p) {
92 entry:
93 ;CHECK: ld.global.u32 r{{[0-9]+}}, [r{{[0-9]+}}];
94 ;CHECK-NEXT: ret;
95   %x = load i32* %p
96   ret i32 %x
97 }
98
99 define ptx_device i64 @t1_u64(i64* %p) {
100 entry:
101 ;CHECK: ld.global.u64 rd{{[0-9]+}}, [r{{[0-9]+}}];
102 ;CHECK-NEXT: ret;
103   %x = load i64* %p
104   ret i64 %x
105 }
106
107 define ptx_device float @t1_f32(float* %p) {
108 entry:
109 ;CHECK: ld.global.f32 r{{[0-9]+}}, [r{{[0-9]+}}];
110 ;CHECK-NEXT: ret;
111   %x = load float* %p
112   ret float %x
113 }
114
115 define ptx_device double @t1_f64(double* %p) {
116 entry:
117 ;CHECK: ld.global.f64 rd{{[0-9]+}}, [r{{[0-9]+}}];
118 ;CHECK-NEXT: ret;
119   %x = load double* %p
120   ret double %x
121 }
122
123 define ptx_device i8 @t2_u8(i8* %p) {
124 entry:
125 ;CHECK: ld.global.u8 rq{{[0-9]+}}, [r{{[0-9]+}}+1];
126 ;CHECK-NEXT: ret;
127   %i = getelementptr i8* %p, i32 1
128   %x = load i8* %i
129   ret i8 %x
130 }
131
132 define ptx_device i16 @t2_u16(i16* %p) {
133 entry:
134 ;CHECK: ld.global.u16 rh{{[0-9]+}}, [r{{[0-9]+}}+2];
135 ;CHECK-NEXT: ret;
136   %i = getelementptr i16* %p, i32 1
137   %x = load i16* %i
138   ret i16 %x
139 }
140
141 define ptx_device i32 @t2_u32(i32* %p) {
142 entry:
143 ;CHECK: ld.global.u32 r{{[0-9]+}}, [r{{[0-9]+}}+4];
144 ;CHECK-NEXT: ret;
145   %i = getelementptr i32* %p, i32 1
146   %x = load i32* %i
147   ret i32 %x
148 }
149
150 define ptx_device i64 @t2_u64(i64* %p) {
151 entry:
152 ;CHECK: ld.global.u64 rd{{[0-9]+}}, [r{{[0-9]+}}+8];
153 ;CHECK-NEXT: ret;
154   %i = getelementptr i64* %p, i32 1
155   %x = load i64* %i
156   ret i64 %x
157 }
158
159 define ptx_device float @t2_f32(float* %p) {
160 entry:
161 ;CHECK: ld.global.f32 r{{[0-9]+}}, [r{{[0-9]+}}+4];
162 ;CHECK-NEXT: ret;
163   %i = getelementptr float* %p, i32 1
164   %x = load float* %i
165   ret float %x
166 }
167
168 define ptx_device double @t2_f64(double* %p) {
169 entry:
170 ;CHECK: ld.global.f64 rd{{[0-9]+}}, [r{{[0-9]+}}+8];
171 ;CHECK-NEXT: ret;
172   %i = getelementptr double* %p, i32 1
173   %x = load double* %i
174   ret double %x
175 }
176
177 define ptx_device i8 @t3_u8(i8* %p, i32 %q) {
178 entry:
179 ;CHECK: add.u32 r[[R0:[0-9]+]], r{{[0-9]+}}, r{{[0-9]+}};
180 ;CHECK-NEXT: ld.global.u8 rq{{[0-9]+}}, [r[[R0]]];
181   %i = getelementptr i8* %p, i32 %q
182   %x = load i8* %i
183   ret i8 %x
184 }
185
186 define ptx_device i16 @t3_u16(i16* %p, i32 %q) {
187 entry:
188 ;CHECK: shl.b32 r[[R0:[0-9]+]], r{{[0-9]+}}, 1;
189 ;CHECK-NEXT: add.u32 r[[R0]], r{{[0-9]+}}, r[[R0]];
190 ;CHECK-NEXT: ld.global.u16 rh{{[0-9]+}}, [r[[R0]]];
191   %i = getelementptr i16* %p, i32 %q
192   %x = load i16* %i
193   ret i16 %x
194 }
195
196 define ptx_device i32 @t3_u32(i32* %p, i32 %q) {
197 entry:
198 ;CHECK: shl.b32 r[[R0:[0-9]+]], r{{[0-9]+}}, 2;
199 ;CHECK-NEXT: add.u32 r[[R0]], r{{[0-9]+}}, r[[R0]];
200 ;CHECK-NEXT: ld.global.u32 r{{[0-9]+}}, [r[[R0]]];
201   %i = getelementptr i32* %p, i32 %q
202   %x = load i32* %i
203   ret i32 %x
204 }
205
206 define ptx_device i64 @t3_u64(i64* %p, i32 %q) {
207 entry:
208 ;CHECK: shl.b32 r[[R0:[0-9]+]], r{{[0-9]+}}, 3;
209 ;CHECK-NEXT: add.u32 r[[R0]], r{{[0-9]+}}, r[[R0]];
210 ;CHECK-NEXT: ld.global.u64 rd{{[0-9]+}}, [r[[R0]]];
211   %i = getelementptr i64* %p, i32 %q
212   %x = load i64* %i
213   ret i64 %x
214 }
215
216 define ptx_device float @t3_f32(float* %p, i32 %q) {
217 entry:
218 ;CHECK: shl.b32 r[[R0:[0-9]+]], r{{[0-9]+}}, 2;
219 ;CHECK-NEXT: add.u32 r[[R0]], r{{[0-9]+}}, r[[R0]];
220 ;CHECK-NEXT: ld.global.f32 r{{[0-9]+}}, [r[[R0]]];
221   %i = getelementptr float* %p, i32 %q
222   %x = load float* %i
223   ret float %x
224 }
225
226 define ptx_device double @t3_f64(double* %p, i32 %q) {
227 entry:
228 ;CHECK: shl.b32 r[[R0:[0-9]+]], r{{[0-9]+}}, 3;
229 ;CHECK-NEXT: add.u32 r[[R0]], r{{[0-9]+}}, r[[R0]];
230 ;CHECK-NEXT: ld.global.f64 rd{{[0-9]+}}, [r[[R0]]];
231   %i = getelementptr double* %p, i32 %q
232   %x = load double* %i
233   ret double %x
234 }
235
236 define ptx_device i8 @t4_global_u8() {
237 entry:
238 ;CHECK: mov.u32 r[[R0:[0-9]+]], array_i8;
239 ;CHECK-NEXT: ld.global.u8 rq{{[0-9]+}}, [r[[R0]]];
240 ;CHECK-NEXT: ret;
241   %i = getelementptr [10 x i8]* @array_i8, i32 0, i32 0
242   %x = load i8* %i
243   ret i8 %x
244 }
245
246 define ptx_device i16 @t4_global_u16() {
247 entry:
248 ;CHECK: mov.u32 r[[R0:[0-9]+]], array_i16;
249 ;CHECK-NEXT: ld.global.u16 rh{{[0-9]+}}, [r[[R0]]];
250 ;CHECK-NEXT: ret;
251   %i = getelementptr [10 x i16]* @array_i16, i32 0, i32 0
252   %x = load i16* %i
253   ret i16 %x
254 }
255
256 define ptx_device i32 @t4_global_u32() {
257 entry:
258 ;CHECK: mov.u32 r[[R0:[0-9]+]], array_i32;
259 ;CHECK-NEXT: ld.global.u32 r{{[0-9]+}}, [r[[R0]]];
260 ;CHECK-NEXT: ret;
261   %i = getelementptr [10 x i32]* @array_i32, i32 0, i32 0
262   %x = load i32* %i
263   ret i32 %x
264 }
265
266 define ptx_device i64 @t4_global_u64() {
267 entry:
268 ;CHECK: mov.u32 r[[R0:[0-9]+]], array_i64;
269 ;CHECK-NEXT: ld.global.u64 rd{{[0-9]+}}, [r[[R0]]];
270 ;CHECK-NEXT: ret;
271   %i = getelementptr [10 x i64]* @array_i64, i32 0, i32 0
272   %x = load i64* %i
273   ret i64 %x
274 }
275
276 define ptx_device float @t4_global_f32() {
277 entry:
278 ;CHECK: mov.u32 r[[R0:[0-9]+]], array_float;
279 ;CHECK-NEXT: ld.global.f32 r{{[0-9]+}}, [r[[R0]]];
280 ;CHECK-NEXT: ret;
281   %i = getelementptr [10 x float]* @array_float, i32 0, i32 0
282   %x = load float* %i
283   ret float %x
284 }
285
286 define ptx_device double @t4_global_f64() {
287 entry:
288 ;CHECK: mov.u32 r[[R0:[0-9]+]], array_double;
289 ;CHECK-NEXT: ld.global.f64 rd{{[0-9]+}}, [r[[R0]]];
290 ;CHECK-NEXT: ret;
291   %i = getelementptr [10 x double]* @array_double, i32 0, i32 0
292   %x = load double* %i
293   ret double %x
294 }
295
296 define ptx_device i16 @t4_const_u16() {
297 entry:
298 ;CHECK: mov.u32 r[[R0:[0-9]+]], array_constant_i16;
299 ;CHECK-NEXT: ld.const.u16 rh{{[0-9]+}}, [r[[R0]]];
300 ;CHECK-NEXT: ret;
301   %i = getelementptr [10 x i16] addrspace(1)* @array_constant_i16, i32 0, i32 0
302   %x = load i16 addrspace(1)* %i
303   ret i16 %x
304 }
305
306 define ptx_device i32 @t4_const_u32() {
307 entry:
308 ;CHECK: mov.u32 r[[R0:[0-9]+]], array_constant_i32;
309 ;CHECK-NEXT: ld.const.u32 r{{[0-9]+}}, [r[[R0]]];
310 ;CHECK-NEXT: ret;
311   %i = getelementptr [10 x i32] addrspace(1)* @array_constant_i32, i32 0, i32 0
312   %x = load i32 addrspace(1)* %i
313   ret i32 %x
314 }
315
316 define ptx_device i64 @t4_const_u64() {
317 entry:
318 ;CHECK: mov.u32 r[[R0:[0-9]+]], array_constant_i64;
319 ;CHECK-NEXT: ld.const.u64 rd{{[0-9]+}}, [r[[R0]]];
320 ;CHECK-NEXT: ret;
321   %i = getelementptr [10 x i64] addrspace(1)* @array_constant_i64, i32 0, i32 0
322   %x = load i64 addrspace(1)* %i
323   ret i64 %x
324 }
325
326 define ptx_device float @t4_const_f32() {
327 entry:
328 ;CHECK: mov.u32 r[[R0:[0-9]+]], array_constant_float;
329 ;CHECK-NEXT: ld.const.f32 r{{[0-9]+}}, [r[[R0]]];
330 ;CHECK-NEXT: ret;
331   %i = getelementptr [10 x float] addrspace(1)* @array_constant_float, i32 0, i32 0
332   %x = load float addrspace(1)* %i
333   ret float %x
334 }
335
336 define ptx_device double @t4_const_f64() {
337 entry:
338 ;CHECK: mov.u32 r[[R0:[0-9]+]], array_constant_double;
339 ;CHECK-NEXT: ld.const.f64 rd{{[0-9]+}}, [r[[R0]]];
340 ;CHECK-NEXT: ret;
341   %i = getelementptr [10 x double] addrspace(1)* @array_constant_double, i32 0, i32 0
342   %x = load double addrspace(1)* %i
343   ret double %x
344 }
345
346 define ptx_device i8 @t4_local_u8() {
347 entry:
348 ;CHECK: mov.u32 r[[R0:[0-9]+]], array_local_i8;
349 ;CHECK-NEXT: ld.local.u8 rq{{[0-9]+}}, [r[[R0]]];
350 ;CHECK-NEXT: ret;
351   %i = getelementptr [10 x i8] addrspace(2)* @array_local_i8, i32 0, i32 0
352   %x = load i8 addrspace(2)* %i
353   ret i8 %x
354 }
355
356 define ptx_device i16 @t4_local_u16() {
357 entry:
358 ;CHECK: mov.u32 r[[R0:[0-9]+]], array_local_i16;
359 ;CHECK-NEXT: ld.local.u16 rh{{[0-9]+}}, [r[[R0]]];
360 ;CHECK-NEXT: ret;
361   %i = getelementptr [10 x i16] addrspace(2)* @array_local_i16, i32 0, i32 0
362   %x = load i16 addrspace(2)* %i
363   ret i16 %x
364 }
365
366 define ptx_device i32 @t4_local_u32() {
367 entry:
368 ;CHECK: mov.u32 r[[R0:[0-9]+]], array_local_i32;
369 ;CHECK-NEXT: ld.local.u32 r{{[0-9]+}}, [r[[R0]]];
370 ;CHECK-NEXT: ret;
371   %i = getelementptr [10 x i32] addrspace(2)* @array_local_i32, i32 0, i32 0
372   %x = load i32 addrspace(2)* %i
373   ret i32 %x
374 }
375
376 define ptx_device i64 @t4_local_u64() {
377 entry:
378 ;CHECK: mov.u32 r[[R0:[0-9]+]], array_local_i64;
379 ;CHECK-NEXT: ld.local.u64 rd{{[0-9]+}}, [r[[R0]]];
380 ;CHECK-NEXT: ret;
381   %i = getelementptr [10 x i64] addrspace(2)* @array_local_i64, i32 0, i32 0
382   %x = load i64 addrspace(2)* %i
383   ret i64 %x
384 }
385
386 define ptx_device float @t4_local_f32() {
387 entry:
388 ;CHECK: mov.u32 r[[R0:[0-9]+]], array_local_float;
389 ;CHECK-NEXT: ld.local.f32 r{{[0-9]+}}, [r[[R0]]];
390 ;CHECK-NEXT: ret;
391   %i = getelementptr [10 x float] addrspace(2)* @array_local_float, i32 0, i32 0
392   %x = load float addrspace(2)* %i
393   ret float %x
394 }
395
396 define ptx_device double @t4_local_f64() {
397 entry:
398 ;CHECK: mov.u32 r[[R0:[0-9]+]], array_local_double;
399 ;CHECK-NEXT: ld.local.f64 rd{{[0-9]+}}, [r[[R0]]];
400 ;CHECK-NEXT: ret;
401   %i = getelementptr [10 x double] addrspace(2)* @array_local_double, i32 0, i32 0
402   %x = load double addrspace(2)* %i
403   ret double %x
404 }
405
406 define ptx_device i8 @t4_shared_u8() {
407 entry:
408 ;CHECK: mov.u32 r[[R0:[0-9]+]], array_shared_i8;
409 ;CHECK-NEXT: ld.shared.u8 rq{{[0-9]+}}, [r[[R0]]];
410 ;CHECK-NEXT: ret;
411   %i = getelementptr [10 x i8] addrspace(4)* @array_shared_i8, i32 0, i32 0
412   %x = load i8 addrspace(4)* %i
413   ret i8 %x
414 }
415
416 define ptx_device i16 @t4_shared_u16() {
417 entry:
418 ;CHECK: mov.u32 r[[R0:[0-9]+]], array_shared_i16;
419 ;CHECK-NEXT: ld.shared.u16 rh{{[0-9]+}}, [r[[R0]]];
420 ;CHECK-NEXT: ret;
421   %i = getelementptr [10 x i16] addrspace(4)* @array_shared_i16, i32 0, i32 0
422   %x = load i16 addrspace(4)* %i
423   ret i16 %x
424 }
425
426 define ptx_device i32 @t4_shared_u32() {
427 entry:
428 ;CHECK: mov.u32 r[[R0:[0-9]+]], array_shared_i32;
429 ;CHECK-NEXT: ld.shared.u32 r{{[0-9]+}}, [r[[R0]]];
430 ;CHECK-NEXT: ret;
431   %i = getelementptr [10 x i32] addrspace(4)* @array_shared_i32, i32 0, i32 0
432   %x = load i32 addrspace(4)* %i
433   ret i32 %x
434 }
435
436 define ptx_device i64 @t4_shared_u64() {
437 entry:
438 ;CHECK: mov.u32 r[[R0:[0-9]+]], array_shared_i64;
439 ;CHECK-NEXT: ld.shared.u64 rd{{[0-9]+}}, [r[[R0]]];
440 ;CHECK-NEXT: ret;
441   %i = getelementptr [10 x i64] addrspace(4)* @array_shared_i64, i32 0, i32 0
442   %x = load i64 addrspace(4)* %i
443   ret i64 %x
444 }
445
446 define ptx_device float @t4_shared_f32() {
447 entry:
448 ;CHECK: mov.u32 r[[R0:[0-9]+]], array_shared_float;
449 ;CHECK-NEXT: ld.shared.f32 r{{[0-9]+}}, [r[[R0]]];
450 ;CHECK-NEXT: ret;
451   %i = getelementptr [10 x float] addrspace(4)* @array_shared_float, i32 0, i32 0
452   %x = load float addrspace(4)* %i
453   ret float %x
454 }
455
456 define ptx_device double @t4_shared_f64() {
457 entry:
458 ;CHECK: mov.u32 r[[R0:[0-9]+]], array_shared_double;
459 ;CHECK-NEXT: ld.shared.f64 rd{{[0-9]+}}, [r[[R0]]];
460 ;CHECK-NEXT: ret;
461   %i = getelementptr [10 x double] addrspace(4)* @array_shared_double, i32 0, i32 0
462   %x = load double addrspace(4)* %i
463   ret double %x
464 }
465
466 define ptx_device i8 @t5_u8() {
467 entry:
468 ;CHECK: mov.u32 r[[R0:[0-9]+]], array_i8;
469 ;CHECK-NEXT: ld.global.u8 rq{{[0-9]+}}, [r[[R0]]+1];
470 ;CHECK-NEXT: ret;
471   %i = getelementptr [10 x i8]* @array_i8, i32 0, i32 1
472   %x = load i8* %i
473   ret i8 %x
474 }
475
476 define ptx_device i16 @t5_u16() {
477 entry:
478 ;CHECK: mov.u32 r[[R0:[0-9]+]], array_i16;
479 ;CHECK-NEXT: ld.global.u16 rh{{[0-9]+}}, [r[[R0]]+2];
480 ;CHECK-NEXT: ret;
481   %i = getelementptr [10 x i16]* @array_i16, i32 0, i32 1
482   %x = load i16* %i
483   ret i16 %x
484 }
485
486 define ptx_device i32 @t5_u32() {
487 entry:
488 ;CHECK: mov.u32 r[[R0:[0-9]+]], array_i32;
489 ;CHECK-NEXT: ld.global.u32 r{{[0-9]+}}, [r[[R0]]+4];
490 ;CHECK-NEXT: ret;
491   %i = getelementptr [10 x i32]* @array_i32, i32 0, i32 1
492   %x = load i32* %i
493   ret i32 %x
494 }
495
496 define ptx_device i64 @t5_u64() {
497 entry:
498 ;CHECK: mov.u32 r[[R0:[0-9]+]], array_i64;
499 ;CHECK-NEXT: ld.global.u64 rd{{[0-9]+}}, [r[[R0]]+8];
500 ;CHECK-NEXT: ret;
501   %i = getelementptr [10 x i64]* @array_i64, i32 0, i32 1
502   %x = load i64* %i
503   ret i64 %x
504 }
505
506 define ptx_device float @t5_f32() {
507 entry:
508 ;CHECK: mov.u32 r[[R0:[0-9]+]], array_float;
509 ;CHECK-NEXT: ld.global.f32 r{{[0-9]+}}, [r[[R0]]+4];
510 ;CHECK-NEXT: ret;
511   %i = getelementptr [10 x float]* @array_float, i32 0, i32 1
512   %x = load float* %i
513   ret float %x
514 }
515
516 define ptx_device double @t5_f64() {
517 entry:
518 ;CHECK: mov.u32 r[[R0:[0-9]+]], array_double;
519 ;CHECK-NEXT: ld.global.f64 rd{{[0-9]+}}, [r[[R0]]+8];
520 ;CHECK-NEXT: ret;
521   %i = getelementptr [10 x double]* @array_double, i32 0, i32 1
522   %x = load double* %i
523   ret double %x
524 }