643 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=riscv32 -mattr=+b,+zalrsc -verify-machineinstrs < %s \3; RUN: | FileCheck -check-prefixes=RV32IB-COMMON,RV32IB-ZALRSC %s4; RUN: llc -mtriple=riscv32 -mattr=+b,+zalrsc,+permissive-zalrsc -verify-machineinstrs < %s \5; RUN: | FileCheck -check-prefixes=RV32IB-COMMON,RV32IB-ZALRSC-PERM %s6; RUN: llc -mtriple=riscv32 -mattr=+b,+zalrsc,+permissive-zalrsc,+a -verify-machineinstrs < %s \7; RUN: | FileCheck -check-prefixes=RV32IB-COMMON,RV32IAB %s8;9; RUN: llc -mtriple=riscv64 -mattr=+b,+zalrsc -verify-machineinstrs < %s \10; RUN: | FileCheck -check-prefixes=RV64IB-ZALRSC %s11; RUN: llc -mtriple=riscv64 -mattr=+b,+zalrsc,+permissive-zalrsc -verify-machineinstrs < %s \12; RUN: | FileCheck -check-prefixes=RV64IB-ZALRSC-PERM %s13; RUN: llc -mtriple=riscv64 -mattr=+b,+zalrsc,+permissive-zalrsc,+a -verify-machineinstrs < %s \14; RUN: | FileCheck -check-prefixes=RV64IAB %s15 16define i32 @atomicrmw_max_i32_seq_cst(ptr %a, i32 %b) nounwind {17; RV32IB-ZALRSC-LABEL: atomicrmw_max_i32_seq_cst:18; RV32IB-ZALRSC: # %bb.0:19; RV32IB-ZALRSC-NEXT: .LBB0_1: # =>This Inner Loop Header: Depth=120; RV32IB-ZALRSC-NEXT: lr.w.aqrl a2, (a0)21; RV32IB-ZALRSC-NEXT: mv a3, a222; RV32IB-ZALRSC-NEXT: bge a3, a1, .LBB0_323; RV32IB-ZALRSC-NEXT: # %bb.2: # in Loop: Header=BB0_1 Depth=124; RV32IB-ZALRSC-NEXT: mv a3, a125; RV32IB-ZALRSC-NEXT: .LBB0_3: # in Loop: Header=BB0_1 Depth=126; RV32IB-ZALRSC-NEXT: sc.w.rl a3, a3, (a0)27; RV32IB-ZALRSC-NEXT: bnez a3, .LBB0_128; RV32IB-ZALRSC-NEXT: # %bb.4:29; RV32IB-ZALRSC-NEXT: mv a0, a230; RV32IB-ZALRSC-NEXT: ret31;32; RV32IB-ZALRSC-PERM-LABEL: atomicrmw_max_i32_seq_cst:33; RV32IB-ZALRSC-PERM: # %bb.0:34; RV32IB-ZALRSC-PERM-NEXT: .LBB0_1: # =>This Inner Loop Header: Depth=135; RV32IB-ZALRSC-PERM-NEXT: lr.w.aqrl a2, (a0)36; RV32IB-ZALRSC-PERM-NEXT: max a3, a2, a137; RV32IB-ZALRSC-PERM-NEXT: sc.w.rl a3, a3, (a0)38; RV32IB-ZALRSC-PERM-NEXT: bnez a3, .LBB0_139; RV32IB-ZALRSC-PERM-NEXT: # %bb.2:40; RV32IB-ZALRSC-PERM-NEXT: mv a0, a241; RV32IB-ZALRSC-PERM-NEXT: ret42;43; RV32IAB-LABEL: atomicrmw_max_i32_seq_cst:44; RV32IAB: # %bb.0:45; RV32IAB-NEXT: amomax.w.aqrl a0, a1, (a0)46; RV32IAB-NEXT: ret47;48; RV64IB-ZALRSC-LABEL: atomicrmw_max_i32_seq_cst:49; RV64IB-ZALRSC: # %bb.0:50; RV64IB-ZALRSC-NEXT: sext.w a2, a151; RV64IB-ZALRSC-NEXT: .LBB0_1: # =>This Inner Loop Header: Depth=152; RV64IB-ZALRSC-NEXT: lr.w.aqrl a1, (a0)53; RV64IB-ZALRSC-NEXT: mv a3, a154; RV64IB-ZALRSC-NEXT: bge a3, a2, .LBB0_355; RV64IB-ZALRSC-NEXT: # %bb.2: # in Loop: Header=BB0_1 Depth=156; RV64IB-ZALRSC-NEXT: mv a3, a257; RV64IB-ZALRSC-NEXT: .LBB0_3: # in Loop: Header=BB0_1 Depth=158; RV64IB-ZALRSC-NEXT: sc.w.rl a3, a3, (a0)59; RV64IB-ZALRSC-NEXT: bnez a3, .LBB0_160; RV64IB-ZALRSC-NEXT: # %bb.4:61; RV64IB-ZALRSC-NEXT: mv a0, a162; RV64IB-ZALRSC-NEXT: ret63;64; RV64IB-ZALRSC-PERM-LABEL: atomicrmw_max_i32_seq_cst:65; RV64IB-ZALRSC-PERM: # %bb.0:66; RV64IB-ZALRSC-PERM-NEXT: sext.w a2, a167; RV64IB-ZALRSC-PERM-NEXT: .LBB0_1: # =>This Inner Loop Header: Depth=168; RV64IB-ZALRSC-PERM-NEXT: lr.w.aqrl a1, (a0)69; RV64IB-ZALRSC-PERM-NEXT: max a3, a1, a270; RV64IB-ZALRSC-PERM-NEXT: sc.w.rl a3, a3, (a0)71; RV64IB-ZALRSC-PERM-NEXT: bnez a3, .LBB0_172; RV64IB-ZALRSC-PERM-NEXT: # %bb.2:73; RV64IB-ZALRSC-PERM-NEXT: mv a0, a174; RV64IB-ZALRSC-PERM-NEXT: ret75;76; RV64IAB-LABEL: atomicrmw_max_i32_seq_cst:77; RV64IAB: # %bb.0:78; RV64IAB-NEXT: amomax.w.aqrl a0, a1, (a0)79; RV64IAB-NEXT: ret80 %1 = atomicrmw max ptr %a, i32 %b seq_cst81 ret i32 %182}83 84define i32 @atomicrmw_min_i32_seq_cst(ptr %a, i32 %b) nounwind {85; RV32IB-ZALRSC-LABEL: atomicrmw_min_i32_seq_cst:86; RV32IB-ZALRSC: # %bb.0:87; RV32IB-ZALRSC-NEXT: .LBB1_1: # =>This Inner Loop Header: Depth=188; RV32IB-ZALRSC-NEXT: lr.w.aqrl a2, (a0)89; RV32IB-ZALRSC-NEXT: mv a3, a290; RV32IB-ZALRSC-NEXT: bge a1, a3, .LBB1_391; RV32IB-ZALRSC-NEXT: # %bb.2: # in Loop: Header=BB1_1 Depth=192; RV32IB-ZALRSC-NEXT: mv a3, a193; RV32IB-ZALRSC-NEXT: .LBB1_3: # in Loop: Header=BB1_1 Depth=194; RV32IB-ZALRSC-NEXT: sc.w.rl a3, a3, (a0)95; RV32IB-ZALRSC-NEXT: bnez a3, .LBB1_196; RV32IB-ZALRSC-NEXT: # %bb.4:97; RV32IB-ZALRSC-NEXT: mv a0, a298; RV32IB-ZALRSC-NEXT: ret99;100; RV32IB-ZALRSC-PERM-LABEL: atomicrmw_min_i32_seq_cst:101; RV32IB-ZALRSC-PERM: # %bb.0:102; RV32IB-ZALRSC-PERM-NEXT: .LBB1_1: # =>This Inner Loop Header: Depth=1103; RV32IB-ZALRSC-PERM-NEXT: lr.w.aqrl a2, (a0)104; RV32IB-ZALRSC-PERM-NEXT: min a3, a2, a1105; RV32IB-ZALRSC-PERM-NEXT: sc.w.rl a3, a3, (a0)106; RV32IB-ZALRSC-PERM-NEXT: bnez a3, .LBB1_1107; RV32IB-ZALRSC-PERM-NEXT: # %bb.2:108; RV32IB-ZALRSC-PERM-NEXT: mv a0, a2109; RV32IB-ZALRSC-PERM-NEXT: ret110;111; RV32IAB-LABEL: atomicrmw_min_i32_seq_cst:112; RV32IAB: # %bb.0:113; RV32IAB-NEXT: amomin.w.aqrl a0, a1, (a0)114; RV32IAB-NEXT: ret115;116; RV64IB-ZALRSC-LABEL: atomicrmw_min_i32_seq_cst:117; RV64IB-ZALRSC: # %bb.0:118; RV64IB-ZALRSC-NEXT: sext.w a2, a1119; RV64IB-ZALRSC-NEXT: .LBB1_1: # =>This Inner Loop Header: Depth=1120; RV64IB-ZALRSC-NEXT: lr.w.aqrl a1, (a0)121; RV64IB-ZALRSC-NEXT: mv a3, a1122; RV64IB-ZALRSC-NEXT: bge a2, a3, .LBB1_3123; RV64IB-ZALRSC-NEXT: # %bb.2: # in Loop: Header=BB1_1 Depth=1124; RV64IB-ZALRSC-NEXT: mv a3, a2125; RV64IB-ZALRSC-NEXT: .LBB1_3: # in Loop: Header=BB1_1 Depth=1126; RV64IB-ZALRSC-NEXT: sc.w.rl a3, a3, (a0)127; RV64IB-ZALRSC-NEXT: bnez a3, .LBB1_1128; RV64IB-ZALRSC-NEXT: # %bb.4:129; RV64IB-ZALRSC-NEXT: mv a0, a1130; RV64IB-ZALRSC-NEXT: ret131;132; RV64IB-ZALRSC-PERM-LABEL: atomicrmw_min_i32_seq_cst:133; RV64IB-ZALRSC-PERM: # %bb.0:134; RV64IB-ZALRSC-PERM-NEXT: sext.w a2, a1135; RV64IB-ZALRSC-PERM-NEXT: .LBB1_1: # =>This Inner Loop Header: Depth=1136; RV64IB-ZALRSC-PERM-NEXT: lr.w.aqrl a1, (a0)137; RV64IB-ZALRSC-PERM-NEXT: min a3, a1, a2138; RV64IB-ZALRSC-PERM-NEXT: sc.w.rl a3, a3, (a0)139; RV64IB-ZALRSC-PERM-NEXT: bnez a3, .LBB1_1140; RV64IB-ZALRSC-PERM-NEXT: # %bb.2:141; RV64IB-ZALRSC-PERM-NEXT: mv a0, a1142; RV64IB-ZALRSC-PERM-NEXT: ret143;144; RV64IAB-LABEL: atomicrmw_min_i32_seq_cst:145; RV64IAB: # %bb.0:146; RV64IAB-NEXT: amomin.w.aqrl a0, a1, (a0)147; RV64IAB-NEXT: ret148 %1 = atomicrmw min ptr %a, i32 %b seq_cst149 ret i32 %1150}151 152define i32 @atomicrmw_umax_i32_seq_cst(ptr %a, i32 %b) nounwind {153; RV32IB-ZALRSC-LABEL: atomicrmw_umax_i32_seq_cst:154; RV32IB-ZALRSC: # %bb.0:155; RV32IB-ZALRSC-NEXT: .LBB2_1: # =>This Inner Loop Header: Depth=1156; RV32IB-ZALRSC-NEXT: lr.w.aqrl a2, (a0)157; RV32IB-ZALRSC-NEXT: mv a3, a2158; RV32IB-ZALRSC-NEXT: bgeu a3, a1, .LBB2_3159; RV32IB-ZALRSC-NEXT: # %bb.2: # in Loop: Header=BB2_1 Depth=1160; RV32IB-ZALRSC-NEXT: mv a3, a1161; RV32IB-ZALRSC-NEXT: .LBB2_3: # in Loop: Header=BB2_1 Depth=1162; RV32IB-ZALRSC-NEXT: sc.w.rl a3, a3, (a0)163; RV32IB-ZALRSC-NEXT: bnez a3, .LBB2_1164; RV32IB-ZALRSC-NEXT: # %bb.4:165; RV32IB-ZALRSC-NEXT: mv a0, a2166; RV32IB-ZALRSC-NEXT: ret167;168; RV32IB-ZALRSC-PERM-LABEL: atomicrmw_umax_i32_seq_cst:169; RV32IB-ZALRSC-PERM: # %bb.0:170; RV32IB-ZALRSC-PERM-NEXT: .LBB2_1: # =>This Inner Loop Header: Depth=1171; RV32IB-ZALRSC-PERM-NEXT: lr.w.aqrl a2, (a0)172; RV32IB-ZALRSC-PERM-NEXT: maxu a3, a2, a1173; RV32IB-ZALRSC-PERM-NEXT: sc.w.rl a3, a3, (a0)174; RV32IB-ZALRSC-PERM-NEXT: bnez a3, .LBB2_1175; RV32IB-ZALRSC-PERM-NEXT: # %bb.2:176; RV32IB-ZALRSC-PERM-NEXT: mv a0, a2177; RV32IB-ZALRSC-PERM-NEXT: ret178;179; RV32IAB-LABEL: atomicrmw_umax_i32_seq_cst:180; RV32IAB: # %bb.0:181; RV32IAB-NEXT: amomaxu.w.aqrl a0, a1, (a0)182; RV32IAB-NEXT: ret183;184; RV64IB-ZALRSC-LABEL: atomicrmw_umax_i32_seq_cst:185; RV64IB-ZALRSC: # %bb.0:186; RV64IB-ZALRSC-NEXT: sext.w a2, a1187; RV64IB-ZALRSC-NEXT: .LBB2_1: # =>This Inner Loop Header: Depth=1188; RV64IB-ZALRSC-NEXT: lr.w.aqrl a1, (a0)189; RV64IB-ZALRSC-NEXT: mv a3, a1190; RV64IB-ZALRSC-NEXT: bgeu a3, a2, .LBB2_3191; RV64IB-ZALRSC-NEXT: # %bb.2: # in Loop: Header=BB2_1 Depth=1192; RV64IB-ZALRSC-NEXT: mv a3, a2193; RV64IB-ZALRSC-NEXT: .LBB2_3: # in Loop: Header=BB2_1 Depth=1194; RV64IB-ZALRSC-NEXT: sc.w.rl a3, a3, (a0)195; RV64IB-ZALRSC-NEXT: bnez a3, .LBB2_1196; RV64IB-ZALRSC-NEXT: # %bb.4:197; RV64IB-ZALRSC-NEXT: mv a0, a1198; RV64IB-ZALRSC-NEXT: ret199;200; RV64IB-ZALRSC-PERM-LABEL: atomicrmw_umax_i32_seq_cst:201; RV64IB-ZALRSC-PERM: # %bb.0:202; RV64IB-ZALRSC-PERM-NEXT: sext.w a2, a1203; RV64IB-ZALRSC-PERM-NEXT: .LBB2_1: # =>This Inner Loop Header: Depth=1204; RV64IB-ZALRSC-PERM-NEXT: lr.w.aqrl a1, (a0)205; RV64IB-ZALRSC-PERM-NEXT: maxu a3, a1, a2206; RV64IB-ZALRSC-PERM-NEXT: sc.w.rl a3, a3, (a0)207; RV64IB-ZALRSC-PERM-NEXT: bnez a3, .LBB2_1208; RV64IB-ZALRSC-PERM-NEXT: # %bb.2:209; RV64IB-ZALRSC-PERM-NEXT: mv a0, a1210; RV64IB-ZALRSC-PERM-NEXT: ret211;212; RV64IAB-LABEL: atomicrmw_umax_i32_seq_cst:213; RV64IAB: # %bb.0:214; RV64IAB-NEXT: amomaxu.w.aqrl a0, a1, (a0)215; RV64IAB-NEXT: ret216 %1 = atomicrmw umax ptr %a, i32 %b seq_cst217 ret i32 %1218}219 220define i32 @atomicrmw_umin_i32_seq_cst(ptr %a, i32 %b) nounwind {221; RV32IB-ZALRSC-LABEL: atomicrmw_umin_i32_seq_cst:222; RV32IB-ZALRSC: # %bb.0:223; RV32IB-ZALRSC-NEXT: .LBB3_1: # =>This Inner Loop Header: Depth=1224; RV32IB-ZALRSC-NEXT: lr.w.aqrl a2, (a0)225; RV32IB-ZALRSC-NEXT: mv a3, a2226; RV32IB-ZALRSC-NEXT: bgeu a1, a3, .LBB3_3227; RV32IB-ZALRSC-NEXT: # %bb.2: # in Loop: Header=BB3_1 Depth=1228; RV32IB-ZALRSC-NEXT: mv a3, a1229; RV32IB-ZALRSC-NEXT: .LBB3_3: # in Loop: Header=BB3_1 Depth=1230; RV32IB-ZALRSC-NEXT: sc.w.rl a3, a3, (a0)231; RV32IB-ZALRSC-NEXT: bnez a3, .LBB3_1232; RV32IB-ZALRSC-NEXT: # %bb.4:233; RV32IB-ZALRSC-NEXT: mv a0, a2234; RV32IB-ZALRSC-NEXT: ret235;236; RV32IB-ZALRSC-PERM-LABEL: atomicrmw_umin_i32_seq_cst:237; RV32IB-ZALRSC-PERM: # %bb.0:238; RV32IB-ZALRSC-PERM-NEXT: .LBB3_1: # =>This Inner Loop Header: Depth=1239; RV32IB-ZALRSC-PERM-NEXT: lr.w.aqrl a2, (a0)240; RV32IB-ZALRSC-PERM-NEXT: minu a3, a2, a1241; RV32IB-ZALRSC-PERM-NEXT: sc.w.rl a3, a3, (a0)242; RV32IB-ZALRSC-PERM-NEXT: bnez a3, .LBB3_1243; RV32IB-ZALRSC-PERM-NEXT: # %bb.2:244; RV32IB-ZALRSC-PERM-NEXT: mv a0, a2245; RV32IB-ZALRSC-PERM-NEXT: ret246;247; RV32IAB-LABEL: atomicrmw_umin_i32_seq_cst:248; RV32IAB: # %bb.0:249; RV32IAB-NEXT: amominu.w.aqrl a0, a1, (a0)250; RV32IAB-NEXT: ret251;252; RV64IB-ZALRSC-LABEL: atomicrmw_umin_i32_seq_cst:253; RV64IB-ZALRSC: # %bb.0:254; RV64IB-ZALRSC-NEXT: sext.w a2, a1255; RV64IB-ZALRSC-NEXT: .LBB3_1: # =>This Inner Loop Header: Depth=1256; RV64IB-ZALRSC-NEXT: lr.w.aqrl a1, (a0)257; RV64IB-ZALRSC-NEXT: mv a3, a1258; RV64IB-ZALRSC-NEXT: bgeu a2, a3, .LBB3_3259; RV64IB-ZALRSC-NEXT: # %bb.2: # in Loop: Header=BB3_1 Depth=1260; RV64IB-ZALRSC-NEXT: mv a3, a2261; RV64IB-ZALRSC-NEXT: .LBB3_3: # in Loop: Header=BB3_1 Depth=1262; RV64IB-ZALRSC-NEXT: sc.w.rl a3, a3, (a0)263; RV64IB-ZALRSC-NEXT: bnez a3, .LBB3_1264; RV64IB-ZALRSC-NEXT: # %bb.4:265; RV64IB-ZALRSC-NEXT: mv a0, a1266; RV64IB-ZALRSC-NEXT: ret267;268; RV64IB-ZALRSC-PERM-LABEL: atomicrmw_umin_i32_seq_cst:269; RV64IB-ZALRSC-PERM: # %bb.0:270; RV64IB-ZALRSC-PERM-NEXT: sext.w a2, a1271; RV64IB-ZALRSC-PERM-NEXT: .LBB3_1: # =>This Inner Loop Header: Depth=1272; RV64IB-ZALRSC-PERM-NEXT: lr.w.aqrl a1, (a0)273; RV64IB-ZALRSC-PERM-NEXT: minu a3, a1, a2274; RV64IB-ZALRSC-PERM-NEXT: sc.w.rl a3, a3, (a0)275; RV64IB-ZALRSC-PERM-NEXT: bnez a3, .LBB3_1276; RV64IB-ZALRSC-PERM-NEXT: # %bb.2:277; RV64IB-ZALRSC-PERM-NEXT: mv a0, a1278; RV64IB-ZALRSC-PERM-NEXT: ret279;280; RV64IAB-LABEL: atomicrmw_umin_i32_seq_cst:281; RV64IAB: # %bb.0:282; RV64IAB-NEXT: amominu.w.aqrl a0, a1, (a0)283; RV64IAB-NEXT: ret284 %1 = atomicrmw umin ptr %a, i32 %b seq_cst285 ret i32 %1286}287 288define i64 @atomicrmw_max_i64_seq_cst(ptr %a, i64 %b) nounwind {289; RV32IB-COMMON-LABEL: atomicrmw_max_i64_seq_cst:290; RV32IB-COMMON: # %bb.0:291; RV32IB-COMMON-NEXT: addi sp, sp, -32292; RV32IB-COMMON-NEXT: sw ra, 28(sp) # 4-byte Folded Spill293; RV32IB-COMMON-NEXT: sw s0, 24(sp) # 4-byte Folded Spill294; RV32IB-COMMON-NEXT: sw s1, 20(sp) # 4-byte Folded Spill295; RV32IB-COMMON-NEXT: sw s2, 16(sp) # 4-byte Folded Spill296; RV32IB-COMMON-NEXT: mv s0, a2297; RV32IB-COMMON-NEXT: mv s1, a0298; RV32IB-COMMON-NEXT: lw a4, 0(a0)299; RV32IB-COMMON-NEXT: lw a5, 4(a0)300; RV32IB-COMMON-NEXT: mv s2, a1301; RV32IB-COMMON-NEXT: j .LBB4_2302; RV32IB-COMMON-NEXT: .LBB4_1: # %atomicrmw.start303; RV32IB-COMMON-NEXT: # in Loop: Header=BB4_2 Depth=1304; RV32IB-COMMON-NEXT: sw a4, 8(sp)305; RV32IB-COMMON-NEXT: sw a5, 12(sp)306; RV32IB-COMMON-NEXT: addi a1, sp, 8307; RV32IB-COMMON-NEXT: li a4, 5308; RV32IB-COMMON-NEXT: li a5, 5309; RV32IB-COMMON-NEXT: mv a0, s1310; RV32IB-COMMON-NEXT: call __atomic_compare_exchange_8311; RV32IB-COMMON-NEXT: lw a4, 8(sp)312; RV32IB-COMMON-NEXT: lw a5, 12(sp)313; RV32IB-COMMON-NEXT: bnez a0, .LBB4_7314; RV32IB-COMMON-NEXT: .LBB4_2: # %atomicrmw.start315; RV32IB-COMMON-NEXT: # =>This Inner Loop Header: Depth=1316; RV32IB-COMMON-NEXT: beq a5, s0, .LBB4_4317; RV32IB-COMMON-NEXT: # %bb.3: # %atomicrmw.start318; RV32IB-COMMON-NEXT: # in Loop: Header=BB4_2 Depth=1319; RV32IB-COMMON-NEXT: slt a0, s0, a5320; RV32IB-COMMON-NEXT: j .LBB4_5321; RV32IB-COMMON-NEXT: .LBB4_4: # in Loop: Header=BB4_2 Depth=1322; RV32IB-COMMON-NEXT: sltu a0, s2, a4323; RV32IB-COMMON-NEXT: .LBB4_5: # %atomicrmw.start324; RV32IB-COMMON-NEXT: # in Loop: Header=BB4_2 Depth=1325; RV32IB-COMMON-NEXT: mv a2, a4326; RV32IB-COMMON-NEXT: mv a3, a5327; RV32IB-COMMON-NEXT: bnez a0, .LBB4_1328; RV32IB-COMMON-NEXT: # %bb.6: # %atomicrmw.start329; RV32IB-COMMON-NEXT: # in Loop: Header=BB4_2 Depth=1330; RV32IB-COMMON-NEXT: mv a2, s2331; RV32IB-COMMON-NEXT: mv a3, s0332; RV32IB-COMMON-NEXT: j .LBB4_1333; RV32IB-COMMON-NEXT: .LBB4_7: # %atomicrmw.end334; RV32IB-COMMON-NEXT: mv a0, a4335; RV32IB-COMMON-NEXT: mv a1, a5336; RV32IB-COMMON-NEXT: lw ra, 28(sp) # 4-byte Folded Reload337; RV32IB-COMMON-NEXT: lw s0, 24(sp) # 4-byte Folded Reload338; RV32IB-COMMON-NEXT: lw s1, 20(sp) # 4-byte Folded Reload339; RV32IB-COMMON-NEXT: lw s2, 16(sp) # 4-byte Folded Reload340; RV32IB-COMMON-NEXT: addi sp, sp, 32341; RV32IB-COMMON-NEXT: ret342;343; RV64IB-ZALRSC-LABEL: atomicrmw_max_i64_seq_cst:344; RV64IB-ZALRSC: # %bb.0:345; RV64IB-ZALRSC-NEXT: .LBB4_1: # =>This Inner Loop Header: Depth=1346; RV64IB-ZALRSC-NEXT: lr.d.aqrl a2, (a0)347; RV64IB-ZALRSC-NEXT: mv a3, a2348; RV64IB-ZALRSC-NEXT: bge a3, a1, .LBB4_3349; RV64IB-ZALRSC-NEXT: # %bb.2: # in Loop: Header=BB4_1 Depth=1350; RV64IB-ZALRSC-NEXT: mv a3, a1351; RV64IB-ZALRSC-NEXT: .LBB4_3: # in Loop: Header=BB4_1 Depth=1352; RV64IB-ZALRSC-NEXT: sc.d.rl a3, a3, (a0)353; RV64IB-ZALRSC-NEXT: bnez a3, .LBB4_1354; RV64IB-ZALRSC-NEXT: # %bb.4:355; RV64IB-ZALRSC-NEXT: mv a0, a2356; RV64IB-ZALRSC-NEXT: ret357;358; RV64IB-ZALRSC-PERM-LABEL: atomicrmw_max_i64_seq_cst:359; RV64IB-ZALRSC-PERM: # %bb.0:360; RV64IB-ZALRSC-PERM-NEXT: .LBB4_1: # =>This Inner Loop Header: Depth=1361; RV64IB-ZALRSC-PERM-NEXT: lr.d.aqrl a2, (a0)362; RV64IB-ZALRSC-PERM-NEXT: max a3, a2, a1363; RV64IB-ZALRSC-PERM-NEXT: sc.d.rl a3, a3, (a0)364; RV64IB-ZALRSC-PERM-NEXT: bnez a3, .LBB4_1365; RV64IB-ZALRSC-PERM-NEXT: # %bb.2:366; RV64IB-ZALRSC-PERM-NEXT: mv a0, a2367; RV64IB-ZALRSC-PERM-NEXT: ret368;369; RV64IAB-LABEL: atomicrmw_max_i64_seq_cst:370; RV64IAB: # %bb.0:371; RV64IAB-NEXT: amomax.d.aqrl a0, a1, (a0)372; RV64IAB-NEXT: ret373 %1 = atomicrmw max ptr %a, i64 %b seq_cst374 ret i64 %1375}376 377define i64 @atomicrmw_min_i64_seq_cst(ptr %a, i64 %b) nounwind {378; RV32IB-COMMON-LABEL: atomicrmw_min_i64_seq_cst:379; RV32IB-COMMON: # %bb.0:380; RV32IB-COMMON-NEXT: addi sp, sp, -32381; RV32IB-COMMON-NEXT: sw ra, 28(sp) # 4-byte Folded Spill382; RV32IB-COMMON-NEXT: sw s0, 24(sp) # 4-byte Folded Spill383; RV32IB-COMMON-NEXT: sw s1, 20(sp) # 4-byte Folded Spill384; RV32IB-COMMON-NEXT: sw s2, 16(sp) # 4-byte Folded Spill385; RV32IB-COMMON-NEXT: mv s0, a2386; RV32IB-COMMON-NEXT: mv s1, a0387; RV32IB-COMMON-NEXT: lw a4, 0(a0)388; RV32IB-COMMON-NEXT: lw a5, 4(a0)389; RV32IB-COMMON-NEXT: mv s2, a1390; RV32IB-COMMON-NEXT: j .LBB5_2391; RV32IB-COMMON-NEXT: .LBB5_1: # %atomicrmw.start392; RV32IB-COMMON-NEXT: # in Loop: Header=BB5_2 Depth=1393; RV32IB-COMMON-NEXT: sw a4, 8(sp)394; RV32IB-COMMON-NEXT: sw a5, 12(sp)395; RV32IB-COMMON-NEXT: addi a1, sp, 8396; RV32IB-COMMON-NEXT: li a4, 5397; RV32IB-COMMON-NEXT: li a5, 5398; RV32IB-COMMON-NEXT: mv a0, s1399; RV32IB-COMMON-NEXT: call __atomic_compare_exchange_8400; RV32IB-COMMON-NEXT: lw a4, 8(sp)401; RV32IB-COMMON-NEXT: lw a5, 12(sp)402; RV32IB-COMMON-NEXT: bnez a0, .LBB5_7403; RV32IB-COMMON-NEXT: .LBB5_2: # %atomicrmw.start404; RV32IB-COMMON-NEXT: # =>This Inner Loop Header: Depth=1405; RV32IB-COMMON-NEXT: beq a5, s0, .LBB5_4406; RV32IB-COMMON-NEXT: # %bb.3: # %atomicrmw.start407; RV32IB-COMMON-NEXT: # in Loop: Header=BB5_2 Depth=1408; RV32IB-COMMON-NEXT: slt a0, a5, s0409; RV32IB-COMMON-NEXT: j .LBB5_5410; RV32IB-COMMON-NEXT: .LBB5_4: # in Loop: Header=BB5_2 Depth=1411; RV32IB-COMMON-NEXT: sltu a0, a4, s2412; RV32IB-COMMON-NEXT: .LBB5_5: # %atomicrmw.start413; RV32IB-COMMON-NEXT: # in Loop: Header=BB5_2 Depth=1414; RV32IB-COMMON-NEXT: mv a2, a4415; RV32IB-COMMON-NEXT: mv a3, a5416; RV32IB-COMMON-NEXT: bnez a0, .LBB5_1417; RV32IB-COMMON-NEXT: # %bb.6: # %atomicrmw.start418; RV32IB-COMMON-NEXT: # in Loop: Header=BB5_2 Depth=1419; RV32IB-COMMON-NEXT: mv a2, s2420; RV32IB-COMMON-NEXT: mv a3, s0421; RV32IB-COMMON-NEXT: j .LBB5_1422; RV32IB-COMMON-NEXT: .LBB5_7: # %atomicrmw.end423; RV32IB-COMMON-NEXT: mv a0, a4424; RV32IB-COMMON-NEXT: mv a1, a5425; RV32IB-COMMON-NEXT: lw ra, 28(sp) # 4-byte Folded Reload426; RV32IB-COMMON-NEXT: lw s0, 24(sp) # 4-byte Folded Reload427; RV32IB-COMMON-NEXT: lw s1, 20(sp) # 4-byte Folded Reload428; RV32IB-COMMON-NEXT: lw s2, 16(sp) # 4-byte Folded Reload429; RV32IB-COMMON-NEXT: addi sp, sp, 32430; RV32IB-COMMON-NEXT: ret431;432; RV64IB-ZALRSC-LABEL: atomicrmw_min_i64_seq_cst:433; RV64IB-ZALRSC: # %bb.0:434; RV64IB-ZALRSC-NEXT: .LBB5_1: # =>This Inner Loop Header: Depth=1435; RV64IB-ZALRSC-NEXT: lr.d.aqrl a2, (a0)436; RV64IB-ZALRSC-NEXT: mv a3, a2437; RV64IB-ZALRSC-NEXT: bge a1, a3, .LBB5_3438; RV64IB-ZALRSC-NEXT: # %bb.2: # in Loop: Header=BB5_1 Depth=1439; RV64IB-ZALRSC-NEXT: mv a3, a1440; RV64IB-ZALRSC-NEXT: .LBB5_3: # in Loop: Header=BB5_1 Depth=1441; RV64IB-ZALRSC-NEXT: sc.d.rl a3, a3, (a0)442; RV64IB-ZALRSC-NEXT: bnez a3, .LBB5_1443; RV64IB-ZALRSC-NEXT: # %bb.4:444; RV64IB-ZALRSC-NEXT: mv a0, a2445; RV64IB-ZALRSC-NEXT: ret446;447; RV64IB-ZALRSC-PERM-LABEL: atomicrmw_min_i64_seq_cst:448; RV64IB-ZALRSC-PERM: # %bb.0:449; RV64IB-ZALRSC-PERM-NEXT: .LBB5_1: # =>This Inner Loop Header: Depth=1450; RV64IB-ZALRSC-PERM-NEXT: lr.d.aqrl a2, (a0)451; RV64IB-ZALRSC-PERM-NEXT: min a3, a2, a1452; RV64IB-ZALRSC-PERM-NEXT: sc.d.rl a3, a3, (a0)453; RV64IB-ZALRSC-PERM-NEXT: bnez a3, .LBB5_1454; RV64IB-ZALRSC-PERM-NEXT: # %bb.2:455; RV64IB-ZALRSC-PERM-NEXT: mv a0, a2456; RV64IB-ZALRSC-PERM-NEXT: ret457;458; RV64IAB-LABEL: atomicrmw_min_i64_seq_cst:459; RV64IAB: # %bb.0:460; RV64IAB-NEXT: amomin.d.aqrl a0, a1, (a0)461; RV64IAB-NEXT: ret462 %1 = atomicrmw min ptr %a, i64 %b seq_cst463 ret i64 %1464}465 466define i64 @atomicrmw_umax_i64_seq_cst(ptr %a, i64 %b) nounwind {467; RV32IB-COMMON-LABEL: atomicrmw_umax_i64_seq_cst:468; RV32IB-COMMON: # %bb.0:469; RV32IB-COMMON-NEXT: addi sp, sp, -32470; RV32IB-COMMON-NEXT: sw ra, 28(sp) # 4-byte Folded Spill471; RV32IB-COMMON-NEXT: sw s0, 24(sp) # 4-byte Folded Spill472; RV32IB-COMMON-NEXT: sw s1, 20(sp) # 4-byte Folded Spill473; RV32IB-COMMON-NEXT: sw s2, 16(sp) # 4-byte Folded Spill474; RV32IB-COMMON-NEXT: mv s0, a2475; RV32IB-COMMON-NEXT: mv s1, a0476; RV32IB-COMMON-NEXT: lw a4, 0(a0)477; RV32IB-COMMON-NEXT: lw a5, 4(a0)478; RV32IB-COMMON-NEXT: mv s2, a1479; RV32IB-COMMON-NEXT: j .LBB6_2480; RV32IB-COMMON-NEXT: .LBB6_1: # %atomicrmw.start481; RV32IB-COMMON-NEXT: # in Loop: Header=BB6_2 Depth=1482; RV32IB-COMMON-NEXT: sw a4, 8(sp)483; RV32IB-COMMON-NEXT: sw a5, 12(sp)484; RV32IB-COMMON-NEXT: addi a1, sp, 8485; RV32IB-COMMON-NEXT: li a4, 5486; RV32IB-COMMON-NEXT: li a5, 5487; RV32IB-COMMON-NEXT: mv a0, s1488; RV32IB-COMMON-NEXT: call __atomic_compare_exchange_8489; RV32IB-COMMON-NEXT: lw a4, 8(sp)490; RV32IB-COMMON-NEXT: lw a5, 12(sp)491; RV32IB-COMMON-NEXT: bnez a0, .LBB6_7492; RV32IB-COMMON-NEXT: .LBB6_2: # %atomicrmw.start493; RV32IB-COMMON-NEXT: # =>This Inner Loop Header: Depth=1494; RV32IB-COMMON-NEXT: beq a5, s0, .LBB6_4495; RV32IB-COMMON-NEXT: # %bb.3: # %atomicrmw.start496; RV32IB-COMMON-NEXT: # in Loop: Header=BB6_2 Depth=1497; RV32IB-COMMON-NEXT: sltu a0, s0, a5498; RV32IB-COMMON-NEXT: j .LBB6_5499; RV32IB-COMMON-NEXT: .LBB6_4: # in Loop: Header=BB6_2 Depth=1500; RV32IB-COMMON-NEXT: sltu a0, s2, a4501; RV32IB-COMMON-NEXT: .LBB6_5: # %atomicrmw.start502; RV32IB-COMMON-NEXT: # in Loop: Header=BB6_2 Depth=1503; RV32IB-COMMON-NEXT: mv a2, a4504; RV32IB-COMMON-NEXT: mv a3, a5505; RV32IB-COMMON-NEXT: bnez a0, .LBB6_1506; RV32IB-COMMON-NEXT: # %bb.6: # %atomicrmw.start507; RV32IB-COMMON-NEXT: # in Loop: Header=BB6_2 Depth=1508; RV32IB-COMMON-NEXT: mv a2, s2509; RV32IB-COMMON-NEXT: mv a3, s0510; RV32IB-COMMON-NEXT: j .LBB6_1511; RV32IB-COMMON-NEXT: .LBB6_7: # %atomicrmw.end512; RV32IB-COMMON-NEXT: mv a0, a4513; RV32IB-COMMON-NEXT: mv a1, a5514; RV32IB-COMMON-NEXT: lw ra, 28(sp) # 4-byte Folded Reload515; RV32IB-COMMON-NEXT: lw s0, 24(sp) # 4-byte Folded Reload516; RV32IB-COMMON-NEXT: lw s1, 20(sp) # 4-byte Folded Reload517; RV32IB-COMMON-NEXT: lw s2, 16(sp) # 4-byte Folded Reload518; RV32IB-COMMON-NEXT: addi sp, sp, 32519; RV32IB-COMMON-NEXT: ret520;521; RV64IB-ZALRSC-LABEL: atomicrmw_umax_i64_seq_cst:522; RV64IB-ZALRSC: # %bb.0:523; RV64IB-ZALRSC-NEXT: .LBB6_1: # =>This Inner Loop Header: Depth=1524; RV64IB-ZALRSC-NEXT: lr.d.aqrl a2, (a0)525; RV64IB-ZALRSC-NEXT: mv a3, a2526; RV64IB-ZALRSC-NEXT: bgeu a3, a1, .LBB6_3527; RV64IB-ZALRSC-NEXT: # %bb.2: # in Loop: Header=BB6_1 Depth=1528; RV64IB-ZALRSC-NEXT: mv a3, a1529; RV64IB-ZALRSC-NEXT: .LBB6_3: # in Loop: Header=BB6_1 Depth=1530; RV64IB-ZALRSC-NEXT: sc.d.rl a3, a3, (a0)531; RV64IB-ZALRSC-NEXT: bnez a3, .LBB6_1532; RV64IB-ZALRSC-NEXT: # %bb.4:533; RV64IB-ZALRSC-NEXT: mv a0, a2534; RV64IB-ZALRSC-NEXT: ret535;536; RV64IB-ZALRSC-PERM-LABEL: atomicrmw_umax_i64_seq_cst:537; RV64IB-ZALRSC-PERM: # %bb.0:538; RV64IB-ZALRSC-PERM-NEXT: .LBB6_1: # =>This Inner Loop Header: Depth=1539; RV64IB-ZALRSC-PERM-NEXT: lr.d.aqrl a2, (a0)540; RV64IB-ZALRSC-PERM-NEXT: maxu a3, a2, a1541; RV64IB-ZALRSC-PERM-NEXT: sc.d.rl a3, a3, (a0)542; RV64IB-ZALRSC-PERM-NEXT: bnez a3, .LBB6_1543; RV64IB-ZALRSC-PERM-NEXT: # %bb.2:544; RV64IB-ZALRSC-PERM-NEXT: mv a0, a2545; RV64IB-ZALRSC-PERM-NEXT: ret546;547; RV64IAB-LABEL: atomicrmw_umax_i64_seq_cst:548; RV64IAB: # %bb.0:549; RV64IAB-NEXT: amomaxu.d.aqrl a0, a1, (a0)550; RV64IAB-NEXT: ret551 %1 = atomicrmw umax ptr %a, i64 %b seq_cst552 ret i64 %1553}554 555define i64 @atomicrmw_umin_i64_seq_cst(ptr %a, i64 %b) nounwind {556; RV32IB-COMMON-LABEL: atomicrmw_umin_i64_seq_cst:557; RV32IB-COMMON: # %bb.0:558; RV32IB-COMMON-NEXT: addi sp, sp, -32559; RV32IB-COMMON-NEXT: sw ra, 28(sp) # 4-byte Folded Spill560; RV32IB-COMMON-NEXT: sw s0, 24(sp) # 4-byte Folded Spill561; RV32IB-COMMON-NEXT: sw s1, 20(sp) # 4-byte Folded Spill562; RV32IB-COMMON-NEXT: sw s2, 16(sp) # 4-byte Folded Spill563; RV32IB-COMMON-NEXT: mv s0, a2564; RV32IB-COMMON-NEXT: mv s1, a0565; RV32IB-COMMON-NEXT: lw a4, 0(a0)566; RV32IB-COMMON-NEXT: lw a5, 4(a0)567; RV32IB-COMMON-NEXT: mv s2, a1568; RV32IB-COMMON-NEXT: j .LBB7_2569; RV32IB-COMMON-NEXT: .LBB7_1: # %atomicrmw.start570; RV32IB-COMMON-NEXT: # in Loop: Header=BB7_2 Depth=1571; RV32IB-COMMON-NEXT: sw a4, 8(sp)572; RV32IB-COMMON-NEXT: sw a5, 12(sp)573; RV32IB-COMMON-NEXT: addi a1, sp, 8574; RV32IB-COMMON-NEXT: li a4, 5575; RV32IB-COMMON-NEXT: li a5, 5576; RV32IB-COMMON-NEXT: mv a0, s1577; RV32IB-COMMON-NEXT: call __atomic_compare_exchange_8578; RV32IB-COMMON-NEXT: lw a4, 8(sp)579; RV32IB-COMMON-NEXT: lw a5, 12(sp)580; RV32IB-COMMON-NEXT: bnez a0, .LBB7_7581; RV32IB-COMMON-NEXT: .LBB7_2: # %atomicrmw.start582; RV32IB-COMMON-NEXT: # =>This Inner Loop Header: Depth=1583; RV32IB-COMMON-NEXT: beq a5, s0, .LBB7_4584; RV32IB-COMMON-NEXT: # %bb.3: # %atomicrmw.start585; RV32IB-COMMON-NEXT: # in Loop: Header=BB7_2 Depth=1586; RV32IB-COMMON-NEXT: sltu a0, a5, s0587; RV32IB-COMMON-NEXT: j .LBB7_5588; RV32IB-COMMON-NEXT: .LBB7_4: # in Loop: Header=BB7_2 Depth=1589; RV32IB-COMMON-NEXT: sltu a0, a4, s2590; RV32IB-COMMON-NEXT: .LBB7_5: # %atomicrmw.start591; RV32IB-COMMON-NEXT: # in Loop: Header=BB7_2 Depth=1592; RV32IB-COMMON-NEXT: mv a2, a4593; RV32IB-COMMON-NEXT: mv a3, a5594; RV32IB-COMMON-NEXT: bnez a0, .LBB7_1595; RV32IB-COMMON-NEXT: # %bb.6: # %atomicrmw.start596; RV32IB-COMMON-NEXT: # in Loop: Header=BB7_2 Depth=1597; RV32IB-COMMON-NEXT: mv a2, s2598; RV32IB-COMMON-NEXT: mv a3, s0599; RV32IB-COMMON-NEXT: j .LBB7_1600; RV32IB-COMMON-NEXT: .LBB7_7: # %atomicrmw.end601; RV32IB-COMMON-NEXT: mv a0, a4602; RV32IB-COMMON-NEXT: mv a1, a5603; RV32IB-COMMON-NEXT: lw ra, 28(sp) # 4-byte Folded Reload604; RV32IB-COMMON-NEXT: lw s0, 24(sp) # 4-byte Folded Reload605; RV32IB-COMMON-NEXT: lw s1, 20(sp) # 4-byte Folded Reload606; RV32IB-COMMON-NEXT: lw s2, 16(sp) # 4-byte Folded Reload607; RV32IB-COMMON-NEXT: addi sp, sp, 32608; RV32IB-COMMON-NEXT: ret609;610; RV64IB-ZALRSC-LABEL: atomicrmw_umin_i64_seq_cst:611; RV64IB-ZALRSC: # %bb.0:612; RV64IB-ZALRSC-NEXT: .LBB7_1: # =>This Inner Loop Header: Depth=1613; RV64IB-ZALRSC-NEXT: lr.d.aqrl a2, (a0)614; RV64IB-ZALRSC-NEXT: mv a3, a2615; RV64IB-ZALRSC-NEXT: bgeu a1, a3, .LBB7_3616; RV64IB-ZALRSC-NEXT: # %bb.2: # in Loop: Header=BB7_1 Depth=1617; RV64IB-ZALRSC-NEXT: mv a3, a1618; RV64IB-ZALRSC-NEXT: .LBB7_3: # in Loop: Header=BB7_1 Depth=1619; RV64IB-ZALRSC-NEXT: sc.d.rl a3, a3, (a0)620; RV64IB-ZALRSC-NEXT: bnez a3, .LBB7_1621; RV64IB-ZALRSC-NEXT: # %bb.4:622; RV64IB-ZALRSC-NEXT: mv a0, a2623; RV64IB-ZALRSC-NEXT: ret624;625; RV64IB-ZALRSC-PERM-LABEL: atomicrmw_umin_i64_seq_cst:626; RV64IB-ZALRSC-PERM: # %bb.0:627; RV64IB-ZALRSC-PERM-NEXT: .LBB7_1: # =>This Inner Loop Header: Depth=1628; RV64IB-ZALRSC-PERM-NEXT: lr.d.aqrl a2, (a0)629; RV64IB-ZALRSC-PERM-NEXT: minu a3, a2, a1630; RV64IB-ZALRSC-PERM-NEXT: sc.d.rl a3, a3, (a0)631; RV64IB-ZALRSC-PERM-NEXT: bnez a3, .LBB7_1632; RV64IB-ZALRSC-PERM-NEXT: # %bb.2:633; RV64IB-ZALRSC-PERM-NEXT: mv a0, a2634; RV64IB-ZALRSC-PERM-NEXT: ret635;636; RV64IAB-LABEL: atomicrmw_umin_i64_seq_cst:637; RV64IAB: # %bb.0:638; RV64IAB-NEXT: amominu.d.aqrl a0, a1, (a0)639; RV64IAB-NEXT: ret640 %1 = atomicrmw umin ptr %a, i64 %b seq_cst641 ret i64 %1642}643