14af249feSanjenner; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 24af249feSanjenner; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \ 34af249feSanjenner; RUN: | FileCheck -check-prefix=RV32I %s 44af249feSanjenner; RUN: llc -mtriple=riscv32 -mattr=+a -verify-machineinstrs < %s \ 54af249feSanjenner; RUN: | FileCheck -check-prefix=RV32IA %s 65a191e3cSAlex Bradbury; RUN: llc -mtriple=riscv32 -mattr=+a,+ztso -verify-machineinstrs < %s \ 74af249feSanjenner; RUN: | FileCheck -check-prefix=RV32IA %s 84af249feSanjenner; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \ 94af249feSanjenner; RUN: | FileCheck -check-prefix=RV64I %s 104af249feSanjenner; RUN: llc -mtriple=riscv64 -mattr=+a -verify-machineinstrs < %s \ 114af249feSanjenner; RUN: | FileCheck -check-prefix=RV64IA %s 125a191e3cSAlex Bradbury; RUN: llc -mtriple=riscv64 -mattr=+a,+ztso -verify-machineinstrs < %s \ 134af249feSanjenner; RUN: | FileCheck -check-prefix=RV64IA %s 144af249feSanjenner 154af249feSanjenner 164af249feSanjennerdefine i8 @atomicrmw_usub_cond_i8(ptr %ptr, i8 %val) { 174af249feSanjenner; RV32I-LABEL: atomicrmw_usub_cond_i8: 184af249feSanjenner; RV32I: # %bb.0: 194af249feSanjenner; RV32I-NEXT: addi sp, sp, -32 204af249feSanjenner; RV32I-NEXT: .cfi_def_cfa_offset 32 214af249feSanjenner; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 224af249feSanjenner; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 234af249feSanjenner; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 244af249feSanjenner; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 254af249feSanjenner; RV32I-NEXT: .cfi_offset ra, -4 264af249feSanjenner; RV32I-NEXT: .cfi_offset s0, -8 274af249feSanjenner; RV32I-NEXT: .cfi_offset s1, -12 284af249feSanjenner; RV32I-NEXT: .cfi_offset s2, -16 294af249feSanjenner; RV32I-NEXT: mv s0, a0 304af249feSanjenner; RV32I-NEXT: lbu a3, 0(a0) 314af249feSanjenner; RV32I-NEXT: mv s1, a1 324af249feSanjenner; RV32I-NEXT: andi s2, a1, 255 334af249feSanjenner; RV32I-NEXT: .LBB0_1: # %atomicrmw.start 344af249feSanjenner; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 354af249feSanjenner; RV32I-NEXT: andi a0, a3, 255 364af249feSanjenner; RV32I-NEXT: sltu a0, a0, s2 374af249feSanjenner; RV32I-NEXT: addi a0, a0, -1 384af249feSanjenner; RV32I-NEXT: and a0, a0, s1 394af249feSanjenner; RV32I-NEXT: sub a2, a3, a0 404af249feSanjenner; RV32I-NEXT: sb a3, 15(sp) 414af249feSanjenner; RV32I-NEXT: addi a1, sp, 15 424af249feSanjenner; RV32I-NEXT: li a3, 5 434af249feSanjenner; RV32I-NEXT: li a4, 5 444af249feSanjenner; RV32I-NEXT: mv a0, s0 454af249feSanjenner; RV32I-NEXT: call __atomic_compare_exchange_1 464af249feSanjenner; RV32I-NEXT: lbu a3, 15(sp) 474af249feSanjenner; RV32I-NEXT: beqz a0, .LBB0_1 484af249feSanjenner; RV32I-NEXT: # %bb.2: # %atomicrmw.end 494af249feSanjenner; RV32I-NEXT: mv a0, a3 504af249feSanjenner; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 514af249feSanjenner; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 524af249feSanjenner; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 534af249feSanjenner; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 5497982a8cSdlav-sc; RV32I-NEXT: .cfi_restore ra 5597982a8cSdlav-sc; RV32I-NEXT: .cfi_restore s0 5697982a8cSdlav-sc; RV32I-NEXT: .cfi_restore s1 5797982a8cSdlav-sc; RV32I-NEXT: .cfi_restore s2 584af249feSanjenner; RV32I-NEXT: addi sp, sp, 32 5997982a8cSdlav-sc; RV32I-NEXT: .cfi_def_cfa_offset 0 604af249feSanjenner; RV32I-NEXT: ret 614af249feSanjenner; 624af249feSanjenner; RV32IA-LABEL: atomicrmw_usub_cond_i8: 634af249feSanjenner; RV32IA: # %bb.0: 644af249feSanjenner; RV32IA-NEXT: andi a2, a0, -4 654af249feSanjenner; RV32IA-NEXT: slli a3, a0, 3 664af249feSanjenner; RV32IA-NEXT: li a4, 255 67*9122c523SPengcheng Wang; RV32IA-NEXT: andi a0, a3, 24 684af249feSanjenner; RV32IA-NEXT: lw a5, 0(a2) 694af249feSanjenner; RV32IA-NEXT: sll a3, a4, a3 704af249feSanjenner; RV32IA-NEXT: not a3, a3 714af249feSanjenner; RV32IA-NEXT: andi a4, a1, 255 724af249feSanjenner; RV32IA-NEXT: .LBB0_1: # %atomicrmw.start 734af249feSanjenner; RV32IA-NEXT: # =>This Loop Header: Depth=1 744af249feSanjenner; RV32IA-NEXT: # Child Loop BB0_3 Depth 2 754af249feSanjenner; RV32IA-NEXT: mv a6, a5 764af249feSanjenner; RV32IA-NEXT: srl a5, a5, a0 774af249feSanjenner; RV32IA-NEXT: andi a7, a5, 255 784af249feSanjenner; RV32IA-NEXT: sltu a7, a7, a4 794af249feSanjenner; RV32IA-NEXT: addi a7, a7, -1 804af249feSanjenner; RV32IA-NEXT: and a7, a7, a1 814af249feSanjenner; RV32IA-NEXT: sub a5, a5, a7 824af249feSanjenner; RV32IA-NEXT: andi a5, a5, 255 834af249feSanjenner; RV32IA-NEXT: sll a5, a5, a0 844af249feSanjenner; RV32IA-NEXT: and a7, a6, a3 854af249feSanjenner; RV32IA-NEXT: or a7, a7, a5 864af249feSanjenner; RV32IA-NEXT: .LBB0_3: # %atomicrmw.start 874af249feSanjenner; RV32IA-NEXT: # Parent Loop BB0_1 Depth=1 884af249feSanjenner; RV32IA-NEXT: # => This Inner Loop Header: Depth=2 894af249feSanjenner; RV32IA-NEXT: lr.w.aqrl a5, (a2) 904af249feSanjenner; RV32IA-NEXT: bne a5, a6, .LBB0_1 914af249feSanjenner; RV32IA-NEXT: # %bb.4: # %atomicrmw.start 924af249feSanjenner; RV32IA-NEXT: # in Loop: Header=BB0_3 Depth=2 934af249feSanjenner; RV32IA-NEXT: sc.w.rl t0, a7, (a2) 944af249feSanjenner; RV32IA-NEXT: bnez t0, .LBB0_3 954af249feSanjenner; RV32IA-NEXT: # %bb.5: # %atomicrmw.start 964af249feSanjenner; RV32IA-NEXT: # %bb.2: # %atomicrmw.end 974af249feSanjenner; RV32IA-NEXT: srl a0, a5, a0 984af249feSanjenner; RV32IA-NEXT: ret 994af249feSanjenner; 1004af249feSanjenner; RV64I-LABEL: atomicrmw_usub_cond_i8: 1014af249feSanjenner; RV64I: # %bb.0: 1024af249feSanjenner; RV64I-NEXT: addi sp, sp, -48 1034af249feSanjenner; RV64I-NEXT: .cfi_def_cfa_offset 48 1044af249feSanjenner; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 1054af249feSanjenner; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 1064af249feSanjenner; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 1074af249feSanjenner; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 1084af249feSanjenner; RV64I-NEXT: .cfi_offset ra, -8 1094af249feSanjenner; RV64I-NEXT: .cfi_offset s0, -16 1104af249feSanjenner; RV64I-NEXT: .cfi_offset s1, -24 1114af249feSanjenner; RV64I-NEXT: .cfi_offset s2, -32 1124af249feSanjenner; RV64I-NEXT: mv s0, a0 1134af249feSanjenner; RV64I-NEXT: lbu a3, 0(a0) 1144af249feSanjenner; RV64I-NEXT: mv s1, a1 1154af249feSanjenner; RV64I-NEXT: andi s2, a1, 255 1164af249feSanjenner; RV64I-NEXT: .LBB0_1: # %atomicrmw.start 1174af249feSanjenner; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 1184af249feSanjenner; RV64I-NEXT: andi a0, a3, 255 1194af249feSanjenner; RV64I-NEXT: sltu a0, a0, s2 1204af249feSanjenner; RV64I-NEXT: addi a0, a0, -1 1214af249feSanjenner; RV64I-NEXT: and a0, a0, s1 1224af249feSanjenner; RV64I-NEXT: sub a2, a3, a0 1234af249feSanjenner; RV64I-NEXT: sb a3, 15(sp) 1244af249feSanjenner; RV64I-NEXT: addi a1, sp, 15 1254af249feSanjenner; RV64I-NEXT: li a3, 5 1264af249feSanjenner; RV64I-NEXT: li a4, 5 1274af249feSanjenner; RV64I-NEXT: mv a0, s0 1284af249feSanjenner; RV64I-NEXT: call __atomic_compare_exchange_1 1294af249feSanjenner; RV64I-NEXT: lbu a3, 15(sp) 1304af249feSanjenner; RV64I-NEXT: beqz a0, .LBB0_1 1314af249feSanjenner; RV64I-NEXT: # %bb.2: # %atomicrmw.end 1324af249feSanjenner; RV64I-NEXT: mv a0, a3 1334af249feSanjenner; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 1344af249feSanjenner; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 1354af249feSanjenner; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 1364af249feSanjenner; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 13797982a8cSdlav-sc; RV64I-NEXT: .cfi_restore ra 13897982a8cSdlav-sc; RV64I-NEXT: .cfi_restore s0 13997982a8cSdlav-sc; RV64I-NEXT: .cfi_restore s1 14097982a8cSdlav-sc; RV64I-NEXT: .cfi_restore s2 1414af249feSanjenner; RV64I-NEXT: addi sp, sp, 48 14297982a8cSdlav-sc; RV64I-NEXT: .cfi_def_cfa_offset 0 1434af249feSanjenner; RV64I-NEXT: ret 1444af249feSanjenner; 1454af249feSanjenner; RV64IA-LABEL: atomicrmw_usub_cond_i8: 1464af249feSanjenner; RV64IA: # %bb.0: 1474af249feSanjenner; RV64IA-NEXT: andi a2, a0, -4 1484af249feSanjenner; RV64IA-NEXT: slli a4, a0, 3 1494af249feSanjenner; RV64IA-NEXT: li a5, 255 150*9122c523SPengcheng Wang; RV64IA-NEXT: andi a0, a4, 24 1514af249feSanjenner; RV64IA-NEXT: lw a3, 0(a2) 1524af249feSanjenner; RV64IA-NEXT: sllw a4, a5, a4 1534af249feSanjenner; RV64IA-NEXT: not a4, a4 1544af249feSanjenner; RV64IA-NEXT: andi a5, a1, 255 1554af249feSanjenner; RV64IA-NEXT: .LBB0_1: # %atomicrmw.start 1564af249feSanjenner; RV64IA-NEXT: # =>This Loop Header: Depth=1 1574af249feSanjenner; RV64IA-NEXT: # Child Loop BB0_3 Depth 2 1584af249feSanjenner; RV64IA-NEXT: srlw a6, a3, a0 1594af249feSanjenner; RV64IA-NEXT: sext.w a7, a3 1604af249feSanjenner; RV64IA-NEXT: andi t0, a6, 255 1614af249feSanjenner; RV64IA-NEXT: sltu t0, t0, a5 1624af249feSanjenner; RV64IA-NEXT: addi t0, t0, -1 1634af249feSanjenner; RV64IA-NEXT: and t0, t0, a1 1644af249feSanjenner; RV64IA-NEXT: subw a6, a6, t0 1654af249feSanjenner; RV64IA-NEXT: andi a6, a6, 255 1664af249feSanjenner; RV64IA-NEXT: sllw a6, a6, a0 1674af249feSanjenner; RV64IA-NEXT: and a3, a3, a4 1684af249feSanjenner; RV64IA-NEXT: or a6, a3, a6 1694af249feSanjenner; RV64IA-NEXT: .LBB0_3: # %atomicrmw.start 1704af249feSanjenner; RV64IA-NEXT: # Parent Loop BB0_1 Depth=1 1714af249feSanjenner; RV64IA-NEXT: # => This Inner Loop Header: Depth=2 1724af249feSanjenner; RV64IA-NEXT: lr.w.aqrl a3, (a2) 1734af249feSanjenner; RV64IA-NEXT: bne a3, a7, .LBB0_1 1744af249feSanjenner; RV64IA-NEXT: # %bb.4: # %atomicrmw.start 1754af249feSanjenner; RV64IA-NEXT: # in Loop: Header=BB0_3 Depth=2 1764af249feSanjenner; RV64IA-NEXT: sc.w.rl t0, a6, (a2) 1774af249feSanjenner; RV64IA-NEXT: bnez t0, .LBB0_3 1784af249feSanjenner; RV64IA-NEXT: # %bb.5: # %atomicrmw.start 1794af249feSanjenner; RV64IA-NEXT: # %bb.2: # %atomicrmw.end 1804af249feSanjenner; RV64IA-NEXT: srlw a0, a3, a0 1814af249feSanjenner; RV64IA-NEXT: ret 1824af249feSanjenner %result = atomicrmw usub_cond ptr %ptr, i8 %val seq_cst 1834af249feSanjenner ret i8 %result 1844af249feSanjenner} 1854af249feSanjenner 1864af249feSanjennerdefine i16 @atomicrmw_usub_cond_i16(ptr %ptr, i16 %val) { 1874af249feSanjenner; RV32I-LABEL: atomicrmw_usub_cond_i16: 1884af249feSanjenner; RV32I: # %bb.0: 1894af249feSanjenner; RV32I-NEXT: addi sp, sp, -32 1904af249feSanjenner; RV32I-NEXT: .cfi_def_cfa_offset 32 1914af249feSanjenner; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 1924af249feSanjenner; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 1934af249feSanjenner; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 1944af249feSanjenner; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 1954af249feSanjenner; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill 1964af249feSanjenner; RV32I-NEXT: .cfi_offset ra, -4 1974af249feSanjenner; RV32I-NEXT: .cfi_offset s0, -8 1984af249feSanjenner; RV32I-NEXT: .cfi_offset s1, -12 1994af249feSanjenner; RV32I-NEXT: .cfi_offset s2, -16 2004af249feSanjenner; RV32I-NEXT: .cfi_offset s3, -20 2014af249feSanjenner; RV32I-NEXT: mv s0, a1 2024af249feSanjenner; RV32I-NEXT: mv s1, a0 2034af249feSanjenner; RV32I-NEXT: lhu a1, 0(a0) 2044af249feSanjenner; RV32I-NEXT: lui s2, 16 2054af249feSanjenner; RV32I-NEXT: addi s2, s2, -1 2064af249feSanjenner; RV32I-NEXT: and s3, s0, s2 2074af249feSanjenner; RV32I-NEXT: .LBB1_1: # %atomicrmw.start 2084af249feSanjenner; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 2094af249feSanjenner; RV32I-NEXT: and a0, a1, s2 2104af249feSanjenner; RV32I-NEXT: sltu a0, a0, s3 2114af249feSanjenner; RV32I-NEXT: addi a0, a0, -1 2124af249feSanjenner; RV32I-NEXT: and a0, a0, s0 2134af249feSanjenner; RV32I-NEXT: sub a2, a1, a0 2144af249feSanjenner; RV32I-NEXT: sh a1, 10(sp) 2154af249feSanjenner; RV32I-NEXT: addi a1, sp, 10 2164af249feSanjenner; RV32I-NEXT: li a3, 5 2174af249feSanjenner; RV32I-NEXT: li a4, 5 2184af249feSanjenner; RV32I-NEXT: mv a0, s1 2194af249feSanjenner; RV32I-NEXT: call __atomic_compare_exchange_2 2204af249feSanjenner; RV32I-NEXT: lh a1, 10(sp) 2214af249feSanjenner; RV32I-NEXT: beqz a0, .LBB1_1 2224af249feSanjenner; RV32I-NEXT: # %bb.2: # %atomicrmw.end 2234af249feSanjenner; RV32I-NEXT: mv a0, a1 2244af249feSanjenner; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 2254af249feSanjenner; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 2264af249feSanjenner; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 2274af249feSanjenner; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 2284af249feSanjenner; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload 22997982a8cSdlav-sc; RV32I-NEXT: .cfi_restore ra 23097982a8cSdlav-sc; RV32I-NEXT: .cfi_restore s0 23197982a8cSdlav-sc; RV32I-NEXT: .cfi_restore s1 23297982a8cSdlav-sc; RV32I-NEXT: .cfi_restore s2 23397982a8cSdlav-sc; RV32I-NEXT: .cfi_restore s3 2344af249feSanjenner; RV32I-NEXT: addi sp, sp, 32 23597982a8cSdlav-sc; RV32I-NEXT: .cfi_def_cfa_offset 0 2364af249feSanjenner; RV32I-NEXT: ret 2374af249feSanjenner; 2384af249feSanjenner; RV32IA-LABEL: atomicrmw_usub_cond_i16: 2394af249feSanjenner; RV32IA: # %bb.0: 2404af249feSanjenner; RV32IA-NEXT: andi a2, a0, -4 2414af249feSanjenner; RV32IA-NEXT: slli a4, a0, 3 2424af249feSanjenner; RV32IA-NEXT: lui a3, 16 243*9122c523SPengcheng Wang; RV32IA-NEXT: andi a0, a4, 24 2444af249feSanjenner; RV32IA-NEXT: addi a3, a3, -1 2454af249feSanjenner; RV32IA-NEXT: lw a6, 0(a2) 2464af249feSanjenner; RV32IA-NEXT: sll a4, a3, a4 2474af249feSanjenner; RV32IA-NEXT: not a4, a4 2484af249feSanjenner; RV32IA-NEXT: and a5, a1, a3 2494af249feSanjenner; RV32IA-NEXT: .LBB1_1: # %atomicrmw.start 2504af249feSanjenner; RV32IA-NEXT: # =>This Loop Header: Depth=1 2514af249feSanjenner; RV32IA-NEXT: # Child Loop BB1_3 Depth 2 2524af249feSanjenner; RV32IA-NEXT: mv a7, a6 2534af249feSanjenner; RV32IA-NEXT: srl a6, a6, a0 2544af249feSanjenner; RV32IA-NEXT: and t0, a6, a3 2554af249feSanjenner; RV32IA-NEXT: sltu t0, t0, a5 2564af249feSanjenner; RV32IA-NEXT: addi t0, t0, -1 2574af249feSanjenner; RV32IA-NEXT: and t0, t0, a1 2584af249feSanjenner; RV32IA-NEXT: sub a6, a6, t0 2594af249feSanjenner; RV32IA-NEXT: and a6, a6, a3 2604af249feSanjenner; RV32IA-NEXT: sll a6, a6, a0 2614af249feSanjenner; RV32IA-NEXT: and t0, a7, a4 2624af249feSanjenner; RV32IA-NEXT: or t0, t0, a6 2634af249feSanjenner; RV32IA-NEXT: .LBB1_3: # %atomicrmw.start 2644af249feSanjenner; RV32IA-NEXT: # Parent Loop BB1_1 Depth=1 2654af249feSanjenner; RV32IA-NEXT: # => This Inner Loop Header: Depth=2 2664af249feSanjenner; RV32IA-NEXT: lr.w.aqrl a6, (a2) 2674af249feSanjenner; RV32IA-NEXT: bne a6, a7, .LBB1_1 2684af249feSanjenner; RV32IA-NEXT: # %bb.4: # %atomicrmw.start 2694af249feSanjenner; RV32IA-NEXT: # in Loop: Header=BB1_3 Depth=2 2704af249feSanjenner; RV32IA-NEXT: sc.w.rl t1, t0, (a2) 2714af249feSanjenner; RV32IA-NEXT: bnez t1, .LBB1_3 2724af249feSanjenner; RV32IA-NEXT: # %bb.5: # %atomicrmw.start 2734af249feSanjenner; RV32IA-NEXT: # %bb.2: # %atomicrmw.end 2744af249feSanjenner; RV32IA-NEXT: srl a0, a6, a0 2754af249feSanjenner; RV32IA-NEXT: ret 2764af249feSanjenner; 2774af249feSanjenner; RV64I-LABEL: atomicrmw_usub_cond_i16: 2784af249feSanjenner; RV64I: # %bb.0: 2794af249feSanjenner; RV64I-NEXT: addi sp, sp, -48 2804af249feSanjenner; RV64I-NEXT: .cfi_def_cfa_offset 48 2814af249feSanjenner; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 2824af249feSanjenner; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 2834af249feSanjenner; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 2844af249feSanjenner; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 2854af249feSanjenner; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill 2864af249feSanjenner; RV64I-NEXT: .cfi_offset ra, -8 2874af249feSanjenner; RV64I-NEXT: .cfi_offset s0, -16 2884af249feSanjenner; RV64I-NEXT: .cfi_offset s1, -24 2894af249feSanjenner; RV64I-NEXT: .cfi_offset s2, -32 2904af249feSanjenner; RV64I-NEXT: .cfi_offset s3, -40 2914af249feSanjenner; RV64I-NEXT: mv s0, a1 2924af249feSanjenner; RV64I-NEXT: mv s1, a0 2934af249feSanjenner; RV64I-NEXT: lhu a1, 0(a0) 2944af249feSanjenner; RV64I-NEXT: lui s2, 16 2954af249feSanjenner; RV64I-NEXT: addiw s2, s2, -1 2964af249feSanjenner; RV64I-NEXT: and s3, s0, s2 2974af249feSanjenner; RV64I-NEXT: .LBB1_1: # %atomicrmw.start 2984af249feSanjenner; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 2994af249feSanjenner; RV64I-NEXT: and a0, a1, s2 3004af249feSanjenner; RV64I-NEXT: sltu a0, a0, s3 3014af249feSanjenner; RV64I-NEXT: addi a0, a0, -1 3024af249feSanjenner; RV64I-NEXT: and a0, a0, s0 3034af249feSanjenner; RV64I-NEXT: sub a2, a1, a0 3044af249feSanjenner; RV64I-NEXT: sh a1, 6(sp) 3054af249feSanjenner; RV64I-NEXT: addi a1, sp, 6 3064af249feSanjenner; RV64I-NEXT: li a3, 5 3074af249feSanjenner; RV64I-NEXT: li a4, 5 3084af249feSanjenner; RV64I-NEXT: mv a0, s1 3094af249feSanjenner; RV64I-NEXT: call __atomic_compare_exchange_2 3104af249feSanjenner; RV64I-NEXT: lh a1, 6(sp) 3114af249feSanjenner; RV64I-NEXT: beqz a0, .LBB1_1 3124af249feSanjenner; RV64I-NEXT: # %bb.2: # %atomicrmw.end 3134af249feSanjenner; RV64I-NEXT: mv a0, a1 3144af249feSanjenner; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 3154af249feSanjenner; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 3164af249feSanjenner; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 3174af249feSanjenner; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 3184af249feSanjenner; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload 31997982a8cSdlav-sc; RV64I-NEXT: .cfi_restore ra 32097982a8cSdlav-sc; RV64I-NEXT: .cfi_restore s0 32197982a8cSdlav-sc; RV64I-NEXT: .cfi_restore s1 32297982a8cSdlav-sc; RV64I-NEXT: .cfi_restore s2 32397982a8cSdlav-sc; RV64I-NEXT: .cfi_restore s3 3244af249feSanjenner; RV64I-NEXT: addi sp, sp, 48 32597982a8cSdlav-sc; RV64I-NEXT: .cfi_def_cfa_offset 0 3264af249feSanjenner; RV64I-NEXT: ret 3274af249feSanjenner; 3284af249feSanjenner; RV64IA-LABEL: atomicrmw_usub_cond_i16: 3294af249feSanjenner; RV64IA: # %bb.0: 3304af249feSanjenner; RV64IA-NEXT: andi a2, a0, -4 3314af249feSanjenner; RV64IA-NEXT: slli a5, a0, 3 3324af249feSanjenner; RV64IA-NEXT: lui a3, 16 333*9122c523SPengcheng Wang; RV64IA-NEXT: andi a0, a5, 24 3344af249feSanjenner; RV64IA-NEXT: addiw a3, a3, -1 3354af249feSanjenner; RV64IA-NEXT: lw a4, 0(a2) 3364af249feSanjenner; RV64IA-NEXT: sllw a5, a3, a5 3374af249feSanjenner; RV64IA-NEXT: not a5, a5 3384af249feSanjenner; RV64IA-NEXT: and a6, a1, a3 3394af249feSanjenner; RV64IA-NEXT: .LBB1_1: # %atomicrmw.start 3404af249feSanjenner; RV64IA-NEXT: # =>This Loop Header: Depth=1 3414af249feSanjenner; RV64IA-NEXT: # Child Loop BB1_3 Depth 2 3424af249feSanjenner; RV64IA-NEXT: srlw a7, a4, a0 3434af249feSanjenner; RV64IA-NEXT: sext.w t0, a4 3444af249feSanjenner; RV64IA-NEXT: and t1, a7, a3 3454af249feSanjenner; RV64IA-NEXT: sltu t1, t1, a6 3464af249feSanjenner; RV64IA-NEXT: addi t1, t1, -1 3474af249feSanjenner; RV64IA-NEXT: and t1, t1, a1 3484af249feSanjenner; RV64IA-NEXT: subw a7, a7, t1 3494af249feSanjenner; RV64IA-NEXT: and a7, a7, a3 3504af249feSanjenner; RV64IA-NEXT: sllw a7, a7, a0 3514af249feSanjenner; RV64IA-NEXT: and a4, a4, a5 3524af249feSanjenner; RV64IA-NEXT: or a7, a4, a7 3534af249feSanjenner; RV64IA-NEXT: .LBB1_3: # %atomicrmw.start 3544af249feSanjenner; RV64IA-NEXT: # Parent Loop BB1_1 Depth=1 3554af249feSanjenner; RV64IA-NEXT: # => This Inner Loop Header: Depth=2 3564af249feSanjenner; RV64IA-NEXT: lr.w.aqrl a4, (a2) 3574af249feSanjenner; RV64IA-NEXT: bne a4, t0, .LBB1_1 3584af249feSanjenner; RV64IA-NEXT: # %bb.4: # %atomicrmw.start 3594af249feSanjenner; RV64IA-NEXT: # in Loop: Header=BB1_3 Depth=2 3604af249feSanjenner; RV64IA-NEXT: sc.w.rl t1, a7, (a2) 3614af249feSanjenner; RV64IA-NEXT: bnez t1, .LBB1_3 3624af249feSanjenner; RV64IA-NEXT: # %bb.5: # %atomicrmw.start 3634af249feSanjenner; RV64IA-NEXT: # %bb.2: # %atomicrmw.end 3644af249feSanjenner; RV64IA-NEXT: srlw a0, a4, a0 3654af249feSanjenner; RV64IA-NEXT: ret 3664af249feSanjenner %result = atomicrmw usub_cond ptr %ptr, i16 %val seq_cst 3674af249feSanjenner ret i16 %result 3684af249feSanjenner} 3694af249feSanjenner 3704af249feSanjennerdefine i32 @atomicrmw_usub_cond_i32(ptr %ptr, i32 %val) { 3714af249feSanjenner; RV32I-LABEL: atomicrmw_usub_cond_i32: 3724af249feSanjenner; RV32I: # %bb.0: 3734af249feSanjenner; RV32I-NEXT: addi sp, sp, -16 3744af249feSanjenner; RV32I-NEXT: .cfi_def_cfa_offset 16 3754af249feSanjenner; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 3764af249feSanjenner; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 3774af249feSanjenner; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 3784af249feSanjenner; RV32I-NEXT: .cfi_offset ra, -4 3794af249feSanjenner; RV32I-NEXT: .cfi_offset s0, -8 3804af249feSanjenner; RV32I-NEXT: .cfi_offset s1, -12 3814af249feSanjenner; RV32I-NEXT: mv s0, a0 3824af249feSanjenner; RV32I-NEXT: lw a3, 0(a0) 3834af249feSanjenner; RV32I-NEXT: mv s1, a1 3844af249feSanjenner; RV32I-NEXT: .LBB2_1: # %atomicrmw.start 3854af249feSanjenner; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 3864af249feSanjenner; RV32I-NEXT: sltu a0, a3, s1 3874af249feSanjenner; RV32I-NEXT: addi a0, a0, -1 3884af249feSanjenner; RV32I-NEXT: and a0, a0, s1 3894af249feSanjenner; RV32I-NEXT: sub a2, a3, a0 3904af249feSanjenner; RV32I-NEXT: sw a3, 0(sp) 3914af249feSanjenner; RV32I-NEXT: mv a1, sp 3924af249feSanjenner; RV32I-NEXT: li a3, 5 3934af249feSanjenner; RV32I-NEXT: li a4, 5 3944af249feSanjenner; RV32I-NEXT: mv a0, s0 3954af249feSanjenner; RV32I-NEXT: call __atomic_compare_exchange_4 3964af249feSanjenner; RV32I-NEXT: lw a3, 0(sp) 3974af249feSanjenner; RV32I-NEXT: beqz a0, .LBB2_1 3984af249feSanjenner; RV32I-NEXT: # %bb.2: # %atomicrmw.end 3994af249feSanjenner; RV32I-NEXT: mv a0, a3 4004af249feSanjenner; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4014af249feSanjenner; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 4024af249feSanjenner; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 40397982a8cSdlav-sc; RV32I-NEXT: .cfi_restore ra 40497982a8cSdlav-sc; RV32I-NEXT: .cfi_restore s0 40597982a8cSdlav-sc; RV32I-NEXT: .cfi_restore s1 4064af249feSanjenner; RV32I-NEXT: addi sp, sp, 16 40797982a8cSdlav-sc; RV32I-NEXT: .cfi_def_cfa_offset 0 4084af249feSanjenner; RV32I-NEXT: ret 4094af249feSanjenner; 4104af249feSanjenner; RV32IA-LABEL: atomicrmw_usub_cond_i32: 4114af249feSanjenner; RV32IA: # %bb.0: 4124af249feSanjenner; RV32IA-NEXT: lw a2, 0(a0) 4134af249feSanjenner; RV32IA-NEXT: .LBB2_1: # %atomicrmw.start 4144af249feSanjenner; RV32IA-NEXT: # =>This Loop Header: Depth=1 4154af249feSanjenner; RV32IA-NEXT: # Child Loop BB2_3 Depth 2 4164af249feSanjenner; RV32IA-NEXT: mv a3, a2 4174af249feSanjenner; RV32IA-NEXT: sltu a2, a2, a1 4184af249feSanjenner; RV32IA-NEXT: addi a2, a2, -1 4194af249feSanjenner; RV32IA-NEXT: and a2, a2, a1 4204af249feSanjenner; RV32IA-NEXT: sub a4, a3, a2 4214af249feSanjenner; RV32IA-NEXT: .LBB2_3: # %atomicrmw.start 4224af249feSanjenner; RV32IA-NEXT: # Parent Loop BB2_1 Depth=1 4234af249feSanjenner; RV32IA-NEXT: # => This Inner Loop Header: Depth=2 4244af249feSanjenner; RV32IA-NEXT: lr.w.aqrl a2, (a0) 4254af249feSanjenner; RV32IA-NEXT: bne a2, a3, .LBB2_1 4264af249feSanjenner; RV32IA-NEXT: # %bb.4: # %atomicrmw.start 4274af249feSanjenner; RV32IA-NEXT: # in Loop: Header=BB2_3 Depth=2 4284af249feSanjenner; RV32IA-NEXT: sc.w.rl a5, a4, (a0) 4294af249feSanjenner; RV32IA-NEXT: bnez a5, .LBB2_3 4304af249feSanjenner; RV32IA-NEXT: # %bb.5: # %atomicrmw.start 4314af249feSanjenner; RV32IA-NEXT: # %bb.2: # %atomicrmw.end 4324af249feSanjenner; RV32IA-NEXT: mv a0, a2 4334af249feSanjenner; RV32IA-NEXT: ret 4344af249feSanjenner; 4354af249feSanjenner; RV64I-LABEL: atomicrmw_usub_cond_i32: 4364af249feSanjenner; RV64I: # %bb.0: 4374af249feSanjenner; RV64I-NEXT: addi sp, sp, -48 4384af249feSanjenner; RV64I-NEXT: .cfi_def_cfa_offset 48 4394af249feSanjenner; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 4404af249feSanjenner; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 4414af249feSanjenner; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 4424af249feSanjenner; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 4434af249feSanjenner; RV64I-NEXT: .cfi_offset ra, -8 4444af249feSanjenner; RV64I-NEXT: .cfi_offset s0, -16 4454af249feSanjenner; RV64I-NEXT: .cfi_offset s1, -24 4464af249feSanjenner; RV64I-NEXT: .cfi_offset s2, -32 4474af249feSanjenner; RV64I-NEXT: mv s0, a0 4484af249feSanjenner; RV64I-NEXT: lw a3, 0(a0) 4494af249feSanjenner; RV64I-NEXT: mv s1, a1 4504af249feSanjenner; RV64I-NEXT: sext.w s2, a1 4514af249feSanjenner; RV64I-NEXT: .LBB2_1: # %atomicrmw.start 4524af249feSanjenner; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 4534af249feSanjenner; RV64I-NEXT: sltu a0, a3, s2 4544af249feSanjenner; RV64I-NEXT: addi a0, a0, -1 4554af249feSanjenner; RV64I-NEXT: and a0, a0, s1 4564af249feSanjenner; RV64I-NEXT: subw a2, a3, a0 4574af249feSanjenner; RV64I-NEXT: sw a3, 12(sp) 4584af249feSanjenner; RV64I-NEXT: addi a1, sp, 12 4594af249feSanjenner; RV64I-NEXT: li a3, 5 4604af249feSanjenner; RV64I-NEXT: li a4, 5 4614af249feSanjenner; RV64I-NEXT: mv a0, s0 4624af249feSanjenner; RV64I-NEXT: call __atomic_compare_exchange_4 4634af249feSanjenner; RV64I-NEXT: lw a3, 12(sp) 4644af249feSanjenner; RV64I-NEXT: beqz a0, .LBB2_1 4654af249feSanjenner; RV64I-NEXT: # %bb.2: # %atomicrmw.end 4664af249feSanjenner; RV64I-NEXT: mv a0, a3 4674af249feSanjenner; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 4684af249feSanjenner; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 4694af249feSanjenner; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 4704af249feSanjenner; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 47197982a8cSdlav-sc; RV64I-NEXT: .cfi_restore ra 47297982a8cSdlav-sc; RV64I-NEXT: .cfi_restore s0 47397982a8cSdlav-sc; RV64I-NEXT: .cfi_restore s1 47497982a8cSdlav-sc; RV64I-NEXT: .cfi_restore s2 4754af249feSanjenner; RV64I-NEXT: addi sp, sp, 48 47697982a8cSdlav-sc; RV64I-NEXT: .cfi_def_cfa_offset 0 4774af249feSanjenner; RV64I-NEXT: ret 4784af249feSanjenner; 4794af249feSanjenner; RV64IA-LABEL: atomicrmw_usub_cond_i32: 4804af249feSanjenner; RV64IA: # %bb.0: 4814af249feSanjenner; RV64IA-NEXT: lw a2, 0(a0) 4824af249feSanjenner; RV64IA-NEXT: sext.w a3, a1 4834af249feSanjenner; RV64IA-NEXT: .LBB2_1: # %atomicrmw.start 4844af249feSanjenner; RV64IA-NEXT: # =>This Loop Header: Depth=1 4854af249feSanjenner; RV64IA-NEXT: # Child Loop BB2_3 Depth 2 4864af249feSanjenner; RV64IA-NEXT: sext.w a4, a2 4874af249feSanjenner; RV64IA-NEXT: sltu a5, a4, a3 4884af249feSanjenner; RV64IA-NEXT: addi a5, a5, -1 4894af249feSanjenner; RV64IA-NEXT: and a5, a5, a1 4904af249feSanjenner; RV64IA-NEXT: subw a5, a2, a5 4914af249feSanjenner; RV64IA-NEXT: .LBB2_3: # %atomicrmw.start 4924af249feSanjenner; RV64IA-NEXT: # Parent Loop BB2_1 Depth=1 4934af249feSanjenner; RV64IA-NEXT: # => This Inner Loop Header: Depth=2 4944af249feSanjenner; RV64IA-NEXT: lr.w.aqrl a2, (a0) 4954af249feSanjenner; RV64IA-NEXT: bne a2, a4, .LBB2_1 4964af249feSanjenner; RV64IA-NEXT: # %bb.4: # %atomicrmw.start 4974af249feSanjenner; RV64IA-NEXT: # in Loop: Header=BB2_3 Depth=2 4984af249feSanjenner; RV64IA-NEXT: sc.w.rl a6, a5, (a0) 4994af249feSanjenner; RV64IA-NEXT: bnez a6, .LBB2_3 5004af249feSanjenner; RV64IA-NEXT: # %bb.5: # %atomicrmw.start 5014af249feSanjenner; RV64IA-NEXT: # %bb.2: # %atomicrmw.end 5024af249feSanjenner; RV64IA-NEXT: mv a0, a2 5034af249feSanjenner; RV64IA-NEXT: ret 5044af249feSanjenner %result = atomicrmw usub_cond ptr %ptr, i32 %val seq_cst 5054af249feSanjenner ret i32 %result 5064af249feSanjenner} 5074af249feSanjenner 5084af249feSanjennerdefine i64 @atomicrmw_usub_cond_i64(ptr %ptr, i64 %val) { 5094af249feSanjenner; RV32I-LABEL: atomicrmw_usub_cond_i64: 5104af249feSanjenner; RV32I: # %bb.0: 5114af249feSanjenner; RV32I-NEXT: addi sp, sp, -32 5124af249feSanjenner; RV32I-NEXT: .cfi_def_cfa_offset 32 5134af249feSanjenner; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 5144af249feSanjenner; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 5154af249feSanjenner; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 5164af249feSanjenner; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 5174af249feSanjenner; RV32I-NEXT: .cfi_offset ra, -4 5184af249feSanjenner; RV32I-NEXT: .cfi_offset s0, -8 5194af249feSanjenner; RV32I-NEXT: .cfi_offset s1, -12 5204af249feSanjenner; RV32I-NEXT: .cfi_offset s2, -16 521*9122c523SPengcheng Wang; RV32I-NEXT: mv s0, a2 522*9122c523SPengcheng Wang; RV32I-NEXT: mv s1, a0 523*9122c523SPengcheng Wang; RV32I-NEXT: lw a4, 0(a0) 524*9122c523SPengcheng Wang; RV32I-NEXT: lw a5, 4(a0) 5254af249feSanjenner; RV32I-NEXT: mv s2, a1 5264af249feSanjenner; RV32I-NEXT: j .LBB3_3 5274af249feSanjenner; RV32I-NEXT: .LBB3_1: # %atomicrmw.start 5284af249feSanjenner; RV32I-NEXT: # in Loop: Header=BB3_3 Depth=1 529*9122c523SPengcheng Wang; RV32I-NEXT: sltu a0, a5, s0 5304af249feSanjenner; RV32I-NEXT: .LBB3_2: # %atomicrmw.start 5314af249feSanjenner; RV32I-NEXT: # in Loop: Header=BB3_3 Depth=1 5324af249feSanjenner; RV32I-NEXT: xori a0, a0, 1 5334af249feSanjenner; RV32I-NEXT: neg a0, a0 5344af249feSanjenner; RV32I-NEXT: and a1, a0, s2 535*9122c523SPengcheng Wang; RV32I-NEXT: and a0, a0, s0 536*9122c523SPengcheng Wang; RV32I-NEXT: sltu a3, a4, a1 537*9122c523SPengcheng Wang; RV32I-NEXT: sub a0, a5, a0 538*9122c523SPengcheng Wang; RV32I-NEXT: sub a2, a4, a1 539*9122c523SPengcheng Wang; RV32I-NEXT: sub a3, a0, a3 540*9122c523SPengcheng Wang; RV32I-NEXT: sw a4, 8(sp) 541*9122c523SPengcheng Wang; RV32I-NEXT: sw a5, 12(sp) 5424af249feSanjenner; RV32I-NEXT: addi a1, sp, 8 5434af249feSanjenner; RV32I-NEXT: li a4, 5 5444af249feSanjenner; RV32I-NEXT: li a5, 5 545*9122c523SPengcheng Wang; RV32I-NEXT: mv a0, s1 5464af249feSanjenner; RV32I-NEXT: call __atomic_compare_exchange_8 547*9122c523SPengcheng Wang; RV32I-NEXT: lw a4, 8(sp) 548*9122c523SPengcheng Wang; RV32I-NEXT: lw a5, 12(sp) 5494af249feSanjenner; RV32I-NEXT: bnez a0, .LBB3_5 5504af249feSanjenner; RV32I-NEXT: .LBB3_3: # %atomicrmw.start 5514af249feSanjenner; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 552*9122c523SPengcheng Wang; RV32I-NEXT: bne a5, s0, .LBB3_1 5534af249feSanjenner; RV32I-NEXT: # %bb.4: # in Loop: Header=BB3_3 Depth=1 554*9122c523SPengcheng Wang; RV32I-NEXT: sltu a0, a4, s2 5554af249feSanjenner; RV32I-NEXT: j .LBB3_2 5564af249feSanjenner; RV32I-NEXT: .LBB3_5: # %atomicrmw.end 557*9122c523SPengcheng Wang; RV32I-NEXT: mv a0, a4 558*9122c523SPengcheng Wang; RV32I-NEXT: mv a1, a5 5594af249feSanjenner; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 5604af249feSanjenner; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 5614af249feSanjenner; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 5624af249feSanjenner; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 56397982a8cSdlav-sc; RV32I-NEXT: .cfi_restore ra 56497982a8cSdlav-sc; RV32I-NEXT: .cfi_restore s0 56597982a8cSdlav-sc; RV32I-NEXT: .cfi_restore s1 56697982a8cSdlav-sc; RV32I-NEXT: .cfi_restore s2 5674af249feSanjenner; RV32I-NEXT: addi sp, sp, 32 56897982a8cSdlav-sc; RV32I-NEXT: .cfi_def_cfa_offset 0 5694af249feSanjenner; RV32I-NEXT: ret 5704af249feSanjenner; 5714af249feSanjenner; RV32IA-LABEL: atomicrmw_usub_cond_i64: 5724af249feSanjenner; RV32IA: # %bb.0: 5734af249feSanjenner; RV32IA-NEXT: addi sp, sp, -32 5744af249feSanjenner; RV32IA-NEXT: .cfi_def_cfa_offset 32 5754af249feSanjenner; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 5764af249feSanjenner; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 5774af249feSanjenner; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 5784af249feSanjenner; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 5794af249feSanjenner; RV32IA-NEXT: .cfi_offset ra, -4 5804af249feSanjenner; RV32IA-NEXT: .cfi_offset s0, -8 5814af249feSanjenner; RV32IA-NEXT: .cfi_offset s1, -12 5824af249feSanjenner; RV32IA-NEXT: .cfi_offset s2, -16 583*9122c523SPengcheng Wang; RV32IA-NEXT: mv s0, a2 584*9122c523SPengcheng Wang; RV32IA-NEXT: mv s1, a0 585*9122c523SPengcheng Wang; RV32IA-NEXT: lw a4, 0(a0) 586*9122c523SPengcheng Wang; RV32IA-NEXT: lw a5, 4(a0) 5874af249feSanjenner; RV32IA-NEXT: mv s2, a1 5884af249feSanjenner; RV32IA-NEXT: j .LBB3_3 5894af249feSanjenner; RV32IA-NEXT: .LBB3_1: # %atomicrmw.start 5904af249feSanjenner; RV32IA-NEXT: # in Loop: Header=BB3_3 Depth=1 591*9122c523SPengcheng Wang; RV32IA-NEXT: sltu a0, a5, s0 5924af249feSanjenner; RV32IA-NEXT: .LBB3_2: # %atomicrmw.start 5934af249feSanjenner; RV32IA-NEXT: # in Loop: Header=BB3_3 Depth=1 5944af249feSanjenner; RV32IA-NEXT: xori a0, a0, 1 5954af249feSanjenner; RV32IA-NEXT: neg a0, a0 5964af249feSanjenner; RV32IA-NEXT: and a1, a0, s2 597*9122c523SPengcheng Wang; RV32IA-NEXT: and a0, a0, s0 598*9122c523SPengcheng Wang; RV32IA-NEXT: sltu a3, a4, a1 599*9122c523SPengcheng Wang; RV32IA-NEXT: sub a0, a5, a0 600*9122c523SPengcheng Wang; RV32IA-NEXT: sub a2, a4, a1 601*9122c523SPengcheng Wang; RV32IA-NEXT: sub a3, a0, a3 602*9122c523SPengcheng Wang; RV32IA-NEXT: sw a4, 8(sp) 603*9122c523SPengcheng Wang; RV32IA-NEXT: sw a5, 12(sp) 6044af249feSanjenner; RV32IA-NEXT: addi a1, sp, 8 6054af249feSanjenner; RV32IA-NEXT: li a4, 5 6064af249feSanjenner; RV32IA-NEXT: li a5, 5 607*9122c523SPengcheng Wang; RV32IA-NEXT: mv a0, s1 6084af249feSanjenner; RV32IA-NEXT: call __atomic_compare_exchange_8 609*9122c523SPengcheng Wang; RV32IA-NEXT: lw a4, 8(sp) 610*9122c523SPengcheng Wang; RV32IA-NEXT: lw a5, 12(sp) 6114af249feSanjenner; RV32IA-NEXT: bnez a0, .LBB3_5 6124af249feSanjenner; RV32IA-NEXT: .LBB3_3: # %atomicrmw.start 6134af249feSanjenner; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 614*9122c523SPengcheng Wang; RV32IA-NEXT: bne a5, s0, .LBB3_1 6154af249feSanjenner; RV32IA-NEXT: # %bb.4: # in Loop: Header=BB3_3 Depth=1 616*9122c523SPengcheng Wang; RV32IA-NEXT: sltu a0, a4, s2 6174af249feSanjenner; RV32IA-NEXT: j .LBB3_2 6184af249feSanjenner; RV32IA-NEXT: .LBB3_5: # %atomicrmw.end 619*9122c523SPengcheng Wang; RV32IA-NEXT: mv a0, a4 620*9122c523SPengcheng Wang; RV32IA-NEXT: mv a1, a5 6214af249feSanjenner; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 6224af249feSanjenner; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 6234af249feSanjenner; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 6244af249feSanjenner; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 62597982a8cSdlav-sc; RV32IA-NEXT: .cfi_restore ra 62697982a8cSdlav-sc; RV32IA-NEXT: .cfi_restore s0 62797982a8cSdlav-sc; RV32IA-NEXT: .cfi_restore s1 62897982a8cSdlav-sc; RV32IA-NEXT: .cfi_restore s2 6294af249feSanjenner; RV32IA-NEXT: addi sp, sp, 32 63097982a8cSdlav-sc; RV32IA-NEXT: .cfi_def_cfa_offset 0 6314af249feSanjenner; RV32IA-NEXT: ret 6324af249feSanjenner; 6334af249feSanjenner; RV64I-LABEL: atomicrmw_usub_cond_i64: 6344af249feSanjenner; RV64I: # %bb.0: 6354af249feSanjenner; RV64I-NEXT: addi sp, sp, -32 6364af249feSanjenner; RV64I-NEXT: .cfi_def_cfa_offset 32 6374af249feSanjenner; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 6384af249feSanjenner; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 6394af249feSanjenner; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 6404af249feSanjenner; RV64I-NEXT: .cfi_offset ra, -8 6414af249feSanjenner; RV64I-NEXT: .cfi_offset s0, -16 6424af249feSanjenner; RV64I-NEXT: .cfi_offset s1, -24 6434af249feSanjenner; RV64I-NEXT: mv s0, a0 6444af249feSanjenner; RV64I-NEXT: ld a3, 0(a0) 6454af249feSanjenner; RV64I-NEXT: mv s1, a1 6464af249feSanjenner; RV64I-NEXT: .LBB3_1: # %atomicrmw.start 6474af249feSanjenner; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 6484af249feSanjenner; RV64I-NEXT: sltu a0, a3, s1 6494af249feSanjenner; RV64I-NEXT: addi a0, a0, -1 6504af249feSanjenner; RV64I-NEXT: and a0, a0, s1 6514af249feSanjenner; RV64I-NEXT: sub a2, a3, a0 6524af249feSanjenner; RV64I-NEXT: sd a3, 0(sp) 6534af249feSanjenner; RV64I-NEXT: mv a1, sp 6544af249feSanjenner; RV64I-NEXT: li a3, 5 6554af249feSanjenner; RV64I-NEXT: li a4, 5 6564af249feSanjenner; RV64I-NEXT: mv a0, s0 6574af249feSanjenner; RV64I-NEXT: call __atomic_compare_exchange_8 6584af249feSanjenner; RV64I-NEXT: ld a3, 0(sp) 6594af249feSanjenner; RV64I-NEXT: beqz a0, .LBB3_1 6604af249feSanjenner; RV64I-NEXT: # %bb.2: # %atomicrmw.end 6614af249feSanjenner; RV64I-NEXT: mv a0, a3 6624af249feSanjenner; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 6634af249feSanjenner; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 6644af249feSanjenner; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 66597982a8cSdlav-sc; RV64I-NEXT: .cfi_restore ra 66697982a8cSdlav-sc; RV64I-NEXT: .cfi_restore s0 66797982a8cSdlav-sc; RV64I-NEXT: .cfi_restore s1 6684af249feSanjenner; RV64I-NEXT: addi sp, sp, 32 66997982a8cSdlav-sc; RV64I-NEXT: .cfi_def_cfa_offset 0 6704af249feSanjenner; RV64I-NEXT: ret 6714af249feSanjenner; 6724af249feSanjenner; RV64IA-LABEL: atomicrmw_usub_cond_i64: 6734af249feSanjenner; RV64IA: # %bb.0: 6744af249feSanjenner; RV64IA-NEXT: ld a2, 0(a0) 6754af249feSanjenner; RV64IA-NEXT: .LBB3_1: # %atomicrmw.start 6764af249feSanjenner; RV64IA-NEXT: # =>This Loop Header: Depth=1 6774af249feSanjenner; RV64IA-NEXT: # Child Loop BB3_3 Depth 2 6784af249feSanjenner; RV64IA-NEXT: mv a3, a2 6794af249feSanjenner; RV64IA-NEXT: sltu a2, a2, a1 6804af249feSanjenner; RV64IA-NEXT: addi a2, a2, -1 6814af249feSanjenner; RV64IA-NEXT: and a2, a2, a1 6824af249feSanjenner; RV64IA-NEXT: sub a4, a3, a2 6834af249feSanjenner; RV64IA-NEXT: .LBB3_3: # %atomicrmw.start 6844af249feSanjenner; RV64IA-NEXT: # Parent Loop BB3_1 Depth=1 6854af249feSanjenner; RV64IA-NEXT: # => This Inner Loop Header: Depth=2 6864af249feSanjenner; RV64IA-NEXT: lr.d.aqrl a2, (a0) 6874af249feSanjenner; RV64IA-NEXT: bne a2, a3, .LBB3_1 6884af249feSanjenner; RV64IA-NEXT: # %bb.4: # %atomicrmw.start 6894af249feSanjenner; RV64IA-NEXT: # in Loop: Header=BB3_3 Depth=2 6904af249feSanjenner; RV64IA-NEXT: sc.d.rl a5, a4, (a0) 6914af249feSanjenner; RV64IA-NEXT: bnez a5, .LBB3_3 6924af249feSanjenner; RV64IA-NEXT: # %bb.5: # %atomicrmw.start 6934af249feSanjenner; RV64IA-NEXT: # %bb.2: # %atomicrmw.end 6944af249feSanjenner; RV64IA-NEXT: mv a0, a2 6954af249feSanjenner; RV64IA-NEXT: ret 6964af249feSanjenner %result = atomicrmw usub_cond ptr %ptr, i64 %val seq_cst 6974af249feSanjenner ret i64 %result 6984af249feSanjenner} 6994af249feSanjenner 7004af249feSanjennerdefine i8 @atomicrmw_usub_sat_i8(ptr %ptr, i8 %val) { 7014af249feSanjenner; RV32I-LABEL: atomicrmw_usub_sat_i8: 7024af249feSanjenner; RV32I: # %bb.0: 7034af249feSanjenner; RV32I-NEXT: addi sp, sp, -16 7044af249feSanjenner; RV32I-NEXT: .cfi_def_cfa_offset 16 7054af249feSanjenner; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 7064af249feSanjenner; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 7074af249feSanjenner; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 7084af249feSanjenner; RV32I-NEXT: .cfi_offset ra, -4 7094af249feSanjenner; RV32I-NEXT: .cfi_offset s0, -8 7104af249feSanjenner; RV32I-NEXT: .cfi_offset s1, -12 7114af249feSanjenner; RV32I-NEXT: mv s0, a0 7124af249feSanjenner; RV32I-NEXT: lbu a3, 0(a0) 7134af249feSanjenner; RV32I-NEXT: andi s1, a1, 255 7144af249feSanjenner; RV32I-NEXT: .LBB4_1: # %atomicrmw.start 7154af249feSanjenner; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 7164af249feSanjenner; RV32I-NEXT: andi a0, a3, 255 7174af249feSanjenner; RV32I-NEXT: sub a1, a0, s1 7184af249feSanjenner; RV32I-NEXT: sltu a0, a0, a1 7194af249feSanjenner; RV32I-NEXT: addi a0, a0, -1 7204af249feSanjenner; RV32I-NEXT: and a2, a0, a1 7214af249feSanjenner; RV32I-NEXT: sb a3, 3(sp) 7224af249feSanjenner; RV32I-NEXT: addi a1, sp, 3 7234af249feSanjenner; RV32I-NEXT: li a3, 5 7244af249feSanjenner; RV32I-NEXT: li a4, 5 7254af249feSanjenner; RV32I-NEXT: mv a0, s0 7264af249feSanjenner; RV32I-NEXT: call __atomic_compare_exchange_1 7274af249feSanjenner; RV32I-NEXT: lbu a3, 3(sp) 7284af249feSanjenner; RV32I-NEXT: beqz a0, .LBB4_1 7294af249feSanjenner; RV32I-NEXT: # %bb.2: # %atomicrmw.end 7304af249feSanjenner; RV32I-NEXT: mv a0, a3 7314af249feSanjenner; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 7324af249feSanjenner; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 7334af249feSanjenner; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 73497982a8cSdlav-sc; RV32I-NEXT: .cfi_restore ra 73597982a8cSdlav-sc; RV32I-NEXT: .cfi_restore s0 73697982a8cSdlav-sc; RV32I-NEXT: .cfi_restore s1 7374af249feSanjenner; RV32I-NEXT: addi sp, sp, 16 73897982a8cSdlav-sc; RV32I-NEXT: .cfi_def_cfa_offset 0 7394af249feSanjenner; RV32I-NEXT: ret 7404af249feSanjenner; 7414af249feSanjenner; RV32IA-LABEL: atomicrmw_usub_sat_i8: 7424af249feSanjenner; RV32IA: # %bb.0: 7434af249feSanjenner; RV32IA-NEXT: andi a2, a0, -4 744*9122c523SPengcheng Wang; RV32IA-NEXT: slli a0, a0, 3 745*9122c523SPengcheng Wang; RV32IA-NEXT: li a3, 255 746*9122c523SPengcheng Wang; RV32IA-NEXT: sll a3, a3, a0 7474af249feSanjenner; RV32IA-NEXT: lw a4, 0(a2) 748*9122c523SPengcheng Wang; RV32IA-NEXT: andi a0, a0, 24 7494af249feSanjenner; RV32IA-NEXT: not a3, a3 7504af249feSanjenner; RV32IA-NEXT: andi a1, a1, 255 7514af249feSanjenner; RV32IA-NEXT: .LBB4_1: # %atomicrmw.start 7524af249feSanjenner; RV32IA-NEXT: # =>This Loop Header: Depth=1 7534af249feSanjenner; RV32IA-NEXT: # Child Loop BB4_3 Depth 2 7544af249feSanjenner; RV32IA-NEXT: mv a5, a4 7554af249feSanjenner; RV32IA-NEXT: srl a4, a4, a0 7564af249feSanjenner; RV32IA-NEXT: andi a4, a4, 255 7574af249feSanjenner; RV32IA-NEXT: sub a6, a4, a1 7584af249feSanjenner; RV32IA-NEXT: sltu a4, a4, a6 7594af249feSanjenner; RV32IA-NEXT: addi a4, a4, -1 7604af249feSanjenner; RV32IA-NEXT: and a4, a4, a6 7614af249feSanjenner; RV32IA-NEXT: sll a4, a4, a0 7624af249feSanjenner; RV32IA-NEXT: and a6, a5, a3 7634af249feSanjenner; RV32IA-NEXT: or a6, a6, a4 7644af249feSanjenner; RV32IA-NEXT: .LBB4_3: # %atomicrmw.start 7654af249feSanjenner; RV32IA-NEXT: # Parent Loop BB4_1 Depth=1 7664af249feSanjenner; RV32IA-NEXT: # => This Inner Loop Header: Depth=2 7674af249feSanjenner; RV32IA-NEXT: lr.w.aqrl a4, (a2) 7684af249feSanjenner; RV32IA-NEXT: bne a4, a5, .LBB4_1 7694af249feSanjenner; RV32IA-NEXT: # %bb.4: # %atomicrmw.start 7704af249feSanjenner; RV32IA-NEXT: # in Loop: Header=BB4_3 Depth=2 7714af249feSanjenner; RV32IA-NEXT: sc.w.rl a7, a6, (a2) 7724af249feSanjenner; RV32IA-NEXT: bnez a7, .LBB4_3 7734af249feSanjenner; RV32IA-NEXT: # %bb.5: # %atomicrmw.start 7744af249feSanjenner; RV32IA-NEXT: # %bb.2: # %atomicrmw.end 7754af249feSanjenner; RV32IA-NEXT: srl a0, a4, a0 7764af249feSanjenner; RV32IA-NEXT: ret 7774af249feSanjenner; 7784af249feSanjenner; RV64I-LABEL: atomicrmw_usub_sat_i8: 7794af249feSanjenner; RV64I: # %bb.0: 7804af249feSanjenner; RV64I-NEXT: addi sp, sp, -32 7814af249feSanjenner; RV64I-NEXT: .cfi_def_cfa_offset 32 7824af249feSanjenner; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 7834af249feSanjenner; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 7844af249feSanjenner; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 7854af249feSanjenner; RV64I-NEXT: .cfi_offset ra, -8 7864af249feSanjenner; RV64I-NEXT: .cfi_offset s0, -16 7874af249feSanjenner; RV64I-NEXT: .cfi_offset s1, -24 7884af249feSanjenner; RV64I-NEXT: mv s0, a0 7894af249feSanjenner; RV64I-NEXT: lbu a3, 0(a0) 7904af249feSanjenner; RV64I-NEXT: andi s1, a1, 255 7914af249feSanjenner; RV64I-NEXT: .LBB4_1: # %atomicrmw.start 7924af249feSanjenner; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 7934af249feSanjenner; RV64I-NEXT: andi a0, a3, 255 7944af249feSanjenner; RV64I-NEXT: sub a1, a0, s1 7954af249feSanjenner; RV64I-NEXT: sltu a0, a0, a1 7964af249feSanjenner; RV64I-NEXT: addi a0, a0, -1 7974af249feSanjenner; RV64I-NEXT: and a2, a0, a1 7984af249feSanjenner; RV64I-NEXT: sb a3, 7(sp) 7994af249feSanjenner; RV64I-NEXT: addi a1, sp, 7 8004af249feSanjenner; RV64I-NEXT: li a3, 5 8014af249feSanjenner; RV64I-NEXT: li a4, 5 8024af249feSanjenner; RV64I-NEXT: mv a0, s0 8034af249feSanjenner; RV64I-NEXT: call __atomic_compare_exchange_1 8044af249feSanjenner; RV64I-NEXT: lbu a3, 7(sp) 8054af249feSanjenner; RV64I-NEXT: beqz a0, .LBB4_1 8064af249feSanjenner; RV64I-NEXT: # %bb.2: # %atomicrmw.end 8074af249feSanjenner; RV64I-NEXT: mv a0, a3 8084af249feSanjenner; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 8094af249feSanjenner; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 8104af249feSanjenner; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 81197982a8cSdlav-sc; RV64I-NEXT: .cfi_restore ra 81297982a8cSdlav-sc; RV64I-NEXT: .cfi_restore s0 81397982a8cSdlav-sc; RV64I-NEXT: .cfi_restore s1 8144af249feSanjenner; RV64I-NEXT: addi sp, sp, 32 81597982a8cSdlav-sc; RV64I-NEXT: .cfi_def_cfa_offset 0 8164af249feSanjenner; RV64I-NEXT: ret 8174af249feSanjenner; 8184af249feSanjenner; RV64IA-LABEL: atomicrmw_usub_sat_i8: 8194af249feSanjenner; RV64IA: # %bb.0: 8204af249feSanjenner; RV64IA-NEXT: andi a2, a0, -4 821*9122c523SPengcheng Wang; RV64IA-NEXT: slli a0, a0, 3 822*9122c523SPengcheng Wang; RV64IA-NEXT: li a3, 255 823*9122c523SPengcheng Wang; RV64IA-NEXT: sllw a4, a3, a0 8244af249feSanjenner; RV64IA-NEXT: lw a3, 0(a2) 825*9122c523SPengcheng Wang; RV64IA-NEXT: andi a0, a0, 24 8264af249feSanjenner; RV64IA-NEXT: not a4, a4 8274af249feSanjenner; RV64IA-NEXT: andi a1, a1, 255 8284af249feSanjenner; RV64IA-NEXT: .LBB4_1: # %atomicrmw.start 8294af249feSanjenner; RV64IA-NEXT: # =>This Loop Header: Depth=1 8304af249feSanjenner; RV64IA-NEXT: # Child Loop BB4_3 Depth 2 8314af249feSanjenner; RV64IA-NEXT: srlw a5, a3, a0 8324af249feSanjenner; RV64IA-NEXT: sext.w a6, a3 8334af249feSanjenner; RV64IA-NEXT: andi a5, a5, 255 8344af249feSanjenner; RV64IA-NEXT: sub a7, a5, a1 8354af249feSanjenner; RV64IA-NEXT: sltu a5, a5, a7 8364af249feSanjenner; RV64IA-NEXT: addi a5, a5, -1 8374af249feSanjenner; RV64IA-NEXT: and a5, a5, a7 8384af249feSanjenner; RV64IA-NEXT: sllw a5, a5, a0 8394af249feSanjenner; RV64IA-NEXT: and a3, a3, a4 8404af249feSanjenner; RV64IA-NEXT: or a5, a3, a5 8414af249feSanjenner; RV64IA-NEXT: .LBB4_3: # %atomicrmw.start 8424af249feSanjenner; RV64IA-NEXT: # Parent Loop BB4_1 Depth=1 8434af249feSanjenner; RV64IA-NEXT: # => This Inner Loop Header: Depth=2 8444af249feSanjenner; RV64IA-NEXT: lr.w.aqrl a3, (a2) 8454af249feSanjenner; RV64IA-NEXT: bne a3, a6, .LBB4_1 8464af249feSanjenner; RV64IA-NEXT: # %bb.4: # %atomicrmw.start 8474af249feSanjenner; RV64IA-NEXT: # in Loop: Header=BB4_3 Depth=2 8484af249feSanjenner; RV64IA-NEXT: sc.w.rl a7, a5, (a2) 8494af249feSanjenner; RV64IA-NEXT: bnez a7, .LBB4_3 8504af249feSanjenner; RV64IA-NEXT: # %bb.5: # %atomicrmw.start 8514af249feSanjenner; RV64IA-NEXT: # %bb.2: # %atomicrmw.end 8524af249feSanjenner; RV64IA-NEXT: srlw a0, a3, a0 8534af249feSanjenner; RV64IA-NEXT: ret 8544af249feSanjenner %result = atomicrmw usub_sat ptr %ptr, i8 %val seq_cst 8554af249feSanjenner ret i8 %result 8564af249feSanjenner} 8574af249feSanjenner 8584af249feSanjennerdefine i16 @atomicrmw_usub_sat_i16(ptr %ptr, i16 %val) { 8594af249feSanjenner; RV32I-LABEL: atomicrmw_usub_sat_i16: 8604af249feSanjenner; RV32I: # %bb.0: 8614af249feSanjenner; RV32I-NEXT: addi sp, sp, -32 8624af249feSanjenner; RV32I-NEXT: .cfi_def_cfa_offset 32 8634af249feSanjenner; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 8644af249feSanjenner; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 8654af249feSanjenner; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 8664af249feSanjenner; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 8674af249feSanjenner; RV32I-NEXT: .cfi_offset ra, -4 8684af249feSanjenner; RV32I-NEXT: .cfi_offset s0, -8 8694af249feSanjenner; RV32I-NEXT: .cfi_offset s1, -12 8704af249feSanjenner; RV32I-NEXT: .cfi_offset s2, -16 8714af249feSanjenner; RV32I-NEXT: mv s0, a0 8724af249feSanjenner; RV32I-NEXT: lhu a3, 0(a0) 8734af249feSanjenner; RV32I-NEXT: lui s1, 16 8744af249feSanjenner; RV32I-NEXT: addi s1, s1, -1 8754af249feSanjenner; RV32I-NEXT: and s2, a1, s1 8764af249feSanjenner; RV32I-NEXT: .LBB5_1: # %atomicrmw.start 8774af249feSanjenner; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 8784af249feSanjenner; RV32I-NEXT: and a0, a3, s1 8794af249feSanjenner; RV32I-NEXT: sub a1, a0, s2 8804af249feSanjenner; RV32I-NEXT: sltu a0, a0, a1 8814af249feSanjenner; RV32I-NEXT: addi a0, a0, -1 8824af249feSanjenner; RV32I-NEXT: and a2, a0, a1 8834af249feSanjenner; RV32I-NEXT: sh a3, 14(sp) 8844af249feSanjenner; RV32I-NEXT: addi a1, sp, 14 8854af249feSanjenner; RV32I-NEXT: li a3, 5 8864af249feSanjenner; RV32I-NEXT: li a4, 5 8874af249feSanjenner; RV32I-NEXT: mv a0, s0 8884af249feSanjenner; RV32I-NEXT: call __atomic_compare_exchange_2 8894af249feSanjenner; RV32I-NEXT: lh a3, 14(sp) 8904af249feSanjenner; RV32I-NEXT: beqz a0, .LBB5_1 8914af249feSanjenner; RV32I-NEXT: # %bb.2: # %atomicrmw.end 8924af249feSanjenner; RV32I-NEXT: mv a0, a3 8934af249feSanjenner; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 8944af249feSanjenner; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 8954af249feSanjenner; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 8964af249feSanjenner; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 89797982a8cSdlav-sc; RV32I-NEXT: .cfi_restore ra 89897982a8cSdlav-sc; RV32I-NEXT: .cfi_restore s0 89997982a8cSdlav-sc; RV32I-NEXT: .cfi_restore s1 90097982a8cSdlav-sc; RV32I-NEXT: .cfi_restore s2 9014af249feSanjenner; RV32I-NEXT: addi sp, sp, 32 90297982a8cSdlav-sc; RV32I-NEXT: .cfi_def_cfa_offset 0 9034af249feSanjenner; RV32I-NEXT: ret 9044af249feSanjenner; 9054af249feSanjenner; RV32IA-LABEL: atomicrmw_usub_sat_i16: 9064af249feSanjenner; RV32IA: # %bb.0: 9074af249feSanjenner; RV32IA-NEXT: andi a2, a0, -4 9084af249feSanjenner; RV32IA-NEXT: slli a4, a0, 3 9094af249feSanjenner; RV32IA-NEXT: lui a3, 16 910*9122c523SPengcheng Wang; RV32IA-NEXT: andi a0, a4, 24 9114af249feSanjenner; RV32IA-NEXT: addi a3, a3, -1 9124af249feSanjenner; RV32IA-NEXT: lw a5, 0(a2) 9134af249feSanjenner; RV32IA-NEXT: sll a4, a3, a4 9144af249feSanjenner; RV32IA-NEXT: not a4, a4 9154af249feSanjenner; RV32IA-NEXT: and a1, a1, a3 9164af249feSanjenner; RV32IA-NEXT: .LBB5_1: # %atomicrmw.start 9174af249feSanjenner; RV32IA-NEXT: # =>This Loop Header: Depth=1 9184af249feSanjenner; RV32IA-NEXT: # Child Loop BB5_3 Depth 2 9194af249feSanjenner; RV32IA-NEXT: mv a6, a5 9204af249feSanjenner; RV32IA-NEXT: srl a5, a5, a0 9214af249feSanjenner; RV32IA-NEXT: and a5, a5, a3 9224af249feSanjenner; RV32IA-NEXT: sub a7, a5, a1 9234af249feSanjenner; RV32IA-NEXT: sltu a5, a5, a7 9244af249feSanjenner; RV32IA-NEXT: addi a5, a5, -1 9254af249feSanjenner; RV32IA-NEXT: and a5, a5, a7 9264af249feSanjenner; RV32IA-NEXT: sll a5, a5, a0 9274af249feSanjenner; RV32IA-NEXT: and a7, a6, a4 9284af249feSanjenner; RV32IA-NEXT: or a7, a7, a5 9294af249feSanjenner; RV32IA-NEXT: .LBB5_3: # %atomicrmw.start 9304af249feSanjenner; RV32IA-NEXT: # Parent Loop BB5_1 Depth=1 9314af249feSanjenner; RV32IA-NEXT: # => This Inner Loop Header: Depth=2 9324af249feSanjenner; RV32IA-NEXT: lr.w.aqrl a5, (a2) 9334af249feSanjenner; RV32IA-NEXT: bne a5, a6, .LBB5_1 9344af249feSanjenner; RV32IA-NEXT: # %bb.4: # %atomicrmw.start 9354af249feSanjenner; RV32IA-NEXT: # in Loop: Header=BB5_3 Depth=2 9364af249feSanjenner; RV32IA-NEXT: sc.w.rl t0, a7, (a2) 9374af249feSanjenner; RV32IA-NEXT: bnez t0, .LBB5_3 9384af249feSanjenner; RV32IA-NEXT: # %bb.5: # %atomicrmw.start 9394af249feSanjenner; RV32IA-NEXT: # %bb.2: # %atomicrmw.end 9404af249feSanjenner; RV32IA-NEXT: srl a0, a5, a0 9414af249feSanjenner; RV32IA-NEXT: ret 9424af249feSanjenner; 9434af249feSanjenner; RV64I-LABEL: atomicrmw_usub_sat_i16: 9444af249feSanjenner; RV64I: # %bb.0: 9454af249feSanjenner; RV64I-NEXT: addi sp, sp, -48 9464af249feSanjenner; RV64I-NEXT: .cfi_def_cfa_offset 48 9474af249feSanjenner; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 9484af249feSanjenner; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 9494af249feSanjenner; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 9504af249feSanjenner; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 9514af249feSanjenner; RV64I-NEXT: .cfi_offset ra, -8 9524af249feSanjenner; RV64I-NEXT: .cfi_offset s0, -16 9534af249feSanjenner; RV64I-NEXT: .cfi_offset s1, -24 9544af249feSanjenner; RV64I-NEXT: .cfi_offset s2, -32 9554af249feSanjenner; RV64I-NEXT: mv s0, a0 9564af249feSanjenner; RV64I-NEXT: lhu a3, 0(a0) 9574af249feSanjenner; RV64I-NEXT: lui s1, 16 9584af249feSanjenner; RV64I-NEXT: addiw s1, s1, -1 9594af249feSanjenner; RV64I-NEXT: and s2, a1, s1 9604af249feSanjenner; RV64I-NEXT: .LBB5_1: # %atomicrmw.start 9614af249feSanjenner; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 9624af249feSanjenner; RV64I-NEXT: and a0, a3, s1 9634af249feSanjenner; RV64I-NEXT: sub a1, a0, s2 9644af249feSanjenner; RV64I-NEXT: sltu a0, a0, a1 9654af249feSanjenner; RV64I-NEXT: addi a0, a0, -1 9664af249feSanjenner; RV64I-NEXT: and a2, a0, a1 9674af249feSanjenner; RV64I-NEXT: sh a3, 14(sp) 9684af249feSanjenner; RV64I-NEXT: addi a1, sp, 14 9694af249feSanjenner; RV64I-NEXT: li a3, 5 9704af249feSanjenner; RV64I-NEXT: li a4, 5 9714af249feSanjenner; RV64I-NEXT: mv a0, s0 9724af249feSanjenner; RV64I-NEXT: call __atomic_compare_exchange_2 9734af249feSanjenner; RV64I-NEXT: lh a3, 14(sp) 9744af249feSanjenner; RV64I-NEXT: beqz a0, .LBB5_1 9754af249feSanjenner; RV64I-NEXT: # %bb.2: # %atomicrmw.end 9764af249feSanjenner; RV64I-NEXT: mv a0, a3 9774af249feSanjenner; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 9784af249feSanjenner; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 9794af249feSanjenner; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 9804af249feSanjenner; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 98197982a8cSdlav-sc; RV64I-NEXT: .cfi_restore ra 98297982a8cSdlav-sc; RV64I-NEXT: .cfi_restore s0 98397982a8cSdlav-sc; RV64I-NEXT: .cfi_restore s1 98497982a8cSdlav-sc; RV64I-NEXT: .cfi_restore s2 9854af249feSanjenner; RV64I-NEXT: addi sp, sp, 48 98697982a8cSdlav-sc; RV64I-NEXT: .cfi_def_cfa_offset 0 9874af249feSanjenner; RV64I-NEXT: ret 9884af249feSanjenner; 9894af249feSanjenner; RV64IA-LABEL: atomicrmw_usub_sat_i16: 9904af249feSanjenner; RV64IA: # %bb.0: 9914af249feSanjenner; RV64IA-NEXT: andi a2, a0, -4 9924af249feSanjenner; RV64IA-NEXT: slli a5, a0, 3 9934af249feSanjenner; RV64IA-NEXT: lui a3, 16 994*9122c523SPengcheng Wang; RV64IA-NEXT: andi a0, a5, 24 9954af249feSanjenner; RV64IA-NEXT: addiw a3, a3, -1 9964af249feSanjenner; RV64IA-NEXT: lw a4, 0(a2) 9974af249feSanjenner; RV64IA-NEXT: sllw a5, a3, a5 9984af249feSanjenner; RV64IA-NEXT: not a5, a5 9994af249feSanjenner; RV64IA-NEXT: and a1, a1, a3 10004af249feSanjenner; RV64IA-NEXT: .LBB5_1: # %atomicrmw.start 10014af249feSanjenner; RV64IA-NEXT: # =>This Loop Header: Depth=1 10024af249feSanjenner; RV64IA-NEXT: # Child Loop BB5_3 Depth 2 10034af249feSanjenner; RV64IA-NEXT: srlw a6, a4, a0 10044af249feSanjenner; RV64IA-NEXT: sext.w a7, a4 10054af249feSanjenner; RV64IA-NEXT: and a6, a6, a3 10064af249feSanjenner; RV64IA-NEXT: sub t0, a6, a1 10074af249feSanjenner; RV64IA-NEXT: sltu a6, a6, t0 10084af249feSanjenner; RV64IA-NEXT: addi a6, a6, -1 10094af249feSanjenner; RV64IA-NEXT: and a6, a6, t0 10104af249feSanjenner; RV64IA-NEXT: sllw a6, a6, a0 10114af249feSanjenner; RV64IA-NEXT: and a4, a4, a5 10124af249feSanjenner; RV64IA-NEXT: or a6, a4, a6 10134af249feSanjenner; RV64IA-NEXT: .LBB5_3: # %atomicrmw.start 10144af249feSanjenner; RV64IA-NEXT: # Parent Loop BB5_1 Depth=1 10154af249feSanjenner; RV64IA-NEXT: # => This Inner Loop Header: Depth=2 10164af249feSanjenner; RV64IA-NEXT: lr.w.aqrl a4, (a2) 10174af249feSanjenner; RV64IA-NEXT: bne a4, a7, .LBB5_1 10184af249feSanjenner; RV64IA-NEXT: # %bb.4: # %atomicrmw.start 10194af249feSanjenner; RV64IA-NEXT: # in Loop: Header=BB5_3 Depth=2 10204af249feSanjenner; RV64IA-NEXT: sc.w.rl t0, a6, (a2) 10214af249feSanjenner; RV64IA-NEXT: bnez t0, .LBB5_3 10224af249feSanjenner; RV64IA-NEXT: # %bb.5: # %atomicrmw.start 10234af249feSanjenner; RV64IA-NEXT: # %bb.2: # %atomicrmw.end 10244af249feSanjenner; RV64IA-NEXT: srlw a0, a4, a0 10254af249feSanjenner; RV64IA-NEXT: ret 10264af249feSanjenner %result = atomicrmw usub_sat ptr %ptr, i16 %val seq_cst 10274af249feSanjenner ret i16 %result 10284af249feSanjenner} 10294af249feSanjenner 10304af249feSanjennerdefine i32 @atomicrmw_usub_sat_i32(ptr %ptr, i32 %val) { 10314af249feSanjenner; RV32I-LABEL: atomicrmw_usub_sat_i32: 10324af249feSanjenner; RV32I: # %bb.0: 10334af249feSanjenner; RV32I-NEXT: addi sp, sp, -16 10344af249feSanjenner; RV32I-NEXT: .cfi_def_cfa_offset 16 10354af249feSanjenner; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10364af249feSanjenner; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 10374af249feSanjenner; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 10384af249feSanjenner; RV32I-NEXT: .cfi_offset ra, -4 10394af249feSanjenner; RV32I-NEXT: .cfi_offset s0, -8 10404af249feSanjenner; RV32I-NEXT: .cfi_offset s1, -12 10414af249feSanjenner; RV32I-NEXT: mv s0, a0 10424af249feSanjenner; RV32I-NEXT: lw a3, 0(a0) 10434af249feSanjenner; RV32I-NEXT: mv s1, a1 10444af249feSanjenner; RV32I-NEXT: .LBB6_1: # %atomicrmw.start 10454af249feSanjenner; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 10464af249feSanjenner; RV32I-NEXT: sub a0, a3, s1 10474af249feSanjenner; RV32I-NEXT: sltu a1, a3, a0 10484af249feSanjenner; RV32I-NEXT: addi a1, a1, -1 10494af249feSanjenner; RV32I-NEXT: and a2, a1, a0 10504af249feSanjenner; RV32I-NEXT: sw a3, 0(sp) 10514af249feSanjenner; RV32I-NEXT: mv a1, sp 10524af249feSanjenner; RV32I-NEXT: li a3, 5 10534af249feSanjenner; RV32I-NEXT: li a4, 5 10544af249feSanjenner; RV32I-NEXT: mv a0, s0 10554af249feSanjenner; RV32I-NEXT: call __atomic_compare_exchange_4 10564af249feSanjenner; RV32I-NEXT: lw a3, 0(sp) 10574af249feSanjenner; RV32I-NEXT: beqz a0, .LBB6_1 10584af249feSanjenner; RV32I-NEXT: # %bb.2: # %atomicrmw.end 10594af249feSanjenner; RV32I-NEXT: mv a0, a3 10604af249feSanjenner; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 10614af249feSanjenner; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 10624af249feSanjenner; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 106397982a8cSdlav-sc; RV32I-NEXT: .cfi_restore ra 106497982a8cSdlav-sc; RV32I-NEXT: .cfi_restore s0 106597982a8cSdlav-sc; RV32I-NEXT: .cfi_restore s1 10664af249feSanjenner; RV32I-NEXT: addi sp, sp, 16 106797982a8cSdlav-sc; RV32I-NEXT: .cfi_def_cfa_offset 0 10684af249feSanjenner; RV32I-NEXT: ret 10694af249feSanjenner; 10704af249feSanjenner; RV32IA-LABEL: atomicrmw_usub_sat_i32: 10714af249feSanjenner; RV32IA: # %bb.0: 10724af249feSanjenner; RV32IA-NEXT: lw a2, 0(a0) 10734af249feSanjenner; RV32IA-NEXT: .LBB6_1: # %atomicrmw.start 10744af249feSanjenner; RV32IA-NEXT: # =>This Loop Header: Depth=1 10754af249feSanjenner; RV32IA-NEXT: # Child Loop BB6_3 Depth 2 10764af249feSanjenner; RV32IA-NEXT: mv a3, a2 10774af249feSanjenner; RV32IA-NEXT: sub a2, a2, a1 10784af249feSanjenner; RV32IA-NEXT: sltu a4, a3, a2 10794af249feSanjenner; RV32IA-NEXT: addi a4, a4, -1 10804af249feSanjenner; RV32IA-NEXT: and a4, a4, a2 10814af249feSanjenner; RV32IA-NEXT: .LBB6_3: # %atomicrmw.start 10824af249feSanjenner; RV32IA-NEXT: # Parent Loop BB6_1 Depth=1 10834af249feSanjenner; RV32IA-NEXT: # => This Inner Loop Header: Depth=2 10844af249feSanjenner; RV32IA-NEXT: lr.w.aqrl a2, (a0) 10854af249feSanjenner; RV32IA-NEXT: bne a2, a3, .LBB6_1 10864af249feSanjenner; RV32IA-NEXT: # %bb.4: # %atomicrmw.start 10874af249feSanjenner; RV32IA-NEXT: # in Loop: Header=BB6_3 Depth=2 10884af249feSanjenner; RV32IA-NEXT: sc.w.rl a5, a4, (a0) 10894af249feSanjenner; RV32IA-NEXT: bnez a5, .LBB6_3 10904af249feSanjenner; RV32IA-NEXT: # %bb.5: # %atomicrmw.start 10914af249feSanjenner; RV32IA-NEXT: # %bb.2: # %atomicrmw.end 10924af249feSanjenner; RV32IA-NEXT: mv a0, a2 10934af249feSanjenner; RV32IA-NEXT: ret 10944af249feSanjenner; 10954af249feSanjenner; RV64I-LABEL: atomicrmw_usub_sat_i32: 10964af249feSanjenner; RV64I: # %bb.0: 10974af249feSanjenner; RV64I-NEXT: addi sp, sp, -32 10984af249feSanjenner; RV64I-NEXT: .cfi_def_cfa_offset 32 10994af249feSanjenner; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 11004af249feSanjenner; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 11014af249feSanjenner; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 11024af249feSanjenner; RV64I-NEXT: .cfi_offset ra, -8 11034af249feSanjenner; RV64I-NEXT: .cfi_offset s0, -16 11044af249feSanjenner; RV64I-NEXT: .cfi_offset s1, -24 11054af249feSanjenner; RV64I-NEXT: mv s0, a0 11064af249feSanjenner; RV64I-NEXT: lw a3, 0(a0) 11074af249feSanjenner; RV64I-NEXT: mv s1, a1 11084af249feSanjenner; RV64I-NEXT: .LBB6_1: # %atomicrmw.start 11094af249feSanjenner; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 11104af249feSanjenner; RV64I-NEXT: subw a0, a3, s1 11114af249feSanjenner; RV64I-NEXT: sltu a1, a3, a0 11124af249feSanjenner; RV64I-NEXT: addi a1, a1, -1 11134af249feSanjenner; RV64I-NEXT: and a2, a1, a0 11144af249feSanjenner; RV64I-NEXT: sw a3, 4(sp) 11154af249feSanjenner; RV64I-NEXT: addi a1, sp, 4 11164af249feSanjenner; RV64I-NEXT: li a3, 5 11174af249feSanjenner; RV64I-NEXT: li a4, 5 11184af249feSanjenner; RV64I-NEXT: mv a0, s0 11194af249feSanjenner; RV64I-NEXT: call __atomic_compare_exchange_4 11204af249feSanjenner; RV64I-NEXT: lw a3, 4(sp) 11214af249feSanjenner; RV64I-NEXT: beqz a0, .LBB6_1 11224af249feSanjenner; RV64I-NEXT: # %bb.2: # %atomicrmw.end 11234af249feSanjenner; RV64I-NEXT: mv a0, a3 11244af249feSanjenner; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 11254af249feSanjenner; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 11264af249feSanjenner; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 112797982a8cSdlav-sc; RV64I-NEXT: .cfi_restore ra 112897982a8cSdlav-sc; RV64I-NEXT: .cfi_restore s0 112997982a8cSdlav-sc; RV64I-NEXT: .cfi_restore s1 11304af249feSanjenner; RV64I-NEXT: addi sp, sp, 32 113197982a8cSdlav-sc; RV64I-NEXT: .cfi_def_cfa_offset 0 11324af249feSanjenner; RV64I-NEXT: ret 11334af249feSanjenner; 11344af249feSanjenner; RV64IA-LABEL: atomicrmw_usub_sat_i32: 11354af249feSanjenner; RV64IA: # %bb.0: 11364af249feSanjenner; RV64IA-NEXT: lw a2, 0(a0) 11374af249feSanjenner; RV64IA-NEXT: .LBB6_1: # %atomicrmw.start 11384af249feSanjenner; RV64IA-NEXT: # =>This Loop Header: Depth=1 11394af249feSanjenner; RV64IA-NEXT: # Child Loop BB6_3 Depth 2 11404af249feSanjenner; RV64IA-NEXT: subw a3, a2, a1 11414af249feSanjenner; RV64IA-NEXT: sext.w a4, a2 11424af249feSanjenner; RV64IA-NEXT: sltu a2, a4, a3 11434af249feSanjenner; RV64IA-NEXT: addi a2, a2, -1 11444af249feSanjenner; RV64IA-NEXT: and a3, a2, a3 11454af249feSanjenner; RV64IA-NEXT: .LBB6_3: # %atomicrmw.start 11464af249feSanjenner; RV64IA-NEXT: # Parent Loop BB6_1 Depth=1 11474af249feSanjenner; RV64IA-NEXT: # => This Inner Loop Header: Depth=2 11484af249feSanjenner; RV64IA-NEXT: lr.w.aqrl a2, (a0) 11494af249feSanjenner; RV64IA-NEXT: bne a2, a4, .LBB6_1 11504af249feSanjenner; RV64IA-NEXT: # %bb.4: # %atomicrmw.start 11514af249feSanjenner; RV64IA-NEXT: # in Loop: Header=BB6_3 Depth=2 11524af249feSanjenner; RV64IA-NEXT: sc.w.rl a5, a3, (a0) 11534af249feSanjenner; RV64IA-NEXT: bnez a5, .LBB6_3 11544af249feSanjenner; RV64IA-NEXT: # %bb.5: # %atomicrmw.start 11554af249feSanjenner; RV64IA-NEXT: # %bb.2: # %atomicrmw.end 11564af249feSanjenner; RV64IA-NEXT: mv a0, a2 11574af249feSanjenner; RV64IA-NEXT: ret 11584af249feSanjenner %result = atomicrmw usub_sat ptr %ptr, i32 %val seq_cst 11594af249feSanjenner ret i32 %result 11604af249feSanjenner} 11614af249feSanjenner 11624af249feSanjennerdefine i64 @atomicrmw_usub_sat_i64(ptr %ptr, i64 %val) { 11634af249feSanjenner; RV32I-LABEL: atomicrmw_usub_sat_i64: 11644af249feSanjenner; RV32I: # %bb.0: 11654af249feSanjenner; RV32I-NEXT: addi sp, sp, -32 11664af249feSanjenner; RV32I-NEXT: .cfi_def_cfa_offset 32 11674af249feSanjenner; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 11684af249feSanjenner; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 11694af249feSanjenner; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 11704af249feSanjenner; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 11714af249feSanjenner; RV32I-NEXT: .cfi_offset ra, -4 11724af249feSanjenner; RV32I-NEXT: .cfi_offset s0, -8 11734af249feSanjenner; RV32I-NEXT: .cfi_offset s1, -12 11744af249feSanjenner; RV32I-NEXT: .cfi_offset s2, -16 1175*9122c523SPengcheng Wang; RV32I-NEXT: mv s0, a2 1176*9122c523SPengcheng Wang; RV32I-NEXT: mv s1, a0 1177*9122c523SPengcheng Wang; RV32I-NEXT: lw a4, 0(a0) 1178*9122c523SPengcheng Wang; RV32I-NEXT: lw a5, 4(a0) 11794af249feSanjenner; RV32I-NEXT: mv s2, a1 11804af249feSanjenner; RV32I-NEXT: j .LBB7_3 11814af249feSanjenner; RV32I-NEXT: .LBB7_1: # %atomicrmw.start 11824af249feSanjenner; RV32I-NEXT: # in Loop: Header=BB7_3 Depth=1 1183*9122c523SPengcheng Wang; RV32I-NEXT: sltu a2, a5, a0 11844af249feSanjenner; RV32I-NEXT: .LBB7_2: # %atomicrmw.start 11854af249feSanjenner; RV32I-NEXT: # in Loop: Header=BB7_3 Depth=1 11864af249feSanjenner; RV32I-NEXT: addi a3, a2, -1 11874af249feSanjenner; RV32I-NEXT: and a2, a3, a1 11884af249feSanjenner; RV32I-NEXT: and a3, a3, a0 1189*9122c523SPengcheng Wang; RV32I-NEXT: sw a4, 8(sp) 1190*9122c523SPengcheng Wang; RV32I-NEXT: sw a5, 12(sp) 11914af249feSanjenner; RV32I-NEXT: addi a1, sp, 8 11924af249feSanjenner; RV32I-NEXT: li a4, 5 11934af249feSanjenner; RV32I-NEXT: li a5, 5 1194*9122c523SPengcheng Wang; RV32I-NEXT: mv a0, s1 11954af249feSanjenner; RV32I-NEXT: call __atomic_compare_exchange_8 1196*9122c523SPengcheng Wang; RV32I-NEXT: lw a4, 8(sp) 1197*9122c523SPengcheng Wang; RV32I-NEXT: lw a5, 12(sp) 11984af249feSanjenner; RV32I-NEXT: bnez a0, .LBB7_5 11994af249feSanjenner; RV32I-NEXT: .LBB7_3: # %atomicrmw.start 12004af249feSanjenner; RV32I-NEXT: # =>This Inner Loop Header: Depth=1 1201*9122c523SPengcheng Wang; RV32I-NEXT: sltu a0, a4, s2 1202*9122c523SPengcheng Wang; RV32I-NEXT: sub a1, a5, s0 12034af249feSanjenner; RV32I-NEXT: sub a0, a1, a0 1204*9122c523SPengcheng Wang; RV32I-NEXT: sub a1, a4, s2 1205*9122c523SPengcheng Wang; RV32I-NEXT: bne a0, a5, .LBB7_1 12064af249feSanjenner; RV32I-NEXT: # %bb.4: # in Loop: Header=BB7_3 Depth=1 1207*9122c523SPengcheng Wang; RV32I-NEXT: sltu a2, a4, a1 12084af249feSanjenner; RV32I-NEXT: j .LBB7_2 12094af249feSanjenner; RV32I-NEXT: .LBB7_5: # %atomicrmw.end 1210*9122c523SPengcheng Wang; RV32I-NEXT: mv a0, a4 1211*9122c523SPengcheng Wang; RV32I-NEXT: mv a1, a5 12124af249feSanjenner; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 12134af249feSanjenner; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 12144af249feSanjenner; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 12154af249feSanjenner; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 121697982a8cSdlav-sc; RV32I-NEXT: .cfi_restore ra 121797982a8cSdlav-sc; RV32I-NEXT: .cfi_restore s0 121897982a8cSdlav-sc; RV32I-NEXT: .cfi_restore s1 121997982a8cSdlav-sc; RV32I-NEXT: .cfi_restore s2 12204af249feSanjenner; RV32I-NEXT: addi sp, sp, 32 122197982a8cSdlav-sc; RV32I-NEXT: .cfi_def_cfa_offset 0 12224af249feSanjenner; RV32I-NEXT: ret 12234af249feSanjenner; 12244af249feSanjenner; RV32IA-LABEL: atomicrmw_usub_sat_i64: 12254af249feSanjenner; RV32IA: # %bb.0: 12264af249feSanjenner; RV32IA-NEXT: addi sp, sp, -32 12274af249feSanjenner; RV32IA-NEXT: .cfi_def_cfa_offset 32 12284af249feSanjenner; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 12294af249feSanjenner; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 12304af249feSanjenner; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 12314af249feSanjenner; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 12324af249feSanjenner; RV32IA-NEXT: .cfi_offset ra, -4 12334af249feSanjenner; RV32IA-NEXT: .cfi_offset s0, -8 12344af249feSanjenner; RV32IA-NEXT: .cfi_offset s1, -12 12354af249feSanjenner; RV32IA-NEXT: .cfi_offset s2, -16 1236*9122c523SPengcheng Wang; RV32IA-NEXT: mv s0, a2 1237*9122c523SPengcheng Wang; RV32IA-NEXT: mv s1, a0 1238*9122c523SPengcheng Wang; RV32IA-NEXT: lw a4, 0(a0) 1239*9122c523SPengcheng Wang; RV32IA-NEXT: lw a5, 4(a0) 12404af249feSanjenner; RV32IA-NEXT: mv s2, a1 12414af249feSanjenner; RV32IA-NEXT: j .LBB7_3 12424af249feSanjenner; RV32IA-NEXT: .LBB7_1: # %atomicrmw.start 12434af249feSanjenner; RV32IA-NEXT: # in Loop: Header=BB7_3 Depth=1 1244*9122c523SPengcheng Wang; RV32IA-NEXT: sltu a2, a5, a0 12454af249feSanjenner; RV32IA-NEXT: .LBB7_2: # %atomicrmw.start 12464af249feSanjenner; RV32IA-NEXT: # in Loop: Header=BB7_3 Depth=1 12474af249feSanjenner; RV32IA-NEXT: addi a3, a2, -1 12484af249feSanjenner; RV32IA-NEXT: and a2, a3, a1 12494af249feSanjenner; RV32IA-NEXT: and a3, a3, a0 1250*9122c523SPengcheng Wang; RV32IA-NEXT: sw a4, 8(sp) 1251*9122c523SPengcheng Wang; RV32IA-NEXT: sw a5, 12(sp) 12524af249feSanjenner; RV32IA-NEXT: addi a1, sp, 8 12534af249feSanjenner; RV32IA-NEXT: li a4, 5 12544af249feSanjenner; RV32IA-NEXT: li a5, 5 1255*9122c523SPengcheng Wang; RV32IA-NEXT: mv a0, s1 12564af249feSanjenner; RV32IA-NEXT: call __atomic_compare_exchange_8 1257*9122c523SPengcheng Wang; RV32IA-NEXT: lw a4, 8(sp) 1258*9122c523SPengcheng Wang; RV32IA-NEXT: lw a5, 12(sp) 12594af249feSanjenner; RV32IA-NEXT: bnez a0, .LBB7_5 12604af249feSanjenner; RV32IA-NEXT: .LBB7_3: # %atomicrmw.start 12614af249feSanjenner; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1 1262*9122c523SPengcheng Wang; RV32IA-NEXT: sltu a0, a4, s2 1263*9122c523SPengcheng Wang; RV32IA-NEXT: sub a1, a5, s0 12644af249feSanjenner; RV32IA-NEXT: sub a0, a1, a0 1265*9122c523SPengcheng Wang; RV32IA-NEXT: sub a1, a4, s2 1266*9122c523SPengcheng Wang; RV32IA-NEXT: bne a0, a5, .LBB7_1 12674af249feSanjenner; RV32IA-NEXT: # %bb.4: # in Loop: Header=BB7_3 Depth=1 1268*9122c523SPengcheng Wang; RV32IA-NEXT: sltu a2, a4, a1 12694af249feSanjenner; RV32IA-NEXT: j .LBB7_2 12704af249feSanjenner; RV32IA-NEXT: .LBB7_5: # %atomicrmw.end 1271*9122c523SPengcheng Wang; RV32IA-NEXT: mv a0, a4 1272*9122c523SPengcheng Wang; RV32IA-NEXT: mv a1, a5 12734af249feSanjenner; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 12744af249feSanjenner; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 12754af249feSanjenner; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 12764af249feSanjenner; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 127797982a8cSdlav-sc; RV32IA-NEXT: .cfi_restore ra 127897982a8cSdlav-sc; RV32IA-NEXT: .cfi_restore s0 127997982a8cSdlav-sc; RV32IA-NEXT: .cfi_restore s1 128097982a8cSdlav-sc; RV32IA-NEXT: .cfi_restore s2 12814af249feSanjenner; RV32IA-NEXT: addi sp, sp, 32 128297982a8cSdlav-sc; RV32IA-NEXT: .cfi_def_cfa_offset 0 12834af249feSanjenner; RV32IA-NEXT: ret 12844af249feSanjenner; 12854af249feSanjenner; RV64I-LABEL: atomicrmw_usub_sat_i64: 12864af249feSanjenner; RV64I: # %bb.0: 12874af249feSanjenner; RV64I-NEXT: addi sp, sp, -32 12884af249feSanjenner; RV64I-NEXT: .cfi_def_cfa_offset 32 12894af249feSanjenner; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 12904af249feSanjenner; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 12914af249feSanjenner; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 12924af249feSanjenner; RV64I-NEXT: .cfi_offset ra, -8 12934af249feSanjenner; RV64I-NEXT: .cfi_offset s0, -16 12944af249feSanjenner; RV64I-NEXT: .cfi_offset s1, -24 12954af249feSanjenner; RV64I-NEXT: mv s0, a0 12964af249feSanjenner; RV64I-NEXT: ld a3, 0(a0) 12974af249feSanjenner; RV64I-NEXT: mv s1, a1 12984af249feSanjenner; RV64I-NEXT: .LBB7_1: # %atomicrmw.start 12994af249feSanjenner; RV64I-NEXT: # =>This Inner Loop Header: Depth=1 13004af249feSanjenner; RV64I-NEXT: sub a0, a3, s1 13014af249feSanjenner; RV64I-NEXT: sltu a1, a3, a0 13024af249feSanjenner; RV64I-NEXT: addi a1, a1, -1 13034af249feSanjenner; RV64I-NEXT: and a2, a1, a0 13044af249feSanjenner; RV64I-NEXT: sd a3, 0(sp) 13054af249feSanjenner; RV64I-NEXT: mv a1, sp 13064af249feSanjenner; RV64I-NEXT: li a3, 5 13074af249feSanjenner; RV64I-NEXT: li a4, 5 13084af249feSanjenner; RV64I-NEXT: mv a0, s0 13094af249feSanjenner; RV64I-NEXT: call __atomic_compare_exchange_8 13104af249feSanjenner; RV64I-NEXT: ld a3, 0(sp) 13114af249feSanjenner; RV64I-NEXT: beqz a0, .LBB7_1 13124af249feSanjenner; RV64I-NEXT: # %bb.2: # %atomicrmw.end 13134af249feSanjenner; RV64I-NEXT: mv a0, a3 13144af249feSanjenner; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 13154af249feSanjenner; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 13164af249feSanjenner; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 131797982a8cSdlav-sc; RV64I-NEXT: .cfi_restore ra 131897982a8cSdlav-sc; RV64I-NEXT: .cfi_restore s0 131997982a8cSdlav-sc; RV64I-NEXT: .cfi_restore s1 13204af249feSanjenner; RV64I-NEXT: addi sp, sp, 32 132197982a8cSdlav-sc; RV64I-NEXT: .cfi_def_cfa_offset 0 13224af249feSanjenner; RV64I-NEXT: ret 13234af249feSanjenner; 13244af249feSanjenner; RV64IA-LABEL: atomicrmw_usub_sat_i64: 13254af249feSanjenner; RV64IA: # %bb.0: 13264af249feSanjenner; RV64IA-NEXT: ld a2, 0(a0) 13274af249feSanjenner; RV64IA-NEXT: .LBB7_1: # %atomicrmw.start 13284af249feSanjenner; RV64IA-NEXT: # =>This Loop Header: Depth=1 13294af249feSanjenner; RV64IA-NEXT: # Child Loop BB7_3 Depth 2 13304af249feSanjenner; RV64IA-NEXT: mv a3, a2 13314af249feSanjenner; RV64IA-NEXT: sub a2, a2, a1 13324af249feSanjenner; RV64IA-NEXT: sltu a4, a3, a2 13334af249feSanjenner; RV64IA-NEXT: addi a4, a4, -1 13344af249feSanjenner; RV64IA-NEXT: and a4, a4, a2 13354af249feSanjenner; RV64IA-NEXT: .LBB7_3: # %atomicrmw.start 13364af249feSanjenner; RV64IA-NEXT: # Parent Loop BB7_1 Depth=1 13374af249feSanjenner; RV64IA-NEXT: # => This Inner Loop Header: Depth=2 13384af249feSanjenner; RV64IA-NEXT: lr.d.aqrl a2, (a0) 13394af249feSanjenner; RV64IA-NEXT: bne a2, a3, .LBB7_1 13404af249feSanjenner; RV64IA-NEXT: # %bb.4: # %atomicrmw.start 13414af249feSanjenner; RV64IA-NEXT: # in Loop: Header=BB7_3 Depth=2 13424af249feSanjenner; RV64IA-NEXT: sc.d.rl a5, a4, (a0) 13434af249feSanjenner; RV64IA-NEXT: bnez a5, .LBB7_3 13444af249feSanjenner; RV64IA-NEXT: # %bb.5: # %atomicrmw.start 13454af249feSanjenner; RV64IA-NEXT: # %bb.2: # %atomicrmw.end 13464af249feSanjenner; RV64IA-NEXT: mv a0, a2 13474af249feSanjenner; RV64IA-NEXT: ret 13484af249feSanjenner %result = atomicrmw usub_sat ptr %ptr, i64 %val seq_cst 13494af249feSanjenner ret i64 %result 13504af249feSanjenner} 1351