475 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -O3 -mtriple=riscv32 -mattr=+a -verify-machineinstrs < %s \3; RUN: | FileCheck -check-prefixes=RV32 %s4; RUN: llc -O3 -mtriple=riscv64 -mattr=+a -verify-machineinstrs < %s \5; RUN: | FileCheck -check-prefixes=RV64 %s6 7define void @amoswap_w_discard(ptr %a, i32 %b) nounwind {8; RV32-LABEL: amoswap_w_discard:9; RV32: # %bb.0:10; RV32-NEXT: amoswap.w.aqrl zero, a1, (a0)11; RV32-NEXT: ret12;13; RV64-LABEL: amoswap_w_discard:14; RV64: # %bb.0:15; RV64-NEXT: amoswap.w.aqrl zero, a1, (a0)16; RV64-NEXT: ret17 %1 = atomicrmw xchg ptr %a, i32 %b seq_cst18 ret void19}20 21define void @amoswap_d_discard(ptr %a, i64 %b) nounwind {22; RV32-LABEL: amoswap_d_discard:23; RV32: # %bb.0:24; RV32-NEXT: addi sp, sp, -1625; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill26; RV32-NEXT: li a3, 527; RV32-NEXT: call __atomic_exchange_828; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload29; RV32-NEXT: addi sp, sp, 1630; RV32-NEXT: ret31;32; RV64-LABEL: amoswap_d_discard:33; RV64: # %bb.0:34; RV64-NEXT: amoswap.d.aqrl zero, a1, (a0)35; RV64-NEXT: ret36 %1 = atomicrmw xchg ptr %a, i64 %b seq_cst37 ret void38}39 40define void @amoadd_w_discard(ptr %a, i32 %b) nounwind {41; RV32-LABEL: amoadd_w_discard:42; RV32: # %bb.0:43; RV32-NEXT: amoadd.w.aqrl zero, a1, (a0)44; RV32-NEXT: ret45;46; RV64-LABEL: amoadd_w_discard:47; RV64: # %bb.0:48; RV64-NEXT: amoadd.w.aqrl zero, a1, (a0)49; RV64-NEXT: ret50 %1 = atomicrmw add ptr %a, i32 %b seq_cst51 ret void52}53 54define void @amoadd_d_discard(ptr %a, i64 %b) nounwind {55; RV32-LABEL: amoadd_d_discard:56; RV32: # %bb.0:57; RV32-NEXT: addi sp, sp, -1658; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill59; RV32-NEXT: li a3, 560; RV32-NEXT: call __atomic_fetch_add_861; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload62; RV32-NEXT: addi sp, sp, 1663; RV32-NEXT: ret64;65; RV64-LABEL: amoadd_d_discard:66; RV64: # %bb.0:67; RV64-NEXT: amoadd.d.aqrl zero, a1, (a0)68; RV64-NEXT: ret69 %1 = atomicrmw add ptr %a, i64 %b seq_cst70 ret void71}72 73define void @amoand_w_discard(ptr %a, i32 %b) nounwind {74; RV32-LABEL: amoand_w_discard:75; RV32: # %bb.0:76; RV32-NEXT: amoand.w.aqrl zero, a1, (a0)77; RV32-NEXT: ret78;79; RV64-LABEL: amoand_w_discard:80; RV64: # %bb.0:81; RV64-NEXT: amoand.w.aqrl zero, a1, (a0)82; RV64-NEXT: ret83 %1 = atomicrmw and ptr %a, i32 %b seq_cst84 ret void85}86 87define void @amoand_d_discard(ptr %a, i64 %b) nounwind {88; RV32-LABEL: amoand_d_discard:89; RV32: # %bb.0:90; RV32-NEXT: addi sp, sp, -1691; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill92; RV32-NEXT: li a3, 593; RV32-NEXT: call __atomic_fetch_and_894; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload95; RV32-NEXT: addi sp, sp, 1696; RV32-NEXT: ret97;98; RV64-LABEL: amoand_d_discard:99; RV64: # %bb.0:100; RV64-NEXT: amoand.d.aqrl zero, a1, (a0)101; RV64-NEXT: ret102 %1 = atomicrmw and ptr %a, i64 %b seq_cst103 ret void104}105 106define void @amoor_w_discard(ptr %a, i32 %b) nounwind {107; RV32-LABEL: amoor_w_discard:108; RV32: # %bb.0:109; RV32-NEXT: amoor.w.aqrl zero, a1, (a0)110; RV32-NEXT: ret111;112; RV64-LABEL: amoor_w_discard:113; RV64: # %bb.0:114; RV64-NEXT: amoor.w.aqrl zero, a1, (a0)115; RV64-NEXT: ret116 %1 = atomicrmw or ptr %a, i32 %b seq_cst117 ret void118}119 120define void @amoor_d_discard(ptr %a, i64 %b) nounwind {121; RV32-LABEL: amoor_d_discard:122; RV32: # %bb.0:123; RV32-NEXT: addi sp, sp, -16124; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill125; RV32-NEXT: li a3, 5126; RV32-NEXT: call __atomic_fetch_or_8127; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload128; RV32-NEXT: addi sp, sp, 16129; RV32-NEXT: ret130;131; RV64-LABEL: amoor_d_discard:132; RV64: # %bb.0:133; RV64-NEXT: amoor.d.aqrl zero, a1, (a0)134; RV64-NEXT: ret135 %1 = atomicrmw or ptr %a, i64 %b seq_cst136 ret void137}138 139define void @amoxor_w_discard(ptr %a, i32 %b) nounwind {140; RV32-LABEL: amoxor_w_discard:141; RV32: # %bb.0:142; RV32-NEXT: amoor.w.aqrl zero, a1, (a0)143; RV32-NEXT: ret144;145; RV64-LABEL: amoxor_w_discard:146; RV64: # %bb.0:147; RV64-NEXT: amoor.w.aqrl zero, a1, (a0)148; RV64-NEXT: ret149 %1 = atomicrmw or ptr %a, i32 %b seq_cst150 ret void151}152 153define void @amoxor_d_discard(ptr %a, i64 %b) nounwind {154; RV32-LABEL: amoxor_d_discard:155; RV32: # %bb.0:156; RV32-NEXT: addi sp, sp, -16157; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill158; RV32-NEXT: li a3, 5159; RV32-NEXT: call __atomic_fetch_or_8160; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload161; RV32-NEXT: addi sp, sp, 16162; RV32-NEXT: ret163;164; RV64-LABEL: amoxor_d_discard:165; RV64: # %bb.0:166; RV64-NEXT: amoor.d.aqrl zero, a1, (a0)167; RV64-NEXT: ret168 %1 = atomicrmw or ptr %a, i64 %b seq_cst169 ret void170}171 172define void @amomax_w_discard(ptr %a, i32 %b) nounwind {173; RV32-LABEL: amomax_w_discard:174; RV32: # %bb.0:175; RV32-NEXT: amomax.w.aqrl zero, a1, (a0)176; RV32-NEXT: ret177;178; RV64-LABEL: amomax_w_discard:179; RV64: # %bb.0:180; RV64-NEXT: amomax.w.aqrl zero, a1, (a0)181; RV64-NEXT: ret182 %1 = atomicrmw max ptr %a, i32 %b seq_cst183 ret void184}185 186define void @amomax_d_discard(ptr %a, i64 %b) nounwind {187; RV32-LABEL: amomax_d_discard:188; RV32: # %bb.0:189; RV32-NEXT: addi sp, sp, -32190; RV32-NEXT: sw ra, 28(sp) # 4-byte Folded Spill191; RV32-NEXT: sw s0, 24(sp) # 4-byte Folded Spill192; RV32-NEXT: sw s1, 20(sp) # 4-byte Folded Spill193; RV32-NEXT: sw s2, 16(sp) # 4-byte Folded Spill194; RV32-NEXT: mv s0, a2195; RV32-NEXT: mv s1, a0196; RV32-NEXT: lw a4, 0(a0)197; RV32-NEXT: lw a5, 4(a0)198; RV32-NEXT: mv s2, a1199; RV32-NEXT: j .LBB11_2200; RV32-NEXT: .LBB11_1: # %atomicrmw.start201; RV32-NEXT: # in Loop: Header=BB11_2 Depth=1202; RV32-NEXT: sw a4, 8(sp)203; RV32-NEXT: sw a5, 12(sp)204; RV32-NEXT: addi a1, sp, 8205; RV32-NEXT: li a4, 5206; RV32-NEXT: li a5, 5207; RV32-NEXT: mv a0, s1208; RV32-NEXT: call __atomic_compare_exchange_8209; RV32-NEXT: lw a4, 8(sp)210; RV32-NEXT: lw a5, 12(sp)211; RV32-NEXT: bnez a0, .LBB11_6212; RV32-NEXT: .LBB11_2: # %atomicrmw.start213; RV32-NEXT: # =>This Inner Loop Header: Depth=1214; RV32-NEXT: beq a5, s0, .LBB11_4215; RV32-NEXT: # %bb.3: # %atomicrmw.start216; RV32-NEXT: # in Loop: Header=BB11_2 Depth=1217; RV32-NEXT: slt a0, s0, a5218; RV32-NEXT: mv a2, a4219; RV32-NEXT: mv a3, a5220; RV32-NEXT: bnez a0, .LBB11_1221; RV32-NEXT: j .LBB11_5222; RV32-NEXT: .LBB11_4: # in Loop: Header=BB11_2 Depth=1223; RV32-NEXT: sltu a0, s2, a4224; RV32-NEXT: mv a2, a4225; RV32-NEXT: mv a3, a5226; RV32-NEXT: bnez a0, .LBB11_1227; RV32-NEXT: .LBB11_5: # %atomicrmw.start228; RV32-NEXT: # in Loop: Header=BB11_2 Depth=1229; RV32-NEXT: mv a2, s2230; RV32-NEXT: mv a3, s0231; RV32-NEXT: j .LBB11_1232; RV32-NEXT: .LBB11_6: # %atomicrmw.end233; RV32-NEXT: lw ra, 28(sp) # 4-byte Folded Reload234; RV32-NEXT: lw s0, 24(sp) # 4-byte Folded Reload235; RV32-NEXT: lw s1, 20(sp) # 4-byte Folded Reload236; RV32-NEXT: lw s2, 16(sp) # 4-byte Folded Reload237; RV32-NEXT: addi sp, sp, 32238; RV32-NEXT: ret239;240; RV64-LABEL: amomax_d_discard:241; RV64: # %bb.0:242; RV64-NEXT: amomax.d.aqrl zero, a1, (a0)243; RV64-NEXT: ret244 %1 = atomicrmw max ptr %a, i64 %b seq_cst245 ret void246}247 248define void @amomaxu_w_discard(ptr %a, i32 %b) nounwind {249; RV32-LABEL: amomaxu_w_discard:250; RV32: # %bb.0:251; RV32-NEXT: amomaxu.w.aqrl zero, a1, (a0)252; RV32-NEXT: ret253;254; RV64-LABEL: amomaxu_w_discard:255; RV64: # %bb.0:256; RV64-NEXT: amomaxu.w.aqrl zero, a1, (a0)257; RV64-NEXT: ret258 %1 = atomicrmw umax ptr %a, i32 %b seq_cst259 ret void260}261 262define void @amomaxu_d_discard(ptr %a, i64 %b) nounwind {263; RV32-LABEL: amomaxu_d_discard:264; RV32: # %bb.0:265; RV32-NEXT: addi sp, sp, -32266; RV32-NEXT: sw ra, 28(sp) # 4-byte Folded Spill267; RV32-NEXT: sw s0, 24(sp) # 4-byte Folded Spill268; RV32-NEXT: sw s1, 20(sp) # 4-byte Folded Spill269; RV32-NEXT: sw s2, 16(sp) # 4-byte Folded Spill270; RV32-NEXT: mv s0, a2271; RV32-NEXT: mv s1, a0272; RV32-NEXT: lw a4, 0(a0)273; RV32-NEXT: lw a5, 4(a0)274; RV32-NEXT: mv s2, a1275; RV32-NEXT: j .LBB13_2276; RV32-NEXT: .LBB13_1: # %atomicrmw.start277; RV32-NEXT: # in Loop: Header=BB13_2 Depth=1278; RV32-NEXT: sw a4, 8(sp)279; RV32-NEXT: sw a5, 12(sp)280; RV32-NEXT: addi a1, sp, 8281; RV32-NEXT: li a4, 5282; RV32-NEXT: li a5, 5283; RV32-NEXT: mv a0, s1284; RV32-NEXT: call __atomic_compare_exchange_8285; RV32-NEXT: lw a4, 8(sp)286; RV32-NEXT: lw a5, 12(sp)287; RV32-NEXT: bnez a0, .LBB13_6288; RV32-NEXT: .LBB13_2: # %atomicrmw.start289; RV32-NEXT: # =>This Inner Loop Header: Depth=1290; RV32-NEXT: beq a5, s0, .LBB13_4291; RV32-NEXT: # %bb.3: # %atomicrmw.start292; RV32-NEXT: # in Loop: Header=BB13_2 Depth=1293; RV32-NEXT: sltu a0, s0, a5294; RV32-NEXT: mv a2, a4295; RV32-NEXT: mv a3, a5296; RV32-NEXT: bnez a0, .LBB13_1297; RV32-NEXT: j .LBB13_5298; RV32-NEXT: .LBB13_4: # in Loop: Header=BB13_2 Depth=1299; RV32-NEXT: sltu a0, s2, a4300; RV32-NEXT: mv a2, a4301; RV32-NEXT: mv a3, a5302; RV32-NEXT: bnez a0, .LBB13_1303; RV32-NEXT: .LBB13_5: # %atomicrmw.start304; RV32-NEXT: # in Loop: Header=BB13_2 Depth=1305; RV32-NEXT: mv a2, s2306; RV32-NEXT: mv a3, s0307; RV32-NEXT: j .LBB13_1308; RV32-NEXT: .LBB13_6: # %atomicrmw.end309; RV32-NEXT: lw ra, 28(sp) # 4-byte Folded Reload310; RV32-NEXT: lw s0, 24(sp) # 4-byte Folded Reload311; RV32-NEXT: lw s1, 20(sp) # 4-byte Folded Reload312; RV32-NEXT: lw s2, 16(sp) # 4-byte Folded Reload313; RV32-NEXT: addi sp, sp, 32314; RV32-NEXT: ret315;316; RV64-LABEL: amomaxu_d_discard:317; RV64: # %bb.0:318; RV64-NEXT: amomaxu.d.aqrl zero, a1, (a0)319; RV64-NEXT: ret320 %1 = atomicrmw umax ptr %a, i64 %b seq_cst321 ret void322}323 324define void @amomin_w_discard(ptr %a, i32 %b) nounwind {325; RV32-LABEL: amomin_w_discard:326; RV32: # %bb.0:327; RV32-NEXT: amomin.w.aqrl zero, a1, (a0)328; RV32-NEXT: ret329;330; RV64-LABEL: amomin_w_discard:331; RV64: # %bb.0:332; RV64-NEXT: amomin.w.aqrl zero, a1, (a0)333; RV64-NEXT: ret334 %1 = atomicrmw min ptr %a, i32 %b seq_cst335 ret void336}337 338define void @amomin_d_discard(ptr %a, i64 %b) nounwind {339; RV32-LABEL: amomin_d_discard:340; RV32: # %bb.0:341; RV32-NEXT: addi sp, sp, -32342; RV32-NEXT: sw ra, 28(sp) # 4-byte Folded Spill343; RV32-NEXT: sw s0, 24(sp) # 4-byte Folded Spill344; RV32-NEXT: sw s1, 20(sp) # 4-byte Folded Spill345; RV32-NEXT: sw s2, 16(sp) # 4-byte Folded Spill346; RV32-NEXT: mv s0, a2347; RV32-NEXT: mv s1, a0348; RV32-NEXT: lw a4, 0(a0)349; RV32-NEXT: lw a5, 4(a0)350; RV32-NEXT: mv s2, a1351; RV32-NEXT: j .LBB15_2352; RV32-NEXT: .LBB15_1: # %atomicrmw.start353; RV32-NEXT: # in Loop: Header=BB15_2 Depth=1354; RV32-NEXT: sw a4, 8(sp)355; RV32-NEXT: sw a5, 12(sp)356; RV32-NEXT: addi a1, sp, 8357; RV32-NEXT: li a4, 5358; RV32-NEXT: li a5, 5359; RV32-NEXT: mv a0, s1360; RV32-NEXT: call __atomic_compare_exchange_8361; RV32-NEXT: lw a4, 8(sp)362; RV32-NEXT: lw a5, 12(sp)363; RV32-NEXT: bnez a0, .LBB15_6364; RV32-NEXT: .LBB15_2: # %atomicrmw.start365; RV32-NEXT: # =>This Inner Loop Header: Depth=1366; RV32-NEXT: beq a5, s0, .LBB15_4367; RV32-NEXT: # %bb.3: # %atomicrmw.start368; RV32-NEXT: # in Loop: Header=BB15_2 Depth=1369; RV32-NEXT: slt a0, s0, a5370; RV32-NEXT: mv a2, a4371; RV32-NEXT: mv a3, a5372; RV32-NEXT: beqz a0, .LBB15_1373; RV32-NEXT: j .LBB15_5374; RV32-NEXT: .LBB15_4: # in Loop: Header=BB15_2 Depth=1375; RV32-NEXT: sltu a0, s2, a4376; RV32-NEXT: mv a2, a4377; RV32-NEXT: mv a3, a5378; RV32-NEXT: beqz a0, .LBB15_1379; RV32-NEXT: .LBB15_5: # %atomicrmw.start380; RV32-NEXT: # in Loop: Header=BB15_2 Depth=1381; RV32-NEXT: mv a2, s2382; RV32-NEXT: mv a3, s0383; RV32-NEXT: j .LBB15_1384; RV32-NEXT: .LBB15_6: # %atomicrmw.end385; RV32-NEXT: lw ra, 28(sp) # 4-byte Folded Reload386; RV32-NEXT: lw s0, 24(sp) # 4-byte Folded Reload387; RV32-NEXT: lw s1, 20(sp) # 4-byte Folded Reload388; RV32-NEXT: lw s2, 16(sp) # 4-byte Folded Reload389; RV32-NEXT: addi sp, sp, 32390; RV32-NEXT: ret391;392; RV64-LABEL: amomin_d_discard:393; RV64: # %bb.0:394; RV64-NEXT: amomin.d.aqrl zero, a1, (a0)395; RV64-NEXT: ret396 %1 = atomicrmw min ptr %a, i64 %b seq_cst397 ret void398}399 400define void @amominu_w_discard(ptr %a, i32 %b) nounwind {401; RV32-LABEL: amominu_w_discard:402; RV32: # %bb.0:403; RV32-NEXT: amominu.w.aqrl zero, a1, (a0)404; RV32-NEXT: ret405;406; RV64-LABEL: amominu_w_discard:407; RV64: # %bb.0:408; RV64-NEXT: amominu.w.aqrl zero, a1, (a0)409; RV64-NEXT: ret410 %1 = atomicrmw umin ptr %a, i32 %b seq_cst411 ret void412}413 414define void @amominu_d_discard(ptr %a, i64 %b) nounwind {415; RV32-LABEL: amominu_d_discard:416; RV32: # %bb.0:417; RV32-NEXT: addi sp, sp, -32418; RV32-NEXT: sw ra, 28(sp) # 4-byte Folded Spill419; RV32-NEXT: sw s0, 24(sp) # 4-byte Folded Spill420; RV32-NEXT: sw s1, 20(sp) # 4-byte Folded Spill421; RV32-NEXT: sw s2, 16(sp) # 4-byte Folded Spill422; RV32-NEXT: mv s0, a2423; RV32-NEXT: mv s1, a0424; RV32-NEXT: lw a4, 0(a0)425; RV32-NEXT: lw a5, 4(a0)426; RV32-NEXT: mv s2, a1427; RV32-NEXT: j .LBB17_2428; RV32-NEXT: .LBB17_1: # %atomicrmw.start429; RV32-NEXT: # in Loop: Header=BB17_2 Depth=1430; RV32-NEXT: sw a4, 8(sp)431; RV32-NEXT: sw a5, 12(sp)432; RV32-NEXT: addi a1, sp, 8433; RV32-NEXT: li a4, 5434; RV32-NEXT: li a5, 5435; RV32-NEXT: mv a0, s1436; RV32-NEXT: call __atomic_compare_exchange_8437; RV32-NEXT: lw a4, 8(sp)438; RV32-NEXT: lw a5, 12(sp)439; RV32-NEXT: bnez a0, .LBB17_6440; RV32-NEXT: .LBB17_2: # %atomicrmw.start441; RV32-NEXT: # =>This Inner Loop Header: Depth=1442; RV32-NEXT: beq a5, s0, .LBB17_4443; RV32-NEXT: # %bb.3: # %atomicrmw.start444; RV32-NEXT: # in Loop: Header=BB17_2 Depth=1445; RV32-NEXT: sltu a0, s0, a5446; RV32-NEXT: mv a2, a4447; RV32-NEXT: mv a3, a5448; RV32-NEXT: beqz a0, .LBB17_1449; RV32-NEXT: j .LBB17_5450; RV32-NEXT: .LBB17_4: # in Loop: Header=BB17_2 Depth=1451; RV32-NEXT: sltu a0, s2, a4452; RV32-NEXT: mv a2, a4453; RV32-NEXT: mv a3, a5454; RV32-NEXT: beqz a0, .LBB17_1455; RV32-NEXT: .LBB17_5: # %atomicrmw.start456; RV32-NEXT: # in Loop: Header=BB17_2 Depth=1457; RV32-NEXT: mv a2, s2458; RV32-NEXT: mv a3, s0459; RV32-NEXT: j .LBB17_1460; RV32-NEXT: .LBB17_6: # %atomicrmw.end461; RV32-NEXT: lw ra, 28(sp) # 4-byte Folded Reload462; RV32-NEXT: lw s0, 24(sp) # 4-byte Folded Reload463; RV32-NEXT: lw s1, 20(sp) # 4-byte Folded Reload464; RV32-NEXT: lw s2, 16(sp) # 4-byte Folded Reload465; RV32-NEXT: addi sp, sp, 32466; RV32-NEXT: ret467;468; RV64-LABEL: amominu_d_discard:469; RV64: # %bb.0:470; RV64-NEXT: amominu.d.aqrl zero, a1, (a0)471; RV64-NEXT: ret472 %1 = atomicrmw umin ptr %a, i64 %b seq_cst473 ret void474}475