1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -mcpu=bonaire -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=CI %s 2*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=VI %s 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.amdgcn.atomic.dec.i32.p1i32(i32 addrspace(1)* nocapture, i32) #2 5*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.amdgcn.atomic.dec.i32.p3i32(i32 addrspace(3)* nocapture, i32) #2 6*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.amdgcn.atomic.dec.i32.p4i32(i32 addrspace(4)* nocapture, i32) #2 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Workerdeclare i64 @llvm.amdgcn.atomic.dec.i64.p1i64(i64 addrspace(1)* nocapture, i64) #2 9*9880d681SAndroid Build Coastguard Workerdeclare i64 @llvm.amdgcn.atomic.dec.i64.p3i64(i64 addrspace(3)* nocapture, i64) #2 10*9880d681SAndroid Build Coastguard Workerdeclare i64 @llvm.amdgcn.atomic.dec.i64.p4i64(i64 addrspace(4)* nocapture, i64) #2 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.amdgcn.workitem.id.x() #1 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}lds_atomic_dec_ret_i32: 15*9880d681SAndroid Build Coastguard Worker; GCN: v_mov_b32_e32 [[K:v[0-9]+]], 42 16*9880d681SAndroid Build Coastguard Worker; GCN: ds_dec_rtn_u32 v{{[0-9]+}}, v{{[0-9]+}}, [[K]] 17*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_dec_ret_i32(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) #0 { 18*9880d681SAndroid Build Coastguard Worker %result = call i32 @llvm.amdgcn.atomic.dec.i32.p3i32(i32 addrspace(3)* %ptr, i32 42) 19*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out 20*9880d681SAndroid Build Coastguard Worker ret void 21*9880d681SAndroid Build Coastguard Worker} 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}lds_atomic_dec_ret_i32_offset: 24*9880d681SAndroid Build Coastguard Worker; GCN: v_mov_b32_e32 [[K:v[0-9]+]], 42 25*9880d681SAndroid Build Coastguard Worker; GCN: ds_dec_rtn_u32 v{{[0-9]+}}, v{{[0-9]+}}, [[K]] offset:16 26*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_dec_ret_i32_offset(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) #0 { 27*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i32, i32 addrspace(3)* %ptr, i32 4 28*9880d681SAndroid Build Coastguard Worker %result = call i32 @llvm.amdgcn.atomic.dec.i32.p3i32(i32 addrspace(3)* %gep, i32 42) 29*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out 30*9880d681SAndroid Build Coastguard Worker ret void 31*9880d681SAndroid Build Coastguard Worker} 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}lds_atomic_dec_noret_i32: 34*9880d681SAndroid Build Coastguard Worker; GCN: s_load_dword [[SPTR:s[0-9]+]], 35*9880d681SAndroid Build Coastguard Worker; GCN: v_mov_b32_e32 [[DATA:v[0-9]+]], 4 36*9880d681SAndroid Build Coastguard Worker; GCN: v_mov_b32_e32 [[VPTR:v[0-9]+]], [[SPTR]] 37*9880d681SAndroid Build Coastguard Worker; GCN: ds_dec_u32 [[VPTR]], [[DATA]] 38*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_dec_noret_i32(i32 addrspace(3)* %ptr) nounwind { 39*9880d681SAndroid Build Coastguard Worker %result = call i32 @llvm.amdgcn.atomic.dec.i32.p3i32(i32 addrspace(3)* %ptr, i32 42) 40*9880d681SAndroid Build Coastguard Worker ret void 41*9880d681SAndroid Build Coastguard Worker} 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}lds_atomic_dec_noret_i32_offset: 44*9880d681SAndroid Build Coastguard Worker; GCN: v_mov_b32_e32 [[K:v[0-9]+]], 42 45*9880d681SAndroid Build Coastguard Worker; GCN: ds_dec_u32 v{{[0-9]+}}, [[K]] offset:16 46*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_dec_noret_i32_offset(i32 addrspace(3)* %ptr) nounwind { 47*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i32, i32 addrspace(3)* %ptr, i32 4 48*9880d681SAndroid Build Coastguard Worker %result = call i32 @llvm.amdgcn.atomic.dec.i32.p3i32(i32 addrspace(3)* %gep, i32 42) 49*9880d681SAndroid Build Coastguard Worker ret void 50*9880d681SAndroid Build Coastguard Worker} 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}global_atomic_dec_ret_i32: 53*9880d681SAndroid Build Coastguard Worker; GCN: v_mov_b32_e32 [[K:v[0-9]+]], 42 54*9880d681SAndroid Build Coastguard Worker; GCN: buffer_atomic_dec [[K]], off, s{{\[[0-9]+:[0-9]+\]}}, 0 glc{{$}} 55*9880d681SAndroid Build Coastguard Workerdefine void @global_atomic_dec_ret_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %ptr) #0 { 56*9880d681SAndroid Build Coastguard Worker %result = call i32 @llvm.amdgcn.atomic.dec.i32.p1i32(i32 addrspace(1)* %ptr, i32 42) 57*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out 58*9880d681SAndroid Build Coastguard Worker ret void 59*9880d681SAndroid Build Coastguard Worker} 60*9880d681SAndroid Build Coastguard Worker 61*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}global_atomic_dec_ret_i32_offset: 62*9880d681SAndroid Build Coastguard Worker; GCN: v_mov_b32_e32 [[K:v[0-9]+]], 42 63*9880d681SAndroid Build Coastguard Worker; GCN: buffer_atomic_dec [[K]], off, s{{\[[0-9]+:[0-9]+\]}}, 0 offset:16 glc{{$}} 64*9880d681SAndroid Build Coastguard Workerdefine void @global_atomic_dec_ret_i32_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %ptr) #0 { 65*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4 66*9880d681SAndroid Build Coastguard Worker %result = call i32 @llvm.amdgcn.atomic.dec.i32.p1i32(i32 addrspace(1)* %gep, i32 42) 67*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out 68*9880d681SAndroid Build Coastguard Worker ret void 69*9880d681SAndroid Build Coastguard Worker} 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}global_atomic_dec_noret_i32: 72*9880d681SAndroid Build Coastguard Worker; GCN: buffer_atomic_dec [[K]], off, s{{\[[0-9]+:[0-9]+\]}}, 0{{$}} 73*9880d681SAndroid Build Coastguard Workerdefine void @global_atomic_dec_noret_i32(i32 addrspace(1)* %ptr) nounwind { 74*9880d681SAndroid Build Coastguard Worker %result = call i32 @llvm.amdgcn.atomic.dec.i32.p1i32(i32 addrspace(1)* %ptr, i32 42) 75*9880d681SAndroid Build Coastguard Worker ret void 76*9880d681SAndroid Build Coastguard Worker} 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}global_atomic_dec_noret_i32_offset: 79*9880d681SAndroid Build Coastguard Worker; GCN: v_mov_b32_e32 [[K:v[0-9]+]], 42 80*9880d681SAndroid Build Coastguard Worker; GCN: buffer_atomic_dec [[K]], off, s{{\[[0-9]+:[0-9]+\]}}, 0 offset:16{{$}} 81*9880d681SAndroid Build Coastguard Workerdefine void @global_atomic_dec_noret_i32_offset(i32 addrspace(1)* %ptr) nounwind { 82*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4 83*9880d681SAndroid Build Coastguard Worker %result = call i32 @llvm.amdgcn.atomic.dec.i32.p1i32(i32 addrspace(1)* %gep, i32 42) 84*9880d681SAndroid Build Coastguard Worker ret void 85*9880d681SAndroid Build Coastguard Worker} 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}global_atomic_dec_ret_i32_offset_addr64: 88*9880d681SAndroid Build Coastguard Worker; GCN: v_mov_b32_e32 [[K:v[0-9]+]], 42 89*9880d681SAndroid Build Coastguard Worker; CI: buffer_atomic_dec [[K]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:20 glc{{$}} 90*9880d681SAndroid Build Coastguard Worker; VI: flat_atomic_dec v{{[0-9]+}}, v{{\[[0-9]+:[0-9]+\]}}, [[K]] glc{{$}} 91*9880d681SAndroid Build Coastguard Workerdefine void @global_atomic_dec_ret_i32_offset_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %ptr) #0 { 92*9880d681SAndroid Build Coastguard Worker %id = call i32 @llvm.amdgcn.workitem.id.x() 93*9880d681SAndroid Build Coastguard Worker %gep.tid = getelementptr i32, i32 addrspace(1)* %ptr, i32 %id 94*9880d681SAndroid Build Coastguard Worker %out.gep = getelementptr i32, i32 addrspace(1)* %out, i32 %id 95*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i32, i32 addrspace(1)* %gep.tid, i32 5 96*9880d681SAndroid Build Coastguard Worker %result = call i32 @llvm.amdgcn.atomic.dec.i32.p1i32(i32 addrspace(1)* %gep, i32 42) 97*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out.gep 98*9880d681SAndroid Build Coastguard Worker ret void 99*9880d681SAndroid Build Coastguard Worker} 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}global_atomic_dec_noret_i32_offset_addr64: 102*9880d681SAndroid Build Coastguard Worker; GCN: v_mov_b32_e32 [[K:v[0-9]+]], 42 103*9880d681SAndroid Build Coastguard Worker; CI: buffer_atomic_dec [[K]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:20{{$}} 104*9880d681SAndroid Build Coastguard Worker; VI: flat_atomic_dec v{{\[[0-9]+:[0-9]+\]}}, [[K]]{{$}} 105*9880d681SAndroid Build Coastguard Workerdefine void @global_atomic_dec_noret_i32_offset_addr64(i32 addrspace(1)* %ptr) #0 { 106*9880d681SAndroid Build Coastguard Worker %id = call i32 @llvm.amdgcn.workitem.id.x() 107*9880d681SAndroid Build Coastguard Worker %gep.tid = getelementptr i32, i32 addrspace(1)* %ptr, i32 %id 108*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i32, i32 addrspace(1)* %gep.tid, i32 5 109*9880d681SAndroid Build Coastguard Worker %result = call i32 @llvm.amdgcn.atomic.dec.i32.p1i32(i32 addrspace(1)* %gep, i32 42) 110*9880d681SAndroid Build Coastguard Worker ret void 111*9880d681SAndroid Build Coastguard Worker} 112*9880d681SAndroid Build Coastguard Worker 113*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}flat_atomic_dec_ret_i32: 114*9880d681SAndroid Build Coastguard Worker; GCN: v_mov_b32_e32 [[K:v[0-9]+]], 42 115*9880d681SAndroid Build Coastguard Worker; GCN: flat_atomic_dec v{{[0-9]+}}, v{{\[[0-9]+:[0-9]+\]}}, [[K]] glc{{$}} 116*9880d681SAndroid Build Coastguard Workerdefine void @flat_atomic_dec_ret_i32(i32 addrspace(4)* %out, i32 addrspace(4)* %ptr) #0 { 117*9880d681SAndroid Build Coastguard Worker %result = call i32 @llvm.amdgcn.atomic.dec.i32.p4i32(i32 addrspace(4)* %ptr, i32 42) 118*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(4)* %out 119*9880d681SAndroid Build Coastguard Worker ret void 120*9880d681SAndroid Build Coastguard Worker} 121*9880d681SAndroid Build Coastguard Worker 122*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}flat_atomic_dec_ret_i32_offset: 123*9880d681SAndroid Build Coastguard Worker; GCN: v_mov_b32_e32 [[K:v[0-9]+]], 42 124*9880d681SAndroid Build Coastguard Worker; GCN: flat_atomic_dec v{{[0-9]+}}, v{{\[[0-9]+:[0-9]+\]}}, [[K]] glc{{$}} 125*9880d681SAndroid Build Coastguard Workerdefine void @flat_atomic_dec_ret_i32_offset(i32 addrspace(4)* %out, i32 addrspace(4)* %ptr) #0 { 126*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i32, i32 addrspace(4)* %ptr, i32 4 127*9880d681SAndroid Build Coastguard Worker %result = call i32 @llvm.amdgcn.atomic.dec.i32.p4i32(i32 addrspace(4)* %gep, i32 42) 128*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(4)* %out 129*9880d681SAndroid Build Coastguard Worker ret void 130*9880d681SAndroid Build Coastguard Worker} 131*9880d681SAndroid Build Coastguard Worker 132*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}flat_atomic_dec_noret_i32: 133*9880d681SAndroid Build Coastguard Worker; GCN: flat_atomic_dec v{{\[[0-9]+:[0-9]+\]}}, [[K]]{{$}} 134*9880d681SAndroid Build Coastguard Workerdefine void @flat_atomic_dec_noret_i32(i32 addrspace(4)* %ptr) nounwind { 135*9880d681SAndroid Build Coastguard Worker %result = call i32 @llvm.amdgcn.atomic.dec.i32.p4i32(i32 addrspace(4)* %ptr, i32 42) 136*9880d681SAndroid Build Coastguard Worker ret void 137*9880d681SAndroid Build Coastguard Worker} 138*9880d681SAndroid Build Coastguard Worker 139*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}flat_atomic_dec_noret_i32_offset: 140*9880d681SAndroid Build Coastguard Worker; GCN: v_mov_b32_e32 [[K:v[0-9]+]], 42 141*9880d681SAndroid Build Coastguard Worker; GCN: flat_atomic_dec v{{\[[0-9]+:[0-9]+\]}}, [[K]]{{$}} 142*9880d681SAndroid Build Coastguard Workerdefine void @flat_atomic_dec_noret_i32_offset(i32 addrspace(4)* %ptr) nounwind { 143*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i32, i32 addrspace(4)* %ptr, i32 4 144*9880d681SAndroid Build Coastguard Worker %result = call i32 @llvm.amdgcn.atomic.dec.i32.p4i32(i32 addrspace(4)* %gep, i32 42) 145*9880d681SAndroid Build Coastguard Worker ret void 146*9880d681SAndroid Build Coastguard Worker} 147*9880d681SAndroid Build Coastguard Worker 148*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}flat_atomic_dec_ret_i32_offset_addr64: 149*9880d681SAndroid Build Coastguard Worker; GCN: v_mov_b32_e32 [[K:v[0-9]+]], 42 150*9880d681SAndroid Build Coastguard Worker; GCN: flat_atomic_dec v{{[0-9]+}}, v{{\[[0-9]+:[0-9]+\]}}, [[K]] glc{{$}} 151*9880d681SAndroid Build Coastguard Workerdefine void @flat_atomic_dec_ret_i32_offset_addr64(i32 addrspace(4)* %out, i32 addrspace(4)* %ptr) #0 { 152*9880d681SAndroid Build Coastguard Worker %id = call i32 @llvm.amdgcn.workitem.id.x() 153*9880d681SAndroid Build Coastguard Worker %gep.tid = getelementptr i32, i32 addrspace(4)* %ptr, i32 %id 154*9880d681SAndroid Build Coastguard Worker %out.gep = getelementptr i32, i32 addrspace(4)* %out, i32 %id 155*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i32, i32 addrspace(4)* %gep.tid, i32 5 156*9880d681SAndroid Build Coastguard Worker %result = call i32 @llvm.amdgcn.atomic.dec.i32.p4i32(i32 addrspace(4)* %gep, i32 42) 157*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(4)* %out.gep 158*9880d681SAndroid Build Coastguard Worker ret void 159*9880d681SAndroid Build Coastguard Worker} 160*9880d681SAndroid Build Coastguard Worker 161*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}flat_atomic_dec_noret_i32_offset_addr64: 162*9880d681SAndroid Build Coastguard Worker; GCN: v_mov_b32_e32 [[K:v[0-9]+]], 42 163*9880d681SAndroid Build Coastguard Worker; GCN: flat_atomic_dec v{{\[[0-9]+:[0-9]+\]}}, [[K]]{{$}} 164*9880d681SAndroid Build Coastguard Workerdefine void @flat_atomic_dec_noret_i32_offset_addr64(i32 addrspace(4)* %ptr) #0 { 165*9880d681SAndroid Build Coastguard Worker %id = call i32 @llvm.amdgcn.workitem.id.x() 166*9880d681SAndroid Build Coastguard Worker %gep.tid = getelementptr i32, i32 addrspace(4)* %ptr, i32 %id 167*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i32, i32 addrspace(4)* %gep.tid, i32 5 168*9880d681SAndroid Build Coastguard Worker %result = call i32 @llvm.amdgcn.atomic.dec.i32.p4i32(i32 addrspace(4)* %gep, i32 42) 169*9880d681SAndroid Build Coastguard Worker ret void 170*9880d681SAndroid Build Coastguard Worker} 171*9880d681SAndroid Build Coastguard Worker 172*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}flat_atomic_dec_ret_i64: 173*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KLO:[0-9]+]], 42 174*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KHI:[0-9]+]], 0{{$}} 175*9880d681SAndroid Build Coastguard Worker; GCN: flat_atomic_dec_x2 v{{\[[0-9]+:[0-9]+\]}}, v{{\[[0-9]+:[0-9]+\]}}, v{{\[}}[[KLO]]:[[KHI]]{{\]}} glc{{$}} 176*9880d681SAndroid Build Coastguard Workerdefine void @flat_atomic_dec_ret_i64(i64 addrspace(4)* %out, i64 addrspace(4)* %ptr) #0 { 177*9880d681SAndroid Build Coastguard Worker %result = call i64 @llvm.amdgcn.atomic.dec.i64.p4i64(i64 addrspace(4)* %ptr, i64 42) 178*9880d681SAndroid Build Coastguard Worker store i64 %result, i64 addrspace(4)* %out 179*9880d681SAndroid Build Coastguard Worker ret void 180*9880d681SAndroid Build Coastguard Worker} 181*9880d681SAndroid Build Coastguard Worker 182*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}flat_atomic_dec_ret_i64_offset: 183*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KLO:[0-9]+]], 42 184*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KHI:[0-9]+]], 0{{$}} 185*9880d681SAndroid Build Coastguard Worker; GCN: flat_atomic_dec_x2 v{{\[[0-9]+:[0-9]+\]}}, v{{\[[0-9]+:[0-9]+\]}}, v{{\[}}[[KLO]]:[[KHI]]{{\]}} glc{{$}} 186*9880d681SAndroid Build Coastguard Workerdefine void @flat_atomic_dec_ret_i64_offset(i64 addrspace(4)* %out, i64 addrspace(4)* %ptr) #0 { 187*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i64, i64 addrspace(4)* %ptr, i32 4 188*9880d681SAndroid Build Coastguard Worker %result = call i64 @llvm.amdgcn.atomic.dec.i64.p4i64(i64 addrspace(4)* %gep, i64 42) 189*9880d681SAndroid Build Coastguard Worker store i64 %result, i64 addrspace(4)* %out 190*9880d681SAndroid Build Coastguard Worker ret void 191*9880d681SAndroid Build Coastguard Worker} 192*9880d681SAndroid Build Coastguard Worker 193*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}flat_atomic_dec_noret_i64: 194*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KLO:[0-9]+]], 42 195*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KHI:[0-9]+]], 0{{$}} 196*9880d681SAndroid Build Coastguard Worker; GCN: flat_atomic_dec_x2 v{{\[[0-9]+:[0-9]+\]}}, v{{\[}}[[KLO]]:[[KHI]]{{\]$}} 197*9880d681SAndroid Build Coastguard Workerdefine void @flat_atomic_dec_noret_i64(i64 addrspace(4)* %ptr) nounwind { 198*9880d681SAndroid Build Coastguard Worker %result = call i64 @llvm.amdgcn.atomic.dec.i64.p4i64(i64 addrspace(4)* %ptr, i64 42) 199*9880d681SAndroid Build Coastguard Worker ret void 200*9880d681SAndroid Build Coastguard Worker} 201*9880d681SAndroid Build Coastguard Worker 202*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}flat_atomic_dec_noret_i64_offset: 203*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KLO:[0-9]+]], 42 204*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KHI:[0-9]+]], 0{{$}} 205*9880d681SAndroid Build Coastguard Worker; GCN: flat_atomic_dec_x2 v{{\[[0-9]+:[0-9]+\]}}, v{{\[}}[[KLO]]:[[KHI]]{{\]$}} 206*9880d681SAndroid Build Coastguard Workerdefine void @flat_atomic_dec_noret_i64_offset(i64 addrspace(4)* %ptr) nounwind { 207*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i64, i64 addrspace(4)* %ptr, i32 4 208*9880d681SAndroid Build Coastguard Worker %result = call i64 @llvm.amdgcn.atomic.dec.i64.p4i64(i64 addrspace(4)* %gep, i64 42) 209*9880d681SAndroid Build Coastguard Worker ret void 210*9880d681SAndroid Build Coastguard Worker} 211*9880d681SAndroid Build Coastguard Worker 212*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}flat_atomic_dec_ret_i64_offset_addr64: 213*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KLO:[0-9]+]], 42 214*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KHI:[0-9]+]], 0{{$}} 215*9880d681SAndroid Build Coastguard Worker; GCN: flat_atomic_dec_x2 v{{\[[0-9]+:[0-9]+\]}}, v{{\[[0-9]+:[0-9]+\]}}, v{{\[}}[[KLO]]:[[KHI]]{{\]}} glc{{$}} 216*9880d681SAndroid Build Coastguard Workerdefine void @flat_atomic_dec_ret_i64_offset_addr64(i64 addrspace(4)* %out, i64 addrspace(4)* %ptr) #0 { 217*9880d681SAndroid Build Coastguard Worker %id = call i32 @llvm.amdgcn.workitem.id.x() 218*9880d681SAndroid Build Coastguard Worker %gep.tid = getelementptr i64, i64 addrspace(4)* %ptr, i32 %id 219*9880d681SAndroid Build Coastguard Worker %out.gep = getelementptr i64, i64 addrspace(4)* %out, i32 %id 220*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i64, i64 addrspace(4)* %gep.tid, i32 5 221*9880d681SAndroid Build Coastguard Worker %result = call i64 @llvm.amdgcn.atomic.dec.i64.p4i64(i64 addrspace(4)* %gep, i64 42) 222*9880d681SAndroid Build Coastguard Worker store i64 %result, i64 addrspace(4)* %out.gep 223*9880d681SAndroid Build Coastguard Worker ret void 224*9880d681SAndroid Build Coastguard Worker} 225*9880d681SAndroid Build Coastguard Worker 226*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}flat_atomic_dec_noret_i64_offset_addr64: 227*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KLO:[0-9]+]], 42 228*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KHI:[0-9]+]], 0{{$}} 229*9880d681SAndroid Build Coastguard Worker; GCN: flat_atomic_dec_x2 v{{\[[0-9]+:[0-9]+\]}}, v{{\[}}[[KLO]]:[[KHI]]{{\]$}} 230*9880d681SAndroid Build Coastguard Workerdefine void @flat_atomic_dec_noret_i64_offset_addr64(i64 addrspace(4)* %ptr) #0 { 231*9880d681SAndroid Build Coastguard Worker %id = call i32 @llvm.amdgcn.workitem.id.x() 232*9880d681SAndroid Build Coastguard Worker %gep.tid = getelementptr i64, i64 addrspace(4)* %ptr, i32 %id 233*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i64, i64 addrspace(4)* %gep.tid, i32 5 234*9880d681SAndroid Build Coastguard Worker %result = call i64 @llvm.amdgcn.atomic.dec.i64.p4i64(i64 addrspace(4)* %gep, i64 42) 235*9880d681SAndroid Build Coastguard Worker ret void 236*9880d681SAndroid Build Coastguard Worker} 237*9880d681SAndroid Build Coastguard Worker 238*9880d681SAndroid Build Coastguard Worker@lds0 = addrspace(3) global [512 x i32] undef 239*9880d681SAndroid Build Coastguard Worker 240*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}atomic_dec_shl_base_lds_0: 241*9880d681SAndroid Build Coastguard Worker; SI: v_lshlrev_b32_e32 [[PTR:v[0-9]+]], 2, {{v[0-9]+}} 242*9880d681SAndroid Build Coastguard Worker; SI: ds_dec_rtn_u32 {{v[0-9]+}}, [[PTR]] offset:8 243*9880d681SAndroid Build Coastguard Workerdefine void @atomic_dec_shl_base_lds_0(i32 addrspace(1)* %out, i32 addrspace(1)* %add_use) #0 { 244*9880d681SAndroid Build Coastguard Worker %tid.x = tail call i32 @llvm.amdgcn.workitem.id.x() #1 245*9880d681SAndroid Build Coastguard Worker %idx.0 = add nsw i32 %tid.x, 2 246*9880d681SAndroid Build Coastguard Worker %arrayidx0 = getelementptr inbounds [512 x i32], [512 x i32] addrspace(3)* @lds0, i32 0, i32 %idx.0 247*9880d681SAndroid Build Coastguard Worker %val0 = call i32 @llvm.amdgcn.atomic.dec.i32.p3i32(i32 addrspace(3)* %arrayidx0, i32 9) 248*9880d681SAndroid Build Coastguard Worker store i32 %idx.0, i32 addrspace(1)* %add_use 249*9880d681SAndroid Build Coastguard Worker store i32 %val0, i32 addrspace(1)* %out 250*9880d681SAndroid Build Coastguard Worker ret void 251*9880d681SAndroid Build Coastguard Worker} 252*9880d681SAndroid Build Coastguard Worker 253*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}lds_atomic_dec_ret_i64: 254*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KLO:[0-9]+]], 42 255*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KHI:[0-9]+]], 0{{$}} 256*9880d681SAndroid Build Coastguard Worker; GCN: ds_dec_rtn_u64 v{{\[[0-9]+:[0-9]+\]}}, v{{[0-9]+}}, v{{\[}}[[KLO]]:[[KHI]]{{\]}}{{$}} 257*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_dec_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) #0 { 258*9880d681SAndroid Build Coastguard Worker %result = call i64 @llvm.amdgcn.atomic.dec.i64.p3i64(i64 addrspace(3)* %ptr, i64 42) 259*9880d681SAndroid Build Coastguard Worker store i64 %result, i64 addrspace(1)* %out 260*9880d681SAndroid Build Coastguard Worker ret void 261*9880d681SAndroid Build Coastguard Worker} 262*9880d681SAndroid Build Coastguard Worker 263*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}lds_atomic_dec_ret_i64_offset: 264*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KLO:[0-9]+]], 42 265*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KHI:[0-9]+]], 0{{$}} 266*9880d681SAndroid Build Coastguard Worker; GCN: ds_dec_rtn_u64 v{{\[[0-9]+:[0-9]+\]}}, v{{[0-9]+}}, v{{\[}}[[KLO]]:[[KHI]]{{\]}} offset:32 267*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_dec_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) #0 { 268*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4 269*9880d681SAndroid Build Coastguard Worker %result = call i64 @llvm.amdgcn.atomic.dec.i64.p3i64(i64 addrspace(3)* %gep, i64 42) 270*9880d681SAndroid Build Coastguard Worker store i64 %result, i64 addrspace(1)* %out 271*9880d681SAndroid Build Coastguard Worker ret void 272*9880d681SAndroid Build Coastguard Worker} 273*9880d681SAndroid Build Coastguard Worker 274*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}lds_atomic_dec_noret_i64: 275*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KLO:[0-9]+]], 42 276*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KHI:[0-9]+]], 0{{$}} 277*9880d681SAndroid Build Coastguard Worker; GCN: ds_dec_u64 v{{[0-9]+}}, v{{\[}}[[KLO]]:[[KHI]]{{\]}}{{$}} 278*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_dec_noret_i64(i64 addrspace(3)* %ptr) nounwind { 279*9880d681SAndroid Build Coastguard Worker %result = call i64 @llvm.amdgcn.atomic.dec.i64.p3i64(i64 addrspace(3)* %ptr, i64 42) 280*9880d681SAndroid Build Coastguard Worker ret void 281*9880d681SAndroid Build Coastguard Worker} 282*9880d681SAndroid Build Coastguard Worker 283*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}lds_atomic_dec_noret_i64_offset: 284*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KLO:[0-9]+]], 42 285*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KHI:[0-9]+]], 0{{$}} 286*9880d681SAndroid Build Coastguard Worker; GCN: ds_dec_u64 v{{[0-9]+}}, v{{\[}}[[KLO]]:[[KHI]]{{\]}} offset:32{{$}} 287*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_dec_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind { 288*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4 289*9880d681SAndroid Build Coastguard Worker %result = call i64 @llvm.amdgcn.atomic.dec.i64.p3i64(i64 addrspace(3)* %gep, i64 42) 290*9880d681SAndroid Build Coastguard Worker ret void 291*9880d681SAndroid Build Coastguard Worker} 292*9880d681SAndroid Build Coastguard Worker 293*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}global_atomic_dec_ret_i64: 294*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KLO:[0-9]+]], 42 295*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KHI:[0-9]+]], 0{{$}} 296*9880d681SAndroid Build Coastguard Worker; GCN: buffer_atomic_dec_x2 v{{\[}}[[KLO]]:[[KHI]]{{\]}}, off, s{{\[[0-9]+:[0-9]+\]}}, 0 glc{{$}} 297*9880d681SAndroid Build Coastguard Workerdefine void @global_atomic_dec_ret_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %ptr) #0 { 298*9880d681SAndroid Build Coastguard Worker %result = call i64 @llvm.amdgcn.atomic.dec.i64.p1i64(i64 addrspace(1)* %ptr, i64 42) 299*9880d681SAndroid Build Coastguard Worker store i64 %result, i64 addrspace(1)* %out 300*9880d681SAndroid Build Coastguard Worker ret void 301*9880d681SAndroid Build Coastguard Worker} 302*9880d681SAndroid Build Coastguard Worker 303*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}global_atomic_dec_ret_i64_offset: 304*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KLO:[0-9]+]], 42 305*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KHI:[0-9]+]], 0{{$}} 306*9880d681SAndroid Build Coastguard Worker; GCN: buffer_atomic_dec_x2 v{{\[}}[[KLO]]:[[KHI]]{{\]}}, off, s{{\[[0-9]+:[0-9]+\]}}, 0 offset:32 glc{{$}} 307*9880d681SAndroid Build Coastguard Workerdefine void @global_atomic_dec_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(1)* %ptr) #0 { 308*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i64, i64 addrspace(1)* %ptr, i32 4 309*9880d681SAndroid Build Coastguard Worker %result = call i64 @llvm.amdgcn.atomic.dec.i64.p1i64(i64 addrspace(1)* %gep, i64 42) 310*9880d681SAndroid Build Coastguard Worker store i64 %result, i64 addrspace(1)* %out 311*9880d681SAndroid Build Coastguard Worker ret void 312*9880d681SAndroid Build Coastguard Worker} 313*9880d681SAndroid Build Coastguard Worker 314*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}global_atomic_dec_noret_i64: 315*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KLO:[0-9]+]], 42 316*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KHI:[0-9]+]], 0{{$}} 317*9880d681SAndroid Build Coastguard Worker; GCN: buffer_atomic_dec_x2 v{{\[}}[[KLO]]:[[KHI]]{{\]}}, off, s{{\[[0-9]+:[0-9]+\]}}, 0{{$}} 318*9880d681SAndroid Build Coastguard Workerdefine void @global_atomic_dec_noret_i64(i64 addrspace(1)* %ptr) nounwind { 319*9880d681SAndroid Build Coastguard Worker %result = call i64 @llvm.amdgcn.atomic.dec.i64.p1i64(i64 addrspace(1)* %ptr, i64 42) 320*9880d681SAndroid Build Coastguard Worker ret void 321*9880d681SAndroid Build Coastguard Worker} 322*9880d681SAndroid Build Coastguard Worker 323*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}global_atomic_dec_noret_i64_offset: 324*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KLO:[0-9]+]], 42 325*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KHI:[0-9]+]], 0{{$}} 326*9880d681SAndroid Build Coastguard Worker; GCN: buffer_atomic_dec_x2 v{{\[}}[[KLO]]:[[KHI]]{{\]}}, off, s{{\[[0-9]+:[0-9]+\]}}, 0 offset:32{{$}} 327*9880d681SAndroid Build Coastguard Workerdefine void @global_atomic_dec_noret_i64_offset(i64 addrspace(1)* %ptr) nounwind { 328*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i64, i64 addrspace(1)* %ptr, i32 4 329*9880d681SAndroid Build Coastguard Worker %result = call i64 @llvm.amdgcn.atomic.dec.i64.p1i64(i64 addrspace(1)* %gep, i64 42) 330*9880d681SAndroid Build Coastguard Worker ret void 331*9880d681SAndroid Build Coastguard Worker} 332*9880d681SAndroid Build Coastguard Worker 333*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}global_atomic_dec_ret_i64_offset_addr64: 334*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KLO:[0-9]+]], 42 335*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KHI:[0-9]+]], 0{{$}} 336*9880d681SAndroid Build Coastguard Worker; CI: buffer_atomic_dec_x2 v{{\[}}[[KLO]]:[[KHI]]{{\]}}, v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:40 glc{{$}} 337*9880d681SAndroid Build Coastguard Worker; VI: flat_atomic_dec_x2 v{{\[[0-9]+:[0-9]+\]}}, v{{\[[0-9]+:[0-9]+\]}}, v{{\[}}[[KLO]]:[[KHI]]{{\]}} glc{{$}} 338*9880d681SAndroid Build Coastguard Workerdefine void @global_atomic_dec_ret_i64_offset_addr64(i64 addrspace(1)* %out, i64 addrspace(1)* %ptr) #0 { 339*9880d681SAndroid Build Coastguard Worker %id = call i32 @llvm.amdgcn.workitem.id.x() 340*9880d681SAndroid Build Coastguard Worker %gep.tid = getelementptr i64, i64 addrspace(1)* %ptr, i32 %id 341*9880d681SAndroid Build Coastguard Worker %out.gep = getelementptr i64, i64 addrspace(1)* %out, i32 %id 342*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i64, i64 addrspace(1)* %gep.tid, i32 5 343*9880d681SAndroid Build Coastguard Worker %result = call i64 @llvm.amdgcn.atomic.dec.i64.p1i64(i64 addrspace(1)* %gep, i64 42) 344*9880d681SAndroid Build Coastguard Worker store i64 %result, i64 addrspace(1)* %out.gep 345*9880d681SAndroid Build Coastguard Worker ret void 346*9880d681SAndroid Build Coastguard Worker} 347*9880d681SAndroid Build Coastguard Worker 348*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}global_atomic_dec_noret_i64_offset_addr64: 349*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KLO:[0-9]+]], 42 350*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KHI:[0-9]+]], 0{{$}} 351*9880d681SAndroid Build Coastguard Worker; CI: buffer_atomic_dec_x2 v{{\[}}[[KLO]]:[[KHI]]{{\]}}, v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:40{{$}} 352*9880d681SAndroid Build Coastguard Worker; VI: flat_atomic_dec_x2 v{{\[[0-9]+:[0-9]+\]}}, v{{\[}}[[KLO]]:[[KHI]]{{\]}}{{$}} 353*9880d681SAndroid Build Coastguard Workerdefine void @global_atomic_dec_noret_i64_offset_addr64(i64 addrspace(1)* %ptr) #0 { 354*9880d681SAndroid Build Coastguard Worker %id = call i32 @llvm.amdgcn.workitem.id.x() 355*9880d681SAndroid Build Coastguard Worker %gep.tid = getelementptr i64, i64 addrspace(1)* %ptr, i32 %id 356*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i64, i64 addrspace(1)* %gep.tid, i32 5 357*9880d681SAndroid Build Coastguard Worker %result = call i64 @llvm.amdgcn.atomic.dec.i64.p1i64(i64 addrspace(1)* %gep, i64 42) 358*9880d681SAndroid Build Coastguard Worker ret void 359*9880d681SAndroid Build Coastguard Worker} 360*9880d681SAndroid Build Coastguard Worker 361*9880d681SAndroid Build Coastguard Worker@lds1 = addrspace(3) global [512 x i64] undef, align 8 362*9880d681SAndroid Build Coastguard Worker 363*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}atomic_dec_shl_base_lds_0_i64: 364*9880d681SAndroid Build Coastguard Worker; GCN: v_lshlrev_b32_e32 [[PTR:v[0-9]+]], 3, {{v[0-9]+}} 365*9880d681SAndroid Build Coastguard Worker; GCN: ds_dec_rtn_u64 v{{\[[0-9]+:[0-9]+\]}}, [[PTR]], v{{\[[0-9]+:[0-9]+\]}} offset:16 366*9880d681SAndroid Build Coastguard Workerdefine void @atomic_dec_shl_base_lds_0_i64(i64 addrspace(1)* %out, i32 addrspace(1)* %add_use) #0 { 367*9880d681SAndroid Build Coastguard Worker %tid.x = tail call i32 @llvm.amdgcn.workitem.id.x() #1 368*9880d681SAndroid Build Coastguard Worker %idx.0 = add nsw i32 %tid.x, 2 369*9880d681SAndroid Build Coastguard Worker %arrayidx0 = getelementptr inbounds [512 x i64], [512 x i64] addrspace(3)* @lds1, i32 0, i32 %idx.0 370*9880d681SAndroid Build Coastguard Worker %val0 = call i64 @llvm.amdgcn.atomic.dec.i64.p3i64(i64 addrspace(3)* %arrayidx0, i64 9) 371*9880d681SAndroid Build Coastguard Worker store i32 %idx.0, i32 addrspace(1)* %add_use 372*9880d681SAndroid Build Coastguard Worker store i64 %val0, i64 addrspace(1)* %out 373*9880d681SAndroid Build Coastguard Worker ret void 374*9880d681SAndroid Build Coastguard Worker} 375*9880d681SAndroid Build Coastguard Worker 376*9880d681SAndroid Build Coastguard Workerattributes #0 = { nounwind } 377*9880d681SAndroid Build Coastguard Workerattributes #1 = { nounwind readnone } 378*9880d681SAndroid Build Coastguard Workerattributes #2 = { nounwind argmemonly } 379*9880d681SAndroid Build Coastguard Worker 380*9880d681SAndroid Build Coastguard Worker 381*9880d681SAndroid Build Coastguard Worker 382*9880d681SAndroid Build Coastguard Worker 383*9880d681SAndroid Build Coastguard Worker 384*9880d681SAndroid Build Coastguard Worker 385*9880d681SAndroid Build Coastguard Worker 386*9880d681SAndroid Build Coastguard Worker 387*9880d681SAndroid Build Coastguard Worker 388