360 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc --mtriple=loongarch64 -mattr=+d,-scq,-ld-seq-sa < %s | FileCheck %s --check-prefix=LA643; RUN: llc --mtriple=loongarch64 -mattr=+d,+scq,-ld-seq-sa --verify-machineinstrs < %s | FileCheck %s --check-prefixes=LA64-SCQ,NO-LD-SEQ-SA4; RUN: llc --mtriple=loongarch64 -mattr=+d,+scq,+ld-seq-sa --verify-machineinstrs < %s | FileCheck %s --check-prefixes=LA64-SCQ,LD-SEQ-SA5 6define void @cmpxchg_i128_acquire_acquire(ptr %ptr, i128 %cmp, i128 %val) nounwind {7; LA64-LABEL: cmpxchg_i128_acquire_acquire:8; LA64: # %bb.0:9; LA64-NEXT: addi.d $sp, $sp, -3210; LA64-NEXT: st.d $ra, $sp, 24 # 8-byte Folded Spill11; LA64-NEXT: move $a6, $a412; LA64-NEXT: st.d $a2, $sp, 813; LA64-NEXT: st.d $a1, $sp, 014; LA64-NEXT: addi.d $a1, $sp, 015; LA64-NEXT: ori $a4, $zero, 216; LA64-NEXT: ori $a5, $zero, 217; LA64-NEXT: move $a2, $a318; LA64-NEXT: move $a3, $a619; LA64-NEXT: pcaddu18i $ra, %call36(__atomic_compare_exchange_16)20; LA64-NEXT: jirl $ra, $ra, 021; LA64-NEXT: ld.d $ra, $sp, 24 # 8-byte Folded Reload22; LA64-NEXT: addi.d $sp, $sp, 3223; LA64-NEXT: ret24;25; LA64-SCQ-LABEL: cmpxchg_i128_acquire_acquire:26; LA64-SCQ: # %bb.0:27; LA64-SCQ-NEXT: .LBB0_1: # =>This Inner Loop Header: Depth=128; LA64-SCQ-NEXT: ll.d $a5, $a0, 029; LA64-SCQ-NEXT: dbar 2030; LA64-SCQ-NEXT: ld.d $a6, $a0, 831; LA64-SCQ-NEXT: bne $a5, $a1, .LBB0_332; LA64-SCQ-NEXT: bne $a6, $a2, .LBB0_333; LA64-SCQ-NEXT: # %bb.2: # in Loop: Header=BB0_1 Depth=134; LA64-SCQ-NEXT: move $a7, $a335; LA64-SCQ-NEXT: sc.q $a7, $a4, $a036; LA64-SCQ-NEXT: beq $a7, $zero, .LBB0_137; LA64-SCQ-NEXT: b .LBB0_438; LA64-SCQ-NEXT: .LBB0_3:39; LA64-SCQ-NEXT: dbar 2040; LA64-SCQ-NEXT: .LBB0_4:41; LA64-SCQ-NEXT: ret42 %res = cmpxchg ptr %ptr, i128 %cmp, i128 %val acquire acquire43 ret void44}45 46define void @cmpxchg_i128_acquire_monotonic(ptr %ptr, i128 %cmp, i128 %val) nounwind {47; LA64-LABEL: cmpxchg_i128_acquire_monotonic:48; LA64: # %bb.0:49; LA64-NEXT: addi.d $sp, $sp, -3250; LA64-NEXT: st.d $ra, $sp, 24 # 8-byte Folded Spill51; LA64-NEXT: move $a5, $a452; LA64-NEXT: st.d $a2, $sp, 853; LA64-NEXT: st.d $a1, $sp, 054; LA64-NEXT: addi.d $a1, $sp, 055; LA64-NEXT: ori $a4, $zero, 256; LA64-NEXT: move $a2, $a357; LA64-NEXT: move $a3, $a558; LA64-NEXT: move $a5, $zero59; LA64-NEXT: pcaddu18i $ra, %call36(__atomic_compare_exchange_16)60; LA64-NEXT: jirl $ra, $ra, 061; LA64-NEXT: ld.d $ra, $sp, 24 # 8-byte Folded Reload62; LA64-NEXT: addi.d $sp, $sp, 3263; LA64-NEXT: ret64;65; LA64-SCQ-LABEL: cmpxchg_i128_acquire_monotonic:66; LA64-SCQ: # %bb.0:67; LA64-SCQ-NEXT: .LBB1_1: # =>This Inner Loop Header: Depth=168; LA64-SCQ-NEXT: ll.d $a5, $a0, 069; LA64-SCQ-NEXT: dbar 2070; LA64-SCQ-NEXT: ld.d $a6, $a0, 871; LA64-SCQ-NEXT: bne $a5, $a1, .LBB1_372; LA64-SCQ-NEXT: bne $a6, $a2, .LBB1_373; LA64-SCQ-NEXT: # %bb.2: # in Loop: Header=BB1_1 Depth=174; LA64-SCQ-NEXT: move $a7, $a375; LA64-SCQ-NEXT: sc.q $a7, $a4, $a076; LA64-SCQ-NEXT: beq $a7, $zero, .LBB1_177; LA64-SCQ-NEXT: b .LBB1_478; LA64-SCQ-NEXT: .LBB1_3:79; LA64-SCQ-NEXT: dbar 2080; LA64-SCQ-NEXT: .LBB1_4:81; LA64-SCQ-NEXT: ret82 %res = cmpxchg ptr %ptr, i128 %cmp, i128 %val acquire monotonic83 ret void84}85 86define i128 @cmpxchg_i128_acquire_acquire_reti128(ptr %ptr, i128 %cmp, i128 %val) nounwind {87; LA64-LABEL: cmpxchg_i128_acquire_acquire_reti128:88; LA64: # %bb.0:89; LA64-NEXT: addi.d $sp, $sp, -3290; LA64-NEXT: st.d $ra, $sp, 24 # 8-byte Folded Spill91; LA64-NEXT: move $a6, $a492; LA64-NEXT: st.d $a2, $sp, 893; LA64-NEXT: st.d $a1, $sp, 094; LA64-NEXT: addi.d $a1, $sp, 095; LA64-NEXT: ori $a4, $zero, 296; LA64-NEXT: ori $a5, $zero, 297; LA64-NEXT: move $a2, $a398; LA64-NEXT: move $a3, $a699; LA64-NEXT: pcaddu18i $ra, %call36(__atomic_compare_exchange_16)100; LA64-NEXT: jirl $ra, $ra, 0101; LA64-NEXT: ld.d $a1, $sp, 8102; LA64-NEXT: ld.d $a0, $sp, 0103; LA64-NEXT: ld.d $ra, $sp, 24 # 8-byte Folded Reload104; LA64-NEXT: addi.d $sp, $sp, 32105; LA64-NEXT: ret106;107; LA64-SCQ-LABEL: cmpxchg_i128_acquire_acquire_reti128:108; LA64-SCQ: # %bb.0:109; LA64-SCQ-NEXT: .LBB2_1: # =>This Inner Loop Header: Depth=1110; LA64-SCQ-NEXT: ll.d $a5, $a0, 0111; LA64-SCQ-NEXT: dbar 20112; LA64-SCQ-NEXT: ld.d $a6, $a0, 8113; LA64-SCQ-NEXT: bne $a5, $a1, .LBB2_3114; LA64-SCQ-NEXT: bne $a6, $a2, .LBB2_3115; LA64-SCQ-NEXT: # %bb.2: # in Loop: Header=BB2_1 Depth=1116; LA64-SCQ-NEXT: move $a7, $a3117; LA64-SCQ-NEXT: sc.q $a7, $a4, $a0118; LA64-SCQ-NEXT: beq $a7, $zero, .LBB2_1119; LA64-SCQ-NEXT: b .LBB2_4120; LA64-SCQ-NEXT: .LBB2_3:121; LA64-SCQ-NEXT: dbar 20122; LA64-SCQ-NEXT: .LBB2_4:123; LA64-SCQ-NEXT: move $a0, $a5124; LA64-SCQ-NEXT: move $a1, $a6125; LA64-SCQ-NEXT: ret126 %tmp = cmpxchg ptr %ptr, i128 %cmp, i128 %val acquire acquire127 %res = extractvalue { i128, i1 } %tmp, 0128 ret i128 %res129}130 131define i1 @cmpxchg_i128_acquire_acquire_reti1(ptr %ptr, i128 %cmp, i128 %val) nounwind {132; LA64-LABEL: cmpxchg_i128_acquire_acquire_reti1:133; LA64: # %bb.0:134; LA64-NEXT: addi.d $sp, $sp, -32135; LA64-NEXT: st.d $ra, $sp, 24 # 8-byte Folded Spill136; LA64-NEXT: move $a6, $a4137; LA64-NEXT: st.d $a2, $sp, 8138; LA64-NEXT: st.d $a1, $sp, 0139; LA64-NEXT: addi.d $a1, $sp, 0140; LA64-NEXT: ori $a4, $zero, 2141; LA64-NEXT: ori $a5, $zero, 2142; LA64-NEXT: move $a2, $a3143; LA64-NEXT: move $a3, $a6144; LA64-NEXT: pcaddu18i $ra, %call36(__atomic_compare_exchange_16)145; LA64-NEXT: jirl $ra, $ra, 0146; LA64-NEXT: ld.d $ra, $sp, 24 # 8-byte Folded Reload147; LA64-NEXT: addi.d $sp, $sp, 32148; LA64-NEXT: ret149;150; LA64-SCQ-LABEL: cmpxchg_i128_acquire_acquire_reti1:151; LA64-SCQ: # %bb.0:152; LA64-SCQ-NEXT: .LBB3_1: # =>This Inner Loop Header: Depth=1153; LA64-SCQ-NEXT: ll.d $a5, $a0, 0154; LA64-SCQ-NEXT: dbar 20155; LA64-SCQ-NEXT: ld.d $a6, $a0, 8156; LA64-SCQ-NEXT: bne $a5, $a1, .LBB3_3157; LA64-SCQ-NEXT: bne $a6, $a2, .LBB3_3158; LA64-SCQ-NEXT: # %bb.2: # in Loop: Header=BB3_1 Depth=1159; LA64-SCQ-NEXT: move $a7, $a3160; LA64-SCQ-NEXT: sc.q $a7, $a4, $a0161; LA64-SCQ-NEXT: beq $a7, $zero, .LBB3_1162; LA64-SCQ-NEXT: b .LBB3_4163; LA64-SCQ-NEXT: .LBB3_3:164; LA64-SCQ-NEXT: dbar 20165; LA64-SCQ-NEXT: .LBB3_4:166; LA64-SCQ-NEXT: xor $a0, $a6, $a2167; LA64-SCQ-NEXT: xor $a1, $a5, $a1168; LA64-SCQ-NEXT: or $a0, $a1, $a0169; LA64-SCQ-NEXT: sltui $a0, $a0, 1170; LA64-SCQ-NEXT: ret171 %tmp = cmpxchg ptr %ptr, i128 %cmp, i128 %val acquire acquire172 %res = extractvalue { i128, i1 } %tmp, 1173 ret i1 %res174}175 176 177define void @cmpxchg_i128_monotonic_monotonic(ptr %ptr, i128 %cmp, i128 %val) nounwind {178; LA64-LABEL: cmpxchg_i128_monotonic_monotonic:179; LA64: # %bb.0:180; LA64-NEXT: addi.d $sp, $sp, -32181; LA64-NEXT: st.d $ra, $sp, 24 # 8-byte Folded Spill182; LA64-NEXT: st.d $a2, $sp, 8183; LA64-NEXT: st.d $a1, $sp, 0184; LA64-NEXT: addi.d $a1, $sp, 0185; LA64-NEXT: move $a2, $a3186; LA64-NEXT: move $a3, $a4187; LA64-NEXT: move $a4, $zero188; LA64-NEXT: move $a5, $zero189; LA64-NEXT: pcaddu18i $ra, %call36(__atomic_compare_exchange_16)190; LA64-NEXT: jirl $ra, $ra, 0191; LA64-NEXT: ld.d $ra, $sp, 24 # 8-byte Folded Reload192; LA64-NEXT: addi.d $sp, $sp, 32193; LA64-NEXT: ret194;195; NO-LD-SEQ-SA-LABEL: cmpxchg_i128_monotonic_monotonic:196; NO-LD-SEQ-SA: # %bb.0:197; NO-LD-SEQ-SA-NEXT: .LBB4_1: # =>This Inner Loop Header: Depth=1198; NO-LD-SEQ-SA-NEXT: ll.d $a5, $a0, 0199; NO-LD-SEQ-SA-NEXT: dbar 20200; NO-LD-SEQ-SA-NEXT: ld.d $a6, $a0, 8201; NO-LD-SEQ-SA-NEXT: bne $a5, $a1, .LBB4_3202; NO-LD-SEQ-SA-NEXT: bne $a6, $a2, .LBB4_3203; NO-LD-SEQ-SA-NEXT: # %bb.2: # in Loop: Header=BB4_1 Depth=1204; NO-LD-SEQ-SA-NEXT: move $a7, $a3205; NO-LD-SEQ-SA-NEXT: sc.q $a7, $a4, $a0206; NO-LD-SEQ-SA-NEXT: beq $a7, $zero, .LBB4_1207; NO-LD-SEQ-SA-NEXT: b .LBB4_4208; NO-LD-SEQ-SA-NEXT: .LBB4_3:209; NO-LD-SEQ-SA-NEXT: dbar 1792210; NO-LD-SEQ-SA-NEXT: .LBB4_4:211; NO-LD-SEQ-SA-NEXT: ret212;213; LD-SEQ-SA-LABEL: cmpxchg_i128_monotonic_monotonic:214; LD-SEQ-SA: # %bb.0:215; LD-SEQ-SA-NEXT: .LBB4_1: # =>This Inner Loop Header: Depth=1216; LD-SEQ-SA-NEXT: ll.d $a5, $a0, 0217; LD-SEQ-SA-NEXT: dbar 20218; LD-SEQ-SA-NEXT: ld.d $a6, $a0, 8219; LD-SEQ-SA-NEXT: bne $a5, $a1, .LBB4_3220; LD-SEQ-SA-NEXT: bne $a6, $a2, .LBB4_3221; LD-SEQ-SA-NEXT: # %bb.2: # in Loop: Header=BB4_1 Depth=1222; LD-SEQ-SA-NEXT: move $a7, $a3223; LD-SEQ-SA-NEXT: sc.q $a7, $a4, $a0224; LD-SEQ-SA-NEXT: beq $a7, $zero, .LBB4_1225; LD-SEQ-SA-NEXT: b .LBB4_4226; LD-SEQ-SA-NEXT: .LBB4_3:227; LD-SEQ-SA-NEXT: .LBB4_4:228; LD-SEQ-SA-NEXT: ret229 %res = cmpxchg ptr %ptr, i128 %cmp, i128 %val monotonic monotonic230 ret void231}232 233define i128 @cmpxchg_i128_monotonic_monotonic_reti128(ptr %ptr, i128 %cmp, i128 %val) nounwind {234; LA64-LABEL: cmpxchg_i128_monotonic_monotonic_reti128:235; LA64: # %bb.0:236; LA64-NEXT: addi.d $sp, $sp, -32237; LA64-NEXT: st.d $ra, $sp, 24 # 8-byte Folded Spill238; LA64-NEXT: st.d $a2, $sp, 8239; LA64-NEXT: st.d $a1, $sp, 0240; LA64-NEXT: addi.d $a1, $sp, 0241; LA64-NEXT: move $a2, $a3242; LA64-NEXT: move $a3, $a4243; LA64-NEXT: move $a4, $zero244; LA64-NEXT: move $a5, $zero245; LA64-NEXT: pcaddu18i $ra, %call36(__atomic_compare_exchange_16)246; LA64-NEXT: jirl $ra, $ra, 0247; LA64-NEXT: ld.d $a1, $sp, 8248; LA64-NEXT: ld.d $a0, $sp, 0249; LA64-NEXT: ld.d $ra, $sp, 24 # 8-byte Folded Reload250; LA64-NEXT: addi.d $sp, $sp, 32251; LA64-NEXT: ret252;253; NO-LD-SEQ-SA-LABEL: cmpxchg_i128_monotonic_monotonic_reti128:254; NO-LD-SEQ-SA: # %bb.0:255; NO-LD-SEQ-SA-NEXT: .LBB5_1: # =>This Inner Loop Header: Depth=1256; NO-LD-SEQ-SA-NEXT: ll.d $a5, $a0, 0257; NO-LD-SEQ-SA-NEXT: dbar 20258; NO-LD-SEQ-SA-NEXT: ld.d $a6, $a0, 8259; NO-LD-SEQ-SA-NEXT: bne $a5, $a1, .LBB5_3260; NO-LD-SEQ-SA-NEXT: bne $a6, $a2, .LBB5_3261; NO-LD-SEQ-SA-NEXT: # %bb.2: # in Loop: Header=BB5_1 Depth=1262; NO-LD-SEQ-SA-NEXT: move $a7, $a3263; NO-LD-SEQ-SA-NEXT: sc.q $a7, $a4, $a0264; NO-LD-SEQ-SA-NEXT: beq $a7, $zero, .LBB5_1265; NO-LD-SEQ-SA-NEXT: b .LBB5_4266; NO-LD-SEQ-SA-NEXT: .LBB5_3:267; NO-LD-SEQ-SA-NEXT: dbar 1792268; NO-LD-SEQ-SA-NEXT: .LBB5_4:269; NO-LD-SEQ-SA-NEXT: move $a0, $a5270; NO-LD-SEQ-SA-NEXT: move $a1, $a6271; NO-LD-SEQ-SA-NEXT: ret272;273; LD-SEQ-SA-LABEL: cmpxchg_i128_monotonic_monotonic_reti128:274; LD-SEQ-SA: # %bb.0:275; LD-SEQ-SA-NEXT: .LBB5_1: # =>This Inner Loop Header: Depth=1276; LD-SEQ-SA-NEXT: ll.d $a5, $a0, 0277; LD-SEQ-SA-NEXT: dbar 20278; LD-SEQ-SA-NEXT: ld.d $a6, $a0, 8279; LD-SEQ-SA-NEXT: bne $a5, $a1, .LBB5_3280; LD-SEQ-SA-NEXT: bne $a6, $a2, .LBB5_3281; LD-SEQ-SA-NEXT: # %bb.2: # in Loop: Header=BB5_1 Depth=1282; LD-SEQ-SA-NEXT: move $a7, $a3283; LD-SEQ-SA-NEXT: sc.q $a7, $a4, $a0284; LD-SEQ-SA-NEXT: beq $a7, $zero, .LBB5_1285; LD-SEQ-SA-NEXT: b .LBB5_4286; LD-SEQ-SA-NEXT: .LBB5_3:287; LD-SEQ-SA-NEXT: .LBB5_4:288; LD-SEQ-SA-NEXT: move $a0, $a5289; LD-SEQ-SA-NEXT: move $a1, $a6290; LD-SEQ-SA-NEXT: ret291 %tmp = cmpxchg ptr %ptr, i128 %cmp, i128 %val monotonic monotonic292 %res = extractvalue { i128, i1 } %tmp, 0293 ret i128 %res294}295 296define i1 @cmpxchg_i128_monotonic_monotonic_reti1(ptr %ptr, i128 %cmp, i128 %val) nounwind {297; LA64-LABEL: cmpxchg_i128_monotonic_monotonic_reti1:298; LA64: # %bb.0:299; LA64-NEXT: addi.d $sp, $sp, -32300; LA64-NEXT: st.d $ra, $sp, 24 # 8-byte Folded Spill301; LA64-NEXT: st.d $a2, $sp, 8302; LA64-NEXT: st.d $a1, $sp, 0303; LA64-NEXT: addi.d $a1, $sp, 0304; LA64-NEXT: move $a2, $a3305; LA64-NEXT: move $a3, $a4306; LA64-NEXT: move $a4, $zero307; LA64-NEXT: move $a5, $zero308; LA64-NEXT: pcaddu18i $ra, %call36(__atomic_compare_exchange_16)309; LA64-NEXT: jirl $ra, $ra, 0310; LA64-NEXT: ld.d $ra, $sp, 24 # 8-byte Folded Reload311; LA64-NEXT: addi.d $sp, $sp, 32312; LA64-NEXT: ret313;314; NO-LD-SEQ-SA-LABEL: cmpxchg_i128_monotonic_monotonic_reti1:315; NO-LD-SEQ-SA: # %bb.0:316; NO-LD-SEQ-SA-NEXT: .LBB6_1: # =>This Inner Loop Header: Depth=1317; NO-LD-SEQ-SA-NEXT: ll.d $a5, $a0, 0318; NO-LD-SEQ-SA-NEXT: dbar 20319; NO-LD-SEQ-SA-NEXT: ld.d $a6, $a0, 8320; NO-LD-SEQ-SA-NEXT: bne $a5, $a1, .LBB6_3321; NO-LD-SEQ-SA-NEXT: bne $a6, $a2, .LBB6_3322; NO-LD-SEQ-SA-NEXT: # %bb.2: # in Loop: Header=BB6_1 Depth=1323; NO-LD-SEQ-SA-NEXT: move $a7, $a3324; NO-LD-SEQ-SA-NEXT: sc.q $a7, $a4, $a0325; NO-LD-SEQ-SA-NEXT: beq $a7, $zero, .LBB6_1326; NO-LD-SEQ-SA-NEXT: b .LBB6_4327; NO-LD-SEQ-SA-NEXT: .LBB6_3:328; NO-LD-SEQ-SA-NEXT: dbar 1792329; NO-LD-SEQ-SA-NEXT: .LBB6_4:330; NO-LD-SEQ-SA-NEXT: xor $a0, $a6, $a2331; NO-LD-SEQ-SA-NEXT: xor $a1, $a5, $a1332; NO-LD-SEQ-SA-NEXT: or $a0, $a1, $a0333; NO-LD-SEQ-SA-NEXT: sltui $a0, $a0, 1334; NO-LD-SEQ-SA-NEXT: ret335;336; LD-SEQ-SA-LABEL: cmpxchg_i128_monotonic_monotonic_reti1:337; LD-SEQ-SA: # %bb.0:338; LD-SEQ-SA-NEXT: .LBB6_1: # =>This Inner Loop Header: Depth=1339; LD-SEQ-SA-NEXT: ll.d $a5, $a0, 0340; LD-SEQ-SA-NEXT: dbar 20341; LD-SEQ-SA-NEXT: ld.d $a6, $a0, 8342; LD-SEQ-SA-NEXT: bne $a5, $a1, .LBB6_3343; LD-SEQ-SA-NEXT: bne $a6, $a2, .LBB6_3344; LD-SEQ-SA-NEXT: # %bb.2: # in Loop: Header=BB6_1 Depth=1345; LD-SEQ-SA-NEXT: move $a7, $a3346; LD-SEQ-SA-NEXT: sc.q $a7, $a4, $a0347; LD-SEQ-SA-NEXT: beq $a7, $zero, .LBB6_1348; LD-SEQ-SA-NEXT: b .LBB6_4349; LD-SEQ-SA-NEXT: .LBB6_3:350; LD-SEQ-SA-NEXT: .LBB6_4:351; LD-SEQ-SA-NEXT: xor $a0, $a6, $a2352; LD-SEQ-SA-NEXT: xor $a1, $a5, $a1353; LD-SEQ-SA-NEXT: or $a0, $a1, $a0354; LD-SEQ-SA-NEXT: sltui $a0, $a0, 1355; LD-SEQ-SA-NEXT: ret356 %tmp = cmpxchg ptr %ptr, i128 %cmp, i128 %val monotonic monotonic357 %res = extractvalue { i128, i1 } %tmp, 1358 ret i1 %res359}360