1 ; RUN: llc -march=amdgcn -mcpu=SI -verify-machineinstrs < %s | FileCheck -strict-whitespace -check-prefix=SI -check-prefix=GCN %s 2 ; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck -strict-whitespace -check-prefix=VI -check-prefix=GCN %s 3 4 ; FUNC-LABEL: {{^}}lds_atomic_xchg_ret_i64: 5 ; GCN: ds_wrxchg_rtn_b64 6 ; GCN: s_endpgm 7 define void @lds_atomic_xchg_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind { 8 %result = atomicrmw xchg i64 addrspace(3)* %ptr, i64 4 seq_cst 9 store i64 %result, i64 addrspace(1)* %out, align 8 10 ret void 11 } 12 13 ; FUNC-LABEL: {{^}}lds_atomic_xchg_ret_i64_offset: 14 ; GCN: ds_wrxchg_rtn_b64 {{.*}} offset:32 15 ; GCN: s_endpgm 16 define void @lds_atomic_xchg_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind { 17 %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4 18 %result = atomicrmw xchg i64 addrspace(3)* %gep, i64 4 seq_cst 19 store i64 %result, i64 addrspace(1)* %out, align 8 20 ret void 21 } 22 23 ; FUNC-LABEL: {{^}}lds_atomic_add_ret_i64: 24 ; GCN: ds_add_rtn_u64 25 ; GCN: s_endpgm 26 define void @lds_atomic_add_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind { 27 %result = atomicrmw add i64 addrspace(3)* %ptr, i64 4 seq_cst 28 store i64 %result, i64 addrspace(1)* %out, align 8 29 ret void 30 } 31 32 ; FUNC-LABEL: {{^}}lds_atomic_add_ret_i64_offset: 33 ; GCN: v_mov_b32_e32 v[[LOVDATA:[0-9]+]], 9 34 ; GCN: v_mov_b32_e32 v[[HIVDATA:[0-9]+]], 0 35 ; SI: s_load_dword [[PTR:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0xb 36 ; VI: s_load_dword [[PTR:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0x2c 37 ; GCN-DAG: v_mov_b32_e32 [[VPTR:v[0-9]+]], [[PTR]] 38 ; GCN: ds_add_rtn_u64 [[RESULT:v\[[0-9]+:[0-9]+\]]], [[VPTR]], v{{\[}}[[LOVDATA]]:[[HIVDATA]]{{\]}} offset:32 39 ; GCN: buffer_store_dwordx2 [[RESULT]], 40 ; GCN: s_endpgm 41 define void @lds_atomic_add_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind { 42 %gep = getelementptr i64, i64 addrspace(3)* %ptr, i64 4 43 %result = atomicrmw add i64 addrspace(3)* %gep, i64 9 seq_cst 44 store i64 %result, i64 addrspace(1)* %out, align 8 45 ret void 46 } 47 48 ; FUNC-LABEL: {{^}}lds_atomic_inc_ret_i64: 49 ; GCN: v_mov_b32_e32 v[[LOVDATA:[0-9]+]], -1 50 ; GCN: v_mov_b32_e32 v[[HIVDATA:[0-9]+]], -1 51 ; GCN: ds_inc_rtn_u64 [[RESULT:v\[[0-9]+:[0-9]+\]]], [[VPTR]], v{{\[}}[[LOVDATA]]:[[HIVDATA]]{{\]}} 52 ; GCN: buffer_store_dwordx2 [[RESULT]], 53 ; GCN: s_endpgm 54 define void @lds_atomic_inc_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind { 55 %result = atomicrmw add i64 addrspace(3)* %ptr, i64 1 seq_cst 56 store i64 %result, i64 addrspace(1)* %out, align 8 57 ret void 58 } 59 60 ; FUNC-LABEL: {{^}}lds_atomic_inc_ret_i64_offset: 61 ; GCN: ds_inc_rtn_u64 {{.*}} offset:32 62 ; GCN: s_endpgm 63 define void @lds_atomic_inc_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind { 64 %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4 65 %result = atomicrmw add i64 addrspace(3)* %gep, i64 1 seq_cst 66 store i64 %result, i64 addrspace(1)* %out, align 8 67 ret void 68 } 69 70 ; FUNC-LABEL: {{^}}lds_atomic_sub_ret_i64: 71 ; GCN: ds_sub_rtn_u64 72 ; GCN: s_endpgm 73 define void @lds_atomic_sub_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind { 74 %result = atomicrmw sub i64 addrspace(3)* %ptr, i64 4 seq_cst 75 store i64 %result, i64 addrspace(1)* %out, align 8 76 ret void 77 } 78 79 ; FUNC-LABEL: {{^}}lds_atomic_sub_ret_i64_offset: 80 ; GCN: ds_sub_rtn_u64 {{.*}} offset:32 81 ; GCN: s_endpgm 82 define void @lds_atomic_sub_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind { 83 %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4 84 %result = atomicrmw sub i64 addrspace(3)* %gep, i64 4 seq_cst 85 store i64 %result, i64 addrspace(1)* %out, align 8 86 ret void 87 } 88 89 ; FUNC-LABEL: {{^}}lds_atomic_dec_ret_i64: 90 ; GCN: v_mov_b32_e32 v[[LOVDATA:[0-9]+]], -1 91 ; GCN: v_mov_b32_e32 v[[HIVDATA:[0-9]+]], -1 92 ; GCN: ds_dec_rtn_u64 [[RESULT:v\[[0-9]+:[0-9]+\]]], [[VPTR]], v{{\[}}[[LOVDATA]]:[[HIVDATA]]{{\]}} 93 ; GCN: buffer_store_dwordx2 [[RESULT]], 94 ; GCN: s_endpgm 95 define void @lds_atomic_dec_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind { 96 %result = atomicrmw sub i64 addrspace(3)* %ptr, i64 1 seq_cst 97 store i64 %result, i64 addrspace(1)* %out, align 8 98 ret void 99 } 100 101 ; FUNC-LABEL: {{^}}lds_atomic_dec_ret_i64_offset: 102 ; GCN: ds_dec_rtn_u64 {{.*}} offset:32 103 ; GCN: s_endpgm 104 define void @lds_atomic_dec_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind { 105 %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4 106 %result = atomicrmw sub i64 addrspace(3)* %gep, i64 1 seq_cst 107 store i64 %result, i64 addrspace(1)* %out, align 8 108 ret void 109 } 110 111 ; FUNC-LABEL: {{^}}lds_atomic_and_ret_i64: 112 ; GCN: ds_and_rtn_b64 113 ; GCN: s_endpgm 114 define void @lds_atomic_and_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind { 115 %result = atomicrmw and i64 addrspace(3)* %ptr, i64 4 seq_cst 116 store i64 %result, i64 addrspace(1)* %out, align 8 117 ret void 118 } 119 120 ; FUNC-LABEL: {{^}}lds_atomic_and_ret_i64_offset: 121 ; GCN: ds_and_rtn_b64 {{.*}} offset:32 122 ; GCN: s_endpgm 123 define void @lds_atomic_and_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind { 124 %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4 125 %result = atomicrmw and i64 addrspace(3)* %gep, i64 4 seq_cst 126 store i64 %result, i64 addrspace(1)* %out, align 8 127 ret void 128 } 129 130 ; FUNC-LABEL: {{^}}lds_atomic_or_ret_i64: 131 ; GCN: ds_or_rtn_b64 132 ; GCN: s_endpgm 133 define void @lds_atomic_or_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind { 134 %result = atomicrmw or i64 addrspace(3)* %ptr, i64 4 seq_cst 135 store i64 %result, i64 addrspace(1)* %out, align 8 136 ret void 137 } 138 139 ; FUNC-LABEL: {{^}}lds_atomic_or_ret_i64_offset: 140 ; GCN: ds_or_rtn_b64 {{.*}} offset:32 141 ; GCN: s_endpgm 142 define void @lds_atomic_or_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind { 143 %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4 144 %result = atomicrmw or i64 addrspace(3)* %gep, i64 4 seq_cst 145 store i64 %result, i64 addrspace(1)* %out, align 8 146 ret void 147 } 148 149 ; FUNC-LABEL: {{^}}lds_atomic_xor_ret_i64: 150 ; GCN: ds_xor_rtn_b64 151 ; GCN: s_endpgm 152 define void @lds_atomic_xor_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind { 153 %result = atomicrmw xor i64 addrspace(3)* %ptr, i64 4 seq_cst 154 store i64 %result, i64 addrspace(1)* %out, align 8 155 ret void 156 } 157 158 ; FUNC-LABEL: {{^}}lds_atomic_xor_ret_i64_offset: 159 ; GCN: ds_xor_rtn_b64 {{.*}} offset:32 160 ; GCN: s_endpgm 161 define void @lds_atomic_xor_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind { 162 %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4 163 %result = atomicrmw xor i64 addrspace(3)* %gep, i64 4 seq_cst 164 store i64 %result, i64 addrspace(1)* %out, align 8 165 ret void 166 } 167 168 ; FIXME: There is no atomic nand instr 169 ; XFUNC-LABEL: {{^}}lds_atomic_nand_ret_i64:uction, so we somehow need to expand this. 170 ; define void @lds_atomic_nand_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind { 171 ; %result = atomicrmw nand i64 addrspace(3)* %ptr, i32 4 seq_cst 172 ; store i64 %result, i64 addrspace(1)* %out, align 8 173 ; ret void 174 ; } 175 176 ; FUNC-LABEL: {{^}}lds_atomic_min_ret_i64: 177 ; GCN: ds_min_rtn_i64 178 ; GCN: s_endpgm 179 define void @lds_atomic_min_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind { 180 %result = atomicrmw min i64 addrspace(3)* %ptr, i64 4 seq_cst 181 store i64 %result, i64 addrspace(1)* %out, align 8 182 ret void 183 } 184 185 ; FUNC-LABEL: {{^}}lds_atomic_min_ret_i64_offset: 186 ; GCN: ds_min_rtn_i64 {{.*}} offset:32 187 ; GCN: s_endpgm 188 define void @lds_atomic_min_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind { 189 %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4 190 %result = atomicrmw min i64 addrspace(3)* %gep, i64 4 seq_cst 191 store i64 %result, i64 addrspace(1)* %out, align 8 192 ret void 193 } 194 195 ; FUNC-LABEL: {{^}}lds_atomic_max_ret_i64: 196 ; GCN: ds_max_rtn_i64 197 ; GCN: s_endpgm 198 define void @lds_atomic_max_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind { 199 %result = atomicrmw max i64 addrspace(3)* %ptr, i64 4 seq_cst 200 store i64 %result, i64 addrspace(1)* %out, align 8 201 ret void 202 } 203 204 ; FUNC-LABEL: {{^}}lds_atomic_max_ret_i64_offset: 205 ; GCN: ds_max_rtn_i64 {{.*}} offset:32 206 ; GCN: s_endpgm 207 define void @lds_atomic_max_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind { 208 %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4 209 %result = atomicrmw max i64 addrspace(3)* %gep, i64 4 seq_cst 210 store i64 %result, i64 addrspace(1)* %out, align 8 211 ret void 212 } 213 214 ; FUNC-LABEL: {{^}}lds_atomic_umin_ret_i64: 215 ; GCN: ds_min_rtn_u64 216 ; GCN: s_endpgm 217 define void @lds_atomic_umin_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind { 218 %result = atomicrmw umin i64 addrspace(3)* %ptr, i64 4 seq_cst 219 store i64 %result, i64 addrspace(1)* %out, align 8 220 ret void 221 } 222 223 ; FUNC-LABEL: {{^}}lds_atomic_umin_ret_i64_offset: 224 ; GCN: ds_min_rtn_u64 {{.*}} offset:32 225 ; GCN: s_endpgm 226 define void @lds_atomic_umin_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind { 227 %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4 228 %result = atomicrmw umin i64 addrspace(3)* %gep, i64 4 seq_cst 229 store i64 %result, i64 addrspace(1)* %out, align 8 230 ret void 231 } 232 233 ; FUNC-LABEL: {{^}}lds_atomic_umax_ret_i64: 234 ; GCN: ds_max_rtn_u64 235 ; GCN: s_endpgm 236 define void @lds_atomic_umax_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind { 237 %result = atomicrmw umax i64 addrspace(3)* %ptr, i64 4 seq_cst 238 store i64 %result, i64 addrspace(1)* %out, align 8 239 ret void 240 } 241 242 ; FUNC-LABEL: {{^}}lds_atomic_umax_ret_i64_offset: 243 ; GCN: ds_max_rtn_u64 {{.*}} offset:32 244 ; GCN: s_endpgm 245 define void @lds_atomic_umax_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind { 246 %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4 247 %result = atomicrmw umax i64 addrspace(3)* %gep, i64 4 seq_cst 248 store i64 %result, i64 addrspace(1)* %out, align 8 249 ret void 250 } 251 252 ; FUNC-LABEL: {{^}}lds_atomic_xchg_noret_i64: 253 ; GCN: ds_wrxchg_rtn_b64 254 ; GCN: s_endpgm 255 define void @lds_atomic_xchg_noret_i64(i64 addrspace(3)* %ptr) nounwind { 256 %result = atomicrmw xchg i64 addrspace(3)* %ptr, i64 4 seq_cst 257 ret void 258 } 259 260 ; FUNC-LABEL: {{^}}lds_atomic_xchg_noret_i64_offset: 261 ; GCN: ds_wrxchg_rtn_b64 {{.*}} offset:32 262 ; GCN: s_endpgm 263 define void @lds_atomic_xchg_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind { 264 %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4 265 %result = atomicrmw xchg i64 addrspace(3)* %gep, i64 4 seq_cst 266 ret void 267 } 268 269 ; FUNC-LABEL: {{^}}lds_atomic_add_noret_i64: 270 ; GCN: ds_add_u64 271 ; GCN: s_endpgm 272 define void @lds_atomic_add_noret_i64(i64 addrspace(3)* %ptr) nounwind { 273 %result = atomicrmw add i64 addrspace(3)* %ptr, i64 4 seq_cst 274 ret void 275 } 276 277 ; FUNC-LABEL: {{^}}lds_atomic_add_noret_i64_offset: 278 ; SI: s_load_dword [[PTR:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0x9 279 ; VI: s_load_dword [[PTR:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0x24 280 ; GCN: v_mov_b32_e32 v[[LOVDATA:[0-9]+]], 9 281 ; GCN: v_mov_b32_e32 v[[HIVDATA:[0-9]+]], 0 282 ; GCN: v_mov_b32_e32 [[VPTR:v[0-9]+]], [[PTR]] 283 ; GCN: ds_add_u64 [[VPTR]], v{{\[}}[[LOVDATA]]:[[HIVDATA]]{{\]}} offset:32 284 ; GCN: s_endpgm 285 define void @lds_atomic_add_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind { 286 %gep = getelementptr i64, i64 addrspace(3)* %ptr, i64 4 287 %result = atomicrmw add i64 addrspace(3)* %gep, i64 9 seq_cst 288 ret void 289 } 290 291 ; FUNC-LABEL: {{^}}lds_atomic_inc_noret_i64: 292 ; GCN: v_mov_b32_e32 v[[LOVDATA:[0-9]+]], -1 293 ; GCN: v_mov_b32_e32 v[[HIVDATA:[0-9]+]], -1 294 ; GCN: ds_inc_u64 [[VPTR]], v{{\[}}[[LOVDATA]]:[[HIVDATA]]{{\]}} 295 ; GCN: s_endpgm 296 define void @lds_atomic_inc_noret_i64(i64 addrspace(3)* %ptr) nounwind { 297 %result = atomicrmw add i64 addrspace(3)* %ptr, i64 1 seq_cst 298 ret void 299 } 300 301 ; FUNC-LABEL: {{^}}lds_atomic_inc_noret_i64_offset: 302 ; GCN: ds_inc_u64 {{.*}} offset:32 303 ; GCN: s_endpgm 304 define void @lds_atomic_inc_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind { 305 %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4 306 %result = atomicrmw add i64 addrspace(3)* %gep, i64 1 seq_cst 307 ret void 308 } 309 310 ; FUNC-LABEL: {{^}}lds_atomic_sub_noret_i64: 311 ; GCN: ds_sub_u64 312 ; GCN: s_endpgm 313 define void @lds_atomic_sub_noret_i64(i64 addrspace(3)* %ptr) nounwind { 314 %result = atomicrmw sub i64 addrspace(3)* %ptr, i64 4 seq_cst 315 ret void 316 } 317 318 ; FUNC-LABEL: {{^}}lds_atomic_sub_noret_i64_offset: 319 ; GCN: ds_sub_u64 {{.*}} offset:32 320 ; GCN: s_endpgm 321 define void @lds_atomic_sub_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind { 322 %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4 323 %result = atomicrmw sub i64 addrspace(3)* %gep, i64 4 seq_cst 324 ret void 325 } 326 327 ; FUNC-LABEL: {{^}}lds_atomic_dec_noret_i64: 328 ; GCN: v_mov_b32_e32 v[[LOVDATA:[0-9]+]], -1 329 ; GCN: v_mov_b32_e32 v[[HIVDATA:[0-9]+]], -1 330 ; GCN: ds_dec_u64 [[VPTR]], v{{\[}}[[LOVDATA]]:[[HIVDATA]]{{\]}} 331 ; GCN: s_endpgm 332 define void @lds_atomic_dec_noret_i64(i64 addrspace(3)* %ptr) nounwind { 333 %result = atomicrmw sub i64 addrspace(3)* %ptr, i64 1 seq_cst 334 ret void 335 } 336 337 ; FUNC-LABEL: {{^}}lds_atomic_dec_noret_i64_offset: 338 ; GCN: ds_dec_u64 {{.*}} offset:32 339 ; GCN: s_endpgm 340 define void @lds_atomic_dec_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind { 341 %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4 342 %result = atomicrmw sub i64 addrspace(3)* %gep, i64 1 seq_cst 343 ret void 344 } 345 346 ; FUNC-LABEL: {{^}}lds_atomic_and_noret_i64: 347 ; GCN: ds_and_b64 348 ; GCN: s_endpgm 349 define void @lds_atomic_and_noret_i64(i64 addrspace(3)* %ptr) nounwind { 350 %result = atomicrmw and i64 addrspace(3)* %ptr, i64 4 seq_cst 351 ret void 352 } 353 354 ; FUNC-LABEL: {{^}}lds_atomic_and_noret_i64_offset: 355 ; GCN: ds_and_b64 {{.*}} offset:32 356 ; GCN: s_endpgm 357 define void @lds_atomic_and_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind { 358 %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4 359 %result = atomicrmw and i64 addrspace(3)* %gep, i64 4 seq_cst 360 ret void 361 } 362 363 ; FUNC-LABEL: {{^}}lds_atomic_or_noret_i64: 364 ; GCN: ds_or_b64 365 ; GCN: s_endpgm 366 define void @lds_atomic_or_noret_i64(i64 addrspace(3)* %ptr) nounwind { 367 %result = atomicrmw or i64 addrspace(3)* %ptr, i64 4 seq_cst 368 ret void 369 } 370 371 ; FUNC-LABEL: {{^}}lds_atomic_or_noret_i64_offset: 372 ; GCN: ds_or_b64 {{.*}} offset:32 373 ; GCN: s_endpgm 374 define void @lds_atomic_or_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind { 375 %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4 376 %result = atomicrmw or i64 addrspace(3)* %gep, i64 4 seq_cst 377 ret void 378 } 379 380 ; FUNC-LABEL: {{^}}lds_atomic_xor_noret_i64: 381 ; GCN: ds_xor_b64 382 ; GCN: s_endpgm 383 define void @lds_atomic_xor_noret_i64(i64 addrspace(3)* %ptr) nounwind { 384 %result = atomicrmw xor i64 addrspace(3)* %ptr, i64 4 seq_cst 385 ret void 386 } 387 388 ; FUNC-LABEL: {{^}}lds_atomic_xor_noret_i64_offset: 389 ; GCN: ds_xor_b64 {{.*}} offset:32 390 ; GCN: s_endpgm 391 define void @lds_atomic_xor_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind { 392 %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4 393 %result = atomicrmw xor i64 addrspace(3)* %gep, i64 4 seq_cst 394 ret void 395 } 396 397 ; FIXME: There is no atomic nand instr 398 ; XFUNC-LABEL: {{^}}lds_atomic_nand_noret_i64:uction, so we somehow need to expand this. 399 ; define void @lds_atomic_nand_noret_i64(i64 addrspace(3)* %ptr) nounwind { 400 ; %result = atomicrmw nand i64 addrspace(3)* %ptr, i32 4 seq_cst 401 ; ret void 402 ; } 403 404 ; FUNC-LABEL: {{^}}lds_atomic_min_noret_i64: 405 ; GCN: ds_min_i64 406 ; GCN: s_endpgm 407 define void @lds_atomic_min_noret_i64(i64 addrspace(3)* %ptr) nounwind { 408 %result = atomicrmw min i64 addrspace(3)* %ptr, i64 4 seq_cst 409 ret void 410 } 411 412 ; FUNC-LABEL: {{^}}lds_atomic_min_noret_i64_offset: 413 ; GCN: ds_min_i64 {{.*}} offset:32 414 ; GCN: s_endpgm 415 define void @lds_atomic_min_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind { 416 %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4 417 %result = atomicrmw min i64 addrspace(3)* %gep, i64 4 seq_cst 418 ret void 419 } 420 421 ; FUNC-LABEL: {{^}}lds_atomic_max_noret_i64: 422 ; GCN: ds_max_i64 423 ; GCN: s_endpgm 424 define void @lds_atomic_max_noret_i64(i64 addrspace(3)* %ptr) nounwind { 425 %result = atomicrmw max i64 addrspace(3)* %ptr, i64 4 seq_cst 426 ret void 427 } 428 429 ; FUNC-LABEL: {{^}}lds_atomic_max_noret_i64_offset: 430 ; GCN: ds_max_i64 {{.*}} offset:32 431 ; GCN: s_endpgm 432 define void @lds_atomic_max_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind { 433 %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4 434 %result = atomicrmw max i64 addrspace(3)* %gep, i64 4 seq_cst 435 ret void 436 } 437 438 ; FUNC-LABEL: {{^}}lds_atomic_umin_noret_i64: 439 ; GCN: ds_min_u64 440 ; GCN: s_endpgm 441 define void @lds_atomic_umin_noret_i64(i64 addrspace(3)* %ptr) nounwind { 442 %result = atomicrmw umin i64 addrspace(3)* %ptr, i64 4 seq_cst 443 ret void 444 } 445 446 ; FUNC-LABEL: {{^}}lds_atomic_umin_noret_i64_offset: 447 ; GCN: ds_min_u64 {{.*}} offset:32 448 ; GCN: s_endpgm 449 define void @lds_atomic_umin_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind { 450 %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4 451 %result = atomicrmw umin i64 addrspace(3)* %gep, i64 4 seq_cst 452 ret void 453 } 454 455 ; FUNC-LABEL: {{^}}lds_atomic_umax_noret_i64: 456 ; GCN: ds_max_u64 457 ; GCN: s_endpgm 458 define void @lds_atomic_umax_noret_i64(i64 addrspace(3)* %ptr) nounwind { 459 %result = atomicrmw umax i64 addrspace(3)* %ptr, i64 4 seq_cst 460 ret void 461 } 462 463 ; FUNC-LABEL: {{^}}lds_atomic_umax_noret_i64_offset: 464 ; GCN: ds_max_u64 {{.*}} offset:32 465 ; GCN: s_endpgm 466 define void @lds_atomic_umax_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind { 467 %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4 468 %result = atomicrmw umax i64 addrspace(3)* %gep, i64 4 seq_cst 469 ret void 470 } 471