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