1 ; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=SI -check-prefix=FUNC %s 2 ; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=VI -check-prefix=FUNC %s 3 4 ; FUNC-LABEL: {{^}}atomic_add_i32_offset: 5 ; GCN: buffer_atomic_add v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}} 6 define void @atomic_add_i32_offset(i32 addrspace(1)* %out, i32 %in) { 7 entry: 8 %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4 9 %val = atomicrmw volatile add i32 addrspace(1)* %gep, i32 %in seq_cst 10 ret void 11 } 12 13 ; FUNC-LABEL: {{^}}atomic_add_i32_soffset: 14 ; GCN: s_mov_b32 [[SREG:s[0-9]+]], 0x8ca0 15 ; GCN: buffer_atomic_add v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], [[SREG]]{{$}} 16 define void @atomic_add_i32_soffset(i32 addrspace(1)* %out, i32 %in) { 17 entry: 18 %gep = getelementptr i32, i32 addrspace(1)* %out, i64 9000 19 %val = atomicrmw volatile add i32 addrspace(1)* %gep, i32 %in seq_cst 20 ret void 21 } 22 23 ; FUNC-LABEL: {{^}}atomic_add_i32_huge_offset: 24 ; SI-DAG: v_mov_b32_e32 v[[PTRLO:[0-9]+]], 0xdeac 25 ; SI-DAG: v_mov_b32_e32 v[[PTRHI:[0-9]+]], 0xabcd 26 ; SI: buffer_atomic_add v{{[0-9]+}}, v{{\[}}[[PTRLO]]:[[PTRHI]]{{\]}}, s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}} 27 ; VI: flat_atomic_add 28 define void @atomic_add_i32_huge_offset(i32 addrspace(1)* %out, i32 %in) { 29 entry: 30 %gep = getelementptr i32, i32 addrspace(1)* %out, i64 47224239175595 31 32 %val = atomicrmw volatile add i32 addrspace(1)* %gep, i32 %in seq_cst 33 ret void 34 } 35 36 ; FUNC-LABEL: {{^}}atomic_add_i32_ret_offset: 37 ; GCN: buffer_atomic_add [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}} 38 ; GCN: buffer_store_dword [[RET]] 39 define void @atomic_add_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) { 40 entry: 41 %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4 42 %val = atomicrmw volatile add i32 addrspace(1)* %gep, i32 %in seq_cst 43 store i32 %val, i32 addrspace(1)* %out2 44 ret void 45 } 46 47 ; FUNC-LABEL: {{^}}atomic_add_i32_addr64_offset: 48 ; SI: buffer_atomic_add v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}} 49 ; VI: flat_atomic_add v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}} 50 define void @atomic_add_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) { 51 entry: 52 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index 53 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4 54 %val = atomicrmw volatile add i32 addrspace(1)* %gep, i32 %in seq_cst 55 ret void 56 } 57 58 ; FUNC-LABEL: {{^}}atomic_add_i32_ret_addr64_offset: 59 ; SI: buffer_atomic_add [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}} 60 ; VI: flat_atomic_add [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}} 61 ; GCN: buffer_store_dword [[RET]] 62 define void @atomic_add_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) { 63 entry: 64 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index 65 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4 66 %val = atomicrmw volatile add i32 addrspace(1)* %gep, i32 %in seq_cst 67 store i32 %val, i32 addrspace(1)* %out2 68 ret void 69 } 70 71 ; FUNC-LABEL: {{^}}atomic_add_i32: 72 ; GCN: buffer_atomic_add v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}} 73 define void @atomic_add_i32(i32 addrspace(1)* %out, i32 %in) { 74 entry: 75 %val = atomicrmw volatile add i32 addrspace(1)* %out, i32 %in seq_cst 76 ret void 77 } 78 79 ; FUNC-LABEL: {{^}}atomic_add_i32_ret: 80 ; GCN: buffer_atomic_add [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc 81 ; GCN: buffer_store_dword [[RET]] 82 define void @atomic_add_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) { 83 entry: 84 %val = atomicrmw volatile add i32 addrspace(1)* %out, i32 %in seq_cst 85 store i32 %val, i32 addrspace(1)* %out2 86 ret void 87 } 88 89 ; FUNC-LABEL: {{^}}atomic_add_i32_addr64: 90 ; SI: buffer_atomic_add v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}} 91 ; VI: flat_atomic_add v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}} 92 define void @atomic_add_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) { 93 entry: 94 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index 95 %val = atomicrmw volatile add i32 addrspace(1)* %ptr, i32 %in seq_cst 96 ret void 97 } 98 99 ; FUNC-LABEL: {{^}}atomic_add_i32_ret_addr64: 100 ; SI: buffer_atomic_add [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}} 101 ; VI: flat_atomic_add [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}} 102 ; GCN: buffer_store_dword [[RET]] 103 define void @atomic_add_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) { 104 entry: 105 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index 106 %val = atomicrmw volatile add i32 addrspace(1)* %ptr, i32 %in seq_cst 107 store i32 %val, i32 addrspace(1)* %out2 108 ret void 109 } 110 111 ; FUNC-LABEL: {{^}}atomic_and_i32_offset: 112 ; GCN: buffer_atomic_and v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}} 113 define void @atomic_and_i32_offset(i32 addrspace(1)* %out, i32 %in) { 114 entry: 115 %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4 116 %val = atomicrmw volatile and i32 addrspace(1)* %gep, i32 %in seq_cst 117 ret void 118 } 119 120 ; FUNC-LABEL: {{^}}atomic_and_i32_ret_offset: 121 ; GCN: buffer_atomic_and [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}} 122 ; GCN: buffer_store_dword [[RET]] 123 define void @atomic_and_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) { 124 entry: 125 %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4 126 %val = atomicrmw volatile and i32 addrspace(1)* %gep, i32 %in seq_cst 127 store i32 %val, i32 addrspace(1)* %out2 128 ret void 129 } 130 131 ; FUNC-LABEL: {{^}}atomic_and_i32_addr64_offset: 132 ; SI: buffer_atomic_and v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}} 133 ; VI: flat_atomic_and v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}} 134 define void @atomic_and_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) { 135 entry: 136 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index 137 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4 138 %val = atomicrmw volatile and i32 addrspace(1)* %gep, i32 %in seq_cst 139 ret void 140 } 141 142 ; FUNC-LABEL: {{^}}atomic_and_i32_ret_addr64_offset: 143 ; SI: buffer_atomic_and [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}} 144 ; VI: flat_atomic_and [[RET:v[0-9]]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}} 145 ; GCN: buffer_store_dword [[RET]] 146 define void @atomic_and_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) { 147 entry: 148 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index 149 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4 150 %val = atomicrmw volatile and i32 addrspace(1)* %gep, i32 %in seq_cst 151 store i32 %val, i32 addrspace(1)* %out2 152 ret void 153 } 154 155 ; FUNC-LABEL: {{^}}atomic_and_i32: 156 ; GCN: buffer_atomic_and v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}} 157 define void @atomic_and_i32(i32 addrspace(1)* %out, i32 %in) { 158 entry: 159 %val = atomicrmw volatile and i32 addrspace(1)* %out, i32 %in seq_cst 160 ret void 161 } 162 163 ; FUNC-LABEL: {{^}}atomic_and_i32_ret: 164 ; GCN: buffer_atomic_and [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc 165 ; GCN: buffer_store_dword [[RET]] 166 define void @atomic_and_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) { 167 entry: 168 %val = atomicrmw volatile and i32 addrspace(1)* %out, i32 %in seq_cst 169 store i32 %val, i32 addrspace(1)* %out2 170 ret void 171 } 172 173 ; FUNC-LABEL: {{^}}atomic_and_i32_addr64: 174 ; SI: buffer_atomic_and v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}} 175 ; VI: flat_atomic_and v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}} 176 define void @atomic_and_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) { 177 entry: 178 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index 179 %val = atomicrmw volatile and i32 addrspace(1)* %ptr, i32 %in seq_cst 180 ret void 181 } 182 183 ; FUNC-LABEL: {{^}}atomic_and_i32_ret_addr64: 184 ; SI: buffer_atomic_and [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}} 185 ; VI: flat_atomic_and [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}} 186 ; GCN: buffer_store_dword [[RET]] 187 define void @atomic_and_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) { 188 entry: 189 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index 190 %val = atomicrmw volatile and i32 addrspace(1)* %ptr, i32 %in seq_cst 191 store i32 %val, i32 addrspace(1)* %out2 192 ret void 193 } 194 195 ; FUNC-LABEL: {{^}}atomic_sub_i32_offset: 196 ; GCN: buffer_atomic_sub v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}} 197 define void @atomic_sub_i32_offset(i32 addrspace(1)* %out, i32 %in) { 198 entry: 199 %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4 200 %val = atomicrmw volatile sub i32 addrspace(1)* %gep, i32 %in seq_cst 201 ret void 202 } 203 204 ; FUNC-LABEL: {{^}}atomic_sub_i32_ret_offset: 205 ; GCN: buffer_atomic_sub [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}} 206 ; GCN: buffer_store_dword [[RET]] 207 define void @atomic_sub_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) { 208 entry: 209 %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4 210 %val = atomicrmw volatile sub i32 addrspace(1)* %gep, i32 %in seq_cst 211 store i32 %val, i32 addrspace(1)* %out2 212 ret void 213 } 214 215 ; FUNC-LABEL: {{^}}atomic_sub_i32_addr64_offset: 216 ; SI: buffer_atomic_sub v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}} 217 ; VI: flat_atomic_sub v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}} 218 define void @atomic_sub_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) { 219 entry: 220 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index 221 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4 222 %val = atomicrmw volatile sub i32 addrspace(1)* %gep, i32 %in seq_cst 223 ret void 224 } 225 226 ; FUNC-LABEL: {{^}}atomic_sub_i32_ret_addr64_offset: 227 ; SI: buffer_atomic_sub [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}} 228 ; VI: flat_atomic_sub [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}} 229 ; GCN: buffer_store_dword [[RET]] 230 define void @atomic_sub_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) { 231 entry: 232 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index 233 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4 234 %val = atomicrmw volatile sub i32 addrspace(1)* %gep, i32 %in seq_cst 235 store i32 %val, i32 addrspace(1)* %out2 236 ret void 237 } 238 239 ; FUNC-LABEL: {{^}}atomic_sub_i32: 240 ; GCN: buffer_atomic_sub v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}} 241 define void @atomic_sub_i32(i32 addrspace(1)* %out, i32 %in) { 242 entry: 243 %val = atomicrmw volatile sub i32 addrspace(1)* %out, i32 %in seq_cst 244 ret void 245 } 246 247 ; FUNC-LABEL: {{^}}atomic_sub_i32_ret: 248 ; GCN: buffer_atomic_sub [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc 249 ; GCN: buffer_store_dword [[RET]] 250 define void @atomic_sub_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) { 251 entry: 252 %val = atomicrmw volatile sub i32 addrspace(1)* %out, i32 %in seq_cst 253 store i32 %val, i32 addrspace(1)* %out2 254 ret void 255 } 256 257 ; FUNC-LABEL: {{^}}atomic_sub_i32_addr64: 258 ; SI: buffer_atomic_sub v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}} 259 ; VI: flat_atomic_sub v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}} 260 define void @atomic_sub_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) { 261 entry: 262 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index 263 %val = atomicrmw volatile sub i32 addrspace(1)* %ptr, i32 %in seq_cst 264 ret void 265 } 266 267 ; FUNC-LABEL: {{^}}atomic_sub_i32_ret_addr64: 268 ; SI: buffer_atomic_sub [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}} 269 ; VI: flat_atomic_sub [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}} 270 ; GCN: buffer_store_dword [[RET]] 271 define void @atomic_sub_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) { 272 entry: 273 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index 274 %val = atomicrmw volatile sub i32 addrspace(1)* %ptr, i32 %in seq_cst 275 store i32 %val, i32 addrspace(1)* %out2 276 ret void 277 } 278 279 ; FUNC-LABEL: {{^}}atomic_max_i32_offset: 280 ; GCN: buffer_atomic_smax v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}} 281 define void @atomic_max_i32_offset(i32 addrspace(1)* %out, i32 %in) { 282 entry: 283 %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4 284 %val = atomicrmw volatile max i32 addrspace(1)* %gep, i32 %in seq_cst 285 ret void 286 } 287 288 ; FUNC-LABEL: {{^}}atomic_max_i32_ret_offset: 289 ; GCN: buffer_atomic_smax [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}} 290 ; GCN: buffer_store_dword [[RET]] 291 define void @atomic_max_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) { 292 entry: 293 %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4 294 %val = atomicrmw volatile max i32 addrspace(1)* %gep, i32 %in seq_cst 295 store i32 %val, i32 addrspace(1)* %out2 296 ret void 297 } 298 299 ; FUNC-LABEL: {{^}}atomic_max_i32_addr64_offset: 300 ; SI: buffer_atomic_smax v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}} 301 ; VI: flat_atomic_smax v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}} 302 define void @atomic_max_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) { 303 entry: 304 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index 305 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4 306 %val = atomicrmw volatile max i32 addrspace(1)* %gep, i32 %in seq_cst 307 ret void 308 } 309 310 ; FUNC-LABEL: {{^}}atomic_max_i32_ret_addr64_offset: 311 ; SI: buffer_atomic_smax [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}} 312 ; VI: flat_atomic_smax [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}} 313 ; GCN: buffer_store_dword [[RET]] 314 define void @atomic_max_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) { 315 entry: 316 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index 317 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4 318 %val = atomicrmw volatile max i32 addrspace(1)* %gep, i32 %in seq_cst 319 store i32 %val, i32 addrspace(1)* %out2 320 ret void 321 } 322 323 ; FUNC-LABEL: {{^}}atomic_max_i32: 324 ; GCN: buffer_atomic_smax v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}} 325 define void @atomic_max_i32(i32 addrspace(1)* %out, i32 %in) { 326 entry: 327 %val = atomicrmw volatile max i32 addrspace(1)* %out, i32 %in seq_cst 328 ret void 329 } 330 331 ; FUNC-LABEL: {{^}}atomic_max_i32_ret: 332 ; GCN: buffer_atomic_smax [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc 333 ; GCN: buffer_store_dword [[RET]] 334 define void @atomic_max_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) { 335 entry: 336 %val = atomicrmw volatile max i32 addrspace(1)* %out, i32 %in seq_cst 337 store i32 %val, i32 addrspace(1)* %out2 338 ret void 339 } 340 341 ; FUNC-LABEL: {{^}}atomic_max_i32_addr64: 342 ; SI: buffer_atomic_smax v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}} 343 ; VI: flat_atomic_smax v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}} 344 define void @atomic_max_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) { 345 entry: 346 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index 347 %val = atomicrmw volatile max i32 addrspace(1)* %ptr, i32 %in seq_cst 348 ret void 349 } 350 351 ; FUNC-LABEL: {{^}}atomic_max_i32_ret_addr64: 352 ; SI: buffer_atomic_smax [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}} 353 ; VI: flat_atomic_smax [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}} 354 ; GCN: buffer_store_dword [[RET]] 355 define void @atomic_max_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) { 356 entry: 357 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index 358 %val = atomicrmw volatile max i32 addrspace(1)* %ptr, i32 %in seq_cst 359 store i32 %val, i32 addrspace(1)* %out2 360 ret void 361 } 362 363 ; FUNC-LABEL: {{^}}atomic_umax_i32_offset: 364 ; GCN: buffer_atomic_umax v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}} 365 define void @atomic_umax_i32_offset(i32 addrspace(1)* %out, i32 %in) { 366 entry: 367 %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4 368 %val = atomicrmw volatile umax i32 addrspace(1)* %gep, i32 %in seq_cst 369 ret void 370 } 371 372 ; FUNC-LABEL: {{^}}atomic_umax_i32_ret_offset: 373 ; GCN: buffer_atomic_umax [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}} 374 ; GCN: buffer_store_dword [[RET]] 375 define void @atomic_umax_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) { 376 entry: 377 %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4 378 %val = atomicrmw volatile umax i32 addrspace(1)* %gep, i32 %in seq_cst 379 store i32 %val, i32 addrspace(1)* %out2 380 ret void 381 } 382 383 ; FUNC-LABEL: {{^}}atomic_umax_i32_addr64_offset: 384 ; SI: buffer_atomic_umax v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}} 385 ; VI: flat_atomic_umax v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}} 386 define void @atomic_umax_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) { 387 entry: 388 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index 389 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4 390 %val = atomicrmw volatile umax i32 addrspace(1)* %gep, i32 %in seq_cst 391 ret void 392 } 393 394 ; FUNC-LABEL: {{^}}atomic_umax_i32_ret_addr64_offset: 395 ; SI: buffer_atomic_umax [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}} 396 ; VI: flat_atomic_umax [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}} 397 ; GCN: buffer_store_dword [[RET]] 398 define void @atomic_umax_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) { 399 entry: 400 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index 401 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4 402 %val = atomicrmw volatile umax i32 addrspace(1)* %gep, i32 %in seq_cst 403 store i32 %val, i32 addrspace(1)* %out2 404 ret void 405 } 406 407 ; FUNC-LABEL: {{^}}atomic_umax_i32: 408 ; GCN: buffer_atomic_umax v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}} 409 define void @atomic_umax_i32(i32 addrspace(1)* %out, i32 %in) { 410 entry: 411 %val = atomicrmw volatile umax i32 addrspace(1)* %out, i32 %in seq_cst 412 ret void 413 } 414 415 ; FUNC-LABEL: {{^}}atomic_umax_i32_ret: 416 ; GCN: buffer_atomic_umax [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc 417 ; GCN: buffer_store_dword [[RET]] 418 define void @atomic_umax_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) { 419 entry: 420 %val = atomicrmw volatile umax i32 addrspace(1)* %out, i32 %in seq_cst 421 store i32 %val, i32 addrspace(1)* %out2 422 ret void 423 } 424 425 ; FUNC-LABEL: {{^}}atomic_umax_i32_addr64: 426 ; SI: buffer_atomic_umax v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}} 427 ; VI: flat_atomic_umax v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}} 428 define void @atomic_umax_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) { 429 entry: 430 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index 431 %val = atomicrmw volatile umax i32 addrspace(1)* %ptr, i32 %in seq_cst 432 ret void 433 } 434 435 ; FUNC-LABEL: {{^}}atomic_umax_i32_ret_addr64: 436 ; SI: buffer_atomic_umax [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}} 437 ; VI: flat_atomic_umax [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}} 438 ; GCN: buffer_store_dword [[RET]] 439 define void @atomic_umax_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) { 440 entry: 441 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index 442 %val = atomicrmw volatile umax i32 addrspace(1)* %ptr, i32 %in seq_cst 443 store i32 %val, i32 addrspace(1)* %out2 444 ret void 445 } 446 447 ; FUNC-LABEL: {{^}}atomic_min_i32_offset: 448 ; GCN: buffer_atomic_smin v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}} 449 define void @atomic_min_i32_offset(i32 addrspace(1)* %out, i32 %in) { 450 entry: 451 %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4 452 %val = atomicrmw volatile min i32 addrspace(1)* %gep, i32 %in seq_cst 453 ret void 454 } 455 456 ; FUNC-LABEL: {{^}}atomic_min_i32_ret_offset: 457 ; GCN: buffer_atomic_smin [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}} 458 ; GCN: buffer_store_dword [[RET]] 459 define void @atomic_min_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) { 460 entry: 461 %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4 462 %val = atomicrmw volatile min i32 addrspace(1)* %gep, i32 %in seq_cst 463 store i32 %val, i32 addrspace(1)* %out2 464 ret void 465 } 466 467 ; FUNC-LABEL: {{^}}atomic_min_i32_addr64_offset: 468 ; SI: buffer_atomic_smin v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}} 469 ; VI: flat_atomic_smin v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}} 470 define void @atomic_min_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) { 471 entry: 472 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index 473 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4 474 %val = atomicrmw volatile min i32 addrspace(1)* %gep, i32 %in seq_cst 475 ret void 476 } 477 478 ; FUNC-LABEL: {{^}}atomic_min_i32_ret_addr64_offset: 479 ; SI: buffer_atomic_smin [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}} 480 ; VI: flat_atomic_smin [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}} 481 ; GCN: buffer_store_dword [[RET]] 482 define void @atomic_min_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) { 483 entry: 484 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index 485 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4 486 %val = atomicrmw volatile min i32 addrspace(1)* %gep, i32 %in seq_cst 487 store i32 %val, i32 addrspace(1)* %out2 488 ret void 489 } 490 491 ; FUNC-LABEL: {{^}}atomic_min_i32: 492 ; GCN: buffer_atomic_smin v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}} 493 define void @atomic_min_i32(i32 addrspace(1)* %out, i32 %in) { 494 entry: 495 %val = atomicrmw volatile min i32 addrspace(1)* %out, i32 %in seq_cst 496 ret void 497 } 498 499 ; FUNC-LABEL: {{^}}atomic_min_i32_ret: 500 ; GCN: buffer_atomic_smin [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc 501 ; GCN: buffer_store_dword [[RET]] 502 define void @atomic_min_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) { 503 entry: 504 %val = atomicrmw volatile min i32 addrspace(1)* %out, i32 %in seq_cst 505 store i32 %val, i32 addrspace(1)* %out2 506 ret void 507 } 508 509 ; FUNC-LABEL: {{^}}atomic_min_i32_addr64: 510 ; SI: buffer_atomic_smin v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}} 511 ; VI: flat_atomic_smin v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}} 512 define void @atomic_min_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) { 513 entry: 514 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index 515 %val = atomicrmw volatile min i32 addrspace(1)* %ptr, i32 %in seq_cst 516 ret void 517 } 518 519 ; FUNC-LABEL: {{^}}atomic_min_i32_ret_addr64: 520 ; SI: buffer_atomic_smin [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}} 521 ; VI: flat_atomic_smin [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}} 522 ; GCN: buffer_store_dword [[RET]] 523 define void @atomic_min_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) { 524 entry: 525 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index 526 %val = atomicrmw volatile min i32 addrspace(1)* %ptr, i32 %in seq_cst 527 store i32 %val, i32 addrspace(1)* %out2 528 ret void 529 } 530 531 ; FUNC-LABEL: {{^}}atomic_umin_i32_offset: 532 ; GCN: buffer_atomic_umin v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}} 533 define void @atomic_umin_i32_offset(i32 addrspace(1)* %out, i32 %in) { 534 entry: 535 %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4 536 %val = atomicrmw volatile umin i32 addrspace(1)* %gep, i32 %in seq_cst 537 ret void 538 } 539 540 ; FUNC-LABEL: {{^}}atomic_umin_i32_ret_offset: 541 ; GCN: buffer_atomic_umin [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}} 542 ; GCN: buffer_store_dword [[RET]] 543 define void @atomic_umin_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) { 544 entry: 545 %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4 546 %val = atomicrmw volatile umin i32 addrspace(1)* %gep, i32 %in seq_cst 547 store i32 %val, i32 addrspace(1)* %out2 548 ret void 549 } 550 551 ; FUNC-LABEL: {{^}}atomic_umin_i32_addr64_offset: 552 ; SI: buffer_atomic_umin v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}} 553 ; VI: flat_atomic_umin v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}} 554 define void @atomic_umin_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) { 555 entry: 556 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index 557 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4 558 %val = atomicrmw volatile umin i32 addrspace(1)* %gep, i32 %in seq_cst 559 ret void 560 } 561 562 ; FUNC-LABEL: {{^}}atomic_umin_i32_ret_addr64_offset: 563 ; SI: buffer_atomic_umin [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}} 564 ; VI: flat_atomic_umin [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}} 565 ; GCN: buffer_store_dword [[RET]] 566 define void @atomic_umin_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) { 567 entry: 568 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index 569 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4 570 %val = atomicrmw volatile umin i32 addrspace(1)* %gep, i32 %in seq_cst 571 store i32 %val, i32 addrspace(1)* %out2 572 ret void 573 } 574 575 ; FUNC-LABEL: {{^}}atomic_umin_i32: 576 ; GCN: buffer_atomic_umin v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}} 577 define void @atomic_umin_i32(i32 addrspace(1)* %out, i32 %in) { 578 entry: 579 %val = atomicrmw volatile umin i32 addrspace(1)* %out, i32 %in seq_cst 580 ret void 581 } 582 583 ; FUNC-LABEL: {{^}}atomic_umin_i32_ret: 584 ; SI: buffer_atomic_umin [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc 585 ; GCN: buffer_store_dword [[RET]] 586 define void @atomic_umin_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) { 587 entry: 588 %val = atomicrmw volatile umin i32 addrspace(1)* %out, i32 %in seq_cst 589 store i32 %val, i32 addrspace(1)* %out2 590 ret void 591 } 592 593 ; FUNC-LABEL: {{^}}atomic_umin_i32_addr64: 594 ; SI: buffer_atomic_umin v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}} 595 ; VI: flat_atomic_umin v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}} 596 define void @atomic_umin_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) { 597 entry: 598 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index 599 %val = atomicrmw volatile umin i32 addrspace(1)* %ptr, i32 %in seq_cst 600 ret void 601 } 602 603 ; FUNC-LABEL: {{^}}atomic_umin_i32_ret_addr64: 604 ; SI: buffer_atomic_umin [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}} 605 ; VI: flat_atomic_umin [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}} 606 ; GCN: buffer_store_dword [[RET]] 607 define void @atomic_umin_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) { 608 entry: 609 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index 610 %val = atomicrmw volatile umin i32 addrspace(1)* %ptr, i32 %in seq_cst 611 store i32 %val, i32 addrspace(1)* %out2 612 ret void 613 } 614 615 ; FUNC-LABEL: {{^}}atomic_or_i32_offset: 616 ; GCN: buffer_atomic_or v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}} 617 define void @atomic_or_i32_offset(i32 addrspace(1)* %out, i32 %in) { 618 entry: 619 %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4 620 %val = atomicrmw volatile or i32 addrspace(1)* %gep, i32 %in seq_cst 621 ret void 622 } 623 624 ; FUNC-LABEL: {{^}}atomic_or_i32_ret_offset: 625 ; GCN: buffer_atomic_or [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}} 626 ; GCN: buffer_store_dword [[RET]] 627 define void @atomic_or_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) { 628 entry: 629 %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4 630 %val = atomicrmw volatile or i32 addrspace(1)* %gep, i32 %in seq_cst 631 store i32 %val, i32 addrspace(1)* %out2 632 ret void 633 } 634 635 ; FUNC-LABEL: {{^}}atomic_or_i32_addr64_offset: 636 ; SI: buffer_atomic_or v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}} 637 ; VI: flat_atomic_or v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}} 638 define void @atomic_or_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) { 639 entry: 640 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index 641 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4 642 %val = atomicrmw volatile or i32 addrspace(1)* %gep, i32 %in seq_cst 643 ret void 644 } 645 646 ; FUNC-LABEL: {{^}}atomic_or_i32_ret_addr64_offset: 647 ; SI: buffer_atomic_or [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}} 648 ; VI: flat_atomic_or [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}} 649 ; GCN: buffer_store_dword [[RET]] 650 define void @atomic_or_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) { 651 entry: 652 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index 653 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4 654 %val = atomicrmw volatile or i32 addrspace(1)* %gep, i32 %in seq_cst 655 store i32 %val, i32 addrspace(1)* %out2 656 ret void 657 } 658 659 ; FUNC-LABEL: {{^}}atomic_or_i32: 660 ; GCN: buffer_atomic_or v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}} 661 define void @atomic_or_i32(i32 addrspace(1)* %out, i32 %in) { 662 entry: 663 %val = atomicrmw volatile or i32 addrspace(1)* %out, i32 %in seq_cst 664 ret void 665 } 666 667 ; FUNC-LABEL: {{^}}atomic_or_i32_ret: 668 ; GCN: buffer_atomic_or [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc 669 ; GCN: buffer_store_dword [[RET]] 670 define void @atomic_or_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) { 671 entry: 672 %val = atomicrmw volatile or i32 addrspace(1)* %out, i32 %in seq_cst 673 store i32 %val, i32 addrspace(1)* %out2 674 ret void 675 } 676 677 ; FUNC-LABEL: {{^}}atomic_or_i32_addr64: 678 ; SI: buffer_atomic_or v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}} 679 ; VI: flat_atomic_or v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}} 680 define void @atomic_or_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) { 681 entry: 682 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index 683 %val = atomicrmw volatile or i32 addrspace(1)* %ptr, i32 %in seq_cst 684 ret void 685 } 686 687 ; FUNC-LABEL: {{^}}atomic_or_i32_ret_addr64: 688 ; SI: buffer_atomic_or [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}} 689 ; VI: flat_atomic_or [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}} 690 ; GCN: buffer_store_dword [[RET]] 691 define void @atomic_or_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) { 692 entry: 693 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index 694 %val = atomicrmw volatile or i32 addrspace(1)* %ptr, i32 %in seq_cst 695 store i32 %val, i32 addrspace(1)* %out2 696 ret void 697 } 698 699 ; FUNC-LABEL: {{^}}atomic_xchg_i32_offset: 700 ; GCN: buffer_atomic_swap v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}} 701 define void @atomic_xchg_i32_offset(i32 addrspace(1)* %out, i32 %in) { 702 entry: 703 %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4 704 %val = atomicrmw volatile xchg i32 addrspace(1)* %gep, i32 %in seq_cst 705 ret void 706 } 707 708 ; FUNC-LABEL: {{^}}atomic_xchg_i32_ret_offset: 709 ; GCN: buffer_atomic_swap [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}} 710 ; GCN: buffer_store_dword [[RET]] 711 define void @atomic_xchg_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) { 712 entry: 713 %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4 714 %val = atomicrmw volatile xchg i32 addrspace(1)* %gep, i32 %in seq_cst 715 store i32 %val, i32 addrspace(1)* %out2 716 ret void 717 } 718 719 ; FUNC-LABEL: {{^}}atomic_xchg_i32_addr64_offset: 720 ; SI: buffer_atomic_swap v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}} 721 722 ; VI: flat_atomic_swap v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}{{$}} 723 define void @atomic_xchg_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) { 724 entry: 725 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index 726 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4 727 %val = atomicrmw volatile xchg i32 addrspace(1)* %gep, i32 %in seq_cst 728 ret void 729 } 730 731 ; FUNC-LABEL: {{^}}atomic_xchg_i32_ret_addr64_offset: 732 ; SI: buffer_atomic_swap [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}} 733 734 ; VI: flat_atomic_swap [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}} 735 ; GCN: buffer_store_dword [[RET]] 736 define void @atomic_xchg_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) { 737 entry: 738 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index 739 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4 740 %val = atomicrmw volatile xchg i32 addrspace(1)* %gep, i32 %in seq_cst 741 store i32 %val, i32 addrspace(1)* %out2 742 ret void 743 } 744 745 ; FUNC-LABEL: {{^}}atomic_xchg_i32: 746 ; GCN: buffer_atomic_swap v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}} 747 define void @atomic_xchg_i32(i32 addrspace(1)* %out, i32 %in) { 748 entry: 749 %val = atomicrmw volatile xchg i32 addrspace(1)* %out, i32 %in seq_cst 750 ret void 751 } 752 753 ; FUNC-LABEL: {{^}}atomic_xchg_i32_ret: 754 ; GCN: buffer_atomic_swap [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc 755 ; GCN: buffer_store_dword [[RET]] 756 define void @atomic_xchg_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) { 757 entry: 758 %val = atomicrmw volatile xchg i32 addrspace(1)* %out, i32 %in seq_cst 759 store i32 %val, i32 addrspace(1)* %out2 760 ret void 761 } 762 763 ; FUNC-LABEL: {{^}}atomic_xchg_i32_addr64: 764 ; SI: buffer_atomic_swap v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}} 765 ; VI: flat_atomic_swap v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}} 766 define void @atomic_xchg_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) { 767 entry: 768 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index 769 %val = atomicrmw volatile xchg i32 addrspace(1)* %ptr, i32 %in seq_cst 770 ret void 771 } 772 773 ; FUNC-LABEL: {{^}}atomic_xchg_i32_ret_addr64: 774 ; SI: buffer_atomic_swap [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}} 775 ; VI: flat_atomic_swap [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}} 776 ; GCN: buffer_store_dword [[RET]] 777 define void @atomic_xchg_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) { 778 entry: 779 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index 780 %val = atomicrmw volatile xchg i32 addrspace(1)* %ptr, i32 %in seq_cst 781 store i32 %val, i32 addrspace(1)* %out2 782 ret void 783 } 784 785 ; FUNC-LABEL: {{^}}atomic_cmpxchg_i32_offset: 786 ; GCN: buffer_atomic_cmpswap v[{{[0-9]+}}:{{[0-9]+}}], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}} 787 define void @atomic_cmpxchg_i32_offset(i32 addrspace(1)* %out, i32 %in, i32 %old) { 788 entry: 789 %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4 790 %val = cmpxchg volatile i32 addrspace(1)* %gep, i32 %old, i32 %in seq_cst seq_cst 791 ret void 792 } 793 794 ; FUNC-LABEL: {{^}}atomic_cmpxchg_i32_ret_offset: 795 ; GCN: buffer_atomic_cmpswap v{{\[}}[[RET:[0-9]+]]{{:[0-9]+}}], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}} 796 ; GCN: buffer_store_dword v[[RET]] 797 define void @atomic_cmpxchg_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i32 %old) { 798 entry: 799 %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4 800 %val = cmpxchg volatile i32 addrspace(1)* %gep, i32 %old, i32 %in seq_cst seq_cst 801 %extract0 = extractvalue { i32, i1 } %val, 0 802 store i32 %extract0, i32 addrspace(1)* %out2 803 ret void 804 } 805 806 ; FUNC-LABEL: {{^}}atomic_cmpxchg_i32_addr64_offset: 807 ; SI: buffer_atomic_cmpswap v[{{[0-9]+\:[0-9]+}}], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}} 808 809 ; VI: flat_atomic_cmpswap v[{{[0-9]+\:[0-9]+}}], v[{{[0-9]+}}:{{[0-9]+}}]{{$}} 810 define void @atomic_cmpxchg_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index, i32 %old) { 811 entry: 812 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index 813 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4 814 %val = cmpxchg volatile i32 addrspace(1)* %gep, i32 %old, i32 %in seq_cst seq_cst 815 ret void 816 } 817 818 ; FUNC-LABEL: {{^}}atomic_cmpxchg_i32_ret_addr64_offset: 819 ; SI: buffer_atomic_cmpswap v{{\[}}[[RET:[0-9]+]]:{{[0-9]+}}], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}} 820 ; VI: flat_atomic_cmpswap v[[RET:[0-9]+]], v[{{[0-9]+:[0-9]+}}], v[{{[0-9]+:[0-9]+}}] glc{{$}} 821 ; GCN: buffer_store_dword v[[RET]] 822 define void @atomic_cmpxchg_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index, i32 %old) { 823 entry: 824 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index 825 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4 826 %val = cmpxchg volatile i32 addrspace(1)* %gep, i32 %old, i32 %in seq_cst seq_cst 827 %extract0 = extractvalue { i32, i1 } %val, 0 828 store i32 %extract0, i32 addrspace(1)* %out2 829 ret void 830 } 831 832 ; FUNC-LABEL: {{^}}atomic_cmpxchg_i32: 833 ; GCN: buffer_atomic_cmpswap v[{{[0-9]+:[0-9]+}}], off, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}} 834 define void @atomic_cmpxchg_i32(i32 addrspace(1)* %out, i32 %in, i32 %old) { 835 entry: 836 %val = cmpxchg volatile i32 addrspace(1)* %out, i32 %old, i32 %in seq_cst seq_cst 837 ret void 838 } 839 840 ; FUNC-LABEL: {{^}}atomic_cmpxchg_i32_ret: 841 ; GCN: buffer_atomic_cmpswap v{{\[}}[[RET:[0-9]+]]:{{[0-9]+}}], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc 842 ; GCN: buffer_store_dword v[[RET]] 843 define void @atomic_cmpxchg_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i32 %old) { 844 entry: 845 %val = cmpxchg volatile i32 addrspace(1)* %out, i32 %old, i32 %in seq_cst seq_cst 846 %extract0 = extractvalue { i32, i1 } %val, 0 847 store i32 %extract0, i32 addrspace(1)* %out2 848 ret void 849 } 850 851 ; FUNC-LABEL: {{^}}atomic_cmpxchg_i32_addr64: 852 ; SI: buffer_atomic_cmpswap v[{{[0-9]+:[0-9]+}}], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}} 853 ; VI: flat_atomic_cmpswap v[{{[0-9]+:[0-9]+}}], v[{{[0-9]+:[0-9]+}}]{{$}} 854 define void @atomic_cmpxchg_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index, i32 %old) { 855 entry: 856 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index 857 %val = cmpxchg volatile i32 addrspace(1)* %ptr, i32 %old, i32 %in seq_cst seq_cst 858 ret void 859 } 860 861 ; FUNC-LABEL: {{^}}atomic_cmpxchg_i32_ret_addr64: 862 ; SI: buffer_atomic_cmpswap v{{\[}}[[RET:[0-9]+]]:{{[0-9]+}}], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}} 863 ; VI: flat_atomic_cmpswap v[[RET:[0-9]+]], v[{{[0-9]+:[0-9]+}}], v[{{[0-9]+:[0-9]+}}] glc{{$}} 864 ; GCN: buffer_store_dword v[[RET]] 865 define void @atomic_cmpxchg_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index, i32 %old) { 866 entry: 867 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index 868 %val = cmpxchg volatile i32 addrspace(1)* %ptr, i32 %old, i32 %in seq_cst seq_cst 869 %extract0 = extractvalue { i32, i1 } %val, 0 870 store i32 %extract0, i32 addrspace(1)* %out2 871 ret void 872 } 873 874 ; FUNC-LABEL: {{^}}atomic_xor_i32_offset: 875 ; GCN: buffer_atomic_xor v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}} 876 define void @atomic_xor_i32_offset(i32 addrspace(1)* %out, i32 %in) { 877 entry: 878 %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4 879 %val = atomicrmw volatile xor i32 addrspace(1)* %gep, i32 %in seq_cst 880 ret void 881 } 882 883 ; FUNC-LABEL: {{^}}atomic_xor_i32_ret_offset: 884 ; GCN: buffer_atomic_xor [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}} 885 ; GCN: buffer_store_dword [[RET]] 886 define void @atomic_xor_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) { 887 entry: 888 %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4 889 %val = atomicrmw volatile xor i32 addrspace(1)* %gep, i32 %in seq_cst 890 store i32 %val, i32 addrspace(1)* %out2 891 ret void 892 } 893 894 ; FUNC-LABEL: {{^}}atomic_xor_i32_addr64_offset: 895 ; SI: buffer_atomic_xor v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}} 896 ; VI: flat_atomic_xor v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}} 897 define void @atomic_xor_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) { 898 entry: 899 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index 900 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4 901 %val = atomicrmw volatile xor i32 addrspace(1)* %gep, i32 %in seq_cst 902 ret void 903 } 904 905 ; FUNC-LABEL: {{^}}atomic_xor_i32_ret_addr64_offset: 906 ; SI: buffer_atomic_xor [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}} 907 ; VI: flat_atomic_xor [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}} 908 ; GCN: buffer_store_dword [[RET]] 909 define void @atomic_xor_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) { 910 entry: 911 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index 912 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4 913 %val = atomicrmw volatile xor i32 addrspace(1)* %gep, i32 %in seq_cst 914 store i32 %val, i32 addrspace(1)* %out2 915 ret void 916 } 917 918 ; FUNC-LABEL: {{^}}atomic_xor_i32: 919 ; GCN: buffer_atomic_xor v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}} 920 define void @atomic_xor_i32(i32 addrspace(1)* %out, i32 %in) { 921 entry: 922 %val = atomicrmw volatile xor i32 addrspace(1)* %out, i32 %in seq_cst 923 ret void 924 } 925 926 ; FUNC-LABEL: {{^}}atomic_xor_i32_ret: 927 ; GCN: buffer_atomic_xor [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc 928 ; GCN: buffer_store_dword [[RET]] 929 define void @atomic_xor_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) { 930 entry: 931 %val = atomicrmw volatile xor i32 addrspace(1)* %out, i32 %in seq_cst 932 store i32 %val, i32 addrspace(1)* %out2 933 ret void 934 } 935 936 ; FUNC-LABEL: {{^}}atomic_xor_i32_addr64: 937 ; SI: buffer_atomic_xor v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}} 938 ; VI: flat_atomic_xor v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}} 939 define void @atomic_xor_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) { 940 entry: 941 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index 942 %val = atomicrmw volatile xor i32 addrspace(1)* %ptr, i32 %in seq_cst 943 ret void 944 } 945 946 ; FUNC-LABEL: {{^}}atomic_xor_i32_ret_addr64: 947 ; SI: buffer_atomic_xor [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}} 948 ; VI: flat_atomic_xor [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}} 949 ; GCN: buffer_store_dword [[RET]] 950 define void @atomic_xor_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) { 951 entry: 952 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index 953 %val = atomicrmw volatile xor i32 addrspace(1)* %ptr, i32 %in seq_cst 954 store i32 %val, i32 addrspace(1)* %out2 955 ret void 956 } 957 958 ; FUNC-LABEL: {{^}}atomic_load_i32_offset: 959 ; SI: buffer_load_dword [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}} 960 ; VI: flat_load_dword [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}] glc{{$}} 961 ; GCN: buffer_store_dword [[RET]] 962 define void @atomic_load_i32_offset(i32 addrspace(1)* %in, i32 addrspace(1)* %out) { 963 entry: 964 %gep = getelementptr i32, i32 addrspace(1)* %in, i64 4 965 %val = load atomic i32, i32 addrspace(1)* %gep seq_cst, align 4 966 store i32 %val, i32 addrspace(1)* %out 967 ret void 968 } 969 970 ; FUNC-LABEL: {{^}}atomic_load_i32: 971 ; SI: buffer_load_dword [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc 972 ; VI: flat_load_dword [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}] glc 973 ; GCN: buffer_store_dword [[RET]] 974 define void @atomic_load_i32(i32 addrspace(1)* %in, i32 addrspace(1)* %out) { 975 entry: 976 %val = load atomic i32, i32 addrspace(1)* %in seq_cst, align 4 977 store i32 %val, i32 addrspace(1)* %out 978 ret void 979 } 980 981 ; FUNC-LABEL: {{^}}atomic_load_i32_addr64_offset: 982 ; SI: buffer_load_dword [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}} 983 ; VI: flat_load_dword [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}] glc{{$}} 984 ; GCN: buffer_store_dword [[RET]] 985 define void @atomic_load_i32_addr64_offset(i32 addrspace(1)* %in, i32 addrspace(1)* %out, i64 %index) { 986 entry: 987 %ptr = getelementptr i32, i32 addrspace(1)* %in, i64 %index 988 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4 989 %val = load atomic i32, i32 addrspace(1)* %gep seq_cst, align 4 990 store i32 %val, i32 addrspace(1)* %out 991 ret void 992 } 993 994 ; FUNC-LABEL: {{^}}atomic_load_i32_addr64: 995 ; SI: buffer_load_dword [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}} 996 ; VI: flat_load_dword [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}] glc{{$}} 997 ; GCN: buffer_store_dword [[RET]] 998 define void @atomic_load_i32_addr64(i32 addrspace(1)* %in, i32 addrspace(1)* %out, i64 %index) { 999 entry: 1000 %ptr = getelementptr i32, i32 addrspace(1)* %in, i64 %index 1001 %val = load atomic i32, i32 addrspace(1)* %ptr seq_cst, align 4 1002 store i32 %val, i32 addrspace(1)* %out 1003 ret void 1004 } 1005 1006 ; FUNC-LABEL: {{^}}atomic_store_i32_offset: 1007 ; SI: buffer_store_dword {{v[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}} 1008 ; VI: flat_store_dword v[{{[0-9]+}}:{{[0-9]+}}], {{v[0-9]+}} glc{{$}} 1009 define void @atomic_store_i32_offset(i32 %in, i32 addrspace(1)* %out) { 1010 entry: 1011 %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4 1012 store atomic i32 %in, i32 addrspace(1)* %gep seq_cst, align 4 1013 ret void 1014 } 1015 1016 ; FUNC-LABEL: {{^}}atomic_store_i32: 1017 ; SI: buffer_store_dword {{v[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc{{$}} 1018 ; VI: flat_store_dword v[{{[0-9]+}}:{{[0-9]+}}], {{v[0-9]+}} glc{{$}} 1019 define void @atomic_store_i32(i32 %in, i32 addrspace(1)* %out) { 1020 entry: 1021 store atomic i32 %in, i32 addrspace(1)* %out seq_cst, align 4 1022 ret void 1023 } 1024 1025 ; FUNC-LABEL: {{^}}atomic_store_i32_addr64_offset: 1026 ; SI: buffer_store_dword {{v[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}} 1027 ; VI: flat_store_dword v[{{[0-9]+}}:{{[0-9]+}}], {{v[0-9]+}} glc{{$}} 1028 define void @atomic_store_i32_addr64_offset(i32 %in, i32 addrspace(1)* %out, i64 %index) { 1029 entry: 1030 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index 1031 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4 1032 store atomic i32 %in, i32 addrspace(1)* %gep seq_cst, align 4 1033 ret void 1034 } 1035 1036 ; FUNC-LABEL: {{^}}atomic_store_i32_addr64: 1037 ; SI: buffer_store_dword {{v[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}} 1038 ; VI: flat_store_dword v[{{[0-9]+}}:{{[0-9]+}}], {{v[0-9]+}} glc{{$}} 1039 define void @atomic_store_i32_addr64(i32 %in, i32 addrspace(1)* %out, i64 %index) { 1040 entry: 1041 %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index 1042 store atomic i32 %in, i32 addrspace(1)* %ptr seq_cst, align 4 1043 ret void 1044 } 1045