284 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 22; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \3; RUN: | FileCheck -check-prefix=RV32I %s4; RUN: llc -mtriple=riscv32 -mattr=+a -verify-machineinstrs < %s \5; RUN: | FileCheck -check-prefixes=RV32IA %s6; RUN: llc -mtriple=riscv32 -mattr=+zalrsc -verify-machineinstrs < %s \7; RUN: | FileCheck -check-prefixes=RV32I-ZALRSC %s8; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \9; RUN: | FileCheck -check-prefix=RV64I %s10; RUN: llc -mtriple=riscv64 -mattr=+a -verify-machineinstrs < %s \11; RUN: | FileCheck -check-prefixes=RV64IA %s12; RUN: llc -mtriple=riscv64 -mattr=+zalrsc -verify-machineinstrs < %s \13; RUN: | FileCheck -check-prefixes=RV64I-ZALRSC %s14 15define i32 @atomicrmw_sub_i32_constant(ptr %a) nounwind {16; RV32I-LABEL: atomicrmw_sub_i32_constant:17; RV32I: # %bb.0:18; RV32I-NEXT: addi sp, sp, -1619; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill20; RV32I-NEXT: li a1, 121; RV32I-NEXT: li a2, 522; RV32I-NEXT: call __atomic_fetch_sub_423; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload24; RV32I-NEXT: addi sp, sp, 1625; RV32I-NEXT: ret26;27; RV32IA-LABEL: atomicrmw_sub_i32_constant:28; RV32IA: # %bb.0:29; RV32IA-NEXT: li a1, -130; RV32IA-NEXT: amoadd.w.aqrl a0, a1, (a0)31; RV32IA-NEXT: ret32;33; RV32I-ZALRSC-LABEL: atomicrmw_sub_i32_constant:34; RV32I-ZALRSC: # %bb.0:35; RV32I-ZALRSC-NEXT: li a2, 136; RV32I-ZALRSC-NEXT: .LBB0_1: # =>This Inner Loop Header: Depth=137; RV32I-ZALRSC-NEXT: lr.w.aqrl a1, (a0)38; RV32I-ZALRSC-NEXT: sub a3, a1, a239; RV32I-ZALRSC-NEXT: sc.w.rl a3, a3, (a0)40; RV32I-ZALRSC-NEXT: bnez a3, .LBB0_141; RV32I-ZALRSC-NEXT: # %bb.2:42; RV32I-ZALRSC-NEXT: mv a0, a143; RV32I-ZALRSC-NEXT: ret44;45; RV64I-LABEL: atomicrmw_sub_i32_constant:46; RV64I: # %bb.0:47; RV64I-NEXT: addi sp, sp, -1648; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill49; RV64I-NEXT: li a1, 150; RV64I-NEXT: li a2, 551; RV64I-NEXT: call __atomic_fetch_sub_452; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload53; RV64I-NEXT: addi sp, sp, 1654; RV64I-NEXT: ret55;56; RV64IA-LABEL: atomicrmw_sub_i32_constant:57; RV64IA: # %bb.0:58; RV64IA-NEXT: li a1, -159; RV64IA-NEXT: amoadd.w.aqrl a0, a1, (a0)60; RV64IA-NEXT: ret61;62; RV64I-ZALRSC-LABEL: atomicrmw_sub_i32_constant:63; RV64I-ZALRSC: # %bb.0:64; RV64I-ZALRSC-NEXT: li a2, 165; RV64I-ZALRSC-NEXT: .LBB0_1: # =>This Inner Loop Header: Depth=166; RV64I-ZALRSC-NEXT: lr.w.aqrl a1, (a0)67; RV64I-ZALRSC-NEXT: sub a3, a1, a268; RV64I-ZALRSC-NEXT: sc.w.rl a3, a3, (a0)69; RV64I-ZALRSC-NEXT: bnez a3, .LBB0_170; RV64I-ZALRSC-NEXT: # %bb.2:71; RV64I-ZALRSC-NEXT: mv a0, a172; RV64I-ZALRSC-NEXT: ret73 %1 = atomicrmw sub ptr %a, i32 1 seq_cst74 ret i32 %175}76 77define i64 @atomicrmw_sub_i64_constant(ptr %a) nounwind {78; RV32I-LABEL: atomicrmw_sub_i64_constant:79; RV32I: # %bb.0:80; RV32I-NEXT: addi sp, sp, -1681; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill82; RV32I-NEXT: li a1, 183; RV32I-NEXT: li a3, 584; RV32I-NEXT: li a2, 085; RV32I-NEXT: call __atomic_fetch_sub_886; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload87; RV32I-NEXT: addi sp, sp, 1688; RV32I-NEXT: ret89;90; RV32IA-LABEL: atomicrmw_sub_i64_constant:91; RV32IA: # %bb.0:92; RV32IA-NEXT: addi sp, sp, -1693; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill94; RV32IA-NEXT: li a1, 195; RV32IA-NEXT: li a3, 596; RV32IA-NEXT: li a2, 097; RV32IA-NEXT: call __atomic_fetch_sub_898; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload99; RV32IA-NEXT: addi sp, sp, 16100; RV32IA-NEXT: ret101;102; RV32I-ZALRSC-LABEL: atomicrmw_sub_i64_constant:103; RV32I-ZALRSC: # %bb.0:104; RV32I-ZALRSC-NEXT: addi sp, sp, -16105; RV32I-ZALRSC-NEXT: sw ra, 12(sp) # 4-byte Folded Spill106; RV32I-ZALRSC-NEXT: li a1, 1107; RV32I-ZALRSC-NEXT: li a3, 5108; RV32I-ZALRSC-NEXT: li a2, 0109; RV32I-ZALRSC-NEXT: call __atomic_fetch_sub_8110; RV32I-ZALRSC-NEXT: lw ra, 12(sp) # 4-byte Folded Reload111; RV32I-ZALRSC-NEXT: addi sp, sp, 16112; RV32I-ZALRSC-NEXT: ret113;114; RV64I-LABEL: atomicrmw_sub_i64_constant:115; RV64I: # %bb.0:116; RV64I-NEXT: addi sp, sp, -16117; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill118; RV64I-NEXT: li a1, 1119; RV64I-NEXT: li a2, 5120; RV64I-NEXT: call __atomic_fetch_sub_8121; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload122; RV64I-NEXT: addi sp, sp, 16123; RV64I-NEXT: ret124;125; RV64IA-LABEL: atomicrmw_sub_i64_constant:126; RV64IA: # %bb.0:127; RV64IA-NEXT: li a1, -1128; RV64IA-NEXT: amoadd.d.aqrl a0, a1, (a0)129; RV64IA-NEXT: ret130;131; RV64I-ZALRSC-LABEL: atomicrmw_sub_i64_constant:132; RV64I-ZALRSC: # %bb.0:133; RV64I-ZALRSC-NEXT: li a2, 1134; RV64I-ZALRSC-NEXT: .LBB1_1: # =>This Inner Loop Header: Depth=1135; RV64I-ZALRSC-NEXT: lr.d.aqrl a1, (a0)136; RV64I-ZALRSC-NEXT: sub a3, a1, a2137; RV64I-ZALRSC-NEXT: sc.d.rl a3, a3, (a0)138; RV64I-ZALRSC-NEXT: bnez a3, .LBB1_1139; RV64I-ZALRSC-NEXT: # %bb.2:140; RV64I-ZALRSC-NEXT: mv a0, a1141; RV64I-ZALRSC-NEXT: ret142 %1 = atomicrmw sub ptr %a, i64 1 seq_cst143 ret i64 %1144}145 146define i32 @atomicrmw_sub_i32_neg(ptr %a, i32 %x, i32 %y) nounwind {147; RV32I-LABEL: atomicrmw_sub_i32_neg:148; RV32I: # %bb.0:149; RV32I-NEXT: addi sp, sp, -16150; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill151; RV32I-NEXT: sub a1, a1, a2152; RV32I-NEXT: li a2, 5153; RV32I-NEXT: call __atomic_fetch_sub_4154; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload155; RV32I-NEXT: addi sp, sp, 16156; RV32I-NEXT: ret157;158; RV32IA-LABEL: atomicrmw_sub_i32_neg:159; RV32IA: # %bb.0:160; RV32IA-NEXT: sub a2, a2, a1161; RV32IA-NEXT: amoadd.w.aqrl a0, a2, (a0)162; RV32IA-NEXT: ret163;164; RV32I-ZALRSC-LABEL: atomicrmw_sub_i32_neg:165; RV32I-ZALRSC: # %bb.0:166; RV32I-ZALRSC-NEXT: sub a2, a1, a2167; RV32I-ZALRSC-NEXT: .LBB2_1: # =>This Inner Loop Header: Depth=1168; RV32I-ZALRSC-NEXT: lr.w.aqrl a1, (a0)169; RV32I-ZALRSC-NEXT: sub a3, a1, a2170; RV32I-ZALRSC-NEXT: sc.w.rl a3, a3, (a0)171; RV32I-ZALRSC-NEXT: bnez a3, .LBB2_1172; RV32I-ZALRSC-NEXT: # %bb.2:173; RV32I-ZALRSC-NEXT: mv a0, a1174; RV32I-ZALRSC-NEXT: ret175;176; RV64I-LABEL: atomicrmw_sub_i32_neg:177; RV64I: # %bb.0:178; RV64I-NEXT: addi sp, sp, -16179; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill180; RV64I-NEXT: subw a1, a1, a2181; RV64I-NEXT: li a2, 5182; RV64I-NEXT: call __atomic_fetch_sub_4183; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload184; RV64I-NEXT: addi sp, sp, 16185; RV64I-NEXT: ret186;187; RV64IA-LABEL: atomicrmw_sub_i32_neg:188; RV64IA: # %bb.0:189; RV64IA-NEXT: sub a2, a2, a1190; RV64IA-NEXT: amoadd.w.aqrl a0, a2, (a0)191; RV64IA-NEXT: ret192;193; RV64I-ZALRSC-LABEL: atomicrmw_sub_i32_neg:194; RV64I-ZALRSC: # %bb.0:195; RV64I-ZALRSC-NEXT: subw a2, a1, a2196; RV64I-ZALRSC-NEXT: .LBB2_1: # =>This Inner Loop Header: Depth=1197; RV64I-ZALRSC-NEXT: lr.w.aqrl a1, (a0)198; RV64I-ZALRSC-NEXT: sub a3, a1, a2199; RV64I-ZALRSC-NEXT: sc.w.rl a3, a3, (a0)200; RV64I-ZALRSC-NEXT: bnez a3, .LBB2_1201; RV64I-ZALRSC-NEXT: # %bb.2:202; RV64I-ZALRSC-NEXT: mv a0, a1203; RV64I-ZALRSC-NEXT: ret204 %b = sub i32 %x, %y205 %1 = atomicrmw sub ptr %a, i32 %b seq_cst206 ret i32 %1207}208 209define i64 @atomicrmw_sub_i64_neg(ptr %a, i64 %x, i64 %y) nounwind {210; RV32I-LABEL: atomicrmw_sub_i64_neg:211; RV32I: # %bb.0:212; RV32I-NEXT: addi sp, sp, -16213; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill214; RV32I-NEXT: sltu a5, a1, a3215; RV32I-NEXT: sub a2, a2, a4216; RV32I-NEXT: sub a2, a2, a5217; RV32I-NEXT: sub a1, a1, a3218; RV32I-NEXT: li a3, 5219; RV32I-NEXT: call __atomic_fetch_sub_8220; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload221; RV32I-NEXT: addi sp, sp, 16222; RV32I-NEXT: ret223;224; RV32IA-LABEL: atomicrmw_sub_i64_neg:225; RV32IA: # %bb.0:226; RV32IA-NEXT: addi sp, sp, -16227; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill228; RV32IA-NEXT: sltu a5, a1, a3229; RV32IA-NEXT: sub a2, a2, a4230; RV32IA-NEXT: sub a2, a2, a5231; RV32IA-NEXT: sub a1, a1, a3232; RV32IA-NEXT: li a3, 5233; RV32IA-NEXT: call __atomic_fetch_sub_8234; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload235; RV32IA-NEXT: addi sp, sp, 16236; RV32IA-NEXT: ret237;238; RV32I-ZALRSC-LABEL: atomicrmw_sub_i64_neg:239; RV32I-ZALRSC: # %bb.0:240; RV32I-ZALRSC-NEXT: addi sp, sp, -16241; RV32I-ZALRSC-NEXT: sw ra, 12(sp) # 4-byte Folded Spill242; RV32I-ZALRSC-NEXT: sltu a5, a1, a3243; RV32I-ZALRSC-NEXT: sub a2, a2, a4244; RV32I-ZALRSC-NEXT: sub a2, a2, a5245; RV32I-ZALRSC-NEXT: sub a1, a1, a3246; RV32I-ZALRSC-NEXT: li a3, 5247; RV32I-ZALRSC-NEXT: call __atomic_fetch_sub_8248; RV32I-ZALRSC-NEXT: lw ra, 12(sp) # 4-byte Folded Reload249; RV32I-ZALRSC-NEXT: addi sp, sp, 16250; RV32I-ZALRSC-NEXT: ret251;252; RV64I-LABEL: atomicrmw_sub_i64_neg:253; RV64I: # %bb.0:254; RV64I-NEXT: addi sp, sp, -16255; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill256; RV64I-NEXT: sub a1, a1, a2257; RV64I-NEXT: li a2, 5258; RV64I-NEXT: call __atomic_fetch_sub_8259; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload260; RV64I-NEXT: addi sp, sp, 16261; RV64I-NEXT: ret262;263; RV64IA-LABEL: atomicrmw_sub_i64_neg:264; RV64IA: # %bb.0:265; RV64IA-NEXT: sub a2, a2, a1266; RV64IA-NEXT: amoadd.d.aqrl a0, a2, (a0)267; RV64IA-NEXT: ret268;269; RV64I-ZALRSC-LABEL: atomicrmw_sub_i64_neg:270; RV64I-ZALRSC: # %bb.0:271; RV64I-ZALRSC-NEXT: sub a2, a1, a2272; RV64I-ZALRSC-NEXT: .LBB3_1: # =>This Inner Loop Header: Depth=1273; RV64I-ZALRSC-NEXT: lr.d.aqrl a1, (a0)274; RV64I-ZALRSC-NEXT: sub a3, a1, a2275; RV64I-ZALRSC-NEXT: sc.d.rl a3, a3, (a0)276; RV64I-ZALRSC-NEXT: bnez a3, .LBB3_1277; RV64I-ZALRSC-NEXT: # %bb.2:278; RV64I-ZALRSC-NEXT: mv a0, a1279; RV64I-ZALRSC-NEXT: ret280 %b = sub i64 %x, %y281 %1 = atomicrmw sub ptr %a, i64 %b seq_cst282 ret i64 %1283}284