brintos

brintos / llvm-project-archived public Read only

0
0
Text · 53.0 KiB · 4e04f38 Raw
1492 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \3; RUN:   | FileCheck -check-prefix=RV32I %s4; RUN: llc -mtriple=riscv32 -mattr=+a -verify-machineinstrs < %s \5; RUN:   | FileCheck -check-prefix=RV32IA %s6; RUN: llc -mtriple=riscv32 -mattr=+a,+ztso -verify-machineinstrs < %s \7; RUN:   | FileCheck -check-prefix=RV32IA %s8; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \9; RUN:   | FileCheck -check-prefix=RV64I %s10; RUN: llc -mtriple=riscv64 -mattr=+a -verify-machineinstrs < %s \11; RUN:   | FileCheck -check-prefix=RV64IA %s12; RUN: llc -mtriple=riscv64 -mattr=+a,+ztso -verify-machineinstrs < %s \13; RUN:   | FileCheck -check-prefix=RV64IA %s14 15 16define i8 @atomicrmw_uinc_wrap_i8(ptr %ptr, i8 %val) {17; RV32I-LABEL: atomicrmw_uinc_wrap_i8:18; RV32I:       # %bb.0:19; RV32I-NEXT:    addi sp, sp, -1620; RV32I-NEXT:    .cfi_def_cfa_offset 1621; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill22; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill23; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill24; RV32I-NEXT:    .cfi_offset ra, -425; RV32I-NEXT:    .cfi_offset s0, -826; RV32I-NEXT:    .cfi_offset s1, -1227; RV32I-NEXT:    mv s0, a028; RV32I-NEXT:    lbu a3, 0(a0)29; RV32I-NEXT:    zext.b s1, a130; RV32I-NEXT:  .LBB0_1: # %atomicrmw.start31; RV32I-NEXT:    # =>This Inner Loop Header: Depth=132; RV32I-NEXT:    addi a0, a3, 133; RV32I-NEXT:    zext.b a1, a334; RV32I-NEXT:    sltu a1, a1, s135; RV32I-NEXT:    neg a2, a136; RV32I-NEXT:    and a2, a2, a037; RV32I-NEXT:    sb a3, 3(sp)38; RV32I-NEXT:    addi a1, sp, 339; RV32I-NEXT:    li a3, 540; RV32I-NEXT:    li a4, 541; RV32I-NEXT:    mv a0, s042; RV32I-NEXT:    call __atomic_compare_exchange_143; RV32I-NEXT:    lbu a3, 3(sp)44; RV32I-NEXT:    beqz a0, .LBB0_145; RV32I-NEXT:  # %bb.2: # %atomicrmw.end46; RV32I-NEXT:    mv a0, a347; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload48; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload49; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload50; RV32I-NEXT:    .cfi_restore ra51; RV32I-NEXT:    .cfi_restore s052; RV32I-NEXT:    .cfi_restore s153; RV32I-NEXT:    addi sp, sp, 1654; RV32I-NEXT:    .cfi_def_cfa_offset 055; RV32I-NEXT:    ret56;57; RV32IA-LABEL: atomicrmw_uinc_wrap_i8:58; RV32IA:       # %bb.0:59; RV32IA-NEXT:    andi a2, a0, -460; RV32IA-NEXT:    slli a0, a0, 361; RV32IA-NEXT:    li a3, 25562; RV32IA-NEXT:    sll a3, a3, a063; RV32IA-NEXT:    lw a4, 0(a2)64; RV32IA-NEXT:    andi a0, a0, 2465; RV32IA-NEXT:    not a3, a366; RV32IA-NEXT:    zext.b a1, a167; RV32IA-NEXT:  .LBB0_1: # %atomicrmw.start68; RV32IA-NEXT:    # =>This Loop Header: Depth=169; RV32IA-NEXT:    # Child Loop BB0_3 Depth 270; RV32IA-NEXT:    mv a5, a471; RV32IA-NEXT:    srl a4, a4, a072; RV32IA-NEXT:    zext.b a6, a473; RV32IA-NEXT:    addi a4, a4, 174; RV32IA-NEXT:    sltu a6, a6, a175; RV32IA-NEXT:    neg a6, a676; RV32IA-NEXT:    and a4, a6, a477; RV32IA-NEXT:    zext.b a4, a478; RV32IA-NEXT:    sll a4, a4, a079; RV32IA-NEXT:    and a6, a5, a380; RV32IA-NEXT:    or a6, a6, a481; RV32IA-NEXT:  .LBB0_3: # %atomicrmw.start82; RV32IA-NEXT:    # Parent Loop BB0_1 Depth=183; RV32IA-NEXT:    # => This Inner Loop Header: Depth=284; RV32IA-NEXT:    lr.w.aqrl a4, (a2)85; RV32IA-NEXT:    bne a4, a5, .LBB0_186; RV32IA-NEXT:  # %bb.4: # %atomicrmw.start87; RV32IA-NEXT:    # in Loop: Header=BB0_3 Depth=288; RV32IA-NEXT:    sc.w.rl a7, a6, (a2)89; RV32IA-NEXT:    bnez a7, .LBB0_390; RV32IA-NEXT:  # %bb.5: # %atomicrmw.start91; RV32IA-NEXT:  # %bb.2: # %atomicrmw.end92; RV32IA-NEXT:    srl a0, a4, a093; RV32IA-NEXT:    ret94;95; RV64I-LABEL: atomicrmw_uinc_wrap_i8:96; RV64I:       # %bb.0:97; RV64I-NEXT:    addi sp, sp, -3298; RV64I-NEXT:    .cfi_def_cfa_offset 3299; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill100; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill101; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill102; RV64I-NEXT:    .cfi_offset ra, -8103; RV64I-NEXT:    .cfi_offset s0, -16104; RV64I-NEXT:    .cfi_offset s1, -24105; RV64I-NEXT:    mv s0, a0106; RV64I-NEXT:    lbu a3, 0(a0)107; RV64I-NEXT:    zext.b s1, a1108; RV64I-NEXT:  .LBB0_1: # %atomicrmw.start109; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1110; RV64I-NEXT:    addi a0, a3, 1111; RV64I-NEXT:    zext.b a1, a3112; RV64I-NEXT:    sltu a1, a1, s1113; RV64I-NEXT:    neg a2, a1114; RV64I-NEXT:    and a2, a2, a0115; RV64I-NEXT:    sb a3, 7(sp)116; RV64I-NEXT:    addi a1, sp, 7117; RV64I-NEXT:    li a3, 5118; RV64I-NEXT:    li a4, 5119; RV64I-NEXT:    mv a0, s0120; RV64I-NEXT:    call __atomic_compare_exchange_1121; RV64I-NEXT:    lbu a3, 7(sp)122; RV64I-NEXT:    beqz a0, .LBB0_1123; RV64I-NEXT:  # %bb.2: # %atomicrmw.end124; RV64I-NEXT:    mv a0, a3125; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload126; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload127; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload128; RV64I-NEXT:    .cfi_restore ra129; RV64I-NEXT:    .cfi_restore s0130; RV64I-NEXT:    .cfi_restore s1131; RV64I-NEXT:    addi sp, sp, 32132; RV64I-NEXT:    .cfi_def_cfa_offset 0133; RV64I-NEXT:    ret134;135; RV64IA-LABEL: atomicrmw_uinc_wrap_i8:136; RV64IA:       # %bb.0:137; RV64IA-NEXT:    andi a2, a0, -4138; RV64IA-NEXT:    slli a0, a0, 3139; RV64IA-NEXT:    li a3, 255140; RV64IA-NEXT:    sllw a4, a3, a0141; RV64IA-NEXT:    lw a3, 0(a2)142; RV64IA-NEXT:    andi a0, a0, 24143; RV64IA-NEXT:    not a4, a4144; RV64IA-NEXT:    zext.b a1, a1145; RV64IA-NEXT:  .LBB0_1: # %atomicrmw.start146; RV64IA-NEXT:    # =>This Loop Header: Depth=1147; RV64IA-NEXT:    # Child Loop BB0_3 Depth 2148; RV64IA-NEXT:    srlw a5, a3, a0149; RV64IA-NEXT:    sext.w a6, a3150; RV64IA-NEXT:    zext.b a7, a5151; RV64IA-NEXT:    addi a5, a5, 1152; RV64IA-NEXT:    sltu a7, a7, a1153; RV64IA-NEXT:    neg a7, a7154; RV64IA-NEXT:    and a5, a7, a5155; RV64IA-NEXT:    zext.b a5, a5156; RV64IA-NEXT:    sllw a5, a5, a0157; RV64IA-NEXT:    and a3, a3, a4158; RV64IA-NEXT:    or a5, a3, a5159; RV64IA-NEXT:  .LBB0_3: # %atomicrmw.start160; RV64IA-NEXT:    # Parent Loop BB0_1 Depth=1161; RV64IA-NEXT:    # => This Inner Loop Header: Depth=2162; RV64IA-NEXT:    lr.w.aqrl a3, (a2)163; RV64IA-NEXT:    bne a3, a6, .LBB0_1164; RV64IA-NEXT:  # %bb.4: # %atomicrmw.start165; RV64IA-NEXT:    # in Loop: Header=BB0_3 Depth=2166; RV64IA-NEXT:    sc.w.rl a7, a5, (a2)167; RV64IA-NEXT:    bnez a7, .LBB0_3168; RV64IA-NEXT:  # %bb.5: # %atomicrmw.start169; RV64IA-NEXT:  # %bb.2: # %atomicrmw.end170; RV64IA-NEXT:    srlw a0, a3, a0171; RV64IA-NEXT:    ret172  %result = atomicrmw uinc_wrap ptr %ptr, i8 %val seq_cst173  ret i8 %result174}175 176define i16 @atomicrmw_uinc_wrap_i16(ptr %ptr, i16 %val) {177; RV32I-LABEL: atomicrmw_uinc_wrap_i16:178; RV32I:       # %bb.0:179; RV32I-NEXT:    addi sp, sp, -32180; RV32I-NEXT:    .cfi_def_cfa_offset 32181; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill182; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill183; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill184; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill185; RV32I-NEXT:    .cfi_offset ra, -4186; RV32I-NEXT:    .cfi_offset s0, -8187; RV32I-NEXT:    .cfi_offset s1, -12188; RV32I-NEXT:    .cfi_offset s2, -16189; RV32I-NEXT:    mv s0, a0190; RV32I-NEXT:    lhu a3, 0(a0)191; RV32I-NEXT:    lui s1, 16192; RV32I-NEXT:    addi s1, s1, -1193; RV32I-NEXT:    and s2, a1, s1194; RV32I-NEXT:  .LBB1_1: # %atomicrmw.start195; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1196; RV32I-NEXT:    and a0, a3, s1197; RV32I-NEXT:    addi a1, a3, 1198; RV32I-NEXT:    sltu a0, a0, s2199; RV32I-NEXT:    neg a2, a0200; RV32I-NEXT:    and a2, a2, a1201; RV32I-NEXT:    sh a3, 14(sp)202; RV32I-NEXT:    addi a1, sp, 14203; RV32I-NEXT:    li a3, 5204; RV32I-NEXT:    li a4, 5205; RV32I-NEXT:    mv a0, s0206; RV32I-NEXT:    call __atomic_compare_exchange_2207; RV32I-NEXT:    lh a3, 14(sp)208; RV32I-NEXT:    beqz a0, .LBB1_1209; RV32I-NEXT:  # %bb.2: # %atomicrmw.end210; RV32I-NEXT:    mv a0, a3211; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload212; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload213; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload214; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload215; RV32I-NEXT:    .cfi_restore ra216; RV32I-NEXT:    .cfi_restore s0217; RV32I-NEXT:    .cfi_restore s1218; RV32I-NEXT:    .cfi_restore s2219; RV32I-NEXT:    addi sp, sp, 32220; RV32I-NEXT:    .cfi_def_cfa_offset 0221; RV32I-NEXT:    ret222;223; RV32IA-LABEL: atomicrmw_uinc_wrap_i16:224; RV32IA:       # %bb.0:225; RV32IA-NEXT:    andi a2, a0, -4226; RV32IA-NEXT:    slli a4, a0, 3227; RV32IA-NEXT:    lui a3, 16228; RV32IA-NEXT:    andi a0, a4, 24229; RV32IA-NEXT:    addi a3, a3, -1230; RV32IA-NEXT:    lw a5, 0(a2)231; RV32IA-NEXT:    sll a4, a3, a4232; RV32IA-NEXT:    not a4, a4233; RV32IA-NEXT:    and a1, a1, a3234; RV32IA-NEXT:  .LBB1_1: # %atomicrmw.start235; RV32IA-NEXT:    # =>This Loop Header: Depth=1236; RV32IA-NEXT:    # Child Loop BB1_3 Depth 2237; RV32IA-NEXT:    mv a6, a5238; RV32IA-NEXT:    srl a5, a5, a0239; RV32IA-NEXT:    and a7, a5, a3240; RV32IA-NEXT:    addi a5, a5, 1241; RV32IA-NEXT:    sltu a7, a7, a1242; RV32IA-NEXT:    and a5, a5, a3243; RV32IA-NEXT:    neg a7, a7244; RV32IA-NEXT:    and a5, a7, a5245; RV32IA-NEXT:    sll a5, a5, a0246; RV32IA-NEXT:    and a7, a6, a4247; RV32IA-NEXT:    or a7, a7, a5248; RV32IA-NEXT:  .LBB1_3: # %atomicrmw.start249; RV32IA-NEXT:    # Parent Loop BB1_1 Depth=1250; RV32IA-NEXT:    # => This Inner Loop Header: Depth=2251; RV32IA-NEXT:    lr.w.aqrl a5, (a2)252; RV32IA-NEXT:    bne a5, a6, .LBB1_1253; RV32IA-NEXT:  # %bb.4: # %atomicrmw.start254; RV32IA-NEXT:    # in Loop: Header=BB1_3 Depth=2255; RV32IA-NEXT:    sc.w.rl t0, a7, (a2)256; RV32IA-NEXT:    bnez t0, .LBB1_3257; RV32IA-NEXT:  # %bb.5: # %atomicrmw.start258; RV32IA-NEXT:  # %bb.2: # %atomicrmw.end259; RV32IA-NEXT:    srl a0, a5, a0260; RV32IA-NEXT:    ret261;262; RV64I-LABEL: atomicrmw_uinc_wrap_i16:263; RV64I:       # %bb.0:264; RV64I-NEXT:    addi sp, sp, -48265; RV64I-NEXT:    .cfi_def_cfa_offset 48266; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill267; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill268; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill269; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill270; RV64I-NEXT:    .cfi_offset ra, -8271; RV64I-NEXT:    .cfi_offset s0, -16272; RV64I-NEXT:    .cfi_offset s1, -24273; RV64I-NEXT:    .cfi_offset s2, -32274; RV64I-NEXT:    mv s0, a0275; RV64I-NEXT:    lhu a3, 0(a0)276; RV64I-NEXT:    lui s1, 16277; RV64I-NEXT:    addi s1, s1, -1278; RV64I-NEXT:    and s2, a1, s1279; RV64I-NEXT:  .LBB1_1: # %atomicrmw.start280; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1281; RV64I-NEXT:    and a0, a3, s1282; RV64I-NEXT:    addi a1, a3, 1283; RV64I-NEXT:    sltu a0, a0, s2284; RV64I-NEXT:    neg a2, a0285; RV64I-NEXT:    and a2, a2, a1286; RV64I-NEXT:    sh a3, 14(sp)287; RV64I-NEXT:    addi a1, sp, 14288; RV64I-NEXT:    li a3, 5289; RV64I-NEXT:    li a4, 5290; RV64I-NEXT:    mv a0, s0291; RV64I-NEXT:    call __atomic_compare_exchange_2292; RV64I-NEXT:    lh a3, 14(sp)293; RV64I-NEXT:    beqz a0, .LBB1_1294; RV64I-NEXT:  # %bb.2: # %atomicrmw.end295; RV64I-NEXT:    mv a0, a3296; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload297; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload298; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload299; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload300; RV64I-NEXT:    .cfi_restore ra301; RV64I-NEXT:    .cfi_restore s0302; RV64I-NEXT:    .cfi_restore s1303; RV64I-NEXT:    .cfi_restore s2304; RV64I-NEXT:    addi sp, sp, 48305; RV64I-NEXT:    .cfi_def_cfa_offset 0306; RV64I-NEXT:    ret307;308; RV64IA-LABEL: atomicrmw_uinc_wrap_i16:309; RV64IA:       # %bb.0:310; RV64IA-NEXT:    andi a2, a0, -4311; RV64IA-NEXT:    slli a5, a0, 3312; RV64IA-NEXT:    lui a3, 16313; RV64IA-NEXT:    andi a0, a5, 24314; RV64IA-NEXT:    addi a3, a3, -1315; RV64IA-NEXT:    lw a4, 0(a2)316; RV64IA-NEXT:    sllw a5, a3, a5317; RV64IA-NEXT:    not a5, a5318; RV64IA-NEXT:    and a1, a1, a3319; RV64IA-NEXT:  .LBB1_1: # %atomicrmw.start320; RV64IA-NEXT:    # =>This Loop Header: Depth=1321; RV64IA-NEXT:    # Child Loop BB1_3 Depth 2322; RV64IA-NEXT:    srlw a6, a4, a0323; RV64IA-NEXT:    sext.w a7, a4324; RV64IA-NEXT:    and t0, a6, a3325; RV64IA-NEXT:    addi a6, a6, 1326; RV64IA-NEXT:    sltu t0, t0, a1327; RV64IA-NEXT:    and a6, a6, a3328; RV64IA-NEXT:    neg t0, t0329; RV64IA-NEXT:    and a6, t0, a6330; RV64IA-NEXT:    sllw a6, a6, a0331; RV64IA-NEXT:    and a4, a4, a5332; RV64IA-NEXT:    or a6, a4, a6333; RV64IA-NEXT:  .LBB1_3: # %atomicrmw.start334; RV64IA-NEXT:    # Parent Loop BB1_1 Depth=1335; RV64IA-NEXT:    # => This Inner Loop Header: Depth=2336; RV64IA-NEXT:    lr.w.aqrl a4, (a2)337; RV64IA-NEXT:    bne a4, a7, .LBB1_1338; RV64IA-NEXT:  # %bb.4: # %atomicrmw.start339; RV64IA-NEXT:    # in Loop: Header=BB1_3 Depth=2340; RV64IA-NEXT:    sc.w.rl t0, a6, (a2)341; RV64IA-NEXT:    bnez t0, .LBB1_3342; RV64IA-NEXT:  # %bb.5: # %atomicrmw.start343; RV64IA-NEXT:  # %bb.2: # %atomicrmw.end344; RV64IA-NEXT:    srlw a0, a4, a0345; RV64IA-NEXT:    ret346  %result = atomicrmw uinc_wrap ptr %ptr, i16 %val seq_cst347  ret i16 %result348}349 350define i32 @atomicrmw_uinc_wrap_i32(ptr %ptr, i32 %val) {351; RV32I-LABEL: atomicrmw_uinc_wrap_i32:352; RV32I:       # %bb.0:353; RV32I-NEXT:    addi sp, sp, -16354; RV32I-NEXT:    .cfi_def_cfa_offset 16355; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill356; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill357; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill358; RV32I-NEXT:    .cfi_offset ra, -4359; RV32I-NEXT:    .cfi_offset s0, -8360; RV32I-NEXT:    .cfi_offset s1, -12361; RV32I-NEXT:    mv s0, a0362; RV32I-NEXT:    lw a3, 0(a0)363; RV32I-NEXT:    mv s1, a1364; RV32I-NEXT:  .LBB2_1: # %atomicrmw.start365; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1366; RV32I-NEXT:    addi a0, a3, 1367; RV32I-NEXT:    sltu a1, a3, s1368; RV32I-NEXT:    neg a2, a1369; RV32I-NEXT:    and a2, a2, a0370; RV32I-NEXT:    sw a3, 0(sp)371; RV32I-NEXT:    mv a1, sp372; RV32I-NEXT:    li a3, 5373; RV32I-NEXT:    li a4, 5374; RV32I-NEXT:    mv a0, s0375; RV32I-NEXT:    call __atomic_compare_exchange_4376; RV32I-NEXT:    lw a3, 0(sp)377; RV32I-NEXT:    beqz a0, .LBB2_1378; RV32I-NEXT:  # %bb.2: # %atomicrmw.end379; RV32I-NEXT:    mv a0, a3380; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload381; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload382; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload383; RV32I-NEXT:    .cfi_restore ra384; RV32I-NEXT:    .cfi_restore s0385; RV32I-NEXT:    .cfi_restore s1386; RV32I-NEXT:    addi sp, sp, 16387; RV32I-NEXT:    .cfi_def_cfa_offset 0388; RV32I-NEXT:    ret389;390; RV32IA-LABEL: atomicrmw_uinc_wrap_i32:391; RV32IA:       # %bb.0:392; RV32IA-NEXT:    lw a2, 0(a0)393; RV32IA-NEXT:  .LBB2_1: # %atomicrmw.start394; RV32IA-NEXT:    # =>This Loop Header: Depth=1395; RV32IA-NEXT:    # Child Loop BB2_3 Depth 2396; RV32IA-NEXT:    mv a3, a2397; RV32IA-NEXT:    addi a2, a2, 1398; RV32IA-NEXT:    sltu a4, a3, a1399; RV32IA-NEXT:    neg a4, a4400; RV32IA-NEXT:    and a4, a4, a2401; RV32IA-NEXT:  .LBB2_3: # %atomicrmw.start402; RV32IA-NEXT:    # Parent Loop BB2_1 Depth=1403; RV32IA-NEXT:    # => This Inner Loop Header: Depth=2404; RV32IA-NEXT:    lr.w.aqrl a2, (a0)405; RV32IA-NEXT:    bne a2, a3, .LBB2_1406; RV32IA-NEXT:  # %bb.4: # %atomicrmw.start407; RV32IA-NEXT:    # in Loop: Header=BB2_3 Depth=2408; RV32IA-NEXT:    sc.w.rl a5, a4, (a0)409; RV32IA-NEXT:    bnez a5, .LBB2_3410; RV32IA-NEXT:  # %bb.5: # %atomicrmw.start411; RV32IA-NEXT:  # %bb.2: # %atomicrmw.end412; RV32IA-NEXT:    mv a0, a2413; RV32IA-NEXT:    ret414;415; RV64I-LABEL: atomicrmw_uinc_wrap_i32:416; RV64I:       # %bb.0:417; RV64I-NEXT:    addi sp, sp, -32418; RV64I-NEXT:    .cfi_def_cfa_offset 32419; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill420; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill421; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill422; RV64I-NEXT:    .cfi_offset ra, -8423; RV64I-NEXT:    .cfi_offset s0, -16424; RV64I-NEXT:    .cfi_offset s1, -24425; RV64I-NEXT:    mv s0, a0426; RV64I-NEXT:    lw a3, 0(a0)427; RV64I-NEXT:    sext.w s1, a1428; RV64I-NEXT:  .LBB2_1: # %atomicrmw.start429; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1430; RV64I-NEXT:    addiw a0, a3, 1431; RV64I-NEXT:    sltu a1, a3, s1432; RV64I-NEXT:    neg a2, a1433; RV64I-NEXT:    and a2, a2, a0434; RV64I-NEXT:    sw a3, 4(sp)435; RV64I-NEXT:    addi a1, sp, 4436; RV64I-NEXT:    li a3, 5437; RV64I-NEXT:    li a4, 5438; RV64I-NEXT:    mv a0, s0439; RV64I-NEXT:    call __atomic_compare_exchange_4440; RV64I-NEXT:    lw a3, 4(sp)441; RV64I-NEXT:    beqz a0, .LBB2_1442; RV64I-NEXT:  # %bb.2: # %atomicrmw.end443; RV64I-NEXT:    mv a0, a3444; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload445; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload446; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload447; RV64I-NEXT:    .cfi_restore ra448; RV64I-NEXT:    .cfi_restore s0449; RV64I-NEXT:    .cfi_restore s1450; RV64I-NEXT:    addi sp, sp, 32451; RV64I-NEXT:    .cfi_def_cfa_offset 0452; RV64I-NEXT:    ret453;454; RV64IA-LABEL: atomicrmw_uinc_wrap_i32:455; RV64IA:       # %bb.0:456; RV64IA-NEXT:    lw a2, 0(a0)457; RV64IA-NEXT:    sext.w a1, a1458; RV64IA-NEXT:  .LBB2_1: # %atomicrmw.start459; RV64IA-NEXT:    # =>This Loop Header: Depth=1460; RV64IA-NEXT:    # Child Loop BB2_3 Depth 2461; RV64IA-NEXT:    addiw a3, a2, 1462; RV64IA-NEXT:    sext.w a4, a2463; RV64IA-NEXT:    sltu a2, a4, a1464; RV64IA-NEXT:    neg a2, a2465; RV64IA-NEXT:    and a3, a2, a3466; RV64IA-NEXT:  .LBB2_3: # %atomicrmw.start467; RV64IA-NEXT:    # Parent Loop BB2_1 Depth=1468; RV64IA-NEXT:    # => This Inner Loop Header: Depth=2469; RV64IA-NEXT:    lr.w.aqrl a2, (a0)470; RV64IA-NEXT:    bne a2, a4, .LBB2_1471; RV64IA-NEXT:  # %bb.4: # %atomicrmw.start472; RV64IA-NEXT:    # in Loop: Header=BB2_3 Depth=2473; RV64IA-NEXT:    sc.w.rl a5, a3, (a0)474; RV64IA-NEXT:    bnez a5, .LBB2_3475; RV64IA-NEXT:  # %bb.5: # %atomicrmw.start476; RV64IA-NEXT:  # %bb.2: # %atomicrmw.end477; RV64IA-NEXT:    mv a0, a2478; RV64IA-NEXT:    ret479  %result = atomicrmw uinc_wrap ptr %ptr, i32 %val seq_cst480  ret i32 %result481}482 483define i64 @atomicrmw_uinc_wrap_i64(ptr %ptr, i64 %val) {484; RV32I-LABEL: atomicrmw_uinc_wrap_i64:485; RV32I:       # %bb.0:486; RV32I-NEXT:    addi sp, sp, -32487; RV32I-NEXT:    .cfi_def_cfa_offset 32488; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill489; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill490; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill491; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill492; RV32I-NEXT:    .cfi_offset ra, -4493; RV32I-NEXT:    .cfi_offset s0, -8494; RV32I-NEXT:    .cfi_offset s1, -12495; RV32I-NEXT:    .cfi_offset s2, -16496; RV32I-NEXT:    mv s0, a2497; RV32I-NEXT:    mv s1, a0498; RV32I-NEXT:    lw a4, 0(a0)499; RV32I-NEXT:    lw a5, 4(a0)500; RV32I-NEXT:    mv s2, a1501; RV32I-NEXT:    j .LBB3_3502; RV32I-NEXT:  .LBB3_1: # %atomicrmw.start503; RV32I-NEXT:    # in Loop: Header=BB3_3 Depth=1504; RV32I-NEXT:    sltu a0, a5, s0505; RV32I-NEXT:  .LBB3_2: # %atomicrmw.start506; RV32I-NEXT:    # in Loop: Header=BB3_3 Depth=1507; RV32I-NEXT:    addi a1, a4, 1508; RV32I-NEXT:    neg a0, a0509; RV32I-NEXT:    seqz a3, a1510; RV32I-NEXT:    and a2, a0, a1511; RV32I-NEXT:    add a3, a5, a3512; RV32I-NEXT:    and a3, a0, a3513; RV32I-NEXT:    sw a4, 8(sp)514; RV32I-NEXT:    sw a5, 12(sp)515; RV32I-NEXT:    addi a1, sp, 8516; RV32I-NEXT:    li a4, 5517; RV32I-NEXT:    li a5, 5518; RV32I-NEXT:    mv a0, s1519; RV32I-NEXT:    call __atomic_compare_exchange_8520; RV32I-NEXT:    lw a4, 8(sp)521; RV32I-NEXT:    lw a5, 12(sp)522; RV32I-NEXT:    bnez a0, .LBB3_5523; RV32I-NEXT:  .LBB3_3: # %atomicrmw.start524; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1525; RV32I-NEXT:    bne a5, s0, .LBB3_1526; RV32I-NEXT:  # %bb.4: # in Loop: Header=BB3_3 Depth=1527; RV32I-NEXT:    sltu a0, a4, s2528; RV32I-NEXT:    j .LBB3_2529; RV32I-NEXT:  .LBB3_5: # %atomicrmw.end530; RV32I-NEXT:    mv a0, a4531; RV32I-NEXT:    mv a1, a5532; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload533; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload534; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload535; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload536; RV32I-NEXT:    .cfi_restore ra537; RV32I-NEXT:    .cfi_restore s0538; RV32I-NEXT:    .cfi_restore s1539; RV32I-NEXT:    .cfi_restore s2540; RV32I-NEXT:    addi sp, sp, 32541; RV32I-NEXT:    .cfi_def_cfa_offset 0542; RV32I-NEXT:    ret543;544; RV32IA-LABEL: atomicrmw_uinc_wrap_i64:545; RV32IA:       # %bb.0:546; RV32IA-NEXT:    addi sp, sp, -32547; RV32IA-NEXT:    .cfi_def_cfa_offset 32548; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill549; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill550; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill551; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill552; RV32IA-NEXT:    .cfi_offset ra, -4553; RV32IA-NEXT:    .cfi_offset s0, -8554; RV32IA-NEXT:    .cfi_offset s1, -12555; RV32IA-NEXT:    .cfi_offset s2, -16556; RV32IA-NEXT:    mv s0, a2557; RV32IA-NEXT:    mv s1, a0558; RV32IA-NEXT:    lw a4, 0(a0)559; RV32IA-NEXT:    lw a5, 4(a0)560; RV32IA-NEXT:    mv s2, a1561; RV32IA-NEXT:    j .LBB3_3562; RV32IA-NEXT:  .LBB3_1: # %atomicrmw.start563; RV32IA-NEXT:    # in Loop: Header=BB3_3 Depth=1564; RV32IA-NEXT:    sltu a0, a5, s0565; RV32IA-NEXT:  .LBB3_2: # %atomicrmw.start566; RV32IA-NEXT:    # in Loop: Header=BB3_3 Depth=1567; RV32IA-NEXT:    addi a1, a4, 1568; RV32IA-NEXT:    neg a0, a0569; RV32IA-NEXT:    seqz a3, a1570; RV32IA-NEXT:    and a2, a0, a1571; RV32IA-NEXT:    add a3, a5, a3572; RV32IA-NEXT:    and a3, a0, a3573; RV32IA-NEXT:    sw a4, 8(sp)574; RV32IA-NEXT:    sw a5, 12(sp)575; RV32IA-NEXT:    addi a1, sp, 8576; RV32IA-NEXT:    li a4, 5577; RV32IA-NEXT:    li a5, 5578; RV32IA-NEXT:    mv a0, s1579; RV32IA-NEXT:    call __atomic_compare_exchange_8580; RV32IA-NEXT:    lw a4, 8(sp)581; RV32IA-NEXT:    lw a5, 12(sp)582; RV32IA-NEXT:    bnez a0, .LBB3_5583; RV32IA-NEXT:  .LBB3_3: # %atomicrmw.start584; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1585; RV32IA-NEXT:    bne a5, s0, .LBB3_1586; RV32IA-NEXT:  # %bb.4: # in Loop: Header=BB3_3 Depth=1587; RV32IA-NEXT:    sltu a0, a4, s2588; RV32IA-NEXT:    j .LBB3_2589; RV32IA-NEXT:  .LBB3_5: # %atomicrmw.end590; RV32IA-NEXT:    mv a0, a4591; RV32IA-NEXT:    mv a1, a5592; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload593; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload594; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload595; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload596; RV32IA-NEXT:    .cfi_restore ra597; RV32IA-NEXT:    .cfi_restore s0598; RV32IA-NEXT:    .cfi_restore s1599; RV32IA-NEXT:    .cfi_restore s2600; RV32IA-NEXT:    addi sp, sp, 32601; RV32IA-NEXT:    .cfi_def_cfa_offset 0602; RV32IA-NEXT:    ret603;604; RV64I-LABEL: atomicrmw_uinc_wrap_i64:605; RV64I:       # %bb.0:606; RV64I-NEXT:    addi sp, sp, -32607; RV64I-NEXT:    .cfi_def_cfa_offset 32608; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill609; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill610; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill611; RV64I-NEXT:    .cfi_offset ra, -8612; RV64I-NEXT:    .cfi_offset s0, -16613; RV64I-NEXT:    .cfi_offset s1, -24614; RV64I-NEXT:    mv s0, a0615; RV64I-NEXT:    ld a3, 0(a0)616; RV64I-NEXT:    mv s1, a1617; RV64I-NEXT:  .LBB3_1: # %atomicrmw.start618; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1619; RV64I-NEXT:    addi a0, a3, 1620; RV64I-NEXT:    sltu a1, a3, s1621; RV64I-NEXT:    neg a2, a1622; RV64I-NEXT:    and a2, a2, a0623; RV64I-NEXT:    sd a3, 0(sp)624; RV64I-NEXT:    mv a1, sp625; RV64I-NEXT:    li a3, 5626; RV64I-NEXT:    li a4, 5627; RV64I-NEXT:    mv a0, s0628; RV64I-NEXT:    call __atomic_compare_exchange_8629; RV64I-NEXT:    ld a3, 0(sp)630; RV64I-NEXT:    beqz a0, .LBB3_1631; RV64I-NEXT:  # %bb.2: # %atomicrmw.end632; RV64I-NEXT:    mv a0, a3633; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload634; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload635; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload636; RV64I-NEXT:    .cfi_restore ra637; RV64I-NEXT:    .cfi_restore s0638; RV64I-NEXT:    .cfi_restore s1639; RV64I-NEXT:    addi sp, sp, 32640; RV64I-NEXT:    .cfi_def_cfa_offset 0641; RV64I-NEXT:    ret642;643; RV64IA-LABEL: atomicrmw_uinc_wrap_i64:644; RV64IA:       # %bb.0:645; RV64IA-NEXT:    ld a2, 0(a0)646; RV64IA-NEXT:  .LBB3_1: # %atomicrmw.start647; RV64IA-NEXT:    # =>This Loop Header: Depth=1648; RV64IA-NEXT:    # Child Loop BB3_3 Depth 2649; RV64IA-NEXT:    mv a3, a2650; RV64IA-NEXT:    addi a2, a2, 1651; RV64IA-NEXT:    sltu a4, a3, a1652; RV64IA-NEXT:    neg a4, a4653; RV64IA-NEXT:    and a4, a4, a2654; RV64IA-NEXT:  .LBB3_3: # %atomicrmw.start655; RV64IA-NEXT:    # Parent Loop BB3_1 Depth=1656; RV64IA-NEXT:    # => This Inner Loop Header: Depth=2657; RV64IA-NEXT:    lr.d.aqrl a2, (a0)658; RV64IA-NEXT:    bne a2, a3, .LBB3_1659; RV64IA-NEXT:  # %bb.4: # %atomicrmw.start660; RV64IA-NEXT:    # in Loop: Header=BB3_3 Depth=2661; RV64IA-NEXT:    sc.d.rl a5, a4, (a0)662; RV64IA-NEXT:    bnez a5, .LBB3_3663; RV64IA-NEXT:  # %bb.5: # %atomicrmw.start664; RV64IA-NEXT:  # %bb.2: # %atomicrmw.end665; RV64IA-NEXT:    mv a0, a2666; RV64IA-NEXT:    ret667  %result = atomicrmw uinc_wrap ptr %ptr, i64 %val seq_cst668  ret i64 %result669}670 671define i8 @atomicrmw_udec_wrap_i8(ptr %ptr, i8 %val) {672; RV32I-LABEL: atomicrmw_udec_wrap_i8:673; RV32I:       # %bb.0:674; RV32I-NEXT:    addi sp, sp, -32675; RV32I-NEXT:    .cfi_def_cfa_offset 32676; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill677; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill678; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill679; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill680; RV32I-NEXT:    .cfi_offset ra, -4681; RV32I-NEXT:    .cfi_offset s0, -8682; RV32I-NEXT:    .cfi_offset s1, -12683; RV32I-NEXT:    .cfi_offset s2, -16684; RV32I-NEXT:    mv s0, a0685; RV32I-NEXT:    lbu a3, 0(a0)686; RV32I-NEXT:    mv s1, a1687; RV32I-NEXT:    zext.b s2, a1688; RV32I-NEXT:    j .LBB4_2689; RV32I-NEXT:  .LBB4_1: # %atomicrmw.start690; RV32I-NEXT:    # in Loop: Header=BB4_2 Depth=1691; RV32I-NEXT:    sb a3, 15(sp)692; RV32I-NEXT:    addi a1, sp, 15693; RV32I-NEXT:    li a3, 5694; RV32I-NEXT:    li a4, 5695; RV32I-NEXT:    mv a0, s0696; RV32I-NEXT:    call __atomic_compare_exchange_1697; RV32I-NEXT:    lbu a3, 15(sp)698; RV32I-NEXT:    bnez a0, .LBB4_4699; RV32I-NEXT:  .LBB4_2: # %atomicrmw.start700; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1701; RV32I-NEXT:    zext.b a0, a3702; RV32I-NEXT:    seqz a1, a0703; RV32I-NEXT:    sltu a0, s2, a0704; RV32I-NEXT:    or a0, a1, a0705; RV32I-NEXT:    mv a2, s1706; RV32I-NEXT:    bnez a0, .LBB4_1707; RV32I-NEXT:  # %bb.3: # %atomicrmw.start708; RV32I-NEXT:    # in Loop: Header=BB4_2 Depth=1709; RV32I-NEXT:    addi a2, a3, -1710; RV32I-NEXT:    j .LBB4_1711; RV32I-NEXT:  .LBB4_4: # %atomicrmw.end712; RV32I-NEXT:    mv a0, a3713; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload714; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload715; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload716; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload717; RV32I-NEXT:    .cfi_restore ra718; RV32I-NEXT:    .cfi_restore s0719; RV32I-NEXT:    .cfi_restore s1720; RV32I-NEXT:    .cfi_restore s2721; RV32I-NEXT:    addi sp, sp, 32722; RV32I-NEXT:    .cfi_def_cfa_offset 0723; RV32I-NEXT:    ret724;725; RV32IA-LABEL: atomicrmw_udec_wrap_i8:726; RV32IA:       # %bb.0:727; RV32IA-NEXT:    andi a2, a0, -4728; RV32IA-NEXT:    slli a3, a0, 3729; RV32IA-NEXT:    li a4, 255730; RV32IA-NEXT:    andi a0, a3, 24731; RV32IA-NEXT:    lw a6, 0(a2)732; RV32IA-NEXT:    sll a3, a4, a3733; RV32IA-NEXT:    not a3, a3734; RV32IA-NEXT:    zext.b a4, a1735; RV32IA-NEXT:    j .LBB4_2736; RV32IA-NEXT:  .LBB4_1: # %atomicrmw.start737; RV32IA-NEXT:    # in Loop: Header=BB4_2 Depth=1738; RV32IA-NEXT:    zext.b a6, a7739; RV32IA-NEXT:    sll a6, a6, a0740; RV32IA-NEXT:    and a7, a5, a3741; RV32IA-NEXT:    or a7, a7, a6742; RV32IA-NEXT:  .LBB4_5: # %atomicrmw.start743; RV32IA-NEXT:    # Parent Loop BB4_2 Depth=1744; RV32IA-NEXT:    # => This Inner Loop Header: Depth=2745; RV32IA-NEXT:    lr.w.aqrl a6, (a2)746; RV32IA-NEXT:    bne a6, a5, .LBB4_7747; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start748; RV32IA-NEXT:    # in Loop: Header=BB4_5 Depth=2749; RV32IA-NEXT:    sc.w.rl t0, a7, (a2)750; RV32IA-NEXT:    bnez t0, .LBB4_5751; RV32IA-NEXT:  .LBB4_7: # %atomicrmw.start752; RV32IA-NEXT:    # in Loop: Header=BB4_2 Depth=1753; RV32IA-NEXT:    beq a6, a5, .LBB4_4754; RV32IA-NEXT:  .LBB4_2: # %atomicrmw.start755; RV32IA-NEXT:    # =>This Loop Header: Depth=1756; RV32IA-NEXT:    # Child Loop BB4_5 Depth 2757; RV32IA-NEXT:    mv a5, a6758; RV32IA-NEXT:    srl a6, a6, a0759; RV32IA-NEXT:    zext.b a7, a6760; RV32IA-NEXT:    seqz t0, a7761; RV32IA-NEXT:    sltu a7, a4, a7762; RV32IA-NEXT:    or t0, t0, a7763; RV32IA-NEXT:    mv a7, a1764; RV32IA-NEXT:    bnez t0, .LBB4_1765; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start766; RV32IA-NEXT:    # in Loop: Header=BB4_2 Depth=1767; RV32IA-NEXT:    addi a7, a6, -1768; RV32IA-NEXT:    j .LBB4_1769; RV32IA-NEXT:  .LBB4_4: # %atomicrmw.end770; RV32IA-NEXT:    srl a0, a6, a0771; RV32IA-NEXT:    ret772;773; RV64I-LABEL: atomicrmw_udec_wrap_i8:774; RV64I:       # %bb.0:775; RV64I-NEXT:    addi sp, sp, -48776; RV64I-NEXT:    .cfi_def_cfa_offset 48777; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill778; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill779; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill780; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill781; RV64I-NEXT:    .cfi_offset ra, -8782; RV64I-NEXT:    .cfi_offset s0, -16783; RV64I-NEXT:    .cfi_offset s1, -24784; RV64I-NEXT:    .cfi_offset s2, -32785; RV64I-NEXT:    mv s0, a0786; RV64I-NEXT:    lbu a3, 0(a0)787; RV64I-NEXT:    mv s1, a1788; RV64I-NEXT:    zext.b s2, a1789; RV64I-NEXT:    j .LBB4_2790; RV64I-NEXT:  .LBB4_1: # %atomicrmw.start791; RV64I-NEXT:    # in Loop: Header=BB4_2 Depth=1792; RV64I-NEXT:    sb a3, 15(sp)793; RV64I-NEXT:    addi a1, sp, 15794; RV64I-NEXT:    li a3, 5795; RV64I-NEXT:    li a4, 5796; RV64I-NEXT:    mv a0, s0797; RV64I-NEXT:    call __atomic_compare_exchange_1798; RV64I-NEXT:    lbu a3, 15(sp)799; RV64I-NEXT:    bnez a0, .LBB4_4800; RV64I-NEXT:  .LBB4_2: # %atomicrmw.start801; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1802; RV64I-NEXT:    zext.b a0, a3803; RV64I-NEXT:    seqz a1, a0804; RV64I-NEXT:    sltu a0, s2, a0805; RV64I-NEXT:    or a0, a1, a0806; RV64I-NEXT:    mv a2, s1807; RV64I-NEXT:    bnez a0, .LBB4_1808; RV64I-NEXT:  # %bb.3: # %atomicrmw.start809; RV64I-NEXT:    # in Loop: Header=BB4_2 Depth=1810; RV64I-NEXT:    addi a2, a3, -1811; RV64I-NEXT:    j .LBB4_1812; RV64I-NEXT:  .LBB4_4: # %atomicrmw.end813; RV64I-NEXT:    mv a0, a3814; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload815; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload816; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload817; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload818; RV64I-NEXT:    .cfi_restore ra819; RV64I-NEXT:    .cfi_restore s0820; RV64I-NEXT:    .cfi_restore s1821; RV64I-NEXT:    .cfi_restore s2822; RV64I-NEXT:    addi sp, sp, 48823; RV64I-NEXT:    .cfi_def_cfa_offset 0824; RV64I-NEXT:    ret825;826; RV64IA-LABEL: atomicrmw_udec_wrap_i8:827; RV64IA:       # %bb.0:828; RV64IA-NEXT:    andi a2, a0, -4829; RV64IA-NEXT:    slli a4, a0, 3830; RV64IA-NEXT:    li a5, 255831; RV64IA-NEXT:    andi a0, a4, 24832; RV64IA-NEXT:    lw a3, 0(a2)833; RV64IA-NEXT:    sllw a4, a5, a4834; RV64IA-NEXT:    not a4, a4835; RV64IA-NEXT:    zext.b a5, a1836; RV64IA-NEXT:    j .LBB4_2837; RV64IA-NEXT:  .LBB4_1: # %atomicrmw.start838; RV64IA-NEXT:    # in Loop: Header=BB4_2 Depth=1839; RV64IA-NEXT:    sext.w a6, a3840; RV64IA-NEXT:    zext.b a7, a7841; RV64IA-NEXT:    sllw a7, a7, a0842; RV64IA-NEXT:    and a3, a3, a4843; RV64IA-NEXT:    or a7, a3, a7844; RV64IA-NEXT:  .LBB4_5: # %atomicrmw.start845; RV64IA-NEXT:    # Parent Loop BB4_2 Depth=1846; RV64IA-NEXT:    # => This Inner Loop Header: Depth=2847; RV64IA-NEXT:    lr.w.aqrl a3, (a2)848; RV64IA-NEXT:    bne a3, a6, .LBB4_7849; RV64IA-NEXT:  # %bb.6: # %atomicrmw.start850; RV64IA-NEXT:    # in Loop: Header=BB4_5 Depth=2851; RV64IA-NEXT:    sc.w.rl t0, a7, (a2)852; RV64IA-NEXT:    bnez t0, .LBB4_5853; RV64IA-NEXT:  .LBB4_7: # %atomicrmw.start854; RV64IA-NEXT:    # in Loop: Header=BB4_2 Depth=1855; RV64IA-NEXT:    beq a3, a6, .LBB4_4856; RV64IA-NEXT:  .LBB4_2: # %atomicrmw.start857; RV64IA-NEXT:    # =>This Loop Header: Depth=1858; RV64IA-NEXT:    # Child Loop BB4_5 Depth 2859; RV64IA-NEXT:    srlw a6, a3, a0860; RV64IA-NEXT:    zext.b a7, a6861; RV64IA-NEXT:    seqz t0, a7862; RV64IA-NEXT:    sltu a7, a5, a7863; RV64IA-NEXT:    or t0, t0, a7864; RV64IA-NEXT:    mv a7, a1865; RV64IA-NEXT:    bnez t0, .LBB4_1866; RV64IA-NEXT:  # %bb.3: # %atomicrmw.start867; RV64IA-NEXT:    # in Loop: Header=BB4_2 Depth=1868; RV64IA-NEXT:    addi a7, a6, -1869; RV64IA-NEXT:    j .LBB4_1870; RV64IA-NEXT:  .LBB4_4: # %atomicrmw.end871; RV64IA-NEXT:    srlw a0, a3, a0872; RV64IA-NEXT:    ret873  %result = atomicrmw udec_wrap ptr %ptr, i8 %val seq_cst874  ret i8 %result875}876 877define i16 @atomicrmw_udec_wrap_i16(ptr %ptr, i16 %val) {878; RV32I-LABEL: atomicrmw_udec_wrap_i16:879; RV32I:       # %bb.0:880; RV32I-NEXT:    addi sp, sp, -32881; RV32I-NEXT:    .cfi_def_cfa_offset 32882; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill883; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill884; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill885; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill886; RV32I-NEXT:    sw s3, 12(sp) # 4-byte Folded Spill887; RV32I-NEXT:    .cfi_offset ra, -4888; RV32I-NEXT:    .cfi_offset s0, -8889; RV32I-NEXT:    .cfi_offset s1, -12890; RV32I-NEXT:    .cfi_offset s2, -16891; RV32I-NEXT:    .cfi_offset s3, -20892; RV32I-NEXT:    mv s0, a1893; RV32I-NEXT:    mv s1, a0894; RV32I-NEXT:    lhu a1, 0(a0)895; RV32I-NEXT:    lui s2, 16896; RV32I-NEXT:    addi s2, s2, -1897; RV32I-NEXT:    and s3, s0, s2898; RV32I-NEXT:    j .LBB5_2899; RV32I-NEXT:  .LBB5_1: # %atomicrmw.start900; RV32I-NEXT:    # in Loop: Header=BB5_2 Depth=1901; RV32I-NEXT:    sh a1, 10(sp)902; RV32I-NEXT:    addi a1, sp, 10903; RV32I-NEXT:    li a3, 5904; RV32I-NEXT:    li a4, 5905; RV32I-NEXT:    mv a0, s1906; RV32I-NEXT:    call __atomic_compare_exchange_2907; RV32I-NEXT:    lh a1, 10(sp)908; RV32I-NEXT:    bnez a0, .LBB5_4909; RV32I-NEXT:  .LBB5_2: # %atomicrmw.start910; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1911; RV32I-NEXT:    and a0, a1, s2912; RV32I-NEXT:    seqz a2, a0913; RV32I-NEXT:    sltu a0, s3, a0914; RV32I-NEXT:    or a0, a2, a0915; RV32I-NEXT:    mv a2, s0916; RV32I-NEXT:    bnez a0, .LBB5_1917; RV32I-NEXT:  # %bb.3: # %atomicrmw.start918; RV32I-NEXT:    # in Loop: Header=BB5_2 Depth=1919; RV32I-NEXT:    addi a2, a1, -1920; RV32I-NEXT:    j .LBB5_1921; RV32I-NEXT:  .LBB5_4: # %atomicrmw.end922; RV32I-NEXT:    mv a0, a1923; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload924; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload925; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload926; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload927; RV32I-NEXT:    lw s3, 12(sp) # 4-byte Folded Reload928; RV32I-NEXT:    .cfi_restore ra929; RV32I-NEXT:    .cfi_restore s0930; RV32I-NEXT:    .cfi_restore s1931; RV32I-NEXT:    .cfi_restore s2932; RV32I-NEXT:    .cfi_restore s3933; RV32I-NEXT:    addi sp, sp, 32934; RV32I-NEXT:    .cfi_def_cfa_offset 0935; RV32I-NEXT:    ret936;937; RV32IA-LABEL: atomicrmw_udec_wrap_i16:938; RV32IA:       # %bb.0:939; RV32IA-NEXT:    andi a2, a0, -4940; RV32IA-NEXT:    slli a4, a0, 3941; RV32IA-NEXT:    lui a3, 16942; RV32IA-NEXT:    andi a0, a4, 24943; RV32IA-NEXT:    addi a3, a3, -1944; RV32IA-NEXT:    lw a7, 0(a2)945; RV32IA-NEXT:    sll a4, a3, a4946; RV32IA-NEXT:    not a4, a4947; RV32IA-NEXT:    and a5, a1, a3948; RV32IA-NEXT:    j .LBB5_2949; RV32IA-NEXT:  .LBB5_1: # %atomicrmw.start950; RV32IA-NEXT:    # in Loop: Header=BB5_2 Depth=1951; RV32IA-NEXT:    and a7, t0, a3952; RV32IA-NEXT:    sll a7, a7, a0953; RV32IA-NEXT:    and t0, a6, a4954; RV32IA-NEXT:    or t0, t0, a7955; RV32IA-NEXT:  .LBB5_5: # %atomicrmw.start956; RV32IA-NEXT:    # Parent Loop BB5_2 Depth=1957; RV32IA-NEXT:    # => This Inner Loop Header: Depth=2958; RV32IA-NEXT:    lr.w.aqrl a7, (a2)959; RV32IA-NEXT:    bne a7, a6, .LBB5_7960; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start961; RV32IA-NEXT:    # in Loop: Header=BB5_5 Depth=2962; RV32IA-NEXT:    sc.w.rl t1, t0, (a2)963; RV32IA-NEXT:    bnez t1, .LBB5_5964; RV32IA-NEXT:  .LBB5_7: # %atomicrmw.start965; RV32IA-NEXT:    # in Loop: Header=BB5_2 Depth=1966; RV32IA-NEXT:    beq a7, a6, .LBB5_4967; RV32IA-NEXT:  .LBB5_2: # %atomicrmw.start968; RV32IA-NEXT:    # =>This Loop Header: Depth=1969; RV32IA-NEXT:    # Child Loop BB5_5 Depth 2970; RV32IA-NEXT:    mv a6, a7971; RV32IA-NEXT:    srl a7, a7, a0972; RV32IA-NEXT:    and t0, a7, a3973; RV32IA-NEXT:    seqz t1, t0974; RV32IA-NEXT:    sltu t0, a5, t0975; RV32IA-NEXT:    or t1, t1, t0976; RV32IA-NEXT:    mv t0, a1977; RV32IA-NEXT:    bnez t1, .LBB5_1978; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start979; RV32IA-NEXT:    # in Loop: Header=BB5_2 Depth=1980; RV32IA-NEXT:    addi t0, a7, -1981; RV32IA-NEXT:    j .LBB5_1982; RV32IA-NEXT:  .LBB5_4: # %atomicrmw.end983; RV32IA-NEXT:    srl a0, a7, a0984; RV32IA-NEXT:    ret985;986; RV64I-LABEL: atomicrmw_udec_wrap_i16:987; RV64I:       # %bb.0:988; RV64I-NEXT:    addi sp, sp, -48989; RV64I-NEXT:    .cfi_def_cfa_offset 48990; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill991; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill992; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill993; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill994; RV64I-NEXT:    sd s3, 8(sp) # 8-byte Folded Spill995; RV64I-NEXT:    .cfi_offset ra, -8996; RV64I-NEXT:    .cfi_offset s0, -16997; RV64I-NEXT:    .cfi_offset s1, -24998; RV64I-NEXT:    .cfi_offset s2, -32999; RV64I-NEXT:    .cfi_offset s3, -401000; RV64I-NEXT:    mv s0, a11001; RV64I-NEXT:    mv s1, a01002; RV64I-NEXT:    lhu a1, 0(a0)1003; RV64I-NEXT:    lui s2, 161004; RV64I-NEXT:    addi s2, s2, -11005; RV64I-NEXT:    and s3, s0, s21006; RV64I-NEXT:    j .LBB5_21007; RV64I-NEXT:  .LBB5_1: # %atomicrmw.start1008; RV64I-NEXT:    # in Loop: Header=BB5_2 Depth=11009; RV64I-NEXT:    sh a1, 6(sp)1010; RV64I-NEXT:    addi a1, sp, 61011; RV64I-NEXT:    li a3, 51012; RV64I-NEXT:    li a4, 51013; RV64I-NEXT:    mv a0, s11014; RV64I-NEXT:    call __atomic_compare_exchange_21015; RV64I-NEXT:    lh a1, 6(sp)1016; RV64I-NEXT:    bnez a0, .LBB5_41017; RV64I-NEXT:  .LBB5_2: # %atomicrmw.start1018; RV64I-NEXT:    # =>This Inner Loop Header: Depth=11019; RV64I-NEXT:    and a0, a1, s21020; RV64I-NEXT:    seqz a2, a01021; RV64I-NEXT:    sltu a0, s3, a01022; RV64I-NEXT:    or a0, a2, a01023; RV64I-NEXT:    mv a2, s01024; RV64I-NEXT:    bnez a0, .LBB5_11025; RV64I-NEXT:  # %bb.3: # %atomicrmw.start1026; RV64I-NEXT:    # in Loop: Header=BB5_2 Depth=11027; RV64I-NEXT:    addi a2, a1, -11028; RV64I-NEXT:    j .LBB5_11029; RV64I-NEXT:  .LBB5_4: # %atomicrmw.end1030; RV64I-NEXT:    mv a0, a11031; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload1032; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload1033; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload1034; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload1035; RV64I-NEXT:    ld s3, 8(sp) # 8-byte Folded Reload1036; RV64I-NEXT:    .cfi_restore ra1037; RV64I-NEXT:    .cfi_restore s01038; RV64I-NEXT:    .cfi_restore s11039; RV64I-NEXT:    .cfi_restore s21040; RV64I-NEXT:    .cfi_restore s31041; RV64I-NEXT:    addi sp, sp, 481042; RV64I-NEXT:    .cfi_def_cfa_offset 01043; RV64I-NEXT:    ret1044;1045; RV64IA-LABEL: atomicrmw_udec_wrap_i16:1046; RV64IA:       # %bb.0:1047; RV64IA-NEXT:    andi a2, a0, -41048; RV64IA-NEXT:    slli a5, a0, 31049; RV64IA-NEXT:    lui a3, 161050; RV64IA-NEXT:    andi a0, a5, 241051; RV64IA-NEXT:    addi a3, a3, -11052; RV64IA-NEXT:    lw a4, 0(a2)1053; RV64IA-NEXT:    sllw a5, a3, a51054; RV64IA-NEXT:    not a5, a51055; RV64IA-NEXT:    and a6, a1, a31056; RV64IA-NEXT:    j .LBB5_21057; RV64IA-NEXT:  .LBB5_1: # %atomicrmw.start1058; RV64IA-NEXT:    # in Loop: Header=BB5_2 Depth=11059; RV64IA-NEXT:    sext.w a7, a41060; RV64IA-NEXT:    and t0, t0, a31061; RV64IA-NEXT:    sllw t0, t0, a01062; RV64IA-NEXT:    and a4, a4, a51063; RV64IA-NEXT:    or t0, a4, t01064; RV64IA-NEXT:  .LBB5_5: # %atomicrmw.start1065; RV64IA-NEXT:    # Parent Loop BB5_2 Depth=11066; RV64IA-NEXT:    # => This Inner Loop Header: Depth=21067; RV64IA-NEXT:    lr.w.aqrl a4, (a2)1068; RV64IA-NEXT:    bne a4, a7, .LBB5_71069; RV64IA-NEXT:  # %bb.6: # %atomicrmw.start1070; RV64IA-NEXT:    # in Loop: Header=BB5_5 Depth=21071; RV64IA-NEXT:    sc.w.rl t1, t0, (a2)1072; RV64IA-NEXT:    bnez t1, .LBB5_51073; RV64IA-NEXT:  .LBB5_7: # %atomicrmw.start1074; RV64IA-NEXT:    # in Loop: Header=BB5_2 Depth=11075; RV64IA-NEXT:    beq a4, a7, .LBB5_41076; RV64IA-NEXT:  .LBB5_2: # %atomicrmw.start1077; RV64IA-NEXT:    # =>This Loop Header: Depth=11078; RV64IA-NEXT:    # Child Loop BB5_5 Depth 21079; RV64IA-NEXT:    srlw a7, a4, a01080; RV64IA-NEXT:    and t0, a7, a31081; RV64IA-NEXT:    seqz t1, t01082; RV64IA-NEXT:    sltu t0, a6, t01083; RV64IA-NEXT:    or t1, t1, t01084; RV64IA-NEXT:    mv t0, a11085; RV64IA-NEXT:    bnez t1, .LBB5_11086; RV64IA-NEXT:  # %bb.3: # %atomicrmw.start1087; RV64IA-NEXT:    # in Loop: Header=BB5_2 Depth=11088; RV64IA-NEXT:    addi t0, a7, -11089; RV64IA-NEXT:    j .LBB5_11090; RV64IA-NEXT:  .LBB5_4: # %atomicrmw.end1091; RV64IA-NEXT:    srlw a0, a4, a01092; RV64IA-NEXT:    ret1093  %result = atomicrmw udec_wrap ptr %ptr, i16 %val seq_cst1094  ret i16 %result1095}1096 1097define i32 @atomicrmw_udec_wrap_i32(ptr %ptr, i32 %val) {1098; RV32I-LABEL: atomicrmw_udec_wrap_i32:1099; RV32I:       # %bb.0:1100; RV32I-NEXT:    addi sp, sp, -161101; RV32I-NEXT:    .cfi_def_cfa_offset 161102; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill1103; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill1104; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill1105; RV32I-NEXT:    .cfi_offset ra, -41106; RV32I-NEXT:    .cfi_offset s0, -81107; RV32I-NEXT:    .cfi_offset s1, -121108; RV32I-NEXT:    mv s0, a01109; RV32I-NEXT:    lw a3, 0(a0)1110; RV32I-NEXT:    mv s1, a11111; RV32I-NEXT:    j .LBB6_21112; RV32I-NEXT:  .LBB6_1: # %atomicrmw.start1113; RV32I-NEXT:    # in Loop: Header=BB6_2 Depth=11114; RV32I-NEXT:    sw a3, 0(sp)1115; RV32I-NEXT:    mv a1, sp1116; RV32I-NEXT:    li a3, 51117; RV32I-NEXT:    li a4, 51118; RV32I-NEXT:    mv a0, s01119; RV32I-NEXT:    call __atomic_compare_exchange_41120; RV32I-NEXT:    lw a3, 0(sp)1121; RV32I-NEXT:    bnez a0, .LBB6_41122; RV32I-NEXT:  .LBB6_2: # %atomicrmw.start1123; RV32I-NEXT:    # =>This Inner Loop Header: Depth=11124; RV32I-NEXT:    seqz a0, a31125; RV32I-NEXT:    sltu a1, s1, a31126; RV32I-NEXT:    or a0, a0, a11127; RV32I-NEXT:    mv a2, s11128; RV32I-NEXT:    bnez a0, .LBB6_11129; RV32I-NEXT:  # %bb.3: # %atomicrmw.start1130; RV32I-NEXT:    # in Loop: Header=BB6_2 Depth=11131; RV32I-NEXT:    addi a2, a3, -11132; RV32I-NEXT:    j .LBB6_11133; RV32I-NEXT:  .LBB6_4: # %atomicrmw.end1134; RV32I-NEXT:    mv a0, a31135; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload1136; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload1137; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload1138; RV32I-NEXT:    .cfi_restore ra1139; RV32I-NEXT:    .cfi_restore s01140; RV32I-NEXT:    .cfi_restore s11141; RV32I-NEXT:    addi sp, sp, 161142; RV32I-NEXT:    .cfi_def_cfa_offset 01143; RV32I-NEXT:    ret1144;1145; RV32IA-LABEL: atomicrmw_udec_wrap_i32:1146; RV32IA:       # %bb.0:1147; RV32IA-NEXT:    lw a2, 0(a0)1148; RV32IA-NEXT:    j .LBB6_21149; RV32IA-NEXT:  .LBB6_1: # %atomicrmw.start1150; RV32IA-NEXT:    # in Loop: Header=BB6_2 Depth=11151; RV32IA-NEXT:  .LBB6_5: # %atomicrmw.start1152; RV32IA-NEXT:    # Parent Loop BB6_2 Depth=11153; RV32IA-NEXT:    # => This Inner Loop Header: Depth=21154; RV32IA-NEXT:    lr.w.aqrl a2, (a0)1155; RV32IA-NEXT:    bne a2, a3, .LBB6_71156; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start1157; RV32IA-NEXT:    # in Loop: Header=BB6_5 Depth=21158; RV32IA-NEXT:    sc.w.rl a5, a4, (a0)1159; RV32IA-NEXT:    bnez a5, .LBB6_51160; RV32IA-NEXT:  .LBB6_7: # %atomicrmw.start1161; RV32IA-NEXT:    # in Loop: Header=BB6_2 Depth=11162; RV32IA-NEXT:    beq a2, a3, .LBB6_41163; RV32IA-NEXT:  .LBB6_2: # %atomicrmw.start1164; RV32IA-NEXT:    # =>This Loop Header: Depth=11165; RV32IA-NEXT:    # Child Loop BB6_5 Depth 21166; RV32IA-NEXT:    mv a3, a21167; RV32IA-NEXT:    seqz a2, a21168; RV32IA-NEXT:    sltu a4, a1, a31169; RV32IA-NEXT:    or a2, a2, a41170; RV32IA-NEXT:    mv a4, a11171; RV32IA-NEXT:    bnez a2, .LBB6_11172; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start1173; RV32IA-NEXT:    # in Loop: Header=BB6_2 Depth=11174; RV32IA-NEXT:    addi a4, a3, -11175; RV32IA-NEXT:    j .LBB6_11176; RV32IA-NEXT:  .LBB6_4: # %atomicrmw.end1177; RV32IA-NEXT:    mv a0, a21178; RV32IA-NEXT:    ret1179;1180; RV64I-LABEL: atomicrmw_udec_wrap_i32:1181; RV64I:       # %bb.0:1182; RV64I-NEXT:    addi sp, sp, -481183; RV64I-NEXT:    .cfi_def_cfa_offset 481184; RV64I-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill1185; RV64I-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill1186; RV64I-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill1187; RV64I-NEXT:    sd s2, 16(sp) # 8-byte Folded Spill1188; RV64I-NEXT:    .cfi_offset ra, -81189; RV64I-NEXT:    .cfi_offset s0, -161190; RV64I-NEXT:    .cfi_offset s1, -241191; RV64I-NEXT:    .cfi_offset s2, -321192; RV64I-NEXT:    mv s0, a01193; RV64I-NEXT:    lw a3, 0(a0)1194; RV64I-NEXT:    mv s1, a11195; RV64I-NEXT:    sext.w s2, a11196; RV64I-NEXT:    j .LBB6_21197; RV64I-NEXT:  .LBB6_1: # %atomicrmw.start1198; RV64I-NEXT:    # in Loop: Header=BB6_2 Depth=11199; RV64I-NEXT:    sw a3, 12(sp)1200; RV64I-NEXT:    addi a1, sp, 121201; RV64I-NEXT:    li a3, 51202; RV64I-NEXT:    li a4, 51203; RV64I-NEXT:    mv a0, s01204; RV64I-NEXT:    call __atomic_compare_exchange_41205; RV64I-NEXT:    lw a3, 12(sp)1206; RV64I-NEXT:    bnez a0, .LBB6_41207; RV64I-NEXT:  .LBB6_2: # %atomicrmw.start1208; RV64I-NEXT:    # =>This Inner Loop Header: Depth=11209; RV64I-NEXT:    seqz a0, a31210; RV64I-NEXT:    sltu a1, s2, a31211; RV64I-NEXT:    or a0, a0, a11212; RV64I-NEXT:    mv a2, s11213; RV64I-NEXT:    bnez a0, .LBB6_11214; RV64I-NEXT:  # %bb.3: # %atomicrmw.start1215; RV64I-NEXT:    # in Loop: Header=BB6_2 Depth=11216; RV64I-NEXT:    addiw a2, a3, -11217; RV64I-NEXT:    j .LBB6_11218; RV64I-NEXT:  .LBB6_4: # %atomicrmw.end1219; RV64I-NEXT:    mv a0, a31220; RV64I-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload1221; RV64I-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload1222; RV64I-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload1223; RV64I-NEXT:    ld s2, 16(sp) # 8-byte Folded Reload1224; RV64I-NEXT:    .cfi_restore ra1225; RV64I-NEXT:    .cfi_restore s01226; RV64I-NEXT:    .cfi_restore s11227; RV64I-NEXT:    .cfi_restore s21228; RV64I-NEXT:    addi sp, sp, 481229; RV64I-NEXT:    .cfi_def_cfa_offset 01230; RV64I-NEXT:    ret1231;1232; RV64IA-LABEL: atomicrmw_udec_wrap_i32:1233; RV64IA:       # %bb.0:1234; RV64IA-NEXT:    lw a2, 0(a0)1235; RV64IA-NEXT:    sext.w a3, a11236; RV64IA-NEXT:    j .LBB6_21237; RV64IA-NEXT:  .LBB6_1: # %atomicrmw.start1238; RV64IA-NEXT:    # in Loop: Header=BB6_2 Depth=11239; RV64IA-NEXT:  .LBB6_5: # %atomicrmw.start1240; RV64IA-NEXT:    # Parent Loop BB6_2 Depth=11241; RV64IA-NEXT:    # => This Inner Loop Header: Depth=21242; RV64IA-NEXT:    lr.w.aqrl a2, (a0)1243; RV64IA-NEXT:    bne a2, a4, .LBB6_71244; RV64IA-NEXT:  # %bb.6: # %atomicrmw.start1245; RV64IA-NEXT:    # in Loop: Header=BB6_5 Depth=21246; RV64IA-NEXT:    sc.w.rl a6, a5, (a0)1247; RV64IA-NEXT:    bnez a6, .LBB6_51248; RV64IA-NEXT:  .LBB6_7: # %atomicrmw.start1249; RV64IA-NEXT:    # in Loop: Header=BB6_2 Depth=11250; RV64IA-NEXT:    beq a2, a4, .LBB6_41251; RV64IA-NEXT:  .LBB6_2: # %atomicrmw.start1252; RV64IA-NEXT:    # =>This Loop Header: Depth=11253; RV64IA-NEXT:    # Child Loop BB6_5 Depth 21254; RV64IA-NEXT:    sext.w a4, a21255; RV64IA-NEXT:    seqz a5, a41256; RV64IA-NEXT:    sltu a6, a3, a41257; RV64IA-NEXT:    or a6, a5, a61258; RV64IA-NEXT:    mv a5, a11259; RV64IA-NEXT:    bnez a6, .LBB6_11260; RV64IA-NEXT:  # %bb.3: # %atomicrmw.start1261; RV64IA-NEXT:    # in Loop: Header=BB6_2 Depth=11262; RV64IA-NEXT:    addiw a5, a2, -11263; RV64IA-NEXT:    j .LBB6_11264; RV64IA-NEXT:  .LBB6_4: # %atomicrmw.end1265; RV64IA-NEXT:    mv a0, a21266; RV64IA-NEXT:    ret1267  %result = atomicrmw udec_wrap ptr %ptr, i32 %val seq_cst1268  ret i32 %result1269}1270 1271define i64 @atomicrmw_udec_wrap_i64(ptr %ptr, i64 %val) {1272; RV32I-LABEL: atomicrmw_udec_wrap_i64:1273; RV32I:       # %bb.0:1274; RV32I-NEXT:    addi sp, sp, -321275; RV32I-NEXT:    .cfi_def_cfa_offset 321276; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill1277; RV32I-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill1278; RV32I-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill1279; RV32I-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill1280; RV32I-NEXT:    .cfi_offset ra, -41281; RV32I-NEXT:    .cfi_offset s0, -81282; RV32I-NEXT:    .cfi_offset s1, -121283; RV32I-NEXT:    .cfi_offset s2, -161284; RV32I-NEXT:    mv s0, a21285; RV32I-NEXT:    mv s1, a01286; RV32I-NEXT:    lw a5, 0(a0)1287; RV32I-NEXT:    lw a4, 4(a0)1288; RV32I-NEXT:    mv s2, a11289; RV32I-NEXT:    j .LBB7_21290; RV32I-NEXT:  .LBB7_1: # %atomicrmw.start1291; RV32I-NEXT:    # in Loop: Header=BB7_2 Depth=11292; RV32I-NEXT:    sw a5, 8(sp)1293; RV32I-NEXT:    sw a4, 12(sp)1294; RV32I-NEXT:    addi a1, sp, 81295; RV32I-NEXT:    li a4, 51296; RV32I-NEXT:    li a5, 51297; RV32I-NEXT:    mv a0, s11298; RV32I-NEXT:    call __atomic_compare_exchange_81299; RV32I-NEXT:    lw a5, 8(sp)1300; RV32I-NEXT:    lw a4, 12(sp)1301; RV32I-NEXT:    bnez a0, .LBB7_71302; RV32I-NEXT:  .LBB7_2: # %atomicrmw.start1303; RV32I-NEXT:    # =>This Inner Loop Header: Depth=11304; RV32I-NEXT:    beq a4, s0, .LBB7_41305; RV32I-NEXT:  # %bb.3: # %atomicrmw.start1306; RV32I-NEXT:    # in Loop: Header=BB7_2 Depth=11307; RV32I-NEXT:    sltu a0, s0, a41308; RV32I-NEXT:    j .LBB7_51309; RV32I-NEXT:  .LBB7_4: # in Loop: Header=BB7_2 Depth=11310; RV32I-NEXT:    sltu a0, s2, a51311; RV32I-NEXT:  .LBB7_5: # %atomicrmw.start1312; RV32I-NEXT:    # in Loop: Header=BB7_2 Depth=11313; RV32I-NEXT:    or a1, a5, a41314; RV32I-NEXT:    seqz a1, a11315; RV32I-NEXT:    or a0, a1, a01316; RV32I-NEXT:    mv a2, s21317; RV32I-NEXT:    mv a3, s01318; RV32I-NEXT:    bnez a0, .LBB7_11319; RV32I-NEXT:  # %bb.6: # %atomicrmw.start1320; RV32I-NEXT:    # in Loop: Header=BB7_2 Depth=11321; RV32I-NEXT:    seqz a0, a51322; RV32I-NEXT:    sub a3, a4, a01323; RV32I-NEXT:    addi a2, a5, -11324; RV32I-NEXT:    j .LBB7_11325; RV32I-NEXT:  .LBB7_7: # %atomicrmw.end1326; RV32I-NEXT:    mv a0, a51327; RV32I-NEXT:    mv a1, a41328; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload1329; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload1330; RV32I-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload1331; RV32I-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload1332; RV32I-NEXT:    .cfi_restore ra1333; RV32I-NEXT:    .cfi_restore s01334; RV32I-NEXT:    .cfi_restore s11335; RV32I-NEXT:    .cfi_restore s21336; RV32I-NEXT:    addi sp, sp, 321337; RV32I-NEXT:    .cfi_def_cfa_offset 01338; RV32I-NEXT:    ret1339;1340; RV32IA-LABEL: atomicrmw_udec_wrap_i64:1341; RV32IA:       # %bb.0:1342; RV32IA-NEXT:    addi sp, sp, -321343; RV32IA-NEXT:    .cfi_def_cfa_offset 321344; RV32IA-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill1345; RV32IA-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill1346; RV32IA-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill1347; RV32IA-NEXT:    sw s2, 16(sp) # 4-byte Folded Spill1348; RV32IA-NEXT:    .cfi_offset ra, -41349; RV32IA-NEXT:    .cfi_offset s0, -81350; RV32IA-NEXT:    .cfi_offset s1, -121351; RV32IA-NEXT:    .cfi_offset s2, -161352; RV32IA-NEXT:    mv s0, a21353; RV32IA-NEXT:    mv s1, a01354; RV32IA-NEXT:    lw a5, 0(a0)1355; RV32IA-NEXT:    lw a4, 4(a0)1356; RV32IA-NEXT:    mv s2, a11357; RV32IA-NEXT:    j .LBB7_21358; RV32IA-NEXT:  .LBB7_1: # %atomicrmw.start1359; RV32IA-NEXT:    # in Loop: Header=BB7_2 Depth=11360; RV32IA-NEXT:    sw a5, 8(sp)1361; RV32IA-NEXT:    sw a4, 12(sp)1362; RV32IA-NEXT:    addi a1, sp, 81363; RV32IA-NEXT:    li a4, 51364; RV32IA-NEXT:    li a5, 51365; RV32IA-NEXT:    mv a0, s11366; RV32IA-NEXT:    call __atomic_compare_exchange_81367; RV32IA-NEXT:    lw a5, 8(sp)1368; RV32IA-NEXT:    lw a4, 12(sp)1369; RV32IA-NEXT:    bnez a0, .LBB7_71370; RV32IA-NEXT:  .LBB7_2: # %atomicrmw.start1371; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=11372; RV32IA-NEXT:    beq a4, s0, .LBB7_41373; RV32IA-NEXT:  # %bb.3: # %atomicrmw.start1374; RV32IA-NEXT:    # in Loop: Header=BB7_2 Depth=11375; RV32IA-NEXT:    sltu a0, s0, a41376; RV32IA-NEXT:    j .LBB7_51377; RV32IA-NEXT:  .LBB7_4: # in Loop: Header=BB7_2 Depth=11378; RV32IA-NEXT:    sltu a0, s2, a51379; RV32IA-NEXT:  .LBB7_5: # %atomicrmw.start1380; RV32IA-NEXT:    # in Loop: Header=BB7_2 Depth=11381; RV32IA-NEXT:    or a1, a5, a41382; RV32IA-NEXT:    seqz a1, a11383; RV32IA-NEXT:    or a0, a1, a01384; RV32IA-NEXT:    mv a2, s21385; RV32IA-NEXT:    mv a3, s01386; RV32IA-NEXT:    bnez a0, .LBB7_11387; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start1388; RV32IA-NEXT:    # in Loop: Header=BB7_2 Depth=11389; RV32IA-NEXT:    seqz a0, a51390; RV32IA-NEXT:    sub a3, a4, a01391; RV32IA-NEXT:    addi a2, a5, -11392; RV32IA-NEXT:    j .LBB7_11393; RV32IA-NEXT:  .LBB7_7: # %atomicrmw.end1394; RV32IA-NEXT:    mv a0, a51395; RV32IA-NEXT:    mv a1, a41396; RV32IA-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload1397; RV32IA-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload1398; RV32IA-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload1399; RV32IA-NEXT:    lw s2, 16(sp) # 4-byte Folded Reload1400; RV32IA-NEXT:    .cfi_restore ra1401; RV32IA-NEXT:    .cfi_restore s01402; RV32IA-NEXT:    .cfi_restore s11403; RV32IA-NEXT:    .cfi_restore s21404; RV32IA-NEXT:    addi sp, sp, 321405; RV32IA-NEXT:    .cfi_def_cfa_offset 01406; RV32IA-NEXT:    ret1407;1408; RV64I-LABEL: atomicrmw_udec_wrap_i64:1409; RV64I:       # %bb.0:1410; RV64I-NEXT:    addi sp, sp, -321411; RV64I-NEXT:    .cfi_def_cfa_offset 321412; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill1413; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill1414; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill1415; RV64I-NEXT:    .cfi_offset ra, -81416; RV64I-NEXT:    .cfi_offset s0, -161417; RV64I-NEXT:    .cfi_offset s1, -241418; RV64I-NEXT:    mv s0, a01419; RV64I-NEXT:    ld a3, 0(a0)1420; RV64I-NEXT:    mv s1, a11421; RV64I-NEXT:    j .LBB7_21422; RV64I-NEXT:  .LBB7_1: # %atomicrmw.start1423; RV64I-NEXT:    # in Loop: Header=BB7_2 Depth=11424; RV64I-NEXT:    sd a3, 0(sp)1425; RV64I-NEXT:    mv a1, sp1426; RV64I-NEXT:    li a3, 51427; RV64I-NEXT:    li a4, 51428; RV64I-NEXT:    mv a0, s01429; RV64I-NEXT:    call __atomic_compare_exchange_81430; RV64I-NEXT:    ld a3, 0(sp)1431; RV64I-NEXT:    bnez a0, .LBB7_41432; RV64I-NEXT:  .LBB7_2: # %atomicrmw.start1433; RV64I-NEXT:    # =>This Inner Loop Header: Depth=11434; RV64I-NEXT:    seqz a0, a31435; RV64I-NEXT:    sltu a1, s1, a31436; RV64I-NEXT:    or a0, a0, a11437; RV64I-NEXT:    mv a2, s11438; RV64I-NEXT:    bnez a0, .LBB7_11439; RV64I-NEXT:  # %bb.3: # %atomicrmw.start1440; RV64I-NEXT:    # in Loop: Header=BB7_2 Depth=11441; RV64I-NEXT:    addi a2, a3, -11442; RV64I-NEXT:    j .LBB7_11443; RV64I-NEXT:  .LBB7_4: # %atomicrmw.end1444; RV64I-NEXT:    mv a0, a31445; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload1446; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload1447; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload1448; RV64I-NEXT:    .cfi_restore ra1449; RV64I-NEXT:    .cfi_restore s01450; RV64I-NEXT:    .cfi_restore s11451; RV64I-NEXT:    addi sp, sp, 321452; RV64I-NEXT:    .cfi_def_cfa_offset 01453; RV64I-NEXT:    ret1454;1455; RV64IA-LABEL: atomicrmw_udec_wrap_i64:1456; RV64IA:       # %bb.0:1457; RV64IA-NEXT:    ld a2, 0(a0)1458; RV64IA-NEXT:    j .LBB7_21459; RV64IA-NEXT:  .LBB7_1: # %atomicrmw.start1460; RV64IA-NEXT:    # in Loop: Header=BB7_2 Depth=11461; RV64IA-NEXT:  .LBB7_5: # %atomicrmw.start1462; RV64IA-NEXT:    # Parent Loop BB7_2 Depth=11463; RV64IA-NEXT:    # => This Inner Loop Header: Depth=21464; RV64IA-NEXT:    lr.d.aqrl a2, (a0)1465; RV64IA-NEXT:    bne a2, a3, .LBB7_71466; RV64IA-NEXT:  # %bb.6: # %atomicrmw.start1467; RV64IA-NEXT:    # in Loop: Header=BB7_5 Depth=21468; RV64IA-NEXT:    sc.d.rl a5, a4, (a0)1469; RV64IA-NEXT:    bnez a5, .LBB7_51470; RV64IA-NEXT:  .LBB7_7: # %atomicrmw.start1471; RV64IA-NEXT:    # in Loop: Header=BB7_2 Depth=11472; RV64IA-NEXT:    beq a2, a3, .LBB7_41473; RV64IA-NEXT:  .LBB7_2: # %atomicrmw.start1474; RV64IA-NEXT:    # =>This Loop Header: Depth=11475; RV64IA-NEXT:    # Child Loop BB7_5 Depth 21476; RV64IA-NEXT:    mv a3, a21477; RV64IA-NEXT:    seqz a2, a21478; RV64IA-NEXT:    sltu a4, a1, a31479; RV64IA-NEXT:    or a2, a2, a41480; RV64IA-NEXT:    mv a4, a11481; RV64IA-NEXT:    bnez a2, .LBB7_11482; RV64IA-NEXT:  # %bb.3: # %atomicrmw.start1483; RV64IA-NEXT:    # in Loop: Header=BB7_2 Depth=11484; RV64IA-NEXT:    addi a4, a3, -11485; RV64IA-NEXT:    j .LBB7_11486; RV64IA-NEXT:  .LBB7_4: # %atomicrmw.end1487; RV64IA-NEXT:    mv a0, a21488; RV64IA-NEXT:    ret1489  %result = atomicrmw udec_wrap ptr %ptr, i64 %val seq_cst1490  ret i64 %result1491}1492