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