1089 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc -mtriple=amdgcn -mcpu=gfx90a < %s | FileCheck %s3 4;---------------------------------------------------------------------5; i32 cases6;---------------------------------------------------------------------7 8define void @flat_atomic_cmpxchg_i32_ret_av_av__av(ptr %ptr) #0 {9; CHECK-LABEL: flat_atomic_cmpxchg_i32_ret_av_av__av:10; CHECK: ; %bb.0:11; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)12; CHECK-NEXT: ;;#ASMSTART13; CHECK-NEXT: ; def v314; CHECK-NEXT: ;;#ASMEND15; CHECK-NEXT: ;;#ASMSTART16; CHECK-NEXT: ; def v217; CHECK-NEXT: ;;#ASMEND18; CHECK-NEXT: buffer_wbl219; CHECK-NEXT: flat_atomic_cmpswap v0, v[0:1], v[2:3] offset:40 glc20; CHECK-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)21; CHECK-NEXT: buffer_invl222; CHECK-NEXT: buffer_wbinvl1_vol23; CHECK-NEXT: ;;#ASMSTART24; CHECK-NEXT: ; use v025; CHECK-NEXT: ;;#ASMEND26; CHECK-NEXT: s_setpc_b64 s[30:31]27 %gep.0 = getelementptr inbounds [512 x i32], ptr %ptr, i32 0, i32 1028 %data0 = call i32 asm "; def $0", "=^VA"()29 %data1 = call i32 asm "; def $0", "=^VA"()30 %pair = cmpxchg ptr %gep.0, i32 %data0, i32 %data1 seq_cst monotonic31 %result = extractvalue { i32, i1 } %pair, 032 call void asm "; use $0", "^VA"(i32 %result)33 ret void34}35 36define void @flat_atomic_cmpxchg_i32_ret_av_av__v(ptr %ptr) #0 {37; CHECK-LABEL: flat_atomic_cmpxchg_i32_ret_av_av__v:38; CHECK: ; %bb.0:39; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)40; CHECK-NEXT: ;;#ASMSTART41; CHECK-NEXT: ; def v342; CHECK-NEXT: ;;#ASMEND43; CHECK-NEXT: ;;#ASMSTART44; CHECK-NEXT: ; def v245; CHECK-NEXT: ;;#ASMEND46; CHECK-NEXT: buffer_wbl247; CHECK-NEXT: flat_atomic_cmpswap v0, v[0:1], v[2:3] offset:40 glc48; CHECK-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)49; CHECK-NEXT: buffer_invl250; CHECK-NEXT: buffer_wbinvl1_vol51; CHECK-NEXT: ;;#ASMSTART52; CHECK-NEXT: ; use v053; CHECK-NEXT: ;;#ASMEND54; CHECK-NEXT: s_setpc_b64 s[30:31]55 %gep.0 = getelementptr inbounds [512 x i32], ptr %ptr, i32 0, i32 1056 %data0 = call i32 asm "; def $0", "=^VA"()57 %data1 = call i32 asm "; def $0", "=^VA"()58 %pair = cmpxchg ptr %gep.0, i32 %data0, i32 %data1 seq_cst monotonic59 %result = extractvalue { i32, i1 } %pair, 060 call void asm "; use $0", "v"(i32 %result)61 ret void62}63 64define void @flat_atomic_cmpxchg_i32_ret_av_av__a(ptr %ptr) #0 {65; CHECK-LABEL: flat_atomic_cmpxchg_i32_ret_av_av__a:66; CHECK: ; %bb.0:67; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)68; CHECK-NEXT: ;;#ASMSTART69; CHECK-NEXT: ; def v370; CHECK-NEXT: ;;#ASMEND71; CHECK-NEXT: ;;#ASMSTART72; CHECK-NEXT: ; def v273; CHECK-NEXT: ;;#ASMEND74; CHECK-NEXT: buffer_wbl275; CHECK-NEXT: flat_atomic_cmpswap v0, v[0:1], v[2:3] offset:40 glc76; CHECK-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)77; CHECK-NEXT: buffer_invl278; CHECK-NEXT: buffer_wbinvl1_vol79; CHECK-NEXT: v_accvgpr_write_b32 a0, v080; CHECK-NEXT: ;;#ASMSTART81; CHECK-NEXT: ; use a082; CHECK-NEXT: ;;#ASMEND83; CHECK-NEXT: s_setpc_b64 s[30:31]84 %gep.0 = getelementptr inbounds [512 x i32], ptr %ptr, i32 0, i32 1085 %data0 = call i32 asm "; def $0", "=^VA"()86 %data1 = call i32 asm "; def $0", "=^VA"()87 %pair = cmpxchg ptr %gep.0, i32 %data0, i32 %data1 seq_cst monotonic88 %result = extractvalue { i32, i1 } %pair, 089 call void asm "; use $0", "a"(i32 %result)90 ret void91}92 93define void @flat_atomic_cmpxchg_i32_ret_a_a__a(ptr %ptr) #0 {94; CHECK-LABEL: flat_atomic_cmpxchg_i32_ret_a_a__a:95; CHECK: ; %bb.0:96; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)97; CHECK-NEXT: ;;#ASMSTART98; CHECK-NEXT: ; def a199; CHECK-NEXT: ;;#ASMEND100; CHECK-NEXT: ;;#ASMSTART101; CHECK-NEXT: ; def a0102; CHECK-NEXT: ;;#ASMEND103; CHECK-NEXT: v_accvgpr_read_b32 v3, a1104; CHECK-NEXT: v_accvgpr_read_b32 v2, a0105; CHECK-NEXT: buffer_wbl2106; CHECK-NEXT: flat_atomic_cmpswap v0, v[0:1], v[2:3] offset:40 glc107; CHECK-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)108; CHECK-NEXT: buffer_invl2109; CHECK-NEXT: buffer_wbinvl1_vol110; CHECK-NEXT: v_accvgpr_write_b32 a0, v0111; CHECK-NEXT: ;;#ASMSTART112; CHECK-NEXT: ; use a0113; CHECK-NEXT: ;;#ASMEND114; CHECK-NEXT: s_setpc_b64 s[30:31]115 %gep.0 = getelementptr inbounds [512 x i32], ptr %ptr, i32 0, i32 10116 %data0 = call i32 asm "; def $0", "=a"()117 %data1 = call i32 asm "; def $0", "=a"()118 %pair = cmpxchg ptr %gep.0, i32 %data0, i32 %data1 seq_cst monotonic119 %result = extractvalue { i32, i1 } %pair, 0120 call void asm "; use $0", "a"(i32 %result)121 ret void122}123 124define void @flat_atomic_cmpxchg_i32_ret_a_a__v(ptr %ptr) #0 {125; CHECK-LABEL: flat_atomic_cmpxchg_i32_ret_a_a__v:126; CHECK: ; %bb.0:127; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)128; CHECK-NEXT: ;;#ASMSTART129; CHECK-NEXT: ; def a1130; CHECK-NEXT: ;;#ASMEND131; CHECK-NEXT: ;;#ASMSTART132; CHECK-NEXT: ; def a0133; CHECK-NEXT: ;;#ASMEND134; CHECK-NEXT: v_accvgpr_read_b32 v3, a1135; CHECK-NEXT: v_accvgpr_read_b32 v2, a0136; CHECK-NEXT: buffer_wbl2137; CHECK-NEXT: flat_atomic_cmpswap v0, v[0:1], v[2:3] offset:40 glc138; CHECK-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)139; CHECK-NEXT: buffer_invl2140; CHECK-NEXT: buffer_wbinvl1_vol141; CHECK-NEXT: ;;#ASMSTART142; CHECK-NEXT: ; use v0143; CHECK-NEXT: ;;#ASMEND144; CHECK-NEXT: s_setpc_b64 s[30:31]145 %gep.0 = getelementptr inbounds [512 x i32], ptr %ptr, i32 0, i32 10146 %data0 = call i32 asm "; def $0", "=a"()147 %data1 = call i32 asm "; def $0", "=a"()148 %pair = cmpxchg ptr %gep.0, i32 %data0, i32 %data1 seq_cst monotonic149 %result = extractvalue { i32, i1 } %pair, 0150 call void asm "; use $0", "v"(i32 %result)151 ret void152}153 154define void @flat_atomic_cmpxchg_i32_ret_v_a__v(ptr %ptr) #0 {155; CHECK-LABEL: flat_atomic_cmpxchg_i32_ret_v_a__v:156; CHECK: ; %bb.0:157; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)158; CHECK-NEXT: ;;#ASMSTART159; CHECK-NEXT: ; def v2160; CHECK-NEXT: ;;#ASMEND161; CHECK-NEXT: v_accvgpr_write_b32 a1, v2162; CHECK-NEXT: ;;#ASMSTART163; CHECK-NEXT: ; def a0164; CHECK-NEXT: ;;#ASMEND165; CHECK-NEXT: v_accvgpr_read_b32 v3, a1166; CHECK-NEXT: v_accvgpr_read_b32 v2, a0167; CHECK-NEXT: buffer_wbl2168; CHECK-NEXT: flat_atomic_cmpswap v0, v[0:1], v[2:3] offset:40 glc169; CHECK-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)170; CHECK-NEXT: buffer_invl2171; CHECK-NEXT: buffer_wbinvl1_vol172; CHECK-NEXT: ;;#ASMSTART173; CHECK-NEXT: ; use v0174; CHECK-NEXT: ;;#ASMEND175; CHECK-NEXT: s_setpc_b64 s[30:31]176 %gep.0 = getelementptr inbounds [512 x i32], ptr %ptr, i32 0, i32 10177 %data0 = call i32 asm "; def $0", "=v"()178 %data1 = call i32 asm "; def $0", "=a"()179 %pair = cmpxchg ptr %gep.0, i32 %data0, i32 %data1 seq_cst monotonic180 %result = extractvalue { i32, i1 } %pair, 0181 call void asm "; use $0", "v"(i32 %result)182 ret void183}184 185define void @flat_atomic_cmpxchg_i32_ret_a_v__v(ptr %ptr) #0 {186; CHECK-LABEL: flat_atomic_cmpxchg_i32_ret_a_v__v:187; CHECK: ; %bb.0:188; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)189; CHECK-NEXT: ;;#ASMSTART190; CHECK-NEXT: ; def a0191; CHECK-NEXT: ;;#ASMEND192; CHECK-NEXT: v_accvgpr_read_b32 v3, a0193; CHECK-NEXT: ;;#ASMSTART194; CHECK-NEXT: ; def v2195; CHECK-NEXT: ;;#ASMEND196; CHECK-NEXT: buffer_wbl2197; CHECK-NEXT: flat_atomic_cmpswap v0, v[0:1], v[2:3] offset:40 glc198; CHECK-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)199; CHECK-NEXT: buffer_invl2200; CHECK-NEXT: buffer_wbinvl1_vol201; CHECK-NEXT: ;;#ASMSTART202; CHECK-NEXT: ; use v0203; CHECK-NEXT: ;;#ASMEND204; CHECK-NEXT: s_setpc_b64 s[30:31]205 %gep.0 = getelementptr inbounds [512 x i32], ptr %ptr, i32 0, i32 10206 %data0 = call i32 asm "; def $0", "=a"()207 %data1 = call i32 asm "; def $0", "=v"()208 %pair = cmpxchg ptr %gep.0, i32 %data0, i32 %data1 seq_cst monotonic209 %result = extractvalue { i32, i1 } %pair, 0210 call void asm "; use $0", "v"(i32 %result)211 ret void212}213 214define void @flat_atomic_cmpxchg_i32_ret_v_v__a(ptr %ptr) #0 {215; CHECK-LABEL: flat_atomic_cmpxchg_i32_ret_v_v__a:216; CHECK: ; %bb.0:217; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)218; CHECK-NEXT: ;;#ASMSTART219; CHECK-NEXT: ; def v3220; CHECK-NEXT: ;;#ASMEND221; CHECK-NEXT: ;;#ASMSTART222; CHECK-NEXT: ; def v2223; CHECK-NEXT: ;;#ASMEND224; CHECK-NEXT: buffer_wbl2225; CHECK-NEXT: flat_atomic_cmpswap v0, v[0:1], v[2:3] offset:40 glc226; CHECK-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)227; CHECK-NEXT: buffer_invl2228; CHECK-NEXT: buffer_wbinvl1_vol229; CHECK-NEXT: v_accvgpr_write_b32 a0, v0230; CHECK-NEXT: ;;#ASMSTART231; CHECK-NEXT: ; use a0232; CHECK-NEXT: ;;#ASMEND233; CHECK-NEXT: s_setpc_b64 s[30:31]234 %gep.0 = getelementptr inbounds [512 x i32], ptr %ptr, i32 0, i32 10235 %data0 = call i32 asm "; def $0", "=v"()236 %data1 = call i32 asm "; def $0", "=v"()237 %pair = cmpxchg ptr %gep.0, i32 %data0, i32 %data1 seq_cst monotonic238 %result = extractvalue { i32, i1 } %pair, 0239 call void asm "; use $0", "a"(i32 %result)240 ret void241}242 243define void @flat_atomic_cmpxchg_i32_ret_av_v__av(ptr %ptr) #0 {244; CHECK-LABEL: flat_atomic_cmpxchg_i32_ret_av_v__av:245; CHECK: ; %bb.0:246; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)247; CHECK-NEXT: ;;#ASMSTART248; CHECK-NEXT: ; def v3249; CHECK-NEXT: ;;#ASMEND250; CHECK-NEXT: ;;#ASMSTART251; CHECK-NEXT: ; def v2252; CHECK-NEXT: ;;#ASMEND253; CHECK-NEXT: buffer_wbl2254; CHECK-NEXT: flat_atomic_cmpswap v0, v[0:1], v[2:3] offset:40 glc255; CHECK-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)256; CHECK-NEXT: buffer_invl2257; CHECK-NEXT: buffer_wbinvl1_vol258; CHECK-NEXT: ;;#ASMSTART259; CHECK-NEXT: ; use v0260; CHECK-NEXT: ;;#ASMEND261; CHECK-NEXT: s_setpc_b64 s[30:31]262 %gep.0 = getelementptr inbounds [512 x i32], ptr %ptr, i32 0, i32 10263 %data0 = call i32 asm "; def $0", "=^VA"()264 %data1 = call i32 asm "; def $0", "=v"()265 %pair = cmpxchg ptr %gep.0, i32 %data0, i32 %data1 seq_cst monotonic266 %result = extractvalue { i32, i1 } %pair, 0267 call void asm "; use $0", "^VA"(i32 %result)268 ret void269}270 271define void @flat_atomic_cmpxchg_i32_ret_v_av__av(ptr %ptr) #0 {272; CHECK-LABEL: flat_atomic_cmpxchg_i32_ret_v_av__av:273; CHECK: ; %bb.0:274; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)275; CHECK-NEXT: ;;#ASMSTART276; CHECK-NEXT: ; def v3277; CHECK-NEXT: ;;#ASMEND278; CHECK-NEXT: ;;#ASMSTART279; CHECK-NEXT: ; def v2280; CHECK-NEXT: ;;#ASMEND281; CHECK-NEXT: buffer_wbl2282; CHECK-NEXT: flat_atomic_cmpswap v0, v[0:1], v[2:3] offset:40 glc283; CHECK-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)284; CHECK-NEXT: buffer_invl2285; CHECK-NEXT: buffer_wbinvl1_vol286; CHECK-NEXT: ;;#ASMSTART287; CHECK-NEXT: ; use v0288; CHECK-NEXT: ;;#ASMEND289; CHECK-NEXT: s_setpc_b64 s[30:31]290 %gep.0 = getelementptr inbounds [512 x i32], ptr %ptr, i32 0, i32 10291 %data0 = call i32 asm "; def $0", "=v"()292 %data1 = call i32 asm "; def $0", "=^VA"()293 %pair = cmpxchg ptr %gep.0, i32 %data0, i32 %data1 seq_cst monotonic294 %result = extractvalue { i32, i1 } %pair, 0295 call void asm "; use $0", "^VA"(i32 %result)296 ret void297}298 299define void @flat_atomic_cmpxchg_i32_ret_av_a__av(ptr %ptr) #0 {300; CHECK-LABEL: flat_atomic_cmpxchg_i32_ret_av_a__av:301; CHECK: ; %bb.0:302; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)303; CHECK-NEXT: ;;#ASMSTART304; CHECK-NEXT: ; def a1305; CHECK-NEXT: ;;#ASMEND306; CHECK-NEXT: ;;#ASMSTART307; CHECK-NEXT: ; def a0308; CHECK-NEXT: ;;#ASMEND309; CHECK-NEXT: v_accvgpr_read_b32 v3, a1310; CHECK-NEXT: v_accvgpr_read_b32 v2, a0311; CHECK-NEXT: buffer_wbl2312; CHECK-NEXT: flat_atomic_cmpswap v0, v[0:1], v[2:3] offset:40 glc313; CHECK-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)314; CHECK-NEXT: buffer_invl2315; CHECK-NEXT: buffer_wbinvl1_vol316; CHECK-NEXT: ;;#ASMSTART317; CHECK-NEXT: ; use v0318; CHECK-NEXT: ;;#ASMEND319; CHECK-NEXT: s_setpc_b64 s[30:31]320 %gep.0 = getelementptr inbounds [512 x i32], ptr %ptr, i32 0, i32 10321 %data0 = call i32 asm "; def $0", "=^VA"()322 %data1 = call i32 asm "; def $0", "=a"()323 %pair = cmpxchg ptr %gep.0, i32 %data0, i32 %data1 seq_cst monotonic324 %result = extractvalue { i32, i1 } %pair, 0325 call void asm "; use $0", "^VA"(i32 %result)326 ret void327}328 329define void @flat_atomic_cmpxchg_i32_ret_a_av__av(ptr %ptr) #0 {330; CHECK-LABEL: flat_atomic_cmpxchg_i32_ret_a_av__av:331; CHECK: ; %bb.0:332; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)333; CHECK-NEXT: ;;#ASMSTART334; CHECK-NEXT: ; def a1335; CHECK-NEXT: ;;#ASMEND336; CHECK-NEXT: ;;#ASMSTART337; CHECK-NEXT: ; def a0338; CHECK-NEXT: ;;#ASMEND339; CHECK-NEXT: v_accvgpr_read_b32 v3, a1340; CHECK-NEXT: v_accvgpr_read_b32 v2, a0341; CHECK-NEXT: buffer_wbl2342; CHECK-NEXT: flat_atomic_cmpswap v0, v[0:1], v[2:3] offset:40 glc343; CHECK-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)344; CHECK-NEXT: buffer_invl2345; CHECK-NEXT: buffer_wbinvl1_vol346; CHECK-NEXT: ;;#ASMSTART347; CHECK-NEXT: ; use v0348; CHECK-NEXT: ;;#ASMEND349; CHECK-NEXT: s_setpc_b64 s[30:31]350 %gep.0 = getelementptr inbounds [512 x i32], ptr %ptr, i32 0, i32 10351 %data0 = call i32 asm "; def $0", "=a"()352 %data1 = call i32 asm "; def $0", "=^VA"()353 %pair = cmpxchg ptr %gep.0, i32 %data0, i32 %data1 seq_cst monotonic354 %result = extractvalue { i32, i1 } %pair, 0355 call void asm "; use $0", "^VA"(i32 %result)356 ret void357}358 359;---------------------------------------------------------------------360; i64 cases361;---------------------------------------------------------------------362 363define void @flat_atomic_cmpxchg_i64_ret_av_av__av(ptr %ptr) #0 {364; CHECK-LABEL: flat_atomic_cmpxchg_i64_ret_av_av__av:365; CHECK: ; %bb.0:366; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)367; CHECK-NEXT: v_add_co_u32_e32 v6, vcc, 0x50, v0368; CHECK-NEXT: s_mov_b64 s[4:5], src_private_base369; CHECK-NEXT: v_addc_co_u32_e32 v7, vcc, 0, v1, vcc370; CHECK-NEXT: v_cmp_ne_u32_e32 vcc, s5, v7371; CHECK-NEXT: ;;#ASMSTART372; CHECK-NEXT: ; def v[2:3]373; CHECK-NEXT: ;;#ASMEND374; CHECK-NEXT: ;;#ASMSTART375; CHECK-NEXT: ; def v[0:1]376; CHECK-NEXT: ;;#ASMEND377; CHECK-NEXT: ; implicit-def: $vgpr4_vgpr5378; CHECK-NEXT: s_and_saveexec_b64 s[4:5], vcc379; CHECK-NEXT: s_xor_b64 s[4:5], exec, s[4:5]380; CHECK-NEXT: s_cbranch_execz .LBB12_2381; CHECK-NEXT: ; %bb.1: ; %atomicrmw.global382; CHECK-NEXT: buffer_wbl2383; CHECK-NEXT: flat_atomic_cmpswap_x2 v[4:5], v[6:7], v[0:3] glc384; CHECK-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)385; CHECK-NEXT: buffer_invl2386; CHECK-NEXT: buffer_wbinvl1_vol387; CHECK-NEXT: ; implicit-def: $vgpr6_vgpr7388; CHECK-NEXT: ; implicit-def: $vgpr2_vgpr3389; CHECK-NEXT: .LBB12_2: ; %Flow390; CHECK-NEXT: s_andn2_saveexec_b64 s[4:5], s[4:5]391; CHECK-NEXT: s_cbranch_execz .LBB12_4392; CHECK-NEXT: ; %bb.3: ; %atomicrmw.private393; CHECK-NEXT: v_cmp_ne_u64_e32 vcc, 0, v[6:7]394; CHECK-NEXT: v_cndmask_b32_e32 v6, -1, v6, vcc395; CHECK-NEXT: buffer_load_dword v4, v6, s[0:3], 0 offen396; CHECK-NEXT: buffer_load_dword v5, v6, s[0:3], 0 offen offset:4397; CHECK-NEXT: s_waitcnt vmcnt(0)398; CHECK-NEXT: v_cmp_eq_u64_e32 vcc, v[4:5], v[2:3]399; CHECK-NEXT: v_cndmask_b32_e32 v0, v4, v0, vcc400; CHECK-NEXT: v_cndmask_b32_e32 v1, v5, v1, vcc401; CHECK-NEXT: buffer_store_dword v0, v6, s[0:3], 0 offen402; CHECK-NEXT: buffer_store_dword v1, v6, s[0:3], 0 offen offset:4403; CHECK-NEXT: .LBB12_4: ; %atomicrmw.phi404; CHECK-NEXT: s_or_b64 exec, exec, s[4:5]405; CHECK-NEXT: ;;#ASMSTART406; CHECK-NEXT: ; use v[4:5]407; CHECK-NEXT: ;;#ASMEND408; CHECK-NEXT: s_waitcnt vmcnt(0)409; CHECK-NEXT: s_setpc_b64 s[30:31]410 %gep.0 = getelementptr inbounds [512 x i64], ptr %ptr, i64 0, i64 10411 %data0 = call i64 asm "; def $0", "=^VA"()412 %data1 = call i64 asm "; def $0", "=^VA"()413 %pair = cmpxchg ptr %gep.0, i64 %data0, i64 %data1 seq_cst monotonic414 %result = extractvalue { i64, i1 } %pair, 0415 call void asm "; use $0", "^VA"(i64 %result)416 ret void417}418 419define void @flat_atomic_cmpxchg_i64_ret_av_av__v(ptr %ptr) #0 {420; CHECK-LABEL: flat_atomic_cmpxchg_i64_ret_av_av__v:421; CHECK: ; %bb.0:422; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)423; CHECK-NEXT: v_add_co_u32_e32 v6, vcc, 0x50, v0424; CHECK-NEXT: s_mov_b64 s[4:5], src_private_base425; CHECK-NEXT: v_addc_co_u32_e32 v7, vcc, 0, v1, vcc426; CHECK-NEXT: v_cmp_ne_u32_e32 vcc, s5, v7427; CHECK-NEXT: ;;#ASMSTART428; CHECK-NEXT: ; def v[2:3]429; CHECK-NEXT: ;;#ASMEND430; CHECK-NEXT: ;;#ASMSTART431; CHECK-NEXT: ; def v[0:1]432; CHECK-NEXT: ;;#ASMEND433; CHECK-NEXT: ; implicit-def: $vgpr4_vgpr5434; CHECK-NEXT: s_and_saveexec_b64 s[4:5], vcc435; CHECK-NEXT: s_xor_b64 s[4:5], exec, s[4:5]436; CHECK-NEXT: s_cbranch_execz .LBB13_2437; CHECK-NEXT: ; %bb.1: ; %atomicrmw.global438; CHECK-NEXT: buffer_wbl2439; CHECK-NEXT: flat_atomic_cmpswap_x2 v[4:5], v[6:7], v[0:3] glc440; CHECK-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)441; CHECK-NEXT: buffer_invl2442; CHECK-NEXT: buffer_wbinvl1_vol443; CHECK-NEXT: ; implicit-def: $vgpr6_vgpr7444; CHECK-NEXT: ; implicit-def: $vgpr2_vgpr3445; CHECK-NEXT: .LBB13_2: ; %Flow446; CHECK-NEXT: s_andn2_saveexec_b64 s[4:5], s[4:5]447; CHECK-NEXT: s_cbranch_execz .LBB13_4448; CHECK-NEXT: ; %bb.3: ; %atomicrmw.private449; CHECK-NEXT: v_cmp_ne_u64_e32 vcc, 0, v[6:7]450; CHECK-NEXT: v_cndmask_b32_e32 v6, -1, v6, vcc451; CHECK-NEXT: buffer_load_dword v4, v6, s[0:3], 0 offen452; CHECK-NEXT: buffer_load_dword v5, v6, s[0:3], 0 offen offset:4453; CHECK-NEXT: s_waitcnt vmcnt(0)454; CHECK-NEXT: v_cmp_eq_u64_e32 vcc, v[4:5], v[2:3]455; CHECK-NEXT: v_cndmask_b32_e32 v0, v4, v0, vcc456; CHECK-NEXT: v_cndmask_b32_e32 v1, v5, v1, vcc457; CHECK-NEXT: buffer_store_dword v0, v6, s[0:3], 0 offen458; CHECK-NEXT: buffer_store_dword v1, v6, s[0:3], 0 offen offset:4459; CHECK-NEXT: .LBB13_4: ; %atomicrmw.phi460; CHECK-NEXT: s_or_b64 exec, exec, s[4:5]461; CHECK-NEXT: ;;#ASMSTART462; CHECK-NEXT: ; use v[4:5]463; CHECK-NEXT: ;;#ASMEND464; CHECK-NEXT: s_waitcnt vmcnt(0)465; CHECK-NEXT: s_setpc_b64 s[30:31]466 %gep.0 = getelementptr inbounds [512 x i64], ptr %ptr, i64 0, i64 10467 %data0 = call i64 asm "; def $0", "=^VA"()468 %data1 = call i64 asm "; def $0", "=^VA"()469 %pair = cmpxchg ptr %gep.0, i64 %data0, i64 %data1 seq_cst monotonic470 %result = extractvalue { i64, i1 } %pair, 0471 call void asm "; use $0", "v"(i64 %result)472 ret void473}474 475define void @flat_atomic_cmpxchg_i64_ret_av_av__a(ptr %ptr) #0 {476; CHECK-LABEL: flat_atomic_cmpxchg_i64_ret_av_av__a:477; CHECK: ; %bb.0:478; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)479; CHECK-NEXT: v_add_co_u32_e32 v4, vcc, 0x50, v0480; CHECK-NEXT: s_mov_b64 s[4:5], src_private_base481; CHECK-NEXT: v_addc_co_u32_e32 v5, vcc, 0, v1, vcc482; CHECK-NEXT: v_cmp_ne_u32_e32 vcc, s5, v5483; CHECK-NEXT: ;;#ASMSTART484; CHECK-NEXT: ; def v[2:3]485; CHECK-NEXT: ;;#ASMEND486; CHECK-NEXT: ;;#ASMSTART487; CHECK-NEXT: ; def v[0:1]488; CHECK-NEXT: ;;#ASMEND489; CHECK-NEXT: ; implicit-def: $agpr0_agpr1490; CHECK-NEXT: s_and_saveexec_b64 s[4:5], vcc491; CHECK-NEXT: s_xor_b64 s[4:5], exec, s[4:5]492; CHECK-NEXT: s_cbranch_execz .LBB14_2493; CHECK-NEXT: ; %bb.1: ; %atomicrmw.global494; CHECK-NEXT: buffer_wbl2495; CHECK-NEXT: flat_atomic_cmpswap_x2 v[0:1], v[4:5], v[0:3] glc496; CHECK-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)497; CHECK-NEXT: buffer_invl2498; CHECK-NEXT: buffer_wbinvl1_vol499; CHECK-NEXT: ; implicit-def: $vgpr4_vgpr5500; CHECK-NEXT: v_accvgpr_write_b32 a0, v0501; CHECK-NEXT: v_accvgpr_write_b32 a1, v1502; CHECK-NEXT: ; implicit-def: $vgpr2_vgpr3503; CHECK-NEXT: .LBB14_2: ; %Flow504; CHECK-NEXT: s_andn2_saveexec_b64 s[4:5], s[4:5]505; CHECK-NEXT: s_cbranch_execz .LBB14_4506; CHECK-NEXT: ; %bb.3: ; %atomicrmw.private507; CHECK-NEXT: v_cmp_ne_u64_e32 vcc, 0, v[4:5]508; CHECK-NEXT: v_cndmask_b32_e32 v6, -1, v4, vcc509; CHECK-NEXT: buffer_load_dword v4, v6, s[0:3], 0 offen510; CHECK-NEXT: buffer_load_dword v5, v6, s[0:3], 0 offen offset:4511; CHECK-NEXT: s_waitcnt vmcnt(1)512; CHECK-NEXT: v_accvgpr_write_b32 a0, v4513; CHECK-NEXT: s_waitcnt vmcnt(0)514; CHECK-NEXT: v_cmp_eq_u64_e32 vcc, v[4:5], v[2:3]515; CHECK-NEXT: v_cndmask_b32_e32 v1, v5, v1, vcc516; CHECK-NEXT: v_accvgpr_write_b32 a1, v5517; CHECK-NEXT: v_cndmask_b32_e32 v0, v4, v0, vcc518; CHECK-NEXT: buffer_store_dword v1, v6, s[0:3], 0 offen offset:4519; CHECK-NEXT: buffer_store_dword v0, v6, s[0:3], 0 offen520; CHECK-NEXT: .LBB14_4: ; %atomicrmw.phi521; CHECK-NEXT: s_or_b64 exec, exec, s[4:5]522; CHECK-NEXT: ;;#ASMSTART523; CHECK-NEXT: ; use a[0:1]524; CHECK-NEXT: ;;#ASMEND525; CHECK-NEXT: s_waitcnt vmcnt(0)526; CHECK-NEXT: s_setpc_b64 s[30:31]527 %gep.0 = getelementptr inbounds [512 x i64], ptr %ptr, i64 0, i64 10528 %data0 = call i64 asm "; def $0", "=^VA"()529 %data1 = call i64 asm "; def $0", "=^VA"()530 %pair = cmpxchg ptr %gep.0, i64 %data0, i64 %data1 seq_cst monotonic531 %result = extractvalue { i64, i1 } %pair, 0532 call void asm "; use $0", "a"(i64 %result)533 ret void534}535 536define void @flat_atomic_cmpxchg_i64_ret_a_a__a(ptr %ptr) #0 {537; CHECK-LABEL: flat_atomic_cmpxchg_i64_ret_a_a__a:538; CHECK: ; %bb.0:539; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)540; CHECK-NEXT: v_add_co_u32_e32 v0, vcc, 0x50, v0541; CHECK-NEXT: s_mov_b64 s[4:5], src_private_base542; CHECK-NEXT: v_addc_co_u32_e32 v1, vcc, 0, v1, vcc543; CHECK-NEXT: ;;#ASMSTART544; CHECK-NEXT: ; def a[2:3]545; CHECK-NEXT: ;;#ASMEND546; CHECK-NEXT: v_accvgpr_read_b32 v5, a3547; CHECK-NEXT: ;;#ASMSTART548; CHECK-NEXT: ; def a[4:5]549; CHECK-NEXT: ;;#ASMEND550; CHECK-NEXT: v_accvgpr_read_b32 v2, a4551; CHECK-NEXT: v_accvgpr_read_b32 v4, a2552; CHECK-NEXT: v_accvgpr_read_b32 v3, a5553; CHECK-NEXT: v_cmp_ne_u32_e32 vcc, s5, v1554; CHECK-NEXT: ; implicit-def: $agpr0_agpr1555; CHECK-NEXT: s_and_saveexec_b64 s[4:5], vcc556; CHECK-NEXT: s_xor_b64 s[4:5], exec, s[4:5]557; CHECK-NEXT: s_cbranch_execz .LBB15_2558; CHECK-NEXT: ; %bb.1: ; %atomicrmw.global559; CHECK-NEXT: v_accvgpr_read_b32 v2, a4560; CHECK-NEXT: v_accvgpr_read_b32 v3, a5561; CHECK-NEXT: v_accvgpr_read_b32 v4, a2562; CHECK-NEXT: v_accvgpr_read_b32 v5, a3563; CHECK-NEXT: buffer_wbl2564; CHECK-NEXT: flat_atomic_cmpswap_x2 v[0:1], v[0:1], v[2:5] glc565; CHECK-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)566; CHECK-NEXT: buffer_invl2567; CHECK-NEXT: buffer_wbinvl1_vol568; CHECK-NEXT: ; implicit-def: $vgpr4_vgpr5569; CHECK-NEXT: ; implicit-def: $vgpr2_vgpr3570; CHECK-NEXT: v_accvgpr_write_b32 a0, v0571; CHECK-NEXT: v_accvgpr_write_b32 a1, v1572; CHECK-NEXT: ; implicit-def: $vgpr0_vgpr1573; CHECK-NEXT: .LBB15_2: ; %Flow574; CHECK-NEXT: s_andn2_saveexec_b64 s[4:5], s[4:5]575; CHECK-NEXT: s_cbranch_execz .LBB15_4576; CHECK-NEXT: ; %bb.3: ; %atomicrmw.private577; CHECK-NEXT: v_cmp_ne_u64_e32 vcc, 0, v[0:1]578; CHECK-NEXT: v_cndmask_b32_e32 v6, -1, v0, vcc579; CHECK-NEXT: buffer_load_dword v0, v6, s[0:3], 0 offen580; CHECK-NEXT: buffer_load_dword v1, v6, s[0:3], 0 offen offset:4581; CHECK-NEXT: s_waitcnt vmcnt(1)582; CHECK-NEXT: v_accvgpr_write_b32 a0, v0583; CHECK-NEXT: s_waitcnt vmcnt(0)584; CHECK-NEXT: v_cmp_eq_u64_e32 vcc, v[0:1], v[4:5]585; CHECK-NEXT: v_cndmask_b32_e32 v3, v1, v3, vcc586; CHECK-NEXT: v_accvgpr_write_b32 a1, v1587; CHECK-NEXT: v_cndmask_b32_e32 v0, v0, v2, vcc588; CHECK-NEXT: buffer_store_dword v3, v6, s[0:3], 0 offen offset:4589; CHECK-NEXT: buffer_store_dword v0, v6, s[0:3], 0 offen590; CHECK-NEXT: .LBB15_4: ; %atomicrmw.phi591; CHECK-NEXT: s_or_b64 exec, exec, s[4:5]592; CHECK-NEXT: ;;#ASMSTART593; CHECK-NEXT: ; use a[0:1]594; CHECK-NEXT: ;;#ASMEND595; CHECK-NEXT: s_waitcnt vmcnt(0)596; CHECK-NEXT: s_setpc_b64 s[30:31]597 %gep.0 = getelementptr inbounds [512 x i64], ptr %ptr, i64 0, i64 10598 %data0 = call i64 asm "; def $0", "=a"()599 %data1 = call i64 asm "; def $0", "=a"()600 %pair = cmpxchg ptr %gep.0, i64 %data0, i64 %data1 seq_cst monotonic601 %result = extractvalue { i64, i1 } %pair, 0602 call void asm "; use $0", "a"(i64 %result)603 ret void604}605 606define void @flat_atomic_cmpxchg_i64_ret_a_a__v(ptr %ptr) #0 {607; CHECK-LABEL: flat_atomic_cmpxchg_i64_ret_a_a__v:608; CHECK: ; %bb.0:609; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)610; CHECK-NEXT: v_add_co_u32_e32 v0, vcc, 0x50, v0611; CHECK-NEXT: s_mov_b64 s[4:5], src_private_base612; CHECK-NEXT: v_addc_co_u32_e32 v1, vcc, 0, v1, vcc613; CHECK-NEXT: ;;#ASMSTART614; CHECK-NEXT: ; def a[0:1]615; CHECK-NEXT: ;;#ASMEND616; CHECK-NEXT: v_accvgpr_read_b32 v5, a1617; CHECK-NEXT: ;;#ASMSTART618; CHECK-NEXT: ; def a[2:3]619; CHECK-NEXT: ;;#ASMEND620; CHECK-NEXT: v_accvgpr_read_b32 v7, a3621; CHECK-NEXT: v_accvgpr_read_b32 v4, a0622; CHECK-NEXT: v_accvgpr_read_b32 v6, a2623; CHECK-NEXT: v_cmp_ne_u32_e32 vcc, s5, v1624; CHECK-NEXT: ; implicit-def: $vgpr2_vgpr3625; CHECK-NEXT: s_and_saveexec_b64 s[4:5], vcc626; CHECK-NEXT: s_xor_b64 s[4:5], exec, s[4:5]627; CHECK-NEXT: s_cbranch_execz .LBB16_2628; CHECK-NEXT: ; %bb.1: ; %atomicrmw.global629; CHECK-NEXT: v_accvgpr_read_b32 v2, a2630; CHECK-NEXT: v_accvgpr_read_b32 v3, a3631; CHECK-NEXT: v_accvgpr_read_b32 v4, a0632; CHECK-NEXT: v_accvgpr_read_b32 v5, a1633; CHECK-NEXT: buffer_wbl2634; CHECK-NEXT: flat_atomic_cmpswap_x2 v[2:3], v[0:1], v[2:5] glc635; CHECK-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)636; CHECK-NEXT: buffer_invl2637; CHECK-NEXT: buffer_wbinvl1_vol638; CHECK-NEXT: ; implicit-def: $vgpr0_vgpr1639; CHECK-NEXT: ; implicit-def: $vgpr4_vgpr5640; CHECK-NEXT: ; implicit-def: $vgpr6_vgpr7641; CHECK-NEXT: .LBB16_2: ; %Flow642; CHECK-NEXT: s_andn2_saveexec_b64 s[4:5], s[4:5]643; CHECK-NEXT: s_cbranch_execz .LBB16_4644; CHECK-NEXT: ; %bb.3: ; %atomicrmw.private645; CHECK-NEXT: v_cmp_ne_u64_e32 vcc, 0, v[0:1]646; CHECK-NEXT: v_cndmask_b32_e32 v0, -1, v0, vcc647; CHECK-NEXT: buffer_load_dword v2, v0, s[0:3], 0 offen648; CHECK-NEXT: buffer_load_dword v3, v0, s[0:3], 0 offen offset:4649; CHECK-NEXT: s_waitcnt vmcnt(0)650; CHECK-NEXT: v_cmp_eq_u64_e32 vcc, v[2:3], v[4:5]651; CHECK-NEXT: v_cndmask_b32_e32 v4, v2, v6, vcc652; CHECK-NEXT: v_cndmask_b32_e32 v1, v3, v7, vcc653; CHECK-NEXT: buffer_store_dword v4, v0, s[0:3], 0 offen654; CHECK-NEXT: buffer_store_dword v1, v0, s[0:3], 0 offen offset:4655; CHECK-NEXT: .LBB16_4: ; %atomicrmw.phi656; CHECK-NEXT: s_or_b64 exec, exec, s[4:5]657; CHECK-NEXT: ;;#ASMSTART658; CHECK-NEXT: ; use v[2:3]659; CHECK-NEXT: ;;#ASMEND660; CHECK-NEXT: s_waitcnt vmcnt(0)661; CHECK-NEXT: s_setpc_b64 s[30:31]662 %gep.0 = getelementptr inbounds [512 x i64], ptr %ptr, i64 0, i64 10663 %data0 = call i64 asm "; def $0", "=a"()664 %data1 = call i64 asm "; def $0", "=a"()665 %pair = cmpxchg ptr %gep.0, i64 %data0, i64 %data1 seq_cst monotonic666 %result = extractvalue { i64, i1 } %pair, 0667 call void asm "; use $0", "v"(i64 %result)668 ret void669}670 671define void @flat_atomic_cmpxchg_i64_ret_v_a__v(ptr %ptr) #0 {672; CHECK-LABEL: flat_atomic_cmpxchg_i64_ret_v_a__v:673; CHECK: ; %bb.0:674; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)675; CHECK-NEXT: v_add_co_u32_e32 v4, vcc, 0x50, v0676; CHECK-NEXT: s_mov_b64 s[4:5], src_private_base677; CHECK-NEXT: v_addc_co_u32_e32 v5, vcc, 0, v1, vcc678; CHECK-NEXT: ;;#ASMSTART679; CHECK-NEXT: ; def a[0:1]680; CHECK-NEXT: ;;#ASMEND681; CHECK-NEXT: v_accvgpr_read_b32 v7, a1682; CHECK-NEXT: v_accvgpr_read_b32 v6, a0683; CHECK-NEXT: v_cmp_ne_u32_e32 vcc, s5, v5684; CHECK-NEXT: ;;#ASMSTART685; CHECK-NEXT: ; def v[2:3]686; CHECK-NEXT: ;;#ASMEND687; CHECK-NEXT: ; implicit-def: $vgpr0_vgpr1688; CHECK-NEXT: s_and_saveexec_b64 s[4:5], vcc689; CHECK-NEXT: s_xor_b64 s[4:5], exec, s[4:5]690; CHECK-NEXT: s_cbranch_execz .LBB17_2691; CHECK-NEXT: ; %bb.1: ; %atomicrmw.global692; CHECK-NEXT: v_accvgpr_read_b32 v0, a0693; CHECK-NEXT: v_accvgpr_read_b32 v1, a1694; CHECK-NEXT: buffer_wbl2695; CHECK-NEXT: flat_atomic_cmpswap_x2 v[0:1], v[4:5], v[0:3] glc696; CHECK-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)697; CHECK-NEXT: buffer_invl2698; CHECK-NEXT: buffer_wbinvl1_vol699; CHECK-NEXT: ; implicit-def: $vgpr4_vgpr5700; CHECK-NEXT: ; implicit-def: $vgpr2_vgpr3701; CHECK-NEXT: ; implicit-def: $vgpr6_vgpr7702; CHECK-NEXT: .LBB17_2: ; %Flow703; CHECK-NEXT: s_andn2_saveexec_b64 s[4:5], s[4:5]704; CHECK-NEXT: s_cbranch_execz .LBB17_4705; CHECK-NEXT: ; %bb.3: ; %atomicrmw.private706; CHECK-NEXT: v_cmp_ne_u64_e32 vcc, 0, v[4:5]707; CHECK-NEXT: v_cndmask_b32_e32 v4, -1, v4, vcc708; CHECK-NEXT: buffer_load_dword v0, v4, s[0:3], 0 offen709; CHECK-NEXT: buffer_load_dword v1, v4, s[0:3], 0 offen offset:4710; CHECK-NEXT: s_waitcnt vmcnt(0)711; CHECK-NEXT: v_cmp_eq_u64_e32 vcc, v[0:1], v[2:3]712; CHECK-NEXT: v_cndmask_b32_e32 v3, v0, v6, vcc713; CHECK-NEXT: v_cndmask_b32_e32 v2, v1, v7, vcc714; CHECK-NEXT: buffer_store_dword v3, v4, s[0:3], 0 offen715; CHECK-NEXT: buffer_store_dword v2, v4, s[0:3], 0 offen offset:4716; CHECK-NEXT: .LBB17_4: ; %atomicrmw.phi717; CHECK-NEXT: s_or_b64 exec, exec, s[4:5]718; CHECK-NEXT: ;;#ASMSTART719; CHECK-NEXT: ; use v[0:1]720; CHECK-NEXT: ;;#ASMEND721; CHECK-NEXT: s_waitcnt vmcnt(0)722; CHECK-NEXT: s_setpc_b64 s[30:31]723 %gep.0 = getelementptr inbounds [512 x i64], ptr %ptr, i64 0, i64 10724 %data0 = call i64 asm "; def $0", "=v"()725 %data1 = call i64 asm "; def $0", "=a"()726 %pair = cmpxchg ptr %gep.0, i64 %data0, i64 %data1 seq_cst monotonic727 %result = extractvalue { i64, i1 } %pair, 0728 call void asm "; use $0", "v"(i64 %result)729 ret void730}731 732define void @flat_atomic_cmpxchg_i64_ret_a_v__v(ptr %ptr) #0 {733; CHECK-LABEL: flat_atomic_cmpxchg_i64_ret_a_v__v:734; CHECK: ; %bb.0:735; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)736; CHECK-NEXT: v_add_co_u32_e32 v4, vcc, 0x50, v0737; CHECK-NEXT: s_mov_b64 s[4:5], src_private_base738; CHECK-NEXT: v_addc_co_u32_e32 v5, vcc, 0, v1, vcc739; CHECK-NEXT: ;;#ASMSTART740; CHECK-NEXT: ; def a[0:1]741; CHECK-NEXT: ;;#ASMEND742; CHECK-NEXT: v_accvgpr_read_b32 v7, a1743; CHECK-NEXT: v_accvgpr_read_b32 v6, a0744; CHECK-NEXT: v_cmp_ne_u32_e32 vcc, s5, v5745; CHECK-NEXT: ;;#ASMSTART746; CHECK-NEXT: ; def v[0:1]747; CHECK-NEXT: ;;#ASMEND748; CHECK-NEXT: ; implicit-def: $vgpr2_vgpr3749; CHECK-NEXT: s_and_saveexec_b64 s[4:5], vcc750; CHECK-NEXT: s_xor_b64 s[4:5], exec, s[4:5]751; CHECK-NEXT: s_cbranch_execz .LBB18_2752; CHECK-NEXT: ; %bb.1: ; %atomicrmw.global753; CHECK-NEXT: v_accvgpr_read_b32 v2, a0754; CHECK-NEXT: v_accvgpr_read_b32 v3, a1755; CHECK-NEXT: buffer_wbl2756; CHECK-NEXT: flat_atomic_cmpswap_x2 v[2:3], v[4:5], v[0:3] glc757; CHECK-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)758; CHECK-NEXT: buffer_invl2759; CHECK-NEXT: buffer_wbinvl1_vol760; CHECK-NEXT: ; implicit-def: $vgpr4_vgpr5761; CHECK-NEXT: ; implicit-def: $vgpr6_vgpr7762; CHECK-NEXT: ; implicit-def: $vgpr0_vgpr1763; CHECK-NEXT: .LBB18_2: ; %Flow764; CHECK-NEXT: s_andn2_saveexec_b64 s[4:5], s[4:5]765; CHECK-NEXT: s_cbranch_execz .LBB18_4766; CHECK-NEXT: ; %bb.3: ; %atomicrmw.private767; CHECK-NEXT: v_cmp_ne_u64_e32 vcc, 0, v[4:5]768; CHECK-NEXT: v_cndmask_b32_e32 v4, -1, v4, vcc769; CHECK-NEXT: buffer_load_dword v2, v4, s[0:3], 0 offen770; CHECK-NEXT: buffer_load_dword v3, v4, s[0:3], 0 offen offset:4771; CHECK-NEXT: s_waitcnt vmcnt(0)772; CHECK-NEXT: v_cmp_eq_u64_e32 vcc, v[2:3], v[6:7]773; CHECK-NEXT: v_cndmask_b32_e32 v0, v2, v0, vcc774; CHECK-NEXT: v_cndmask_b32_e32 v1, v3, v1, vcc775; CHECK-NEXT: buffer_store_dword v0, v4, s[0:3], 0 offen776; CHECK-NEXT: buffer_store_dword v1, v4, s[0:3], 0 offen offset:4777; CHECK-NEXT: .LBB18_4: ; %atomicrmw.phi778; CHECK-NEXT: s_or_b64 exec, exec, s[4:5]779; CHECK-NEXT: ;;#ASMSTART780; CHECK-NEXT: ; use v[2:3]781; CHECK-NEXT: ;;#ASMEND782; CHECK-NEXT: s_waitcnt vmcnt(0)783; CHECK-NEXT: s_setpc_b64 s[30:31]784 %gep.0 = getelementptr inbounds [512 x i64], ptr %ptr, i64 0, i64 10785 %data0 = call i64 asm "; def $0", "=a"()786 %data1 = call i64 asm "; def $0", "=v"()787 %pair = cmpxchg ptr %gep.0, i64 %data0, i64 %data1 seq_cst monotonic788 %result = extractvalue { i64, i1 } %pair, 0789 call void asm "; use $0", "v"(i64 %result)790 ret void791}792 793define void @flat_atomic_cmpxchg_i64_ret_v_v__a(ptr %ptr) #0 {794; CHECK-LABEL: flat_atomic_cmpxchg_i64_ret_v_v__a:795; CHECK: ; %bb.0:796; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)797; CHECK-NEXT: v_add_co_u32_e32 v4, vcc, 0x50, v0798; CHECK-NEXT: s_mov_b64 s[4:5], src_private_base799; CHECK-NEXT: v_addc_co_u32_e32 v5, vcc, 0, v1, vcc800; CHECK-NEXT: v_cmp_ne_u32_e32 vcc, s5, v5801; CHECK-NEXT: ;;#ASMSTART802; CHECK-NEXT: ; def v[2:3]803; CHECK-NEXT: ;;#ASMEND804; CHECK-NEXT: ;;#ASMSTART805; CHECK-NEXT: ; def v[0:1]806; CHECK-NEXT: ;;#ASMEND807; CHECK-NEXT: ; implicit-def: $agpr0_agpr1808; CHECK-NEXT: s_and_saveexec_b64 s[4:5], vcc809; CHECK-NEXT: s_xor_b64 s[4:5], exec, s[4:5]810; CHECK-NEXT: s_cbranch_execz .LBB19_2811; CHECK-NEXT: ; %bb.1: ; %atomicrmw.global812; CHECK-NEXT: buffer_wbl2813; CHECK-NEXT: flat_atomic_cmpswap_x2 v[0:1], v[4:5], v[0:3] glc814; CHECK-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)815; CHECK-NEXT: buffer_invl2816; CHECK-NEXT: buffer_wbinvl1_vol817; CHECK-NEXT: ; implicit-def: $vgpr4_vgpr5818; CHECK-NEXT: v_accvgpr_write_b32 a0, v0819; CHECK-NEXT: v_accvgpr_write_b32 a1, v1820; CHECK-NEXT: ; implicit-def: $vgpr2_vgpr3821; CHECK-NEXT: .LBB19_2: ; %Flow822; CHECK-NEXT: s_andn2_saveexec_b64 s[4:5], s[4:5]823; CHECK-NEXT: s_cbranch_execz .LBB19_4824; CHECK-NEXT: ; %bb.3: ; %atomicrmw.private825; CHECK-NEXT: v_cmp_ne_u64_e32 vcc, 0, v[4:5]826; CHECK-NEXT: v_cndmask_b32_e32 v6, -1, v4, vcc827; CHECK-NEXT: buffer_load_dword v4, v6, s[0:3], 0 offen828; CHECK-NEXT: buffer_load_dword v5, v6, s[0:3], 0 offen offset:4829; CHECK-NEXT: s_waitcnt vmcnt(1)830; CHECK-NEXT: v_accvgpr_write_b32 a0, v4831; CHECK-NEXT: s_waitcnt vmcnt(0)832; CHECK-NEXT: v_cmp_eq_u64_e32 vcc, v[4:5], v[2:3]833; CHECK-NEXT: v_cndmask_b32_e32 v1, v5, v1, vcc834; CHECK-NEXT: v_accvgpr_write_b32 a1, v5835; CHECK-NEXT: v_cndmask_b32_e32 v0, v4, v0, vcc836; CHECK-NEXT: buffer_store_dword v1, v6, s[0:3], 0 offen offset:4837; CHECK-NEXT: buffer_store_dword v0, v6, s[0:3], 0 offen838; CHECK-NEXT: .LBB19_4: ; %atomicrmw.phi839; CHECK-NEXT: s_or_b64 exec, exec, s[4:5]840; CHECK-NEXT: ;;#ASMSTART841; CHECK-NEXT: ; use a[0:1]842; CHECK-NEXT: ;;#ASMEND843; CHECK-NEXT: s_waitcnt vmcnt(0)844; CHECK-NEXT: s_setpc_b64 s[30:31]845 %gep.0 = getelementptr inbounds [512 x i64], ptr %ptr, i64 0, i64 10846 %data0 = call i64 asm "; def $0", "=v"()847 %data1 = call i64 asm "; def $0", "=v"()848 %pair = cmpxchg ptr %gep.0, i64 %data0, i64 %data1 seq_cst monotonic849 %result = extractvalue { i64, i1 } %pair, 0850 call void asm "; use $0", "a"(i64 %result)851 ret void852}853 854define void @flat_atomic_cmpxchg_i64_ret_av_v__av(ptr %ptr) #0 {855; CHECK-LABEL: flat_atomic_cmpxchg_i64_ret_av_v__av:856; CHECK: ; %bb.0:857; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)858; CHECK-NEXT: v_add_co_u32_e32 v6, vcc, 0x50, v0859; CHECK-NEXT: s_mov_b64 s[4:5], src_private_base860; CHECK-NEXT: v_addc_co_u32_e32 v7, vcc, 0, v1, vcc861; CHECK-NEXT: v_cmp_ne_u32_e32 vcc, s5, v7862; CHECK-NEXT: ;;#ASMSTART863; CHECK-NEXT: ; def v[2:3]864; CHECK-NEXT: ;;#ASMEND865; CHECK-NEXT: ;;#ASMSTART866; CHECK-NEXT: ; def v[0:1]867; CHECK-NEXT: ;;#ASMEND868; CHECK-NEXT: ; implicit-def: $vgpr4_vgpr5869; CHECK-NEXT: s_and_saveexec_b64 s[4:5], vcc870; CHECK-NEXT: s_xor_b64 s[4:5], exec, s[4:5]871; CHECK-NEXT: s_cbranch_execz .LBB20_2872; CHECK-NEXT: ; %bb.1: ; %atomicrmw.global873; CHECK-NEXT: buffer_wbl2874; CHECK-NEXT: flat_atomic_cmpswap_x2 v[4:5], v[6:7], v[0:3] glc875; CHECK-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)876; CHECK-NEXT: buffer_invl2877; CHECK-NEXT: buffer_wbinvl1_vol878; CHECK-NEXT: ; implicit-def: $vgpr6_vgpr7879; CHECK-NEXT: ; implicit-def: $vgpr2_vgpr3880; CHECK-NEXT: .LBB20_2: ; %Flow881; CHECK-NEXT: s_andn2_saveexec_b64 s[4:5], s[4:5]882; CHECK-NEXT: s_cbranch_execz .LBB20_4883; CHECK-NEXT: ; %bb.3: ; %atomicrmw.private884; CHECK-NEXT: v_cmp_ne_u64_e32 vcc, 0, v[6:7]885; CHECK-NEXT: v_cndmask_b32_e32 v6, -1, v6, vcc886; CHECK-NEXT: buffer_load_dword v4, v6, s[0:3], 0 offen887; CHECK-NEXT: buffer_load_dword v5, v6, s[0:3], 0 offen offset:4888; CHECK-NEXT: s_waitcnt vmcnt(0)889; CHECK-NEXT: v_cmp_eq_u64_e32 vcc, v[4:5], v[2:3]890; CHECK-NEXT: v_cndmask_b32_e32 v0, v4, v0, vcc891; CHECK-NEXT: v_cndmask_b32_e32 v1, v5, v1, vcc892; CHECK-NEXT: buffer_store_dword v0, v6, s[0:3], 0 offen893; CHECK-NEXT: buffer_store_dword v1, v6, s[0:3], 0 offen offset:4894; CHECK-NEXT: .LBB20_4: ; %atomicrmw.phi895; CHECK-NEXT: s_or_b64 exec, exec, s[4:5]896; CHECK-NEXT: ;;#ASMSTART897; CHECK-NEXT: ; use v[4:5]898; CHECK-NEXT: ;;#ASMEND899; CHECK-NEXT: s_waitcnt vmcnt(0)900; CHECK-NEXT: s_setpc_b64 s[30:31]901 %gep.0 = getelementptr inbounds [512 x i64], ptr %ptr, i64 0, i64 10902 %data0 = call i64 asm "; def $0", "=^VA"()903 %data1 = call i64 asm "; def $0", "=v"()904 %pair = cmpxchg ptr %gep.0, i64 %data0, i64 %data1 seq_cst monotonic905 %result = extractvalue { i64, i1 } %pair, 0906 call void asm "; use $0", "^VA"(i64 %result)907 ret void908}909 910define void @flat_atomic_cmpxchg_i64_ret_v_av__av(ptr %ptr) #0 {911; CHECK-LABEL: flat_atomic_cmpxchg_i64_ret_v_av__av:912; CHECK: ; %bb.0:913; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)914; CHECK-NEXT: v_add_co_u32_e32 v6, vcc, 0x50, v0915; CHECK-NEXT: s_mov_b64 s[4:5], src_private_base916; CHECK-NEXT: v_addc_co_u32_e32 v7, vcc, 0, v1, vcc917; CHECK-NEXT: v_cmp_ne_u32_e32 vcc, s5, v7918; CHECK-NEXT: ;;#ASMSTART919; CHECK-NEXT: ; def v[2:3]920; CHECK-NEXT: ;;#ASMEND921; CHECK-NEXT: ;;#ASMSTART922; CHECK-NEXT: ; def v[0:1]923; CHECK-NEXT: ;;#ASMEND924; CHECK-NEXT: ; implicit-def: $vgpr4_vgpr5925; CHECK-NEXT: s_and_saveexec_b64 s[4:5], vcc926; CHECK-NEXT: s_xor_b64 s[4:5], exec, s[4:5]927; CHECK-NEXT: s_cbranch_execz .LBB21_2928; CHECK-NEXT: ; %bb.1: ; %atomicrmw.global929; CHECK-NEXT: buffer_wbl2930; CHECK-NEXT: flat_atomic_cmpswap_x2 v[4:5], v[6:7], v[0:3] glc931; CHECK-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)932; CHECK-NEXT: buffer_invl2933; CHECK-NEXT: buffer_wbinvl1_vol934; CHECK-NEXT: ; implicit-def: $vgpr6_vgpr7935; CHECK-NEXT: ; implicit-def: $vgpr2_vgpr3936; CHECK-NEXT: .LBB21_2: ; %Flow937; CHECK-NEXT: s_andn2_saveexec_b64 s[4:5], s[4:5]938; CHECK-NEXT: s_cbranch_execz .LBB21_4939; CHECK-NEXT: ; %bb.3: ; %atomicrmw.private940; CHECK-NEXT: v_cmp_ne_u64_e32 vcc, 0, v[6:7]941; CHECK-NEXT: v_cndmask_b32_e32 v6, -1, v6, vcc942; CHECK-NEXT: buffer_load_dword v4, v6, s[0:3], 0 offen943; CHECK-NEXT: buffer_load_dword v5, v6, s[0:3], 0 offen offset:4944; CHECK-NEXT: s_waitcnt vmcnt(0)945; CHECK-NEXT: v_cmp_eq_u64_e32 vcc, v[4:5], v[2:3]946; CHECK-NEXT: v_cndmask_b32_e32 v0, v4, v0, vcc947; CHECK-NEXT: v_cndmask_b32_e32 v1, v5, v1, vcc948; CHECK-NEXT: buffer_store_dword v0, v6, s[0:3], 0 offen949; CHECK-NEXT: buffer_store_dword v1, v6, s[0:3], 0 offen offset:4950; CHECK-NEXT: .LBB21_4: ; %atomicrmw.phi951; CHECK-NEXT: s_or_b64 exec, exec, s[4:5]952; CHECK-NEXT: ;;#ASMSTART953; CHECK-NEXT: ; use v[4:5]954; CHECK-NEXT: ;;#ASMEND955; CHECK-NEXT: s_waitcnt vmcnt(0)956; CHECK-NEXT: s_setpc_b64 s[30:31]957 %gep.0 = getelementptr inbounds [512 x i64], ptr %ptr, i64 0, i64 10958 %data0 = call i64 asm "; def $0", "=v"()959 %data1 = call i64 asm "; def $0", "=^VA"()960 %pair = cmpxchg ptr %gep.0, i64 %data0, i64 %data1 seq_cst monotonic961 %result = extractvalue { i64, i1 } %pair, 0962 call void asm "; use $0", "^VA"(i64 %result)963 ret void964}965 966define void @flat_atomic_cmpxchg_i64_ret_av_a__av(ptr %ptr) #0 {967; CHECK-LABEL: flat_atomic_cmpxchg_i64_ret_av_a__av:968; CHECK: ; %bb.0:969; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)970; CHECK-NEXT: v_add_co_u32_e32 v4, vcc, 0x50, v0971; CHECK-NEXT: s_mov_b64 s[4:5], src_private_base972; CHECK-NEXT: v_addc_co_u32_e32 v5, vcc, 0, v1, vcc973; CHECK-NEXT: ;;#ASMSTART974; CHECK-NEXT: ; def a[0:1]975; CHECK-NEXT: ;;#ASMEND976; CHECK-NEXT: v_accvgpr_read_b32 v7, a1977; CHECK-NEXT: v_accvgpr_read_b32 v6, a0978; CHECK-NEXT: v_cmp_ne_u32_e32 vcc, s5, v5979; CHECK-NEXT: ;;#ASMSTART980; CHECK-NEXT: ; def v[2:3]981; CHECK-NEXT: ;;#ASMEND982; CHECK-NEXT: ; implicit-def: $vgpr0_vgpr1983; CHECK-NEXT: s_and_saveexec_b64 s[4:5], vcc984; CHECK-NEXT: s_xor_b64 s[4:5], exec, s[4:5]985; CHECK-NEXT: s_cbranch_execz .LBB22_2986; CHECK-NEXT: ; %bb.1: ; %atomicrmw.global987; CHECK-NEXT: v_accvgpr_read_b32 v0, a0988; CHECK-NEXT: v_accvgpr_read_b32 v1, a1989; CHECK-NEXT: buffer_wbl2990; CHECK-NEXT: flat_atomic_cmpswap_x2 v[0:1], v[4:5], v[0:3] glc991; CHECK-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)992; CHECK-NEXT: buffer_invl2993; CHECK-NEXT: buffer_wbinvl1_vol994; CHECK-NEXT: ; implicit-def: $vgpr4_vgpr5995; CHECK-NEXT: ; implicit-def: $vgpr2_vgpr3996; CHECK-NEXT: ; implicit-def: $vgpr6_vgpr7997; CHECK-NEXT: .LBB22_2: ; %Flow998; CHECK-NEXT: s_andn2_saveexec_b64 s[4:5], s[4:5]999; CHECK-NEXT: s_cbranch_execz .LBB22_41000; CHECK-NEXT: ; %bb.3: ; %atomicrmw.private1001; CHECK-NEXT: v_cmp_ne_u64_e32 vcc, 0, v[4:5]1002; CHECK-NEXT: v_cndmask_b32_e32 v4, -1, v4, vcc1003; CHECK-NEXT: buffer_load_dword v0, v4, s[0:3], 0 offen1004; CHECK-NEXT: buffer_load_dword v1, v4, s[0:3], 0 offen offset:41005; CHECK-NEXT: s_waitcnt vmcnt(0)1006; CHECK-NEXT: v_cmp_eq_u64_e32 vcc, v[0:1], v[2:3]1007; CHECK-NEXT: v_cndmask_b32_e32 v3, v0, v6, vcc1008; CHECK-NEXT: v_cndmask_b32_e32 v2, v1, v7, vcc1009; CHECK-NEXT: buffer_store_dword v3, v4, s[0:3], 0 offen1010; CHECK-NEXT: buffer_store_dword v2, v4, s[0:3], 0 offen offset:41011; CHECK-NEXT: .LBB22_4: ; %atomicrmw.phi1012; CHECK-NEXT: s_or_b64 exec, exec, s[4:5]1013; CHECK-NEXT: ;;#ASMSTART1014; CHECK-NEXT: ; use v[0:1]1015; CHECK-NEXT: ;;#ASMEND1016; CHECK-NEXT: s_waitcnt vmcnt(0)1017; CHECK-NEXT: s_setpc_b64 s[30:31]1018 %gep.0 = getelementptr inbounds [512 x i64], ptr %ptr, i64 0, i64 101019 %data0 = call i64 asm "; def $0", "=^VA"()1020 %data1 = call i64 asm "; def $0", "=a"()1021 %pair = cmpxchg ptr %gep.0, i64 %data0, i64 %data1 seq_cst monotonic1022 %result = extractvalue { i64, i1 } %pair, 01023 call void asm "; use $0", "^VA"(i64 %result)1024 ret void1025}1026 1027define void @flat_atomic_cmpxchg_i64_ret_a_av__av(ptr %ptr) #0 {1028; CHECK-LABEL: flat_atomic_cmpxchg_i64_ret_a_av__av:1029; CHECK: ; %bb.0:1030; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1031; CHECK-NEXT: v_add_co_u32_e32 v4, vcc, 0x50, v01032; CHECK-NEXT: s_mov_b64 s[4:5], src_private_base1033; CHECK-NEXT: v_addc_co_u32_e32 v5, vcc, 0, v1, vcc1034; CHECK-NEXT: ;;#ASMSTART1035; CHECK-NEXT: ; def a[0:1]1036; CHECK-NEXT: ;;#ASMEND1037; CHECK-NEXT: v_accvgpr_read_b32 v7, a11038; CHECK-NEXT: v_accvgpr_read_b32 v6, a01039; CHECK-NEXT: v_cmp_ne_u32_e32 vcc, s5, v51040; CHECK-NEXT: ;;#ASMSTART1041; CHECK-NEXT: ; def v[0:1]1042; CHECK-NEXT: ;;#ASMEND1043; CHECK-NEXT: ; implicit-def: $vgpr2_vgpr31044; CHECK-NEXT: s_and_saveexec_b64 s[4:5], vcc1045; CHECK-NEXT: s_xor_b64 s[4:5], exec, s[4:5]1046; CHECK-NEXT: s_cbranch_execz .LBB23_21047; CHECK-NEXT: ; %bb.1: ; %atomicrmw.global1048; CHECK-NEXT: v_accvgpr_read_b32 v2, a01049; CHECK-NEXT: v_accvgpr_read_b32 v3, a11050; CHECK-NEXT: buffer_wbl21051; CHECK-NEXT: flat_atomic_cmpswap_x2 v[2:3], v[4:5], v[0:3] glc1052; CHECK-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)1053; CHECK-NEXT: buffer_invl21054; CHECK-NEXT: buffer_wbinvl1_vol1055; CHECK-NEXT: ; implicit-def: $vgpr4_vgpr51056; CHECK-NEXT: ; implicit-def: $vgpr6_vgpr71057; CHECK-NEXT: ; implicit-def: $vgpr0_vgpr11058; CHECK-NEXT: .LBB23_2: ; %Flow1059; CHECK-NEXT: s_andn2_saveexec_b64 s[4:5], s[4:5]1060; CHECK-NEXT: s_cbranch_execz .LBB23_41061; CHECK-NEXT: ; %bb.3: ; %atomicrmw.private1062; CHECK-NEXT: v_cmp_ne_u64_e32 vcc, 0, v[4:5]1063; CHECK-NEXT: v_cndmask_b32_e32 v4, -1, v4, vcc1064; CHECK-NEXT: buffer_load_dword v2, v4, s[0:3], 0 offen1065; CHECK-NEXT: buffer_load_dword v3, v4, s[0:3], 0 offen offset:41066; CHECK-NEXT: s_waitcnt vmcnt(0)1067; CHECK-NEXT: v_cmp_eq_u64_e32 vcc, v[2:3], v[6:7]1068; CHECK-NEXT: v_cndmask_b32_e32 v0, v2, v0, vcc1069; CHECK-NEXT: v_cndmask_b32_e32 v1, v3, v1, vcc1070; CHECK-NEXT: buffer_store_dword v0, v4, s[0:3], 0 offen1071; CHECK-NEXT: buffer_store_dword v1, v4, s[0:3], 0 offen offset:41072; CHECK-NEXT: .LBB23_4: ; %atomicrmw.phi1073; CHECK-NEXT: s_or_b64 exec, exec, s[4:5]1074; CHECK-NEXT: ;;#ASMSTART1075; CHECK-NEXT: ; use v[2:3]1076; CHECK-NEXT: ;;#ASMEND1077; CHECK-NEXT: s_waitcnt vmcnt(0)1078; CHECK-NEXT: s_setpc_b64 s[30:31]1079 %gep.0 = getelementptr inbounds [512 x i64], ptr %ptr, i64 0, i64 101080 %data0 = call i64 asm "; def $0", "=a"()1081 %data1 = call i64 asm "; def $0", "=^VA"()1082 %pair = cmpxchg ptr %gep.0, i64 %data0, i64 %data1 seq_cst monotonic1083 %result = extractvalue { i64, i1 } %pair, 01084 call void asm "; use $0", "^VA"(i64 %result)1085 ret void1086}1087 1088attributes #0 = { nounwind "amdgpu-waves-per-eu"="10,10" }1089