Extend initial support for primitive types in PTX backend
[oota-llvm.git] / test / CodeGen / PTX / ld.ll
1 ; RUN: llc < %s -march=ptx | FileCheck %s
2
3 ;CHECK: .extern .global .u16 array_i16[];
4 @array_i16 = external global [10 x i16]
5
6 ;CHECK: .extern .const .u16 array_constant_i16[];
7 @array_constant_i16 = external addrspace(1) constant [10 x i16]
8
9 ;CHECK: .extern .local .u16 array_local_i16[];
10 @array_local_i16 = external addrspace(2) global [10 x i16]
11
12 ;CHECK: .extern .shared .u16 array_shared_i16[];
13 @array_shared_i16 = external addrspace(4) global [10 x i16]
14
15 ;CHECK: .extern .global .u32 array_i32[];
16 @array_i32 = external global [10 x i32]
17
18 ;CHECK: .extern .const .u32 array_constant_i32[];
19 @array_constant_i32 = external addrspace(1) constant [10 x i32]
20
21 ;CHECK: .extern .local .u32 array_local_i32[];
22 @array_local_i32 = external addrspace(2) global [10 x i32]
23
24 ;CHECK: .extern .shared .u32 array_shared_i32[];
25 @array_shared_i32 = external addrspace(4) global [10 x i32]
26
27 ;CHECK: .extern .global .u64 array_i64[];
28 @array_i64 = external global [10 x i64]
29
30 ;CHECK: .extern .const .u64 array_constant_i64[];
31 @array_constant_i64 = external addrspace(1) constant [10 x i64]
32
33 ;CHECK: .extern .local .u64 array_local_i64[];
34 @array_local_i64 = external addrspace(2) global [10 x i64]
35
36 ;CHECK: .extern .shared .u64 array_shared_i64[];
37 @array_shared_i64 = external addrspace(4) global [10 x i64]
38
39 ;CHECK: .extern .global .f32 array_float[];
40 @array_float = external global [10 x float]
41
42 ;CHECK: .extern .const .f32 array_constant_float[];
43 @array_constant_float = external addrspace(1) constant [10 x float]
44
45 ;CHECK: .extern .local .f32 array_local_float[];
46 @array_local_float = external addrspace(2) global [10 x float]
47
48 ;CHECK: .extern .shared .f32 array_shared_float[];
49 @array_shared_float = external addrspace(4) global [10 x float]
50
51 ;CHECK: .extern .global .f64 array_double[];
52 @array_double = external global [10 x double]
53
54 ;CHECK: .extern .const .f64 array_constant_double[];
55 @array_constant_double = external addrspace(1) constant [10 x double]
56
57 ;CHECK: .extern .local .f64 array_local_double[];
58 @array_local_double = external addrspace(2) global [10 x double]
59
60 ;CHECK: .extern .shared .f64 array_shared_double[];
61 @array_shared_double = external addrspace(4) global [10 x double]
62
63
64 define ptx_device i16 @t1_u16(i16* %p) {
65 entry:
66 ;CHECK: ld.global.u16 rh0, [r1];
67 ;CHECK-NEXT; ret;
68   %x = load i16* %p
69   ret i16 %x
70 }
71
72 define ptx_device i32 @t1_u32(i32* %p) {
73 entry:
74 ;CHECK: ld.global.u32 r0, [r1];
75 ;CHECK-NEXT: ret;
76   %x = load i32* %p
77   ret i32 %x
78 }
79
80 define ptx_device i64 @t1_u64(i64* %p) {
81 entry:
82 ;CHECK: ld.global.u64 rd0, [r1];
83 ;CHECK-NEXT: ret;
84   %x = load i64* %p
85   ret i64 %x
86 }
87
88 define ptx_device float @t1_f32(float* %p) {
89 entry:
90 ;CHECK: ld.global.f32 f0, [r1];
91 ;CHECK-NEXT: ret;
92   %x = load float* %p
93   ret float %x
94 }
95
96 define ptx_device double @t1_f64(double* %p) {
97 entry:
98 ;CHECK: ld.global.f64 fd0, [r1];
99 ;CHECK-NEXT: ret;
100   %x = load double* %p
101   ret double %x
102 }
103
104 define ptx_device i16 @t2_u16(i16* %p) {
105 entry:
106 ;CHECK: ld.global.u16 rh0, [r1+2];
107 ;CHECK-NEXT: ret;
108   %i = getelementptr i16* %p, i32 1
109   %x = load i16* %i
110   ret i16 %x
111 }
112
113 define ptx_device i32 @t2_u32(i32* %p) {
114 entry:
115 ;CHECK: ld.global.u32 r0, [r1+4];
116 ;CHECK-NEXT: ret;
117   %i = getelementptr i32* %p, i32 1
118   %x = load i32* %i
119   ret i32 %x
120 }
121
122 define ptx_device i64 @t2_u64(i64* %p) {
123 entry:
124 ;CHECK: ld.global.u64 rd0, [r1+8];
125 ;CHECK-NEXT: ret;
126   %i = getelementptr i64* %p, i32 1
127   %x = load i64* %i
128   ret i64 %x
129 }
130
131 define ptx_device float @t2_f32(float* %p) {
132 entry:
133 ;CHECK: ld.global.f32 f0, [r1+4];
134 ;CHECK-NEXT: ret;
135   %i = getelementptr float* %p, i32 1
136   %x = load float* %i
137   ret float %x
138 }
139
140 define ptx_device double @t2_f64(double* %p) {
141 entry:
142 ;CHECK: ld.global.f64 fd0, [r1+8];
143 ;CHECK-NEXT: ret;
144   %i = getelementptr double* %p, i32 1
145   %x = load double* %i
146   ret double %x
147 }
148
149 define ptx_device i16 @t3_u16(i16* %p, i32 %q) {
150 entry:
151 ;CHECK: shl.b32 r0, r2, 1;
152 ;CHECK-NEXT: add.u32 r0, r1, r0;
153 ;CHECK-NEXT: ld.global.u16 rh0, [r0];
154   %i = getelementptr i16* %p, i32 %q
155   %x = load i16* %i
156   ret i16 %x
157 }
158
159 define ptx_device i32 @t3_u32(i32* %p, i32 %q) {
160 entry:
161 ;CHECK: shl.b32 r0, r2, 2;
162 ;CHECK-NEXT: add.u32 r0, r1, r0;
163 ;CHECK-NEXT: ld.global.u32 r0, [r0];
164   %i = getelementptr i32* %p, i32 %q
165   %x = load i32* %i
166   ret i32 %x
167 }
168
169 define ptx_device i64 @t3_u64(i64* %p, i32 %q) {
170 entry:
171 ;CHECK: shl.b32 r0, r2, 3;
172 ;CHECK-NEXT: add.u32 r0, r1, r0;
173 ;CHECK-NEXT: ld.global.u64 rd0, [r0];
174   %i = getelementptr i64* %p, i32 %q
175   %x = load i64* %i
176   ret i64 %x
177 }
178
179 define ptx_device float @t3_f32(float* %p, i32 %q) {
180 entry:
181 ;CHECK: shl.b32 r0, r2, 2;
182 ;CHECK-NEXT: add.u32 r0, r1, r0;
183 ;CHECK-NEXT: ld.global.f32 f0, [r0];
184   %i = getelementptr float* %p, i32 %q
185   %x = load float* %i
186   ret float %x
187 }
188
189 define ptx_device double @t3_f64(double* %p, i32 %q) {
190 entry:
191 ;CHECK: shl.b32 r0, r2, 3;
192 ;CHECK-NEXT: add.u32 r0, r1, r0;
193 ;CHECK-NEXT: ld.global.f64 fd0, [r0];
194   %i = getelementptr double* %p, i32 %q
195   %x = load double* %i
196   ret double %x
197 }
198
199 define ptx_device i16 @t4_global_u16() {
200 entry:
201 ;CHECK: ld.global.u16 rh0, [array_i16];
202 ;CHECK-NEXT: ret;
203   %i = getelementptr [10 x i16]* @array_i16, i32 0, i32 0
204   %x = load i16* %i
205   ret i16 %x
206 }
207
208 define ptx_device i32 @t4_global_u32() {
209 entry:
210 ;CHECK: ld.global.u32 r0, [array_i32];
211 ;CHECK-NEXT: ret;
212   %i = getelementptr [10 x i32]* @array_i32, i32 0, i32 0
213   %x = load i32* %i
214   ret i32 %x
215 }
216
217 define ptx_device i64 @t4_global_u64() {
218 entry:
219 ;CHECK: ld.global.u64 rd0, [array_i64];
220 ;CHECK-NEXT: ret;
221   %i = getelementptr [10 x i64]* @array_i64, i32 0, i32 0
222   %x = load i64* %i
223   ret i64 %x
224 }
225
226 define ptx_device float @t4_global_f32() {
227 entry:
228 ;CHECK: ld.global.f32 f0, [array_float];
229 ;CHECK-NEXT: ret;
230   %i = getelementptr [10 x float]* @array_float, i32 0, i32 0
231   %x = load float* %i
232   ret float %x
233 }
234
235 define ptx_device double @t4_global_f64() {
236 entry:
237 ;CHECK: ld.global.f64 fd0, [array_double];
238 ;CHECK-NEXT: ret;
239   %i = getelementptr [10 x double]* @array_double, i32 0, i32 0
240   %x = load double* %i
241   ret double %x
242 }
243
244 define ptx_device i16 @t4_const_u16() {
245 entry:
246 ;CHECK: ld.const.u16 rh0, [array_constant_i16];
247 ;CHECK-NEXT: ret;
248   %i = getelementptr [10 x i16] addrspace(1)* @array_constant_i16, i32 0, i32 0
249   %x = load i16 addrspace(1)* %i
250   ret i16 %x
251 }
252
253 define ptx_device i32 @t4_const_u32() {
254 entry:
255 ;CHECK: ld.const.u32 r0, [array_constant_i32];
256 ;CHECK-NEXT: ret;
257   %i = getelementptr [10 x i32] addrspace(1)* @array_constant_i32, i32 0, i32 0
258   %x = load i32 addrspace(1)* %i
259   ret i32 %x
260 }
261
262 define ptx_device i64 @t4_const_u64() {
263 entry:
264 ;CHECK: ld.const.u64 rd0, [array_constant_i64];
265 ;CHECK-NEXT: ret;
266   %i = getelementptr [10 x i64] addrspace(1)* @array_constant_i64, i32 0, i32 0
267   %x = load i64 addrspace(1)* %i
268   ret i64 %x
269 }
270
271 define ptx_device float @t4_const_f32() {
272 entry:
273 ;CHECK: ld.const.f32 f0, [array_constant_float];
274 ;CHECK-NEXT: ret;
275   %i = getelementptr [10 x float] addrspace(1)* @array_constant_float, i32 0, i32 0
276   %x = load float addrspace(1)* %i
277   ret float %x
278 }
279
280 define ptx_device double @t4_const_f64() {
281 entry:
282 ;CHECK: ld.const.f64 fd0, [array_constant_double];
283 ;CHECK-NEXT: ret;
284   %i = getelementptr [10 x double] addrspace(1)* @array_constant_double, i32 0, i32 0
285   %x = load double addrspace(1)* %i
286   ret double %x
287 }
288
289 define ptx_device i16 @t4_local_u16() {
290 entry:
291 ;CHECK: ld.local.u16 rh0, [array_local_i16];
292 ;CHECK-NEXT: ret;
293   %i = getelementptr [10 x i16] addrspace(2)* @array_local_i16, i32 0, i32 0
294   %x = load i16 addrspace(2)* %i
295   ret i16 %x
296 }
297
298 define ptx_device i32 @t4_local_u32() {
299 entry:
300 ;CHECK: ld.local.u32 r0, [array_local_i32];
301 ;CHECK-NEXT: ret;
302   %i = getelementptr [10 x i32] addrspace(2)* @array_local_i32, i32 0, i32 0
303   %x = load i32 addrspace(2)* %i
304   ret i32 %x
305 }
306
307 define ptx_device i64 @t4_local_u64() {
308 entry:
309 ;CHECK: ld.local.u64 rd0, [array_local_i64];
310 ;CHECK-NEXT: ret;
311   %i = getelementptr [10 x i64] addrspace(2)* @array_local_i64, i32 0, i32 0
312   %x = load i64 addrspace(2)* %i
313   ret i64 %x
314 }
315
316 define ptx_device float @t4_local_f32() {
317 entry:
318 ;CHECK: ld.local.f32 f0, [array_local_float];
319 ;CHECK-NEXT: ret;
320   %i = getelementptr [10 x float] addrspace(2)* @array_local_float, i32 0, i32 0
321   %x = load float addrspace(2)* %i
322   ret float %x
323 }
324
325 define ptx_device double @t4_local_f64() {
326 entry:
327 ;CHECK: ld.local.f64 fd0, [array_local_double];
328 ;CHECK-NEXT: ret;
329   %i = getelementptr [10 x double] addrspace(2)* @array_local_double, i32 0, i32 0
330   %x = load double addrspace(2)* %i
331   ret double %x
332 }
333
334 define ptx_device i16 @t4_shared_u16() {
335 entry:
336 ;CHECK: ld.shared.u16 rh0, [array_shared_i16];
337 ;CHECK-NEXT: ret;
338   %i = getelementptr [10 x i16] addrspace(4)* @array_shared_i16, i32 0, i32 0
339   %x = load i16 addrspace(4)* %i
340   ret i16 %x
341 }
342
343 define ptx_device i32 @t4_shared_u32() {
344 entry:
345 ;CHECK: ld.shared.u32 r0, [array_shared_i32];
346 ;CHECK-NEXT: ret;
347   %i = getelementptr [10 x i32] addrspace(4)* @array_shared_i32, i32 0, i32 0
348   %x = load i32 addrspace(4)* %i
349   ret i32 %x
350 }
351
352 define ptx_device i64 @t4_shared_u64() {
353 entry:
354 ;CHECK: ld.shared.u64 rd0, [array_shared_i64];
355 ;CHECK-NEXT: ret;
356   %i = getelementptr [10 x i64] addrspace(4)* @array_shared_i64, i32 0, i32 0
357   %x = load i64 addrspace(4)* %i
358   ret i64 %x
359 }
360
361 define ptx_device float @t4_shared_f32() {
362 entry:
363 ;CHECK: ld.shared.f32 f0, [array_shared_float];
364 ;CHECK-NEXT: ret;
365   %i = getelementptr [10 x float] addrspace(4)* @array_shared_float, i32 0, i32 0
366   %x = load float addrspace(4)* %i
367   ret float %x
368 }
369
370 define ptx_device double @t4_shared_f64() {
371 entry:
372 ;CHECK: ld.shared.f64 fd0, [array_shared_double];
373 ;CHECK-NEXT: ret;
374   %i = getelementptr [10 x double] addrspace(4)* @array_shared_double, i32 0, i32 0
375   %x = load double addrspace(4)* %i
376   ret double %x
377 }
378
379 define ptx_device i16 @t5_u16() {
380 entry:
381 ;CHECK: ld.global.u16 rh0, [array_i16+2];
382 ;CHECK-NEXT: ret;
383   %i = getelementptr [10 x i16]* @array_i16, i32 0, i32 1
384   %x = load i16* %i
385   ret i16 %x
386 }
387
388 define ptx_device i32 @t5_u32() {
389 entry:
390 ;CHECK: ld.global.u32 r0, [array_i32+4];
391 ;CHECK-NEXT: ret;
392   %i = getelementptr [10 x i32]* @array_i32, i32 0, i32 1
393   %x = load i32* %i
394   ret i32 %x
395 }
396
397 define ptx_device i64 @t5_u64() {
398 entry:
399 ;CHECK: ld.global.u64 rd0, [array_i64+8];
400 ;CHECK-NEXT: ret;
401   %i = getelementptr [10 x i64]* @array_i64, i32 0, i32 1
402   %x = load i64* %i
403   ret i64 %x
404 }
405
406 define ptx_device float @t5_f32() {
407 entry:
408 ;CHECK: ld.global.f32 f0, [array_float+4];
409 ;CHECK-NEXT: ret;
410   %i = getelementptr [10 x float]* @array_float, i32 0, i32 1
411   %x = load float* %i
412   ret float %x
413 }
414
415 define ptx_device double @t5_f64() {
416 entry:
417 ;CHECK: ld.global.f64 fd0, [array_double+8];
418 ;CHECK-NEXT: ret;
419   %i = getelementptr [10 x double]* @array_double, i32 0, i32 1
420   %x = load double* %i
421   ret double %x
422 }