1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck -check-prefix=SI -check-prefix=GCN -check-prefix=FUNC %s 2*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -mcpu=bonaire -verify-machineinstrs < %s | FileCheck -check-prefix=CIVI -check-prefix=GCN -check-prefix=FUNC %s 3*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck -check-prefix=CIVI -check-prefix=GCN -check-prefix=FUNC %s 4*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=r600 -mcpu=redwood -verify-machineinstrs < %s | FileCheck -check-prefix=EG -check-prefix=FUNC %s 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}lds_atomic_xchg_ret_i32: 7*9880d681SAndroid Build Coastguard Worker; EG: LDS_WRXCHG_RET * 8*9880d681SAndroid Build Coastguard Worker; GCN: s_load_dword [[SPTR:s[0-9]+]], 9*9880d681SAndroid Build Coastguard Worker; GCN: v_mov_b32_e32 [[DATA:v[0-9]+]], 4 10*9880d681SAndroid Build Coastguard Worker; GCN: v_mov_b32_e32 [[VPTR:v[0-9]+]], [[SPTR]] 11*9880d681SAndroid Build Coastguard Worker; GCN: ds_wrxchg_rtn_b32 [[RESULT:v[0-9]+]], [[VPTR]], [[DATA]] 12*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dword [[RESULT]], 13*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 14*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_xchg_ret_i32(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind { 15*9880d681SAndroid Build Coastguard Worker %result = atomicrmw xchg i32 addrspace(3)* %ptr, i32 4 seq_cst 16*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out, align 4 17*9880d681SAndroid Build Coastguard Worker ret void 18*9880d681SAndroid Build Coastguard Worker} 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}lds_atomic_xchg_ret_i32_offset: 21*9880d681SAndroid Build Coastguard Worker; EG: LDS_WRXCHG_RET * 22*9880d681SAndroid Build Coastguard Worker; GCN: ds_wrxchg_rtn_b32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} offset:16 23*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 24*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_xchg_ret_i32_offset(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind { 25*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i32, i32 addrspace(3)* %ptr, i32 4 26*9880d681SAndroid Build Coastguard Worker %result = atomicrmw xchg i32 addrspace(3)* %gep, i32 4 seq_cst 27*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out, align 4 28*9880d681SAndroid Build Coastguard Worker ret void 29*9880d681SAndroid Build Coastguard Worker} 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Worker; XXX - Is it really necessary to load 4 into VGPR? 32*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}lds_atomic_add_ret_i32: 33*9880d681SAndroid Build Coastguard Worker; EG: LDS_ADD_RET * 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_add_rtn_u32 [[RESULT:v[0-9]+]], [[VPTR]], [[DATA]] 38*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dword [[RESULT]], 39*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 40*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_add_ret_i32(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind { 41*9880d681SAndroid Build Coastguard Worker %result = atomicrmw add i32 addrspace(3)* %ptr, i32 4 seq_cst 42*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out, align 4 43*9880d681SAndroid Build Coastguard Worker ret void 44*9880d681SAndroid Build Coastguard Worker} 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}lds_atomic_add_ret_i32_offset: 47*9880d681SAndroid Build Coastguard Worker; EG: LDS_ADD_RET * 48*9880d681SAndroid Build Coastguard Worker; GCN: ds_add_rtn_u32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} offset:16 49*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 50*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_add_ret_i32_offset(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind { 51*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i32, i32 addrspace(3)* %ptr, i32 4 52*9880d681SAndroid Build Coastguard Worker %result = atomicrmw add i32 addrspace(3)* %gep, i32 4 seq_cst 53*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out, align 4 54*9880d681SAndroid Build Coastguard Worker ret void 55*9880d681SAndroid Build Coastguard Worker} 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}lds_atomic_add_ret_i32_bad_si_offset: 58*9880d681SAndroid Build Coastguard Worker; EG: LDS_ADD_RET * 59*9880d681SAndroid Build Coastguard Worker; SI: ds_add_rtn_u32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} 60*9880d681SAndroid Build Coastguard Worker; CIVI: ds_add_rtn_u32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} offset:16 61*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 62*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_add_ret_i32_bad_si_offset(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr, i32 %a, i32 %b) nounwind { 63*9880d681SAndroid Build Coastguard Worker %sub = sub i32 %a, %b 64*9880d681SAndroid Build Coastguard Worker %add = add i32 %sub, 4 65*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i32, i32 addrspace(3)* %ptr, i32 %add 66*9880d681SAndroid Build Coastguard Worker %result = atomicrmw add i32 addrspace(3)* %gep, i32 4 seq_cst 67*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out, align 4 68*9880d681SAndroid Build Coastguard Worker ret void 69*9880d681SAndroid Build Coastguard Worker} 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}lds_atomic_add1_ret_i32: 72*9880d681SAndroid Build Coastguard Worker; EG: LDS_ADD_RET * 73*9880d681SAndroid Build Coastguard Worker; GCN: v_mov_b32_e32 [[ONE:v[0-9]+]], 1{{$}} 74*9880d681SAndroid Build Coastguard Worker; GCN: ds_add_rtn_u32 v{{[0-9]+}}, v{{[0-9]+}}, [[ONE]] 75*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 76*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_add1_ret_i32(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind { 77*9880d681SAndroid Build Coastguard Worker %result = atomicrmw add i32 addrspace(3)* %ptr, i32 1 seq_cst 78*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out, align 4 79*9880d681SAndroid Build Coastguard Worker ret void 80*9880d681SAndroid Build Coastguard Worker} 81*9880d681SAndroid Build Coastguard Worker 82*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}lds_atomic_add1_ret_i32_offset: 83*9880d681SAndroid Build Coastguard Worker; EG: LDS_ADD_RET * 84*9880d681SAndroid Build Coastguard Worker; GCN: v_mov_b32_e32 [[ONE:v[0-9]+]], 1{{$}} 85*9880d681SAndroid Build Coastguard Worker; GCN: ds_add_rtn_u32 v{{[0-9]+}}, v{{[0-9]+}}, [[ONE]] offset:16 86*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 87*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_add1_ret_i32_offset(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind { 88*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i32, i32 addrspace(3)* %ptr, i32 4 89*9880d681SAndroid Build Coastguard Worker %result = atomicrmw add i32 addrspace(3)* %gep, i32 1 seq_cst 90*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out, align 4 91*9880d681SAndroid Build Coastguard Worker ret void 92*9880d681SAndroid Build Coastguard Worker} 93*9880d681SAndroid Build Coastguard Worker 94*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}lds_atomic_add1_ret_i32_bad_si_offset: 95*9880d681SAndroid Build Coastguard Worker; EG: LDS_ADD_RET * 96*9880d681SAndroid Build Coastguard Worker; SI: ds_add_rtn_u32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} 97*9880d681SAndroid Build Coastguard Worker; CIVI: ds_add_rtn_u32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} offset:16 98*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 99*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_add1_ret_i32_bad_si_offset(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr, i32 %a, i32 %b) nounwind { 100*9880d681SAndroid Build Coastguard Worker %sub = sub i32 %a, %b 101*9880d681SAndroid Build Coastguard Worker %add = add i32 %sub, 4 102*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i32, i32 addrspace(3)* %ptr, i32 %add 103*9880d681SAndroid Build Coastguard Worker %result = atomicrmw add i32 addrspace(3)* %gep, i32 1 seq_cst 104*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out, align 4 105*9880d681SAndroid Build Coastguard Worker ret void 106*9880d681SAndroid Build Coastguard Worker} 107*9880d681SAndroid Build Coastguard Worker 108*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}lds_atomic_sub_ret_i32: 109*9880d681SAndroid Build Coastguard Worker; EG: LDS_SUB_RET * 110*9880d681SAndroid Build Coastguard Worker; GCN: ds_sub_rtn_u32 111*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 112*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_sub_ret_i32(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind { 113*9880d681SAndroid Build Coastguard Worker %result = atomicrmw sub i32 addrspace(3)* %ptr, i32 4 seq_cst 114*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out, align 4 115*9880d681SAndroid Build Coastguard Worker ret void 116*9880d681SAndroid Build Coastguard Worker} 117*9880d681SAndroid Build Coastguard Worker 118*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}lds_atomic_sub_ret_i32_offset: 119*9880d681SAndroid Build Coastguard Worker; EG: LDS_SUB_RET * 120*9880d681SAndroid Build Coastguard Worker; GCN: ds_sub_rtn_u32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} offset:16 121*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 122*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_sub_ret_i32_offset(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind { 123*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i32, i32 addrspace(3)* %ptr, i32 4 124*9880d681SAndroid Build Coastguard Worker %result = atomicrmw sub i32 addrspace(3)* %gep, i32 4 seq_cst 125*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out, align 4 126*9880d681SAndroid Build Coastguard Worker ret void 127*9880d681SAndroid Build Coastguard Worker} 128*9880d681SAndroid Build Coastguard Worker 129*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}lds_atomic_sub1_ret_i32: 130*9880d681SAndroid Build Coastguard Worker; EG: LDS_SUB_RET * 131*9880d681SAndroid Build Coastguard Worker; GCN: v_mov_b32_e32 [[ONE:v[0-9]+]], 1{{$}} 132*9880d681SAndroid Build Coastguard Worker; GCN: ds_sub_rtn_u32 v{{[0-9]+}}, v{{[0-9]+}}, [[ONE]] 133*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 134*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_sub1_ret_i32(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind { 135*9880d681SAndroid Build Coastguard Worker %result = atomicrmw sub i32 addrspace(3)* %ptr, i32 1 seq_cst 136*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out, align 4 137*9880d681SAndroid Build Coastguard Worker ret void 138*9880d681SAndroid Build Coastguard Worker} 139*9880d681SAndroid Build Coastguard Worker 140*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}lds_atomic_sub1_ret_i32_offset: 141*9880d681SAndroid Build Coastguard Worker; EG: LDS_SUB_RET * 142*9880d681SAndroid Build Coastguard Worker; GCN: v_mov_b32_e32 [[ONE:v[0-9]+]], 1{{$}} 143*9880d681SAndroid Build Coastguard Worker; GCN: ds_sub_rtn_u32 v{{[0-9]+}}, v{{[0-9]+}}, [[ONE]] offset:16 144*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 145*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_sub1_ret_i32_offset(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind { 146*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i32, i32 addrspace(3)* %ptr, i32 4 147*9880d681SAndroid Build Coastguard Worker %result = atomicrmw sub i32 addrspace(3)* %gep, i32 1 seq_cst 148*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out, align 4 149*9880d681SAndroid Build Coastguard Worker ret void 150*9880d681SAndroid Build Coastguard Worker} 151*9880d681SAndroid Build Coastguard Worker 152*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}lds_atomic_and_ret_i32: 153*9880d681SAndroid Build Coastguard Worker; EG: LDS_AND_RET * 154*9880d681SAndroid Build Coastguard Worker; GCN: ds_and_rtn_b32 155*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 156*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_and_ret_i32(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind { 157*9880d681SAndroid Build Coastguard Worker %result = atomicrmw and i32 addrspace(3)* %ptr, i32 4 seq_cst 158*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out, align 4 159*9880d681SAndroid Build Coastguard Worker ret void 160*9880d681SAndroid Build Coastguard Worker} 161*9880d681SAndroid Build Coastguard Worker 162*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}lds_atomic_and_ret_i32_offset: 163*9880d681SAndroid Build Coastguard Worker; EG: LDS_AND_RET * 164*9880d681SAndroid Build Coastguard Worker; GCN: ds_and_rtn_b32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} offset:16 165*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 166*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_and_ret_i32_offset(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind { 167*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i32, i32 addrspace(3)* %ptr, i32 4 168*9880d681SAndroid Build Coastguard Worker %result = atomicrmw and i32 addrspace(3)* %gep, i32 4 seq_cst 169*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out, align 4 170*9880d681SAndroid Build Coastguard Worker ret void 171*9880d681SAndroid Build Coastguard Worker} 172*9880d681SAndroid Build Coastguard Worker 173*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}lds_atomic_or_ret_i32: 174*9880d681SAndroid Build Coastguard Worker; EG: LDS_OR_RET * 175*9880d681SAndroid Build Coastguard Worker; GCN: ds_or_rtn_b32 176*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 177*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_or_ret_i32(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind { 178*9880d681SAndroid Build Coastguard Worker %result = atomicrmw or i32 addrspace(3)* %ptr, i32 4 seq_cst 179*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out, align 4 180*9880d681SAndroid Build Coastguard Worker ret void 181*9880d681SAndroid Build Coastguard Worker} 182*9880d681SAndroid Build Coastguard Worker 183*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}lds_atomic_or_ret_i32_offset: 184*9880d681SAndroid Build Coastguard Worker; EG: LDS_OR_RET * 185*9880d681SAndroid Build Coastguard Worker; GCN: ds_or_rtn_b32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} offset:16 186*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 187*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_or_ret_i32_offset(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind { 188*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i32, i32 addrspace(3)* %ptr, i32 4 189*9880d681SAndroid Build Coastguard Worker %result = atomicrmw or i32 addrspace(3)* %gep, i32 4 seq_cst 190*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out, align 4 191*9880d681SAndroid Build Coastguard Worker ret void 192*9880d681SAndroid Build Coastguard Worker} 193*9880d681SAndroid Build Coastguard Worker 194*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}lds_atomic_xor_ret_i32: 195*9880d681SAndroid Build Coastguard Worker; EG: LDS_XOR_RET * 196*9880d681SAndroid Build Coastguard Worker; GCN: ds_xor_rtn_b32 197*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 198*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_xor_ret_i32(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind { 199*9880d681SAndroid Build Coastguard Worker %result = atomicrmw xor i32 addrspace(3)* %ptr, i32 4 seq_cst 200*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out, align 4 201*9880d681SAndroid Build Coastguard Worker ret void 202*9880d681SAndroid Build Coastguard Worker} 203*9880d681SAndroid Build Coastguard Worker 204*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}lds_atomic_xor_ret_i32_offset: 205*9880d681SAndroid Build Coastguard Worker; EG: LDS_XOR_RET * 206*9880d681SAndroid Build Coastguard Worker; GCN: ds_xor_rtn_b32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} offset:16 207*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 208*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_xor_ret_i32_offset(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind { 209*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i32, i32 addrspace(3)* %ptr, i32 4 210*9880d681SAndroid Build Coastguard Worker %result = atomicrmw xor i32 addrspace(3)* %gep, i32 4 seq_cst 211*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out, align 4 212*9880d681SAndroid Build Coastguard Worker ret void 213*9880d681SAndroid Build Coastguard Worker} 214*9880d681SAndroid Build Coastguard Worker 215*9880d681SAndroid Build Coastguard Worker; FIXME: There is no atomic nand instr 216*9880d681SAndroid Build Coastguard Worker; XFUNC-LABEL: {{^}}lds_atomic_nand_ret_i32:uction, so we somehow need to expand this. 217*9880d681SAndroid Build Coastguard Worker; define void @lds_atomic_nand_ret_i32(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind { 218*9880d681SAndroid Build Coastguard Worker; %result = atomicrmw nand i32 addrspace(3)* %ptr, i32 4 seq_cst 219*9880d681SAndroid Build Coastguard Worker; store i32 %result, i32 addrspace(1)* %out, align 4 220*9880d681SAndroid Build Coastguard Worker; ret void 221*9880d681SAndroid Build Coastguard Worker; } 222*9880d681SAndroid Build Coastguard Worker 223*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}lds_atomic_min_ret_i32: 224*9880d681SAndroid Build Coastguard Worker; EG: LDS_MIN_INT_RET * 225*9880d681SAndroid Build Coastguard Worker; GCN: ds_min_rtn_i32 226*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 227*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_min_ret_i32(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind { 228*9880d681SAndroid Build Coastguard Worker %result = atomicrmw min i32 addrspace(3)* %ptr, i32 4 seq_cst 229*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out, align 4 230*9880d681SAndroid Build Coastguard Worker ret void 231*9880d681SAndroid Build Coastguard Worker} 232*9880d681SAndroid Build Coastguard Worker 233*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}lds_atomic_min_ret_i32_offset: 234*9880d681SAndroid Build Coastguard Worker; EG: LDS_MIN_INT_RET * 235*9880d681SAndroid Build Coastguard Worker; GCN: ds_min_rtn_i32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} offset:16 236*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 237*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_min_ret_i32_offset(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind { 238*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i32, i32 addrspace(3)* %ptr, i32 4 239*9880d681SAndroid Build Coastguard Worker %result = atomicrmw min i32 addrspace(3)* %gep, i32 4 seq_cst 240*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out, align 4 241*9880d681SAndroid Build Coastguard Worker ret void 242*9880d681SAndroid Build Coastguard Worker} 243*9880d681SAndroid Build Coastguard Worker 244*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}lds_atomic_max_ret_i32: 245*9880d681SAndroid Build Coastguard Worker; EG: LDS_MAX_INT_RET * 246*9880d681SAndroid Build Coastguard Worker; GCN: ds_max_rtn_i32 247*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 248*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_max_ret_i32(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind { 249*9880d681SAndroid Build Coastguard Worker %result = atomicrmw max i32 addrspace(3)* %ptr, i32 4 seq_cst 250*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out, align 4 251*9880d681SAndroid Build Coastguard Worker ret void 252*9880d681SAndroid Build Coastguard Worker} 253*9880d681SAndroid Build Coastguard Worker 254*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}lds_atomic_max_ret_i32_offset: 255*9880d681SAndroid Build Coastguard Worker; EG: LDS_MAX_INT_RET * 256*9880d681SAndroid Build Coastguard Worker; GCN: ds_max_rtn_i32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} offset:16 257*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 258*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_max_ret_i32_offset(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind { 259*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i32, i32 addrspace(3)* %ptr, i32 4 260*9880d681SAndroid Build Coastguard Worker %result = atomicrmw max i32 addrspace(3)* %gep, i32 4 seq_cst 261*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out, align 4 262*9880d681SAndroid Build Coastguard Worker ret void 263*9880d681SAndroid Build Coastguard Worker} 264*9880d681SAndroid Build Coastguard Worker 265*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}lds_atomic_umin_ret_i32: 266*9880d681SAndroid Build Coastguard Worker; EG: LDS_MIN_UINT_RET * 267*9880d681SAndroid Build Coastguard Worker; GCN: ds_min_rtn_u32 268*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 269*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_umin_ret_i32(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind { 270*9880d681SAndroid Build Coastguard Worker %result = atomicrmw umin i32 addrspace(3)* %ptr, i32 4 seq_cst 271*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out, align 4 272*9880d681SAndroid Build Coastguard Worker ret void 273*9880d681SAndroid Build Coastguard Worker} 274*9880d681SAndroid Build Coastguard Worker 275*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}lds_atomic_umin_ret_i32_offset: 276*9880d681SAndroid Build Coastguard Worker; EG: LDS_MIN_UINT_RET * 277*9880d681SAndroid Build Coastguard Worker; GCN: ds_min_rtn_u32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} offset:16 278*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 279*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_umin_ret_i32_offset(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind { 280*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i32, i32 addrspace(3)* %ptr, i32 4 281*9880d681SAndroid Build Coastguard Worker %result = atomicrmw umin i32 addrspace(3)* %gep, i32 4 seq_cst 282*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out, align 4 283*9880d681SAndroid Build Coastguard Worker ret void 284*9880d681SAndroid Build Coastguard Worker} 285*9880d681SAndroid Build Coastguard Worker 286*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}lds_atomic_umax_ret_i32: 287*9880d681SAndroid Build Coastguard Worker; EG: LDS_MAX_UINT_RET * 288*9880d681SAndroid Build Coastguard Worker; GCN: ds_max_rtn_u32 289*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 290*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_umax_ret_i32(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind { 291*9880d681SAndroid Build Coastguard Worker %result = atomicrmw umax i32 addrspace(3)* %ptr, i32 4 seq_cst 292*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out, align 4 293*9880d681SAndroid Build Coastguard Worker ret void 294*9880d681SAndroid Build Coastguard Worker} 295*9880d681SAndroid Build Coastguard Worker 296*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}lds_atomic_umax_ret_i32_offset: 297*9880d681SAndroid Build Coastguard Worker; EG: LDS_MAX_UINT_RET * 298*9880d681SAndroid Build Coastguard Worker; GCN: ds_max_rtn_u32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} offset:16 299*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 300*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_umax_ret_i32_offset(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) nounwind { 301*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i32, i32 addrspace(3)* %ptr, i32 4 302*9880d681SAndroid Build Coastguard Worker %result = atomicrmw umax i32 addrspace(3)* %gep, i32 4 seq_cst 303*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out, align 4 304*9880d681SAndroid Build Coastguard Worker ret void 305*9880d681SAndroid Build Coastguard Worker} 306*9880d681SAndroid Build Coastguard Worker 307*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}lds_atomic_xchg_noret_i32: 308*9880d681SAndroid Build Coastguard Worker; GCN: s_load_dword [[SPTR:s[0-9]+]], 309*9880d681SAndroid Build Coastguard Worker; GCN: v_mov_b32_e32 [[DATA:v[0-9]+]], 4 310*9880d681SAndroid Build Coastguard Worker; GCN: v_mov_b32_e32 [[VPTR:v[0-9]+]], [[SPTR]] 311*9880d681SAndroid Build Coastguard Worker; GCN: ds_wrxchg_rtn_b32 [[RESULT:v[0-9]+]], [[VPTR]], [[DATA]] 312*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 313*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_xchg_noret_i32(i32 addrspace(3)* %ptr) nounwind { 314*9880d681SAndroid Build Coastguard Worker %result = atomicrmw xchg i32 addrspace(3)* %ptr, i32 4 seq_cst 315*9880d681SAndroid Build Coastguard Worker ret void 316*9880d681SAndroid Build Coastguard Worker} 317*9880d681SAndroid Build Coastguard Worker 318*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}lds_atomic_xchg_noret_i32_offset: 319*9880d681SAndroid Build Coastguard Worker; GCN: ds_wrxchg_rtn_b32 v{{[0-9]+}}, v{{[0-9]+}}, v{{[0-9]+}} offset:16 320*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 321*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_xchg_noret_i32_offset(i32 addrspace(3)* %ptr) nounwind { 322*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i32, i32 addrspace(3)* %ptr, i32 4 323*9880d681SAndroid Build Coastguard Worker %result = atomicrmw xchg i32 addrspace(3)* %gep, i32 4 seq_cst 324*9880d681SAndroid Build Coastguard Worker ret void 325*9880d681SAndroid Build Coastguard Worker} 326*9880d681SAndroid Build Coastguard Worker 327*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}lds_atomic_add_noret_i32: 328*9880d681SAndroid Build Coastguard Worker; GCN: s_load_dword [[SPTR:s[0-9]+]], 329*9880d681SAndroid Build Coastguard Worker; GCN: v_mov_b32_e32 [[DATA:v[0-9]+]], 4 330*9880d681SAndroid Build Coastguard Worker; GCN: v_mov_b32_e32 [[VPTR:v[0-9]+]], [[SPTR]] 331*9880d681SAndroid Build Coastguard Worker; GCN: ds_add_u32 [[VPTR]], [[DATA]] 332*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 333*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_add_noret_i32(i32 addrspace(3)* %ptr) nounwind { 334*9880d681SAndroid Build Coastguard Worker %result = atomicrmw add i32 addrspace(3)* %ptr, i32 4 seq_cst 335*9880d681SAndroid Build Coastguard Worker ret void 336*9880d681SAndroid Build Coastguard Worker} 337*9880d681SAndroid Build Coastguard Worker 338*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}lds_atomic_add_noret_i32_offset: 339*9880d681SAndroid Build Coastguard Worker; GCN: ds_add_u32 v{{[0-9]+}}, v{{[0-9]+}} offset:16 340*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 341*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_add_noret_i32_offset(i32 addrspace(3)* %ptr) nounwind { 342*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i32, i32 addrspace(3)* %ptr, i32 4 343*9880d681SAndroid Build Coastguard Worker %result = atomicrmw add i32 addrspace(3)* %gep, i32 4 seq_cst 344*9880d681SAndroid Build Coastguard Worker ret void 345*9880d681SAndroid Build Coastguard Worker} 346*9880d681SAndroid Build Coastguard Worker 347*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}lds_atomic_add_noret_i32_bad_si_offset 348*9880d681SAndroid Build Coastguard Worker; SI: ds_add_u32 v{{[0-9]+}}, v{{[0-9]+}} 349*9880d681SAndroid Build Coastguard Worker; CIVI: ds_add_u32 v{{[0-9]+}}, v{{[0-9]+}} offset:16 350*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 351*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_add_noret_i32_bad_si_offset(i32 addrspace(3)* %ptr, i32 %a, i32 %b) nounwind { 352*9880d681SAndroid Build Coastguard Worker %sub = sub i32 %a, %b 353*9880d681SAndroid Build Coastguard Worker %add = add i32 %sub, 4 354*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i32, i32 addrspace(3)* %ptr, i32 %add 355*9880d681SAndroid Build Coastguard Worker %result = atomicrmw add i32 addrspace(3)* %gep, i32 4 seq_cst 356*9880d681SAndroid Build Coastguard Worker ret void 357*9880d681SAndroid Build Coastguard Worker} 358*9880d681SAndroid Build Coastguard Worker 359*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}lds_atomic_add1_noret_i32: 360*9880d681SAndroid Build Coastguard Worker; GCN: v_mov_b32_e32 [[ONE:v[0-9]+]], 1{{$}} 361*9880d681SAndroid Build Coastguard Worker; GCN: ds_add_u32 v{{[0-9]+}}, [[ONE]] 362*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 363*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_add1_noret_i32(i32 addrspace(3)* %ptr) nounwind { 364*9880d681SAndroid Build Coastguard Worker %result = atomicrmw add i32 addrspace(3)* %ptr, i32 1 seq_cst 365*9880d681SAndroid Build Coastguard Worker ret void 366*9880d681SAndroid Build Coastguard Worker} 367*9880d681SAndroid Build Coastguard Worker 368*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}lds_atomic_add1_noret_i32_offset: 369*9880d681SAndroid Build Coastguard Worker; GCN: v_mov_b32_e32 [[ONE:v[0-9]+]], 1{{$}} 370*9880d681SAndroid Build Coastguard Worker; GCN: ds_add_u32 v{{[0-9]+}}, [[ONE]] offset:16 371*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 372*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_add1_noret_i32_offset(i32 addrspace(3)* %ptr) nounwind { 373*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i32, i32 addrspace(3)* %ptr, i32 4 374*9880d681SAndroid Build Coastguard Worker %result = atomicrmw add i32 addrspace(3)* %gep, i32 1 seq_cst 375*9880d681SAndroid Build Coastguard Worker ret void 376*9880d681SAndroid Build Coastguard Worker} 377*9880d681SAndroid Build Coastguard Worker 378*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}lds_atomic_add1_noret_i32_bad_si_offset: 379*9880d681SAndroid Build Coastguard Worker; SI: ds_add_u32 v{{[0-9]+}}, v{{[0-9]+}} 380*9880d681SAndroid Build Coastguard Worker; CIVI: ds_add_u32 v{{[0-9]+}}, v{{[0-9]+}} offset:16 381*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 382*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_add1_noret_i32_bad_si_offset(i32 addrspace(3)* %ptr, i32 %a, i32 %b) nounwind { 383*9880d681SAndroid Build Coastguard Worker %sub = sub i32 %a, %b 384*9880d681SAndroid Build Coastguard Worker %add = add i32 %sub, 4 385*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i32, i32 addrspace(3)* %ptr, i32 %add 386*9880d681SAndroid Build Coastguard Worker %result = atomicrmw add i32 addrspace(3)* %gep, i32 1 seq_cst 387*9880d681SAndroid Build Coastguard Worker ret void 388*9880d681SAndroid Build Coastguard Worker} 389*9880d681SAndroid Build Coastguard Worker 390*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}lds_atomic_sub_noret_i32: 391*9880d681SAndroid Build Coastguard Worker; GCN: ds_sub_u32 392*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 393*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_sub_noret_i32(i32 addrspace(3)* %ptr) nounwind { 394*9880d681SAndroid Build Coastguard Worker %result = atomicrmw sub i32 addrspace(3)* %ptr, i32 4 seq_cst 395*9880d681SAndroid Build Coastguard Worker ret void 396*9880d681SAndroid Build Coastguard Worker} 397*9880d681SAndroid Build Coastguard Worker 398*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}lds_atomic_sub_noret_i32_offset: 399*9880d681SAndroid Build Coastguard Worker; GCN: ds_sub_u32 v{{[0-9]+}}, v{{[0-9]+}} offset:16 400*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 401*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_sub_noret_i32_offset(i32 addrspace(3)* %ptr) nounwind { 402*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i32, i32 addrspace(3)* %ptr, i32 4 403*9880d681SAndroid Build Coastguard Worker %result = atomicrmw sub i32 addrspace(3)* %gep, i32 4 seq_cst 404*9880d681SAndroid Build Coastguard Worker ret void 405*9880d681SAndroid Build Coastguard Worker} 406*9880d681SAndroid Build Coastguard Worker 407*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}lds_atomic_sub1_noret_i32: 408*9880d681SAndroid Build Coastguard Worker; GCN: v_mov_b32_e32 [[ONE:v[0-9]+]], 1{{$}} 409*9880d681SAndroid Build Coastguard Worker; GCN: ds_sub_u32 v{{[0-9]+}}, [[ONE]] 410*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 411*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_sub1_noret_i32(i32 addrspace(3)* %ptr) nounwind { 412*9880d681SAndroid Build Coastguard Worker %result = atomicrmw sub i32 addrspace(3)* %ptr, i32 1 seq_cst 413*9880d681SAndroid Build Coastguard Worker ret void 414*9880d681SAndroid Build Coastguard Worker} 415*9880d681SAndroid Build Coastguard Worker 416*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}lds_atomic_sub1_noret_i32_offset: 417*9880d681SAndroid Build Coastguard Worker; GCN: v_mov_b32_e32 [[ONE:v[0-9]+]], 1{{$}} 418*9880d681SAndroid Build Coastguard Worker; GCN: ds_sub_u32 v{{[0-9]+}}, [[ONE]] offset:16 419*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 420*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_sub1_noret_i32_offset(i32 addrspace(3)* %ptr) nounwind { 421*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i32, i32 addrspace(3)* %ptr, i32 4 422*9880d681SAndroid Build Coastguard Worker %result = atomicrmw sub i32 addrspace(3)* %gep, i32 1 seq_cst 423*9880d681SAndroid Build Coastguard Worker ret void 424*9880d681SAndroid Build Coastguard Worker} 425*9880d681SAndroid Build Coastguard Worker 426*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}lds_atomic_and_noret_i32: 427*9880d681SAndroid Build Coastguard Worker; GCN: ds_and_b32 428*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 429*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_and_noret_i32(i32 addrspace(3)* %ptr) nounwind { 430*9880d681SAndroid Build Coastguard Worker %result = atomicrmw and i32 addrspace(3)* %ptr, i32 4 seq_cst 431*9880d681SAndroid Build Coastguard Worker ret void 432*9880d681SAndroid Build Coastguard Worker} 433*9880d681SAndroid Build Coastguard Worker 434*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}lds_atomic_and_noret_i32_offset: 435*9880d681SAndroid Build Coastguard Worker; GCN: ds_and_b32 v{{[0-9]+}}, v{{[0-9]+}} offset:16 436*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 437*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_and_noret_i32_offset(i32 addrspace(3)* %ptr) nounwind { 438*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i32, i32 addrspace(3)* %ptr, i32 4 439*9880d681SAndroid Build Coastguard Worker %result = atomicrmw and i32 addrspace(3)* %gep, i32 4 seq_cst 440*9880d681SAndroid Build Coastguard Worker ret void 441*9880d681SAndroid Build Coastguard Worker} 442*9880d681SAndroid Build Coastguard Worker 443*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}lds_atomic_or_noret_i32: 444*9880d681SAndroid Build Coastguard Worker; GCN: ds_or_b32 445*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 446*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_or_noret_i32(i32 addrspace(3)* %ptr) nounwind { 447*9880d681SAndroid Build Coastguard Worker %result = atomicrmw or i32 addrspace(3)* %ptr, i32 4 seq_cst 448*9880d681SAndroid Build Coastguard Worker ret void 449*9880d681SAndroid Build Coastguard Worker} 450*9880d681SAndroid Build Coastguard Worker 451*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}lds_atomic_or_noret_i32_offset: 452*9880d681SAndroid Build Coastguard Worker; GCN: ds_or_b32 v{{[0-9]+}}, v{{[0-9]+}} offset:16 453*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 454*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_or_noret_i32_offset(i32 addrspace(3)* %ptr) nounwind { 455*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i32, i32 addrspace(3)* %ptr, i32 4 456*9880d681SAndroid Build Coastguard Worker %result = atomicrmw or i32 addrspace(3)* %gep, i32 4 seq_cst 457*9880d681SAndroid Build Coastguard Worker ret void 458*9880d681SAndroid Build Coastguard Worker} 459*9880d681SAndroid Build Coastguard Worker 460*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}lds_atomic_xor_noret_i32: 461*9880d681SAndroid Build Coastguard Worker; GCN: ds_xor_b32 462*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 463*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_xor_noret_i32(i32 addrspace(3)* %ptr) nounwind { 464*9880d681SAndroid Build Coastguard Worker %result = atomicrmw xor i32 addrspace(3)* %ptr, i32 4 seq_cst 465*9880d681SAndroid Build Coastguard Worker ret void 466*9880d681SAndroid Build Coastguard Worker} 467*9880d681SAndroid Build Coastguard Worker 468*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}lds_atomic_xor_noret_i32_offset: 469*9880d681SAndroid Build Coastguard Worker; GCN: ds_xor_b32 v{{[0-9]+}}, v{{[0-9]+}} offset:16 470*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 471*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_xor_noret_i32_offset(i32 addrspace(3)* %ptr) nounwind { 472*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i32, i32 addrspace(3)* %ptr, i32 4 473*9880d681SAndroid Build Coastguard Worker %result = atomicrmw xor i32 addrspace(3)* %gep, i32 4 seq_cst 474*9880d681SAndroid Build Coastguard Worker ret void 475*9880d681SAndroid Build Coastguard Worker} 476*9880d681SAndroid Build Coastguard Worker 477*9880d681SAndroid Build Coastguard Worker; FIXME: There is no atomic nand instr 478*9880d681SAndroid Build Coastguard Worker; XFUNC-LABEL: {{^}}lds_atomic_nand_noret_i32:uction, so we somehow need to expand this. 479*9880d681SAndroid Build Coastguard Worker; define void @lds_atomic_nand_noret_i32(i32 addrspace(3)* %ptr) nounwind { 480*9880d681SAndroid Build Coastguard Worker; %result = atomicrmw nand i32 addrspace(3)* %ptr, i32 4 seq_cst 481*9880d681SAndroid Build Coastguard Worker; ret void 482*9880d681SAndroid Build Coastguard Worker; } 483*9880d681SAndroid Build Coastguard Worker 484*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}lds_atomic_min_noret_i32: 485*9880d681SAndroid Build Coastguard Worker; GCN: ds_min_i32 486*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 487*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_min_noret_i32(i32 addrspace(3)* %ptr) nounwind { 488*9880d681SAndroid Build Coastguard Worker %result = atomicrmw min i32 addrspace(3)* %ptr, i32 4 seq_cst 489*9880d681SAndroid Build Coastguard Worker ret void 490*9880d681SAndroid Build Coastguard Worker} 491*9880d681SAndroid Build Coastguard Worker 492*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}lds_atomic_min_noret_i32_offset: 493*9880d681SAndroid Build Coastguard Worker; GCN: ds_min_i32 v{{[0-9]+}}, v{{[0-9]+}} offset:16 494*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 495*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_min_noret_i32_offset(i32 addrspace(3)* %ptr) nounwind { 496*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i32, i32 addrspace(3)* %ptr, i32 4 497*9880d681SAndroid Build Coastguard Worker %result = atomicrmw min i32 addrspace(3)* %gep, i32 4 seq_cst 498*9880d681SAndroid Build Coastguard Worker ret void 499*9880d681SAndroid Build Coastguard Worker} 500*9880d681SAndroid Build Coastguard Worker 501*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}lds_atomic_max_noret_i32: 502*9880d681SAndroid Build Coastguard Worker; GCN: ds_max_i32 503*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 504*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_max_noret_i32(i32 addrspace(3)* %ptr) nounwind { 505*9880d681SAndroid Build Coastguard Worker %result = atomicrmw max i32 addrspace(3)* %ptr, i32 4 seq_cst 506*9880d681SAndroid Build Coastguard Worker ret void 507*9880d681SAndroid Build Coastguard Worker} 508*9880d681SAndroid Build Coastguard Worker 509*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}lds_atomic_max_noret_i32_offset: 510*9880d681SAndroid Build Coastguard Worker; GCN: ds_max_i32 v{{[0-9]+}}, v{{[0-9]+}} offset:16 511*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 512*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_max_noret_i32_offset(i32 addrspace(3)* %ptr) nounwind { 513*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i32, i32 addrspace(3)* %ptr, i32 4 514*9880d681SAndroid Build Coastguard Worker %result = atomicrmw max i32 addrspace(3)* %gep, i32 4 seq_cst 515*9880d681SAndroid Build Coastguard Worker ret void 516*9880d681SAndroid Build Coastguard Worker} 517*9880d681SAndroid Build Coastguard Worker 518*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}lds_atomic_umin_noret_i32: 519*9880d681SAndroid Build Coastguard Worker; GCN: ds_min_u32 520*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 521*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_umin_noret_i32(i32 addrspace(3)* %ptr) nounwind { 522*9880d681SAndroid Build Coastguard Worker %result = atomicrmw umin i32 addrspace(3)* %ptr, i32 4 seq_cst 523*9880d681SAndroid Build Coastguard Worker ret void 524*9880d681SAndroid Build Coastguard Worker} 525*9880d681SAndroid Build Coastguard Worker 526*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}lds_atomic_umin_noret_i32_offset: 527*9880d681SAndroid Build Coastguard Worker; GCN: ds_min_u32 v{{[0-9]+}}, v{{[0-9]+}} offset:16 528*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 529*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_umin_noret_i32_offset(i32 addrspace(3)* %ptr) nounwind { 530*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i32, i32 addrspace(3)* %ptr, i32 4 531*9880d681SAndroid Build Coastguard Worker %result = atomicrmw umin i32 addrspace(3)* %gep, i32 4 seq_cst 532*9880d681SAndroid Build Coastguard Worker ret void 533*9880d681SAndroid Build Coastguard Worker} 534*9880d681SAndroid Build Coastguard Worker 535*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}lds_atomic_umax_noret_i32: 536*9880d681SAndroid Build Coastguard Worker; GCN: ds_max_u32 537*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 538*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_umax_noret_i32(i32 addrspace(3)* %ptr) nounwind { 539*9880d681SAndroid Build Coastguard Worker %result = atomicrmw umax i32 addrspace(3)* %ptr, i32 4 seq_cst 540*9880d681SAndroid Build Coastguard Worker ret void 541*9880d681SAndroid Build Coastguard Worker} 542*9880d681SAndroid Build Coastguard Worker 543*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}lds_atomic_umax_noret_i32_offset: 544*9880d681SAndroid Build Coastguard Worker; GCN: ds_max_u32 v{{[0-9]+}}, v{{[0-9]+}} offset:16 545*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 546*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_umax_noret_i32_offset(i32 addrspace(3)* %ptr) nounwind { 547*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i32, i32 addrspace(3)* %ptr, i32 4 548*9880d681SAndroid Build Coastguard Worker %result = atomicrmw umax i32 addrspace(3)* %gep, i32 4 seq_cst 549*9880d681SAndroid Build Coastguard Worker ret void 550*9880d681SAndroid Build Coastguard Worker} 551