xref: /llvm-project/llvm/test/CodeGen/RISCV/atomicrmw-cond-sub-clamp.ll (revision 9122c5235ec85ce0c0ad337e862b006e7b349d84)
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