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