931 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -global-isel -mtriple=riscv32 -mattr=+a,+zabha < %s | FileCheck %s --check-prefixes=RV32IA-ZABHA3; RUN: llc -global-isel -mtriple=riscv32 -mattr=+a < %s | FileCheck %s --check-prefixes=RV32IA4; RUN: llc -global-isel -mtriple=riscv32 < %s | FileCheck %s --check-prefixes=RV32I5; RUN: llc -global-isel -mtriple=riscv64 -mattr=+a,+zabha < %s | FileCheck %s --check-prefixes=RV64IA-ZABHA6; RUN: llc -global-isel -mtriple=riscv64 -mattr=+a < %s | FileCheck %s --check-prefixes=RV64IA7; RUN: llc -global-isel -mtriple=riscv64 < %s | FileCheck %s --check-prefixes=RV64I8 9define i8 @atomicrmw_add_i8(ptr %ptr, i8 %rhs) nounwind {10; RV32IA-ZABHA-LABEL: atomicrmw_add_i8:11; RV32IA-ZABHA: # %bb.0:12; RV32IA-ZABHA-NEXT: amoadd.b.aqrl a0, a1, (a0)13; RV32IA-ZABHA-NEXT: ret14;15; RV32IA-LABEL: atomicrmw_add_i8:16; RV32IA: # %bb.0:17; RV32IA-NEXT: li a2, 25518; RV32IA-NEXT: andi a3, a0, -419; RV32IA-NEXT: andi a0, a0, 320; RV32IA-NEXT: zext.b a1, a121; RV32IA-NEXT: slli a0, a0, 322; RV32IA-NEXT: sll a2, a2, a023; RV32IA-NEXT: sll a1, a1, a024; RV32IA-NEXT: .LBB0_1: # =>This Inner Loop Header: Depth=125; RV32IA-NEXT: lr.w.aqrl a4, (a3)26; RV32IA-NEXT: add a5, a4, a127; RV32IA-NEXT: xor a5, a4, a528; RV32IA-NEXT: and a5, a5, a229; RV32IA-NEXT: xor a5, a4, a530; RV32IA-NEXT: sc.w.rl a5, a5, (a3)31; RV32IA-NEXT: bnez a5, .LBB0_132; RV32IA-NEXT: # %bb.2:33; RV32IA-NEXT: srl a0, a4, a034; RV32IA-NEXT: ret35;36; RV32I-LABEL: atomicrmw_add_i8:37; RV32I: # %bb.0:38; RV32I-NEXT: addi sp, sp, -1639; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill40; RV32I-NEXT: li a2, 541; RV32I-NEXT: call __atomic_fetch_add_142; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload43; RV32I-NEXT: addi sp, sp, 1644; RV32I-NEXT: ret45;46; RV64IA-ZABHA-LABEL: atomicrmw_add_i8:47; RV64IA-ZABHA: # %bb.0:48; RV64IA-ZABHA-NEXT: amoadd.b.aqrl a0, a1, (a0)49; RV64IA-ZABHA-NEXT: ret50;51; RV64IA-LABEL: atomicrmw_add_i8:52; RV64IA: # %bb.0:53; RV64IA-NEXT: li a2, 25554; RV64IA-NEXT: andi a3, a0, -455; RV64IA-NEXT: andi a0, a0, 356; RV64IA-NEXT: zext.b a1, a157; RV64IA-NEXT: slli a0, a0, 358; RV64IA-NEXT: sllw a2, a2, a059; RV64IA-NEXT: sllw a1, a1, a060; RV64IA-NEXT: .LBB0_1: # =>This Inner Loop Header: Depth=161; RV64IA-NEXT: lr.w.aqrl a4, (a3)62; RV64IA-NEXT: add a5, a4, a163; RV64IA-NEXT: xor a5, a4, a564; RV64IA-NEXT: and a5, a5, a265; RV64IA-NEXT: xor a5, a4, a566; RV64IA-NEXT: sc.w.rl a5, a5, (a3)67; RV64IA-NEXT: bnez a5, .LBB0_168; RV64IA-NEXT: # %bb.2:69; RV64IA-NEXT: srlw a0, a4, a070; RV64IA-NEXT: ret71;72; RV64I-LABEL: atomicrmw_add_i8:73; RV64I: # %bb.0:74; RV64I-NEXT: addi sp, sp, -1675; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill76; RV64I-NEXT: li a2, 577; RV64I-NEXT: call __atomic_fetch_add_178; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload79; RV64I-NEXT: addi sp, sp, 1680; RV64I-NEXT: ret81 %res = atomicrmw add ptr %ptr, i8 %rhs seq_cst82 ret i8 %res83}84 85define i16 @atomicrmw_add_i16(ptr %ptr, i16 %rhs) nounwind {86; RV32IA-ZABHA-LABEL: atomicrmw_add_i16:87; RV32IA-ZABHA: # %bb.0:88; RV32IA-ZABHA-NEXT: amoadd.h.aqrl a0, a1, (a0)89; RV32IA-ZABHA-NEXT: ret90;91; RV32IA-LABEL: atomicrmw_add_i16:92; RV32IA: # %bb.0:93; RV32IA-NEXT: lui a2, 1694; RV32IA-NEXT: andi a3, a0, -495; RV32IA-NEXT: andi a0, a0, 396; RV32IA-NEXT: addi a2, a2, -197; RV32IA-NEXT: slli a0, a0, 398; RV32IA-NEXT: sll a4, a2, a099; RV32IA-NEXT: and a1, a1, a2100; RV32IA-NEXT: sll a1, a1, a0101; RV32IA-NEXT: .LBB1_1: # =>This Inner Loop Header: Depth=1102; RV32IA-NEXT: lr.w.aqrl a2, (a3)103; RV32IA-NEXT: add a5, a2, a1104; RV32IA-NEXT: xor a5, a2, a5105; RV32IA-NEXT: and a5, a5, a4106; RV32IA-NEXT: xor a5, a2, a5107; RV32IA-NEXT: sc.w.rl a5, a5, (a3)108; RV32IA-NEXT: bnez a5, .LBB1_1109; RV32IA-NEXT: # %bb.2:110; RV32IA-NEXT: srl a0, a2, a0111; RV32IA-NEXT: ret112;113; RV32I-LABEL: atomicrmw_add_i16:114; RV32I: # %bb.0:115; RV32I-NEXT: addi sp, sp, -16116; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill117; RV32I-NEXT: li a2, 5118; RV32I-NEXT: call __atomic_fetch_add_2119; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload120; RV32I-NEXT: addi sp, sp, 16121; RV32I-NEXT: ret122;123; RV64IA-ZABHA-LABEL: atomicrmw_add_i16:124; RV64IA-ZABHA: # %bb.0:125; RV64IA-ZABHA-NEXT: amoadd.h.aqrl a0, a1, (a0)126; RV64IA-ZABHA-NEXT: ret127;128; RV64IA-LABEL: atomicrmw_add_i16:129; RV64IA: # %bb.0:130; RV64IA-NEXT: lui a2, 16131; RV64IA-NEXT: andi a3, a0, -4132; RV64IA-NEXT: andi a0, a0, 3133; RV64IA-NEXT: addi a2, a2, -1134; RV64IA-NEXT: slli a0, a0, 3135; RV64IA-NEXT: sllw a4, a2, a0136; RV64IA-NEXT: and a1, a1, a2137; RV64IA-NEXT: sllw a1, a1, a0138; RV64IA-NEXT: .LBB1_1: # =>This Inner Loop Header: Depth=1139; RV64IA-NEXT: lr.w.aqrl a2, (a3)140; RV64IA-NEXT: add a5, a2, a1141; RV64IA-NEXT: xor a5, a2, a5142; RV64IA-NEXT: and a5, a5, a4143; RV64IA-NEXT: xor a5, a2, a5144; RV64IA-NEXT: sc.w.rl a5, a5, (a3)145; RV64IA-NEXT: bnez a5, .LBB1_1146; RV64IA-NEXT: # %bb.2:147; RV64IA-NEXT: srlw a0, a2, a0148; RV64IA-NEXT: ret149;150; RV64I-LABEL: atomicrmw_add_i16:151; RV64I: # %bb.0:152; RV64I-NEXT: addi sp, sp, -16153; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill154; RV64I-NEXT: li a2, 5155; RV64I-NEXT: call __atomic_fetch_add_2156; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload157; RV64I-NEXT: addi sp, sp, 16158; RV64I-NEXT: ret159 %res = atomicrmw add ptr %ptr, i16 %rhs seq_cst160 ret i16 %res161}162 163define i32 @atomicrmw_add_i32(ptr %ptr, i32 %rhs) nounwind {164; RV32IA-ZABHA-LABEL: atomicrmw_add_i32:165; RV32IA-ZABHA: # %bb.0:166; RV32IA-ZABHA-NEXT: amoadd.w.aqrl a0, a1, (a0)167; RV32IA-ZABHA-NEXT: ret168;169; RV32IA-LABEL: atomicrmw_add_i32:170; RV32IA: # %bb.0:171; RV32IA-NEXT: amoadd.w.aqrl a0, a1, (a0)172; RV32IA-NEXT: ret173;174; RV32I-LABEL: atomicrmw_add_i32:175; RV32I: # %bb.0:176; RV32I-NEXT: addi sp, sp, -16177; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill178; RV32I-NEXT: li a2, 5179; RV32I-NEXT: call __atomic_fetch_add_4180; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload181; RV32I-NEXT: addi sp, sp, 16182; RV32I-NEXT: ret183;184; RV64IA-ZABHA-LABEL: atomicrmw_add_i32:185; RV64IA-ZABHA: # %bb.0:186; RV64IA-ZABHA-NEXT: amoadd.w.aqrl a0, a1, (a0)187; RV64IA-ZABHA-NEXT: ret188;189; RV64IA-LABEL: atomicrmw_add_i32:190; RV64IA: # %bb.0:191; RV64IA-NEXT: amoadd.w.aqrl a0, a1, (a0)192; RV64IA-NEXT: ret193;194; RV64I-LABEL: atomicrmw_add_i32:195; RV64I: # %bb.0:196; RV64I-NEXT: addi sp, sp, -16197; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill198; RV64I-NEXT: li a2, 5199; RV64I-NEXT: call __atomic_fetch_add_4200; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload201; RV64I-NEXT: addi sp, sp, 16202; RV64I-NEXT: ret203 %res = atomicrmw add ptr %ptr, i32 %rhs seq_cst204 ret i32 %res205}206 207define i64 @atomicrmw_add_i64(ptr %ptr, i64 %rhs) nounwind {208; RV32IA-ZABHA-LABEL: atomicrmw_add_i64:209; RV32IA-ZABHA: # %bb.0:210; RV32IA-ZABHA-NEXT: addi sp, sp, -16211; RV32IA-ZABHA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill212; RV32IA-ZABHA-NEXT: li a3, 5213; RV32IA-ZABHA-NEXT: call __atomic_fetch_add_8214; RV32IA-ZABHA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload215; RV32IA-ZABHA-NEXT: addi sp, sp, 16216; RV32IA-ZABHA-NEXT: ret217;218; RV32IA-LABEL: atomicrmw_add_i64:219; RV32IA: # %bb.0:220; RV32IA-NEXT: addi sp, sp, -16221; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill222; RV32IA-NEXT: li a3, 5223; RV32IA-NEXT: call __atomic_fetch_add_8224; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload225; RV32IA-NEXT: addi sp, sp, 16226; RV32IA-NEXT: ret227;228; RV32I-LABEL: atomicrmw_add_i64:229; RV32I: # %bb.0:230; RV32I-NEXT: addi sp, sp, -16231; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill232; RV32I-NEXT: li a3, 5233; RV32I-NEXT: call __atomic_fetch_add_8234; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload235; RV32I-NEXT: addi sp, sp, 16236; RV32I-NEXT: ret237;238; RV64IA-ZABHA-LABEL: atomicrmw_add_i64:239; RV64IA-ZABHA: # %bb.0:240; RV64IA-ZABHA-NEXT: amoadd.d.aqrl a0, a1, (a0)241; RV64IA-ZABHA-NEXT: ret242;243; RV64IA-LABEL: atomicrmw_add_i64:244; RV64IA: # %bb.0:245; RV64IA-NEXT: amoadd.d.aqrl a0, a1, (a0)246; RV64IA-NEXT: ret247;248; RV64I-LABEL: atomicrmw_add_i64:249; RV64I: # %bb.0:250; RV64I-NEXT: addi sp, sp, -16251; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill252; RV64I-NEXT: li a2, 5253; RV64I-NEXT: call __atomic_fetch_add_8254; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload255; RV64I-NEXT: addi sp, sp, 16256; RV64I-NEXT: ret257 %res = atomicrmw add ptr %ptr, i64 %rhs seq_cst258 ret i64 %res259}260 261define i8 @atomicrmw_sub_i8(ptr %ptr, i8 %rhs) nounwind {262; RV32IA-ZABHA-LABEL: atomicrmw_sub_i8:263; RV32IA-ZABHA: # %bb.0:264; RV32IA-ZABHA-NEXT: neg a1, a1265; RV32IA-ZABHA-NEXT: amoadd.b.aqrl a0, a1, (a0)266; RV32IA-ZABHA-NEXT: ret267;268; RV32IA-LABEL: atomicrmw_sub_i8:269; RV32IA: # %bb.0:270; RV32IA-NEXT: li a2, 255271; RV32IA-NEXT: andi a3, a0, -4272; RV32IA-NEXT: andi a0, a0, 3273; RV32IA-NEXT: zext.b a1, a1274; RV32IA-NEXT: slli a0, a0, 3275; RV32IA-NEXT: sll a2, a2, a0276; RV32IA-NEXT: sll a1, a1, a0277; RV32IA-NEXT: .LBB4_1: # =>This Inner Loop Header: Depth=1278; RV32IA-NEXT: lr.w.aqrl a4, (a3)279; RV32IA-NEXT: sub a5, a4, a1280; RV32IA-NEXT: xor a5, a4, a5281; RV32IA-NEXT: and a5, a5, a2282; RV32IA-NEXT: xor a5, a4, a5283; RV32IA-NEXT: sc.w.rl a5, a5, (a3)284; RV32IA-NEXT: bnez a5, .LBB4_1285; RV32IA-NEXT: # %bb.2:286; RV32IA-NEXT: srl a0, a4, a0287; RV32IA-NEXT: ret288;289; RV32I-LABEL: atomicrmw_sub_i8:290; RV32I: # %bb.0:291; RV32I-NEXT: addi sp, sp, -16292; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill293; RV32I-NEXT: li a2, 5294; RV32I-NEXT: call __atomic_fetch_sub_1295; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload296; RV32I-NEXT: addi sp, sp, 16297; RV32I-NEXT: ret298;299; RV64IA-ZABHA-LABEL: atomicrmw_sub_i8:300; RV64IA-ZABHA: # %bb.0:301; RV64IA-ZABHA-NEXT: neg a1, a1302; RV64IA-ZABHA-NEXT: amoadd.b.aqrl a0, a1, (a0)303; RV64IA-ZABHA-NEXT: ret304;305; RV64IA-LABEL: atomicrmw_sub_i8:306; RV64IA: # %bb.0:307; RV64IA-NEXT: li a2, 255308; RV64IA-NEXT: andi a3, a0, -4309; RV64IA-NEXT: andi a0, a0, 3310; RV64IA-NEXT: zext.b a1, a1311; RV64IA-NEXT: slli a0, a0, 3312; RV64IA-NEXT: sllw a2, a2, a0313; RV64IA-NEXT: sllw a1, a1, a0314; RV64IA-NEXT: .LBB4_1: # =>This Inner Loop Header: Depth=1315; RV64IA-NEXT: lr.w.aqrl a4, (a3)316; RV64IA-NEXT: sub a5, a4, a1317; RV64IA-NEXT: xor a5, a4, a5318; RV64IA-NEXT: and a5, a5, a2319; RV64IA-NEXT: xor a5, a4, a5320; RV64IA-NEXT: sc.w.rl a5, a5, (a3)321; RV64IA-NEXT: bnez a5, .LBB4_1322; RV64IA-NEXT: # %bb.2:323; RV64IA-NEXT: srlw a0, a4, a0324; RV64IA-NEXT: ret325;326; RV64I-LABEL: atomicrmw_sub_i8:327; RV64I: # %bb.0:328; RV64I-NEXT: addi sp, sp, -16329; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill330; RV64I-NEXT: li a2, 5331; RV64I-NEXT: call __atomic_fetch_sub_1332; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload333; RV64I-NEXT: addi sp, sp, 16334; RV64I-NEXT: ret335 %res = atomicrmw sub ptr %ptr, i8 %rhs seq_cst336 ret i8 %res337}338 339define i16 @atomicrmw_sub_i16(ptr %ptr, i16 %rhs) nounwind {340; RV32IA-ZABHA-LABEL: atomicrmw_sub_i16:341; RV32IA-ZABHA: # %bb.0:342; RV32IA-ZABHA-NEXT: neg a1, a1343; RV32IA-ZABHA-NEXT: amoadd.h.aqrl a0, a1, (a0)344; RV32IA-ZABHA-NEXT: ret345;346; RV32IA-LABEL: atomicrmw_sub_i16:347; RV32IA: # %bb.0:348; RV32IA-NEXT: lui a2, 16349; RV32IA-NEXT: andi a3, a0, -4350; RV32IA-NEXT: andi a0, a0, 3351; RV32IA-NEXT: addi a2, a2, -1352; RV32IA-NEXT: slli a0, a0, 3353; RV32IA-NEXT: sll a4, a2, a0354; RV32IA-NEXT: and a1, a1, a2355; RV32IA-NEXT: sll a1, a1, a0356; RV32IA-NEXT: .LBB5_1: # =>This Inner Loop Header: Depth=1357; RV32IA-NEXT: lr.w.aqrl a2, (a3)358; RV32IA-NEXT: sub a5, a2, a1359; RV32IA-NEXT: xor a5, a2, a5360; RV32IA-NEXT: and a5, a5, a4361; RV32IA-NEXT: xor a5, a2, a5362; RV32IA-NEXT: sc.w.rl a5, a5, (a3)363; RV32IA-NEXT: bnez a5, .LBB5_1364; RV32IA-NEXT: # %bb.2:365; RV32IA-NEXT: srl a0, a2, a0366; RV32IA-NEXT: ret367;368; RV32I-LABEL: atomicrmw_sub_i16:369; RV32I: # %bb.0:370; RV32I-NEXT: addi sp, sp, -16371; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill372; RV32I-NEXT: li a2, 5373; RV32I-NEXT: call __atomic_fetch_sub_2374; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload375; RV32I-NEXT: addi sp, sp, 16376; RV32I-NEXT: ret377;378; RV64IA-ZABHA-LABEL: atomicrmw_sub_i16:379; RV64IA-ZABHA: # %bb.0:380; RV64IA-ZABHA-NEXT: neg a1, a1381; RV64IA-ZABHA-NEXT: amoadd.h.aqrl a0, a1, (a0)382; RV64IA-ZABHA-NEXT: ret383;384; RV64IA-LABEL: atomicrmw_sub_i16:385; RV64IA: # %bb.0:386; RV64IA-NEXT: lui a2, 16387; RV64IA-NEXT: andi a3, a0, -4388; RV64IA-NEXT: andi a0, a0, 3389; RV64IA-NEXT: addi a2, a2, -1390; RV64IA-NEXT: slli a0, a0, 3391; RV64IA-NEXT: sllw a4, a2, a0392; RV64IA-NEXT: and a1, a1, a2393; RV64IA-NEXT: sllw a1, a1, a0394; RV64IA-NEXT: .LBB5_1: # =>This Inner Loop Header: Depth=1395; RV64IA-NEXT: lr.w.aqrl a2, (a3)396; RV64IA-NEXT: sub a5, a2, a1397; RV64IA-NEXT: xor a5, a2, a5398; RV64IA-NEXT: and a5, a5, a4399; RV64IA-NEXT: xor a5, a2, a5400; RV64IA-NEXT: sc.w.rl a5, a5, (a3)401; RV64IA-NEXT: bnez a5, .LBB5_1402; RV64IA-NEXT: # %bb.2:403; RV64IA-NEXT: srlw a0, a2, a0404; RV64IA-NEXT: ret405;406; RV64I-LABEL: atomicrmw_sub_i16:407; RV64I: # %bb.0:408; RV64I-NEXT: addi sp, sp, -16409; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill410; RV64I-NEXT: li a2, 5411; RV64I-NEXT: call __atomic_fetch_sub_2412; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload413; RV64I-NEXT: addi sp, sp, 16414; RV64I-NEXT: ret415 %res = atomicrmw sub ptr %ptr, i16 %rhs seq_cst416 ret i16 %res417}418 419define i32 @atomicrmw_sub_i32(ptr %ptr, i32 %rhs) nounwind {420; RV32IA-ZABHA-LABEL: atomicrmw_sub_i32:421; RV32IA-ZABHA: # %bb.0:422; RV32IA-ZABHA-NEXT: neg a1, a1423; RV32IA-ZABHA-NEXT: amoadd.w.aqrl a0, a1, (a0)424; RV32IA-ZABHA-NEXT: ret425;426; RV32IA-LABEL: atomicrmw_sub_i32:427; RV32IA: # %bb.0:428; RV32IA-NEXT: neg a1, a1429; RV32IA-NEXT: amoadd.w.aqrl a0, a1, (a0)430; RV32IA-NEXT: ret431;432; RV32I-LABEL: atomicrmw_sub_i32:433; RV32I: # %bb.0:434; RV32I-NEXT: addi sp, sp, -16435; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill436; RV32I-NEXT: li a2, 5437; RV32I-NEXT: call __atomic_fetch_sub_4438; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload439; RV32I-NEXT: addi sp, sp, 16440; RV32I-NEXT: ret441;442; RV64IA-ZABHA-LABEL: atomicrmw_sub_i32:443; RV64IA-ZABHA: # %bb.0:444; RV64IA-ZABHA-NEXT: neg a1, a1445; RV64IA-ZABHA-NEXT: amoadd.w.aqrl a0, a1, (a0)446; RV64IA-ZABHA-NEXT: ret447;448; RV64IA-LABEL: atomicrmw_sub_i32:449; RV64IA: # %bb.0:450; RV64IA-NEXT: neg a1, a1451; RV64IA-NEXT: amoadd.w.aqrl a0, a1, (a0)452; RV64IA-NEXT: ret453;454; RV64I-LABEL: atomicrmw_sub_i32:455; RV64I: # %bb.0:456; RV64I-NEXT: addi sp, sp, -16457; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill458; RV64I-NEXT: li a2, 5459; RV64I-NEXT: call __atomic_fetch_sub_4460; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload461; RV64I-NEXT: addi sp, sp, 16462; RV64I-NEXT: ret463 %res = atomicrmw sub ptr %ptr, i32 %rhs seq_cst464 ret i32 %res465}466 467define i64 @atomicrmw_sub_i64(ptr %ptr, i64 %rhs) nounwind {468; RV32IA-ZABHA-LABEL: atomicrmw_sub_i64:469; RV32IA-ZABHA: # %bb.0:470; RV32IA-ZABHA-NEXT: addi sp, sp, -16471; RV32IA-ZABHA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill472; RV32IA-ZABHA-NEXT: li a3, 5473; RV32IA-ZABHA-NEXT: call __atomic_fetch_sub_8474; RV32IA-ZABHA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload475; RV32IA-ZABHA-NEXT: addi sp, sp, 16476; RV32IA-ZABHA-NEXT: ret477;478; RV32IA-LABEL: atomicrmw_sub_i64:479; RV32IA: # %bb.0:480; RV32IA-NEXT: addi sp, sp, -16481; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill482; RV32IA-NEXT: li a3, 5483; RV32IA-NEXT: call __atomic_fetch_sub_8484; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload485; RV32IA-NEXT: addi sp, sp, 16486; RV32IA-NEXT: ret487;488; RV32I-LABEL: atomicrmw_sub_i64:489; RV32I: # %bb.0:490; RV32I-NEXT: addi sp, sp, -16491; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill492; RV32I-NEXT: li a3, 5493; RV32I-NEXT: call __atomic_fetch_sub_8494; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload495; RV32I-NEXT: addi sp, sp, 16496; RV32I-NEXT: ret497;498; RV64IA-ZABHA-LABEL: atomicrmw_sub_i64:499; RV64IA-ZABHA: # %bb.0:500; RV64IA-ZABHA-NEXT: neg a1, a1501; RV64IA-ZABHA-NEXT: amoadd.d.aqrl a0, a1, (a0)502; RV64IA-ZABHA-NEXT: ret503;504; RV64IA-LABEL: atomicrmw_sub_i64:505; RV64IA: # %bb.0:506; RV64IA-NEXT: neg a1, a1507; RV64IA-NEXT: amoadd.d.aqrl a0, a1, (a0)508; RV64IA-NEXT: ret509;510; RV64I-LABEL: atomicrmw_sub_i64:511; RV64I: # %bb.0:512; RV64I-NEXT: addi sp, sp, -16513; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill514; RV64I-NEXT: li a2, 5515; RV64I-NEXT: call __atomic_fetch_sub_8516; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload517; RV64I-NEXT: addi sp, sp, 16518; RV64I-NEXT: ret519 %res = atomicrmw sub ptr %ptr, i64 %rhs seq_cst520 ret i64 %res521}522 523define i16 @atomicrmw_sub_i16_constant(ptr %a) nounwind {524; RV32IA-ZABHA-LABEL: atomicrmw_sub_i16_constant:525; RV32IA-ZABHA: # %bb.0:526; RV32IA-ZABHA-NEXT: li a1, -1527; RV32IA-ZABHA-NEXT: amoadd.h.aqrl a0, a1, (a0)528; RV32IA-ZABHA-NEXT: ret529;530; RV32IA-LABEL: atomicrmw_sub_i16_constant:531; RV32IA: # %bb.0:532; RV32IA-NEXT: lui a1, 16533; RV32IA-NEXT: li a2, 1534; RV32IA-NEXT: andi a3, a0, -4535; RV32IA-NEXT: andi a0, a0, 3536; RV32IA-NEXT: addi a1, a1, -1537; RV32IA-NEXT: slli a0, a0, 3538; RV32IA-NEXT: sll a1, a1, a0539; RV32IA-NEXT: sll a2, a2, a0540; RV32IA-NEXT: .LBB8_1: # =>This Inner Loop Header: Depth=1541; RV32IA-NEXT: lr.w.aqrl a4, (a3)542; RV32IA-NEXT: sub a5, a4, a2543; RV32IA-NEXT: xor a5, a4, a5544; RV32IA-NEXT: and a5, a5, a1545; RV32IA-NEXT: xor a5, a4, a5546; RV32IA-NEXT: sc.w.rl a5, a5, (a3)547; RV32IA-NEXT: bnez a5, .LBB8_1548; RV32IA-NEXT: # %bb.2:549; RV32IA-NEXT: srl a0, a4, a0550; RV32IA-NEXT: ret551;552; RV32I-LABEL: atomicrmw_sub_i16_constant:553; RV32I: # %bb.0:554; RV32I-NEXT: addi sp, sp, -16555; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill556; RV32I-NEXT: li a1, 1557; RV32I-NEXT: li a2, 5558; RV32I-NEXT: call __atomic_fetch_sub_2559; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload560; RV32I-NEXT: addi sp, sp, 16561; RV32I-NEXT: ret562;563; RV64IA-ZABHA-LABEL: atomicrmw_sub_i16_constant:564; RV64IA-ZABHA: # %bb.0:565; RV64IA-ZABHA-NEXT: li a1, 1566; RV64IA-ZABHA-NEXT: neg a1, a1567; RV64IA-ZABHA-NEXT: amoadd.h.aqrl a0, a1, (a0)568; RV64IA-ZABHA-NEXT: ret569;570; RV64IA-LABEL: atomicrmw_sub_i16_constant:571; RV64IA: # %bb.0:572; RV64IA-NEXT: lui a1, 16573; RV64IA-NEXT: li a2, 1574; RV64IA-NEXT: andi a3, a0, -4575; RV64IA-NEXT: andi a0, a0, 3576; RV64IA-NEXT: addi a1, a1, -1577; RV64IA-NEXT: slli a0, a0, 3578; RV64IA-NEXT: sllw a1, a1, a0579; RV64IA-NEXT: sllw a2, a2, a0580; RV64IA-NEXT: .LBB8_1: # =>This Inner Loop Header: Depth=1581; RV64IA-NEXT: lr.w.aqrl a4, (a3)582; RV64IA-NEXT: sub a5, a4, a2583; RV64IA-NEXT: xor a5, a4, a5584; RV64IA-NEXT: and a5, a5, a1585; RV64IA-NEXT: xor a5, a4, a5586; RV64IA-NEXT: sc.w.rl a5, a5, (a3)587; RV64IA-NEXT: bnez a5, .LBB8_1588; RV64IA-NEXT: # %bb.2:589; RV64IA-NEXT: srlw a0, a4, a0590; RV64IA-NEXT: ret591;592; RV64I-LABEL: atomicrmw_sub_i16_constant:593; RV64I: # %bb.0:594; RV64I-NEXT: addi sp, sp, -16595; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill596; RV64I-NEXT: li a1, 1597; RV64I-NEXT: li a2, 5598; RV64I-NEXT: call __atomic_fetch_sub_2599; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload600; RV64I-NEXT: addi sp, sp, 16601; RV64I-NEXT: ret602 %1 = atomicrmw sub ptr %a, i16 1 seq_cst603 ret i16 %1604}605 606define i8 @atomicrmw_sub_i8_constant(ptr %a) nounwind {607; RV32IA-ZABHA-LABEL: atomicrmw_sub_i8_constant:608; RV32IA-ZABHA: # %bb.0:609; RV32IA-ZABHA-NEXT: li a1, -1610; RV32IA-ZABHA-NEXT: amoadd.b.aqrl a0, a1, (a0)611; RV32IA-ZABHA-NEXT: ret612;613; RV32IA-LABEL: atomicrmw_sub_i8_constant:614; RV32IA: # %bb.0:615; RV32IA-NEXT: li a1, 255616; RV32IA-NEXT: li a2, 1617; RV32IA-NEXT: andi a3, a0, -4618; RV32IA-NEXT: andi a0, a0, 3619; RV32IA-NEXT: slli a0, a0, 3620; RV32IA-NEXT: sll a1, a1, a0621; RV32IA-NEXT: sll a2, a2, a0622; RV32IA-NEXT: .LBB9_1: # =>This Inner Loop Header: Depth=1623; RV32IA-NEXT: lr.w.aqrl a4, (a3)624; RV32IA-NEXT: sub a5, a4, a2625; RV32IA-NEXT: xor a5, a4, a5626; RV32IA-NEXT: and a5, a5, a1627; RV32IA-NEXT: xor a5, a4, a5628; RV32IA-NEXT: sc.w.rl a5, a5, (a3)629; RV32IA-NEXT: bnez a5, .LBB9_1630; RV32IA-NEXT: # %bb.2:631; RV32IA-NEXT: srl a0, a4, a0632; RV32IA-NEXT: ret633;634; RV32I-LABEL: atomicrmw_sub_i8_constant:635; RV32I: # %bb.0:636; RV32I-NEXT: addi sp, sp, -16637; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill638; RV32I-NEXT: li a1, 1639; RV32I-NEXT: li a2, 5640; RV32I-NEXT: call __atomic_fetch_sub_1641; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload642; RV32I-NEXT: addi sp, sp, 16643; RV32I-NEXT: ret644;645; RV64IA-ZABHA-LABEL: atomicrmw_sub_i8_constant:646; RV64IA-ZABHA: # %bb.0:647; RV64IA-ZABHA-NEXT: li a1, 1648; RV64IA-ZABHA-NEXT: neg a1, a1649; RV64IA-ZABHA-NEXT: amoadd.b.aqrl a0, a1, (a0)650; RV64IA-ZABHA-NEXT: ret651;652; RV64IA-LABEL: atomicrmw_sub_i8_constant:653; RV64IA: # %bb.0:654; RV64IA-NEXT: li a1, 255655; RV64IA-NEXT: li a2, 1656; RV64IA-NEXT: andi a3, a0, -4657; RV64IA-NEXT: andi a0, a0, 3658; RV64IA-NEXT: slli a0, a0, 3659; RV64IA-NEXT: sllw a1, a1, a0660; RV64IA-NEXT: sllw a2, a2, a0661; RV64IA-NEXT: .LBB9_1: # =>This Inner Loop Header: Depth=1662; RV64IA-NEXT: lr.w.aqrl a4, (a3)663; RV64IA-NEXT: sub a5, a4, a2664; RV64IA-NEXT: xor a5, a4, a5665; RV64IA-NEXT: and a5, a5, a1666; RV64IA-NEXT: xor a5, a4, a5667; RV64IA-NEXT: sc.w.rl a5, a5, (a3)668; RV64IA-NEXT: bnez a5, .LBB9_1669; RV64IA-NEXT: # %bb.2:670; RV64IA-NEXT: srlw a0, a4, a0671; RV64IA-NEXT: ret672;673; RV64I-LABEL: atomicrmw_sub_i8_constant:674; RV64I: # %bb.0:675; RV64I-NEXT: addi sp, sp, -16676; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill677; RV64I-NEXT: li a1, 1678; RV64I-NEXT: li a2, 5679; RV64I-NEXT: call __atomic_fetch_sub_1680; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload681; RV64I-NEXT: addi sp, sp, 16682; RV64I-NEXT: ret683 %1 = atomicrmw sub ptr %a, i8 1 seq_cst684 ret i8 %1685}686 687define i32 @atomicrmw_sub_i32_constant(ptr %a) nounwind {688; RV32IA-ZABHA-LABEL: atomicrmw_sub_i32_constant:689; RV32IA-ZABHA: # %bb.0:690; RV32IA-ZABHA-NEXT: li a1, -1691; RV32IA-ZABHA-NEXT: amoadd.w.aqrl a0, a1, (a0)692; RV32IA-ZABHA-NEXT: ret693;694; RV32IA-LABEL: atomicrmw_sub_i32_constant:695; RV32IA: # %bb.0:696; RV32IA-NEXT: li a1, -1697; RV32IA-NEXT: amoadd.w.aqrl a0, a1, (a0)698; RV32IA-NEXT: ret699;700; RV32I-LABEL: atomicrmw_sub_i32_constant:701; RV32I: # %bb.0:702; RV32I-NEXT: addi sp, sp, -16703; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill704; RV32I-NEXT: li a1, 1705; RV32I-NEXT: li a2, 5706; RV32I-NEXT: call __atomic_fetch_sub_4707; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload708; RV32I-NEXT: addi sp, sp, 16709; RV32I-NEXT: ret710;711; RV64IA-ZABHA-LABEL: atomicrmw_sub_i32_constant:712; RV64IA-ZABHA: # %bb.0:713; RV64IA-ZABHA-NEXT: li a1, 1714; RV64IA-ZABHA-NEXT: neg a1, a1715; RV64IA-ZABHA-NEXT: amoadd.w.aqrl a0, a1, (a0)716; RV64IA-ZABHA-NEXT: ret717;718; RV64IA-LABEL: atomicrmw_sub_i32_constant:719; RV64IA: # %bb.0:720; RV64IA-NEXT: li a1, 1721; RV64IA-NEXT: neg a1, a1722; RV64IA-NEXT: amoadd.w.aqrl a0, a1, (a0)723; RV64IA-NEXT: ret724;725; RV64I-LABEL: atomicrmw_sub_i32_constant:726; RV64I: # %bb.0:727; RV64I-NEXT: addi sp, sp, -16728; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill729; RV64I-NEXT: li a1, 1730; RV64I-NEXT: li a2, 5731; RV64I-NEXT: call __atomic_fetch_sub_4732; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload733; RV64I-NEXT: addi sp, sp, 16734; RV64I-NEXT: ret735 %1 = atomicrmw sub ptr %a, i32 1 seq_cst736 ret i32 %1737}738 739define i64 @atomicrmw_sub_i64_constant(ptr %a) nounwind {740; RV32IA-ZABHA-LABEL: atomicrmw_sub_i64_constant:741; RV32IA-ZABHA: # %bb.0:742; RV32IA-ZABHA-NEXT: addi sp, sp, -16743; RV32IA-ZABHA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill744; RV32IA-ZABHA-NEXT: li a1, 1745; RV32IA-ZABHA-NEXT: li a3, 5746; RV32IA-ZABHA-NEXT: li a2, 0747; RV32IA-ZABHA-NEXT: call __atomic_fetch_sub_8748; RV32IA-ZABHA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload749; RV32IA-ZABHA-NEXT: addi sp, sp, 16750; RV32IA-ZABHA-NEXT: ret751;752; RV32IA-LABEL: atomicrmw_sub_i64_constant:753; RV32IA: # %bb.0:754; RV32IA-NEXT: addi sp, sp, -16755; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill756; RV32IA-NEXT: li a1, 1757; RV32IA-NEXT: li a3, 5758; RV32IA-NEXT: li a2, 0759; RV32IA-NEXT: call __atomic_fetch_sub_8760; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload761; RV32IA-NEXT: addi sp, sp, 16762; RV32IA-NEXT: ret763;764; RV32I-LABEL: atomicrmw_sub_i64_constant:765; RV32I: # %bb.0:766; RV32I-NEXT: addi sp, sp, -16767; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill768; RV32I-NEXT: li a1, 1769; RV32I-NEXT: li a3, 5770; RV32I-NEXT: li a2, 0771; RV32I-NEXT: call __atomic_fetch_sub_8772; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload773; RV32I-NEXT: addi sp, sp, 16774; RV32I-NEXT: ret775;776; RV64IA-ZABHA-LABEL: atomicrmw_sub_i64_constant:777; RV64IA-ZABHA: # %bb.0:778; RV64IA-ZABHA-NEXT: li a1, -1779; RV64IA-ZABHA-NEXT: amoadd.d.aqrl a0, a1, (a0)780; RV64IA-ZABHA-NEXT: ret781;782; RV64IA-LABEL: atomicrmw_sub_i64_constant:783; RV64IA: # %bb.0:784; RV64IA-NEXT: li a1, -1785; RV64IA-NEXT: amoadd.d.aqrl a0, a1, (a0)786; RV64IA-NEXT: ret787;788; RV64I-LABEL: atomicrmw_sub_i64_constant:789; RV64I: # %bb.0:790; RV64I-NEXT: addi sp, sp, -16791; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill792; RV64I-NEXT: li a1, 1793; RV64I-NEXT: li a2, 5794; RV64I-NEXT: call __atomic_fetch_sub_8795; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload796; RV64I-NEXT: addi sp, sp, 16797; RV64I-NEXT: ret798 %1 = atomicrmw sub ptr %a, i64 1 seq_cst799 ret i64 %1800}801 802define i32 @atomicrmw_sub_i32_neg(ptr %a, i32 %x, i32 %y) nounwind {803; RV32IA-ZABHA-LABEL: atomicrmw_sub_i32_neg:804; RV32IA-ZABHA: # %bb.0:805; RV32IA-ZABHA-NEXT: sub a1, a1, a2806; RV32IA-ZABHA-NEXT: neg a1, a1807; RV32IA-ZABHA-NEXT: amoadd.w.aqrl a0, a1, (a0)808; RV32IA-ZABHA-NEXT: ret809;810; RV32IA-LABEL: atomicrmw_sub_i32_neg:811; RV32IA: # %bb.0:812; RV32IA-NEXT: sub a1, a1, a2813; RV32IA-NEXT: neg a1, a1814; RV32IA-NEXT: amoadd.w.aqrl a0, a1, (a0)815; RV32IA-NEXT: ret816;817; RV32I-LABEL: atomicrmw_sub_i32_neg:818; RV32I: # %bb.0:819; RV32I-NEXT: addi sp, sp, -16820; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill821; RV32I-NEXT: sub a1, a1, a2822; RV32I-NEXT: li a2, 5823; RV32I-NEXT: call __atomic_fetch_sub_4824; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload825; RV32I-NEXT: addi sp, sp, 16826; RV32I-NEXT: ret827;828; RV64IA-ZABHA-LABEL: atomicrmw_sub_i32_neg:829; RV64IA-ZABHA: # %bb.0:830; RV64IA-ZABHA-NEXT: subw a1, a1, a2831; RV64IA-ZABHA-NEXT: neg a1, a1832; RV64IA-ZABHA-NEXT: amoadd.w.aqrl a0, a1, (a0)833; RV64IA-ZABHA-NEXT: ret834;835; RV64IA-LABEL: atomicrmw_sub_i32_neg:836; RV64IA: # %bb.0:837; RV64IA-NEXT: subw a1, a1, a2838; RV64IA-NEXT: neg a1, a1839; RV64IA-NEXT: amoadd.w.aqrl a0, a1, (a0)840; RV64IA-NEXT: ret841;842; RV64I-LABEL: atomicrmw_sub_i32_neg:843; RV64I: # %bb.0:844; RV64I-NEXT: addi sp, sp, -16845; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill846; RV64I-NEXT: subw a1, a1, a2847; RV64I-NEXT: li a2, 5848; RV64I-NEXT: call __atomic_fetch_sub_4849; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload850; RV64I-NEXT: addi sp, sp, 16851; RV64I-NEXT: ret852 %b = sub i32 %x, %y853 %1 = atomicrmw sub ptr %a, i32 %b seq_cst854 ret i32 %1855}856 857define i64 @atomicrmw_sub_i64_neg(ptr %a, i64 %x, i64 %y) nounwind {858; RV32IA-ZABHA-LABEL: atomicrmw_sub_i64_neg:859; RV32IA-ZABHA: # %bb.0:860; RV32IA-ZABHA-NEXT: addi sp, sp, -16861; RV32IA-ZABHA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill862; RV32IA-ZABHA-NEXT: sub a5, a1, a3863; RV32IA-ZABHA-NEXT: sltu a1, a1, a3864; RV32IA-ZABHA-NEXT: sub a2, a2, a4865; RV32IA-ZABHA-NEXT: sub a2, a2, a1866; RV32IA-ZABHA-NEXT: li a3, 5867; RV32IA-ZABHA-NEXT: mv a1, a5868; RV32IA-ZABHA-NEXT: call __atomic_fetch_sub_8869; RV32IA-ZABHA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload870; RV32IA-ZABHA-NEXT: addi sp, sp, 16871; RV32IA-ZABHA-NEXT: ret872;873; RV32IA-LABEL: atomicrmw_sub_i64_neg:874; RV32IA: # %bb.0:875; RV32IA-NEXT: addi sp, sp, -16876; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill877; RV32IA-NEXT: sub a5, a1, a3878; RV32IA-NEXT: sltu a1, a1, a3879; RV32IA-NEXT: sub a2, a2, a4880; RV32IA-NEXT: sub a2, a2, a1881; RV32IA-NEXT: li a3, 5882; RV32IA-NEXT: mv a1, a5883; RV32IA-NEXT: call __atomic_fetch_sub_8884; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload885; RV32IA-NEXT: addi sp, sp, 16886; RV32IA-NEXT: ret887;888; RV32I-LABEL: atomicrmw_sub_i64_neg:889; RV32I: # %bb.0:890; RV32I-NEXT: addi sp, sp, -16891; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill892; RV32I-NEXT: sub a5, a1, a3893; RV32I-NEXT: sltu a1, a1, a3894; RV32I-NEXT: sub a2, a2, a4895; RV32I-NEXT: sub a2, a2, a1896; RV32I-NEXT: li a3, 5897; RV32I-NEXT: mv a1, a5898; RV32I-NEXT: call __atomic_fetch_sub_8899; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload900; RV32I-NEXT: addi sp, sp, 16901; RV32I-NEXT: ret902;903; RV64IA-ZABHA-LABEL: atomicrmw_sub_i64_neg:904; RV64IA-ZABHA: # %bb.0:905; RV64IA-ZABHA-NEXT: sub a1, a1, a2906; RV64IA-ZABHA-NEXT: neg a1, a1907; RV64IA-ZABHA-NEXT: amoadd.d.aqrl a0, a1, (a0)908; RV64IA-ZABHA-NEXT: ret909;910; RV64IA-LABEL: atomicrmw_sub_i64_neg:911; RV64IA: # %bb.0:912; RV64IA-NEXT: sub a1, a1, a2913; RV64IA-NEXT: neg a1, a1914; RV64IA-NEXT: amoadd.d.aqrl a0, a1, (a0)915; RV64IA-NEXT: ret916;917; RV64I-LABEL: atomicrmw_sub_i64_neg:918; RV64I: # %bb.0:919; RV64I-NEXT: addi sp, sp, -16920; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill921; RV64I-NEXT: sub a1, a1, a2922; RV64I-NEXT: li a2, 5923; RV64I-NEXT: call __atomic_fetch_sub_8924; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload925; RV64I-NEXT: addi sp, sp, 16926; RV64I-NEXT: ret927 %b = sub i64 %x, %y928 %1 = atomicrmw sub ptr %a, i64 %b seq_cst929 ret i64 %1930}931