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