1; RUN: llc -march=r600 -mcpu=SI -verify-machineinstrs < %s | FileCheck -check-prefix=SI %s 2 3; FUNC-LABEL: @lds_atomic_xchg_ret_i64: 4; SI: DS_WRXCHG_RTN_B64 5; SI: S_ENDPGM 6define void @lds_atomic_xchg_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind { 7 %result = atomicrmw xchg i64 addrspace(3)* %ptr, i64 4 seq_cst 8 store i64 %result, i64 addrspace(1)* %out, align 8 9 ret void 10} 11 12; FUNC-LABEL: @lds_atomic_xchg_ret_i64_offset: 13; SI: DS_WRXCHG_RTN_B64 {{.*}} 0x20 14; SI: S_ENDPGM 15define void @lds_atomic_xchg_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind { 16 %gep = getelementptr i64 addrspace(3)* %ptr, i32 4 17 %result = atomicrmw xchg i64 addrspace(3)* %gep, i64 4 seq_cst 18 store i64 %result, i64 addrspace(1)* %out, align 8 19 ret void 20} 21 22; FUNC-LABEL: @lds_atomic_add_ret_i64: 23; SI: DS_ADD_RTN_U64 24; SI: S_ENDPGM 25define void @lds_atomic_add_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind { 26 %result = atomicrmw add i64 addrspace(3)* %ptr, i64 4 seq_cst 27 store i64 %result, i64 addrspace(1)* %out, align 8 28 ret void 29} 30 31; FUNC-LABEL: @lds_atomic_add_ret_i64_offset: 32; SI: S_LOAD_DWORD [[PTR:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0xb 33; SI: S_MOV_B64 s{{\[}}[[LOSDATA:[0-9]+]]:[[HISDATA:[0-9]+]]{{\]}}, 9 34; SI-DAG: V_MOV_B32_e32 v[[LOVDATA:[0-9]+]], s[[LOSDATA]] 35; SI-DAG: V_MOV_B32_e32 v[[HIVDATA:[0-9]+]], s[[HISDATA]] 36; SI-DAG: V_MOV_B32_e32 [[VPTR:v[0-9]+]], [[PTR]] 37; SI: DS_ADD_RTN_U64 [[RESULT:v\[[0-9]+:[0-9]+\]]], [[VPTR]], v{{\[}}[[LOVDATA]]:[[HIVDATA]]{{\]}}, 0x20, [M0] 38; SI: BUFFER_STORE_DWORDX2 [[RESULT]], 39; SI: S_ENDPGM 40define void @lds_atomic_add_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind { 41 %gep = getelementptr i64 addrspace(3)* %ptr, i64 4 42 %result = atomicrmw add i64 addrspace(3)* %gep, i64 9 seq_cst 43 store i64 %result, i64 addrspace(1)* %out, align 8 44 ret void 45} 46 47; FUNC-LABEL: @lds_atomic_inc_ret_i64: 48; SI: S_MOV_B64 s{{\[}}[[LOSDATA:[0-9]+]]:[[HISDATA:[0-9]+]]{{\]}}, -1 49; SI-DAG: V_MOV_B32_e32 v[[LOVDATA:[0-9]+]], s[[LOSDATA]] 50; SI-DAG: V_MOV_B32_e32 v[[HIVDATA:[0-9]+]], s[[HISDATA]] 51; SI: DS_INC_RTN_U64 [[RESULT:v\[[0-9]+:[0-9]+\]]], [[VPTR]], v{{\[}}[[LOVDATA]]:[[HIVDATA]]{{\]}}, 52; SI: BUFFER_STORE_DWORDX2 [[RESULT]], 53; SI: S_ENDPGM 54define void @lds_atomic_inc_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind { 55 %result = atomicrmw add i64 addrspace(3)* %ptr, i64 1 seq_cst 56 store i64 %result, i64 addrspace(1)* %out, align 8 57 ret void 58} 59 60; FUNC-LABEL: @lds_atomic_inc_ret_i64_offset: 61; SI: DS_INC_RTN_U64 {{.*}} 0x20 62; SI: S_ENDPGM 63define void @lds_atomic_inc_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind { 64 %gep = getelementptr i64 addrspace(3)* %ptr, i32 4 65 %result = atomicrmw add i64 addrspace(3)* %gep, i64 1 seq_cst 66 store i64 %result, i64 addrspace(1)* %out, align 8 67 ret void 68} 69 70; FUNC-LABEL: @lds_atomic_sub_ret_i64: 71; SI: DS_SUB_RTN_U64 72; SI: S_ENDPGM 73define void @lds_atomic_sub_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind { 74 %result = atomicrmw sub i64 addrspace(3)* %ptr, i64 4 seq_cst 75 store i64 %result, i64 addrspace(1)* %out, align 8 76 ret void 77} 78 79; FUNC-LABEL: @lds_atomic_sub_ret_i64_offset: 80; SI: DS_SUB_RTN_U64 {{.*}} 0x20 81; SI: S_ENDPGM 82define void @lds_atomic_sub_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind { 83 %gep = getelementptr i64 addrspace(3)* %ptr, i32 4 84 %result = atomicrmw sub i64 addrspace(3)* %gep, i64 4 seq_cst 85 store i64 %result, i64 addrspace(1)* %out, align 8 86 ret void 87} 88 89; FUNC-LABEL: @lds_atomic_dec_ret_i64: 90; SI: S_MOV_B64 s{{\[}}[[LOSDATA:[0-9]+]]:[[HISDATA:[0-9]+]]{{\]}}, -1 91; SI-DAG: V_MOV_B32_e32 v[[LOVDATA:[0-9]+]], s[[LOSDATA]] 92; SI-DAG: V_MOV_B32_e32 v[[HIVDATA:[0-9]+]], s[[HISDATA]] 93; SI: DS_DEC_RTN_U64 [[RESULT:v\[[0-9]+:[0-9]+\]]], [[VPTR]], v{{\[}}[[LOVDATA]]:[[HIVDATA]]{{\]}}, 94; SI: BUFFER_STORE_DWORDX2 [[RESULT]], 95; SI: S_ENDPGM 96define void @lds_atomic_dec_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind { 97 %result = atomicrmw sub i64 addrspace(3)* %ptr, i64 1 seq_cst 98 store i64 %result, i64 addrspace(1)* %out, align 8 99 ret void 100} 101 102; FUNC-LABEL: @lds_atomic_dec_ret_i64_offset: 103; SI: DS_DEC_RTN_U64 {{.*}} 0x20 104; SI: S_ENDPGM 105define void @lds_atomic_dec_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind { 106 %gep = getelementptr i64 addrspace(3)* %ptr, i32 4 107 %result = atomicrmw sub i64 addrspace(3)* %gep, i64 1 seq_cst 108 store i64 %result, i64 addrspace(1)* %out, align 8 109 ret void 110} 111 112; FUNC-LABEL: @lds_atomic_and_ret_i64: 113; SI: DS_AND_RTN_B64 114; SI: S_ENDPGM 115define void @lds_atomic_and_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind { 116 %result = atomicrmw and i64 addrspace(3)* %ptr, i64 4 seq_cst 117 store i64 %result, i64 addrspace(1)* %out, align 8 118 ret void 119} 120 121; FUNC-LABEL: @lds_atomic_and_ret_i64_offset: 122; SI: DS_AND_RTN_B64 {{.*}} 0x20 123; SI: S_ENDPGM 124define void @lds_atomic_and_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind { 125 %gep = getelementptr i64 addrspace(3)* %ptr, i32 4 126 %result = atomicrmw and i64 addrspace(3)* %gep, i64 4 seq_cst 127 store i64 %result, i64 addrspace(1)* %out, align 8 128 ret void 129} 130 131; FUNC-LABEL: @lds_atomic_or_ret_i64: 132; SI: DS_OR_RTN_B64 133; SI: S_ENDPGM 134define void @lds_atomic_or_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind { 135 %result = atomicrmw or i64 addrspace(3)* %ptr, i64 4 seq_cst 136 store i64 %result, i64 addrspace(1)* %out, align 8 137 ret void 138} 139 140; FUNC-LABEL: @lds_atomic_or_ret_i64_offset: 141; SI: DS_OR_RTN_B64 {{.*}} 0x20 142; SI: S_ENDPGM 143define void @lds_atomic_or_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind { 144 %gep = getelementptr i64 addrspace(3)* %ptr, i32 4 145 %result = atomicrmw or i64 addrspace(3)* %gep, i64 4 seq_cst 146 store i64 %result, i64 addrspace(1)* %out, align 8 147 ret void 148} 149 150; FUNC-LABEL: @lds_atomic_xor_ret_i64: 151; SI: DS_XOR_RTN_B64 152; SI: S_ENDPGM 153define void @lds_atomic_xor_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind { 154 %result = atomicrmw xor i64 addrspace(3)* %ptr, i64 4 seq_cst 155 store i64 %result, i64 addrspace(1)* %out, align 8 156 ret void 157} 158 159; FUNC-LABEL: @lds_atomic_xor_ret_i64_offset: 160; SI: DS_XOR_RTN_B64 {{.*}} 0x20 161; SI: S_ENDPGM 162define void @lds_atomic_xor_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind { 163 %gep = getelementptr i64 addrspace(3)* %ptr, i32 4 164 %result = atomicrmw xor i64 addrspace(3)* %gep, i64 4 seq_cst 165 store i64 %result, i64 addrspace(1)* %out, align 8 166 ret void 167} 168 169; FIXME: There is no atomic nand instr 170; XFUNC-LABEL: @lds_atomic_nand_ret_i64:uction, so we somehow need to expand this. 171; define void @lds_atomic_nand_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind { 172; %result = atomicrmw nand i64 addrspace(3)* %ptr, i32 4 seq_cst 173; store i64 %result, i64 addrspace(1)* %out, align 8 174; ret void 175; } 176 177; FUNC-LABEL: @lds_atomic_min_ret_i64: 178; SI: DS_MIN_RTN_I64 179; SI: S_ENDPGM 180define void @lds_atomic_min_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind { 181 %result = atomicrmw min i64 addrspace(3)* %ptr, i64 4 seq_cst 182 store i64 %result, i64 addrspace(1)* %out, align 8 183 ret void 184} 185 186; FUNC-LABEL: @lds_atomic_min_ret_i64_offset: 187; SI: DS_MIN_RTN_I64 {{.*}} 0x20 188; SI: S_ENDPGM 189define void @lds_atomic_min_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind { 190 %gep = getelementptr i64 addrspace(3)* %ptr, i32 4 191 %result = atomicrmw min i64 addrspace(3)* %gep, i64 4 seq_cst 192 store i64 %result, i64 addrspace(1)* %out, align 8 193 ret void 194} 195 196; FUNC-LABEL: @lds_atomic_max_ret_i64: 197; SI: DS_MAX_RTN_I64 198; SI: S_ENDPGM 199define void @lds_atomic_max_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind { 200 %result = atomicrmw max i64 addrspace(3)* %ptr, i64 4 seq_cst 201 store i64 %result, i64 addrspace(1)* %out, align 8 202 ret void 203} 204 205; FUNC-LABEL: @lds_atomic_max_ret_i64_offset: 206; SI: DS_MAX_RTN_I64 {{.*}} 0x20 207; SI: S_ENDPGM 208define void @lds_atomic_max_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind { 209 %gep = getelementptr i64 addrspace(3)* %ptr, i32 4 210 %result = atomicrmw max i64 addrspace(3)* %gep, i64 4 seq_cst 211 store i64 %result, i64 addrspace(1)* %out, align 8 212 ret void 213} 214 215; FUNC-LABEL: @lds_atomic_umin_ret_i64: 216; SI: DS_MIN_RTN_U64 217; SI: S_ENDPGM 218define void @lds_atomic_umin_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind { 219 %result = atomicrmw umin i64 addrspace(3)* %ptr, i64 4 seq_cst 220 store i64 %result, i64 addrspace(1)* %out, align 8 221 ret void 222} 223 224; FUNC-LABEL: @lds_atomic_umin_ret_i64_offset: 225; SI: DS_MIN_RTN_U64 {{.*}} 0x20 226; SI: S_ENDPGM 227define void @lds_atomic_umin_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind { 228 %gep = getelementptr i64 addrspace(3)* %ptr, i32 4 229 %result = atomicrmw umin i64 addrspace(3)* %gep, i64 4 seq_cst 230 store i64 %result, i64 addrspace(1)* %out, align 8 231 ret void 232} 233 234; FUNC-LABEL: @lds_atomic_umax_ret_i64: 235; SI: DS_MAX_RTN_U64 236; SI: S_ENDPGM 237define void @lds_atomic_umax_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind { 238 %result = atomicrmw umax i64 addrspace(3)* %ptr, i64 4 seq_cst 239 store i64 %result, i64 addrspace(1)* %out, align 8 240 ret void 241} 242 243; FUNC-LABEL: @lds_atomic_umax_ret_i64_offset: 244; SI: DS_MAX_RTN_U64 {{.*}} 0x20 245; SI: S_ENDPGM 246define void @lds_atomic_umax_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) nounwind { 247 %gep = getelementptr i64 addrspace(3)* %ptr, i32 4 248 %result = atomicrmw umax i64 addrspace(3)* %gep, i64 4 seq_cst 249 store i64 %result, i64 addrspace(1)* %out, align 8 250 ret void 251} 252