brintos

brintos / llvm-project-archived public Read only

0
0
Text · 47.8 KiB · ea9786d Raw
1351 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; 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-prefix=RV32IA %s6; RUN: llc -mtriple=riscv32 -mattr=+a,+ztso -verify-machineinstrs < %s \7; RUN:   | FileCheck -check-prefix=RV32IA %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-prefix=RV64IA %s12; RUN: llc -mtriple=riscv64 -mattr=+a,+ztso -verify-machineinstrs < %s \13; RUN:   | FileCheck -check-prefix=RV64IA %s14 15 16define i8 @atomicrmw_usub_cond_i8(ptr %ptr, i8 %val) {17; RV32I-LABEL: atomicrmw_usub_cond_i8:18; RV32I:       # %bb.0:19; RV32I-NEXT:    addi sp, sp, -3220; RV32I-NEXT:    .cfi_def_cfa_offset 3221; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill22; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill23; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill24; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill25; RV32I-NEXT:    .cfi_offset ra, -426; RV32I-NEXT:    .cfi_offset s0, -827; RV32I-NEXT:    .cfi_offset s1, -1228; RV32I-NEXT:    .cfi_offset s2, -1629; RV32I-NEXT:    mv s0, a030; RV32I-NEXT:    lbu a3, 0(a0)31; RV32I-NEXT:    mv s1, a132; RV32I-NEXT:    zext.b s2, a133; RV32I-NEXT:  .LBB0_1: # %atomicrmw.start34; RV32I-NEXT:    # =>This Inner Loop Header: Depth=135; RV32I-NEXT:    zext.b a0, a336; RV32I-NEXT:    sltu a0, a0, s237; RV32I-NEXT:    addi a0, a0, -138; RV32I-NEXT:    and a0, a0, s139; RV32I-NEXT:    sub a2, a3, a040; RV32I-NEXT:    sb a3, 15(sp)41; RV32I-NEXT:    addi a1, sp, 1542; RV32I-NEXT:    li a3, 543; RV32I-NEXT:    li a4, 544; RV32I-NEXT:    mv a0, s045; RV32I-NEXT:    call __atomic_compare_exchange_146; RV32I-NEXT:    lbu a3, 15(sp)47; RV32I-NEXT:    beqz a0, .LBB0_148; RV32I-NEXT:  # %bb.2: # %atomicrmw.end49; RV32I-NEXT:    mv a0, a350; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload51; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload52; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload53; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload54; RV32I-NEXT:    .cfi_restore ra55; RV32I-NEXT:    .cfi_restore s056; RV32I-NEXT:    .cfi_restore s157; RV32I-NEXT:    .cfi_restore s258; RV32I-NEXT:    addi sp, sp, 3259; RV32I-NEXT:    .cfi_def_cfa_offset 060; RV32I-NEXT:    ret61;62; RV32IA-LABEL: atomicrmw_usub_cond_i8:63; RV32IA:       # %bb.0:64; RV32IA-NEXT:    andi a2, a0, -465; RV32IA-NEXT:    slli a3, a0, 366; RV32IA-NEXT:    li a4, 25567; RV32IA-NEXT:    andi a0, a3, 2468; RV32IA-NEXT:    lw a5, 0(a2)69; RV32IA-NEXT:    sll a3, a4, a370; RV32IA-NEXT:    not a3, a371; RV32IA-NEXT:    zext.b a4, a172; RV32IA-NEXT:  .LBB0_1: # %atomicrmw.start73; RV32IA-NEXT:    # =>This Loop Header: Depth=174; RV32IA-NEXT:    # Child Loop BB0_3 Depth 275; RV32IA-NEXT:    mv a6, a576; RV32IA-NEXT:    srl a5, a5, a077; RV32IA-NEXT:    zext.b a7, a578; RV32IA-NEXT:    sltu a7, a7, a479; RV32IA-NEXT:    addi a7, a7, -180; RV32IA-NEXT:    and a7, a7, a181; RV32IA-NEXT:    sub a5, a5, a782; RV32IA-NEXT:    zext.b a5, a583; RV32IA-NEXT:    sll a5, a5, a084; RV32IA-NEXT:    and a7, a6, a385; RV32IA-NEXT:    or a7, a7, a586; RV32IA-NEXT:  .LBB0_3: # %atomicrmw.start87; RV32IA-NEXT:    # Parent Loop BB0_1 Depth=188; RV32IA-NEXT:    # => This Inner Loop Header: Depth=289; RV32IA-NEXT:    lr.w.aqrl a5, (a2)90; RV32IA-NEXT:    bne a5, a6, .LBB0_191; RV32IA-NEXT:  # %bb.4: # %atomicrmw.start92; RV32IA-NEXT:    # in Loop: Header=BB0_3 Depth=293; RV32IA-NEXT:    sc.w.rl t0, a7, (a2)94; RV32IA-NEXT:    bnez t0, .LBB0_395; RV32IA-NEXT:  # %bb.5: # %atomicrmw.start96; RV32IA-NEXT:  # %bb.2: # %atomicrmw.end97; RV32IA-NEXT:    srl a0, a5, a098; RV32IA-NEXT:    ret99;100; RV64I-LABEL: atomicrmw_usub_cond_i8:101; RV64I:       # %bb.0:102; RV64I-NEXT:    addi sp, sp, -48103; RV64I-NEXT:    .cfi_def_cfa_offset 48104; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill105; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill106; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill107; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill108; RV64I-NEXT:    .cfi_offset ra, -8109; RV64I-NEXT:    .cfi_offset s0, -16110; RV64I-NEXT:    .cfi_offset s1, -24111; RV64I-NEXT:    .cfi_offset s2, -32112; RV64I-NEXT:    mv s0, a0113; RV64I-NEXT:    lbu a3, 0(a0)114; RV64I-NEXT:    mv s1, a1115; RV64I-NEXT:    zext.b s2, a1116; RV64I-NEXT:  .LBB0_1: # %atomicrmw.start117; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1118; RV64I-NEXT:    zext.b a0, a3119; RV64I-NEXT:    sltu a0, a0, s2120; RV64I-NEXT:    addi a0, a0, -1121; RV64I-NEXT:    and a0, a0, s1122; RV64I-NEXT:    sub a2, a3, a0123; RV64I-NEXT:    sb a3, 15(sp)124; RV64I-NEXT:    addi a1, sp, 15125; RV64I-NEXT:    li a3, 5126; RV64I-NEXT:    li a4, 5127; RV64I-NEXT:    mv a0, s0128; RV64I-NEXT:    call __atomic_compare_exchange_1129; RV64I-NEXT:    lbu a3, 15(sp)130; RV64I-NEXT:    beqz a0, .LBB0_1131; RV64I-NEXT:  # %bb.2: # %atomicrmw.end132; RV64I-NEXT:    mv a0, a3133; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload134; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload135; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload136; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload137; RV64I-NEXT:    .cfi_restore ra138; RV64I-NEXT:    .cfi_restore s0139; RV64I-NEXT:    .cfi_restore s1140; RV64I-NEXT:    .cfi_restore s2141; RV64I-NEXT:    addi sp, sp, 48142; RV64I-NEXT:    .cfi_def_cfa_offset 0143; RV64I-NEXT:    ret144;145; RV64IA-LABEL: atomicrmw_usub_cond_i8:146; RV64IA:       # %bb.0:147; RV64IA-NEXT:    andi a2, a0, -4148; RV64IA-NEXT:    slli a4, a0, 3149; RV64IA-NEXT:    li a5, 255150; RV64IA-NEXT:    andi a0, a4, 24151; RV64IA-NEXT:    lw a3, 0(a2)152; RV64IA-NEXT:    sllw a4, a5, a4153; RV64IA-NEXT:    not a4, a4154; RV64IA-NEXT:    zext.b a5, a1155; RV64IA-NEXT:  .LBB0_1: # %atomicrmw.start156; RV64IA-NEXT:    # =>This Loop Header: Depth=1157; RV64IA-NEXT:    # Child Loop BB0_3 Depth 2158; RV64IA-NEXT:    srlw a6, a3, a0159; RV64IA-NEXT:    sext.w a7, a3160; RV64IA-NEXT:    zext.b t0, a6161; RV64IA-NEXT:    sltu t0, t0, a5162; RV64IA-NEXT:    addi t0, t0, -1163; RV64IA-NEXT:    and t0, t0, a1164; RV64IA-NEXT:    sub a6, a6, t0165; RV64IA-NEXT:    zext.b a6, a6166; RV64IA-NEXT:    sllw a6, a6, a0167; RV64IA-NEXT:    and a3, a3, a4168; RV64IA-NEXT:    or a6, a3, a6169; RV64IA-NEXT:  .LBB0_3: # %atomicrmw.start170; RV64IA-NEXT:    # Parent Loop BB0_1 Depth=1171; RV64IA-NEXT:    # => This Inner Loop Header: Depth=2172; RV64IA-NEXT:    lr.w.aqrl a3, (a2)173; RV64IA-NEXT:    bne a3, a7, .LBB0_1174; RV64IA-NEXT:  # %bb.4: # %atomicrmw.start175; RV64IA-NEXT:    # in Loop: Header=BB0_3 Depth=2176; RV64IA-NEXT:    sc.w.rl t0, a6, (a2)177; RV64IA-NEXT:    bnez t0, .LBB0_3178; RV64IA-NEXT:  # %bb.5: # %atomicrmw.start179; RV64IA-NEXT:  # %bb.2: # %atomicrmw.end180; RV64IA-NEXT:    srlw a0, a3, a0181; RV64IA-NEXT:    ret182  %result = atomicrmw usub_cond ptr %ptr, i8 %val seq_cst183  ret i8 %result184}185 186define i16 @atomicrmw_usub_cond_i16(ptr %ptr, i16 %val) {187; RV32I-LABEL: atomicrmw_usub_cond_i16:188; RV32I:       # %bb.0:189; RV32I-NEXT:    addi sp, sp, -32190; RV32I-NEXT:    .cfi_def_cfa_offset 32191; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill192; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill193; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill194; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill195; RV32I-NEXT:    sw s3, 12(sp) # 4-byte Folded Spill196; RV32I-NEXT:    .cfi_offset ra, -4197; RV32I-NEXT:    .cfi_offset s0, -8198; RV32I-NEXT:    .cfi_offset s1, -12199; RV32I-NEXT:    .cfi_offset s2, -16200; RV32I-NEXT:    .cfi_offset s3, -20201; RV32I-NEXT:    mv s0, a1202; RV32I-NEXT:    mv s1, a0203; RV32I-NEXT:    lhu a1, 0(a0)204; RV32I-NEXT:    lui s2, 16205; RV32I-NEXT:    addi s2, s2, -1206; RV32I-NEXT:    and s3, s0, s2207; RV32I-NEXT:  .LBB1_1: # %atomicrmw.start208; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1209; RV32I-NEXT:    and a0, a1, s2210; RV32I-NEXT:    sltu a0, a0, s3211; RV32I-NEXT:    addi a0, a0, -1212; RV32I-NEXT:    and a0, a0, s0213; RV32I-NEXT:    sub a2, a1, a0214; RV32I-NEXT:    sh a1, 10(sp)215; RV32I-NEXT:    addi a1, sp, 10216; RV32I-NEXT:    li a3, 5217; RV32I-NEXT:    li a4, 5218; RV32I-NEXT:    mv a0, s1219; RV32I-NEXT:    call __atomic_compare_exchange_2220; RV32I-NEXT:    lh a1, 10(sp)221; RV32I-NEXT:    beqz a0, .LBB1_1222; RV32I-NEXT:  # %bb.2: # %atomicrmw.end223; RV32I-NEXT:    mv a0, a1224; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload225; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload226; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload227; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload228; RV32I-NEXT:    lw s3, 12(sp) # 4-byte Folded Reload229; RV32I-NEXT:    .cfi_restore ra230; RV32I-NEXT:    .cfi_restore s0231; RV32I-NEXT:    .cfi_restore s1232; RV32I-NEXT:    .cfi_restore s2233; RV32I-NEXT:    .cfi_restore s3234; RV32I-NEXT:    addi sp, sp, 32235; RV32I-NEXT:    .cfi_def_cfa_offset 0236; RV32I-NEXT:    ret237;238; RV32IA-LABEL: atomicrmw_usub_cond_i16:239; RV32IA:       # %bb.0:240; RV32IA-NEXT:    andi a2, a0, -4241; RV32IA-NEXT:    slli a4, a0, 3242; RV32IA-NEXT:    lui a3, 16243; RV32IA-NEXT:    andi a0, a4, 24244; RV32IA-NEXT:    addi a3, a3, -1245; RV32IA-NEXT:    lw a6, 0(a2)246; RV32IA-NEXT:    sll a4, a3, a4247; RV32IA-NEXT:    not a4, a4248; RV32IA-NEXT:    and a5, a1, a3249; RV32IA-NEXT:  .LBB1_1: # %atomicrmw.start250; RV32IA-NEXT:    # =>This Loop Header: Depth=1251; RV32IA-NEXT:    # Child Loop BB1_3 Depth 2252; RV32IA-NEXT:    mv a7, a6253; RV32IA-NEXT:    srl a6, a6, a0254; RV32IA-NEXT:    and t0, a6, a3255; RV32IA-NEXT:    sltu t0, t0, a5256; RV32IA-NEXT:    addi t0, t0, -1257; RV32IA-NEXT:    and t0, t0, a1258; RV32IA-NEXT:    sub a6, a6, t0259; RV32IA-NEXT:    and a6, a6, a3260; RV32IA-NEXT:    sll a6, a6, a0261; RV32IA-NEXT:    and t0, a7, a4262; RV32IA-NEXT:    or t0, t0, a6263; RV32IA-NEXT:  .LBB1_3: # %atomicrmw.start264; RV32IA-NEXT:    # Parent Loop BB1_1 Depth=1265; RV32IA-NEXT:    # => This Inner Loop Header: Depth=2266; RV32IA-NEXT:    lr.w.aqrl a6, (a2)267; RV32IA-NEXT:    bne a6, a7, .LBB1_1268; RV32IA-NEXT:  # %bb.4: # %atomicrmw.start269; RV32IA-NEXT:    # in Loop: Header=BB1_3 Depth=2270; RV32IA-NEXT:    sc.w.rl t1, t0, (a2)271; RV32IA-NEXT:    bnez t1, .LBB1_3272; RV32IA-NEXT:  # %bb.5: # %atomicrmw.start273; RV32IA-NEXT:  # %bb.2: # %atomicrmw.end274; RV32IA-NEXT:    srl a0, a6, a0275; RV32IA-NEXT:    ret276;277; RV64I-LABEL: atomicrmw_usub_cond_i16:278; RV64I:       # %bb.0:279; RV64I-NEXT:    addi sp, sp, -48280; RV64I-NEXT:    .cfi_def_cfa_offset 48281; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill282; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill283; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill284; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill285; RV64I-NEXT:    sd s3, 8(sp) # 8-byte Folded Spill286; RV64I-NEXT:    .cfi_offset ra, -8287; RV64I-NEXT:    .cfi_offset s0, -16288; RV64I-NEXT:    .cfi_offset s1, -24289; RV64I-NEXT:    .cfi_offset s2, -32290; RV64I-NEXT:    .cfi_offset s3, -40291; RV64I-NEXT:    mv s0, a1292; RV64I-NEXT:    mv s1, a0293; RV64I-NEXT:    lhu a1, 0(a0)294; RV64I-NEXT:    lui s2, 16295; RV64I-NEXT:    addi s2, s2, -1296; RV64I-NEXT:    and s3, s0, s2297; RV64I-NEXT:  .LBB1_1: # %atomicrmw.start298; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1299; RV64I-NEXT:    and a0, a1, s2300; RV64I-NEXT:    sltu a0, a0, s3301; RV64I-NEXT:    addi a0, a0, -1302; RV64I-NEXT:    and a0, a0, s0303; RV64I-NEXT:    sub a2, a1, a0304; RV64I-NEXT:    sh a1, 6(sp)305; RV64I-NEXT:    addi a1, sp, 6306; RV64I-NEXT:    li a3, 5307; RV64I-NEXT:    li a4, 5308; RV64I-NEXT:    mv a0, s1309; RV64I-NEXT:    call __atomic_compare_exchange_2310; RV64I-NEXT:    lh a1, 6(sp)311; RV64I-NEXT:    beqz a0, .LBB1_1312; RV64I-NEXT:  # %bb.2: # %atomicrmw.end313; RV64I-NEXT:    mv a0, a1314; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload315; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload316; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload317; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload318; RV64I-NEXT:    ld s3, 8(sp) # 8-byte Folded Reload319; RV64I-NEXT:    .cfi_restore ra320; RV64I-NEXT:    .cfi_restore s0321; RV64I-NEXT:    .cfi_restore s1322; RV64I-NEXT:    .cfi_restore s2323; RV64I-NEXT:    .cfi_restore s3324; RV64I-NEXT:    addi sp, sp, 48325; RV64I-NEXT:    .cfi_def_cfa_offset 0326; RV64I-NEXT:    ret327;328; RV64IA-LABEL: atomicrmw_usub_cond_i16:329; RV64IA:       # %bb.0:330; RV64IA-NEXT:    andi a2, a0, -4331; RV64IA-NEXT:    slli a5, a0, 3332; RV64IA-NEXT:    lui a3, 16333; RV64IA-NEXT:    andi a0, a5, 24334; RV64IA-NEXT:    addi a3, a3, -1335; RV64IA-NEXT:    lw a4, 0(a2)336; RV64IA-NEXT:    sllw a5, a3, a5337; RV64IA-NEXT:    not a5, a5338; RV64IA-NEXT:    and a6, a1, a3339; RV64IA-NEXT:  .LBB1_1: # %atomicrmw.start340; RV64IA-NEXT:    # =>This Loop Header: Depth=1341; RV64IA-NEXT:    # Child Loop BB1_3 Depth 2342; RV64IA-NEXT:    srlw a7, a4, a0343; RV64IA-NEXT:    sext.w t0, a4344; RV64IA-NEXT:    and t1, a7, a3345; RV64IA-NEXT:    sltu t1, t1, a6346; RV64IA-NEXT:    addi t1, t1, -1347; RV64IA-NEXT:    and t1, t1, a1348; RV64IA-NEXT:    sub a7, a7, t1349; RV64IA-NEXT:    and a7, a7, a3350; RV64IA-NEXT:    sllw a7, a7, a0351; RV64IA-NEXT:    and a4, a4, a5352; RV64IA-NEXT:    or a7, a4, a7353; RV64IA-NEXT:  .LBB1_3: # %atomicrmw.start354; RV64IA-NEXT:    # Parent Loop BB1_1 Depth=1355; RV64IA-NEXT:    # => This Inner Loop Header: Depth=2356; RV64IA-NEXT:    lr.w.aqrl a4, (a2)357; RV64IA-NEXT:    bne a4, t0, .LBB1_1358; RV64IA-NEXT:  # %bb.4: # %atomicrmw.start359; RV64IA-NEXT:    # in Loop: Header=BB1_3 Depth=2360; RV64IA-NEXT:    sc.w.rl t1, a7, (a2)361; RV64IA-NEXT:    bnez t1, .LBB1_3362; RV64IA-NEXT:  # %bb.5: # %atomicrmw.start363; RV64IA-NEXT:  # %bb.2: # %atomicrmw.end364; RV64IA-NEXT:    srlw a0, a4, a0365; RV64IA-NEXT:    ret366  %result = atomicrmw usub_cond ptr %ptr, i16 %val seq_cst367  ret i16 %result368}369 370define i32 @atomicrmw_usub_cond_i32(ptr %ptr, i32 %val) {371; RV32I-LABEL: atomicrmw_usub_cond_i32:372; RV32I:       # %bb.0:373; RV32I-NEXT:    addi sp, sp, -16374; RV32I-NEXT:    .cfi_def_cfa_offset 16375; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill376; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill377; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill378; RV32I-NEXT:    .cfi_offset ra, -4379; RV32I-NEXT:    .cfi_offset s0, -8380; RV32I-NEXT:    .cfi_offset s1, -12381; RV32I-NEXT:    mv s0, a0382; RV32I-NEXT:    lw a3, 0(a0)383; RV32I-NEXT:    mv s1, a1384; RV32I-NEXT:  .LBB2_1: # %atomicrmw.start385; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1386; RV32I-NEXT:    sltu a0, a3, s1387; RV32I-NEXT:    addi a0, a0, -1388; RV32I-NEXT:    and a0, a0, s1389; RV32I-NEXT:    sub a2, a3, a0390; RV32I-NEXT:    sw a3, 0(sp)391; RV32I-NEXT:    mv a1, sp392; RV32I-NEXT:    li a3, 5393; RV32I-NEXT:    li a4, 5394; RV32I-NEXT:    mv a0, s0395; RV32I-NEXT:    call __atomic_compare_exchange_4396; RV32I-NEXT:    lw a3, 0(sp)397; RV32I-NEXT:    beqz a0, .LBB2_1398; RV32I-NEXT:  # %bb.2: # %atomicrmw.end399; RV32I-NEXT:    mv a0, a3400; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload401; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload402; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload403; RV32I-NEXT:    .cfi_restore ra404; RV32I-NEXT:    .cfi_restore s0405; RV32I-NEXT:    .cfi_restore s1406; RV32I-NEXT:    addi sp, sp, 16407; RV32I-NEXT:    .cfi_def_cfa_offset 0408; RV32I-NEXT:    ret409;410; RV32IA-LABEL: atomicrmw_usub_cond_i32:411; RV32IA:       # %bb.0:412; RV32IA-NEXT:    lw a2, 0(a0)413; RV32IA-NEXT:  .LBB2_1: # %atomicrmw.start414; RV32IA-NEXT:    # =>This Loop Header: Depth=1415; RV32IA-NEXT:    # Child Loop BB2_3 Depth 2416; RV32IA-NEXT:    mv a3, a2417; RV32IA-NEXT:    sltu a2, a2, a1418; RV32IA-NEXT:    addi a2, a2, -1419; RV32IA-NEXT:    and a2, a2, a1420; RV32IA-NEXT:    sub a4, a3, a2421; RV32IA-NEXT:  .LBB2_3: # %atomicrmw.start422; RV32IA-NEXT:    # Parent Loop BB2_1 Depth=1423; RV32IA-NEXT:    # => This Inner Loop Header: Depth=2424; RV32IA-NEXT:    lr.w.aqrl a2, (a0)425; RV32IA-NEXT:    bne a2, a3, .LBB2_1426; RV32IA-NEXT:  # %bb.4: # %atomicrmw.start427; RV32IA-NEXT:    # in Loop: Header=BB2_3 Depth=2428; RV32IA-NEXT:    sc.w.rl a5, a4, (a0)429; RV32IA-NEXT:    bnez a5, .LBB2_3430; RV32IA-NEXT:  # %bb.5: # %atomicrmw.start431; RV32IA-NEXT:  # %bb.2: # %atomicrmw.end432; RV32IA-NEXT:    mv a0, a2433; RV32IA-NEXT:    ret434;435; RV64I-LABEL: atomicrmw_usub_cond_i32:436; RV64I:       # %bb.0:437; RV64I-NEXT:    addi sp, sp, -48438; RV64I-NEXT:    .cfi_def_cfa_offset 48439; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill440; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill441; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill442; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill443; RV64I-NEXT:    .cfi_offset ra, -8444; RV64I-NEXT:    .cfi_offset s0, -16445; RV64I-NEXT:    .cfi_offset s1, -24446; RV64I-NEXT:    .cfi_offset s2, -32447; RV64I-NEXT:    mv s0, a0448; RV64I-NEXT:    lw a3, 0(a0)449; RV64I-NEXT:    mv s1, a1450; RV64I-NEXT:    sext.w s2, a1451; RV64I-NEXT:  .LBB2_1: # %atomicrmw.start452; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1453; RV64I-NEXT:    sltu a0, a3, s2454; RV64I-NEXT:    addi a0, a0, -1455; RV64I-NEXT:    and a0, a0, s1456; RV64I-NEXT:    subw a2, a3, a0457; RV64I-NEXT:    sw a3, 12(sp)458; RV64I-NEXT:    addi a1, sp, 12459; RV64I-NEXT:    li a3, 5460; RV64I-NEXT:    li a4, 5461; RV64I-NEXT:    mv a0, s0462; RV64I-NEXT:    call __atomic_compare_exchange_4463; RV64I-NEXT:    lw a3, 12(sp)464; RV64I-NEXT:    beqz a0, .LBB2_1465; RV64I-NEXT:  # %bb.2: # %atomicrmw.end466; RV64I-NEXT:    mv a0, a3467; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload468; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload469; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload470; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload471; RV64I-NEXT:    .cfi_restore ra472; RV64I-NEXT:    .cfi_restore s0473; RV64I-NEXT:    .cfi_restore s1474; RV64I-NEXT:    .cfi_restore s2475; RV64I-NEXT:    addi sp, sp, 48476; RV64I-NEXT:    .cfi_def_cfa_offset 0477; RV64I-NEXT:    ret478;479; RV64IA-LABEL: atomicrmw_usub_cond_i32:480; RV64IA:       # %bb.0:481; RV64IA-NEXT:    lw a2, 0(a0)482; RV64IA-NEXT:    sext.w a3, a1483; RV64IA-NEXT:  .LBB2_1: # %atomicrmw.start484; RV64IA-NEXT:    # =>This Loop Header: Depth=1485; RV64IA-NEXT:    # Child Loop BB2_3 Depth 2486; RV64IA-NEXT:    sext.w a4, a2487; RV64IA-NEXT:    sltu a5, a4, a3488; RV64IA-NEXT:    addi a5, a5, -1489; RV64IA-NEXT:    and a5, a5, a1490; RV64IA-NEXT:    subw a5, a2, a5491; RV64IA-NEXT:  .LBB2_3: # %atomicrmw.start492; RV64IA-NEXT:    # Parent Loop BB2_1 Depth=1493; RV64IA-NEXT:    # => This Inner Loop Header: Depth=2494; RV64IA-NEXT:    lr.w.aqrl a2, (a0)495; RV64IA-NEXT:    bne a2, a4, .LBB2_1496; RV64IA-NEXT:  # %bb.4: # %atomicrmw.start497; RV64IA-NEXT:    # in Loop: Header=BB2_3 Depth=2498; RV64IA-NEXT:    sc.w.rl a6, a5, (a0)499; RV64IA-NEXT:    bnez a6, .LBB2_3500; RV64IA-NEXT:  # %bb.5: # %atomicrmw.start501; RV64IA-NEXT:  # %bb.2: # %atomicrmw.end502; RV64IA-NEXT:    mv a0, a2503; RV64IA-NEXT:    ret504  %result = atomicrmw usub_cond ptr %ptr, i32 %val seq_cst505  ret i32 %result506}507 508define i64 @atomicrmw_usub_cond_i64(ptr %ptr, i64 %val) {509; RV32I-LABEL: atomicrmw_usub_cond_i64:510; RV32I:       # %bb.0:511; RV32I-NEXT:    addi sp, sp, -32512; RV32I-NEXT:    .cfi_def_cfa_offset 32513; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill514; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill515; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill516; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill517; RV32I-NEXT:    .cfi_offset ra, -4518; RV32I-NEXT:    .cfi_offset s0, -8519; RV32I-NEXT:    .cfi_offset s1, -12520; RV32I-NEXT:    .cfi_offset s2, -16521; RV32I-NEXT:    mv s0, a2522; RV32I-NEXT:    mv s1, a0523; RV32I-NEXT:    lw a4, 0(a0)524; RV32I-NEXT:    lw a5, 4(a0)525; RV32I-NEXT:    mv s2, a1526; RV32I-NEXT:    j .LBB3_3527; RV32I-NEXT:  .LBB3_1: # %atomicrmw.start528; RV32I-NEXT:    # in Loop: Header=BB3_3 Depth=1529; RV32I-NEXT:    sltu a0, a5, s0530; RV32I-NEXT:  .LBB3_2: # %atomicrmw.start531; RV32I-NEXT:    # in Loop: Header=BB3_3 Depth=1532; RV32I-NEXT:    xori a0, a0, 1533; RV32I-NEXT:    neg a0, a0534; RV32I-NEXT:    and a1, a0, s2535; RV32I-NEXT:    and a0, a0, s0536; RV32I-NEXT:    sltu a3, a4, a1537; RV32I-NEXT:    sub a0, a5, a0538; RV32I-NEXT:    sub a2, a4, a1539; RV32I-NEXT:    sub a3, a0, a3540; RV32I-NEXT:    sw a4, 8(sp)541; RV32I-NEXT:    sw a5, 12(sp)542; RV32I-NEXT:    addi a1, sp, 8543; RV32I-NEXT:    li a4, 5544; RV32I-NEXT:    li a5, 5545; RV32I-NEXT:    mv a0, s1546; RV32I-NEXT:    call __atomic_compare_exchange_8547; RV32I-NEXT:    lw a4, 8(sp)548; RV32I-NEXT:    lw a5, 12(sp)549; RV32I-NEXT:    bnez a0, .LBB3_5550; RV32I-NEXT:  .LBB3_3: # %atomicrmw.start551; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1552; RV32I-NEXT:    bne a5, s0, .LBB3_1553; RV32I-NEXT:  # %bb.4: # in Loop: Header=BB3_3 Depth=1554; RV32I-NEXT:    sltu a0, a4, s2555; RV32I-NEXT:    j .LBB3_2556; RV32I-NEXT:  .LBB3_5: # %atomicrmw.end557; RV32I-NEXT:    mv a0, a4558; RV32I-NEXT:    mv a1, a5559; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload560; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload561; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload562; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload563; RV32I-NEXT:    .cfi_restore ra564; RV32I-NEXT:    .cfi_restore s0565; RV32I-NEXT:    .cfi_restore s1566; RV32I-NEXT:    .cfi_restore s2567; RV32I-NEXT:    addi sp, sp, 32568; RV32I-NEXT:    .cfi_def_cfa_offset 0569; RV32I-NEXT:    ret570;571; RV32IA-LABEL: atomicrmw_usub_cond_i64:572; RV32IA:       # %bb.0:573; RV32IA-NEXT:    addi sp, sp, -32574; RV32IA-NEXT:    .cfi_def_cfa_offset 32575; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill576; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill577; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill578; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill579; RV32IA-NEXT:    .cfi_offset ra, -4580; RV32IA-NEXT:    .cfi_offset s0, -8581; RV32IA-NEXT:    .cfi_offset s1, -12582; RV32IA-NEXT:    .cfi_offset s2, -16583; RV32IA-NEXT:    mv s0, a2584; RV32IA-NEXT:    mv s1, a0585; RV32IA-NEXT:    lw a4, 0(a0)586; RV32IA-NEXT:    lw a5, 4(a0)587; RV32IA-NEXT:    mv s2, a1588; RV32IA-NEXT:    j .LBB3_3589; RV32IA-NEXT:  .LBB3_1: # %atomicrmw.start590; RV32IA-NEXT:    # in Loop: Header=BB3_3 Depth=1591; RV32IA-NEXT:    sltu a0, a5, s0592; RV32IA-NEXT:  .LBB3_2: # %atomicrmw.start593; RV32IA-NEXT:    # in Loop: Header=BB3_3 Depth=1594; RV32IA-NEXT:    xori a0, a0, 1595; RV32IA-NEXT:    neg a0, a0596; RV32IA-NEXT:    and a1, a0, s2597; RV32IA-NEXT:    and a0, a0, s0598; RV32IA-NEXT:    sltu a3, a4, a1599; RV32IA-NEXT:    sub a0, a5, a0600; RV32IA-NEXT:    sub a2, a4, a1601; RV32IA-NEXT:    sub a3, a0, a3602; RV32IA-NEXT:    sw a4, 8(sp)603; RV32IA-NEXT:    sw a5, 12(sp)604; RV32IA-NEXT:    addi a1, sp, 8605; RV32IA-NEXT:    li a4, 5606; RV32IA-NEXT:    li a5, 5607; RV32IA-NEXT:    mv a0, s1608; RV32IA-NEXT:    call __atomic_compare_exchange_8609; RV32IA-NEXT:    lw a4, 8(sp)610; RV32IA-NEXT:    lw a5, 12(sp)611; RV32IA-NEXT:    bnez a0, .LBB3_5612; RV32IA-NEXT:  .LBB3_3: # %atomicrmw.start613; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1614; RV32IA-NEXT:    bne a5, s0, .LBB3_1615; RV32IA-NEXT:  # %bb.4: # in Loop: Header=BB3_3 Depth=1616; RV32IA-NEXT:    sltu a0, a4, s2617; RV32IA-NEXT:    j .LBB3_2618; RV32IA-NEXT:  .LBB3_5: # %atomicrmw.end619; RV32IA-NEXT:    mv a0, a4620; RV32IA-NEXT:    mv a1, a5621; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload622; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload623; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload624; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload625; RV32IA-NEXT:    .cfi_restore ra626; RV32IA-NEXT:    .cfi_restore s0627; RV32IA-NEXT:    .cfi_restore s1628; RV32IA-NEXT:    .cfi_restore s2629; RV32IA-NEXT:    addi sp, sp, 32630; RV32IA-NEXT:    .cfi_def_cfa_offset 0631; RV32IA-NEXT:    ret632;633; RV64I-LABEL: atomicrmw_usub_cond_i64:634; RV64I:       # %bb.0:635; RV64I-NEXT:    addi sp, sp, -32636; RV64I-NEXT:    .cfi_def_cfa_offset 32637; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill638; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill639; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill640; RV64I-NEXT:    .cfi_offset ra, -8641; RV64I-NEXT:    .cfi_offset s0, -16642; RV64I-NEXT:    .cfi_offset s1, -24643; RV64I-NEXT:    mv s0, a0644; RV64I-NEXT:    ld a3, 0(a0)645; RV64I-NEXT:    mv s1, a1646; RV64I-NEXT:  .LBB3_1: # %atomicrmw.start647; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1648; RV64I-NEXT:    sltu a0, a3, s1649; RV64I-NEXT:    addi a0, a0, -1650; RV64I-NEXT:    and a0, a0, s1651; RV64I-NEXT:    sub a2, a3, a0652; RV64I-NEXT:    sd a3, 0(sp)653; RV64I-NEXT:    mv a1, sp654; RV64I-NEXT:    li a3, 5655; RV64I-NEXT:    li a4, 5656; RV64I-NEXT:    mv a0, s0657; RV64I-NEXT:    call __atomic_compare_exchange_8658; RV64I-NEXT:    ld a3, 0(sp)659; RV64I-NEXT:    beqz a0, .LBB3_1660; RV64I-NEXT:  # %bb.2: # %atomicrmw.end661; RV64I-NEXT:    mv a0, a3662; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload663; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload664; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload665; RV64I-NEXT:    .cfi_restore ra666; RV64I-NEXT:    .cfi_restore s0667; RV64I-NEXT:    .cfi_restore s1668; RV64I-NEXT:    addi sp, sp, 32669; RV64I-NEXT:    .cfi_def_cfa_offset 0670; RV64I-NEXT:    ret671;672; RV64IA-LABEL: atomicrmw_usub_cond_i64:673; RV64IA:       # %bb.0:674; RV64IA-NEXT:    ld a2, 0(a0)675; RV64IA-NEXT:  .LBB3_1: # %atomicrmw.start676; RV64IA-NEXT:    # =>This Loop Header: Depth=1677; RV64IA-NEXT:    # Child Loop BB3_3 Depth 2678; RV64IA-NEXT:    mv a3, a2679; RV64IA-NEXT:    sltu a2, a2, a1680; RV64IA-NEXT:    addi a2, a2, -1681; RV64IA-NEXT:    and a2, a2, a1682; RV64IA-NEXT:    sub a4, a3, a2683; RV64IA-NEXT:  .LBB3_3: # %atomicrmw.start684; RV64IA-NEXT:    # Parent Loop BB3_1 Depth=1685; RV64IA-NEXT:    # => This Inner Loop Header: Depth=2686; RV64IA-NEXT:    lr.d.aqrl a2, (a0)687; RV64IA-NEXT:    bne a2, a3, .LBB3_1688; RV64IA-NEXT:  # %bb.4: # %atomicrmw.start689; RV64IA-NEXT:    # in Loop: Header=BB3_3 Depth=2690; RV64IA-NEXT:    sc.d.rl a5, a4, (a0)691; RV64IA-NEXT:    bnez a5, .LBB3_3692; RV64IA-NEXT:  # %bb.5: # %atomicrmw.start693; RV64IA-NEXT:  # %bb.2: # %atomicrmw.end694; RV64IA-NEXT:    mv a0, a2695; RV64IA-NEXT:    ret696  %result = atomicrmw usub_cond ptr %ptr, i64 %val seq_cst697  ret i64 %result698}699 700define i8 @atomicrmw_usub_sat_i8(ptr %ptr, i8 %val) {701; RV32I-LABEL: atomicrmw_usub_sat_i8:702; RV32I:       # %bb.0:703; RV32I-NEXT:    addi sp, sp, -16704; RV32I-NEXT:    .cfi_def_cfa_offset 16705; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill706; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill707; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill708; RV32I-NEXT:    .cfi_offset ra, -4709; RV32I-NEXT:    .cfi_offset s0, -8710; RV32I-NEXT:    .cfi_offset s1, -12711; RV32I-NEXT:    mv s0, a0712; RV32I-NEXT:    lbu a3, 0(a0)713; RV32I-NEXT:    zext.b s1, a1714; RV32I-NEXT:  .LBB4_1: # %atomicrmw.start715; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1716; RV32I-NEXT:    zext.b a0, a3717; RV32I-NEXT:    sub a1, a0, s1718; RV32I-NEXT:    sltu a0, a0, a1719; RV32I-NEXT:    addi a0, a0, -1720; RV32I-NEXT:    and a2, a0, a1721; RV32I-NEXT:    sb a3, 3(sp)722; RV32I-NEXT:    addi a1, sp, 3723; RV32I-NEXT:    li a3, 5724; RV32I-NEXT:    li a4, 5725; RV32I-NEXT:    mv a0, s0726; RV32I-NEXT:    call __atomic_compare_exchange_1727; RV32I-NEXT:    lbu a3, 3(sp)728; RV32I-NEXT:    beqz a0, .LBB4_1729; RV32I-NEXT:  # %bb.2: # %atomicrmw.end730; RV32I-NEXT:    mv a0, a3731; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload732; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload733; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload734; RV32I-NEXT:    .cfi_restore ra735; RV32I-NEXT:    .cfi_restore s0736; RV32I-NEXT:    .cfi_restore s1737; RV32I-NEXT:    addi sp, sp, 16738; RV32I-NEXT:    .cfi_def_cfa_offset 0739; RV32I-NEXT:    ret740;741; RV32IA-LABEL: atomicrmw_usub_sat_i8:742; RV32IA:       # %bb.0:743; RV32IA-NEXT:    andi a2, a0, -4744; RV32IA-NEXT:    slli a0, a0, 3745; RV32IA-NEXT:    li a3, 255746; RV32IA-NEXT:    sll a3, a3, a0747; RV32IA-NEXT:    lw a4, 0(a2)748; RV32IA-NEXT:    andi a0, a0, 24749; RV32IA-NEXT:    not a3, a3750; RV32IA-NEXT:    zext.b a1, a1751; RV32IA-NEXT:  .LBB4_1: # %atomicrmw.start752; RV32IA-NEXT:    # =>This Loop Header: Depth=1753; RV32IA-NEXT:    # Child Loop BB4_3 Depth 2754; RV32IA-NEXT:    mv a5, a4755; RV32IA-NEXT:    srl a4, a4, a0756; RV32IA-NEXT:    zext.b a4, a4757; RV32IA-NEXT:    sub a6, a4, a1758; RV32IA-NEXT:    sltu a4, a4, a6759; RV32IA-NEXT:    addi a4, a4, -1760; RV32IA-NEXT:    and a4, a4, a6761; RV32IA-NEXT:    sll a4, a4, a0762; RV32IA-NEXT:    and a6, a5, a3763; RV32IA-NEXT:    or a6, a6, a4764; RV32IA-NEXT:  .LBB4_3: # %atomicrmw.start765; RV32IA-NEXT:    # Parent Loop BB4_1 Depth=1766; RV32IA-NEXT:    # => This Inner Loop Header: Depth=2767; RV32IA-NEXT:    lr.w.aqrl a4, (a2)768; RV32IA-NEXT:    bne a4, a5, .LBB4_1769; RV32IA-NEXT:  # %bb.4: # %atomicrmw.start770; RV32IA-NEXT:    # in Loop: Header=BB4_3 Depth=2771; RV32IA-NEXT:    sc.w.rl a7, a6, (a2)772; RV32IA-NEXT:    bnez a7, .LBB4_3773; RV32IA-NEXT:  # %bb.5: # %atomicrmw.start774; RV32IA-NEXT:  # %bb.2: # %atomicrmw.end775; RV32IA-NEXT:    srl a0, a4, a0776; RV32IA-NEXT:    ret777;778; RV64I-LABEL: atomicrmw_usub_sat_i8:779; RV64I:       # %bb.0:780; RV64I-NEXT:    addi sp, sp, -32781; RV64I-NEXT:    .cfi_def_cfa_offset 32782; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill783; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill784; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill785; RV64I-NEXT:    .cfi_offset ra, -8786; RV64I-NEXT:    .cfi_offset s0, -16787; RV64I-NEXT:    .cfi_offset s1, -24788; RV64I-NEXT:    mv s0, a0789; RV64I-NEXT:    lbu a3, 0(a0)790; RV64I-NEXT:    zext.b s1, a1791; RV64I-NEXT:  .LBB4_1: # %atomicrmw.start792; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1793; RV64I-NEXT:    zext.b a0, a3794; RV64I-NEXT:    sub a1, a0, s1795; RV64I-NEXT:    sltu a0, a0, a1796; RV64I-NEXT:    addi a0, a0, -1797; RV64I-NEXT:    and a2, a0, a1798; RV64I-NEXT:    sb a3, 7(sp)799; RV64I-NEXT:    addi a1, sp, 7800; RV64I-NEXT:    li a3, 5801; RV64I-NEXT:    li a4, 5802; RV64I-NEXT:    mv a0, s0803; RV64I-NEXT:    call __atomic_compare_exchange_1804; RV64I-NEXT:    lbu a3, 7(sp)805; RV64I-NEXT:    beqz a0, .LBB4_1806; RV64I-NEXT:  # %bb.2: # %atomicrmw.end807; RV64I-NEXT:    mv a0, a3808; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload809; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload810; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload811; RV64I-NEXT:    .cfi_restore ra812; RV64I-NEXT:    .cfi_restore s0813; RV64I-NEXT:    .cfi_restore s1814; RV64I-NEXT:    addi sp, sp, 32815; RV64I-NEXT:    .cfi_def_cfa_offset 0816; RV64I-NEXT:    ret817;818; RV64IA-LABEL: atomicrmw_usub_sat_i8:819; RV64IA:       # %bb.0:820; RV64IA-NEXT:    andi a2, a0, -4821; RV64IA-NEXT:    slli a0, a0, 3822; RV64IA-NEXT:    li a3, 255823; RV64IA-NEXT:    sllw a4, a3, a0824; RV64IA-NEXT:    lw a3, 0(a2)825; RV64IA-NEXT:    andi a0, a0, 24826; RV64IA-NEXT:    not a4, a4827; RV64IA-NEXT:    zext.b a1, a1828; RV64IA-NEXT:  .LBB4_1: # %atomicrmw.start829; RV64IA-NEXT:    # =>This Loop Header: Depth=1830; RV64IA-NEXT:    # Child Loop BB4_3 Depth 2831; RV64IA-NEXT:    srlw a5, a3, a0832; RV64IA-NEXT:    sext.w a6, a3833; RV64IA-NEXT:    zext.b a5, a5834; RV64IA-NEXT:    sub a7, a5, a1835; RV64IA-NEXT:    sltu a5, a5, a7836; RV64IA-NEXT:    addi a5, a5, -1837; RV64IA-NEXT:    and a5, a5, a7838; RV64IA-NEXT:    sllw a5, a5, a0839; RV64IA-NEXT:    and a3, a3, a4840; RV64IA-NEXT:    or a5, a3, a5841; RV64IA-NEXT:  .LBB4_3: # %atomicrmw.start842; RV64IA-NEXT:    # Parent Loop BB4_1 Depth=1843; RV64IA-NEXT:    # => This Inner Loop Header: Depth=2844; RV64IA-NEXT:    lr.w.aqrl a3, (a2)845; RV64IA-NEXT:    bne a3, a6, .LBB4_1846; RV64IA-NEXT:  # %bb.4: # %atomicrmw.start847; RV64IA-NEXT:    # in Loop: Header=BB4_3 Depth=2848; RV64IA-NEXT:    sc.w.rl a7, a5, (a2)849; RV64IA-NEXT:    bnez a7, .LBB4_3850; RV64IA-NEXT:  # %bb.5: # %atomicrmw.start851; RV64IA-NEXT:  # %bb.2: # %atomicrmw.end852; RV64IA-NEXT:    srlw a0, a3, a0853; RV64IA-NEXT:    ret854  %result = atomicrmw usub_sat ptr %ptr, i8 %val seq_cst855  ret i8 %result856}857 858define i16 @atomicrmw_usub_sat_i16(ptr %ptr, i16 %val) {859; RV32I-LABEL: atomicrmw_usub_sat_i16:860; RV32I:       # %bb.0:861; RV32I-NEXT:    addi sp, sp, -32862; RV32I-NEXT:    .cfi_def_cfa_offset 32863; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill864; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill865; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill866; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill867; RV32I-NEXT:    .cfi_offset ra, -4868; RV32I-NEXT:    .cfi_offset s0, -8869; RV32I-NEXT:    .cfi_offset s1, -12870; RV32I-NEXT:    .cfi_offset s2, -16871; RV32I-NEXT:    mv s0, a0872; RV32I-NEXT:    lhu a3, 0(a0)873; RV32I-NEXT:    lui s1, 16874; RV32I-NEXT:    addi s1, s1, -1875; RV32I-NEXT:    and s2, a1, s1876; RV32I-NEXT:  .LBB5_1: # %atomicrmw.start877; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1878; RV32I-NEXT:    and a0, a3, s1879; RV32I-NEXT:    sub a1, a0, s2880; RV32I-NEXT:    sltu a0, a0, a1881; RV32I-NEXT:    addi a0, a0, -1882; RV32I-NEXT:    and a2, a0, a1883; RV32I-NEXT:    sh a3, 14(sp)884; RV32I-NEXT:    addi a1, sp, 14885; RV32I-NEXT:    li a3, 5886; RV32I-NEXT:    li a4, 5887; RV32I-NEXT:    mv a0, s0888; RV32I-NEXT:    call __atomic_compare_exchange_2889; RV32I-NEXT:    lh a3, 14(sp)890; RV32I-NEXT:    beqz a0, .LBB5_1891; RV32I-NEXT:  # %bb.2: # %atomicrmw.end892; RV32I-NEXT:    mv a0, a3893; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload894; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload895; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload896; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload897; RV32I-NEXT:    .cfi_restore ra898; RV32I-NEXT:    .cfi_restore s0899; RV32I-NEXT:    .cfi_restore s1900; RV32I-NEXT:    .cfi_restore s2901; RV32I-NEXT:    addi sp, sp, 32902; RV32I-NEXT:    .cfi_def_cfa_offset 0903; RV32I-NEXT:    ret904;905; RV32IA-LABEL: atomicrmw_usub_sat_i16:906; RV32IA:       # %bb.0:907; RV32IA-NEXT:    andi a2, a0, -4908; RV32IA-NEXT:    slli a4, a0, 3909; RV32IA-NEXT:    lui a3, 16910; RV32IA-NEXT:    andi a0, a4, 24911; RV32IA-NEXT:    addi a3, a3, -1912; RV32IA-NEXT:    lw a5, 0(a2)913; RV32IA-NEXT:    sll a4, a3, a4914; RV32IA-NEXT:    not a4, a4915; RV32IA-NEXT:    and a1, a1, a3916; RV32IA-NEXT:  .LBB5_1: # %atomicrmw.start917; RV32IA-NEXT:    # =>This Loop Header: Depth=1918; RV32IA-NEXT:    # Child Loop BB5_3 Depth 2919; RV32IA-NEXT:    mv a6, a5920; RV32IA-NEXT:    srl a5, a5, a0921; RV32IA-NEXT:    and a5, a5, a3922; RV32IA-NEXT:    sub a7, a5, a1923; RV32IA-NEXT:    sltu a5, a5, a7924; RV32IA-NEXT:    addi a5, a5, -1925; RV32IA-NEXT:    and a5, a5, a7926; RV32IA-NEXT:    sll a5, a5, a0927; RV32IA-NEXT:    and a7, a6, a4928; RV32IA-NEXT:    or a7, a7, a5929; RV32IA-NEXT:  .LBB5_3: # %atomicrmw.start930; RV32IA-NEXT:    # Parent Loop BB5_1 Depth=1931; RV32IA-NEXT:    # => This Inner Loop Header: Depth=2932; RV32IA-NEXT:    lr.w.aqrl a5, (a2)933; RV32IA-NEXT:    bne a5, a6, .LBB5_1934; RV32IA-NEXT:  # %bb.4: # %atomicrmw.start935; RV32IA-NEXT:    # in Loop: Header=BB5_3 Depth=2936; RV32IA-NEXT:    sc.w.rl t0, a7, (a2)937; RV32IA-NEXT:    bnez t0, .LBB5_3938; RV32IA-NEXT:  # %bb.5: # %atomicrmw.start939; RV32IA-NEXT:  # %bb.2: # %atomicrmw.end940; RV32IA-NEXT:    srl a0, a5, a0941; RV32IA-NEXT:    ret942;943; RV64I-LABEL: atomicrmw_usub_sat_i16:944; RV64I:       # %bb.0:945; RV64I-NEXT:    addi sp, sp, -48946; RV64I-NEXT:    .cfi_def_cfa_offset 48947; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill948; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill949; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill950; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill951; RV64I-NEXT:    .cfi_offset ra, -8952; RV64I-NEXT:    .cfi_offset s0, -16953; RV64I-NEXT:    .cfi_offset s1, -24954; RV64I-NEXT:    .cfi_offset s2, -32955; RV64I-NEXT:    mv s0, a0956; RV64I-NEXT:    lhu a3, 0(a0)957; RV64I-NEXT:    lui s1, 16958; RV64I-NEXT:    addi s1, s1, -1959; RV64I-NEXT:    and s2, a1, s1960; RV64I-NEXT:  .LBB5_1: # %atomicrmw.start961; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1962; RV64I-NEXT:    and a0, a3, s1963; RV64I-NEXT:    sub a1, a0, s2964; RV64I-NEXT:    sltu a0, a0, a1965; RV64I-NEXT:    addi a0, a0, -1966; RV64I-NEXT:    and a2, a0, a1967; RV64I-NEXT:    sh a3, 14(sp)968; RV64I-NEXT:    addi a1, sp, 14969; RV64I-NEXT:    li a3, 5970; RV64I-NEXT:    li a4, 5971; RV64I-NEXT:    mv a0, s0972; RV64I-NEXT:    call __atomic_compare_exchange_2973; RV64I-NEXT:    lh a3, 14(sp)974; RV64I-NEXT:    beqz a0, .LBB5_1975; RV64I-NEXT:  # %bb.2: # %atomicrmw.end976; RV64I-NEXT:    mv a0, a3977; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload978; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload979; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload980; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload981; RV64I-NEXT:    .cfi_restore ra982; RV64I-NEXT:    .cfi_restore s0983; RV64I-NEXT:    .cfi_restore s1984; RV64I-NEXT:    .cfi_restore s2985; RV64I-NEXT:    addi sp, sp, 48986; RV64I-NEXT:    .cfi_def_cfa_offset 0987; RV64I-NEXT:    ret988;989; RV64IA-LABEL: atomicrmw_usub_sat_i16:990; RV64IA:       # %bb.0:991; RV64IA-NEXT:    andi a2, a0, -4992; RV64IA-NEXT:    slli a5, a0, 3993; RV64IA-NEXT:    lui a3, 16994; RV64IA-NEXT:    andi a0, a5, 24995; RV64IA-NEXT:    addi a3, a3, -1996; RV64IA-NEXT:    lw a4, 0(a2)997; RV64IA-NEXT:    sllw a5, a3, a5998; RV64IA-NEXT:    not a5, a5999; RV64IA-NEXT:    and a1, a1, a31000; RV64IA-NEXT:  .LBB5_1: # %atomicrmw.start1001; RV64IA-NEXT:    # =>This Loop Header: Depth=11002; RV64IA-NEXT:    # Child Loop BB5_3 Depth 21003; RV64IA-NEXT:    srlw a6, a4, a01004; RV64IA-NEXT:    sext.w a7, a41005; RV64IA-NEXT:    and a6, a6, a31006; RV64IA-NEXT:    sub t0, a6, a11007; RV64IA-NEXT:    sltu a6, a6, t01008; RV64IA-NEXT:    addi a6, a6, -11009; RV64IA-NEXT:    and a6, a6, t01010; RV64IA-NEXT:    sllw a6, a6, a01011; RV64IA-NEXT:    and a4, a4, a51012; RV64IA-NEXT:    or a6, a4, a61013; RV64IA-NEXT:  .LBB5_3: # %atomicrmw.start1014; RV64IA-NEXT:    # Parent Loop BB5_1 Depth=11015; RV64IA-NEXT:    # => This Inner Loop Header: Depth=21016; RV64IA-NEXT:    lr.w.aqrl a4, (a2)1017; RV64IA-NEXT:    bne a4, a7, .LBB5_11018; RV64IA-NEXT:  # %bb.4: # %atomicrmw.start1019; RV64IA-NEXT:    # in Loop: Header=BB5_3 Depth=21020; RV64IA-NEXT:    sc.w.rl t0, a6, (a2)1021; RV64IA-NEXT:    bnez t0, .LBB5_31022; RV64IA-NEXT:  # %bb.5: # %atomicrmw.start1023; RV64IA-NEXT:  # %bb.2: # %atomicrmw.end1024; RV64IA-NEXT:    srlw a0, a4, a01025; RV64IA-NEXT:    ret1026  %result = atomicrmw usub_sat ptr %ptr, i16 %val seq_cst1027  ret i16 %result1028}1029 1030define i32 @atomicrmw_usub_sat_i32(ptr %ptr, i32 %val) {1031; RV32I-LABEL: atomicrmw_usub_sat_i32:1032; RV32I:       # %bb.0:1033; RV32I-NEXT:    addi sp, sp, -161034; RV32I-NEXT:    .cfi_def_cfa_offset 161035; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill1036; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill1037; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill1038; RV32I-NEXT:    .cfi_offset ra, -41039; RV32I-NEXT:    .cfi_offset s0, -81040; RV32I-NEXT:    .cfi_offset s1, -121041; RV32I-NEXT:    mv s0, a01042; RV32I-NEXT:    lw a3, 0(a0)1043; RV32I-NEXT:    mv s1, a11044; RV32I-NEXT:  .LBB6_1: # %atomicrmw.start1045; RV32I-NEXT:    # =>This Inner Loop Header: Depth=11046; RV32I-NEXT:    sub a0, a3, s11047; RV32I-NEXT:    sltu a1, a3, a01048; RV32I-NEXT:    addi a1, a1, -11049; RV32I-NEXT:    and a2, a1, a01050; RV32I-NEXT:    sw a3, 0(sp)1051; RV32I-NEXT:    mv a1, sp1052; RV32I-NEXT:    li a3, 51053; RV32I-NEXT:    li a4, 51054; RV32I-NEXT:    mv a0, s01055; RV32I-NEXT:    call __atomic_compare_exchange_41056; RV32I-NEXT:    lw a3, 0(sp)1057; RV32I-NEXT:    beqz a0, .LBB6_11058; RV32I-NEXT:  # %bb.2: # %atomicrmw.end1059; RV32I-NEXT:    mv a0, a31060; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload1061; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload1062; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload1063; RV32I-NEXT:    .cfi_restore ra1064; RV32I-NEXT:    .cfi_restore s01065; RV32I-NEXT:    .cfi_restore s11066; RV32I-NEXT:    addi sp, sp, 161067; RV32I-NEXT:    .cfi_def_cfa_offset 01068; RV32I-NEXT:    ret1069;1070; RV32IA-LABEL: atomicrmw_usub_sat_i32:1071; RV32IA:       # %bb.0:1072; RV32IA-NEXT:    lw a2, 0(a0)1073; RV32IA-NEXT:  .LBB6_1: # %atomicrmw.start1074; RV32IA-NEXT:    # =>This Loop Header: Depth=11075; RV32IA-NEXT:    # Child Loop BB6_3 Depth 21076; RV32IA-NEXT:    mv a3, a21077; RV32IA-NEXT:    sub a2, a2, a11078; RV32IA-NEXT:    sltu a4, a3, a21079; RV32IA-NEXT:    addi a4, a4, -11080; RV32IA-NEXT:    and a4, a4, a21081; RV32IA-NEXT:  .LBB6_3: # %atomicrmw.start1082; RV32IA-NEXT:    # Parent Loop BB6_1 Depth=11083; RV32IA-NEXT:    # => This Inner Loop Header: Depth=21084; RV32IA-NEXT:    lr.w.aqrl a2, (a0)1085; RV32IA-NEXT:    bne a2, a3, .LBB6_11086; RV32IA-NEXT:  # %bb.4: # %atomicrmw.start1087; RV32IA-NEXT:    # in Loop: Header=BB6_3 Depth=21088; RV32IA-NEXT:    sc.w.rl a5, a4, (a0)1089; RV32IA-NEXT:    bnez a5, .LBB6_31090; RV32IA-NEXT:  # %bb.5: # %atomicrmw.start1091; RV32IA-NEXT:  # %bb.2: # %atomicrmw.end1092; RV32IA-NEXT:    mv a0, a21093; RV32IA-NEXT:    ret1094;1095; RV64I-LABEL: atomicrmw_usub_sat_i32:1096; RV64I:       # %bb.0:1097; RV64I-NEXT:    addi sp, sp, -321098; RV64I-NEXT:    .cfi_def_cfa_offset 321099; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill1100; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill1101; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill1102; RV64I-NEXT:    .cfi_offset ra, -81103; RV64I-NEXT:    .cfi_offset s0, -161104; RV64I-NEXT:    .cfi_offset s1, -241105; RV64I-NEXT:    mv s0, a01106; RV64I-NEXT:    lw a3, 0(a0)1107; RV64I-NEXT:    mv s1, a11108; RV64I-NEXT:  .LBB6_1: # %atomicrmw.start1109; RV64I-NEXT:    # =>This Inner Loop Header: Depth=11110; RV64I-NEXT:    subw a0, a3, s11111; RV64I-NEXT:    sltu a1, a3, a01112; RV64I-NEXT:    addi a1, a1, -11113; RV64I-NEXT:    and a2, a1, a01114; RV64I-NEXT:    sw a3, 4(sp)1115; RV64I-NEXT:    addi a1, sp, 41116; RV64I-NEXT:    li a3, 51117; RV64I-NEXT:    li a4, 51118; RV64I-NEXT:    mv a0, s01119; RV64I-NEXT:    call __atomic_compare_exchange_41120; RV64I-NEXT:    lw a3, 4(sp)1121; RV64I-NEXT:    beqz a0, .LBB6_11122; RV64I-NEXT:  # %bb.2: # %atomicrmw.end1123; RV64I-NEXT:    mv a0, a31124; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload1125; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload1126; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload1127; RV64I-NEXT:    .cfi_restore ra1128; RV64I-NEXT:    .cfi_restore s01129; RV64I-NEXT:    .cfi_restore s11130; RV64I-NEXT:    addi sp, sp, 321131; RV64I-NEXT:    .cfi_def_cfa_offset 01132; RV64I-NEXT:    ret1133;1134; RV64IA-LABEL: atomicrmw_usub_sat_i32:1135; RV64IA:       # %bb.0:1136; RV64IA-NEXT:    lw a2, 0(a0)1137; RV64IA-NEXT:  .LBB6_1: # %atomicrmw.start1138; RV64IA-NEXT:    # =>This Loop Header: Depth=11139; RV64IA-NEXT:    # Child Loop BB6_3 Depth 21140; RV64IA-NEXT:    subw a3, a2, a11141; RV64IA-NEXT:    sext.w a4, a21142; RV64IA-NEXT:    sltu a2, a4, a31143; RV64IA-NEXT:    addi a2, a2, -11144; RV64IA-NEXT:    and a3, a2, a31145; RV64IA-NEXT:  .LBB6_3: # %atomicrmw.start1146; RV64IA-NEXT:    # Parent Loop BB6_1 Depth=11147; RV64IA-NEXT:    # => This Inner Loop Header: Depth=21148; RV64IA-NEXT:    lr.w.aqrl a2, (a0)1149; RV64IA-NEXT:    bne a2, a4, .LBB6_11150; RV64IA-NEXT:  # %bb.4: # %atomicrmw.start1151; RV64IA-NEXT:    # in Loop: Header=BB6_3 Depth=21152; RV64IA-NEXT:    sc.w.rl a5, a3, (a0)1153; RV64IA-NEXT:    bnez a5, .LBB6_31154; RV64IA-NEXT:  # %bb.5: # %atomicrmw.start1155; RV64IA-NEXT:  # %bb.2: # %atomicrmw.end1156; RV64IA-NEXT:    mv a0, a21157; RV64IA-NEXT:    ret1158  %result = atomicrmw usub_sat ptr %ptr, i32 %val seq_cst1159  ret i32 %result1160}1161 1162define i64 @atomicrmw_usub_sat_i64(ptr %ptr, i64 %val) {1163; RV32I-LABEL: atomicrmw_usub_sat_i64:1164; RV32I:       # %bb.0:1165; RV32I-NEXT:    addi sp, sp, -321166; RV32I-NEXT:    .cfi_def_cfa_offset 321167; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill1168; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill1169; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill1170; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill1171; RV32I-NEXT:    .cfi_offset ra, -41172; RV32I-NEXT:    .cfi_offset s0, -81173; RV32I-NEXT:    .cfi_offset s1, -121174; RV32I-NEXT:    .cfi_offset s2, -161175; RV32I-NEXT:    mv s0, a21176; RV32I-NEXT:    mv s1, a01177; RV32I-NEXT:    lw a4, 0(a0)1178; RV32I-NEXT:    lw a5, 4(a0)1179; RV32I-NEXT:    mv s2, a11180; RV32I-NEXT:    j .LBB7_31181; RV32I-NEXT:  .LBB7_1: # %atomicrmw.start1182; RV32I-NEXT:    # in Loop: Header=BB7_3 Depth=11183; RV32I-NEXT:    sltu a2, a5, a01184; RV32I-NEXT:  .LBB7_2: # %atomicrmw.start1185; RV32I-NEXT:    # in Loop: Header=BB7_3 Depth=11186; RV32I-NEXT:    addi a3, a2, -11187; RV32I-NEXT:    and a2, a3, a11188; RV32I-NEXT:    and a3, a3, a01189; RV32I-NEXT:    sw a4, 8(sp)1190; RV32I-NEXT:    sw a5, 12(sp)1191; RV32I-NEXT:    addi a1, sp, 81192; RV32I-NEXT:    li a4, 51193; RV32I-NEXT:    li a5, 51194; RV32I-NEXT:    mv a0, s11195; RV32I-NEXT:    call __atomic_compare_exchange_81196; RV32I-NEXT:    lw a4, 8(sp)1197; RV32I-NEXT:    lw a5, 12(sp)1198; RV32I-NEXT:    bnez a0, .LBB7_51199; RV32I-NEXT:  .LBB7_3: # %atomicrmw.start1200; RV32I-NEXT:    # =>This Inner Loop Header: Depth=11201; RV32I-NEXT:    sltu a0, a4, s21202; RV32I-NEXT:    sub a1, a5, s01203; RV32I-NEXT:    sub a0, a1, a01204; RV32I-NEXT:    sub a1, a4, s21205; RV32I-NEXT:    bne a0, a5, .LBB7_11206; RV32I-NEXT:  # %bb.4: # in Loop: Header=BB7_3 Depth=11207; RV32I-NEXT:    sltu a2, a4, a11208; RV32I-NEXT:    j .LBB7_21209; RV32I-NEXT:  .LBB7_5: # %atomicrmw.end1210; RV32I-NEXT:    mv a0, a41211; RV32I-NEXT:    mv a1, a51212; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload1213; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload1214; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload1215; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload1216; RV32I-NEXT:    .cfi_restore ra1217; RV32I-NEXT:    .cfi_restore s01218; RV32I-NEXT:    .cfi_restore s11219; RV32I-NEXT:    .cfi_restore s21220; RV32I-NEXT:    addi sp, sp, 321221; RV32I-NEXT:    .cfi_def_cfa_offset 01222; RV32I-NEXT:    ret1223;1224; RV32IA-LABEL: atomicrmw_usub_sat_i64:1225; RV32IA:       # %bb.0:1226; RV32IA-NEXT:    addi sp, sp, -321227; RV32IA-NEXT:    .cfi_def_cfa_offset 321228; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill1229; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill1230; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill1231; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill1232; RV32IA-NEXT:    .cfi_offset ra, -41233; RV32IA-NEXT:    .cfi_offset s0, -81234; RV32IA-NEXT:    .cfi_offset s1, -121235; RV32IA-NEXT:    .cfi_offset s2, -161236; RV32IA-NEXT:    mv s0, a21237; RV32IA-NEXT:    mv s1, a01238; RV32IA-NEXT:    lw a4, 0(a0)1239; RV32IA-NEXT:    lw a5, 4(a0)1240; RV32IA-NEXT:    mv s2, a11241; RV32IA-NEXT:    j .LBB7_31242; RV32IA-NEXT:  .LBB7_1: # %atomicrmw.start1243; RV32IA-NEXT:    # in Loop: Header=BB7_3 Depth=11244; RV32IA-NEXT:    sltu a2, a5, a01245; RV32IA-NEXT:  .LBB7_2: # %atomicrmw.start1246; RV32IA-NEXT:    # in Loop: Header=BB7_3 Depth=11247; RV32IA-NEXT:    addi a3, a2, -11248; RV32IA-NEXT:    and a2, a3, a11249; RV32IA-NEXT:    and a3, a3, a01250; RV32IA-NEXT:    sw a4, 8(sp)1251; RV32IA-NEXT:    sw a5, 12(sp)1252; RV32IA-NEXT:    addi a1, sp, 81253; RV32IA-NEXT:    li a4, 51254; RV32IA-NEXT:    li a5, 51255; RV32IA-NEXT:    mv a0, s11256; RV32IA-NEXT:    call __atomic_compare_exchange_81257; RV32IA-NEXT:    lw a4, 8(sp)1258; RV32IA-NEXT:    lw a5, 12(sp)1259; RV32IA-NEXT:    bnez a0, .LBB7_51260; RV32IA-NEXT:  .LBB7_3: # %atomicrmw.start1261; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=11262; RV32IA-NEXT:    sltu a0, a4, s21263; RV32IA-NEXT:    sub a1, a5, s01264; RV32IA-NEXT:    sub a0, a1, a01265; RV32IA-NEXT:    sub a1, a4, s21266; RV32IA-NEXT:    bne a0, a5, .LBB7_11267; RV32IA-NEXT:  # %bb.4: # in Loop: Header=BB7_3 Depth=11268; RV32IA-NEXT:    sltu a2, a4, a11269; RV32IA-NEXT:    j .LBB7_21270; RV32IA-NEXT:  .LBB7_5: # %atomicrmw.end1271; RV32IA-NEXT:    mv a0, a41272; RV32IA-NEXT:    mv a1, a51273; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload1274; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload1275; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload1276; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload1277; RV32IA-NEXT:    .cfi_restore ra1278; RV32IA-NEXT:    .cfi_restore s01279; RV32IA-NEXT:    .cfi_restore s11280; RV32IA-NEXT:    .cfi_restore s21281; RV32IA-NEXT:    addi sp, sp, 321282; RV32IA-NEXT:    .cfi_def_cfa_offset 01283; RV32IA-NEXT:    ret1284;1285; RV64I-LABEL: atomicrmw_usub_sat_i64:1286; RV64I:       # %bb.0:1287; RV64I-NEXT:    addi sp, sp, -321288; RV64I-NEXT:    .cfi_def_cfa_offset 321289; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill1290; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill1291; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill1292; RV64I-NEXT:    .cfi_offset ra, -81293; RV64I-NEXT:    .cfi_offset s0, -161294; RV64I-NEXT:    .cfi_offset s1, -241295; RV64I-NEXT:    mv s0, a01296; RV64I-NEXT:    ld a3, 0(a0)1297; RV64I-NEXT:    mv s1, a11298; RV64I-NEXT:  .LBB7_1: # %atomicrmw.start1299; RV64I-NEXT:    # =>This Inner Loop Header: Depth=11300; RV64I-NEXT:    sub a0, a3, s11301; RV64I-NEXT:    sltu a1, a3, a01302; RV64I-NEXT:    addi a1, a1, -11303; RV64I-NEXT:    and a2, a1, a01304; RV64I-NEXT:    sd a3, 0(sp)1305; RV64I-NEXT:    mv a1, sp1306; RV64I-NEXT:    li a3, 51307; RV64I-NEXT:    li a4, 51308; RV64I-NEXT:    mv a0, s01309; RV64I-NEXT:    call __atomic_compare_exchange_81310; RV64I-NEXT:    ld a3, 0(sp)1311; RV64I-NEXT:    beqz a0, .LBB7_11312; RV64I-NEXT:  # %bb.2: # %atomicrmw.end1313; RV64I-NEXT:    mv a0, a31314; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload1315; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload1316; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload1317; RV64I-NEXT:    .cfi_restore ra1318; RV64I-NEXT:    .cfi_restore s01319; RV64I-NEXT:    .cfi_restore s11320; RV64I-NEXT:    addi sp, sp, 321321; RV64I-NEXT:    .cfi_def_cfa_offset 01322; RV64I-NEXT:    ret1323;1324; RV64IA-LABEL: atomicrmw_usub_sat_i64:1325; RV64IA:       # %bb.0:1326; RV64IA-NEXT:    ld a2, 0(a0)1327; RV64IA-NEXT:  .LBB7_1: # %atomicrmw.start1328; RV64IA-NEXT:    # =>This Loop Header: Depth=11329; RV64IA-NEXT:    # Child Loop BB7_3 Depth 21330; RV64IA-NEXT:    mv a3, a21331; RV64IA-NEXT:    sub a2, a2, a11332; RV64IA-NEXT:    sltu a4, a3, a21333; RV64IA-NEXT:    addi a4, a4, -11334; RV64IA-NEXT:    and a4, a4, a21335; RV64IA-NEXT:  .LBB7_3: # %atomicrmw.start1336; RV64IA-NEXT:    # Parent Loop BB7_1 Depth=11337; RV64IA-NEXT:    # => This Inner Loop Header: Depth=21338; RV64IA-NEXT:    lr.d.aqrl a2, (a0)1339; RV64IA-NEXT:    bne a2, a3, .LBB7_11340; RV64IA-NEXT:  # %bb.4: # %atomicrmw.start1341; RV64IA-NEXT:    # in Loop: Header=BB7_3 Depth=21342; RV64IA-NEXT:    sc.d.rl a5, a4, (a0)1343; RV64IA-NEXT:    bnez a5, .LBB7_31344; RV64IA-NEXT:  # %bb.5: # %atomicrmw.start1345; RV64IA-NEXT:  # %bb.2: # %atomicrmw.end1346; RV64IA-NEXT:    mv a0, a21347; RV64IA-NEXT:    ret1348  %result = atomicrmw usub_sat ptr %ptr, i64 %val seq_cst1349  ret i64 %result1350}1351