; RV32I-NEXT: sw s2, 20(sp)
; RV32I-NEXT: sw s3, 16(sp)
; RV32I-NEXT: sw s4, 12(sp)
-; RV32I-NEXT: sw s5, 8(sp)
; RV32I-NEXT: mv s2, a1
; RV32I-NEXT: mv s4, a0
; RV32I-NEXT: lbu a0, 0(a0)
; RV32I-NEXT: slli a1, a1, 24
-; RV32I-NEXT: srai s5, a1, 24
-; RV32I-NEXT: addi s3, sp, 7
-; RV32I-NEXT: addi s1, zero, 2
+; RV32I-NEXT: srai s1, a1, 24
+; RV32I-NEXT: addi s3, sp, 11
; RV32I-NEXT: .LBB36_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: slli a1, a0, 24
; RV32I-NEXT: srai a1, a1, 24
; RV32I-NEXT: mv a2, a0
-; RV32I-NEXT: blt s5, a1, .LBB36_3
+; RV32I-NEXT: blt s1, a1, .LBB36_3
; RV32I-NEXT: # %bb.2: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB36_1 Depth=1
; RV32I-NEXT: mv a2, s2
; RV32I-NEXT: .LBB36_3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB36_1 Depth=1
-; RV32I-NEXT: sb a0, 7(sp)
+; RV32I-NEXT: sb a0, 11(sp)
; RV32I-NEXT: mv a0, s4
; RV32I-NEXT: mv a1, s3
-; RV32I-NEXT: mv a3, s1
-; RV32I-NEXT: mv a4, s1
+; RV32I-NEXT: addi a3, zero, 2
+; RV32I-NEXT: addi a4, zero, 2
; RV32I-NEXT: call __atomic_compare_exchange_1
; RV32I-NEXT: mv a1, a0
-; RV32I-NEXT: lb a0, 7(sp)
+; RV32I-NEXT: lb a0, 11(sp)
; RV32I-NEXT: beqz a1, .LBB36_1
; RV32I-NEXT: # %bb.4: # %atomicrmw.end
-; RV32I-NEXT: lw s5, 8(sp)
; RV32I-NEXT: lw s4, 12(sp)
; RV32I-NEXT: lw s3, 16(sp)
; RV32I-NEXT: lw s2, 20(sp)
;
; RV64I-LABEL: atomicrmw_max_i8_acquire:
; RV64I: # %bb.0:
-; RV64I-NEXT: addi sp, sp, -64
-; RV64I-NEXT: sd ra, 56(sp)
-; RV64I-NEXT: sd s1, 48(sp)
-; RV64I-NEXT: sd s2, 40(sp)
-; RV64I-NEXT: sd s3, 32(sp)
-; RV64I-NEXT: sd s4, 24(sp)
-; RV64I-NEXT: sd s5, 16(sp)
+; RV64I-NEXT: addi sp, sp, -48
+; RV64I-NEXT: sd ra, 40(sp)
+; RV64I-NEXT: sd s1, 32(sp)
+; RV64I-NEXT: sd s2, 24(sp)
+; RV64I-NEXT: sd s3, 16(sp)
+; RV64I-NEXT: sd s4, 8(sp)
; RV64I-NEXT: mv s2, a1
; RV64I-NEXT: mv s4, a0
; RV64I-NEXT: lbu a0, 0(a0)
; RV64I-NEXT: slli a1, a1, 56
-; RV64I-NEXT: srai s5, a1, 56
-; RV64I-NEXT: addi s3, sp, 15
-; RV64I-NEXT: addi s1, zero, 2
+; RV64I-NEXT: srai s1, a1, 56
+; RV64I-NEXT: addi s3, sp, 7
; RV64I-NEXT: .LBB36_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: slli a1, a0, 56
; RV64I-NEXT: srai a1, a1, 56
; RV64I-NEXT: mv a2, a0
-; RV64I-NEXT: blt s5, a1, .LBB36_3
+; RV64I-NEXT: blt s1, a1, .LBB36_3
; RV64I-NEXT: # %bb.2: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB36_1 Depth=1
; RV64I-NEXT: mv a2, s2
; RV64I-NEXT: .LBB36_3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB36_1 Depth=1
-; RV64I-NEXT: sb a0, 15(sp)
+; RV64I-NEXT: sb a0, 7(sp)
; RV64I-NEXT: mv a0, s4
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s1
-; RV64I-NEXT: mv a4, s1
+; RV64I-NEXT: addi a3, zero, 2
+; RV64I-NEXT: addi a4, zero, 2
; RV64I-NEXT: call __atomic_compare_exchange_1
; RV64I-NEXT: mv a1, a0
-; RV64I-NEXT: lb a0, 15(sp)
+; RV64I-NEXT: lb a0, 7(sp)
; RV64I-NEXT: beqz a1, .LBB36_1
; RV64I-NEXT: # %bb.4: # %atomicrmw.end
-; RV64I-NEXT: ld s5, 16(sp)
-; RV64I-NEXT: ld s4, 24(sp)
-; RV64I-NEXT: ld s3, 32(sp)
-; RV64I-NEXT: ld s2, 40(sp)
-; RV64I-NEXT: ld s1, 48(sp)
-; RV64I-NEXT: ld ra, 56(sp)
-; RV64I-NEXT: addi sp, sp, 64
+; RV64I-NEXT: ld s4, 8(sp)
+; RV64I-NEXT: ld s3, 16(sp)
+; RV64I-NEXT: ld s2, 24(sp)
+; RV64I-NEXT: ld s1, 32(sp)
+; RV64I-NEXT: ld ra, 40(sp)
+; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_max_i8_acquire:
; RV32I-NEXT: sw s2, 20(sp)
; RV32I-NEXT: sw s3, 16(sp)
; RV32I-NEXT: sw s4, 12(sp)
-; RV32I-NEXT: sw s5, 8(sp)
; RV32I-NEXT: mv s2, a1
-; RV32I-NEXT: mv s5, a0
+; RV32I-NEXT: mv s4, a0
; RV32I-NEXT: lbu a0, 0(a0)
; RV32I-NEXT: slli a1, a1, 24
; RV32I-NEXT: srai s1, a1, 24
-; RV32I-NEXT: addi s3, sp, 7
-; RV32I-NEXT: addi s4, zero, 3
+; RV32I-NEXT: addi s3, sp, 11
; RV32I-NEXT: .LBB37_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: slli a1, a0, 24
; RV32I-NEXT: mv a2, s2
; RV32I-NEXT: .LBB37_3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB37_1 Depth=1
-; RV32I-NEXT: sb a0, 7(sp)
-; RV32I-NEXT: mv a0, s5
+; RV32I-NEXT: sb a0, 11(sp)
+; RV32I-NEXT: mv a0, s4
; RV32I-NEXT: mv a1, s3
-; RV32I-NEXT: mv a3, s4
+; RV32I-NEXT: addi a3, zero, 3
; RV32I-NEXT: mv a4, zero
; RV32I-NEXT: call __atomic_compare_exchange_1
; RV32I-NEXT: mv a1, a0
-; RV32I-NEXT: lb a0, 7(sp)
+; RV32I-NEXT: lb a0, 11(sp)
; RV32I-NEXT: beqz a1, .LBB37_1
; RV32I-NEXT: # %bb.4: # %atomicrmw.end
-; RV32I-NEXT: lw s5, 8(sp)
; RV32I-NEXT: lw s4, 12(sp)
; RV32I-NEXT: lw s3, 16(sp)
; RV32I-NEXT: lw s2, 20(sp)
;
; RV64I-LABEL: atomicrmw_max_i8_release:
; RV64I: # %bb.0:
-; RV64I-NEXT: addi sp, sp, -64
-; RV64I-NEXT: sd ra, 56(sp)
-; RV64I-NEXT: sd s1, 48(sp)
-; RV64I-NEXT: sd s2, 40(sp)
-; RV64I-NEXT: sd s3, 32(sp)
-; RV64I-NEXT: sd s4, 24(sp)
-; RV64I-NEXT: sd s5, 16(sp)
+; RV64I-NEXT: addi sp, sp, -48
+; RV64I-NEXT: sd ra, 40(sp)
+; RV64I-NEXT: sd s1, 32(sp)
+; RV64I-NEXT: sd s2, 24(sp)
+; RV64I-NEXT: sd s3, 16(sp)
+; RV64I-NEXT: sd s4, 8(sp)
; RV64I-NEXT: mv s2, a1
-; RV64I-NEXT: mv s5, a0
+; RV64I-NEXT: mv s4, a0
; RV64I-NEXT: lbu a0, 0(a0)
; RV64I-NEXT: slli a1, a1, 56
; RV64I-NEXT: srai s1, a1, 56
-; RV64I-NEXT: addi s3, sp, 15
-; RV64I-NEXT: addi s4, zero, 3
+; RV64I-NEXT: addi s3, sp, 7
; RV64I-NEXT: .LBB37_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: slli a1, a0, 56
; RV64I-NEXT: mv a2, s2
; RV64I-NEXT: .LBB37_3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB37_1 Depth=1
-; RV64I-NEXT: sb a0, 15(sp)
-; RV64I-NEXT: mv a0, s5
+; RV64I-NEXT: sb a0, 7(sp)
+; RV64I-NEXT: mv a0, s4
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s4
+; RV64I-NEXT: addi a3, zero, 3
; RV64I-NEXT: mv a4, zero
; RV64I-NEXT: call __atomic_compare_exchange_1
; RV64I-NEXT: mv a1, a0
-; RV64I-NEXT: lb a0, 15(sp)
+; RV64I-NEXT: lb a0, 7(sp)
; RV64I-NEXT: beqz a1, .LBB37_1
; RV64I-NEXT: # %bb.4: # %atomicrmw.end
-; RV64I-NEXT: ld s5, 16(sp)
-; RV64I-NEXT: ld s4, 24(sp)
-; RV64I-NEXT: ld s3, 32(sp)
-; RV64I-NEXT: ld s2, 40(sp)
-; RV64I-NEXT: ld s1, 48(sp)
-; RV64I-NEXT: ld ra, 56(sp)
-; RV64I-NEXT: addi sp, sp, 64
+; RV64I-NEXT: ld s4, 8(sp)
+; RV64I-NEXT: ld s3, 16(sp)
+; RV64I-NEXT: ld s2, 24(sp)
+; RV64I-NEXT: ld s1, 32(sp)
+; RV64I-NEXT: ld ra, 40(sp)
+; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_max_i8_release:
; RV32I-NEXT: sw s2, 20(sp)
; RV32I-NEXT: sw s3, 16(sp)
; RV32I-NEXT: sw s4, 12(sp)
-; RV32I-NEXT: sw s5, 8(sp)
-; RV32I-NEXT: sw s6, 4(sp)
; RV32I-NEXT: mv s2, a1
-; RV32I-NEXT: mv s6, a0
+; RV32I-NEXT: mv s4, a0
; RV32I-NEXT: lbu a0, 0(a0)
; RV32I-NEXT: slli a1, a1, 24
; RV32I-NEXT: srai s1, a1, 24
-; RV32I-NEXT: addi s3, sp, 3
-; RV32I-NEXT: addi s4, zero, 4
-; RV32I-NEXT: addi s5, zero, 2
+; RV32I-NEXT: addi s3, sp, 11
; RV32I-NEXT: .LBB38_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: slli a1, a0, 24
; RV32I-NEXT: mv a2, s2
; RV32I-NEXT: .LBB38_3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB38_1 Depth=1
-; RV32I-NEXT: sb a0, 3(sp)
-; RV32I-NEXT: mv a0, s6
+; RV32I-NEXT: sb a0, 11(sp)
+; RV32I-NEXT: mv a0, s4
; RV32I-NEXT: mv a1, s3
-; RV32I-NEXT: mv a3, s4
-; RV32I-NEXT: mv a4, s5
+; RV32I-NEXT: addi a3, zero, 4
+; RV32I-NEXT: addi a4, zero, 2
; RV32I-NEXT: call __atomic_compare_exchange_1
; RV32I-NEXT: mv a1, a0
-; RV32I-NEXT: lb a0, 3(sp)
+; RV32I-NEXT: lb a0, 11(sp)
; RV32I-NEXT: beqz a1, .LBB38_1
; RV32I-NEXT: # %bb.4: # %atomicrmw.end
-; RV32I-NEXT: lw s6, 4(sp)
-; RV32I-NEXT: lw s5, 8(sp)
; RV32I-NEXT: lw s4, 12(sp)
; RV32I-NEXT: lw s3, 16(sp)
; RV32I-NEXT: lw s2, 20(sp)
;
; RV64I-LABEL: atomicrmw_max_i8_acq_rel:
; RV64I: # %bb.0:
-; RV64I-NEXT: addi sp, sp, -64
-; RV64I-NEXT: sd ra, 56(sp)
-; RV64I-NEXT: sd s1, 48(sp)
-; RV64I-NEXT: sd s2, 40(sp)
-; RV64I-NEXT: sd s3, 32(sp)
-; RV64I-NEXT: sd s4, 24(sp)
-; RV64I-NEXT: sd s5, 16(sp)
-; RV64I-NEXT: sd s6, 8(sp)
+; RV64I-NEXT: addi sp, sp, -48
+; RV64I-NEXT: sd ra, 40(sp)
+; RV64I-NEXT: sd s1, 32(sp)
+; RV64I-NEXT: sd s2, 24(sp)
+; RV64I-NEXT: sd s3, 16(sp)
+; RV64I-NEXT: sd s4, 8(sp)
; RV64I-NEXT: mv s2, a1
-; RV64I-NEXT: mv s6, a0
+; RV64I-NEXT: mv s4, a0
; RV64I-NEXT: lbu a0, 0(a0)
; RV64I-NEXT: slli a1, a1, 56
; RV64I-NEXT: srai s1, a1, 56
; RV64I-NEXT: addi s3, sp, 7
-; RV64I-NEXT: addi s4, zero, 4
-; RV64I-NEXT: addi s5, zero, 2
; RV64I-NEXT: .LBB38_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: slli a1, a0, 56
; RV64I-NEXT: .LBB38_3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB38_1 Depth=1
; RV64I-NEXT: sb a0, 7(sp)
-; RV64I-NEXT: mv a0, s6
+; RV64I-NEXT: mv a0, s4
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s4
-; RV64I-NEXT: mv a4, s5
+; RV64I-NEXT: addi a3, zero, 4
+; RV64I-NEXT: addi a4, zero, 2
; RV64I-NEXT: call __atomic_compare_exchange_1
; RV64I-NEXT: mv a1, a0
; RV64I-NEXT: lb a0, 7(sp)
; RV64I-NEXT: beqz a1, .LBB38_1
; RV64I-NEXT: # %bb.4: # %atomicrmw.end
-; RV64I-NEXT: ld s6, 8(sp)
-; RV64I-NEXT: ld s5, 16(sp)
-; RV64I-NEXT: ld s4, 24(sp)
-; RV64I-NEXT: ld s3, 32(sp)
-; RV64I-NEXT: ld s2, 40(sp)
-; RV64I-NEXT: ld s1, 48(sp)
-; RV64I-NEXT: ld ra, 56(sp)
-; RV64I-NEXT: addi sp, sp, 64
+; RV64I-NEXT: ld s4, 8(sp)
+; RV64I-NEXT: ld s3, 16(sp)
+; RV64I-NEXT: ld s2, 24(sp)
+; RV64I-NEXT: ld s1, 32(sp)
+; RV64I-NEXT: ld ra, 40(sp)
+; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_max_i8_acq_rel:
; RV32I-NEXT: sw s2, 20(sp)
; RV32I-NEXT: sw s3, 16(sp)
; RV32I-NEXT: sw s4, 12(sp)
-; RV32I-NEXT: sw s5, 8(sp)
; RV32I-NEXT: mv s2, a1
; RV32I-NEXT: mv s4, a0
; RV32I-NEXT: lbu a0, 0(a0)
; RV32I-NEXT: slli a1, a1, 24
-; RV32I-NEXT: srai s5, a1, 24
-; RV32I-NEXT: addi s3, sp, 7
-; RV32I-NEXT: addi s1, zero, 5
+; RV32I-NEXT: srai s1, a1, 24
+; RV32I-NEXT: addi s3, sp, 11
; RV32I-NEXT: .LBB39_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: slli a1, a0, 24
; RV32I-NEXT: srai a1, a1, 24
; RV32I-NEXT: mv a2, a0
-; RV32I-NEXT: blt s5, a1, .LBB39_3
+; RV32I-NEXT: blt s1, a1, .LBB39_3
; RV32I-NEXT: # %bb.2: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB39_1 Depth=1
; RV32I-NEXT: mv a2, s2
; RV32I-NEXT: .LBB39_3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB39_1 Depth=1
-; RV32I-NEXT: sb a0, 7(sp)
+; RV32I-NEXT: sb a0, 11(sp)
; RV32I-NEXT: mv a0, s4
; RV32I-NEXT: mv a1, s3
-; RV32I-NEXT: mv a3, s1
-; RV32I-NEXT: mv a4, s1
+; RV32I-NEXT: addi a3, zero, 5
+; RV32I-NEXT: addi a4, zero, 5
; RV32I-NEXT: call __atomic_compare_exchange_1
; RV32I-NEXT: mv a1, a0
-; RV32I-NEXT: lb a0, 7(sp)
+; RV32I-NEXT: lb a0, 11(sp)
; RV32I-NEXT: beqz a1, .LBB39_1
; RV32I-NEXT: # %bb.4: # %atomicrmw.end
-; RV32I-NEXT: lw s5, 8(sp)
; RV32I-NEXT: lw s4, 12(sp)
; RV32I-NEXT: lw s3, 16(sp)
; RV32I-NEXT: lw s2, 20(sp)
;
; RV64I-LABEL: atomicrmw_max_i8_seq_cst:
; RV64I: # %bb.0:
-; RV64I-NEXT: addi sp, sp, -64
-; RV64I-NEXT: sd ra, 56(sp)
-; RV64I-NEXT: sd s1, 48(sp)
-; RV64I-NEXT: sd s2, 40(sp)
-; RV64I-NEXT: sd s3, 32(sp)
-; RV64I-NEXT: sd s4, 24(sp)
-; RV64I-NEXT: sd s5, 16(sp)
+; RV64I-NEXT: addi sp, sp, -48
+; RV64I-NEXT: sd ra, 40(sp)
+; RV64I-NEXT: sd s1, 32(sp)
+; RV64I-NEXT: sd s2, 24(sp)
+; RV64I-NEXT: sd s3, 16(sp)
+; RV64I-NEXT: sd s4, 8(sp)
; RV64I-NEXT: mv s2, a1
; RV64I-NEXT: mv s4, a0
; RV64I-NEXT: lbu a0, 0(a0)
; RV64I-NEXT: slli a1, a1, 56
-; RV64I-NEXT: srai s5, a1, 56
-; RV64I-NEXT: addi s3, sp, 15
-; RV64I-NEXT: addi s1, zero, 5
+; RV64I-NEXT: srai s1, a1, 56
+; RV64I-NEXT: addi s3, sp, 7
; RV64I-NEXT: .LBB39_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: slli a1, a0, 56
; RV64I-NEXT: srai a1, a1, 56
; RV64I-NEXT: mv a2, a0
-; RV64I-NEXT: blt s5, a1, .LBB39_3
+; RV64I-NEXT: blt s1, a1, .LBB39_3
; RV64I-NEXT: # %bb.2: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB39_1 Depth=1
; RV64I-NEXT: mv a2, s2
; RV64I-NEXT: .LBB39_3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB39_1 Depth=1
-; RV64I-NEXT: sb a0, 15(sp)
+; RV64I-NEXT: sb a0, 7(sp)
; RV64I-NEXT: mv a0, s4
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s1
-; RV64I-NEXT: mv a4, s1
+; RV64I-NEXT: addi a3, zero, 5
+; RV64I-NEXT: addi a4, zero, 5
; RV64I-NEXT: call __atomic_compare_exchange_1
; RV64I-NEXT: mv a1, a0
-; RV64I-NEXT: lb a0, 15(sp)
+; RV64I-NEXT: lb a0, 7(sp)
; RV64I-NEXT: beqz a1, .LBB39_1
; RV64I-NEXT: # %bb.4: # %atomicrmw.end
-; RV64I-NEXT: ld s5, 16(sp)
-; RV64I-NEXT: ld s4, 24(sp)
-; RV64I-NEXT: ld s3, 32(sp)
-; RV64I-NEXT: ld s2, 40(sp)
-; RV64I-NEXT: ld s1, 48(sp)
-; RV64I-NEXT: ld ra, 56(sp)
-; RV64I-NEXT: addi sp, sp, 64
+; RV64I-NEXT: ld s4, 8(sp)
+; RV64I-NEXT: ld s3, 16(sp)
+; RV64I-NEXT: ld s2, 24(sp)
+; RV64I-NEXT: ld s1, 32(sp)
+; RV64I-NEXT: ld ra, 40(sp)
+; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_max_i8_seq_cst:
; RV32I-NEXT: sw s2, 20(sp)
; RV32I-NEXT: sw s3, 16(sp)
; RV32I-NEXT: sw s4, 12(sp)
-; RV32I-NEXT: sw s5, 8(sp)
; RV32I-NEXT: mv s2, a1
; RV32I-NEXT: mv s4, a0
; RV32I-NEXT: lbu a0, 0(a0)
; RV32I-NEXT: slli a1, a1, 24
-; RV32I-NEXT: srai s5, a1, 24
-; RV32I-NEXT: addi s3, sp, 7
-; RV32I-NEXT: addi s1, zero, 2
+; RV32I-NEXT: srai s1, a1, 24
+; RV32I-NEXT: addi s3, sp, 11
; RV32I-NEXT: .LBB41_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: slli a1, a0, 24
; RV32I-NEXT: srai a1, a1, 24
; RV32I-NEXT: mv a2, a0
-; RV32I-NEXT: bge s5, a1, .LBB41_3
+; RV32I-NEXT: bge s1, a1, .LBB41_3
; RV32I-NEXT: # %bb.2: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB41_1 Depth=1
; RV32I-NEXT: mv a2, s2
; RV32I-NEXT: .LBB41_3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB41_1 Depth=1
-; RV32I-NEXT: sb a0, 7(sp)
+; RV32I-NEXT: sb a0, 11(sp)
; RV32I-NEXT: mv a0, s4
; RV32I-NEXT: mv a1, s3
-; RV32I-NEXT: mv a3, s1
-; RV32I-NEXT: mv a4, s1
+; RV32I-NEXT: addi a3, zero, 2
+; RV32I-NEXT: addi a4, zero, 2
; RV32I-NEXT: call __atomic_compare_exchange_1
; RV32I-NEXT: mv a1, a0
-; RV32I-NEXT: lb a0, 7(sp)
+; RV32I-NEXT: lb a0, 11(sp)
; RV32I-NEXT: beqz a1, .LBB41_1
; RV32I-NEXT: # %bb.4: # %atomicrmw.end
-; RV32I-NEXT: lw s5, 8(sp)
; RV32I-NEXT: lw s4, 12(sp)
; RV32I-NEXT: lw s3, 16(sp)
; RV32I-NEXT: lw s2, 20(sp)
;
; RV64I-LABEL: atomicrmw_min_i8_acquire:
; RV64I: # %bb.0:
-; RV64I-NEXT: addi sp, sp, -64
-; RV64I-NEXT: sd ra, 56(sp)
-; RV64I-NEXT: sd s1, 48(sp)
-; RV64I-NEXT: sd s2, 40(sp)
-; RV64I-NEXT: sd s3, 32(sp)
-; RV64I-NEXT: sd s4, 24(sp)
-; RV64I-NEXT: sd s5, 16(sp)
+; RV64I-NEXT: addi sp, sp, -48
+; RV64I-NEXT: sd ra, 40(sp)
+; RV64I-NEXT: sd s1, 32(sp)
+; RV64I-NEXT: sd s2, 24(sp)
+; RV64I-NEXT: sd s3, 16(sp)
+; RV64I-NEXT: sd s4, 8(sp)
; RV64I-NEXT: mv s2, a1
; RV64I-NEXT: mv s4, a0
; RV64I-NEXT: lbu a0, 0(a0)
; RV64I-NEXT: slli a1, a1, 56
-; RV64I-NEXT: srai s5, a1, 56
-; RV64I-NEXT: addi s3, sp, 15
-; RV64I-NEXT: addi s1, zero, 2
+; RV64I-NEXT: srai s1, a1, 56
+; RV64I-NEXT: addi s3, sp, 7
; RV64I-NEXT: .LBB41_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: slli a1, a0, 56
; RV64I-NEXT: srai a1, a1, 56
; RV64I-NEXT: mv a2, a0
-; RV64I-NEXT: bge s5, a1, .LBB41_3
+; RV64I-NEXT: bge s1, a1, .LBB41_3
; RV64I-NEXT: # %bb.2: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB41_1 Depth=1
; RV64I-NEXT: mv a2, s2
; RV64I-NEXT: .LBB41_3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB41_1 Depth=1
-; RV64I-NEXT: sb a0, 15(sp)
+; RV64I-NEXT: sb a0, 7(sp)
; RV64I-NEXT: mv a0, s4
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s1
-; RV64I-NEXT: mv a4, s1
+; RV64I-NEXT: addi a3, zero, 2
+; RV64I-NEXT: addi a4, zero, 2
; RV64I-NEXT: call __atomic_compare_exchange_1
; RV64I-NEXT: mv a1, a0
-; RV64I-NEXT: lb a0, 15(sp)
+; RV64I-NEXT: lb a0, 7(sp)
; RV64I-NEXT: beqz a1, .LBB41_1
; RV64I-NEXT: # %bb.4: # %atomicrmw.end
-; RV64I-NEXT: ld s5, 16(sp)
-; RV64I-NEXT: ld s4, 24(sp)
-; RV64I-NEXT: ld s3, 32(sp)
-; RV64I-NEXT: ld s2, 40(sp)
-; RV64I-NEXT: ld s1, 48(sp)
-; RV64I-NEXT: ld ra, 56(sp)
-; RV64I-NEXT: addi sp, sp, 64
+; RV64I-NEXT: ld s4, 8(sp)
+; RV64I-NEXT: ld s3, 16(sp)
+; RV64I-NEXT: ld s2, 24(sp)
+; RV64I-NEXT: ld s1, 32(sp)
+; RV64I-NEXT: ld ra, 40(sp)
+; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_min_i8_acquire:
; RV32I-NEXT: sw s2, 20(sp)
; RV32I-NEXT: sw s3, 16(sp)
; RV32I-NEXT: sw s4, 12(sp)
-; RV32I-NEXT: sw s5, 8(sp)
; RV32I-NEXT: mv s2, a1
-; RV32I-NEXT: mv s5, a0
+; RV32I-NEXT: mv s4, a0
; RV32I-NEXT: lbu a0, 0(a0)
; RV32I-NEXT: slli a1, a1, 24
; RV32I-NEXT: srai s1, a1, 24
-; RV32I-NEXT: addi s3, sp, 7
-; RV32I-NEXT: addi s4, zero, 3
+; RV32I-NEXT: addi s3, sp, 11
; RV32I-NEXT: .LBB42_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: slli a1, a0, 24
; RV32I-NEXT: mv a2, s2
; RV32I-NEXT: .LBB42_3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB42_1 Depth=1
-; RV32I-NEXT: sb a0, 7(sp)
-; RV32I-NEXT: mv a0, s5
+; RV32I-NEXT: sb a0, 11(sp)
+; RV32I-NEXT: mv a0, s4
; RV32I-NEXT: mv a1, s3
-; RV32I-NEXT: mv a3, s4
+; RV32I-NEXT: addi a3, zero, 3
; RV32I-NEXT: mv a4, zero
; RV32I-NEXT: call __atomic_compare_exchange_1
; RV32I-NEXT: mv a1, a0
-; RV32I-NEXT: lb a0, 7(sp)
+; RV32I-NEXT: lb a0, 11(sp)
; RV32I-NEXT: beqz a1, .LBB42_1
; RV32I-NEXT: # %bb.4: # %atomicrmw.end
-; RV32I-NEXT: lw s5, 8(sp)
; RV32I-NEXT: lw s4, 12(sp)
; RV32I-NEXT: lw s3, 16(sp)
; RV32I-NEXT: lw s2, 20(sp)
;
; RV64I-LABEL: atomicrmw_min_i8_release:
; RV64I: # %bb.0:
-; RV64I-NEXT: addi sp, sp, -64
-; RV64I-NEXT: sd ra, 56(sp)
-; RV64I-NEXT: sd s1, 48(sp)
-; RV64I-NEXT: sd s2, 40(sp)
-; RV64I-NEXT: sd s3, 32(sp)
-; RV64I-NEXT: sd s4, 24(sp)
-; RV64I-NEXT: sd s5, 16(sp)
+; RV64I-NEXT: addi sp, sp, -48
+; RV64I-NEXT: sd ra, 40(sp)
+; RV64I-NEXT: sd s1, 32(sp)
+; RV64I-NEXT: sd s2, 24(sp)
+; RV64I-NEXT: sd s3, 16(sp)
+; RV64I-NEXT: sd s4, 8(sp)
; RV64I-NEXT: mv s2, a1
-; RV64I-NEXT: mv s5, a0
+; RV64I-NEXT: mv s4, a0
; RV64I-NEXT: lbu a0, 0(a0)
; RV64I-NEXT: slli a1, a1, 56
; RV64I-NEXT: srai s1, a1, 56
-; RV64I-NEXT: addi s3, sp, 15
-; RV64I-NEXT: addi s4, zero, 3
+; RV64I-NEXT: addi s3, sp, 7
; RV64I-NEXT: .LBB42_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: slli a1, a0, 56
; RV64I-NEXT: mv a2, s2
; RV64I-NEXT: .LBB42_3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB42_1 Depth=1
-; RV64I-NEXT: sb a0, 15(sp)
-; RV64I-NEXT: mv a0, s5
+; RV64I-NEXT: sb a0, 7(sp)
+; RV64I-NEXT: mv a0, s4
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s4
+; RV64I-NEXT: addi a3, zero, 3
; RV64I-NEXT: mv a4, zero
; RV64I-NEXT: call __atomic_compare_exchange_1
; RV64I-NEXT: mv a1, a0
-; RV64I-NEXT: lb a0, 15(sp)
+; RV64I-NEXT: lb a0, 7(sp)
; RV64I-NEXT: beqz a1, .LBB42_1
; RV64I-NEXT: # %bb.4: # %atomicrmw.end
-; RV64I-NEXT: ld s5, 16(sp)
-; RV64I-NEXT: ld s4, 24(sp)
-; RV64I-NEXT: ld s3, 32(sp)
-; RV64I-NEXT: ld s2, 40(sp)
-; RV64I-NEXT: ld s1, 48(sp)
-; RV64I-NEXT: ld ra, 56(sp)
-; RV64I-NEXT: addi sp, sp, 64
+; RV64I-NEXT: ld s4, 8(sp)
+; RV64I-NEXT: ld s3, 16(sp)
+; RV64I-NEXT: ld s2, 24(sp)
+; RV64I-NEXT: ld s1, 32(sp)
+; RV64I-NEXT: ld ra, 40(sp)
+; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_min_i8_release:
; RV32I-NEXT: sw s2, 20(sp)
; RV32I-NEXT: sw s3, 16(sp)
; RV32I-NEXT: sw s4, 12(sp)
-; RV32I-NEXT: sw s5, 8(sp)
-; RV32I-NEXT: sw s6, 4(sp)
; RV32I-NEXT: mv s2, a1
-; RV32I-NEXT: mv s6, a0
+; RV32I-NEXT: mv s4, a0
; RV32I-NEXT: lbu a0, 0(a0)
; RV32I-NEXT: slli a1, a1, 24
; RV32I-NEXT: srai s1, a1, 24
-; RV32I-NEXT: addi s3, sp, 3
-; RV32I-NEXT: addi s4, zero, 4
-; RV32I-NEXT: addi s5, zero, 2
+; RV32I-NEXT: addi s3, sp, 11
; RV32I-NEXT: .LBB43_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: slli a1, a0, 24
; RV32I-NEXT: mv a2, s2
; RV32I-NEXT: .LBB43_3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB43_1 Depth=1
-; RV32I-NEXT: sb a0, 3(sp)
-; RV32I-NEXT: mv a0, s6
+; RV32I-NEXT: sb a0, 11(sp)
+; RV32I-NEXT: mv a0, s4
; RV32I-NEXT: mv a1, s3
-; RV32I-NEXT: mv a3, s4
-; RV32I-NEXT: mv a4, s5
+; RV32I-NEXT: addi a3, zero, 4
+; RV32I-NEXT: addi a4, zero, 2
; RV32I-NEXT: call __atomic_compare_exchange_1
; RV32I-NEXT: mv a1, a0
-; RV32I-NEXT: lb a0, 3(sp)
+; RV32I-NEXT: lb a0, 11(sp)
; RV32I-NEXT: beqz a1, .LBB43_1
; RV32I-NEXT: # %bb.4: # %atomicrmw.end
-; RV32I-NEXT: lw s6, 4(sp)
-; RV32I-NEXT: lw s5, 8(sp)
; RV32I-NEXT: lw s4, 12(sp)
; RV32I-NEXT: lw s3, 16(sp)
; RV32I-NEXT: lw s2, 20(sp)
;
; RV64I-LABEL: atomicrmw_min_i8_acq_rel:
; RV64I: # %bb.0:
-; RV64I-NEXT: addi sp, sp, -64
-; RV64I-NEXT: sd ra, 56(sp)
-; RV64I-NEXT: sd s1, 48(sp)
-; RV64I-NEXT: sd s2, 40(sp)
-; RV64I-NEXT: sd s3, 32(sp)
-; RV64I-NEXT: sd s4, 24(sp)
-; RV64I-NEXT: sd s5, 16(sp)
-; RV64I-NEXT: sd s6, 8(sp)
+; RV64I-NEXT: addi sp, sp, -48
+; RV64I-NEXT: sd ra, 40(sp)
+; RV64I-NEXT: sd s1, 32(sp)
+; RV64I-NEXT: sd s2, 24(sp)
+; RV64I-NEXT: sd s3, 16(sp)
+; RV64I-NEXT: sd s4, 8(sp)
; RV64I-NEXT: mv s2, a1
-; RV64I-NEXT: mv s6, a0
+; RV64I-NEXT: mv s4, a0
; RV64I-NEXT: lbu a0, 0(a0)
; RV64I-NEXT: slli a1, a1, 56
; RV64I-NEXT: srai s1, a1, 56
; RV64I-NEXT: addi s3, sp, 7
-; RV64I-NEXT: addi s4, zero, 4
-; RV64I-NEXT: addi s5, zero, 2
; RV64I-NEXT: .LBB43_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: slli a1, a0, 56
; RV64I-NEXT: .LBB43_3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB43_1 Depth=1
; RV64I-NEXT: sb a0, 7(sp)
-; RV64I-NEXT: mv a0, s6
+; RV64I-NEXT: mv a0, s4
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s4
-; RV64I-NEXT: mv a4, s5
+; RV64I-NEXT: addi a3, zero, 4
+; RV64I-NEXT: addi a4, zero, 2
; RV64I-NEXT: call __atomic_compare_exchange_1
; RV64I-NEXT: mv a1, a0
; RV64I-NEXT: lb a0, 7(sp)
; RV64I-NEXT: beqz a1, .LBB43_1
; RV64I-NEXT: # %bb.4: # %atomicrmw.end
-; RV64I-NEXT: ld s6, 8(sp)
-; RV64I-NEXT: ld s5, 16(sp)
-; RV64I-NEXT: ld s4, 24(sp)
-; RV64I-NEXT: ld s3, 32(sp)
-; RV64I-NEXT: ld s2, 40(sp)
-; RV64I-NEXT: ld s1, 48(sp)
-; RV64I-NEXT: ld ra, 56(sp)
-; RV64I-NEXT: addi sp, sp, 64
+; RV64I-NEXT: ld s4, 8(sp)
+; RV64I-NEXT: ld s3, 16(sp)
+; RV64I-NEXT: ld s2, 24(sp)
+; RV64I-NEXT: ld s1, 32(sp)
+; RV64I-NEXT: ld ra, 40(sp)
+; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_min_i8_acq_rel:
; RV32I-NEXT: sw s2, 20(sp)
; RV32I-NEXT: sw s3, 16(sp)
; RV32I-NEXT: sw s4, 12(sp)
-; RV32I-NEXT: sw s5, 8(sp)
; RV32I-NEXT: mv s2, a1
; RV32I-NEXT: mv s4, a0
; RV32I-NEXT: lbu a0, 0(a0)
; RV32I-NEXT: slli a1, a1, 24
-; RV32I-NEXT: srai s5, a1, 24
-; RV32I-NEXT: addi s3, sp, 7
-; RV32I-NEXT: addi s1, zero, 5
+; RV32I-NEXT: srai s1, a1, 24
+; RV32I-NEXT: addi s3, sp, 11
; RV32I-NEXT: .LBB44_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: slli a1, a0, 24
; RV32I-NEXT: srai a1, a1, 24
; RV32I-NEXT: mv a2, a0
-; RV32I-NEXT: bge s5, a1, .LBB44_3
+; RV32I-NEXT: bge s1, a1, .LBB44_3
; RV32I-NEXT: # %bb.2: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB44_1 Depth=1
; RV32I-NEXT: mv a2, s2
; RV32I-NEXT: .LBB44_3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB44_1 Depth=1
-; RV32I-NEXT: sb a0, 7(sp)
+; RV32I-NEXT: sb a0, 11(sp)
; RV32I-NEXT: mv a0, s4
; RV32I-NEXT: mv a1, s3
-; RV32I-NEXT: mv a3, s1
-; RV32I-NEXT: mv a4, s1
+; RV32I-NEXT: addi a3, zero, 5
+; RV32I-NEXT: addi a4, zero, 5
; RV32I-NEXT: call __atomic_compare_exchange_1
; RV32I-NEXT: mv a1, a0
-; RV32I-NEXT: lb a0, 7(sp)
+; RV32I-NEXT: lb a0, 11(sp)
; RV32I-NEXT: beqz a1, .LBB44_1
; RV32I-NEXT: # %bb.4: # %atomicrmw.end
-; RV32I-NEXT: lw s5, 8(sp)
; RV32I-NEXT: lw s4, 12(sp)
; RV32I-NEXT: lw s3, 16(sp)
; RV32I-NEXT: lw s2, 20(sp)
;
; RV64I-LABEL: atomicrmw_min_i8_seq_cst:
; RV64I: # %bb.0:
-; RV64I-NEXT: addi sp, sp, -64
-; RV64I-NEXT: sd ra, 56(sp)
-; RV64I-NEXT: sd s1, 48(sp)
-; RV64I-NEXT: sd s2, 40(sp)
-; RV64I-NEXT: sd s3, 32(sp)
-; RV64I-NEXT: sd s4, 24(sp)
-; RV64I-NEXT: sd s5, 16(sp)
+; RV64I-NEXT: addi sp, sp, -48
+; RV64I-NEXT: sd ra, 40(sp)
+; RV64I-NEXT: sd s1, 32(sp)
+; RV64I-NEXT: sd s2, 24(sp)
+; RV64I-NEXT: sd s3, 16(sp)
+; RV64I-NEXT: sd s4, 8(sp)
; RV64I-NEXT: mv s2, a1
; RV64I-NEXT: mv s4, a0
; RV64I-NEXT: lbu a0, 0(a0)
; RV64I-NEXT: slli a1, a1, 56
-; RV64I-NEXT: srai s5, a1, 56
-; RV64I-NEXT: addi s3, sp, 15
-; RV64I-NEXT: addi s1, zero, 5
+; RV64I-NEXT: srai s1, a1, 56
+; RV64I-NEXT: addi s3, sp, 7
; RV64I-NEXT: .LBB44_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: slli a1, a0, 56
; RV64I-NEXT: srai a1, a1, 56
; RV64I-NEXT: mv a2, a0
-; RV64I-NEXT: bge s5, a1, .LBB44_3
+; RV64I-NEXT: bge s1, a1, .LBB44_3
; RV64I-NEXT: # %bb.2: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB44_1 Depth=1
; RV64I-NEXT: mv a2, s2
; RV64I-NEXT: .LBB44_3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB44_1 Depth=1
-; RV64I-NEXT: sb a0, 15(sp)
+; RV64I-NEXT: sb a0, 7(sp)
; RV64I-NEXT: mv a0, s4
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s1
-; RV64I-NEXT: mv a4, s1
+; RV64I-NEXT: addi a3, zero, 5
+; RV64I-NEXT: addi a4, zero, 5
; RV64I-NEXT: call __atomic_compare_exchange_1
; RV64I-NEXT: mv a1, a0
-; RV64I-NEXT: lb a0, 15(sp)
+; RV64I-NEXT: lb a0, 7(sp)
; RV64I-NEXT: beqz a1, .LBB44_1
; RV64I-NEXT: # %bb.4: # %atomicrmw.end
-; RV64I-NEXT: ld s5, 16(sp)
-; RV64I-NEXT: ld s4, 24(sp)
-; RV64I-NEXT: ld s3, 32(sp)
-; RV64I-NEXT: ld s2, 40(sp)
-; RV64I-NEXT: ld s1, 48(sp)
-; RV64I-NEXT: ld ra, 56(sp)
-; RV64I-NEXT: addi sp, sp, 64
+; RV64I-NEXT: ld s4, 8(sp)
+; RV64I-NEXT: ld s3, 16(sp)
+; RV64I-NEXT: ld s2, 24(sp)
+; RV64I-NEXT: ld s1, 32(sp)
+; RV64I-NEXT: ld ra, 40(sp)
+; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_min_i8_seq_cst:
; RV32I-NEXT: sw s2, 20(sp)
; RV32I-NEXT: sw s3, 16(sp)
; RV32I-NEXT: sw s4, 12(sp)
-; RV32I-NEXT: sw s5, 8(sp)
; RV32I-NEXT: mv s2, a1
; RV32I-NEXT: mv s4, a0
; RV32I-NEXT: lbu a0, 0(a0)
-; RV32I-NEXT: andi s5, a1, 255
-; RV32I-NEXT: addi s3, sp, 7
-; RV32I-NEXT: addi s1, zero, 2
+; RV32I-NEXT: andi s1, a1, 255
+; RV32I-NEXT: addi s3, sp, 11
; RV32I-NEXT: .LBB46_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: andi a1, a0, 255
; RV32I-NEXT: mv a2, a0
-; RV32I-NEXT: bltu s5, a1, .LBB46_3
+; RV32I-NEXT: bltu s1, a1, .LBB46_3
; RV32I-NEXT: # %bb.2: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB46_1 Depth=1
; RV32I-NEXT: mv a2, s2
; RV32I-NEXT: .LBB46_3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB46_1 Depth=1
-; RV32I-NEXT: sb a0, 7(sp)
+; RV32I-NEXT: sb a0, 11(sp)
; RV32I-NEXT: mv a0, s4
; RV32I-NEXT: mv a1, s3
-; RV32I-NEXT: mv a3, s1
-; RV32I-NEXT: mv a4, s1
+; RV32I-NEXT: addi a3, zero, 2
+; RV32I-NEXT: addi a4, zero, 2
; RV32I-NEXT: call __atomic_compare_exchange_1
; RV32I-NEXT: mv a1, a0
-; RV32I-NEXT: lb a0, 7(sp)
+; RV32I-NEXT: lb a0, 11(sp)
; RV32I-NEXT: beqz a1, .LBB46_1
; RV32I-NEXT: # %bb.4: # %atomicrmw.end
-; RV32I-NEXT: lw s5, 8(sp)
; RV32I-NEXT: lw s4, 12(sp)
; RV32I-NEXT: lw s3, 16(sp)
; RV32I-NEXT: lw s2, 20(sp)
;
; RV64I-LABEL: atomicrmw_umax_i8_acquire:
; RV64I: # %bb.0:
-; RV64I-NEXT: addi sp, sp, -64
-; RV64I-NEXT: sd ra, 56(sp)
-; RV64I-NEXT: sd s1, 48(sp)
-; RV64I-NEXT: sd s2, 40(sp)
-; RV64I-NEXT: sd s3, 32(sp)
-; RV64I-NEXT: sd s4, 24(sp)
-; RV64I-NEXT: sd s5, 16(sp)
+; RV64I-NEXT: addi sp, sp, -48
+; RV64I-NEXT: sd ra, 40(sp)
+; RV64I-NEXT: sd s1, 32(sp)
+; RV64I-NEXT: sd s2, 24(sp)
+; RV64I-NEXT: sd s3, 16(sp)
+; RV64I-NEXT: sd s4, 8(sp)
; RV64I-NEXT: mv s2, a1
; RV64I-NEXT: mv s4, a0
; RV64I-NEXT: lbu a0, 0(a0)
-; RV64I-NEXT: andi s5, a1, 255
-; RV64I-NEXT: addi s3, sp, 15
-; RV64I-NEXT: addi s1, zero, 2
+; RV64I-NEXT: andi s1, a1, 255
+; RV64I-NEXT: addi s3, sp, 7
; RV64I-NEXT: .LBB46_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: andi a1, a0, 255
; RV64I-NEXT: mv a2, a0
-; RV64I-NEXT: bltu s5, a1, .LBB46_3
+; RV64I-NEXT: bltu s1, a1, .LBB46_3
; RV64I-NEXT: # %bb.2: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB46_1 Depth=1
; RV64I-NEXT: mv a2, s2
; RV64I-NEXT: .LBB46_3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB46_1 Depth=1
-; RV64I-NEXT: sb a0, 15(sp)
+; RV64I-NEXT: sb a0, 7(sp)
; RV64I-NEXT: mv a0, s4
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s1
-; RV64I-NEXT: mv a4, s1
+; RV64I-NEXT: addi a3, zero, 2
+; RV64I-NEXT: addi a4, zero, 2
; RV64I-NEXT: call __atomic_compare_exchange_1
; RV64I-NEXT: mv a1, a0
-; RV64I-NEXT: lb a0, 15(sp)
+; RV64I-NEXT: lb a0, 7(sp)
; RV64I-NEXT: beqz a1, .LBB46_1
; RV64I-NEXT: # %bb.4: # %atomicrmw.end
-; RV64I-NEXT: ld s5, 16(sp)
-; RV64I-NEXT: ld s4, 24(sp)
-; RV64I-NEXT: ld s3, 32(sp)
-; RV64I-NEXT: ld s2, 40(sp)
-; RV64I-NEXT: ld s1, 48(sp)
-; RV64I-NEXT: ld ra, 56(sp)
-; RV64I-NEXT: addi sp, sp, 64
+; RV64I-NEXT: ld s4, 8(sp)
+; RV64I-NEXT: ld s3, 16(sp)
+; RV64I-NEXT: ld s2, 24(sp)
+; RV64I-NEXT: ld s1, 32(sp)
+; RV64I-NEXT: ld ra, 40(sp)
+; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_umax_i8_acquire:
; RV32I-NEXT: sw s2, 20(sp)
; RV32I-NEXT: sw s3, 16(sp)
; RV32I-NEXT: sw s4, 12(sp)
-; RV32I-NEXT: sw s5, 8(sp)
; RV32I-NEXT: mv s2, a1
-; RV32I-NEXT: mv s5, a0
+; RV32I-NEXT: mv s4, a0
; RV32I-NEXT: lbu a0, 0(a0)
; RV32I-NEXT: andi s1, a1, 255
-; RV32I-NEXT: addi s3, sp, 7
-; RV32I-NEXT: addi s4, zero, 3
+; RV32I-NEXT: addi s3, sp, 11
; RV32I-NEXT: .LBB47_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: andi a1, a0, 255
; RV32I-NEXT: mv a2, s2
; RV32I-NEXT: .LBB47_3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB47_1 Depth=1
-; RV32I-NEXT: sb a0, 7(sp)
-; RV32I-NEXT: mv a0, s5
+; RV32I-NEXT: sb a0, 11(sp)
+; RV32I-NEXT: mv a0, s4
; RV32I-NEXT: mv a1, s3
-; RV32I-NEXT: mv a3, s4
+; RV32I-NEXT: addi a3, zero, 3
; RV32I-NEXT: mv a4, zero
; RV32I-NEXT: call __atomic_compare_exchange_1
; RV32I-NEXT: mv a1, a0
-; RV32I-NEXT: lb a0, 7(sp)
+; RV32I-NEXT: lb a0, 11(sp)
; RV32I-NEXT: beqz a1, .LBB47_1
; RV32I-NEXT: # %bb.4: # %atomicrmw.end
-; RV32I-NEXT: lw s5, 8(sp)
; RV32I-NEXT: lw s4, 12(sp)
; RV32I-NEXT: lw s3, 16(sp)
; RV32I-NEXT: lw s2, 20(sp)
;
; RV64I-LABEL: atomicrmw_umax_i8_release:
; RV64I: # %bb.0:
-; RV64I-NEXT: addi sp, sp, -64
-; RV64I-NEXT: sd ra, 56(sp)
-; RV64I-NEXT: sd s1, 48(sp)
-; RV64I-NEXT: sd s2, 40(sp)
-; RV64I-NEXT: sd s3, 32(sp)
-; RV64I-NEXT: sd s4, 24(sp)
-; RV64I-NEXT: sd s5, 16(sp)
+; RV64I-NEXT: addi sp, sp, -48
+; RV64I-NEXT: sd ra, 40(sp)
+; RV64I-NEXT: sd s1, 32(sp)
+; RV64I-NEXT: sd s2, 24(sp)
+; RV64I-NEXT: sd s3, 16(sp)
+; RV64I-NEXT: sd s4, 8(sp)
; RV64I-NEXT: mv s2, a1
-; RV64I-NEXT: mv s5, a0
+; RV64I-NEXT: mv s4, a0
; RV64I-NEXT: lbu a0, 0(a0)
; RV64I-NEXT: andi s1, a1, 255
-; RV64I-NEXT: addi s3, sp, 15
-; RV64I-NEXT: addi s4, zero, 3
+; RV64I-NEXT: addi s3, sp, 7
; RV64I-NEXT: .LBB47_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: andi a1, a0, 255
; RV64I-NEXT: mv a2, s2
; RV64I-NEXT: .LBB47_3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB47_1 Depth=1
-; RV64I-NEXT: sb a0, 15(sp)
-; RV64I-NEXT: mv a0, s5
+; RV64I-NEXT: sb a0, 7(sp)
+; RV64I-NEXT: mv a0, s4
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s4
+; RV64I-NEXT: addi a3, zero, 3
; RV64I-NEXT: mv a4, zero
; RV64I-NEXT: call __atomic_compare_exchange_1
; RV64I-NEXT: mv a1, a0
-; RV64I-NEXT: lb a0, 15(sp)
+; RV64I-NEXT: lb a0, 7(sp)
; RV64I-NEXT: beqz a1, .LBB47_1
; RV64I-NEXT: # %bb.4: # %atomicrmw.end
-; RV64I-NEXT: ld s5, 16(sp)
-; RV64I-NEXT: ld s4, 24(sp)
-; RV64I-NEXT: ld s3, 32(sp)
-; RV64I-NEXT: ld s2, 40(sp)
-; RV64I-NEXT: ld s1, 48(sp)
-; RV64I-NEXT: ld ra, 56(sp)
-; RV64I-NEXT: addi sp, sp, 64
+; RV64I-NEXT: ld s4, 8(sp)
+; RV64I-NEXT: ld s3, 16(sp)
+; RV64I-NEXT: ld s2, 24(sp)
+; RV64I-NEXT: ld s1, 32(sp)
+; RV64I-NEXT: ld ra, 40(sp)
+; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_umax_i8_release:
; RV32I-NEXT: sw s2, 20(sp)
; RV32I-NEXT: sw s3, 16(sp)
; RV32I-NEXT: sw s4, 12(sp)
-; RV32I-NEXT: sw s5, 8(sp)
-; RV32I-NEXT: sw s6, 4(sp)
; RV32I-NEXT: mv s2, a1
-; RV32I-NEXT: mv s6, a0
+; RV32I-NEXT: mv s4, a0
; RV32I-NEXT: lbu a0, 0(a0)
; RV32I-NEXT: andi s1, a1, 255
-; RV32I-NEXT: addi s3, sp, 3
-; RV32I-NEXT: addi s4, zero, 4
-; RV32I-NEXT: addi s5, zero, 2
+; RV32I-NEXT: addi s3, sp, 11
; RV32I-NEXT: .LBB48_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: andi a1, a0, 255
; RV32I-NEXT: mv a2, s2
; RV32I-NEXT: .LBB48_3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB48_1 Depth=1
-; RV32I-NEXT: sb a0, 3(sp)
-; RV32I-NEXT: mv a0, s6
+; RV32I-NEXT: sb a0, 11(sp)
+; RV32I-NEXT: mv a0, s4
; RV32I-NEXT: mv a1, s3
-; RV32I-NEXT: mv a3, s4
-; RV32I-NEXT: mv a4, s5
+; RV32I-NEXT: addi a3, zero, 4
+; RV32I-NEXT: addi a4, zero, 2
; RV32I-NEXT: call __atomic_compare_exchange_1
; RV32I-NEXT: mv a1, a0
-; RV32I-NEXT: lb a0, 3(sp)
+; RV32I-NEXT: lb a0, 11(sp)
; RV32I-NEXT: beqz a1, .LBB48_1
; RV32I-NEXT: # %bb.4: # %atomicrmw.end
-; RV32I-NEXT: lw s6, 4(sp)
-; RV32I-NEXT: lw s5, 8(sp)
; RV32I-NEXT: lw s4, 12(sp)
; RV32I-NEXT: lw s3, 16(sp)
; RV32I-NEXT: lw s2, 20(sp)
;
; RV64I-LABEL: atomicrmw_umax_i8_acq_rel:
; RV64I: # %bb.0:
-; RV64I-NEXT: addi sp, sp, -64
-; RV64I-NEXT: sd ra, 56(sp)
-; RV64I-NEXT: sd s1, 48(sp)
-; RV64I-NEXT: sd s2, 40(sp)
-; RV64I-NEXT: sd s3, 32(sp)
-; RV64I-NEXT: sd s4, 24(sp)
-; RV64I-NEXT: sd s5, 16(sp)
-; RV64I-NEXT: sd s6, 8(sp)
+; RV64I-NEXT: addi sp, sp, -48
+; RV64I-NEXT: sd ra, 40(sp)
+; RV64I-NEXT: sd s1, 32(sp)
+; RV64I-NEXT: sd s2, 24(sp)
+; RV64I-NEXT: sd s3, 16(sp)
+; RV64I-NEXT: sd s4, 8(sp)
; RV64I-NEXT: mv s2, a1
-; RV64I-NEXT: mv s6, a0
+; RV64I-NEXT: mv s4, a0
; RV64I-NEXT: lbu a0, 0(a0)
; RV64I-NEXT: andi s1, a1, 255
; RV64I-NEXT: addi s3, sp, 7
-; RV64I-NEXT: addi s4, zero, 4
-; RV64I-NEXT: addi s5, zero, 2
; RV64I-NEXT: .LBB48_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: andi a1, a0, 255
; RV64I-NEXT: .LBB48_3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB48_1 Depth=1
; RV64I-NEXT: sb a0, 7(sp)
-; RV64I-NEXT: mv a0, s6
+; RV64I-NEXT: mv a0, s4
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s4
-; RV64I-NEXT: mv a4, s5
+; RV64I-NEXT: addi a3, zero, 4
+; RV64I-NEXT: addi a4, zero, 2
; RV64I-NEXT: call __atomic_compare_exchange_1
; RV64I-NEXT: mv a1, a0
; RV64I-NEXT: lb a0, 7(sp)
; RV64I-NEXT: beqz a1, .LBB48_1
; RV64I-NEXT: # %bb.4: # %atomicrmw.end
-; RV64I-NEXT: ld s6, 8(sp)
-; RV64I-NEXT: ld s5, 16(sp)
-; RV64I-NEXT: ld s4, 24(sp)
-; RV64I-NEXT: ld s3, 32(sp)
-; RV64I-NEXT: ld s2, 40(sp)
-; RV64I-NEXT: ld s1, 48(sp)
-; RV64I-NEXT: ld ra, 56(sp)
-; RV64I-NEXT: addi sp, sp, 64
+; RV64I-NEXT: ld s4, 8(sp)
+; RV64I-NEXT: ld s3, 16(sp)
+; RV64I-NEXT: ld s2, 24(sp)
+; RV64I-NEXT: ld s1, 32(sp)
+; RV64I-NEXT: ld ra, 40(sp)
+; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_umax_i8_acq_rel:
; RV32I-NEXT: sw s2, 20(sp)
; RV32I-NEXT: sw s3, 16(sp)
; RV32I-NEXT: sw s4, 12(sp)
-; RV32I-NEXT: sw s5, 8(sp)
; RV32I-NEXT: mv s2, a1
; RV32I-NEXT: mv s4, a0
; RV32I-NEXT: lbu a0, 0(a0)
-; RV32I-NEXT: andi s5, a1, 255
-; RV32I-NEXT: addi s3, sp, 7
-; RV32I-NEXT: addi s1, zero, 5
+; RV32I-NEXT: andi s1, a1, 255
+; RV32I-NEXT: addi s3, sp, 11
; RV32I-NEXT: .LBB49_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: andi a1, a0, 255
; RV32I-NEXT: mv a2, a0
-; RV32I-NEXT: bltu s5, a1, .LBB49_3
+; RV32I-NEXT: bltu s1, a1, .LBB49_3
; RV32I-NEXT: # %bb.2: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB49_1 Depth=1
; RV32I-NEXT: mv a2, s2
; RV32I-NEXT: .LBB49_3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB49_1 Depth=1
-; RV32I-NEXT: sb a0, 7(sp)
+; RV32I-NEXT: sb a0, 11(sp)
; RV32I-NEXT: mv a0, s4
; RV32I-NEXT: mv a1, s3
-; RV32I-NEXT: mv a3, s1
-; RV32I-NEXT: mv a4, s1
+; RV32I-NEXT: addi a3, zero, 5
+; RV32I-NEXT: addi a4, zero, 5
; RV32I-NEXT: call __atomic_compare_exchange_1
; RV32I-NEXT: mv a1, a0
-; RV32I-NEXT: lb a0, 7(sp)
+; RV32I-NEXT: lb a0, 11(sp)
; RV32I-NEXT: beqz a1, .LBB49_1
; RV32I-NEXT: # %bb.4: # %atomicrmw.end
-; RV32I-NEXT: lw s5, 8(sp)
; RV32I-NEXT: lw s4, 12(sp)
; RV32I-NEXT: lw s3, 16(sp)
; RV32I-NEXT: lw s2, 20(sp)
;
; RV64I-LABEL: atomicrmw_umax_i8_seq_cst:
; RV64I: # %bb.0:
-; RV64I-NEXT: addi sp, sp, -64
-; RV64I-NEXT: sd ra, 56(sp)
-; RV64I-NEXT: sd s1, 48(sp)
-; RV64I-NEXT: sd s2, 40(sp)
-; RV64I-NEXT: sd s3, 32(sp)
-; RV64I-NEXT: sd s4, 24(sp)
-; RV64I-NEXT: sd s5, 16(sp)
+; RV64I-NEXT: addi sp, sp, -48
+; RV64I-NEXT: sd ra, 40(sp)
+; RV64I-NEXT: sd s1, 32(sp)
+; RV64I-NEXT: sd s2, 24(sp)
+; RV64I-NEXT: sd s3, 16(sp)
+; RV64I-NEXT: sd s4, 8(sp)
; RV64I-NEXT: mv s2, a1
; RV64I-NEXT: mv s4, a0
; RV64I-NEXT: lbu a0, 0(a0)
-; RV64I-NEXT: andi s5, a1, 255
-; RV64I-NEXT: addi s3, sp, 15
-; RV64I-NEXT: addi s1, zero, 5
+; RV64I-NEXT: andi s1, a1, 255
+; RV64I-NEXT: addi s3, sp, 7
; RV64I-NEXT: .LBB49_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: andi a1, a0, 255
; RV64I-NEXT: mv a2, a0
-; RV64I-NEXT: bltu s5, a1, .LBB49_3
+; RV64I-NEXT: bltu s1, a1, .LBB49_3
; RV64I-NEXT: # %bb.2: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB49_1 Depth=1
; RV64I-NEXT: mv a2, s2
; RV64I-NEXT: .LBB49_3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB49_1 Depth=1
-; RV64I-NEXT: sb a0, 15(sp)
+; RV64I-NEXT: sb a0, 7(sp)
; RV64I-NEXT: mv a0, s4
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s1
-; RV64I-NEXT: mv a4, s1
+; RV64I-NEXT: addi a3, zero, 5
+; RV64I-NEXT: addi a4, zero, 5
; RV64I-NEXT: call __atomic_compare_exchange_1
; RV64I-NEXT: mv a1, a0
-; RV64I-NEXT: lb a0, 15(sp)
+; RV64I-NEXT: lb a0, 7(sp)
; RV64I-NEXT: beqz a1, .LBB49_1
; RV64I-NEXT: # %bb.4: # %atomicrmw.end
-; RV64I-NEXT: ld s5, 16(sp)
-; RV64I-NEXT: ld s4, 24(sp)
-; RV64I-NEXT: ld s3, 32(sp)
-; RV64I-NEXT: ld s2, 40(sp)
-; RV64I-NEXT: ld s1, 48(sp)
-; RV64I-NEXT: ld ra, 56(sp)
-; RV64I-NEXT: addi sp, sp, 64
+; RV64I-NEXT: ld s4, 8(sp)
+; RV64I-NEXT: ld s3, 16(sp)
+; RV64I-NEXT: ld s2, 24(sp)
+; RV64I-NEXT: ld s1, 32(sp)
+; RV64I-NEXT: ld ra, 40(sp)
+; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_umax_i8_seq_cst:
; RV32I-NEXT: sw s2, 20(sp)
; RV32I-NEXT: sw s3, 16(sp)
; RV32I-NEXT: sw s4, 12(sp)
-; RV32I-NEXT: sw s5, 8(sp)
; RV32I-NEXT: mv s2, a1
; RV32I-NEXT: mv s4, a0
; RV32I-NEXT: lbu a0, 0(a0)
-; RV32I-NEXT: andi s5, a1, 255
-; RV32I-NEXT: addi s3, sp, 7
-; RV32I-NEXT: addi s1, zero, 2
+; RV32I-NEXT: andi s1, a1, 255
+; RV32I-NEXT: addi s3, sp, 11
; RV32I-NEXT: .LBB51_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: andi a1, a0, 255
; RV32I-NEXT: mv a2, a0
-; RV32I-NEXT: bgeu s5, a1, .LBB51_3
+; RV32I-NEXT: bgeu s1, a1, .LBB51_3
; RV32I-NEXT: # %bb.2: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB51_1 Depth=1
; RV32I-NEXT: mv a2, s2
; RV32I-NEXT: .LBB51_3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB51_1 Depth=1
-; RV32I-NEXT: sb a0, 7(sp)
+; RV32I-NEXT: sb a0, 11(sp)
; RV32I-NEXT: mv a0, s4
; RV32I-NEXT: mv a1, s3
-; RV32I-NEXT: mv a3, s1
-; RV32I-NEXT: mv a4, s1
+; RV32I-NEXT: addi a3, zero, 2
+; RV32I-NEXT: addi a4, zero, 2
; RV32I-NEXT: call __atomic_compare_exchange_1
; RV32I-NEXT: mv a1, a0
-; RV32I-NEXT: lb a0, 7(sp)
+; RV32I-NEXT: lb a0, 11(sp)
; RV32I-NEXT: beqz a1, .LBB51_1
; RV32I-NEXT: # %bb.4: # %atomicrmw.end
-; RV32I-NEXT: lw s5, 8(sp)
; RV32I-NEXT: lw s4, 12(sp)
; RV32I-NEXT: lw s3, 16(sp)
; RV32I-NEXT: lw s2, 20(sp)
;
; RV64I-LABEL: atomicrmw_umin_i8_acquire:
; RV64I: # %bb.0:
-; RV64I-NEXT: addi sp, sp, -64
-; RV64I-NEXT: sd ra, 56(sp)
-; RV64I-NEXT: sd s1, 48(sp)
-; RV64I-NEXT: sd s2, 40(sp)
-; RV64I-NEXT: sd s3, 32(sp)
-; RV64I-NEXT: sd s4, 24(sp)
-; RV64I-NEXT: sd s5, 16(sp)
+; RV64I-NEXT: addi sp, sp, -48
+; RV64I-NEXT: sd ra, 40(sp)
+; RV64I-NEXT: sd s1, 32(sp)
+; RV64I-NEXT: sd s2, 24(sp)
+; RV64I-NEXT: sd s3, 16(sp)
+; RV64I-NEXT: sd s4, 8(sp)
; RV64I-NEXT: mv s2, a1
; RV64I-NEXT: mv s4, a0
; RV64I-NEXT: lbu a0, 0(a0)
-; RV64I-NEXT: andi s5, a1, 255
-; RV64I-NEXT: addi s3, sp, 15
-; RV64I-NEXT: addi s1, zero, 2
+; RV64I-NEXT: andi s1, a1, 255
+; RV64I-NEXT: addi s3, sp, 7
; RV64I-NEXT: .LBB51_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: andi a1, a0, 255
; RV64I-NEXT: mv a2, a0
-; RV64I-NEXT: bgeu s5, a1, .LBB51_3
+; RV64I-NEXT: bgeu s1, a1, .LBB51_3
; RV64I-NEXT: # %bb.2: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB51_1 Depth=1
; RV64I-NEXT: mv a2, s2
; RV64I-NEXT: .LBB51_3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB51_1 Depth=1
-; RV64I-NEXT: sb a0, 15(sp)
+; RV64I-NEXT: sb a0, 7(sp)
; RV64I-NEXT: mv a0, s4
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s1
-; RV64I-NEXT: mv a4, s1
+; RV64I-NEXT: addi a3, zero, 2
+; RV64I-NEXT: addi a4, zero, 2
; RV64I-NEXT: call __atomic_compare_exchange_1
; RV64I-NEXT: mv a1, a0
-; RV64I-NEXT: lb a0, 15(sp)
+; RV64I-NEXT: lb a0, 7(sp)
; RV64I-NEXT: beqz a1, .LBB51_1
; RV64I-NEXT: # %bb.4: # %atomicrmw.end
-; RV64I-NEXT: ld s5, 16(sp)
-; RV64I-NEXT: ld s4, 24(sp)
-; RV64I-NEXT: ld s3, 32(sp)
-; RV64I-NEXT: ld s2, 40(sp)
-; RV64I-NEXT: ld s1, 48(sp)
-; RV64I-NEXT: ld ra, 56(sp)
-; RV64I-NEXT: addi sp, sp, 64
+; RV64I-NEXT: ld s4, 8(sp)
+; RV64I-NEXT: ld s3, 16(sp)
+; RV64I-NEXT: ld s2, 24(sp)
+; RV64I-NEXT: ld s1, 32(sp)
+; RV64I-NEXT: ld ra, 40(sp)
+; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_umin_i8_acquire:
; RV32I-NEXT: sw s2, 20(sp)
; RV32I-NEXT: sw s3, 16(sp)
; RV32I-NEXT: sw s4, 12(sp)
-; RV32I-NEXT: sw s5, 8(sp)
; RV32I-NEXT: mv s2, a1
-; RV32I-NEXT: mv s5, a0
+; RV32I-NEXT: mv s4, a0
; RV32I-NEXT: lbu a0, 0(a0)
; RV32I-NEXT: andi s1, a1, 255
-; RV32I-NEXT: addi s3, sp, 7
-; RV32I-NEXT: addi s4, zero, 3
+; RV32I-NEXT: addi s3, sp, 11
; RV32I-NEXT: .LBB52_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: andi a1, a0, 255
; RV32I-NEXT: mv a2, s2
; RV32I-NEXT: .LBB52_3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB52_1 Depth=1
-; RV32I-NEXT: sb a0, 7(sp)
-; RV32I-NEXT: mv a0, s5
+; RV32I-NEXT: sb a0, 11(sp)
+; RV32I-NEXT: mv a0, s4
; RV32I-NEXT: mv a1, s3
-; RV32I-NEXT: mv a3, s4
+; RV32I-NEXT: addi a3, zero, 3
; RV32I-NEXT: mv a4, zero
; RV32I-NEXT: call __atomic_compare_exchange_1
; RV32I-NEXT: mv a1, a0
-; RV32I-NEXT: lb a0, 7(sp)
+; RV32I-NEXT: lb a0, 11(sp)
; RV32I-NEXT: beqz a1, .LBB52_1
; RV32I-NEXT: # %bb.4: # %atomicrmw.end
-; RV32I-NEXT: lw s5, 8(sp)
; RV32I-NEXT: lw s4, 12(sp)
; RV32I-NEXT: lw s3, 16(sp)
; RV32I-NEXT: lw s2, 20(sp)
;
; RV64I-LABEL: atomicrmw_umin_i8_release:
; RV64I: # %bb.0:
-; RV64I-NEXT: addi sp, sp, -64
-; RV64I-NEXT: sd ra, 56(sp)
-; RV64I-NEXT: sd s1, 48(sp)
-; RV64I-NEXT: sd s2, 40(sp)
-; RV64I-NEXT: sd s3, 32(sp)
-; RV64I-NEXT: sd s4, 24(sp)
-; RV64I-NEXT: sd s5, 16(sp)
+; RV64I-NEXT: addi sp, sp, -48
+; RV64I-NEXT: sd ra, 40(sp)
+; RV64I-NEXT: sd s1, 32(sp)
+; RV64I-NEXT: sd s2, 24(sp)
+; RV64I-NEXT: sd s3, 16(sp)
+; RV64I-NEXT: sd s4, 8(sp)
; RV64I-NEXT: mv s2, a1
-; RV64I-NEXT: mv s5, a0
+; RV64I-NEXT: mv s4, a0
; RV64I-NEXT: lbu a0, 0(a0)
; RV64I-NEXT: andi s1, a1, 255
-; RV64I-NEXT: addi s3, sp, 15
-; RV64I-NEXT: addi s4, zero, 3
+; RV64I-NEXT: addi s3, sp, 7
; RV64I-NEXT: .LBB52_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: andi a1, a0, 255
; RV64I-NEXT: mv a2, s2
; RV64I-NEXT: .LBB52_3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB52_1 Depth=1
-; RV64I-NEXT: sb a0, 15(sp)
-; RV64I-NEXT: mv a0, s5
+; RV64I-NEXT: sb a0, 7(sp)
+; RV64I-NEXT: mv a0, s4
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s4
+; RV64I-NEXT: addi a3, zero, 3
; RV64I-NEXT: mv a4, zero
; RV64I-NEXT: call __atomic_compare_exchange_1
; RV64I-NEXT: mv a1, a0
-; RV64I-NEXT: lb a0, 15(sp)
+; RV64I-NEXT: lb a0, 7(sp)
; RV64I-NEXT: beqz a1, .LBB52_1
; RV64I-NEXT: # %bb.4: # %atomicrmw.end
-; RV64I-NEXT: ld s5, 16(sp)
-; RV64I-NEXT: ld s4, 24(sp)
-; RV64I-NEXT: ld s3, 32(sp)
-; RV64I-NEXT: ld s2, 40(sp)
-; RV64I-NEXT: ld s1, 48(sp)
-; RV64I-NEXT: ld ra, 56(sp)
-; RV64I-NEXT: addi sp, sp, 64
+; RV64I-NEXT: ld s4, 8(sp)
+; RV64I-NEXT: ld s3, 16(sp)
+; RV64I-NEXT: ld s2, 24(sp)
+; RV64I-NEXT: ld s1, 32(sp)
+; RV64I-NEXT: ld ra, 40(sp)
+; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_umin_i8_release:
; RV32I-NEXT: sw s2, 20(sp)
; RV32I-NEXT: sw s3, 16(sp)
; RV32I-NEXT: sw s4, 12(sp)
-; RV32I-NEXT: sw s5, 8(sp)
-; RV32I-NEXT: sw s6, 4(sp)
; RV32I-NEXT: mv s2, a1
-; RV32I-NEXT: mv s6, a0
+; RV32I-NEXT: mv s4, a0
; RV32I-NEXT: lbu a0, 0(a0)
; RV32I-NEXT: andi s1, a1, 255
-; RV32I-NEXT: addi s3, sp, 3
-; RV32I-NEXT: addi s4, zero, 4
-; RV32I-NEXT: addi s5, zero, 2
+; RV32I-NEXT: addi s3, sp, 11
; RV32I-NEXT: .LBB53_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: andi a1, a0, 255
; RV32I-NEXT: mv a2, s2
; RV32I-NEXT: .LBB53_3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB53_1 Depth=1
-; RV32I-NEXT: sb a0, 3(sp)
-; RV32I-NEXT: mv a0, s6
+; RV32I-NEXT: sb a0, 11(sp)
+; RV32I-NEXT: mv a0, s4
; RV32I-NEXT: mv a1, s3
-; RV32I-NEXT: mv a3, s4
-; RV32I-NEXT: mv a4, s5
+; RV32I-NEXT: addi a3, zero, 4
+; RV32I-NEXT: addi a4, zero, 2
; RV32I-NEXT: call __atomic_compare_exchange_1
; RV32I-NEXT: mv a1, a0
-; RV32I-NEXT: lb a0, 3(sp)
+; RV32I-NEXT: lb a0, 11(sp)
; RV32I-NEXT: beqz a1, .LBB53_1
; RV32I-NEXT: # %bb.4: # %atomicrmw.end
-; RV32I-NEXT: lw s6, 4(sp)
-; RV32I-NEXT: lw s5, 8(sp)
; RV32I-NEXT: lw s4, 12(sp)
; RV32I-NEXT: lw s3, 16(sp)
; RV32I-NEXT: lw s2, 20(sp)
;
; RV64I-LABEL: atomicrmw_umin_i8_acq_rel:
; RV64I: # %bb.0:
-; RV64I-NEXT: addi sp, sp, -64
-; RV64I-NEXT: sd ra, 56(sp)
-; RV64I-NEXT: sd s1, 48(sp)
-; RV64I-NEXT: sd s2, 40(sp)
-; RV64I-NEXT: sd s3, 32(sp)
-; RV64I-NEXT: sd s4, 24(sp)
-; RV64I-NEXT: sd s5, 16(sp)
-; RV64I-NEXT: sd s6, 8(sp)
+; RV64I-NEXT: addi sp, sp, -48
+; RV64I-NEXT: sd ra, 40(sp)
+; RV64I-NEXT: sd s1, 32(sp)
+; RV64I-NEXT: sd s2, 24(sp)
+; RV64I-NEXT: sd s3, 16(sp)
+; RV64I-NEXT: sd s4, 8(sp)
; RV64I-NEXT: mv s2, a1
-; RV64I-NEXT: mv s6, a0
+; RV64I-NEXT: mv s4, a0
; RV64I-NEXT: lbu a0, 0(a0)
; RV64I-NEXT: andi s1, a1, 255
; RV64I-NEXT: addi s3, sp, 7
-; RV64I-NEXT: addi s4, zero, 4
-; RV64I-NEXT: addi s5, zero, 2
; RV64I-NEXT: .LBB53_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: andi a1, a0, 255
; RV64I-NEXT: .LBB53_3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB53_1 Depth=1
; RV64I-NEXT: sb a0, 7(sp)
-; RV64I-NEXT: mv a0, s6
+; RV64I-NEXT: mv a0, s4
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s4
-; RV64I-NEXT: mv a4, s5
+; RV64I-NEXT: addi a3, zero, 4
+; RV64I-NEXT: addi a4, zero, 2
; RV64I-NEXT: call __atomic_compare_exchange_1
; RV64I-NEXT: mv a1, a0
; RV64I-NEXT: lb a0, 7(sp)
; RV64I-NEXT: beqz a1, .LBB53_1
; RV64I-NEXT: # %bb.4: # %atomicrmw.end
-; RV64I-NEXT: ld s6, 8(sp)
-; RV64I-NEXT: ld s5, 16(sp)
-; RV64I-NEXT: ld s4, 24(sp)
-; RV64I-NEXT: ld s3, 32(sp)
-; RV64I-NEXT: ld s2, 40(sp)
-; RV64I-NEXT: ld s1, 48(sp)
-; RV64I-NEXT: ld ra, 56(sp)
-; RV64I-NEXT: addi sp, sp, 64
+; RV64I-NEXT: ld s4, 8(sp)
+; RV64I-NEXT: ld s3, 16(sp)
+; RV64I-NEXT: ld s2, 24(sp)
+; RV64I-NEXT: ld s1, 32(sp)
+; RV64I-NEXT: ld ra, 40(sp)
+; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_umin_i8_acq_rel:
; RV32I-NEXT: sw s2, 20(sp)
; RV32I-NEXT: sw s3, 16(sp)
; RV32I-NEXT: sw s4, 12(sp)
-; RV32I-NEXT: sw s5, 8(sp)
; RV32I-NEXT: mv s2, a1
; RV32I-NEXT: mv s4, a0
; RV32I-NEXT: lbu a0, 0(a0)
-; RV32I-NEXT: andi s5, a1, 255
-; RV32I-NEXT: addi s3, sp, 7
-; RV32I-NEXT: addi s1, zero, 5
+; RV32I-NEXT: andi s1, a1, 255
+; RV32I-NEXT: addi s3, sp, 11
; RV32I-NEXT: .LBB54_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: andi a1, a0, 255
; RV32I-NEXT: mv a2, a0
-; RV32I-NEXT: bgeu s5, a1, .LBB54_3
+; RV32I-NEXT: bgeu s1, a1, .LBB54_3
; RV32I-NEXT: # %bb.2: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB54_1 Depth=1
; RV32I-NEXT: mv a2, s2
; RV32I-NEXT: .LBB54_3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB54_1 Depth=1
-; RV32I-NEXT: sb a0, 7(sp)
+; RV32I-NEXT: sb a0, 11(sp)
; RV32I-NEXT: mv a0, s4
; RV32I-NEXT: mv a1, s3
-; RV32I-NEXT: mv a3, s1
-; RV32I-NEXT: mv a4, s1
+; RV32I-NEXT: addi a3, zero, 5
+; RV32I-NEXT: addi a4, zero, 5
; RV32I-NEXT: call __atomic_compare_exchange_1
; RV32I-NEXT: mv a1, a0
-; RV32I-NEXT: lb a0, 7(sp)
+; RV32I-NEXT: lb a0, 11(sp)
; RV32I-NEXT: beqz a1, .LBB54_1
; RV32I-NEXT: # %bb.4: # %atomicrmw.end
-; RV32I-NEXT: lw s5, 8(sp)
; RV32I-NEXT: lw s4, 12(sp)
; RV32I-NEXT: lw s3, 16(sp)
; RV32I-NEXT: lw s2, 20(sp)
;
; RV64I-LABEL: atomicrmw_umin_i8_seq_cst:
; RV64I: # %bb.0:
-; RV64I-NEXT: addi sp, sp, -64
-; RV64I-NEXT: sd ra, 56(sp)
-; RV64I-NEXT: sd s1, 48(sp)
-; RV64I-NEXT: sd s2, 40(sp)
-; RV64I-NEXT: sd s3, 32(sp)
-; RV64I-NEXT: sd s4, 24(sp)
-; RV64I-NEXT: sd s5, 16(sp)
+; RV64I-NEXT: addi sp, sp, -48
+; RV64I-NEXT: sd ra, 40(sp)
+; RV64I-NEXT: sd s1, 32(sp)
+; RV64I-NEXT: sd s2, 24(sp)
+; RV64I-NEXT: sd s3, 16(sp)
+; RV64I-NEXT: sd s4, 8(sp)
; RV64I-NEXT: mv s2, a1
; RV64I-NEXT: mv s4, a0
; RV64I-NEXT: lbu a0, 0(a0)
-; RV64I-NEXT: andi s5, a1, 255
-; RV64I-NEXT: addi s3, sp, 15
-; RV64I-NEXT: addi s1, zero, 5
+; RV64I-NEXT: andi s1, a1, 255
+; RV64I-NEXT: addi s3, sp, 7
; RV64I-NEXT: .LBB54_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: andi a1, a0, 255
; RV64I-NEXT: mv a2, a0
-; RV64I-NEXT: bgeu s5, a1, .LBB54_3
+; RV64I-NEXT: bgeu s1, a1, .LBB54_3
; RV64I-NEXT: # %bb.2: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB54_1 Depth=1
; RV64I-NEXT: mv a2, s2
; RV64I-NEXT: .LBB54_3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB54_1 Depth=1
-; RV64I-NEXT: sb a0, 15(sp)
+; RV64I-NEXT: sb a0, 7(sp)
; RV64I-NEXT: mv a0, s4
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s1
-; RV64I-NEXT: mv a4, s1
+; RV64I-NEXT: addi a3, zero, 5
+; RV64I-NEXT: addi a4, zero, 5
; RV64I-NEXT: call __atomic_compare_exchange_1
; RV64I-NEXT: mv a1, a0
-; RV64I-NEXT: lb a0, 15(sp)
+; RV64I-NEXT: lb a0, 7(sp)
; RV64I-NEXT: beqz a1, .LBB54_1
; RV64I-NEXT: # %bb.4: # %atomicrmw.end
-; RV64I-NEXT: ld s5, 16(sp)
-; RV64I-NEXT: ld s4, 24(sp)
-; RV64I-NEXT: ld s3, 32(sp)
-; RV64I-NEXT: ld s2, 40(sp)
-; RV64I-NEXT: ld s1, 48(sp)
-; RV64I-NEXT: ld ra, 56(sp)
-; RV64I-NEXT: addi sp, sp, 64
+; RV64I-NEXT: ld s4, 8(sp)
+; RV64I-NEXT: ld s3, 16(sp)
+; RV64I-NEXT: ld s2, 24(sp)
+; RV64I-NEXT: ld s1, 32(sp)
+; RV64I-NEXT: ld ra, 40(sp)
+; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_umin_i8_seq_cst:
; RV32I-NEXT: sw s2, 20(sp)
; RV32I-NEXT: sw s3, 16(sp)
; RV32I-NEXT: sw s4, 12(sp)
-; RV32I-NEXT: sw s5, 8(sp)
; RV32I-NEXT: mv s2, a1
; RV32I-NEXT: mv s4, a0
; RV32I-NEXT: lhu a0, 0(a0)
; RV32I-NEXT: slli a1, a1, 16
-; RV32I-NEXT: srai s5, a1, 16
-; RV32I-NEXT: addi s3, sp, 6
-; RV32I-NEXT: addi s1, zero, 2
+; RV32I-NEXT: srai s1, a1, 16
+; RV32I-NEXT: addi s3, sp, 10
; RV32I-NEXT: .LBB91_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: slli a1, a0, 16
; RV32I-NEXT: srai a1, a1, 16
; RV32I-NEXT: mv a2, a0
-; RV32I-NEXT: blt s5, a1, .LBB91_3
+; RV32I-NEXT: blt s1, a1, .LBB91_3
; RV32I-NEXT: # %bb.2: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB91_1 Depth=1
; RV32I-NEXT: mv a2, s2
; RV32I-NEXT: .LBB91_3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB91_1 Depth=1
-; RV32I-NEXT: sh a0, 6(sp)
+; RV32I-NEXT: sh a0, 10(sp)
; RV32I-NEXT: mv a0, s4
; RV32I-NEXT: mv a1, s3
-; RV32I-NEXT: mv a3, s1
-; RV32I-NEXT: mv a4, s1
+; RV32I-NEXT: addi a3, zero, 2
+; RV32I-NEXT: addi a4, zero, 2
; RV32I-NEXT: call __atomic_compare_exchange_2
; RV32I-NEXT: mv a1, a0
-; RV32I-NEXT: lh a0, 6(sp)
+; RV32I-NEXT: lh a0, 10(sp)
; RV32I-NEXT: beqz a1, .LBB91_1
; RV32I-NEXT: # %bb.4: # %atomicrmw.end
-; RV32I-NEXT: lw s5, 8(sp)
; RV32I-NEXT: lw s4, 12(sp)
; RV32I-NEXT: lw s3, 16(sp)
; RV32I-NEXT: lw s2, 20(sp)
;
; RV64I-LABEL: atomicrmw_max_i16_acquire:
; RV64I: # %bb.0:
-; RV64I-NEXT: addi sp, sp, -64
-; RV64I-NEXT: sd ra, 56(sp)
-; RV64I-NEXT: sd s1, 48(sp)
-; RV64I-NEXT: sd s2, 40(sp)
-; RV64I-NEXT: sd s3, 32(sp)
-; RV64I-NEXT: sd s4, 24(sp)
-; RV64I-NEXT: sd s5, 16(sp)
+; RV64I-NEXT: addi sp, sp, -48
+; RV64I-NEXT: sd ra, 40(sp)
+; RV64I-NEXT: sd s1, 32(sp)
+; RV64I-NEXT: sd s2, 24(sp)
+; RV64I-NEXT: sd s3, 16(sp)
+; RV64I-NEXT: sd s4, 8(sp)
; RV64I-NEXT: mv s2, a1
; RV64I-NEXT: mv s4, a0
; RV64I-NEXT: lhu a0, 0(a0)
; RV64I-NEXT: slli a1, a1, 48
-; RV64I-NEXT: srai s5, a1, 48
-; RV64I-NEXT: addi s3, sp, 14
-; RV64I-NEXT: addi s1, zero, 2
+; RV64I-NEXT: srai s1, a1, 48
+; RV64I-NEXT: addi s3, sp, 6
; RV64I-NEXT: .LBB91_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: slli a1, a0, 48
; RV64I-NEXT: srai a1, a1, 48
; RV64I-NEXT: mv a2, a0
-; RV64I-NEXT: blt s5, a1, .LBB91_3
+; RV64I-NEXT: blt s1, a1, .LBB91_3
; RV64I-NEXT: # %bb.2: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB91_1 Depth=1
; RV64I-NEXT: mv a2, s2
; RV64I-NEXT: .LBB91_3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB91_1 Depth=1
-; RV64I-NEXT: sh a0, 14(sp)
+; RV64I-NEXT: sh a0, 6(sp)
; RV64I-NEXT: mv a0, s4
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s1
-; RV64I-NEXT: mv a4, s1
+; RV64I-NEXT: addi a3, zero, 2
+; RV64I-NEXT: addi a4, zero, 2
; RV64I-NEXT: call __atomic_compare_exchange_2
; RV64I-NEXT: mv a1, a0
-; RV64I-NEXT: lh a0, 14(sp)
+; RV64I-NEXT: lh a0, 6(sp)
; RV64I-NEXT: beqz a1, .LBB91_1
; RV64I-NEXT: # %bb.4: # %atomicrmw.end
-; RV64I-NEXT: ld s5, 16(sp)
-; RV64I-NEXT: ld s4, 24(sp)
-; RV64I-NEXT: ld s3, 32(sp)
-; RV64I-NEXT: ld s2, 40(sp)
-; RV64I-NEXT: ld s1, 48(sp)
-; RV64I-NEXT: ld ra, 56(sp)
-; RV64I-NEXT: addi sp, sp, 64
+; RV64I-NEXT: ld s4, 8(sp)
+; RV64I-NEXT: ld s3, 16(sp)
+; RV64I-NEXT: ld s2, 24(sp)
+; RV64I-NEXT: ld s1, 32(sp)
+; RV64I-NEXT: ld ra, 40(sp)
+; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_max_i16_acquire:
; RV32I-NEXT: sw s2, 20(sp)
; RV32I-NEXT: sw s3, 16(sp)
; RV32I-NEXT: sw s4, 12(sp)
-; RV32I-NEXT: sw s5, 8(sp)
; RV32I-NEXT: mv s2, a1
-; RV32I-NEXT: mv s5, a0
+; RV32I-NEXT: mv s4, a0
; RV32I-NEXT: lhu a0, 0(a0)
; RV32I-NEXT: slli a1, a1, 16
; RV32I-NEXT: srai s1, a1, 16
-; RV32I-NEXT: addi s3, sp, 6
-; RV32I-NEXT: addi s4, zero, 3
+; RV32I-NEXT: addi s3, sp, 10
; RV32I-NEXT: .LBB92_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: slli a1, a0, 16
; RV32I-NEXT: mv a2, s2
; RV32I-NEXT: .LBB92_3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB92_1 Depth=1
-; RV32I-NEXT: sh a0, 6(sp)
-; RV32I-NEXT: mv a0, s5
+; RV32I-NEXT: sh a0, 10(sp)
+; RV32I-NEXT: mv a0, s4
; RV32I-NEXT: mv a1, s3
-; RV32I-NEXT: mv a3, s4
+; RV32I-NEXT: addi a3, zero, 3
; RV32I-NEXT: mv a4, zero
; RV32I-NEXT: call __atomic_compare_exchange_2
; RV32I-NEXT: mv a1, a0
-; RV32I-NEXT: lh a0, 6(sp)
+; RV32I-NEXT: lh a0, 10(sp)
; RV32I-NEXT: beqz a1, .LBB92_1
; RV32I-NEXT: # %bb.4: # %atomicrmw.end
-; RV32I-NEXT: lw s5, 8(sp)
; RV32I-NEXT: lw s4, 12(sp)
; RV32I-NEXT: lw s3, 16(sp)
; RV32I-NEXT: lw s2, 20(sp)
;
; RV64I-LABEL: atomicrmw_max_i16_release:
; RV64I: # %bb.0:
-; RV64I-NEXT: addi sp, sp, -64
-; RV64I-NEXT: sd ra, 56(sp)
-; RV64I-NEXT: sd s1, 48(sp)
-; RV64I-NEXT: sd s2, 40(sp)
-; RV64I-NEXT: sd s3, 32(sp)
-; RV64I-NEXT: sd s4, 24(sp)
-; RV64I-NEXT: sd s5, 16(sp)
+; RV64I-NEXT: addi sp, sp, -48
+; RV64I-NEXT: sd ra, 40(sp)
+; RV64I-NEXT: sd s1, 32(sp)
+; RV64I-NEXT: sd s2, 24(sp)
+; RV64I-NEXT: sd s3, 16(sp)
+; RV64I-NEXT: sd s4, 8(sp)
; RV64I-NEXT: mv s2, a1
-; RV64I-NEXT: mv s5, a0
+; RV64I-NEXT: mv s4, a0
; RV64I-NEXT: lhu a0, 0(a0)
; RV64I-NEXT: slli a1, a1, 48
; RV64I-NEXT: srai s1, a1, 48
-; RV64I-NEXT: addi s3, sp, 14
-; RV64I-NEXT: addi s4, zero, 3
+; RV64I-NEXT: addi s3, sp, 6
; RV64I-NEXT: .LBB92_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: slli a1, a0, 48
; RV64I-NEXT: mv a2, s2
; RV64I-NEXT: .LBB92_3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB92_1 Depth=1
-; RV64I-NEXT: sh a0, 14(sp)
-; RV64I-NEXT: mv a0, s5
+; RV64I-NEXT: sh a0, 6(sp)
+; RV64I-NEXT: mv a0, s4
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s4
+; RV64I-NEXT: addi a3, zero, 3
; RV64I-NEXT: mv a4, zero
; RV64I-NEXT: call __atomic_compare_exchange_2
; RV64I-NEXT: mv a1, a0
-; RV64I-NEXT: lh a0, 14(sp)
+; RV64I-NEXT: lh a0, 6(sp)
; RV64I-NEXT: beqz a1, .LBB92_1
; RV64I-NEXT: # %bb.4: # %atomicrmw.end
-; RV64I-NEXT: ld s5, 16(sp)
-; RV64I-NEXT: ld s4, 24(sp)
-; RV64I-NEXT: ld s3, 32(sp)
-; RV64I-NEXT: ld s2, 40(sp)
-; RV64I-NEXT: ld s1, 48(sp)
-; RV64I-NEXT: ld ra, 56(sp)
-; RV64I-NEXT: addi sp, sp, 64
+; RV64I-NEXT: ld s4, 8(sp)
+; RV64I-NEXT: ld s3, 16(sp)
+; RV64I-NEXT: ld s2, 24(sp)
+; RV64I-NEXT: ld s1, 32(sp)
+; RV64I-NEXT: ld ra, 40(sp)
+; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_max_i16_release:
; RV32I-NEXT: sw s2, 20(sp)
; RV32I-NEXT: sw s3, 16(sp)
; RV32I-NEXT: sw s4, 12(sp)
-; RV32I-NEXT: sw s5, 8(sp)
-; RV32I-NEXT: sw s6, 4(sp)
; RV32I-NEXT: mv s2, a1
-; RV32I-NEXT: mv s6, a0
+; RV32I-NEXT: mv s4, a0
; RV32I-NEXT: lhu a0, 0(a0)
; RV32I-NEXT: slli a1, a1, 16
; RV32I-NEXT: srai s1, a1, 16
-; RV32I-NEXT: addi s3, sp, 2
-; RV32I-NEXT: addi s4, zero, 4
-; RV32I-NEXT: addi s5, zero, 2
+; RV32I-NEXT: addi s3, sp, 10
; RV32I-NEXT: .LBB93_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: slli a1, a0, 16
; RV32I-NEXT: mv a2, s2
; RV32I-NEXT: .LBB93_3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB93_1 Depth=1
-; RV32I-NEXT: sh a0, 2(sp)
-; RV32I-NEXT: mv a0, s6
+; RV32I-NEXT: sh a0, 10(sp)
+; RV32I-NEXT: mv a0, s4
; RV32I-NEXT: mv a1, s3
-; RV32I-NEXT: mv a3, s4
-; RV32I-NEXT: mv a4, s5
+; RV32I-NEXT: addi a3, zero, 4
+; RV32I-NEXT: addi a4, zero, 2
; RV32I-NEXT: call __atomic_compare_exchange_2
; RV32I-NEXT: mv a1, a0
-; RV32I-NEXT: lh a0, 2(sp)
+; RV32I-NEXT: lh a0, 10(sp)
; RV32I-NEXT: beqz a1, .LBB93_1
; RV32I-NEXT: # %bb.4: # %atomicrmw.end
-; RV32I-NEXT: lw s6, 4(sp)
-; RV32I-NEXT: lw s5, 8(sp)
; RV32I-NEXT: lw s4, 12(sp)
; RV32I-NEXT: lw s3, 16(sp)
; RV32I-NEXT: lw s2, 20(sp)
;
; RV64I-LABEL: atomicrmw_max_i16_acq_rel:
; RV64I: # %bb.0:
-; RV64I-NEXT: addi sp, sp, -64
-; RV64I-NEXT: sd ra, 56(sp)
-; RV64I-NEXT: sd s1, 48(sp)
-; RV64I-NEXT: sd s2, 40(sp)
-; RV64I-NEXT: sd s3, 32(sp)
-; RV64I-NEXT: sd s4, 24(sp)
-; RV64I-NEXT: sd s5, 16(sp)
-; RV64I-NEXT: sd s6, 8(sp)
+; RV64I-NEXT: addi sp, sp, -48
+; RV64I-NEXT: sd ra, 40(sp)
+; RV64I-NEXT: sd s1, 32(sp)
+; RV64I-NEXT: sd s2, 24(sp)
+; RV64I-NEXT: sd s3, 16(sp)
+; RV64I-NEXT: sd s4, 8(sp)
; RV64I-NEXT: mv s2, a1
-; RV64I-NEXT: mv s6, a0
+; RV64I-NEXT: mv s4, a0
; RV64I-NEXT: lhu a0, 0(a0)
; RV64I-NEXT: slli a1, a1, 48
; RV64I-NEXT: srai s1, a1, 48
; RV64I-NEXT: addi s3, sp, 6
-; RV64I-NEXT: addi s4, zero, 4
-; RV64I-NEXT: addi s5, zero, 2
; RV64I-NEXT: .LBB93_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: slli a1, a0, 48
; RV64I-NEXT: .LBB93_3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB93_1 Depth=1
; RV64I-NEXT: sh a0, 6(sp)
-; RV64I-NEXT: mv a0, s6
+; RV64I-NEXT: mv a0, s4
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s4
-; RV64I-NEXT: mv a4, s5
+; RV64I-NEXT: addi a3, zero, 4
+; RV64I-NEXT: addi a4, zero, 2
; RV64I-NEXT: call __atomic_compare_exchange_2
; RV64I-NEXT: mv a1, a0
; RV64I-NEXT: lh a0, 6(sp)
; RV64I-NEXT: beqz a1, .LBB93_1
; RV64I-NEXT: # %bb.4: # %atomicrmw.end
-; RV64I-NEXT: ld s6, 8(sp)
-; RV64I-NEXT: ld s5, 16(sp)
-; RV64I-NEXT: ld s4, 24(sp)
-; RV64I-NEXT: ld s3, 32(sp)
-; RV64I-NEXT: ld s2, 40(sp)
-; RV64I-NEXT: ld s1, 48(sp)
-; RV64I-NEXT: ld ra, 56(sp)
-; RV64I-NEXT: addi sp, sp, 64
+; RV64I-NEXT: ld s4, 8(sp)
+; RV64I-NEXT: ld s3, 16(sp)
+; RV64I-NEXT: ld s2, 24(sp)
+; RV64I-NEXT: ld s1, 32(sp)
+; RV64I-NEXT: ld ra, 40(sp)
+; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_max_i16_acq_rel:
; RV32I-NEXT: sw s2, 20(sp)
; RV32I-NEXT: sw s3, 16(sp)
; RV32I-NEXT: sw s4, 12(sp)
-; RV32I-NEXT: sw s5, 8(sp)
; RV32I-NEXT: mv s2, a1
; RV32I-NEXT: mv s4, a0
; RV32I-NEXT: lhu a0, 0(a0)
; RV32I-NEXT: slli a1, a1, 16
-; RV32I-NEXT: srai s5, a1, 16
-; RV32I-NEXT: addi s3, sp, 6
-; RV32I-NEXT: addi s1, zero, 5
+; RV32I-NEXT: srai s1, a1, 16
+; RV32I-NEXT: addi s3, sp, 10
; RV32I-NEXT: .LBB94_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: slli a1, a0, 16
; RV32I-NEXT: srai a1, a1, 16
; RV32I-NEXT: mv a2, a0
-; RV32I-NEXT: blt s5, a1, .LBB94_3
+; RV32I-NEXT: blt s1, a1, .LBB94_3
; RV32I-NEXT: # %bb.2: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB94_1 Depth=1
; RV32I-NEXT: mv a2, s2
; RV32I-NEXT: .LBB94_3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB94_1 Depth=1
-; RV32I-NEXT: sh a0, 6(sp)
+; RV32I-NEXT: sh a0, 10(sp)
; RV32I-NEXT: mv a0, s4
; RV32I-NEXT: mv a1, s3
-; RV32I-NEXT: mv a3, s1
-; RV32I-NEXT: mv a4, s1
+; RV32I-NEXT: addi a3, zero, 5
+; RV32I-NEXT: addi a4, zero, 5
; RV32I-NEXT: call __atomic_compare_exchange_2
; RV32I-NEXT: mv a1, a0
-; RV32I-NEXT: lh a0, 6(sp)
+; RV32I-NEXT: lh a0, 10(sp)
; RV32I-NEXT: beqz a1, .LBB94_1
; RV32I-NEXT: # %bb.4: # %atomicrmw.end
-; RV32I-NEXT: lw s5, 8(sp)
; RV32I-NEXT: lw s4, 12(sp)
; RV32I-NEXT: lw s3, 16(sp)
; RV32I-NEXT: lw s2, 20(sp)
;
; RV64I-LABEL: atomicrmw_max_i16_seq_cst:
; RV64I: # %bb.0:
-; RV64I-NEXT: addi sp, sp, -64
-; RV64I-NEXT: sd ra, 56(sp)
-; RV64I-NEXT: sd s1, 48(sp)
-; RV64I-NEXT: sd s2, 40(sp)
-; RV64I-NEXT: sd s3, 32(sp)
-; RV64I-NEXT: sd s4, 24(sp)
-; RV64I-NEXT: sd s5, 16(sp)
+; RV64I-NEXT: addi sp, sp, -48
+; RV64I-NEXT: sd ra, 40(sp)
+; RV64I-NEXT: sd s1, 32(sp)
+; RV64I-NEXT: sd s2, 24(sp)
+; RV64I-NEXT: sd s3, 16(sp)
+; RV64I-NEXT: sd s4, 8(sp)
; RV64I-NEXT: mv s2, a1
; RV64I-NEXT: mv s4, a0
; RV64I-NEXT: lhu a0, 0(a0)
; RV64I-NEXT: slli a1, a1, 48
-; RV64I-NEXT: srai s5, a1, 48
-; RV64I-NEXT: addi s3, sp, 14
-; RV64I-NEXT: addi s1, zero, 5
+; RV64I-NEXT: srai s1, a1, 48
+; RV64I-NEXT: addi s3, sp, 6
; RV64I-NEXT: .LBB94_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: slli a1, a0, 48
; RV64I-NEXT: srai a1, a1, 48
; RV64I-NEXT: mv a2, a0
-; RV64I-NEXT: blt s5, a1, .LBB94_3
+; RV64I-NEXT: blt s1, a1, .LBB94_3
; RV64I-NEXT: # %bb.2: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB94_1 Depth=1
; RV64I-NEXT: mv a2, s2
; RV64I-NEXT: .LBB94_3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB94_1 Depth=1
-; RV64I-NEXT: sh a0, 14(sp)
+; RV64I-NEXT: sh a0, 6(sp)
; RV64I-NEXT: mv a0, s4
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s1
-; RV64I-NEXT: mv a4, s1
+; RV64I-NEXT: addi a3, zero, 5
+; RV64I-NEXT: addi a4, zero, 5
; RV64I-NEXT: call __atomic_compare_exchange_2
; RV64I-NEXT: mv a1, a0
-; RV64I-NEXT: lh a0, 14(sp)
+; RV64I-NEXT: lh a0, 6(sp)
; RV64I-NEXT: beqz a1, .LBB94_1
; RV64I-NEXT: # %bb.4: # %atomicrmw.end
-; RV64I-NEXT: ld s5, 16(sp)
-; RV64I-NEXT: ld s4, 24(sp)
-; RV64I-NEXT: ld s3, 32(sp)
-; RV64I-NEXT: ld s2, 40(sp)
-; RV64I-NEXT: ld s1, 48(sp)
-; RV64I-NEXT: ld ra, 56(sp)
-; RV64I-NEXT: addi sp, sp, 64
-; RV64I-NEXT: ret
+; RV64I-NEXT: ld s4, 8(sp)
+; RV64I-NEXT: ld s3, 16(sp)
+; RV64I-NEXT: ld s2, 24(sp)
+; RV64I-NEXT: ld s1, 32(sp)
+; RV64I-NEXT: ld ra, 40(sp)
+; RV64I-NEXT: addi sp, sp, 48
+; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_max_i16_seq_cst:
; RV64IA: # %bb.0:
; RV32I-NEXT: sw s2, 20(sp)
; RV32I-NEXT: sw s3, 16(sp)
; RV32I-NEXT: sw s4, 12(sp)
-; RV32I-NEXT: sw s5, 8(sp)
; RV32I-NEXT: mv s2, a1
; RV32I-NEXT: mv s4, a0
; RV32I-NEXT: lhu a0, 0(a0)
; RV32I-NEXT: slli a1, a1, 16
-; RV32I-NEXT: srai s5, a1, 16
-; RV32I-NEXT: addi s3, sp, 6
-; RV32I-NEXT: addi s1, zero, 2
+; RV32I-NEXT: srai s1, a1, 16
+; RV32I-NEXT: addi s3, sp, 10
; RV32I-NEXT: .LBB96_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: slli a1, a0, 16
; RV32I-NEXT: srai a1, a1, 16
; RV32I-NEXT: mv a2, a0
-; RV32I-NEXT: bge s5, a1, .LBB96_3
+; RV32I-NEXT: bge s1, a1, .LBB96_3
; RV32I-NEXT: # %bb.2: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB96_1 Depth=1
; RV32I-NEXT: mv a2, s2
; RV32I-NEXT: .LBB96_3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB96_1 Depth=1
-; RV32I-NEXT: sh a0, 6(sp)
+; RV32I-NEXT: sh a0, 10(sp)
; RV32I-NEXT: mv a0, s4
; RV32I-NEXT: mv a1, s3
-; RV32I-NEXT: mv a3, s1
-; RV32I-NEXT: mv a4, s1
+; RV32I-NEXT: addi a3, zero, 2
+; RV32I-NEXT: addi a4, zero, 2
; RV32I-NEXT: call __atomic_compare_exchange_2
; RV32I-NEXT: mv a1, a0
-; RV32I-NEXT: lh a0, 6(sp)
+; RV32I-NEXT: lh a0, 10(sp)
; RV32I-NEXT: beqz a1, .LBB96_1
; RV32I-NEXT: # %bb.4: # %atomicrmw.end
-; RV32I-NEXT: lw s5, 8(sp)
; RV32I-NEXT: lw s4, 12(sp)
; RV32I-NEXT: lw s3, 16(sp)
; RV32I-NEXT: lw s2, 20(sp)
;
; RV64I-LABEL: atomicrmw_min_i16_acquire:
; RV64I: # %bb.0:
-; RV64I-NEXT: addi sp, sp, -64
-; RV64I-NEXT: sd ra, 56(sp)
-; RV64I-NEXT: sd s1, 48(sp)
-; RV64I-NEXT: sd s2, 40(sp)
-; RV64I-NEXT: sd s3, 32(sp)
-; RV64I-NEXT: sd s4, 24(sp)
-; RV64I-NEXT: sd s5, 16(sp)
+; RV64I-NEXT: addi sp, sp, -48
+; RV64I-NEXT: sd ra, 40(sp)
+; RV64I-NEXT: sd s1, 32(sp)
+; RV64I-NEXT: sd s2, 24(sp)
+; RV64I-NEXT: sd s3, 16(sp)
+; RV64I-NEXT: sd s4, 8(sp)
; RV64I-NEXT: mv s2, a1
; RV64I-NEXT: mv s4, a0
; RV64I-NEXT: lhu a0, 0(a0)
; RV64I-NEXT: slli a1, a1, 48
-; RV64I-NEXT: srai s5, a1, 48
-; RV64I-NEXT: addi s3, sp, 14
-; RV64I-NEXT: addi s1, zero, 2
+; RV64I-NEXT: srai s1, a1, 48
+; RV64I-NEXT: addi s3, sp, 6
; RV64I-NEXT: .LBB96_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: slli a1, a0, 48
; RV64I-NEXT: srai a1, a1, 48
; RV64I-NEXT: mv a2, a0
-; RV64I-NEXT: bge s5, a1, .LBB96_3
+; RV64I-NEXT: bge s1, a1, .LBB96_3
; RV64I-NEXT: # %bb.2: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB96_1 Depth=1
; RV64I-NEXT: mv a2, s2
; RV64I-NEXT: .LBB96_3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB96_1 Depth=1
-; RV64I-NEXT: sh a0, 14(sp)
+; RV64I-NEXT: sh a0, 6(sp)
; RV64I-NEXT: mv a0, s4
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s1
-; RV64I-NEXT: mv a4, s1
+; RV64I-NEXT: addi a3, zero, 2
+; RV64I-NEXT: addi a4, zero, 2
; RV64I-NEXT: call __atomic_compare_exchange_2
; RV64I-NEXT: mv a1, a0
-; RV64I-NEXT: lh a0, 14(sp)
+; RV64I-NEXT: lh a0, 6(sp)
; RV64I-NEXT: beqz a1, .LBB96_1
; RV64I-NEXT: # %bb.4: # %atomicrmw.end
-; RV64I-NEXT: ld s5, 16(sp)
-; RV64I-NEXT: ld s4, 24(sp)
-; RV64I-NEXT: ld s3, 32(sp)
-; RV64I-NEXT: ld s2, 40(sp)
-; RV64I-NEXT: ld s1, 48(sp)
-; RV64I-NEXT: ld ra, 56(sp)
-; RV64I-NEXT: addi sp, sp, 64
+; RV64I-NEXT: ld s4, 8(sp)
+; RV64I-NEXT: ld s3, 16(sp)
+; RV64I-NEXT: ld s2, 24(sp)
+; RV64I-NEXT: ld s1, 32(sp)
+; RV64I-NEXT: ld ra, 40(sp)
+; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_min_i16_acquire:
; RV32I-NEXT: sw s2, 20(sp)
; RV32I-NEXT: sw s3, 16(sp)
; RV32I-NEXT: sw s4, 12(sp)
-; RV32I-NEXT: sw s5, 8(sp)
; RV32I-NEXT: mv s2, a1
-; RV32I-NEXT: mv s5, a0
+; RV32I-NEXT: mv s4, a0
; RV32I-NEXT: lhu a0, 0(a0)
; RV32I-NEXT: slli a1, a1, 16
; RV32I-NEXT: srai s1, a1, 16
-; RV32I-NEXT: addi s3, sp, 6
-; RV32I-NEXT: addi s4, zero, 3
+; RV32I-NEXT: addi s3, sp, 10
; RV32I-NEXT: .LBB97_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: slli a1, a0, 16
; RV32I-NEXT: mv a2, s2
; RV32I-NEXT: .LBB97_3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB97_1 Depth=1
-; RV32I-NEXT: sh a0, 6(sp)
-; RV32I-NEXT: mv a0, s5
+; RV32I-NEXT: sh a0, 10(sp)
+; RV32I-NEXT: mv a0, s4
; RV32I-NEXT: mv a1, s3
-; RV32I-NEXT: mv a3, s4
+; RV32I-NEXT: addi a3, zero, 3
; RV32I-NEXT: mv a4, zero
; RV32I-NEXT: call __atomic_compare_exchange_2
; RV32I-NEXT: mv a1, a0
-; RV32I-NEXT: lh a0, 6(sp)
+; RV32I-NEXT: lh a0, 10(sp)
; RV32I-NEXT: beqz a1, .LBB97_1
; RV32I-NEXT: # %bb.4: # %atomicrmw.end
-; RV32I-NEXT: lw s5, 8(sp)
; RV32I-NEXT: lw s4, 12(sp)
; RV32I-NEXT: lw s3, 16(sp)
; RV32I-NEXT: lw s2, 20(sp)
;
; RV64I-LABEL: atomicrmw_min_i16_release:
; RV64I: # %bb.0:
-; RV64I-NEXT: addi sp, sp, -64
-; RV64I-NEXT: sd ra, 56(sp)
-; RV64I-NEXT: sd s1, 48(sp)
-; RV64I-NEXT: sd s2, 40(sp)
-; RV64I-NEXT: sd s3, 32(sp)
-; RV64I-NEXT: sd s4, 24(sp)
-; RV64I-NEXT: sd s5, 16(sp)
+; RV64I-NEXT: addi sp, sp, -48
+; RV64I-NEXT: sd ra, 40(sp)
+; RV64I-NEXT: sd s1, 32(sp)
+; RV64I-NEXT: sd s2, 24(sp)
+; RV64I-NEXT: sd s3, 16(sp)
+; RV64I-NEXT: sd s4, 8(sp)
; RV64I-NEXT: mv s2, a1
-; RV64I-NEXT: mv s5, a0
+; RV64I-NEXT: mv s4, a0
; RV64I-NEXT: lhu a0, 0(a0)
; RV64I-NEXT: slli a1, a1, 48
; RV64I-NEXT: srai s1, a1, 48
-; RV64I-NEXT: addi s3, sp, 14
-; RV64I-NEXT: addi s4, zero, 3
+; RV64I-NEXT: addi s3, sp, 6
; RV64I-NEXT: .LBB97_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: slli a1, a0, 48
; RV64I-NEXT: mv a2, s2
; RV64I-NEXT: .LBB97_3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB97_1 Depth=1
-; RV64I-NEXT: sh a0, 14(sp)
-; RV64I-NEXT: mv a0, s5
+; RV64I-NEXT: sh a0, 6(sp)
+; RV64I-NEXT: mv a0, s4
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s4
+; RV64I-NEXT: addi a3, zero, 3
; RV64I-NEXT: mv a4, zero
; RV64I-NEXT: call __atomic_compare_exchange_2
; RV64I-NEXT: mv a1, a0
-; RV64I-NEXT: lh a0, 14(sp)
+; RV64I-NEXT: lh a0, 6(sp)
; RV64I-NEXT: beqz a1, .LBB97_1
; RV64I-NEXT: # %bb.4: # %atomicrmw.end
-; RV64I-NEXT: ld s5, 16(sp)
-; RV64I-NEXT: ld s4, 24(sp)
-; RV64I-NEXT: ld s3, 32(sp)
-; RV64I-NEXT: ld s2, 40(sp)
-; RV64I-NEXT: ld s1, 48(sp)
-; RV64I-NEXT: ld ra, 56(sp)
-; RV64I-NEXT: addi sp, sp, 64
+; RV64I-NEXT: ld s4, 8(sp)
+; RV64I-NEXT: ld s3, 16(sp)
+; RV64I-NEXT: ld s2, 24(sp)
+; RV64I-NEXT: ld s1, 32(sp)
+; RV64I-NEXT: ld ra, 40(sp)
+; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_min_i16_release:
; RV32I-NEXT: sw s2, 20(sp)
; RV32I-NEXT: sw s3, 16(sp)
; RV32I-NEXT: sw s4, 12(sp)
-; RV32I-NEXT: sw s5, 8(sp)
-; RV32I-NEXT: sw s6, 4(sp)
; RV32I-NEXT: mv s2, a1
-; RV32I-NEXT: mv s6, a0
+; RV32I-NEXT: mv s4, a0
; RV32I-NEXT: lhu a0, 0(a0)
; RV32I-NEXT: slli a1, a1, 16
; RV32I-NEXT: srai s1, a1, 16
-; RV32I-NEXT: addi s3, sp, 2
-; RV32I-NEXT: addi s4, zero, 4
-; RV32I-NEXT: addi s5, zero, 2
+; RV32I-NEXT: addi s3, sp, 10
; RV32I-NEXT: .LBB98_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: slli a1, a0, 16
; RV32I-NEXT: mv a2, s2
; RV32I-NEXT: .LBB98_3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB98_1 Depth=1
-; RV32I-NEXT: sh a0, 2(sp)
-; RV32I-NEXT: mv a0, s6
+; RV32I-NEXT: sh a0, 10(sp)
+; RV32I-NEXT: mv a0, s4
; RV32I-NEXT: mv a1, s3
-; RV32I-NEXT: mv a3, s4
-; RV32I-NEXT: mv a4, s5
+; RV32I-NEXT: addi a3, zero, 4
+; RV32I-NEXT: addi a4, zero, 2
; RV32I-NEXT: call __atomic_compare_exchange_2
; RV32I-NEXT: mv a1, a0
-; RV32I-NEXT: lh a0, 2(sp)
+; RV32I-NEXT: lh a0, 10(sp)
; RV32I-NEXT: beqz a1, .LBB98_1
; RV32I-NEXT: # %bb.4: # %atomicrmw.end
-; RV32I-NEXT: lw s6, 4(sp)
-; RV32I-NEXT: lw s5, 8(sp)
; RV32I-NEXT: lw s4, 12(sp)
; RV32I-NEXT: lw s3, 16(sp)
; RV32I-NEXT: lw s2, 20(sp)
;
; RV64I-LABEL: atomicrmw_min_i16_acq_rel:
; RV64I: # %bb.0:
-; RV64I-NEXT: addi sp, sp, -64
-; RV64I-NEXT: sd ra, 56(sp)
-; RV64I-NEXT: sd s1, 48(sp)
-; RV64I-NEXT: sd s2, 40(sp)
-; RV64I-NEXT: sd s3, 32(sp)
-; RV64I-NEXT: sd s4, 24(sp)
-; RV64I-NEXT: sd s5, 16(sp)
-; RV64I-NEXT: sd s6, 8(sp)
+; RV64I-NEXT: addi sp, sp, -48
+; RV64I-NEXT: sd ra, 40(sp)
+; RV64I-NEXT: sd s1, 32(sp)
+; RV64I-NEXT: sd s2, 24(sp)
+; RV64I-NEXT: sd s3, 16(sp)
+; RV64I-NEXT: sd s4, 8(sp)
; RV64I-NEXT: mv s2, a1
-; RV64I-NEXT: mv s6, a0
+; RV64I-NEXT: mv s4, a0
; RV64I-NEXT: lhu a0, 0(a0)
; RV64I-NEXT: slli a1, a1, 48
; RV64I-NEXT: srai s1, a1, 48
; RV64I-NEXT: addi s3, sp, 6
-; RV64I-NEXT: addi s4, zero, 4
-; RV64I-NEXT: addi s5, zero, 2
; RV64I-NEXT: .LBB98_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: slli a1, a0, 48
; RV64I-NEXT: .LBB98_3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB98_1 Depth=1
; RV64I-NEXT: sh a0, 6(sp)
-; RV64I-NEXT: mv a0, s6
+; RV64I-NEXT: mv a0, s4
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s4
-; RV64I-NEXT: mv a4, s5
+; RV64I-NEXT: addi a3, zero, 4
+; RV64I-NEXT: addi a4, zero, 2
; RV64I-NEXT: call __atomic_compare_exchange_2
; RV64I-NEXT: mv a1, a0
; RV64I-NEXT: lh a0, 6(sp)
; RV64I-NEXT: beqz a1, .LBB98_1
; RV64I-NEXT: # %bb.4: # %atomicrmw.end
-; RV64I-NEXT: ld s6, 8(sp)
-; RV64I-NEXT: ld s5, 16(sp)
-; RV64I-NEXT: ld s4, 24(sp)
-; RV64I-NEXT: ld s3, 32(sp)
-; RV64I-NEXT: ld s2, 40(sp)
-; RV64I-NEXT: ld s1, 48(sp)
-; RV64I-NEXT: ld ra, 56(sp)
-; RV64I-NEXT: addi sp, sp, 64
+; RV64I-NEXT: ld s4, 8(sp)
+; RV64I-NEXT: ld s3, 16(sp)
+; RV64I-NEXT: ld s2, 24(sp)
+; RV64I-NEXT: ld s1, 32(sp)
+; RV64I-NEXT: ld ra, 40(sp)
+; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_min_i16_acq_rel:
; RV32I-NEXT: sw s2, 20(sp)
; RV32I-NEXT: sw s3, 16(sp)
; RV32I-NEXT: sw s4, 12(sp)
-; RV32I-NEXT: sw s5, 8(sp)
; RV32I-NEXT: mv s2, a1
; RV32I-NEXT: mv s4, a0
; RV32I-NEXT: lhu a0, 0(a0)
; RV32I-NEXT: slli a1, a1, 16
-; RV32I-NEXT: srai s5, a1, 16
-; RV32I-NEXT: addi s3, sp, 6
-; RV32I-NEXT: addi s1, zero, 5
+; RV32I-NEXT: srai s1, a1, 16
+; RV32I-NEXT: addi s3, sp, 10
; RV32I-NEXT: .LBB99_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: slli a1, a0, 16
; RV32I-NEXT: srai a1, a1, 16
; RV32I-NEXT: mv a2, a0
-; RV32I-NEXT: bge s5, a1, .LBB99_3
+; RV32I-NEXT: bge s1, a1, .LBB99_3
; RV32I-NEXT: # %bb.2: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB99_1 Depth=1
; RV32I-NEXT: mv a2, s2
; RV32I-NEXT: .LBB99_3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB99_1 Depth=1
-; RV32I-NEXT: sh a0, 6(sp)
+; RV32I-NEXT: sh a0, 10(sp)
; RV32I-NEXT: mv a0, s4
; RV32I-NEXT: mv a1, s3
-; RV32I-NEXT: mv a3, s1
-; RV32I-NEXT: mv a4, s1
+; RV32I-NEXT: addi a3, zero, 5
+; RV32I-NEXT: addi a4, zero, 5
; RV32I-NEXT: call __atomic_compare_exchange_2
; RV32I-NEXT: mv a1, a0
-; RV32I-NEXT: lh a0, 6(sp)
+; RV32I-NEXT: lh a0, 10(sp)
; RV32I-NEXT: beqz a1, .LBB99_1
; RV32I-NEXT: # %bb.4: # %atomicrmw.end
-; RV32I-NEXT: lw s5, 8(sp)
; RV32I-NEXT: lw s4, 12(sp)
; RV32I-NEXT: lw s3, 16(sp)
; RV32I-NEXT: lw s2, 20(sp)
;
; RV64I-LABEL: atomicrmw_min_i16_seq_cst:
; RV64I: # %bb.0:
-; RV64I-NEXT: addi sp, sp, -64
-; RV64I-NEXT: sd ra, 56(sp)
-; RV64I-NEXT: sd s1, 48(sp)
-; RV64I-NEXT: sd s2, 40(sp)
-; RV64I-NEXT: sd s3, 32(sp)
-; RV64I-NEXT: sd s4, 24(sp)
-; RV64I-NEXT: sd s5, 16(sp)
+; RV64I-NEXT: addi sp, sp, -48
+; RV64I-NEXT: sd ra, 40(sp)
+; RV64I-NEXT: sd s1, 32(sp)
+; RV64I-NEXT: sd s2, 24(sp)
+; RV64I-NEXT: sd s3, 16(sp)
+; RV64I-NEXT: sd s4, 8(sp)
; RV64I-NEXT: mv s2, a1
; RV64I-NEXT: mv s4, a0
; RV64I-NEXT: lhu a0, 0(a0)
; RV64I-NEXT: slli a1, a1, 48
-; RV64I-NEXT: srai s5, a1, 48
-; RV64I-NEXT: addi s3, sp, 14
-; RV64I-NEXT: addi s1, zero, 5
+; RV64I-NEXT: srai s1, a1, 48
+; RV64I-NEXT: addi s3, sp, 6
; RV64I-NEXT: .LBB99_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: slli a1, a0, 48
; RV64I-NEXT: srai a1, a1, 48
; RV64I-NEXT: mv a2, a0
-; RV64I-NEXT: bge s5, a1, .LBB99_3
+; RV64I-NEXT: bge s1, a1, .LBB99_3
; RV64I-NEXT: # %bb.2: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB99_1 Depth=1
; RV64I-NEXT: mv a2, s2
; RV64I-NEXT: .LBB99_3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB99_1 Depth=1
-; RV64I-NEXT: sh a0, 14(sp)
+; RV64I-NEXT: sh a0, 6(sp)
; RV64I-NEXT: mv a0, s4
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s1
-; RV64I-NEXT: mv a4, s1
+; RV64I-NEXT: addi a3, zero, 5
+; RV64I-NEXT: addi a4, zero, 5
; RV64I-NEXT: call __atomic_compare_exchange_2
; RV64I-NEXT: mv a1, a0
-; RV64I-NEXT: lh a0, 14(sp)
+; RV64I-NEXT: lh a0, 6(sp)
; RV64I-NEXT: beqz a1, .LBB99_1
; RV64I-NEXT: # %bb.4: # %atomicrmw.end
-; RV64I-NEXT: ld s5, 16(sp)
-; RV64I-NEXT: ld s4, 24(sp)
-; RV64I-NEXT: ld s3, 32(sp)
-; RV64I-NEXT: ld s2, 40(sp)
-; RV64I-NEXT: ld s1, 48(sp)
-; RV64I-NEXT: ld ra, 56(sp)
-; RV64I-NEXT: addi sp, sp, 64
+; RV64I-NEXT: ld s4, 8(sp)
+; RV64I-NEXT: ld s3, 16(sp)
+; RV64I-NEXT: ld s2, 24(sp)
+; RV64I-NEXT: ld s1, 32(sp)
+; RV64I-NEXT: ld ra, 40(sp)
+; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_min_i16_seq_cst:
; RV32I-NEXT: sw s3, 16(sp)
; RV32I-NEXT: sw s4, 12(sp)
; RV32I-NEXT: sw s5, 8(sp)
-; RV32I-NEXT: sw s6, 4(sp)
; RV32I-NEXT: mv s2, a1
; RV32I-NEXT: mv s4, a0
; RV32I-NEXT: lhu a0, 0(a0)
; RV32I-NEXT: lui a1, 16
-; RV32I-NEXT: addi s5, a1, -1
-; RV32I-NEXT: and s6, s2, s5
-; RV32I-NEXT: addi s3, sp, 2
-; RV32I-NEXT: addi s1, zero, 2
+; RV32I-NEXT: addi s1, a1, -1
+; RV32I-NEXT: and s5, s2, s1
+; RV32I-NEXT: addi s3, sp, 6
; RV32I-NEXT: .LBB101_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
-; RV32I-NEXT: and a1, a0, s5
+; RV32I-NEXT: and a1, a0, s1
; RV32I-NEXT: mv a2, a0
-; RV32I-NEXT: bltu s6, a1, .LBB101_3
+; RV32I-NEXT: bltu s5, a1, .LBB101_3
; RV32I-NEXT: # %bb.2: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB101_1 Depth=1
; RV32I-NEXT: mv a2, s2
; RV32I-NEXT: .LBB101_3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB101_1 Depth=1
-; RV32I-NEXT: sh a0, 2(sp)
+; RV32I-NEXT: sh a0, 6(sp)
; RV32I-NEXT: mv a0, s4
; RV32I-NEXT: mv a1, s3
-; RV32I-NEXT: mv a3, s1
-; RV32I-NEXT: mv a4, s1
+; RV32I-NEXT: addi a3, zero, 2
+; RV32I-NEXT: addi a4, zero, 2
; RV32I-NEXT: call __atomic_compare_exchange_2
; RV32I-NEXT: mv a1, a0
-; RV32I-NEXT: lh a0, 2(sp)
+; RV32I-NEXT: lh a0, 6(sp)
; RV32I-NEXT: beqz a1, .LBB101_1
; RV32I-NEXT: # %bb.4: # %atomicrmw.end
-; RV32I-NEXT: lw s6, 4(sp)
; RV32I-NEXT: lw s5, 8(sp)
; RV32I-NEXT: lw s4, 12(sp)
; RV32I-NEXT: lw s3, 16(sp)
; RV64I-NEXT: sd s3, 32(sp)
; RV64I-NEXT: sd s4, 24(sp)
; RV64I-NEXT: sd s5, 16(sp)
-; RV64I-NEXT: sd s6, 8(sp)
; RV64I-NEXT: mv s2, a1
; RV64I-NEXT: mv s4, a0
; RV64I-NEXT: lhu a0, 0(a0)
; RV64I-NEXT: lui a1, 16
-; RV64I-NEXT: addiw s5, a1, -1
-; RV64I-NEXT: and s6, s2, s5
-; RV64I-NEXT: addi s3, sp, 6
-; RV64I-NEXT: addi s1, zero, 2
+; RV64I-NEXT: addiw s1, a1, -1
+; RV64I-NEXT: and s5, s2, s1
+; RV64I-NEXT: addi s3, sp, 14
; RV64I-NEXT: .LBB101_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
-; RV64I-NEXT: and a1, a0, s5
+; RV64I-NEXT: and a1, a0, s1
; RV64I-NEXT: mv a2, a0
-; RV64I-NEXT: bltu s6, a1, .LBB101_3
+; RV64I-NEXT: bltu s5, a1, .LBB101_3
; RV64I-NEXT: # %bb.2: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB101_1 Depth=1
; RV64I-NEXT: mv a2, s2
; RV64I-NEXT: .LBB101_3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB101_1 Depth=1
-; RV64I-NEXT: sh a0, 6(sp)
+; RV64I-NEXT: sh a0, 14(sp)
; RV64I-NEXT: mv a0, s4
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s1
-; RV64I-NEXT: mv a4, s1
+; RV64I-NEXT: addi a3, zero, 2
+; RV64I-NEXT: addi a4, zero, 2
; RV64I-NEXT: call __atomic_compare_exchange_2
; RV64I-NEXT: mv a1, a0
-; RV64I-NEXT: lh a0, 6(sp)
+; RV64I-NEXT: lh a0, 14(sp)
; RV64I-NEXT: beqz a1, .LBB101_1
; RV64I-NEXT: # %bb.4: # %atomicrmw.end
-; RV64I-NEXT: ld s6, 8(sp)
; RV64I-NEXT: ld s5, 16(sp)
; RV64I-NEXT: ld s4, 24(sp)
; RV64I-NEXT: ld s3, 32(sp)
; RV32I-NEXT: sw s3, 16(sp)
; RV32I-NEXT: sw s4, 12(sp)
; RV32I-NEXT: sw s5, 8(sp)
-; RV32I-NEXT: sw s6, 4(sp)
; RV32I-NEXT: mv s2, a1
-; RV32I-NEXT: mv s5, a0
+; RV32I-NEXT: mv s4, a0
; RV32I-NEXT: lhu a0, 0(a0)
; RV32I-NEXT: lui a1, 16
; RV32I-NEXT: addi s1, a1, -1
-; RV32I-NEXT: and s6, s2, s1
-; RV32I-NEXT: addi s3, sp, 2
-; RV32I-NEXT: addi s4, zero, 3
+; RV32I-NEXT: and s5, s2, s1
+; RV32I-NEXT: addi s3, sp, 6
; RV32I-NEXT: .LBB102_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: and a1, a0, s1
; RV32I-NEXT: mv a2, a0
-; RV32I-NEXT: bltu s6, a1, .LBB102_3
+; RV32I-NEXT: bltu s5, a1, .LBB102_3
; RV32I-NEXT: # %bb.2: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB102_1 Depth=1
; RV32I-NEXT: mv a2, s2
; RV32I-NEXT: .LBB102_3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB102_1 Depth=1
-; RV32I-NEXT: sh a0, 2(sp)
-; RV32I-NEXT: mv a0, s5
+; RV32I-NEXT: sh a0, 6(sp)
+; RV32I-NEXT: mv a0, s4
; RV32I-NEXT: mv a1, s3
-; RV32I-NEXT: mv a3, s4
+; RV32I-NEXT: addi a3, zero, 3
; RV32I-NEXT: mv a4, zero
; RV32I-NEXT: call __atomic_compare_exchange_2
; RV32I-NEXT: mv a1, a0
-; RV32I-NEXT: lh a0, 2(sp)
+; RV32I-NEXT: lh a0, 6(sp)
; RV32I-NEXT: beqz a1, .LBB102_1
; RV32I-NEXT: # %bb.4: # %atomicrmw.end
-; RV32I-NEXT: lw s6, 4(sp)
; RV32I-NEXT: lw s5, 8(sp)
; RV32I-NEXT: lw s4, 12(sp)
; RV32I-NEXT: lw s3, 16(sp)
; RV64I-NEXT: sd s3, 32(sp)
; RV64I-NEXT: sd s4, 24(sp)
; RV64I-NEXT: sd s5, 16(sp)
-; RV64I-NEXT: sd s6, 8(sp)
; RV64I-NEXT: mv s2, a1
-; RV64I-NEXT: mv s5, a0
+; RV64I-NEXT: mv s4, a0
; RV64I-NEXT: lhu a0, 0(a0)
; RV64I-NEXT: lui a1, 16
; RV64I-NEXT: addiw s1, a1, -1
-; RV64I-NEXT: and s6, s2, s1
-; RV64I-NEXT: addi s3, sp, 6
-; RV64I-NEXT: addi s4, zero, 3
+; RV64I-NEXT: and s5, s2, s1
+; RV64I-NEXT: addi s3, sp, 14
; RV64I-NEXT: .LBB102_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: and a1, a0, s1
; RV64I-NEXT: mv a2, a0
-; RV64I-NEXT: bltu s6, a1, .LBB102_3
+; RV64I-NEXT: bltu s5, a1, .LBB102_3
; RV64I-NEXT: # %bb.2: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB102_1 Depth=1
; RV64I-NEXT: mv a2, s2
; RV64I-NEXT: .LBB102_3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB102_1 Depth=1
-; RV64I-NEXT: sh a0, 6(sp)
-; RV64I-NEXT: mv a0, s5
+; RV64I-NEXT: sh a0, 14(sp)
+; RV64I-NEXT: mv a0, s4
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s4
+; RV64I-NEXT: addi a3, zero, 3
; RV64I-NEXT: mv a4, zero
; RV64I-NEXT: call __atomic_compare_exchange_2
; RV64I-NEXT: mv a1, a0
-; RV64I-NEXT: lh a0, 6(sp)
+; RV64I-NEXT: lh a0, 14(sp)
; RV64I-NEXT: beqz a1, .LBB102_1
; RV64I-NEXT: # %bb.4: # %atomicrmw.end
-; RV64I-NEXT: ld s6, 8(sp)
; RV64I-NEXT: ld s5, 16(sp)
; RV64I-NEXT: ld s4, 24(sp)
; RV64I-NEXT: ld s3, 32(sp)
define i16 @atomicrmw_umax_i16_acq_rel(i16 *%a, i16 %b) nounwind {
; RV32I-LABEL: atomicrmw_umax_i16_acq_rel:
; RV32I: # %bb.0:
-; RV32I-NEXT: addi sp, sp, -48
-; RV32I-NEXT: sw ra, 44(sp)
-; RV32I-NEXT: sw s1, 40(sp)
-; RV32I-NEXT: sw s2, 36(sp)
-; RV32I-NEXT: sw s3, 32(sp)
-; RV32I-NEXT: sw s4, 28(sp)
-; RV32I-NEXT: sw s5, 24(sp)
-; RV32I-NEXT: sw s6, 20(sp)
-; RV32I-NEXT: sw s7, 16(sp)
+; RV32I-NEXT: addi sp, sp, -32
+; RV32I-NEXT: sw ra, 28(sp)
+; RV32I-NEXT: sw s1, 24(sp)
+; RV32I-NEXT: sw s2, 20(sp)
+; RV32I-NEXT: sw s3, 16(sp)
+; RV32I-NEXT: sw s4, 12(sp)
+; RV32I-NEXT: sw s5, 8(sp)
; RV32I-NEXT: mv s2, a1
-; RV32I-NEXT: mv s6, a0
+; RV32I-NEXT: mv s4, a0
; RV32I-NEXT: lhu a0, 0(a0)
; RV32I-NEXT: lui a1, 16
; RV32I-NEXT: addi s1, a1, -1
-; RV32I-NEXT: and s7, s2, s1
-; RV32I-NEXT: addi s3, sp, 14
-; RV32I-NEXT: addi s4, zero, 4
-; RV32I-NEXT: addi s5, zero, 2
+; RV32I-NEXT: and s5, s2, s1
+; RV32I-NEXT: addi s3, sp, 6
; RV32I-NEXT: .LBB103_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: and a1, a0, s1
; RV32I-NEXT: mv a2, a0
-; RV32I-NEXT: bltu s7, a1, .LBB103_3
+; RV32I-NEXT: bltu s5, a1, .LBB103_3
; RV32I-NEXT: # %bb.2: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB103_1 Depth=1
; RV32I-NEXT: mv a2, s2
; RV32I-NEXT: .LBB103_3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB103_1 Depth=1
-; RV32I-NEXT: sh a0, 14(sp)
-; RV32I-NEXT: mv a0, s6
+; RV32I-NEXT: sh a0, 6(sp)
+; RV32I-NEXT: mv a0, s4
; RV32I-NEXT: mv a1, s3
-; RV32I-NEXT: mv a3, s4
-; RV32I-NEXT: mv a4, s5
+; RV32I-NEXT: addi a3, zero, 4
+; RV32I-NEXT: addi a4, zero, 2
; RV32I-NEXT: call __atomic_compare_exchange_2
; RV32I-NEXT: mv a1, a0
-; RV32I-NEXT: lh a0, 14(sp)
+; RV32I-NEXT: lh a0, 6(sp)
; RV32I-NEXT: beqz a1, .LBB103_1
; RV32I-NEXT: # %bb.4: # %atomicrmw.end
-; RV32I-NEXT: lw s7, 16(sp)
-; RV32I-NEXT: lw s6, 20(sp)
-; RV32I-NEXT: lw s5, 24(sp)
-; RV32I-NEXT: lw s4, 28(sp)
-; RV32I-NEXT: lw s3, 32(sp)
-; RV32I-NEXT: lw s2, 36(sp)
-; RV32I-NEXT: lw s1, 40(sp)
-; RV32I-NEXT: lw ra, 44(sp)
-; RV32I-NEXT: addi sp, sp, 48
+; RV32I-NEXT: lw s5, 8(sp)
+; RV32I-NEXT: lw s4, 12(sp)
+; RV32I-NEXT: lw s3, 16(sp)
+; RV32I-NEXT: lw s2, 20(sp)
+; RV32I-NEXT: lw s1, 24(sp)
+; RV32I-NEXT: lw ra, 28(sp)
+; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_umax_i16_acq_rel:
;
; RV64I-LABEL: atomicrmw_umax_i16_acq_rel:
; RV64I: # %bb.0:
-; RV64I-NEXT: addi sp, sp, -80
-; RV64I-NEXT: sd ra, 72(sp)
-; RV64I-NEXT: sd s1, 64(sp)
-; RV64I-NEXT: sd s2, 56(sp)
-; RV64I-NEXT: sd s3, 48(sp)
-; RV64I-NEXT: sd s4, 40(sp)
-; RV64I-NEXT: sd s5, 32(sp)
-; RV64I-NEXT: sd s6, 24(sp)
-; RV64I-NEXT: sd s7, 16(sp)
+; RV64I-NEXT: addi sp, sp, -64
+; RV64I-NEXT: sd ra, 56(sp)
+; RV64I-NEXT: sd s1, 48(sp)
+; RV64I-NEXT: sd s2, 40(sp)
+; RV64I-NEXT: sd s3, 32(sp)
+; RV64I-NEXT: sd s4, 24(sp)
+; RV64I-NEXT: sd s5, 16(sp)
; RV64I-NEXT: mv s2, a1
-; RV64I-NEXT: mv s6, a0
+; RV64I-NEXT: mv s4, a0
; RV64I-NEXT: lhu a0, 0(a0)
; RV64I-NEXT: lui a1, 16
; RV64I-NEXT: addiw s1, a1, -1
-; RV64I-NEXT: and s7, s2, s1
+; RV64I-NEXT: and s5, s2, s1
; RV64I-NEXT: addi s3, sp, 14
-; RV64I-NEXT: addi s4, zero, 4
-; RV64I-NEXT: addi s5, zero, 2
; RV64I-NEXT: .LBB103_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: and a1, a0, s1
; RV64I-NEXT: mv a2, a0
-; RV64I-NEXT: bltu s7, a1, .LBB103_3
+; RV64I-NEXT: bltu s5, a1, .LBB103_3
; RV64I-NEXT: # %bb.2: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB103_1 Depth=1
; RV64I-NEXT: mv a2, s2
; RV64I-NEXT: .LBB103_3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB103_1 Depth=1
; RV64I-NEXT: sh a0, 14(sp)
-; RV64I-NEXT: mv a0, s6
+; RV64I-NEXT: mv a0, s4
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s4
-; RV64I-NEXT: mv a4, s5
+; RV64I-NEXT: addi a3, zero, 4
+; RV64I-NEXT: addi a4, zero, 2
; RV64I-NEXT: call __atomic_compare_exchange_2
; RV64I-NEXT: mv a1, a0
; RV64I-NEXT: lh a0, 14(sp)
; RV64I-NEXT: beqz a1, .LBB103_1
; RV64I-NEXT: # %bb.4: # %atomicrmw.end
-; RV64I-NEXT: ld s7, 16(sp)
-; RV64I-NEXT: ld s6, 24(sp)
-; RV64I-NEXT: ld s5, 32(sp)
-; RV64I-NEXT: ld s4, 40(sp)
-; RV64I-NEXT: ld s3, 48(sp)
-; RV64I-NEXT: ld s2, 56(sp)
-; RV64I-NEXT: ld s1, 64(sp)
-; RV64I-NEXT: ld ra, 72(sp)
-; RV64I-NEXT: addi sp, sp, 80
+; RV64I-NEXT: ld s5, 16(sp)
+; RV64I-NEXT: ld s4, 24(sp)
+; RV64I-NEXT: ld s3, 32(sp)
+; RV64I-NEXT: ld s2, 40(sp)
+; RV64I-NEXT: ld s1, 48(sp)
+; RV64I-NEXT: ld ra, 56(sp)
+; RV64I-NEXT: addi sp, sp, 64
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_umax_i16_acq_rel:
; RV32I-NEXT: sw s3, 16(sp)
; RV32I-NEXT: sw s4, 12(sp)
; RV32I-NEXT: sw s5, 8(sp)
-; RV32I-NEXT: sw s6, 4(sp)
; RV32I-NEXT: mv s2, a1
; RV32I-NEXT: mv s4, a0
; RV32I-NEXT: lhu a0, 0(a0)
; RV32I-NEXT: lui a1, 16
-; RV32I-NEXT: addi s5, a1, -1
-; RV32I-NEXT: and s6, s2, s5
-; RV32I-NEXT: addi s3, sp, 2
-; RV32I-NEXT: addi s1, zero, 5
+; RV32I-NEXT: addi s1, a1, -1
+; RV32I-NEXT: and s5, s2, s1
+; RV32I-NEXT: addi s3, sp, 6
; RV32I-NEXT: .LBB104_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
-; RV32I-NEXT: and a1, a0, s5
+; RV32I-NEXT: and a1, a0, s1
; RV32I-NEXT: mv a2, a0
-; RV32I-NEXT: bltu s6, a1, .LBB104_3
+; RV32I-NEXT: bltu s5, a1, .LBB104_3
; RV32I-NEXT: # %bb.2: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB104_1 Depth=1
; RV32I-NEXT: mv a2, s2
; RV32I-NEXT: .LBB104_3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB104_1 Depth=1
-; RV32I-NEXT: sh a0, 2(sp)
+; RV32I-NEXT: sh a0, 6(sp)
; RV32I-NEXT: mv a0, s4
; RV32I-NEXT: mv a1, s3
-; RV32I-NEXT: mv a3, s1
-; RV32I-NEXT: mv a4, s1
+; RV32I-NEXT: addi a3, zero, 5
+; RV32I-NEXT: addi a4, zero, 5
; RV32I-NEXT: call __atomic_compare_exchange_2
; RV32I-NEXT: mv a1, a0
-; RV32I-NEXT: lh a0, 2(sp)
+; RV32I-NEXT: lh a0, 6(sp)
; RV32I-NEXT: beqz a1, .LBB104_1
; RV32I-NEXT: # %bb.4: # %atomicrmw.end
-; RV32I-NEXT: lw s6, 4(sp)
; RV32I-NEXT: lw s5, 8(sp)
; RV32I-NEXT: lw s4, 12(sp)
; RV32I-NEXT: lw s3, 16(sp)
; RV64I-NEXT: sd s3, 32(sp)
; RV64I-NEXT: sd s4, 24(sp)
; RV64I-NEXT: sd s5, 16(sp)
-; RV64I-NEXT: sd s6, 8(sp)
; RV64I-NEXT: mv s2, a1
; RV64I-NEXT: mv s4, a0
; RV64I-NEXT: lhu a0, 0(a0)
; RV64I-NEXT: lui a1, 16
-; RV64I-NEXT: addiw s5, a1, -1
-; RV64I-NEXT: and s6, s2, s5
-; RV64I-NEXT: addi s3, sp, 6
-; RV64I-NEXT: addi s1, zero, 5
+; RV64I-NEXT: addiw s1, a1, -1
+; RV64I-NEXT: and s5, s2, s1
+; RV64I-NEXT: addi s3, sp, 14
; RV64I-NEXT: .LBB104_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
-; RV64I-NEXT: and a1, a0, s5
+; RV64I-NEXT: and a1, a0, s1
; RV64I-NEXT: mv a2, a0
-; RV64I-NEXT: bltu s6, a1, .LBB104_3
+; RV64I-NEXT: bltu s5, a1, .LBB104_3
; RV64I-NEXT: # %bb.2: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB104_1 Depth=1
; RV64I-NEXT: mv a2, s2
; RV64I-NEXT: .LBB104_3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB104_1 Depth=1
-; RV64I-NEXT: sh a0, 6(sp)
+; RV64I-NEXT: sh a0, 14(sp)
; RV64I-NEXT: mv a0, s4
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s1
-; RV64I-NEXT: mv a4, s1
+; RV64I-NEXT: addi a3, zero, 5
+; RV64I-NEXT: addi a4, zero, 5
; RV64I-NEXT: call __atomic_compare_exchange_2
; RV64I-NEXT: mv a1, a0
-; RV64I-NEXT: lh a0, 6(sp)
+; RV64I-NEXT: lh a0, 14(sp)
; RV64I-NEXT: beqz a1, .LBB104_1
; RV64I-NEXT: # %bb.4: # %atomicrmw.end
-; RV64I-NEXT: ld s6, 8(sp)
; RV64I-NEXT: ld s5, 16(sp)
; RV64I-NEXT: ld s4, 24(sp)
; RV64I-NEXT: ld s3, 32(sp)
; RV32I-NEXT: sw s3, 16(sp)
; RV32I-NEXT: sw s4, 12(sp)
; RV32I-NEXT: sw s5, 8(sp)
-; RV32I-NEXT: sw s6, 4(sp)
; RV32I-NEXT: mv s2, a1
; RV32I-NEXT: mv s4, a0
; RV32I-NEXT: lhu a0, 0(a0)
; RV32I-NEXT: lui a1, 16
-; RV32I-NEXT: addi s5, a1, -1
-; RV32I-NEXT: and s6, s2, s5
-; RV32I-NEXT: addi s3, sp, 2
-; RV32I-NEXT: addi s1, zero, 2
+; RV32I-NEXT: addi s1, a1, -1
+; RV32I-NEXT: and s5, s2, s1
+; RV32I-NEXT: addi s3, sp, 6
; RV32I-NEXT: .LBB106_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
-; RV32I-NEXT: and a1, a0, s5
+; RV32I-NEXT: and a1, a0, s1
; RV32I-NEXT: mv a2, a0
-; RV32I-NEXT: bgeu s6, a1, .LBB106_3
+; RV32I-NEXT: bgeu s5, a1, .LBB106_3
; RV32I-NEXT: # %bb.2: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB106_1 Depth=1
; RV32I-NEXT: mv a2, s2
; RV32I-NEXT: .LBB106_3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB106_1 Depth=1
-; RV32I-NEXT: sh a0, 2(sp)
+; RV32I-NEXT: sh a0, 6(sp)
; RV32I-NEXT: mv a0, s4
; RV32I-NEXT: mv a1, s3
-; RV32I-NEXT: mv a3, s1
-; RV32I-NEXT: mv a4, s1
+; RV32I-NEXT: addi a3, zero, 2
+; RV32I-NEXT: addi a4, zero, 2
; RV32I-NEXT: call __atomic_compare_exchange_2
; RV32I-NEXT: mv a1, a0
-; RV32I-NEXT: lh a0, 2(sp)
+; RV32I-NEXT: lh a0, 6(sp)
; RV32I-NEXT: beqz a1, .LBB106_1
; RV32I-NEXT: # %bb.4: # %atomicrmw.end
-; RV32I-NEXT: lw s6, 4(sp)
; RV32I-NEXT: lw s5, 8(sp)
; RV32I-NEXT: lw s4, 12(sp)
; RV32I-NEXT: lw s3, 16(sp)
; RV64I-NEXT: sd s3, 32(sp)
; RV64I-NEXT: sd s4, 24(sp)
; RV64I-NEXT: sd s5, 16(sp)
-; RV64I-NEXT: sd s6, 8(sp)
; RV64I-NEXT: mv s2, a1
; RV64I-NEXT: mv s4, a0
; RV64I-NEXT: lhu a0, 0(a0)
; RV64I-NEXT: lui a1, 16
-; RV64I-NEXT: addiw s5, a1, -1
-; RV64I-NEXT: and s6, s2, s5
-; RV64I-NEXT: addi s3, sp, 6
-; RV64I-NEXT: addi s1, zero, 2
+; RV64I-NEXT: addiw s1, a1, -1
+; RV64I-NEXT: and s5, s2, s1
+; RV64I-NEXT: addi s3, sp, 14
; RV64I-NEXT: .LBB106_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
-; RV64I-NEXT: and a1, a0, s5
+; RV64I-NEXT: and a1, a0, s1
; RV64I-NEXT: mv a2, a0
-; RV64I-NEXT: bgeu s6, a1, .LBB106_3
+; RV64I-NEXT: bgeu s5, a1, .LBB106_3
; RV64I-NEXT: # %bb.2: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB106_1 Depth=1
; RV64I-NEXT: mv a2, s2
; RV64I-NEXT: .LBB106_3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB106_1 Depth=1
-; RV64I-NEXT: sh a0, 6(sp)
+; RV64I-NEXT: sh a0, 14(sp)
; RV64I-NEXT: mv a0, s4
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s1
-; RV64I-NEXT: mv a4, s1
+; RV64I-NEXT: addi a3, zero, 2
+; RV64I-NEXT: addi a4, zero, 2
; RV64I-NEXT: call __atomic_compare_exchange_2
; RV64I-NEXT: mv a1, a0
-; RV64I-NEXT: lh a0, 6(sp)
+; RV64I-NEXT: lh a0, 14(sp)
; RV64I-NEXT: beqz a1, .LBB106_1
; RV64I-NEXT: # %bb.4: # %atomicrmw.end
-; RV64I-NEXT: ld s6, 8(sp)
; RV64I-NEXT: ld s5, 16(sp)
; RV64I-NEXT: ld s4, 24(sp)
; RV64I-NEXT: ld s3, 32(sp)
; RV32I-NEXT: sw s3, 16(sp)
; RV32I-NEXT: sw s4, 12(sp)
; RV32I-NEXT: sw s5, 8(sp)
-; RV32I-NEXT: sw s6, 4(sp)
; RV32I-NEXT: mv s2, a1
-; RV32I-NEXT: mv s5, a0
+; RV32I-NEXT: mv s4, a0
; RV32I-NEXT: lhu a0, 0(a0)
; RV32I-NEXT: lui a1, 16
; RV32I-NEXT: addi s1, a1, -1
-; RV32I-NEXT: and s6, s2, s1
-; RV32I-NEXT: addi s3, sp, 2
-; RV32I-NEXT: addi s4, zero, 3
+; RV32I-NEXT: and s5, s2, s1
+; RV32I-NEXT: addi s3, sp, 6
; RV32I-NEXT: .LBB107_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: and a1, a0, s1
; RV32I-NEXT: mv a2, a0
-; RV32I-NEXT: bgeu s6, a1, .LBB107_3
+; RV32I-NEXT: bgeu s5, a1, .LBB107_3
; RV32I-NEXT: # %bb.2: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB107_1 Depth=1
; RV32I-NEXT: mv a2, s2
; RV32I-NEXT: .LBB107_3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB107_1 Depth=1
-; RV32I-NEXT: sh a0, 2(sp)
-; RV32I-NEXT: mv a0, s5
+; RV32I-NEXT: sh a0, 6(sp)
+; RV32I-NEXT: mv a0, s4
; RV32I-NEXT: mv a1, s3
-; RV32I-NEXT: mv a3, s4
+; RV32I-NEXT: addi a3, zero, 3
; RV32I-NEXT: mv a4, zero
; RV32I-NEXT: call __atomic_compare_exchange_2
; RV32I-NEXT: mv a1, a0
-; RV32I-NEXT: lh a0, 2(sp)
+; RV32I-NEXT: lh a0, 6(sp)
; RV32I-NEXT: beqz a1, .LBB107_1
; RV32I-NEXT: # %bb.4: # %atomicrmw.end
-; RV32I-NEXT: lw s6, 4(sp)
; RV32I-NEXT: lw s5, 8(sp)
; RV32I-NEXT: lw s4, 12(sp)
; RV32I-NEXT: lw s3, 16(sp)
; RV64I-NEXT: sd s3, 32(sp)
; RV64I-NEXT: sd s4, 24(sp)
; RV64I-NEXT: sd s5, 16(sp)
-; RV64I-NEXT: sd s6, 8(sp)
; RV64I-NEXT: mv s2, a1
-; RV64I-NEXT: mv s5, a0
+; RV64I-NEXT: mv s4, a0
; RV64I-NEXT: lhu a0, 0(a0)
; RV64I-NEXT: lui a1, 16
; RV64I-NEXT: addiw s1, a1, -1
-; RV64I-NEXT: and s6, s2, s1
-; RV64I-NEXT: addi s3, sp, 6
-; RV64I-NEXT: addi s4, zero, 3
+; RV64I-NEXT: and s5, s2, s1
+; RV64I-NEXT: addi s3, sp, 14
; RV64I-NEXT: .LBB107_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: and a1, a0, s1
; RV64I-NEXT: mv a2, a0
-; RV64I-NEXT: bgeu s6, a1, .LBB107_3
+; RV64I-NEXT: bgeu s5, a1, .LBB107_3
; RV64I-NEXT: # %bb.2: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB107_1 Depth=1
; RV64I-NEXT: mv a2, s2
; RV64I-NEXT: .LBB107_3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB107_1 Depth=1
-; RV64I-NEXT: sh a0, 6(sp)
-; RV64I-NEXT: mv a0, s5
+; RV64I-NEXT: sh a0, 14(sp)
+; RV64I-NEXT: mv a0, s4
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s4
+; RV64I-NEXT: addi a3, zero, 3
; RV64I-NEXT: mv a4, zero
; RV64I-NEXT: call __atomic_compare_exchange_2
; RV64I-NEXT: mv a1, a0
-; RV64I-NEXT: lh a0, 6(sp)
+; RV64I-NEXT: lh a0, 14(sp)
; RV64I-NEXT: beqz a1, .LBB107_1
; RV64I-NEXT: # %bb.4: # %atomicrmw.end
-; RV64I-NEXT: ld s6, 8(sp)
; RV64I-NEXT: ld s5, 16(sp)
; RV64I-NEXT: ld s4, 24(sp)
; RV64I-NEXT: ld s3, 32(sp)
define i16 @atomicrmw_umin_i16_acq_rel(i16 *%a, i16 %b) nounwind {
; RV32I-LABEL: atomicrmw_umin_i16_acq_rel:
; RV32I: # %bb.0:
-; RV32I-NEXT: addi sp, sp, -48
-; RV32I-NEXT: sw ra, 44(sp)
-; RV32I-NEXT: sw s1, 40(sp)
-; RV32I-NEXT: sw s2, 36(sp)
-; RV32I-NEXT: sw s3, 32(sp)
-; RV32I-NEXT: sw s4, 28(sp)
-; RV32I-NEXT: sw s5, 24(sp)
-; RV32I-NEXT: sw s6, 20(sp)
-; RV32I-NEXT: sw s7, 16(sp)
+; RV32I-NEXT: addi sp, sp, -32
+; RV32I-NEXT: sw ra, 28(sp)
+; RV32I-NEXT: sw s1, 24(sp)
+; RV32I-NEXT: sw s2, 20(sp)
+; RV32I-NEXT: sw s3, 16(sp)
+; RV32I-NEXT: sw s4, 12(sp)
+; RV32I-NEXT: sw s5, 8(sp)
; RV32I-NEXT: mv s2, a1
-; RV32I-NEXT: mv s6, a0
+; RV32I-NEXT: mv s4, a0
; RV32I-NEXT: lhu a0, 0(a0)
; RV32I-NEXT: lui a1, 16
; RV32I-NEXT: addi s1, a1, -1
-; RV32I-NEXT: and s7, s2, s1
-; RV32I-NEXT: addi s3, sp, 14
-; RV32I-NEXT: addi s4, zero, 4
-; RV32I-NEXT: addi s5, zero, 2
+; RV32I-NEXT: and s5, s2, s1
+; RV32I-NEXT: addi s3, sp, 6
; RV32I-NEXT: .LBB108_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: and a1, a0, s1
; RV32I-NEXT: mv a2, a0
-; RV32I-NEXT: bgeu s7, a1, .LBB108_3
+; RV32I-NEXT: bgeu s5, a1, .LBB108_3
; RV32I-NEXT: # %bb.2: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB108_1 Depth=1
; RV32I-NEXT: mv a2, s2
; RV32I-NEXT: .LBB108_3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB108_1 Depth=1
-; RV32I-NEXT: sh a0, 14(sp)
-; RV32I-NEXT: mv a0, s6
+; RV32I-NEXT: sh a0, 6(sp)
+; RV32I-NEXT: mv a0, s4
; RV32I-NEXT: mv a1, s3
-; RV32I-NEXT: mv a3, s4
-; RV32I-NEXT: mv a4, s5
+; RV32I-NEXT: addi a3, zero, 4
+; RV32I-NEXT: addi a4, zero, 2
; RV32I-NEXT: call __atomic_compare_exchange_2
; RV32I-NEXT: mv a1, a0
-; RV32I-NEXT: lh a0, 14(sp)
+; RV32I-NEXT: lh a0, 6(sp)
; RV32I-NEXT: beqz a1, .LBB108_1
; RV32I-NEXT: # %bb.4: # %atomicrmw.end
-; RV32I-NEXT: lw s7, 16(sp)
-; RV32I-NEXT: lw s6, 20(sp)
-; RV32I-NEXT: lw s5, 24(sp)
-; RV32I-NEXT: lw s4, 28(sp)
-; RV32I-NEXT: lw s3, 32(sp)
-; RV32I-NEXT: lw s2, 36(sp)
-; RV32I-NEXT: lw s1, 40(sp)
-; RV32I-NEXT: lw ra, 44(sp)
-; RV32I-NEXT: addi sp, sp, 48
+; RV32I-NEXT: lw s5, 8(sp)
+; RV32I-NEXT: lw s4, 12(sp)
+; RV32I-NEXT: lw s3, 16(sp)
+; RV32I-NEXT: lw s2, 20(sp)
+; RV32I-NEXT: lw s1, 24(sp)
+; RV32I-NEXT: lw ra, 28(sp)
+; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_umin_i16_acq_rel:
;
; RV64I-LABEL: atomicrmw_umin_i16_acq_rel:
; RV64I: # %bb.0:
-; RV64I-NEXT: addi sp, sp, -80
-; RV64I-NEXT: sd ra, 72(sp)
-; RV64I-NEXT: sd s1, 64(sp)
-; RV64I-NEXT: sd s2, 56(sp)
-; RV64I-NEXT: sd s3, 48(sp)
-; RV64I-NEXT: sd s4, 40(sp)
-; RV64I-NEXT: sd s5, 32(sp)
-; RV64I-NEXT: sd s6, 24(sp)
-; RV64I-NEXT: sd s7, 16(sp)
+; RV64I-NEXT: addi sp, sp, -64
+; RV64I-NEXT: sd ra, 56(sp)
+; RV64I-NEXT: sd s1, 48(sp)
+; RV64I-NEXT: sd s2, 40(sp)
+; RV64I-NEXT: sd s3, 32(sp)
+; RV64I-NEXT: sd s4, 24(sp)
+; RV64I-NEXT: sd s5, 16(sp)
; RV64I-NEXT: mv s2, a1
-; RV64I-NEXT: mv s6, a0
+; RV64I-NEXT: mv s4, a0
; RV64I-NEXT: lhu a0, 0(a0)
; RV64I-NEXT: lui a1, 16
; RV64I-NEXT: addiw s1, a1, -1
-; RV64I-NEXT: and s7, s2, s1
+; RV64I-NEXT: and s5, s2, s1
; RV64I-NEXT: addi s3, sp, 14
-; RV64I-NEXT: addi s4, zero, 4
-; RV64I-NEXT: addi s5, zero, 2
; RV64I-NEXT: .LBB108_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: and a1, a0, s1
; RV64I-NEXT: mv a2, a0
-; RV64I-NEXT: bgeu s7, a1, .LBB108_3
+; RV64I-NEXT: bgeu s5, a1, .LBB108_3
; RV64I-NEXT: # %bb.2: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB108_1 Depth=1
; RV64I-NEXT: mv a2, s2
; RV64I-NEXT: .LBB108_3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB108_1 Depth=1
; RV64I-NEXT: sh a0, 14(sp)
-; RV64I-NEXT: mv a0, s6
+; RV64I-NEXT: mv a0, s4
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s4
-; RV64I-NEXT: mv a4, s5
+; RV64I-NEXT: addi a3, zero, 4
+; RV64I-NEXT: addi a4, zero, 2
; RV64I-NEXT: call __atomic_compare_exchange_2
; RV64I-NEXT: mv a1, a0
; RV64I-NEXT: lh a0, 14(sp)
; RV64I-NEXT: beqz a1, .LBB108_1
; RV64I-NEXT: # %bb.4: # %atomicrmw.end
-; RV64I-NEXT: ld s7, 16(sp)
-; RV64I-NEXT: ld s6, 24(sp)
-; RV64I-NEXT: ld s5, 32(sp)
-; RV64I-NEXT: ld s4, 40(sp)
-; RV64I-NEXT: ld s3, 48(sp)
-; RV64I-NEXT: ld s2, 56(sp)
-; RV64I-NEXT: ld s1, 64(sp)
-; RV64I-NEXT: ld ra, 72(sp)
-; RV64I-NEXT: addi sp, sp, 80
+; RV64I-NEXT: ld s5, 16(sp)
+; RV64I-NEXT: ld s4, 24(sp)
+; RV64I-NEXT: ld s3, 32(sp)
+; RV64I-NEXT: ld s2, 40(sp)
+; RV64I-NEXT: ld s1, 48(sp)
+; RV64I-NEXT: ld ra, 56(sp)
+; RV64I-NEXT: addi sp, sp, 64
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_umin_i16_acq_rel:
; RV32I-NEXT: sw s3, 16(sp)
; RV32I-NEXT: sw s4, 12(sp)
; RV32I-NEXT: sw s5, 8(sp)
-; RV32I-NEXT: sw s6, 4(sp)
; RV32I-NEXT: mv s2, a1
; RV32I-NEXT: mv s4, a0
; RV32I-NEXT: lhu a0, 0(a0)
; RV32I-NEXT: lui a1, 16
-; RV32I-NEXT: addi s5, a1, -1
-; RV32I-NEXT: and s6, s2, s5
-; RV32I-NEXT: addi s3, sp, 2
-; RV32I-NEXT: addi s1, zero, 5
+; RV32I-NEXT: addi s1, a1, -1
+; RV32I-NEXT: and s5, s2, s1
+; RV32I-NEXT: addi s3, sp, 6
; RV32I-NEXT: .LBB109_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
-; RV32I-NEXT: and a1, a0, s5
+; RV32I-NEXT: and a1, a0, s1
; RV32I-NEXT: mv a2, a0
-; RV32I-NEXT: bgeu s6, a1, .LBB109_3
+; RV32I-NEXT: bgeu s5, a1, .LBB109_3
; RV32I-NEXT: # %bb.2: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB109_1 Depth=1
; RV32I-NEXT: mv a2, s2
; RV32I-NEXT: .LBB109_3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB109_1 Depth=1
-; RV32I-NEXT: sh a0, 2(sp)
+; RV32I-NEXT: sh a0, 6(sp)
; RV32I-NEXT: mv a0, s4
; RV32I-NEXT: mv a1, s3
-; RV32I-NEXT: mv a3, s1
-; RV32I-NEXT: mv a4, s1
+; RV32I-NEXT: addi a3, zero, 5
+; RV32I-NEXT: addi a4, zero, 5
; RV32I-NEXT: call __atomic_compare_exchange_2
; RV32I-NEXT: mv a1, a0
-; RV32I-NEXT: lh a0, 2(sp)
+; RV32I-NEXT: lh a0, 6(sp)
; RV32I-NEXT: beqz a1, .LBB109_1
; RV32I-NEXT: # %bb.4: # %atomicrmw.end
-; RV32I-NEXT: lw s6, 4(sp)
; RV32I-NEXT: lw s5, 8(sp)
; RV32I-NEXT: lw s4, 12(sp)
; RV32I-NEXT: lw s3, 16(sp)
; RV64I-NEXT: sd s3, 32(sp)
; RV64I-NEXT: sd s4, 24(sp)
; RV64I-NEXT: sd s5, 16(sp)
-; RV64I-NEXT: sd s6, 8(sp)
; RV64I-NEXT: mv s2, a1
; RV64I-NEXT: mv s4, a0
; RV64I-NEXT: lhu a0, 0(a0)
; RV64I-NEXT: lui a1, 16
-; RV64I-NEXT: addiw s5, a1, -1
-; RV64I-NEXT: and s6, s2, s5
-; RV64I-NEXT: addi s3, sp, 6
-; RV64I-NEXT: addi s1, zero, 5
+; RV64I-NEXT: addiw s1, a1, -1
+; RV64I-NEXT: and s5, s2, s1
+; RV64I-NEXT: addi s3, sp, 14
; RV64I-NEXT: .LBB109_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
-; RV64I-NEXT: and a1, a0, s5
+; RV64I-NEXT: and a1, a0, s1
; RV64I-NEXT: mv a2, a0
-; RV64I-NEXT: bgeu s6, a1, .LBB109_3
+; RV64I-NEXT: bgeu s5, a1, .LBB109_3
; RV64I-NEXT: # %bb.2: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB109_1 Depth=1
; RV64I-NEXT: mv a2, s2
; RV64I-NEXT: .LBB109_3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB109_1 Depth=1
-; RV64I-NEXT: sh a0, 6(sp)
+; RV64I-NEXT: sh a0, 14(sp)
; RV64I-NEXT: mv a0, s4
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s1
-; RV64I-NEXT: mv a4, s1
+; RV64I-NEXT: addi a3, zero, 5
+; RV64I-NEXT: addi a4, zero, 5
; RV64I-NEXT: call __atomic_compare_exchange_2
; RV64I-NEXT: mv a1, a0
-; RV64I-NEXT: lh a0, 6(sp)
+; RV64I-NEXT: lh a0, 14(sp)
; RV64I-NEXT: beqz a1, .LBB109_1
; RV64I-NEXT: # %bb.4: # %atomicrmw.end
-; RV64I-NEXT: ld s6, 8(sp)
; RV64I-NEXT: ld s5, 16(sp)
; RV64I-NEXT: ld s4, 24(sp)
; RV64I-NEXT: ld s3, 32(sp)
; RV32I-NEXT: sw s1, 24(sp)
; RV32I-NEXT: sw s2, 20(sp)
; RV32I-NEXT: sw s3, 16(sp)
-; RV32I-NEXT: sw s4, 12(sp)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: mv s2, a0
; RV32I-NEXT: lw a2, 0(a0)
-; RV32I-NEXT: addi s3, sp, 8
-; RV32I-NEXT: addi s4, zero, 2
+; RV32I-NEXT: addi s3, sp, 12
; RV32I-NEXT: .LBB146_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
-; RV32I-NEXT: sw a2, 8(sp)
+; RV32I-NEXT: sw a2, 12(sp)
; RV32I-NEXT: blt s1, a2, .LBB146_3
; RV32I-NEXT: # %bb.2: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB146_1 Depth=1
; RV32I-NEXT: # in Loop: Header=BB146_1 Depth=1
; RV32I-NEXT: mv a0, s2
; RV32I-NEXT: mv a1, s3
-; RV32I-NEXT: mv a3, s4
-; RV32I-NEXT: mv a4, s4
+; RV32I-NEXT: addi a3, zero, 2
+; RV32I-NEXT: addi a4, zero, 2
; RV32I-NEXT: call __atomic_compare_exchange_4
-; RV32I-NEXT: lw a2, 8(sp)
+; RV32I-NEXT: lw a2, 12(sp)
; RV32I-NEXT: beqz a0, .LBB146_1
; RV32I-NEXT: # %bb.4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a2
-; RV32I-NEXT: lw s4, 12(sp)
; RV32I-NEXT: lw s3, 16(sp)
; RV32I-NEXT: lw s2, 20(sp)
; RV32I-NEXT: lw s1, 24(sp)
;
; RV64I-LABEL: atomicrmw_max_i32_acquire:
; RV64I: # %bb.0:
-; RV64I-NEXT: addi sp, sp, -64
-; RV64I-NEXT: sd ra, 56(sp)
-; RV64I-NEXT: sd s1, 48(sp)
-; RV64I-NEXT: sd s2, 40(sp)
-; RV64I-NEXT: sd s3, 32(sp)
-; RV64I-NEXT: sd s4, 24(sp)
-; RV64I-NEXT: sd s5, 16(sp)
+; RV64I-NEXT: addi sp, sp, -48
+; RV64I-NEXT: sd ra, 40(sp)
+; RV64I-NEXT: sd s1, 32(sp)
+; RV64I-NEXT: sd s2, 24(sp)
+; RV64I-NEXT: sd s3, 16(sp)
+; RV64I-NEXT: sd s4, 8(sp)
; RV64I-NEXT: mv s2, a1
; RV64I-NEXT: mv s4, a0
; RV64I-NEXT: lwu a0, 0(a0)
-; RV64I-NEXT: sext.w s5, a1
-; RV64I-NEXT: addi s3, sp, 12
-; RV64I-NEXT: addi s1, zero, 2
+; RV64I-NEXT: sext.w s1, a1
+; RV64I-NEXT: addi s3, sp, 4
; RV64I-NEXT: .LBB146_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: sext.w a1, a0
; RV64I-NEXT: mv a2, a0
-; RV64I-NEXT: blt s5, a1, .LBB146_3
+; RV64I-NEXT: blt s1, a1, .LBB146_3
; RV64I-NEXT: # %bb.2: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB146_1 Depth=1
; RV64I-NEXT: mv a2, s2
; RV64I-NEXT: .LBB146_3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB146_1 Depth=1
-; RV64I-NEXT: sw a0, 12(sp)
+; RV64I-NEXT: sw a0, 4(sp)
; RV64I-NEXT: mv a0, s4
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s1
-; RV64I-NEXT: mv a4, s1
+; RV64I-NEXT: addi a3, zero, 2
+; RV64I-NEXT: addi a4, zero, 2
; RV64I-NEXT: call __atomic_compare_exchange_4
; RV64I-NEXT: mv a1, a0
-; RV64I-NEXT: lw a0, 12(sp)
+; RV64I-NEXT: lw a0, 4(sp)
; RV64I-NEXT: beqz a1, .LBB146_1
; RV64I-NEXT: # %bb.4: # %atomicrmw.end
-; RV64I-NEXT: ld s5, 16(sp)
-; RV64I-NEXT: ld s4, 24(sp)
-; RV64I-NEXT: ld s3, 32(sp)
-; RV64I-NEXT: ld s2, 40(sp)
-; RV64I-NEXT: ld s1, 48(sp)
-; RV64I-NEXT: ld ra, 56(sp)
-; RV64I-NEXT: addi sp, sp, 64
+; RV64I-NEXT: ld s4, 8(sp)
+; RV64I-NEXT: ld s3, 16(sp)
+; RV64I-NEXT: ld s2, 24(sp)
+; RV64I-NEXT: ld s1, 32(sp)
+; RV64I-NEXT: ld ra, 40(sp)
+; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_max_i32_acquire:
; RV32I-NEXT: sw s1, 24(sp)
; RV32I-NEXT: sw s2, 20(sp)
; RV32I-NEXT: sw s3, 16(sp)
-; RV32I-NEXT: sw s4, 12(sp)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: mv s2, a0
; RV32I-NEXT: lw a2, 0(a0)
-; RV32I-NEXT: addi s3, sp, 8
-; RV32I-NEXT: addi s4, zero, 3
+; RV32I-NEXT: addi s3, sp, 12
; RV32I-NEXT: .LBB147_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
-; RV32I-NEXT: sw a2, 8(sp)
+; RV32I-NEXT: sw a2, 12(sp)
; RV32I-NEXT: blt s1, a2, .LBB147_3
; RV32I-NEXT: # %bb.2: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB147_1 Depth=1
; RV32I-NEXT: # in Loop: Header=BB147_1 Depth=1
; RV32I-NEXT: mv a0, s2
; RV32I-NEXT: mv a1, s3
-; RV32I-NEXT: mv a3, s4
+; RV32I-NEXT: addi a3, zero, 3
; RV32I-NEXT: mv a4, zero
; RV32I-NEXT: call __atomic_compare_exchange_4
-; RV32I-NEXT: lw a2, 8(sp)
+; RV32I-NEXT: lw a2, 12(sp)
; RV32I-NEXT: beqz a0, .LBB147_1
; RV32I-NEXT: # %bb.4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a2
-; RV32I-NEXT: lw s4, 12(sp)
; RV32I-NEXT: lw s3, 16(sp)
; RV32I-NEXT: lw s2, 20(sp)
; RV32I-NEXT: lw s1, 24(sp)
;
; RV64I-LABEL: atomicrmw_max_i32_release:
; RV64I: # %bb.0:
-; RV64I-NEXT: addi sp, sp, -64
-; RV64I-NEXT: sd ra, 56(sp)
-; RV64I-NEXT: sd s1, 48(sp)
-; RV64I-NEXT: sd s2, 40(sp)
-; RV64I-NEXT: sd s3, 32(sp)
-; RV64I-NEXT: sd s4, 24(sp)
-; RV64I-NEXT: sd s5, 16(sp)
+; RV64I-NEXT: addi sp, sp, -48
+; RV64I-NEXT: sd ra, 40(sp)
+; RV64I-NEXT: sd s1, 32(sp)
+; RV64I-NEXT: sd s2, 24(sp)
+; RV64I-NEXT: sd s3, 16(sp)
+; RV64I-NEXT: sd s4, 8(sp)
; RV64I-NEXT: mv s2, a1
-; RV64I-NEXT: mv s5, a0
+; RV64I-NEXT: mv s4, a0
; RV64I-NEXT: lwu a0, 0(a0)
; RV64I-NEXT: sext.w s1, a1
-; RV64I-NEXT: addi s3, sp, 12
-; RV64I-NEXT: addi s4, zero, 3
+; RV64I-NEXT: addi s3, sp, 4
; RV64I-NEXT: .LBB147_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: sext.w a1, a0
; RV64I-NEXT: mv a2, s2
; RV64I-NEXT: .LBB147_3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB147_1 Depth=1
-; RV64I-NEXT: sw a0, 12(sp)
-; RV64I-NEXT: mv a0, s5
+; RV64I-NEXT: sw a0, 4(sp)
+; RV64I-NEXT: mv a0, s4
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s4
+; RV64I-NEXT: addi a3, zero, 3
; RV64I-NEXT: mv a4, zero
; RV64I-NEXT: call __atomic_compare_exchange_4
; RV64I-NEXT: mv a1, a0
-; RV64I-NEXT: lw a0, 12(sp)
+; RV64I-NEXT: lw a0, 4(sp)
; RV64I-NEXT: beqz a1, .LBB147_1
; RV64I-NEXT: # %bb.4: # %atomicrmw.end
-; RV64I-NEXT: ld s5, 16(sp)
-; RV64I-NEXT: ld s4, 24(sp)
-; RV64I-NEXT: ld s3, 32(sp)
-; RV64I-NEXT: ld s2, 40(sp)
-; RV64I-NEXT: ld s1, 48(sp)
-; RV64I-NEXT: ld ra, 56(sp)
-; RV64I-NEXT: addi sp, sp, 64
+; RV64I-NEXT: ld s4, 8(sp)
+; RV64I-NEXT: ld s3, 16(sp)
+; RV64I-NEXT: ld s2, 24(sp)
+; RV64I-NEXT: ld s1, 32(sp)
+; RV64I-NEXT: ld ra, 40(sp)
+; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_max_i32_release:
; RV32I-NEXT: sw s1, 24(sp)
; RV32I-NEXT: sw s2, 20(sp)
; RV32I-NEXT: sw s3, 16(sp)
-; RV32I-NEXT: sw s4, 12(sp)
-; RV32I-NEXT: sw s5, 8(sp)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: mv s2, a0
; RV32I-NEXT: lw a2, 0(a0)
-; RV32I-NEXT: addi s3, sp, 4
-; RV32I-NEXT: addi s4, zero, 4
-; RV32I-NEXT: addi s5, zero, 2
+; RV32I-NEXT: addi s3, sp, 12
; RV32I-NEXT: .LBB148_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
-; RV32I-NEXT: sw a2, 4(sp)
+; RV32I-NEXT: sw a2, 12(sp)
; RV32I-NEXT: blt s1, a2, .LBB148_3
; RV32I-NEXT: # %bb.2: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB148_1 Depth=1
; RV32I-NEXT: # in Loop: Header=BB148_1 Depth=1
; RV32I-NEXT: mv a0, s2
; RV32I-NEXT: mv a1, s3
-; RV32I-NEXT: mv a3, s4
-; RV32I-NEXT: mv a4, s5
+; RV32I-NEXT: addi a3, zero, 4
+; RV32I-NEXT: addi a4, zero, 2
; RV32I-NEXT: call __atomic_compare_exchange_4
-; RV32I-NEXT: lw a2, 4(sp)
+; RV32I-NEXT: lw a2, 12(sp)
; RV32I-NEXT: beqz a0, .LBB148_1
; RV32I-NEXT: # %bb.4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a2
-; RV32I-NEXT: lw s5, 8(sp)
-; RV32I-NEXT: lw s4, 12(sp)
; RV32I-NEXT: lw s3, 16(sp)
; RV32I-NEXT: lw s2, 20(sp)
; RV32I-NEXT: lw s1, 24(sp)
;
; RV64I-LABEL: atomicrmw_max_i32_acq_rel:
; RV64I: # %bb.0:
-; RV64I-NEXT: addi sp, sp, -64
-; RV64I-NEXT: sd ra, 56(sp)
-; RV64I-NEXT: sd s1, 48(sp)
-; RV64I-NEXT: sd s2, 40(sp)
-; RV64I-NEXT: sd s3, 32(sp)
-; RV64I-NEXT: sd s4, 24(sp)
-; RV64I-NEXT: sd s5, 16(sp)
-; RV64I-NEXT: sd s6, 8(sp)
+; RV64I-NEXT: addi sp, sp, -48
+; RV64I-NEXT: sd ra, 40(sp)
+; RV64I-NEXT: sd s1, 32(sp)
+; RV64I-NEXT: sd s2, 24(sp)
+; RV64I-NEXT: sd s3, 16(sp)
+; RV64I-NEXT: sd s4, 8(sp)
; RV64I-NEXT: mv s2, a1
-; RV64I-NEXT: mv s6, a0
+; RV64I-NEXT: mv s4, a0
; RV64I-NEXT: lwu a0, 0(a0)
; RV64I-NEXT: sext.w s1, a1
; RV64I-NEXT: addi s3, sp, 4
-; RV64I-NEXT: addi s4, zero, 4
-; RV64I-NEXT: addi s5, zero, 2
; RV64I-NEXT: .LBB148_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: sext.w a1, a0
; RV64I-NEXT: .LBB148_3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB148_1 Depth=1
; RV64I-NEXT: sw a0, 4(sp)
-; RV64I-NEXT: mv a0, s6
+; RV64I-NEXT: mv a0, s4
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s4
-; RV64I-NEXT: mv a4, s5
+; RV64I-NEXT: addi a3, zero, 4
+; RV64I-NEXT: addi a4, zero, 2
; RV64I-NEXT: call __atomic_compare_exchange_4
; RV64I-NEXT: mv a1, a0
; RV64I-NEXT: lw a0, 4(sp)
; RV64I-NEXT: beqz a1, .LBB148_1
; RV64I-NEXT: # %bb.4: # %atomicrmw.end
-; RV64I-NEXT: ld s6, 8(sp)
-; RV64I-NEXT: ld s5, 16(sp)
-; RV64I-NEXT: ld s4, 24(sp)
-; RV64I-NEXT: ld s3, 32(sp)
-; RV64I-NEXT: ld s2, 40(sp)
-; RV64I-NEXT: ld s1, 48(sp)
-; RV64I-NEXT: ld ra, 56(sp)
-; RV64I-NEXT: addi sp, sp, 64
+; RV64I-NEXT: ld s4, 8(sp)
+; RV64I-NEXT: ld s3, 16(sp)
+; RV64I-NEXT: ld s2, 24(sp)
+; RV64I-NEXT: ld s1, 32(sp)
+; RV64I-NEXT: ld ra, 40(sp)
+; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_max_i32_acq_rel:
; RV32I-NEXT: sw s1, 24(sp)
; RV32I-NEXT: sw s2, 20(sp)
; RV32I-NEXT: sw s3, 16(sp)
-; RV32I-NEXT: sw s4, 12(sp)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: mv s2, a0
; RV32I-NEXT: lw a2, 0(a0)
-; RV32I-NEXT: addi s3, sp, 8
-; RV32I-NEXT: addi s4, zero, 5
+; RV32I-NEXT: addi s3, sp, 12
; RV32I-NEXT: .LBB149_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
-; RV32I-NEXT: sw a2, 8(sp)
+; RV32I-NEXT: sw a2, 12(sp)
; RV32I-NEXT: blt s1, a2, .LBB149_3
; RV32I-NEXT: # %bb.2: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB149_1 Depth=1
; RV32I-NEXT: # in Loop: Header=BB149_1 Depth=1
; RV32I-NEXT: mv a0, s2
; RV32I-NEXT: mv a1, s3
-; RV32I-NEXT: mv a3, s4
-; RV32I-NEXT: mv a4, s4
+; RV32I-NEXT: addi a3, zero, 5
+; RV32I-NEXT: addi a4, zero, 5
; RV32I-NEXT: call __atomic_compare_exchange_4
-; RV32I-NEXT: lw a2, 8(sp)
+; RV32I-NEXT: lw a2, 12(sp)
; RV32I-NEXT: beqz a0, .LBB149_1
; RV32I-NEXT: # %bb.4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a2
-; RV32I-NEXT: lw s4, 12(sp)
; RV32I-NEXT: lw s3, 16(sp)
; RV32I-NEXT: lw s2, 20(sp)
; RV32I-NEXT: lw s1, 24(sp)
;
; RV64I-LABEL: atomicrmw_max_i32_seq_cst:
; RV64I: # %bb.0:
-; RV64I-NEXT: addi sp, sp, -64
-; RV64I-NEXT: sd ra, 56(sp)
-; RV64I-NEXT: sd s1, 48(sp)
-; RV64I-NEXT: sd s2, 40(sp)
-; RV64I-NEXT: sd s3, 32(sp)
-; RV64I-NEXT: sd s4, 24(sp)
-; RV64I-NEXT: sd s5, 16(sp)
+; RV64I-NEXT: addi sp, sp, -48
+; RV64I-NEXT: sd ra, 40(sp)
+; RV64I-NEXT: sd s1, 32(sp)
+; RV64I-NEXT: sd s2, 24(sp)
+; RV64I-NEXT: sd s3, 16(sp)
+; RV64I-NEXT: sd s4, 8(sp)
; RV64I-NEXT: mv s2, a1
; RV64I-NEXT: mv s4, a0
; RV64I-NEXT: lwu a0, 0(a0)
-; RV64I-NEXT: sext.w s5, a1
-; RV64I-NEXT: addi s3, sp, 12
-; RV64I-NEXT: addi s1, zero, 5
+; RV64I-NEXT: sext.w s1, a1
+; RV64I-NEXT: addi s3, sp, 4
; RV64I-NEXT: .LBB149_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: sext.w a1, a0
; RV64I-NEXT: mv a2, a0
-; RV64I-NEXT: blt s5, a1, .LBB149_3
+; RV64I-NEXT: blt s1, a1, .LBB149_3
; RV64I-NEXT: # %bb.2: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB149_1 Depth=1
; RV64I-NEXT: mv a2, s2
; RV64I-NEXT: .LBB149_3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB149_1 Depth=1
-; RV64I-NEXT: sw a0, 12(sp)
+; RV64I-NEXT: sw a0, 4(sp)
; RV64I-NEXT: mv a0, s4
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s1
-; RV64I-NEXT: mv a4, s1
+; RV64I-NEXT: addi a3, zero, 5
+; RV64I-NEXT: addi a4, zero, 5
; RV64I-NEXT: call __atomic_compare_exchange_4
; RV64I-NEXT: mv a1, a0
-; RV64I-NEXT: lw a0, 12(sp)
+; RV64I-NEXT: lw a0, 4(sp)
; RV64I-NEXT: beqz a1, .LBB149_1
; RV64I-NEXT: # %bb.4: # %atomicrmw.end
-; RV64I-NEXT: ld s5, 16(sp)
-; RV64I-NEXT: ld s4, 24(sp)
-; RV64I-NEXT: ld s3, 32(sp)
-; RV64I-NEXT: ld s2, 40(sp)
-; RV64I-NEXT: ld s1, 48(sp)
-; RV64I-NEXT: ld ra, 56(sp)
-; RV64I-NEXT: addi sp, sp, 64
+; RV64I-NEXT: ld s4, 8(sp)
+; RV64I-NEXT: ld s3, 16(sp)
+; RV64I-NEXT: ld s2, 24(sp)
+; RV64I-NEXT: ld s1, 32(sp)
+; RV64I-NEXT: ld ra, 40(sp)
+; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_max_i32_seq_cst:
; RV32I-NEXT: sw s1, 24(sp)
; RV32I-NEXT: sw s2, 20(sp)
; RV32I-NEXT: sw s3, 16(sp)
-; RV32I-NEXT: sw s4, 12(sp)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: mv s2, a0
; RV32I-NEXT: lw a2, 0(a0)
-; RV32I-NEXT: addi s3, sp, 8
-; RV32I-NEXT: addi s4, zero, 2
+; RV32I-NEXT: addi s3, sp, 12
; RV32I-NEXT: .LBB151_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
-; RV32I-NEXT: sw a2, 8(sp)
+; RV32I-NEXT: sw a2, 12(sp)
; RV32I-NEXT: bge s1, a2, .LBB151_3
; RV32I-NEXT: # %bb.2: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB151_1 Depth=1
; RV32I-NEXT: # in Loop: Header=BB151_1 Depth=1
; RV32I-NEXT: mv a0, s2
; RV32I-NEXT: mv a1, s3
-; RV32I-NEXT: mv a3, s4
-; RV32I-NEXT: mv a4, s4
+; RV32I-NEXT: addi a3, zero, 2
+; RV32I-NEXT: addi a4, zero, 2
; RV32I-NEXT: call __atomic_compare_exchange_4
-; RV32I-NEXT: lw a2, 8(sp)
+; RV32I-NEXT: lw a2, 12(sp)
; RV32I-NEXT: beqz a0, .LBB151_1
; RV32I-NEXT: # %bb.4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a2
-; RV32I-NEXT: lw s4, 12(sp)
; RV32I-NEXT: lw s3, 16(sp)
; RV32I-NEXT: lw s2, 20(sp)
; RV32I-NEXT: lw s1, 24(sp)
;
; RV64I-LABEL: atomicrmw_min_i32_acquire:
; RV64I: # %bb.0:
-; RV64I-NEXT: addi sp, sp, -64
-; RV64I-NEXT: sd ra, 56(sp)
-; RV64I-NEXT: sd s1, 48(sp)
-; RV64I-NEXT: sd s2, 40(sp)
-; RV64I-NEXT: sd s3, 32(sp)
-; RV64I-NEXT: sd s4, 24(sp)
-; RV64I-NEXT: sd s5, 16(sp)
+; RV64I-NEXT: addi sp, sp, -48
+; RV64I-NEXT: sd ra, 40(sp)
+; RV64I-NEXT: sd s1, 32(sp)
+; RV64I-NEXT: sd s2, 24(sp)
+; RV64I-NEXT: sd s3, 16(sp)
+; RV64I-NEXT: sd s4, 8(sp)
; RV64I-NEXT: mv s2, a1
; RV64I-NEXT: mv s4, a0
; RV64I-NEXT: lwu a0, 0(a0)
-; RV64I-NEXT: sext.w s5, a1
-; RV64I-NEXT: addi s3, sp, 12
-; RV64I-NEXT: addi s1, zero, 2
+; RV64I-NEXT: sext.w s1, a1
+; RV64I-NEXT: addi s3, sp, 4
; RV64I-NEXT: .LBB151_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: sext.w a1, a0
; RV64I-NEXT: mv a2, a0
-; RV64I-NEXT: bge s5, a1, .LBB151_3
+; RV64I-NEXT: bge s1, a1, .LBB151_3
; RV64I-NEXT: # %bb.2: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB151_1 Depth=1
; RV64I-NEXT: mv a2, s2
; RV64I-NEXT: .LBB151_3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB151_1 Depth=1
-; RV64I-NEXT: sw a0, 12(sp)
+; RV64I-NEXT: sw a0, 4(sp)
; RV64I-NEXT: mv a0, s4
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s1
-; RV64I-NEXT: mv a4, s1
+; RV64I-NEXT: addi a3, zero, 2
+; RV64I-NEXT: addi a4, zero, 2
; RV64I-NEXT: call __atomic_compare_exchange_4
; RV64I-NEXT: mv a1, a0
-; RV64I-NEXT: lw a0, 12(sp)
+; RV64I-NEXT: lw a0, 4(sp)
; RV64I-NEXT: beqz a1, .LBB151_1
; RV64I-NEXT: # %bb.4: # %atomicrmw.end
-; RV64I-NEXT: ld s5, 16(sp)
-; RV64I-NEXT: ld s4, 24(sp)
-; RV64I-NEXT: ld s3, 32(sp)
-; RV64I-NEXT: ld s2, 40(sp)
-; RV64I-NEXT: ld s1, 48(sp)
-; RV64I-NEXT: ld ra, 56(sp)
-; RV64I-NEXT: addi sp, sp, 64
+; RV64I-NEXT: ld s4, 8(sp)
+; RV64I-NEXT: ld s3, 16(sp)
+; RV64I-NEXT: ld s2, 24(sp)
+; RV64I-NEXT: ld s1, 32(sp)
+; RV64I-NEXT: ld ra, 40(sp)
+; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_min_i32_acquire:
; RV32I-NEXT: sw s1, 24(sp)
; RV32I-NEXT: sw s2, 20(sp)
; RV32I-NEXT: sw s3, 16(sp)
-; RV32I-NEXT: sw s4, 12(sp)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: mv s2, a0
; RV32I-NEXT: lw a2, 0(a0)
-; RV32I-NEXT: addi s3, sp, 8
-; RV32I-NEXT: addi s4, zero, 3
+; RV32I-NEXT: addi s3, sp, 12
; RV32I-NEXT: .LBB152_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
-; RV32I-NEXT: sw a2, 8(sp)
+; RV32I-NEXT: sw a2, 12(sp)
; RV32I-NEXT: bge s1, a2, .LBB152_3
; RV32I-NEXT: # %bb.2: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB152_1 Depth=1
; RV32I-NEXT: # in Loop: Header=BB152_1 Depth=1
; RV32I-NEXT: mv a0, s2
; RV32I-NEXT: mv a1, s3
-; RV32I-NEXT: mv a3, s4
+; RV32I-NEXT: addi a3, zero, 3
; RV32I-NEXT: mv a4, zero
; RV32I-NEXT: call __atomic_compare_exchange_4
-; RV32I-NEXT: lw a2, 8(sp)
+; RV32I-NEXT: lw a2, 12(sp)
; RV32I-NEXT: beqz a0, .LBB152_1
; RV32I-NEXT: # %bb.4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a2
-; RV32I-NEXT: lw s4, 12(sp)
; RV32I-NEXT: lw s3, 16(sp)
; RV32I-NEXT: lw s2, 20(sp)
; RV32I-NEXT: lw s1, 24(sp)
;
; RV64I-LABEL: atomicrmw_min_i32_release:
; RV64I: # %bb.0:
-; RV64I-NEXT: addi sp, sp, -64
-; RV64I-NEXT: sd ra, 56(sp)
-; RV64I-NEXT: sd s1, 48(sp)
-; RV64I-NEXT: sd s2, 40(sp)
-; RV64I-NEXT: sd s3, 32(sp)
-; RV64I-NEXT: sd s4, 24(sp)
-; RV64I-NEXT: sd s5, 16(sp)
+; RV64I-NEXT: addi sp, sp, -48
+; RV64I-NEXT: sd ra, 40(sp)
+; RV64I-NEXT: sd s1, 32(sp)
+; RV64I-NEXT: sd s2, 24(sp)
+; RV64I-NEXT: sd s3, 16(sp)
+; RV64I-NEXT: sd s4, 8(sp)
; RV64I-NEXT: mv s2, a1
-; RV64I-NEXT: mv s5, a0
+; RV64I-NEXT: mv s4, a0
; RV64I-NEXT: lwu a0, 0(a0)
; RV64I-NEXT: sext.w s1, a1
-; RV64I-NEXT: addi s3, sp, 12
-; RV64I-NEXT: addi s4, zero, 3
+; RV64I-NEXT: addi s3, sp, 4
; RV64I-NEXT: .LBB152_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: sext.w a1, a0
; RV64I-NEXT: mv a2, s2
; RV64I-NEXT: .LBB152_3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB152_1 Depth=1
-; RV64I-NEXT: sw a0, 12(sp)
-; RV64I-NEXT: mv a0, s5
+; RV64I-NEXT: sw a0, 4(sp)
+; RV64I-NEXT: mv a0, s4
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s4
+; RV64I-NEXT: addi a3, zero, 3
; RV64I-NEXT: mv a4, zero
; RV64I-NEXT: call __atomic_compare_exchange_4
; RV64I-NEXT: mv a1, a0
-; RV64I-NEXT: lw a0, 12(sp)
+; RV64I-NEXT: lw a0, 4(sp)
; RV64I-NEXT: beqz a1, .LBB152_1
; RV64I-NEXT: # %bb.4: # %atomicrmw.end
-; RV64I-NEXT: ld s5, 16(sp)
-; RV64I-NEXT: ld s4, 24(sp)
-; RV64I-NEXT: ld s3, 32(sp)
-; RV64I-NEXT: ld s2, 40(sp)
-; RV64I-NEXT: ld s1, 48(sp)
-; RV64I-NEXT: ld ra, 56(sp)
-; RV64I-NEXT: addi sp, sp, 64
+; RV64I-NEXT: ld s4, 8(sp)
+; RV64I-NEXT: ld s3, 16(sp)
+; RV64I-NEXT: ld s2, 24(sp)
+; RV64I-NEXT: ld s1, 32(sp)
+; RV64I-NEXT: ld ra, 40(sp)
+; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_min_i32_release:
; RV32I-NEXT: sw s1, 24(sp)
; RV32I-NEXT: sw s2, 20(sp)
; RV32I-NEXT: sw s3, 16(sp)
-; RV32I-NEXT: sw s4, 12(sp)
-; RV32I-NEXT: sw s5, 8(sp)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: mv s2, a0
; RV32I-NEXT: lw a2, 0(a0)
-; RV32I-NEXT: addi s3, sp, 4
-; RV32I-NEXT: addi s4, zero, 4
-; RV32I-NEXT: addi s5, zero, 2
+; RV32I-NEXT: addi s3, sp, 12
; RV32I-NEXT: .LBB153_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
-; RV32I-NEXT: sw a2, 4(sp)
+; RV32I-NEXT: sw a2, 12(sp)
; RV32I-NEXT: bge s1, a2, .LBB153_3
; RV32I-NEXT: # %bb.2: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB153_1 Depth=1
; RV32I-NEXT: # in Loop: Header=BB153_1 Depth=1
; RV32I-NEXT: mv a0, s2
; RV32I-NEXT: mv a1, s3
-; RV32I-NEXT: mv a3, s4
-; RV32I-NEXT: mv a4, s5
+; RV32I-NEXT: addi a3, zero, 4
+; RV32I-NEXT: addi a4, zero, 2
; RV32I-NEXT: call __atomic_compare_exchange_4
-; RV32I-NEXT: lw a2, 4(sp)
+; RV32I-NEXT: lw a2, 12(sp)
; RV32I-NEXT: beqz a0, .LBB153_1
; RV32I-NEXT: # %bb.4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a2
-; RV32I-NEXT: lw s5, 8(sp)
-; RV32I-NEXT: lw s4, 12(sp)
; RV32I-NEXT: lw s3, 16(sp)
; RV32I-NEXT: lw s2, 20(sp)
; RV32I-NEXT: lw s1, 24(sp)
;
; RV64I-LABEL: atomicrmw_min_i32_acq_rel:
; RV64I: # %bb.0:
-; RV64I-NEXT: addi sp, sp, -64
-; RV64I-NEXT: sd ra, 56(sp)
-; RV64I-NEXT: sd s1, 48(sp)
-; RV64I-NEXT: sd s2, 40(sp)
-; RV64I-NEXT: sd s3, 32(sp)
-; RV64I-NEXT: sd s4, 24(sp)
-; RV64I-NEXT: sd s5, 16(sp)
-; RV64I-NEXT: sd s6, 8(sp)
+; RV64I-NEXT: addi sp, sp, -48
+; RV64I-NEXT: sd ra, 40(sp)
+; RV64I-NEXT: sd s1, 32(sp)
+; RV64I-NEXT: sd s2, 24(sp)
+; RV64I-NEXT: sd s3, 16(sp)
+; RV64I-NEXT: sd s4, 8(sp)
; RV64I-NEXT: mv s2, a1
-; RV64I-NEXT: mv s6, a0
+; RV64I-NEXT: mv s4, a0
; RV64I-NEXT: lwu a0, 0(a0)
; RV64I-NEXT: sext.w s1, a1
; RV64I-NEXT: addi s3, sp, 4
-; RV64I-NEXT: addi s4, zero, 4
-; RV64I-NEXT: addi s5, zero, 2
; RV64I-NEXT: .LBB153_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: sext.w a1, a0
; RV64I-NEXT: .LBB153_3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB153_1 Depth=1
; RV64I-NEXT: sw a0, 4(sp)
-; RV64I-NEXT: mv a0, s6
+; RV64I-NEXT: mv a0, s4
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s4
-; RV64I-NEXT: mv a4, s5
+; RV64I-NEXT: addi a3, zero, 4
+; RV64I-NEXT: addi a4, zero, 2
; RV64I-NEXT: call __atomic_compare_exchange_4
; RV64I-NEXT: mv a1, a0
; RV64I-NEXT: lw a0, 4(sp)
; RV64I-NEXT: beqz a1, .LBB153_1
; RV64I-NEXT: # %bb.4: # %atomicrmw.end
-; RV64I-NEXT: ld s6, 8(sp)
-; RV64I-NEXT: ld s5, 16(sp)
-; RV64I-NEXT: ld s4, 24(sp)
-; RV64I-NEXT: ld s3, 32(sp)
-; RV64I-NEXT: ld s2, 40(sp)
-; RV64I-NEXT: ld s1, 48(sp)
-; RV64I-NEXT: ld ra, 56(sp)
-; RV64I-NEXT: addi sp, sp, 64
+; RV64I-NEXT: ld s4, 8(sp)
+; RV64I-NEXT: ld s3, 16(sp)
+; RV64I-NEXT: ld s2, 24(sp)
+; RV64I-NEXT: ld s1, 32(sp)
+; RV64I-NEXT: ld ra, 40(sp)
+; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_min_i32_acq_rel:
; RV32I-NEXT: sw s1, 24(sp)
; RV32I-NEXT: sw s2, 20(sp)
; RV32I-NEXT: sw s3, 16(sp)
-; RV32I-NEXT: sw s4, 12(sp)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: mv s2, a0
; RV32I-NEXT: lw a2, 0(a0)
-; RV32I-NEXT: addi s3, sp, 8
-; RV32I-NEXT: addi s4, zero, 5
+; RV32I-NEXT: addi s3, sp, 12
; RV32I-NEXT: .LBB154_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
-; RV32I-NEXT: sw a2, 8(sp)
+; RV32I-NEXT: sw a2, 12(sp)
; RV32I-NEXT: bge s1, a2, .LBB154_3
; RV32I-NEXT: # %bb.2: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB154_1 Depth=1
; RV32I-NEXT: # in Loop: Header=BB154_1 Depth=1
; RV32I-NEXT: mv a0, s2
; RV32I-NEXT: mv a1, s3
-; RV32I-NEXT: mv a3, s4
-; RV32I-NEXT: mv a4, s4
+; RV32I-NEXT: addi a3, zero, 5
+; RV32I-NEXT: addi a4, zero, 5
; RV32I-NEXT: call __atomic_compare_exchange_4
-; RV32I-NEXT: lw a2, 8(sp)
+; RV32I-NEXT: lw a2, 12(sp)
; RV32I-NEXT: beqz a0, .LBB154_1
; RV32I-NEXT: # %bb.4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a2
-; RV32I-NEXT: lw s4, 12(sp)
; RV32I-NEXT: lw s3, 16(sp)
; RV32I-NEXT: lw s2, 20(sp)
; RV32I-NEXT: lw s1, 24(sp)
;
; RV64I-LABEL: atomicrmw_min_i32_seq_cst:
; RV64I: # %bb.0:
-; RV64I-NEXT: addi sp, sp, -64
-; RV64I-NEXT: sd ra, 56(sp)
-; RV64I-NEXT: sd s1, 48(sp)
-; RV64I-NEXT: sd s2, 40(sp)
-; RV64I-NEXT: sd s3, 32(sp)
-; RV64I-NEXT: sd s4, 24(sp)
-; RV64I-NEXT: sd s5, 16(sp)
+; RV64I-NEXT: addi sp, sp, -48
+; RV64I-NEXT: sd ra, 40(sp)
+; RV64I-NEXT: sd s1, 32(sp)
+; RV64I-NEXT: sd s2, 24(sp)
+; RV64I-NEXT: sd s3, 16(sp)
+; RV64I-NEXT: sd s4, 8(sp)
; RV64I-NEXT: mv s2, a1
; RV64I-NEXT: mv s4, a0
; RV64I-NEXT: lwu a0, 0(a0)
-; RV64I-NEXT: sext.w s5, a1
-; RV64I-NEXT: addi s3, sp, 12
-; RV64I-NEXT: addi s1, zero, 5
+; RV64I-NEXT: sext.w s1, a1
+; RV64I-NEXT: addi s3, sp, 4
; RV64I-NEXT: .LBB154_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: sext.w a1, a0
; RV64I-NEXT: mv a2, a0
-; RV64I-NEXT: bge s5, a1, .LBB154_3
+; RV64I-NEXT: bge s1, a1, .LBB154_3
; RV64I-NEXT: # %bb.2: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB154_1 Depth=1
; RV64I-NEXT: mv a2, s2
; RV64I-NEXT: .LBB154_3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB154_1 Depth=1
-; RV64I-NEXT: sw a0, 12(sp)
+; RV64I-NEXT: sw a0, 4(sp)
; RV64I-NEXT: mv a0, s4
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s1
-; RV64I-NEXT: mv a4, s1
+; RV64I-NEXT: addi a3, zero, 5
+; RV64I-NEXT: addi a4, zero, 5
; RV64I-NEXT: call __atomic_compare_exchange_4
; RV64I-NEXT: mv a1, a0
-; RV64I-NEXT: lw a0, 12(sp)
+; RV64I-NEXT: lw a0, 4(sp)
; RV64I-NEXT: beqz a1, .LBB154_1
; RV64I-NEXT: # %bb.4: # %atomicrmw.end
-; RV64I-NEXT: ld s5, 16(sp)
-; RV64I-NEXT: ld s4, 24(sp)
-; RV64I-NEXT: ld s3, 32(sp)
-; RV64I-NEXT: ld s2, 40(sp)
-; RV64I-NEXT: ld s1, 48(sp)
-; RV64I-NEXT: ld ra, 56(sp)
-; RV64I-NEXT: addi sp, sp, 64
+; RV64I-NEXT: ld s4, 8(sp)
+; RV64I-NEXT: ld s3, 16(sp)
+; RV64I-NEXT: ld s2, 24(sp)
+; RV64I-NEXT: ld s1, 32(sp)
+; RV64I-NEXT: ld ra, 40(sp)
+; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_min_i32_seq_cst:
; RV32I-NEXT: sw s1, 24(sp)
; RV32I-NEXT: sw s2, 20(sp)
; RV32I-NEXT: sw s3, 16(sp)
-; RV32I-NEXT: sw s4, 12(sp)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: mv s2, a0
; RV32I-NEXT: lw a2, 0(a0)
-; RV32I-NEXT: addi s3, sp, 8
-; RV32I-NEXT: addi s4, zero, 2
+; RV32I-NEXT: addi s3, sp, 12
; RV32I-NEXT: .LBB156_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
-; RV32I-NEXT: sw a2, 8(sp)
+; RV32I-NEXT: sw a2, 12(sp)
; RV32I-NEXT: bltu s1, a2, .LBB156_3
; RV32I-NEXT: # %bb.2: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB156_1 Depth=1
; RV32I-NEXT: # in Loop: Header=BB156_1 Depth=1
; RV32I-NEXT: mv a0, s2
; RV32I-NEXT: mv a1, s3
-; RV32I-NEXT: mv a3, s4
-; RV32I-NEXT: mv a4, s4
+; RV32I-NEXT: addi a3, zero, 2
+; RV32I-NEXT: addi a4, zero, 2
; RV32I-NEXT: call __atomic_compare_exchange_4
-; RV32I-NEXT: lw a2, 8(sp)
+; RV32I-NEXT: lw a2, 12(sp)
; RV32I-NEXT: beqz a0, .LBB156_1
; RV32I-NEXT: # %bb.4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a2
-; RV32I-NEXT: lw s4, 12(sp)
; RV32I-NEXT: lw s3, 16(sp)
; RV32I-NEXT: lw s2, 20(sp)
; RV32I-NEXT: lw s1, 24(sp)
;
; RV64I-LABEL: atomicrmw_umax_i32_acquire:
; RV64I: # %bb.0:
-; RV64I-NEXT: addi sp, sp, -64
-; RV64I-NEXT: sd ra, 56(sp)
-; RV64I-NEXT: sd s1, 48(sp)
-; RV64I-NEXT: sd s2, 40(sp)
-; RV64I-NEXT: sd s3, 32(sp)
-; RV64I-NEXT: sd s4, 24(sp)
-; RV64I-NEXT: sd s5, 16(sp)
+; RV64I-NEXT: addi sp, sp, -48
+; RV64I-NEXT: sd ra, 40(sp)
+; RV64I-NEXT: sd s1, 32(sp)
+; RV64I-NEXT: sd s2, 24(sp)
+; RV64I-NEXT: sd s3, 16(sp)
+; RV64I-NEXT: sd s4, 8(sp)
; RV64I-NEXT: mv s2, a1
; RV64I-NEXT: mv s4, a0
; RV64I-NEXT: lwu a0, 0(a0)
-; RV64I-NEXT: sext.w s5, a1
-; RV64I-NEXT: addi s3, sp, 12
-; RV64I-NEXT: addi s1, zero, 2
+; RV64I-NEXT: sext.w s1, a1
+; RV64I-NEXT: addi s3, sp, 4
; RV64I-NEXT: .LBB156_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: sext.w a1, a0
; RV64I-NEXT: mv a2, a0
-; RV64I-NEXT: bltu s5, a1, .LBB156_3
+; RV64I-NEXT: bltu s1, a1, .LBB156_3
; RV64I-NEXT: # %bb.2: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB156_1 Depth=1
; RV64I-NEXT: mv a2, s2
; RV64I-NEXT: .LBB156_3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB156_1 Depth=1
-; RV64I-NEXT: sw a0, 12(sp)
+; RV64I-NEXT: sw a0, 4(sp)
; RV64I-NEXT: mv a0, s4
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s1
-; RV64I-NEXT: mv a4, s1
+; RV64I-NEXT: addi a3, zero, 2
+; RV64I-NEXT: addi a4, zero, 2
; RV64I-NEXT: call __atomic_compare_exchange_4
; RV64I-NEXT: mv a1, a0
-; RV64I-NEXT: lw a0, 12(sp)
+; RV64I-NEXT: lw a0, 4(sp)
; RV64I-NEXT: beqz a1, .LBB156_1
; RV64I-NEXT: # %bb.4: # %atomicrmw.end
-; RV64I-NEXT: ld s5, 16(sp)
-; RV64I-NEXT: ld s4, 24(sp)
-; RV64I-NEXT: ld s3, 32(sp)
-; RV64I-NEXT: ld s2, 40(sp)
-; RV64I-NEXT: ld s1, 48(sp)
-; RV64I-NEXT: ld ra, 56(sp)
-; RV64I-NEXT: addi sp, sp, 64
+; RV64I-NEXT: ld s4, 8(sp)
+; RV64I-NEXT: ld s3, 16(sp)
+; RV64I-NEXT: ld s2, 24(sp)
+; RV64I-NEXT: ld s1, 32(sp)
+; RV64I-NEXT: ld ra, 40(sp)
+; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_umax_i32_acquire:
; RV32I-NEXT: sw s1, 24(sp)
; RV32I-NEXT: sw s2, 20(sp)
; RV32I-NEXT: sw s3, 16(sp)
-; RV32I-NEXT: sw s4, 12(sp)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: mv s2, a0
; RV32I-NEXT: lw a2, 0(a0)
-; RV32I-NEXT: addi s3, sp, 8
-; RV32I-NEXT: addi s4, zero, 3
+; RV32I-NEXT: addi s3, sp, 12
; RV32I-NEXT: .LBB157_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
-; RV32I-NEXT: sw a2, 8(sp)
+; RV32I-NEXT: sw a2, 12(sp)
; RV32I-NEXT: bltu s1, a2, .LBB157_3
; RV32I-NEXT: # %bb.2: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB157_1 Depth=1
; RV32I-NEXT: # in Loop: Header=BB157_1 Depth=1
; RV32I-NEXT: mv a0, s2
; RV32I-NEXT: mv a1, s3
-; RV32I-NEXT: mv a3, s4
+; RV32I-NEXT: addi a3, zero, 3
; RV32I-NEXT: mv a4, zero
; RV32I-NEXT: call __atomic_compare_exchange_4
-; RV32I-NEXT: lw a2, 8(sp)
+; RV32I-NEXT: lw a2, 12(sp)
; RV32I-NEXT: beqz a0, .LBB157_1
; RV32I-NEXT: # %bb.4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a2
-; RV32I-NEXT: lw s4, 12(sp)
; RV32I-NEXT: lw s3, 16(sp)
; RV32I-NEXT: lw s2, 20(sp)
; RV32I-NEXT: lw s1, 24(sp)
;
; RV64I-LABEL: atomicrmw_umax_i32_release:
; RV64I: # %bb.0:
-; RV64I-NEXT: addi sp, sp, -64
-; RV64I-NEXT: sd ra, 56(sp)
-; RV64I-NEXT: sd s1, 48(sp)
-; RV64I-NEXT: sd s2, 40(sp)
-; RV64I-NEXT: sd s3, 32(sp)
-; RV64I-NEXT: sd s4, 24(sp)
-; RV64I-NEXT: sd s5, 16(sp)
+; RV64I-NEXT: addi sp, sp, -48
+; RV64I-NEXT: sd ra, 40(sp)
+; RV64I-NEXT: sd s1, 32(sp)
+; RV64I-NEXT: sd s2, 24(sp)
+; RV64I-NEXT: sd s3, 16(sp)
+; RV64I-NEXT: sd s4, 8(sp)
; RV64I-NEXT: mv s2, a1
-; RV64I-NEXT: mv s5, a0
+; RV64I-NEXT: mv s4, a0
; RV64I-NEXT: lwu a0, 0(a0)
; RV64I-NEXT: sext.w s1, a1
-; RV64I-NEXT: addi s3, sp, 12
-; RV64I-NEXT: addi s4, zero, 3
+; RV64I-NEXT: addi s3, sp, 4
; RV64I-NEXT: .LBB157_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: sext.w a1, a0
; RV64I-NEXT: mv a2, s2
; RV64I-NEXT: .LBB157_3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB157_1 Depth=1
-; RV64I-NEXT: sw a0, 12(sp)
-; RV64I-NEXT: mv a0, s5
+; RV64I-NEXT: sw a0, 4(sp)
+; RV64I-NEXT: mv a0, s4
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s4
+; RV64I-NEXT: addi a3, zero, 3
; RV64I-NEXT: mv a4, zero
; RV64I-NEXT: call __atomic_compare_exchange_4
; RV64I-NEXT: mv a1, a0
-; RV64I-NEXT: lw a0, 12(sp)
+; RV64I-NEXT: lw a0, 4(sp)
; RV64I-NEXT: beqz a1, .LBB157_1
; RV64I-NEXT: # %bb.4: # %atomicrmw.end
-; RV64I-NEXT: ld s5, 16(sp)
-; RV64I-NEXT: ld s4, 24(sp)
-; RV64I-NEXT: ld s3, 32(sp)
-; RV64I-NEXT: ld s2, 40(sp)
-; RV64I-NEXT: ld s1, 48(sp)
-; RV64I-NEXT: ld ra, 56(sp)
-; RV64I-NEXT: addi sp, sp, 64
+; RV64I-NEXT: ld s4, 8(sp)
+; RV64I-NEXT: ld s3, 16(sp)
+; RV64I-NEXT: ld s2, 24(sp)
+; RV64I-NEXT: ld s1, 32(sp)
+; RV64I-NEXT: ld ra, 40(sp)
+; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_umax_i32_release:
; RV32I-NEXT: sw s1, 24(sp)
; RV32I-NEXT: sw s2, 20(sp)
; RV32I-NEXT: sw s3, 16(sp)
-; RV32I-NEXT: sw s4, 12(sp)
-; RV32I-NEXT: sw s5, 8(sp)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: mv s2, a0
; RV32I-NEXT: lw a2, 0(a0)
-; RV32I-NEXT: addi s3, sp, 4
-; RV32I-NEXT: addi s4, zero, 4
-; RV32I-NEXT: addi s5, zero, 2
+; RV32I-NEXT: addi s3, sp, 12
; RV32I-NEXT: .LBB158_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
-; RV32I-NEXT: sw a2, 4(sp)
+; RV32I-NEXT: sw a2, 12(sp)
; RV32I-NEXT: bltu s1, a2, .LBB158_3
; RV32I-NEXT: # %bb.2: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB158_1 Depth=1
; RV32I-NEXT: # in Loop: Header=BB158_1 Depth=1
; RV32I-NEXT: mv a0, s2
; RV32I-NEXT: mv a1, s3
-; RV32I-NEXT: mv a3, s4
-; RV32I-NEXT: mv a4, s5
+; RV32I-NEXT: addi a3, zero, 4
+; RV32I-NEXT: addi a4, zero, 2
; RV32I-NEXT: call __atomic_compare_exchange_4
-; RV32I-NEXT: lw a2, 4(sp)
+; RV32I-NEXT: lw a2, 12(sp)
; RV32I-NEXT: beqz a0, .LBB158_1
; RV32I-NEXT: # %bb.4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a2
-; RV32I-NEXT: lw s5, 8(sp)
-; RV32I-NEXT: lw s4, 12(sp)
; RV32I-NEXT: lw s3, 16(sp)
; RV32I-NEXT: lw s2, 20(sp)
; RV32I-NEXT: lw s1, 24(sp)
;
; RV64I-LABEL: atomicrmw_umax_i32_acq_rel:
; RV64I: # %bb.0:
-; RV64I-NEXT: addi sp, sp, -64
-; RV64I-NEXT: sd ra, 56(sp)
-; RV64I-NEXT: sd s1, 48(sp)
-; RV64I-NEXT: sd s2, 40(sp)
-; RV64I-NEXT: sd s3, 32(sp)
-; RV64I-NEXT: sd s4, 24(sp)
-; RV64I-NEXT: sd s5, 16(sp)
-; RV64I-NEXT: sd s6, 8(sp)
+; RV64I-NEXT: addi sp, sp, -48
+; RV64I-NEXT: sd ra, 40(sp)
+; RV64I-NEXT: sd s1, 32(sp)
+; RV64I-NEXT: sd s2, 24(sp)
+; RV64I-NEXT: sd s3, 16(sp)
+; RV64I-NEXT: sd s4, 8(sp)
; RV64I-NEXT: mv s2, a1
-; RV64I-NEXT: mv s6, a0
+; RV64I-NEXT: mv s4, a0
; RV64I-NEXT: lwu a0, 0(a0)
; RV64I-NEXT: sext.w s1, a1
; RV64I-NEXT: addi s3, sp, 4
-; RV64I-NEXT: addi s4, zero, 4
-; RV64I-NEXT: addi s5, zero, 2
; RV64I-NEXT: .LBB158_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: sext.w a1, a0
; RV64I-NEXT: .LBB158_3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB158_1 Depth=1
; RV64I-NEXT: sw a0, 4(sp)
-; RV64I-NEXT: mv a0, s6
+; RV64I-NEXT: mv a0, s4
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s4
-; RV64I-NEXT: mv a4, s5
+; RV64I-NEXT: addi a3, zero, 4
+; RV64I-NEXT: addi a4, zero, 2
; RV64I-NEXT: call __atomic_compare_exchange_4
; RV64I-NEXT: mv a1, a0
; RV64I-NEXT: lw a0, 4(sp)
; RV64I-NEXT: beqz a1, .LBB158_1
; RV64I-NEXT: # %bb.4: # %atomicrmw.end
-; RV64I-NEXT: ld s6, 8(sp)
-; RV64I-NEXT: ld s5, 16(sp)
-; RV64I-NEXT: ld s4, 24(sp)
-; RV64I-NEXT: ld s3, 32(sp)
-; RV64I-NEXT: ld s2, 40(sp)
-; RV64I-NEXT: ld s1, 48(sp)
-; RV64I-NEXT: ld ra, 56(sp)
-; RV64I-NEXT: addi sp, sp, 64
+; RV64I-NEXT: ld s4, 8(sp)
+; RV64I-NEXT: ld s3, 16(sp)
+; RV64I-NEXT: ld s2, 24(sp)
+; RV64I-NEXT: ld s1, 32(sp)
+; RV64I-NEXT: ld ra, 40(sp)
+; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_umax_i32_acq_rel:
; RV32I-NEXT: sw s1, 24(sp)
; RV32I-NEXT: sw s2, 20(sp)
; RV32I-NEXT: sw s3, 16(sp)
-; RV32I-NEXT: sw s4, 12(sp)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: mv s2, a0
; RV32I-NEXT: lw a2, 0(a0)
-; RV32I-NEXT: addi s3, sp, 8
-; RV32I-NEXT: addi s4, zero, 5
+; RV32I-NEXT: addi s3, sp, 12
; RV32I-NEXT: .LBB159_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
-; RV32I-NEXT: sw a2, 8(sp)
+; RV32I-NEXT: sw a2, 12(sp)
; RV32I-NEXT: bltu s1, a2, .LBB159_3
; RV32I-NEXT: # %bb.2: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB159_1 Depth=1
; RV32I-NEXT: # in Loop: Header=BB159_1 Depth=1
; RV32I-NEXT: mv a0, s2
; RV32I-NEXT: mv a1, s3
-; RV32I-NEXT: mv a3, s4
-; RV32I-NEXT: mv a4, s4
+; RV32I-NEXT: addi a3, zero, 5
+; RV32I-NEXT: addi a4, zero, 5
; RV32I-NEXT: call __atomic_compare_exchange_4
-; RV32I-NEXT: lw a2, 8(sp)
+; RV32I-NEXT: lw a2, 12(sp)
; RV32I-NEXT: beqz a0, .LBB159_1
; RV32I-NEXT: # %bb.4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a2
-; RV32I-NEXT: lw s4, 12(sp)
; RV32I-NEXT: lw s3, 16(sp)
; RV32I-NEXT: lw s2, 20(sp)
; RV32I-NEXT: lw s1, 24(sp)
;
; RV64I-LABEL: atomicrmw_umax_i32_seq_cst:
; RV64I: # %bb.0:
-; RV64I-NEXT: addi sp, sp, -64
-; RV64I-NEXT: sd ra, 56(sp)
-; RV64I-NEXT: sd s1, 48(sp)
-; RV64I-NEXT: sd s2, 40(sp)
-; RV64I-NEXT: sd s3, 32(sp)
-; RV64I-NEXT: sd s4, 24(sp)
-; RV64I-NEXT: sd s5, 16(sp)
+; RV64I-NEXT: addi sp, sp, -48
+; RV64I-NEXT: sd ra, 40(sp)
+; RV64I-NEXT: sd s1, 32(sp)
+; RV64I-NEXT: sd s2, 24(sp)
+; RV64I-NEXT: sd s3, 16(sp)
+; RV64I-NEXT: sd s4, 8(sp)
; RV64I-NEXT: mv s2, a1
; RV64I-NEXT: mv s4, a0
; RV64I-NEXT: lwu a0, 0(a0)
-; RV64I-NEXT: sext.w s5, a1
-; RV64I-NEXT: addi s3, sp, 12
-; RV64I-NEXT: addi s1, zero, 5
+; RV64I-NEXT: sext.w s1, a1
+; RV64I-NEXT: addi s3, sp, 4
; RV64I-NEXT: .LBB159_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: sext.w a1, a0
; RV64I-NEXT: mv a2, a0
-; RV64I-NEXT: bltu s5, a1, .LBB159_3
+; RV64I-NEXT: bltu s1, a1, .LBB159_3
; RV64I-NEXT: # %bb.2: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB159_1 Depth=1
; RV64I-NEXT: mv a2, s2
; RV64I-NEXT: .LBB159_3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB159_1 Depth=1
-; RV64I-NEXT: sw a0, 12(sp)
+; RV64I-NEXT: sw a0, 4(sp)
; RV64I-NEXT: mv a0, s4
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s1
-; RV64I-NEXT: mv a4, s1
+; RV64I-NEXT: addi a3, zero, 5
+; RV64I-NEXT: addi a4, zero, 5
; RV64I-NEXT: call __atomic_compare_exchange_4
; RV64I-NEXT: mv a1, a0
-; RV64I-NEXT: lw a0, 12(sp)
+; RV64I-NEXT: lw a0, 4(sp)
; RV64I-NEXT: beqz a1, .LBB159_1
; RV64I-NEXT: # %bb.4: # %atomicrmw.end
-; RV64I-NEXT: ld s5, 16(sp)
-; RV64I-NEXT: ld s4, 24(sp)
-; RV64I-NEXT: ld s3, 32(sp)
-; RV64I-NEXT: ld s2, 40(sp)
-; RV64I-NEXT: ld s1, 48(sp)
-; RV64I-NEXT: ld ra, 56(sp)
-; RV64I-NEXT: addi sp, sp, 64
+; RV64I-NEXT: ld s4, 8(sp)
+; RV64I-NEXT: ld s3, 16(sp)
+; RV64I-NEXT: ld s2, 24(sp)
+; RV64I-NEXT: ld s1, 32(sp)
+; RV64I-NEXT: ld ra, 40(sp)
+; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_umax_i32_seq_cst:
; RV32I-NEXT: sw s1, 24(sp)
; RV32I-NEXT: sw s2, 20(sp)
; RV32I-NEXT: sw s3, 16(sp)
-; RV32I-NEXT: sw s4, 12(sp)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: mv s2, a0
; RV32I-NEXT: lw a2, 0(a0)
-; RV32I-NEXT: addi s3, sp, 8
-; RV32I-NEXT: addi s4, zero, 2
+; RV32I-NEXT: addi s3, sp, 12
; RV32I-NEXT: .LBB161_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
-; RV32I-NEXT: sw a2, 8(sp)
+; RV32I-NEXT: sw a2, 12(sp)
; RV32I-NEXT: bgeu s1, a2, .LBB161_3
; RV32I-NEXT: # %bb.2: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB161_1 Depth=1
; RV32I-NEXT: # in Loop: Header=BB161_1 Depth=1
; RV32I-NEXT: mv a0, s2
; RV32I-NEXT: mv a1, s3
-; RV32I-NEXT: mv a3, s4
-; RV32I-NEXT: mv a4, s4
+; RV32I-NEXT: addi a3, zero, 2
+; RV32I-NEXT: addi a4, zero, 2
; RV32I-NEXT: call __atomic_compare_exchange_4
-; RV32I-NEXT: lw a2, 8(sp)
+; RV32I-NEXT: lw a2, 12(sp)
; RV32I-NEXT: beqz a0, .LBB161_1
; RV32I-NEXT: # %bb.4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a2
-; RV32I-NEXT: lw s4, 12(sp)
; RV32I-NEXT: lw s3, 16(sp)
; RV32I-NEXT: lw s2, 20(sp)
; RV32I-NEXT: lw s1, 24(sp)
;
; RV64I-LABEL: atomicrmw_umin_i32_acquire:
; RV64I: # %bb.0:
-; RV64I-NEXT: addi sp, sp, -64
-; RV64I-NEXT: sd ra, 56(sp)
-; RV64I-NEXT: sd s1, 48(sp)
-; RV64I-NEXT: sd s2, 40(sp)
-; RV64I-NEXT: sd s3, 32(sp)
-; RV64I-NEXT: sd s4, 24(sp)
-; RV64I-NEXT: sd s5, 16(sp)
+; RV64I-NEXT: addi sp, sp, -48
+; RV64I-NEXT: sd ra, 40(sp)
+; RV64I-NEXT: sd s1, 32(sp)
+; RV64I-NEXT: sd s2, 24(sp)
+; RV64I-NEXT: sd s3, 16(sp)
+; RV64I-NEXT: sd s4, 8(sp)
; RV64I-NEXT: mv s2, a1
; RV64I-NEXT: mv s4, a0
; RV64I-NEXT: lwu a0, 0(a0)
-; RV64I-NEXT: sext.w s5, a1
-; RV64I-NEXT: addi s3, sp, 12
-; RV64I-NEXT: addi s1, zero, 2
+; RV64I-NEXT: sext.w s1, a1
+; RV64I-NEXT: addi s3, sp, 4
; RV64I-NEXT: .LBB161_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: sext.w a1, a0
; RV64I-NEXT: mv a2, a0
-; RV64I-NEXT: bgeu s5, a1, .LBB161_3
+; RV64I-NEXT: bgeu s1, a1, .LBB161_3
; RV64I-NEXT: # %bb.2: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB161_1 Depth=1
; RV64I-NEXT: mv a2, s2
; RV64I-NEXT: .LBB161_3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB161_1 Depth=1
-; RV64I-NEXT: sw a0, 12(sp)
+; RV64I-NEXT: sw a0, 4(sp)
; RV64I-NEXT: mv a0, s4
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s1
-; RV64I-NEXT: mv a4, s1
+; RV64I-NEXT: addi a3, zero, 2
+; RV64I-NEXT: addi a4, zero, 2
; RV64I-NEXT: call __atomic_compare_exchange_4
; RV64I-NEXT: mv a1, a0
-; RV64I-NEXT: lw a0, 12(sp)
+; RV64I-NEXT: lw a0, 4(sp)
; RV64I-NEXT: beqz a1, .LBB161_1
; RV64I-NEXT: # %bb.4: # %atomicrmw.end
-; RV64I-NEXT: ld s5, 16(sp)
-; RV64I-NEXT: ld s4, 24(sp)
-; RV64I-NEXT: ld s3, 32(sp)
-; RV64I-NEXT: ld s2, 40(sp)
-; RV64I-NEXT: ld s1, 48(sp)
-; RV64I-NEXT: ld ra, 56(sp)
-; RV64I-NEXT: addi sp, sp, 64
+; RV64I-NEXT: ld s4, 8(sp)
+; RV64I-NEXT: ld s3, 16(sp)
+; RV64I-NEXT: ld s2, 24(sp)
+; RV64I-NEXT: ld s1, 32(sp)
+; RV64I-NEXT: ld ra, 40(sp)
+; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_umin_i32_acquire:
; RV32I-NEXT: sw s1, 24(sp)
; RV32I-NEXT: sw s2, 20(sp)
; RV32I-NEXT: sw s3, 16(sp)
-; RV32I-NEXT: sw s4, 12(sp)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: mv s2, a0
; RV32I-NEXT: lw a2, 0(a0)
-; RV32I-NEXT: addi s3, sp, 8
-; RV32I-NEXT: addi s4, zero, 3
+; RV32I-NEXT: addi s3, sp, 12
; RV32I-NEXT: .LBB162_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
-; RV32I-NEXT: sw a2, 8(sp)
+; RV32I-NEXT: sw a2, 12(sp)
; RV32I-NEXT: bgeu s1, a2, .LBB162_3
; RV32I-NEXT: # %bb.2: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB162_1 Depth=1
; RV32I-NEXT: # in Loop: Header=BB162_1 Depth=1
; RV32I-NEXT: mv a0, s2
; RV32I-NEXT: mv a1, s3
-; RV32I-NEXT: mv a3, s4
+; RV32I-NEXT: addi a3, zero, 3
; RV32I-NEXT: mv a4, zero
; RV32I-NEXT: call __atomic_compare_exchange_4
-; RV32I-NEXT: lw a2, 8(sp)
+; RV32I-NEXT: lw a2, 12(sp)
; RV32I-NEXT: beqz a0, .LBB162_1
; RV32I-NEXT: # %bb.4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a2
-; RV32I-NEXT: lw s4, 12(sp)
; RV32I-NEXT: lw s3, 16(sp)
; RV32I-NEXT: lw s2, 20(sp)
; RV32I-NEXT: lw s1, 24(sp)
;
; RV64I-LABEL: atomicrmw_umin_i32_release:
; RV64I: # %bb.0:
-; RV64I-NEXT: addi sp, sp, -64
-; RV64I-NEXT: sd ra, 56(sp)
-; RV64I-NEXT: sd s1, 48(sp)
-; RV64I-NEXT: sd s2, 40(sp)
-; RV64I-NEXT: sd s3, 32(sp)
-; RV64I-NEXT: sd s4, 24(sp)
-; RV64I-NEXT: sd s5, 16(sp)
+; RV64I-NEXT: addi sp, sp, -48
+; RV64I-NEXT: sd ra, 40(sp)
+; RV64I-NEXT: sd s1, 32(sp)
+; RV64I-NEXT: sd s2, 24(sp)
+; RV64I-NEXT: sd s3, 16(sp)
+; RV64I-NEXT: sd s4, 8(sp)
; RV64I-NEXT: mv s2, a1
-; RV64I-NEXT: mv s5, a0
+; RV64I-NEXT: mv s4, a0
; RV64I-NEXT: lwu a0, 0(a0)
; RV64I-NEXT: sext.w s1, a1
-; RV64I-NEXT: addi s3, sp, 12
-; RV64I-NEXT: addi s4, zero, 3
+; RV64I-NEXT: addi s3, sp, 4
; RV64I-NEXT: .LBB162_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: sext.w a1, a0
; RV64I-NEXT: mv a2, s2
; RV64I-NEXT: .LBB162_3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB162_1 Depth=1
-; RV64I-NEXT: sw a0, 12(sp)
-; RV64I-NEXT: mv a0, s5
+; RV64I-NEXT: sw a0, 4(sp)
+; RV64I-NEXT: mv a0, s4
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s4
+; RV64I-NEXT: addi a3, zero, 3
; RV64I-NEXT: mv a4, zero
; RV64I-NEXT: call __atomic_compare_exchange_4
; RV64I-NEXT: mv a1, a0
-; RV64I-NEXT: lw a0, 12(sp)
+; RV64I-NEXT: lw a0, 4(sp)
; RV64I-NEXT: beqz a1, .LBB162_1
; RV64I-NEXT: # %bb.4: # %atomicrmw.end
-; RV64I-NEXT: ld s5, 16(sp)
-; RV64I-NEXT: ld s4, 24(sp)
-; RV64I-NEXT: ld s3, 32(sp)
-; RV64I-NEXT: ld s2, 40(sp)
-; RV64I-NEXT: ld s1, 48(sp)
-; RV64I-NEXT: ld ra, 56(sp)
-; RV64I-NEXT: addi sp, sp, 64
+; RV64I-NEXT: ld s4, 8(sp)
+; RV64I-NEXT: ld s3, 16(sp)
+; RV64I-NEXT: ld s2, 24(sp)
+; RV64I-NEXT: ld s1, 32(sp)
+; RV64I-NEXT: ld ra, 40(sp)
+; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_umin_i32_release:
; RV32I-NEXT: sw s1, 24(sp)
; RV32I-NEXT: sw s2, 20(sp)
; RV32I-NEXT: sw s3, 16(sp)
-; RV32I-NEXT: sw s4, 12(sp)
-; RV32I-NEXT: sw s5, 8(sp)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: mv s2, a0
; RV32I-NEXT: lw a2, 0(a0)
-; RV32I-NEXT: addi s3, sp, 4
-; RV32I-NEXT: addi s4, zero, 4
-; RV32I-NEXT: addi s5, zero, 2
+; RV32I-NEXT: addi s3, sp, 12
; RV32I-NEXT: .LBB163_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
-; RV32I-NEXT: sw a2, 4(sp)
+; RV32I-NEXT: sw a2, 12(sp)
; RV32I-NEXT: bgeu s1, a2, .LBB163_3
; RV32I-NEXT: # %bb.2: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB163_1 Depth=1
; RV32I-NEXT: # in Loop: Header=BB163_1 Depth=1
; RV32I-NEXT: mv a0, s2
; RV32I-NEXT: mv a1, s3
-; RV32I-NEXT: mv a3, s4
-; RV32I-NEXT: mv a4, s5
+; RV32I-NEXT: addi a3, zero, 4
+; RV32I-NEXT: addi a4, zero, 2
; RV32I-NEXT: call __atomic_compare_exchange_4
-; RV32I-NEXT: lw a2, 4(sp)
+; RV32I-NEXT: lw a2, 12(sp)
; RV32I-NEXT: beqz a0, .LBB163_1
; RV32I-NEXT: # %bb.4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a2
-; RV32I-NEXT: lw s5, 8(sp)
-; RV32I-NEXT: lw s4, 12(sp)
; RV32I-NEXT: lw s3, 16(sp)
; RV32I-NEXT: lw s2, 20(sp)
; RV32I-NEXT: lw s1, 24(sp)
;
; RV64I-LABEL: atomicrmw_umin_i32_acq_rel:
; RV64I: # %bb.0:
-; RV64I-NEXT: addi sp, sp, -64
-; RV64I-NEXT: sd ra, 56(sp)
-; RV64I-NEXT: sd s1, 48(sp)
-; RV64I-NEXT: sd s2, 40(sp)
-; RV64I-NEXT: sd s3, 32(sp)
-; RV64I-NEXT: sd s4, 24(sp)
-; RV64I-NEXT: sd s5, 16(sp)
-; RV64I-NEXT: sd s6, 8(sp)
+; RV64I-NEXT: addi sp, sp, -48
+; RV64I-NEXT: sd ra, 40(sp)
+; RV64I-NEXT: sd s1, 32(sp)
+; RV64I-NEXT: sd s2, 24(sp)
+; RV64I-NEXT: sd s3, 16(sp)
+; RV64I-NEXT: sd s4, 8(sp)
; RV64I-NEXT: mv s2, a1
-; RV64I-NEXT: mv s6, a0
+; RV64I-NEXT: mv s4, a0
; RV64I-NEXT: lwu a0, 0(a0)
; RV64I-NEXT: sext.w s1, a1
; RV64I-NEXT: addi s3, sp, 4
-; RV64I-NEXT: addi s4, zero, 4
-; RV64I-NEXT: addi s5, zero, 2
; RV64I-NEXT: .LBB163_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: sext.w a1, a0
; RV64I-NEXT: .LBB163_3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB163_1 Depth=1
; RV64I-NEXT: sw a0, 4(sp)
-; RV64I-NEXT: mv a0, s6
+; RV64I-NEXT: mv a0, s4
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s4
-; RV64I-NEXT: mv a4, s5
+; RV64I-NEXT: addi a3, zero, 4
+; RV64I-NEXT: addi a4, zero, 2
; RV64I-NEXT: call __atomic_compare_exchange_4
; RV64I-NEXT: mv a1, a0
; RV64I-NEXT: lw a0, 4(sp)
; RV64I-NEXT: beqz a1, .LBB163_1
; RV64I-NEXT: # %bb.4: # %atomicrmw.end
-; RV64I-NEXT: ld s6, 8(sp)
-; RV64I-NEXT: ld s5, 16(sp)
-; RV64I-NEXT: ld s4, 24(sp)
-; RV64I-NEXT: ld s3, 32(sp)
-; RV64I-NEXT: ld s2, 40(sp)
-; RV64I-NEXT: ld s1, 48(sp)
-; RV64I-NEXT: ld ra, 56(sp)
-; RV64I-NEXT: addi sp, sp, 64
+; RV64I-NEXT: ld s4, 8(sp)
+; RV64I-NEXT: ld s3, 16(sp)
+; RV64I-NEXT: ld s2, 24(sp)
+; RV64I-NEXT: ld s1, 32(sp)
+; RV64I-NEXT: ld ra, 40(sp)
+; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_umin_i32_acq_rel:
; RV32I-NEXT: sw s1, 24(sp)
; RV32I-NEXT: sw s2, 20(sp)
; RV32I-NEXT: sw s3, 16(sp)
-; RV32I-NEXT: sw s4, 12(sp)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: mv s2, a0
; RV32I-NEXT: lw a2, 0(a0)
-; RV32I-NEXT: addi s3, sp, 8
-; RV32I-NEXT: addi s4, zero, 5
+; RV32I-NEXT: addi s3, sp, 12
; RV32I-NEXT: .LBB164_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
-; RV32I-NEXT: sw a2, 8(sp)
+; RV32I-NEXT: sw a2, 12(sp)
; RV32I-NEXT: bgeu s1, a2, .LBB164_3
; RV32I-NEXT: # %bb.2: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB164_1 Depth=1
; RV32I-NEXT: # in Loop: Header=BB164_1 Depth=1
; RV32I-NEXT: mv a0, s2
; RV32I-NEXT: mv a1, s3
-; RV32I-NEXT: mv a3, s4
-; RV32I-NEXT: mv a4, s4
+; RV32I-NEXT: addi a3, zero, 5
+; RV32I-NEXT: addi a4, zero, 5
; RV32I-NEXT: call __atomic_compare_exchange_4
-; RV32I-NEXT: lw a2, 8(sp)
+; RV32I-NEXT: lw a2, 12(sp)
; RV32I-NEXT: beqz a0, .LBB164_1
; RV32I-NEXT: # %bb.4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a2
-; RV32I-NEXT: lw s4, 12(sp)
; RV32I-NEXT: lw s3, 16(sp)
; RV32I-NEXT: lw s2, 20(sp)
; RV32I-NEXT: lw s1, 24(sp)
;
; RV64I-LABEL: atomicrmw_umin_i32_seq_cst:
; RV64I: # %bb.0:
-; RV64I-NEXT: addi sp, sp, -64
-; RV64I-NEXT: sd ra, 56(sp)
-; RV64I-NEXT: sd s1, 48(sp)
-; RV64I-NEXT: sd s2, 40(sp)
-; RV64I-NEXT: sd s3, 32(sp)
-; RV64I-NEXT: sd s4, 24(sp)
-; RV64I-NEXT: sd s5, 16(sp)
+; RV64I-NEXT: addi sp, sp, -48
+; RV64I-NEXT: sd ra, 40(sp)
+; RV64I-NEXT: sd s1, 32(sp)
+; RV64I-NEXT: sd s2, 24(sp)
+; RV64I-NEXT: sd s3, 16(sp)
+; RV64I-NEXT: sd s4, 8(sp)
; RV64I-NEXT: mv s2, a1
; RV64I-NEXT: mv s4, a0
; RV64I-NEXT: lwu a0, 0(a0)
-; RV64I-NEXT: sext.w s5, a1
-; RV64I-NEXT: addi s3, sp, 12
-; RV64I-NEXT: addi s1, zero, 5
+; RV64I-NEXT: sext.w s1, a1
+; RV64I-NEXT: addi s3, sp, 4
; RV64I-NEXT: .LBB164_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: sext.w a1, a0
; RV64I-NEXT: mv a2, a0
-; RV64I-NEXT: bgeu s5, a1, .LBB164_3
+; RV64I-NEXT: bgeu s1, a1, .LBB164_3
; RV64I-NEXT: # %bb.2: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB164_1 Depth=1
; RV64I-NEXT: mv a2, s2
; RV64I-NEXT: .LBB164_3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB164_1 Depth=1
-; RV64I-NEXT: sw a0, 12(sp)
+; RV64I-NEXT: sw a0, 4(sp)
; RV64I-NEXT: mv a0, s4
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s1
-; RV64I-NEXT: mv a4, s1
+; RV64I-NEXT: addi a3, zero, 5
+; RV64I-NEXT: addi a4, zero, 5
; RV64I-NEXT: call __atomic_compare_exchange_4
; RV64I-NEXT: mv a1, a0
-; RV64I-NEXT: lw a0, 12(sp)
+; RV64I-NEXT: lw a0, 4(sp)
; RV64I-NEXT: beqz a1, .LBB164_1
; RV64I-NEXT: # %bb.4: # %atomicrmw.end
-; RV64I-NEXT: ld s5, 16(sp)
-; RV64I-NEXT: ld s4, 24(sp)
-; RV64I-NEXT: ld s3, 32(sp)
-; RV64I-NEXT: ld s2, 40(sp)
-; RV64I-NEXT: ld s1, 48(sp)
-; RV64I-NEXT: ld ra, 56(sp)
-; RV64I-NEXT: addi sp, sp, 64
+; RV64I-NEXT: ld s4, 8(sp)
+; RV64I-NEXT: ld s3, 16(sp)
+; RV64I-NEXT: ld s2, 24(sp)
+; RV64I-NEXT: ld s1, 32(sp)
+; RV64I-NEXT: ld ra, 40(sp)
+; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_umin_i32_seq_cst:
; RV32I-NEXT: sw s2, 20(sp)
; RV32I-NEXT: sw s3, 16(sp)
; RV32I-NEXT: sw s4, 12(sp)
-; RV32I-NEXT: sw s5, 8(sp)
; RV32I-NEXT: mv s1, a2
; RV32I-NEXT: mv s2, a1
; RV32I-NEXT: mv s3, a0
; RV32I-NEXT: lw a1, 4(a0)
; RV32I-NEXT: lw a2, 0(a0)
; RV32I-NEXT: mv s4, sp
-; RV32I-NEXT: addi s5, zero, 2
; RV32I-NEXT: .LBB201_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: beq a1, s1, .LBB201_3
; RV32I-NEXT: sw a1, 4(sp)
; RV32I-NEXT: mv a0, s3
; RV32I-NEXT: mv a1, s4
-; RV32I-NEXT: mv a4, s5
-; RV32I-NEXT: mv a5, s5
+; RV32I-NEXT: addi a4, zero, 2
+; RV32I-NEXT: addi a5, zero, 2
; RV32I-NEXT: call __atomic_compare_exchange_8
; RV32I-NEXT: lw a1, 4(sp)
; RV32I-NEXT: lw a2, 0(sp)
; RV32I-NEXT: beqz a0, .LBB201_1
; RV32I-NEXT: # %bb.8: # %atomicrmw.end
; RV32I-NEXT: mv a0, a2
-; RV32I-NEXT: lw s5, 8(sp)
; RV32I-NEXT: lw s4, 12(sp)
; RV32I-NEXT: lw s3, 16(sp)
; RV32I-NEXT: lw s2, 20(sp)
; RV32IA-NEXT: sw s2, 20(sp)
; RV32IA-NEXT: sw s3, 16(sp)
; RV32IA-NEXT: sw s4, 12(sp)
-; RV32IA-NEXT: sw s5, 8(sp)
; RV32IA-NEXT: mv s1, a2
; RV32IA-NEXT: mv s2, a1
; RV32IA-NEXT: mv s3, a0
; RV32IA-NEXT: lw a1, 4(a0)
; RV32IA-NEXT: lw a2, 0(a0)
; RV32IA-NEXT: mv s4, sp
-; RV32IA-NEXT: addi s5, zero, 2
; RV32IA-NEXT: .LBB201_1: # %atomicrmw.start
; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: beq a1, s1, .LBB201_3
; RV32IA-NEXT: sw a1, 4(sp)
; RV32IA-NEXT: mv a0, s3
; RV32IA-NEXT: mv a1, s4
-; RV32IA-NEXT: mv a4, s5
-; RV32IA-NEXT: mv a5, s5
+; RV32IA-NEXT: addi a4, zero, 2
+; RV32IA-NEXT: addi a5, zero, 2
; RV32IA-NEXT: call __atomic_compare_exchange_8
; RV32IA-NEXT: lw a1, 4(sp)
; RV32IA-NEXT: lw a2, 0(sp)
; RV32IA-NEXT: beqz a0, .LBB201_1
; RV32IA-NEXT: # %bb.8: # %atomicrmw.end
; RV32IA-NEXT: mv a0, a2
-; RV32IA-NEXT: lw s5, 8(sp)
; RV32IA-NEXT: lw s4, 12(sp)
; RV32IA-NEXT: lw s3, 16(sp)
; RV32IA-NEXT: lw s2, 20(sp)
; RV64I-NEXT: sd s1, 32(sp)
; RV64I-NEXT: sd s2, 24(sp)
; RV64I-NEXT: sd s3, 16(sp)
-; RV64I-NEXT: sd s4, 8(sp)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: mv s2, a0
; RV64I-NEXT: ld a2, 0(a0)
-; RV64I-NEXT: mv s3, sp
-; RV64I-NEXT: addi s4, zero, 2
+; RV64I-NEXT: addi s3, sp, 8
; RV64I-NEXT: .LBB201_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
-; RV64I-NEXT: sd a2, 0(sp)
+; RV64I-NEXT: sd a2, 8(sp)
; RV64I-NEXT: blt s1, a2, .LBB201_3
; RV64I-NEXT: # %bb.2: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB201_1 Depth=1
; RV64I-NEXT: # in Loop: Header=BB201_1 Depth=1
; RV64I-NEXT: mv a0, s2
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s4
-; RV64I-NEXT: mv a4, s4
+; RV64I-NEXT: addi a3, zero, 2
+; RV64I-NEXT: addi a4, zero, 2
; RV64I-NEXT: call __atomic_compare_exchange_8
-; RV64I-NEXT: ld a2, 0(sp)
+; RV64I-NEXT: ld a2, 8(sp)
; RV64I-NEXT: beqz a0, .LBB201_1
; RV64I-NEXT: # %bb.4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a2
-; RV64I-NEXT: ld s4, 8(sp)
; RV64I-NEXT: ld s3, 16(sp)
; RV64I-NEXT: ld s2, 24(sp)
; RV64I-NEXT: ld s1, 32(sp)
; RV32I-NEXT: sw s2, 20(sp)
; RV32I-NEXT: sw s3, 16(sp)
; RV32I-NEXT: sw s4, 12(sp)
-; RV32I-NEXT: sw s5, 8(sp)
; RV32I-NEXT: mv s1, a2
; RV32I-NEXT: mv s2, a1
; RV32I-NEXT: mv s3, a0
; RV32I-NEXT: lw a1, 4(a0)
; RV32I-NEXT: lw a2, 0(a0)
; RV32I-NEXT: mv s4, sp
-; RV32I-NEXT: addi s5, zero, 3
; RV32I-NEXT: .LBB202_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: beq a1, s1, .LBB202_3
; RV32I-NEXT: sw a1, 4(sp)
; RV32I-NEXT: mv a0, s3
; RV32I-NEXT: mv a1, s4
-; RV32I-NEXT: mv a4, s5
+; RV32I-NEXT: addi a4, zero, 3
; RV32I-NEXT: mv a5, zero
; RV32I-NEXT: call __atomic_compare_exchange_8
; RV32I-NEXT: lw a1, 4(sp)
; RV32I-NEXT: beqz a0, .LBB202_1
; RV32I-NEXT: # %bb.8: # %atomicrmw.end
; RV32I-NEXT: mv a0, a2
-; RV32I-NEXT: lw s5, 8(sp)
; RV32I-NEXT: lw s4, 12(sp)
; RV32I-NEXT: lw s3, 16(sp)
; RV32I-NEXT: lw s2, 20(sp)
; RV32IA-NEXT: sw s2, 20(sp)
; RV32IA-NEXT: sw s3, 16(sp)
; RV32IA-NEXT: sw s4, 12(sp)
-; RV32IA-NEXT: sw s5, 8(sp)
; RV32IA-NEXT: mv s1, a2
; RV32IA-NEXT: mv s2, a1
; RV32IA-NEXT: mv s3, a0
; RV32IA-NEXT: lw a1, 4(a0)
; RV32IA-NEXT: lw a2, 0(a0)
; RV32IA-NEXT: mv s4, sp
-; RV32IA-NEXT: addi s5, zero, 3
; RV32IA-NEXT: .LBB202_1: # %atomicrmw.start
; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: beq a1, s1, .LBB202_3
; RV32IA-NEXT: sw a1, 4(sp)
; RV32IA-NEXT: mv a0, s3
; RV32IA-NEXT: mv a1, s4
-; RV32IA-NEXT: mv a4, s5
+; RV32IA-NEXT: addi a4, zero, 3
; RV32IA-NEXT: mv a5, zero
; RV32IA-NEXT: call __atomic_compare_exchange_8
; RV32IA-NEXT: lw a1, 4(sp)
; RV32IA-NEXT: beqz a0, .LBB202_1
; RV32IA-NEXT: # %bb.8: # %atomicrmw.end
; RV32IA-NEXT: mv a0, a2
-; RV32IA-NEXT: lw s5, 8(sp)
; RV32IA-NEXT: lw s4, 12(sp)
; RV32IA-NEXT: lw s3, 16(sp)
; RV32IA-NEXT: lw s2, 20(sp)
; RV64I-NEXT: sd s1, 32(sp)
; RV64I-NEXT: sd s2, 24(sp)
; RV64I-NEXT: sd s3, 16(sp)
-; RV64I-NEXT: sd s4, 8(sp)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: mv s2, a0
; RV64I-NEXT: ld a2, 0(a0)
-; RV64I-NEXT: mv s3, sp
-; RV64I-NEXT: addi s4, zero, 3
+; RV64I-NEXT: addi s3, sp, 8
; RV64I-NEXT: .LBB202_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
-; RV64I-NEXT: sd a2, 0(sp)
+; RV64I-NEXT: sd a2, 8(sp)
; RV64I-NEXT: blt s1, a2, .LBB202_3
; RV64I-NEXT: # %bb.2: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB202_1 Depth=1
; RV64I-NEXT: # in Loop: Header=BB202_1 Depth=1
; RV64I-NEXT: mv a0, s2
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s4
+; RV64I-NEXT: addi a3, zero, 3
; RV64I-NEXT: mv a4, zero
; RV64I-NEXT: call __atomic_compare_exchange_8
-; RV64I-NEXT: ld a2, 0(sp)
+; RV64I-NEXT: ld a2, 8(sp)
; RV64I-NEXT: beqz a0, .LBB202_1
; RV64I-NEXT: # %bb.4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a2
-; RV64I-NEXT: ld s4, 8(sp)
; RV64I-NEXT: ld s3, 16(sp)
; RV64I-NEXT: ld s2, 24(sp)
; RV64I-NEXT: ld s1, 32(sp)
define i64 @atomicrmw_max_i64_acq_rel(i64 *%a, i64 %b) nounwind {
; RV32I-LABEL: atomicrmw_max_i64_acq_rel:
; RV32I: # %bb.0:
-; RV32I-NEXT: addi sp, sp, -48
-; RV32I-NEXT: sw ra, 44(sp)
-; RV32I-NEXT: sw s1, 40(sp)
-; RV32I-NEXT: sw s2, 36(sp)
-; RV32I-NEXT: sw s3, 32(sp)
-; RV32I-NEXT: sw s4, 28(sp)
-; RV32I-NEXT: sw s5, 24(sp)
-; RV32I-NEXT: sw s6, 20(sp)
+; RV32I-NEXT: addi sp, sp, -32
+; RV32I-NEXT: sw ra, 28(sp)
+; RV32I-NEXT: sw s1, 24(sp)
+; RV32I-NEXT: sw s2, 20(sp)
+; RV32I-NEXT: sw s3, 16(sp)
+; RV32I-NEXT: sw s4, 12(sp)
; RV32I-NEXT: mv s1, a2
; RV32I-NEXT: mv s2, a1
; RV32I-NEXT: mv s3, a0
; RV32I-NEXT: lw a1, 4(a0)
; RV32I-NEXT: lw a2, 0(a0)
-; RV32I-NEXT: addi s4, sp, 8
-; RV32I-NEXT: addi s5, zero, 4
-; RV32I-NEXT: addi s6, zero, 2
+; RV32I-NEXT: mv s4, sp
; RV32I-NEXT: .LBB203_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: beq a1, s1, .LBB203_3
; RV32I-NEXT: # %bb.2: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB203_1 Depth=1
; RV32I-NEXT: slt a0, s1, a1
-; RV32I-NEXT: sw a2, 8(sp)
+; RV32I-NEXT: sw a2, 0(sp)
; RV32I-NEXT: beqz a0, .LBB203_4
; RV32I-NEXT: j .LBB203_5
; RV32I-NEXT: .LBB203_3: # in Loop: Header=BB203_1 Depth=1
; RV32I-NEXT: sltu a0, s2, a2
-; RV32I-NEXT: sw a2, 8(sp)
+; RV32I-NEXT: sw a2, 0(sp)
; RV32I-NEXT: bnez a0, .LBB203_5
; RV32I-NEXT: .LBB203_4: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB203_1 Depth=1
; RV32I-NEXT: mv a3, s1
; RV32I-NEXT: .LBB203_7: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB203_1 Depth=1
-; RV32I-NEXT: sw a1, 12(sp)
+; RV32I-NEXT: sw a1, 4(sp)
; RV32I-NEXT: mv a0, s3
; RV32I-NEXT: mv a1, s4
-; RV32I-NEXT: mv a4, s5
-; RV32I-NEXT: mv a5, s6
+; RV32I-NEXT: addi a4, zero, 4
+; RV32I-NEXT: addi a5, zero, 2
; RV32I-NEXT: call __atomic_compare_exchange_8
-; RV32I-NEXT: lw a1, 12(sp)
-; RV32I-NEXT: lw a2, 8(sp)
+; RV32I-NEXT: lw a1, 4(sp)
+; RV32I-NEXT: lw a2, 0(sp)
; RV32I-NEXT: beqz a0, .LBB203_1
; RV32I-NEXT: # %bb.8: # %atomicrmw.end
; RV32I-NEXT: mv a0, a2
-; RV32I-NEXT: lw s6, 20(sp)
-; RV32I-NEXT: lw s5, 24(sp)
-; RV32I-NEXT: lw s4, 28(sp)
-; RV32I-NEXT: lw s3, 32(sp)
-; RV32I-NEXT: lw s2, 36(sp)
-; RV32I-NEXT: lw s1, 40(sp)
-; RV32I-NEXT: lw ra, 44(sp)
-; RV32I-NEXT: addi sp, sp, 48
+; RV32I-NEXT: lw s4, 12(sp)
+; RV32I-NEXT: lw s3, 16(sp)
+; RV32I-NEXT: lw s2, 20(sp)
+; RV32I-NEXT: lw s1, 24(sp)
+; RV32I-NEXT: lw ra, 28(sp)
+; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_max_i64_acq_rel:
; RV32IA: # %bb.0:
-; RV32IA-NEXT: addi sp, sp, -48
-; RV32IA-NEXT: sw ra, 44(sp)
-; RV32IA-NEXT: sw s1, 40(sp)
-; RV32IA-NEXT: sw s2, 36(sp)
-; RV32IA-NEXT: sw s3, 32(sp)
-; RV32IA-NEXT: sw s4, 28(sp)
-; RV32IA-NEXT: sw s5, 24(sp)
-; RV32IA-NEXT: sw s6, 20(sp)
+; RV32IA-NEXT: addi sp, sp, -32
+; RV32IA-NEXT: sw ra, 28(sp)
+; RV32IA-NEXT: sw s1, 24(sp)
+; RV32IA-NEXT: sw s2, 20(sp)
+; RV32IA-NEXT: sw s3, 16(sp)
+; RV32IA-NEXT: sw s4, 12(sp)
; RV32IA-NEXT: mv s1, a2
; RV32IA-NEXT: mv s2, a1
; RV32IA-NEXT: mv s3, a0
; RV32IA-NEXT: lw a1, 4(a0)
; RV32IA-NEXT: lw a2, 0(a0)
-; RV32IA-NEXT: addi s4, sp, 8
-; RV32IA-NEXT: addi s5, zero, 4
-; RV32IA-NEXT: addi s6, zero, 2
+; RV32IA-NEXT: mv s4, sp
; RV32IA-NEXT: .LBB203_1: # %atomicrmw.start
; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: beq a1, s1, .LBB203_3
; RV32IA-NEXT: # %bb.2: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB203_1 Depth=1
; RV32IA-NEXT: slt a0, s1, a1
-; RV32IA-NEXT: sw a2, 8(sp)
+; RV32IA-NEXT: sw a2, 0(sp)
; RV32IA-NEXT: beqz a0, .LBB203_4
; RV32IA-NEXT: j .LBB203_5
; RV32IA-NEXT: .LBB203_3: # in Loop: Header=BB203_1 Depth=1
; RV32IA-NEXT: sltu a0, s2, a2
-; RV32IA-NEXT: sw a2, 8(sp)
+; RV32IA-NEXT: sw a2, 0(sp)
; RV32IA-NEXT: bnez a0, .LBB203_5
; RV32IA-NEXT: .LBB203_4: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB203_1 Depth=1
; RV32IA-NEXT: mv a3, s1
; RV32IA-NEXT: .LBB203_7: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB203_1 Depth=1
-; RV32IA-NEXT: sw a1, 12(sp)
+; RV32IA-NEXT: sw a1, 4(sp)
; RV32IA-NEXT: mv a0, s3
; RV32IA-NEXT: mv a1, s4
-; RV32IA-NEXT: mv a4, s5
-; RV32IA-NEXT: mv a5, s6
+; RV32IA-NEXT: addi a4, zero, 4
+; RV32IA-NEXT: addi a5, zero, 2
; RV32IA-NEXT: call __atomic_compare_exchange_8
-; RV32IA-NEXT: lw a1, 12(sp)
-; RV32IA-NEXT: lw a2, 8(sp)
+; RV32IA-NEXT: lw a1, 4(sp)
+; RV32IA-NEXT: lw a2, 0(sp)
; RV32IA-NEXT: beqz a0, .LBB203_1
; RV32IA-NEXT: # %bb.8: # %atomicrmw.end
; RV32IA-NEXT: mv a0, a2
-; RV32IA-NEXT: lw s6, 20(sp)
-; RV32IA-NEXT: lw s5, 24(sp)
-; RV32IA-NEXT: lw s4, 28(sp)
-; RV32IA-NEXT: lw s3, 32(sp)
-; RV32IA-NEXT: lw s2, 36(sp)
-; RV32IA-NEXT: lw s1, 40(sp)
-; RV32IA-NEXT: lw ra, 44(sp)
-; RV32IA-NEXT: addi sp, sp, 48
+; RV32IA-NEXT: lw s4, 12(sp)
+; RV32IA-NEXT: lw s3, 16(sp)
+; RV32IA-NEXT: lw s2, 20(sp)
+; RV32IA-NEXT: lw s1, 24(sp)
+; RV32IA-NEXT: lw ra, 28(sp)
+; RV32IA-NEXT: addi sp, sp, 32
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_max_i64_acq_rel:
; RV64I: # %bb.0:
-; RV64I-NEXT: addi sp, sp, -64
-; RV64I-NEXT: sd ra, 56(sp)
-; RV64I-NEXT: sd s1, 48(sp)
-; RV64I-NEXT: sd s2, 40(sp)
-; RV64I-NEXT: sd s3, 32(sp)
-; RV64I-NEXT: sd s4, 24(sp)
-; RV64I-NEXT: sd s5, 16(sp)
+; RV64I-NEXT: addi sp, sp, -48
+; RV64I-NEXT: sd ra, 40(sp)
+; RV64I-NEXT: sd s1, 32(sp)
+; RV64I-NEXT: sd s2, 24(sp)
+; RV64I-NEXT: sd s3, 16(sp)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: mv s2, a0
; RV64I-NEXT: ld a2, 0(a0)
; RV64I-NEXT: addi s3, sp, 8
-; RV64I-NEXT: addi s4, zero, 4
-; RV64I-NEXT: addi s5, zero, 2
; RV64I-NEXT: .LBB203_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: sd a2, 8(sp)
; RV64I-NEXT: # in Loop: Header=BB203_1 Depth=1
; RV64I-NEXT: mv a0, s2
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s4
-; RV64I-NEXT: mv a4, s5
-; RV64I-NEXT: call __atomic_compare_exchange_8
-; RV64I-NEXT: ld a2, 8(sp)
-; RV64I-NEXT: beqz a0, .LBB203_1
-; RV64I-NEXT: # %bb.4: # %atomicrmw.end
-; RV64I-NEXT: mv a0, a2
-; RV64I-NEXT: ld s5, 16(sp)
-; RV64I-NEXT: ld s4, 24(sp)
-; RV64I-NEXT: ld s3, 32(sp)
-; RV64I-NEXT: ld s2, 40(sp)
-; RV64I-NEXT: ld s1, 48(sp)
-; RV64I-NEXT: ld ra, 56(sp)
-; RV64I-NEXT: addi sp, sp, 64
+; RV64I-NEXT: addi a3, zero, 4
+; RV64I-NEXT: addi a4, zero, 2
+; RV64I-NEXT: call __atomic_compare_exchange_8
+; RV64I-NEXT: ld a2, 8(sp)
+; RV64I-NEXT: beqz a0, .LBB203_1
+; RV64I-NEXT: # %bb.4: # %atomicrmw.end
+; RV64I-NEXT: mv a0, a2
+; RV64I-NEXT: ld s3, 16(sp)
+; RV64I-NEXT: ld s2, 24(sp)
+; RV64I-NEXT: ld s1, 32(sp)
+; RV64I-NEXT: ld ra, 40(sp)
+; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_max_i64_acq_rel:
; RV32I-NEXT: sw s2, 20(sp)
; RV32I-NEXT: sw s3, 16(sp)
; RV32I-NEXT: sw s4, 12(sp)
-; RV32I-NEXT: sw s5, 8(sp)
; RV32I-NEXT: mv s1, a2
; RV32I-NEXT: mv s2, a1
; RV32I-NEXT: mv s3, a0
; RV32I-NEXT: lw a1, 4(a0)
; RV32I-NEXT: lw a2, 0(a0)
; RV32I-NEXT: mv s4, sp
-; RV32I-NEXT: addi s5, zero, 5
; RV32I-NEXT: .LBB204_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: beq a1, s1, .LBB204_3
; RV32I-NEXT: sw a1, 4(sp)
; RV32I-NEXT: mv a0, s3
; RV32I-NEXT: mv a1, s4
-; RV32I-NEXT: mv a4, s5
-; RV32I-NEXT: mv a5, s5
+; RV32I-NEXT: addi a4, zero, 5
+; RV32I-NEXT: addi a5, zero, 5
; RV32I-NEXT: call __atomic_compare_exchange_8
; RV32I-NEXT: lw a1, 4(sp)
; RV32I-NEXT: lw a2, 0(sp)
; RV32I-NEXT: beqz a0, .LBB204_1
; RV32I-NEXT: # %bb.8: # %atomicrmw.end
; RV32I-NEXT: mv a0, a2
-; RV32I-NEXT: lw s5, 8(sp)
; RV32I-NEXT: lw s4, 12(sp)
; RV32I-NEXT: lw s3, 16(sp)
; RV32I-NEXT: lw s2, 20(sp)
; RV32IA-NEXT: sw s2, 20(sp)
; RV32IA-NEXT: sw s3, 16(sp)
; RV32IA-NEXT: sw s4, 12(sp)
-; RV32IA-NEXT: sw s5, 8(sp)
; RV32IA-NEXT: mv s1, a2
; RV32IA-NEXT: mv s2, a1
; RV32IA-NEXT: mv s3, a0
; RV32IA-NEXT: lw a1, 4(a0)
; RV32IA-NEXT: lw a2, 0(a0)
; RV32IA-NEXT: mv s4, sp
-; RV32IA-NEXT: addi s5, zero, 5
; RV32IA-NEXT: .LBB204_1: # %atomicrmw.start
; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: beq a1, s1, .LBB204_3
; RV32IA-NEXT: sw a1, 4(sp)
; RV32IA-NEXT: mv a0, s3
; RV32IA-NEXT: mv a1, s4
-; RV32IA-NEXT: mv a4, s5
-; RV32IA-NEXT: mv a5, s5
+; RV32IA-NEXT: addi a4, zero, 5
+; RV32IA-NEXT: addi a5, zero, 5
; RV32IA-NEXT: call __atomic_compare_exchange_8
; RV32IA-NEXT: lw a1, 4(sp)
; RV32IA-NEXT: lw a2, 0(sp)
; RV32IA-NEXT: beqz a0, .LBB204_1
; RV32IA-NEXT: # %bb.8: # %atomicrmw.end
; RV32IA-NEXT: mv a0, a2
-; RV32IA-NEXT: lw s5, 8(sp)
; RV32IA-NEXT: lw s4, 12(sp)
; RV32IA-NEXT: lw s3, 16(sp)
; RV32IA-NEXT: lw s2, 20(sp)
; RV64I-NEXT: sd s1, 32(sp)
; RV64I-NEXT: sd s2, 24(sp)
; RV64I-NEXT: sd s3, 16(sp)
-; RV64I-NEXT: sd s4, 8(sp)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: mv s2, a0
; RV64I-NEXT: ld a2, 0(a0)
-; RV64I-NEXT: mv s3, sp
-; RV64I-NEXT: addi s4, zero, 5
+; RV64I-NEXT: addi s3, sp, 8
; RV64I-NEXT: .LBB204_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
-; RV64I-NEXT: sd a2, 0(sp)
+; RV64I-NEXT: sd a2, 8(sp)
; RV64I-NEXT: blt s1, a2, .LBB204_3
; RV64I-NEXT: # %bb.2: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB204_1 Depth=1
; RV64I-NEXT: # in Loop: Header=BB204_1 Depth=1
; RV64I-NEXT: mv a0, s2
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s4
-; RV64I-NEXT: mv a4, s4
+; RV64I-NEXT: addi a3, zero, 5
+; RV64I-NEXT: addi a4, zero, 5
; RV64I-NEXT: call __atomic_compare_exchange_8
-; RV64I-NEXT: ld a2, 0(sp)
+; RV64I-NEXT: ld a2, 8(sp)
; RV64I-NEXT: beqz a0, .LBB204_1
; RV64I-NEXT: # %bb.4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a2
-; RV64I-NEXT: ld s4, 8(sp)
; RV64I-NEXT: ld s3, 16(sp)
; RV64I-NEXT: ld s2, 24(sp)
; RV64I-NEXT: ld s1, 32(sp)
; RV32I-NEXT: sw s2, 20(sp)
; RV32I-NEXT: sw s3, 16(sp)
; RV32I-NEXT: sw s4, 12(sp)
-; RV32I-NEXT: sw s5, 8(sp)
; RV32I-NEXT: mv s1, a2
; RV32I-NEXT: mv s2, a1
; RV32I-NEXT: mv s3, a0
; RV32I-NEXT: lw a1, 4(a0)
; RV32I-NEXT: lw a2, 0(a0)
; RV32I-NEXT: mv s4, sp
-; RV32I-NEXT: addi s5, zero, 2
; RV32I-NEXT: .LBB206_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: beq a1, s1, .LBB206_3
; RV32I-NEXT: sw a1, 4(sp)
; RV32I-NEXT: mv a0, s3
; RV32I-NEXT: mv a1, s4
-; RV32I-NEXT: mv a4, s5
-; RV32I-NEXT: mv a5, s5
+; RV32I-NEXT: addi a4, zero, 2
+; RV32I-NEXT: addi a5, zero, 2
; RV32I-NEXT: call __atomic_compare_exchange_8
; RV32I-NEXT: lw a1, 4(sp)
; RV32I-NEXT: lw a2, 0(sp)
; RV32I-NEXT: beqz a0, .LBB206_1
; RV32I-NEXT: # %bb.9: # %atomicrmw.end
; RV32I-NEXT: mv a0, a2
-; RV32I-NEXT: lw s5, 8(sp)
; RV32I-NEXT: lw s4, 12(sp)
; RV32I-NEXT: lw s3, 16(sp)
; RV32I-NEXT: lw s2, 20(sp)
; RV32IA-NEXT: sw s2, 20(sp)
; RV32IA-NEXT: sw s3, 16(sp)
; RV32IA-NEXT: sw s4, 12(sp)
-; RV32IA-NEXT: sw s5, 8(sp)
; RV32IA-NEXT: mv s1, a2
; RV32IA-NEXT: mv s2, a1
; RV32IA-NEXT: mv s3, a0
; RV32IA-NEXT: lw a1, 4(a0)
; RV32IA-NEXT: lw a2, 0(a0)
; RV32IA-NEXT: mv s4, sp
-; RV32IA-NEXT: addi s5, zero, 2
; RV32IA-NEXT: .LBB206_1: # %atomicrmw.start
; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: beq a1, s1, .LBB206_3
; RV32IA-NEXT: sw a1, 4(sp)
; RV32IA-NEXT: mv a0, s3
; RV32IA-NEXT: mv a1, s4
-; RV32IA-NEXT: mv a4, s5
-; RV32IA-NEXT: mv a5, s5
+; RV32IA-NEXT: addi a4, zero, 2
+; RV32IA-NEXT: addi a5, zero, 2
; RV32IA-NEXT: call __atomic_compare_exchange_8
; RV32IA-NEXT: lw a1, 4(sp)
; RV32IA-NEXT: lw a2, 0(sp)
; RV32IA-NEXT: beqz a0, .LBB206_1
; RV32IA-NEXT: # %bb.9: # %atomicrmw.end
; RV32IA-NEXT: mv a0, a2
-; RV32IA-NEXT: lw s5, 8(sp)
; RV32IA-NEXT: lw s4, 12(sp)
; RV32IA-NEXT: lw s3, 16(sp)
; RV32IA-NEXT: lw s2, 20(sp)
; RV64I-NEXT: sd s1, 32(sp)
; RV64I-NEXT: sd s2, 24(sp)
; RV64I-NEXT: sd s3, 16(sp)
-; RV64I-NEXT: sd s4, 8(sp)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: mv s2, a0
; RV64I-NEXT: ld a2, 0(a0)
-; RV64I-NEXT: mv s3, sp
-; RV64I-NEXT: addi s4, zero, 2
+; RV64I-NEXT: addi s3, sp, 8
; RV64I-NEXT: .LBB206_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
-; RV64I-NEXT: sd a2, 0(sp)
+; RV64I-NEXT: sd a2, 8(sp)
; RV64I-NEXT: bge s1, a2, .LBB206_3
; RV64I-NEXT: # %bb.2: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB206_1 Depth=1
; RV64I-NEXT: # in Loop: Header=BB206_1 Depth=1
; RV64I-NEXT: mv a0, s2
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s4
-; RV64I-NEXT: mv a4, s4
+; RV64I-NEXT: addi a3, zero, 2
+; RV64I-NEXT: addi a4, zero, 2
; RV64I-NEXT: call __atomic_compare_exchange_8
-; RV64I-NEXT: ld a2, 0(sp)
+; RV64I-NEXT: ld a2, 8(sp)
; RV64I-NEXT: beqz a0, .LBB206_1
; RV64I-NEXT: # %bb.4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a2
-; RV64I-NEXT: ld s4, 8(sp)
; RV64I-NEXT: ld s3, 16(sp)
; RV64I-NEXT: ld s2, 24(sp)
; RV64I-NEXT: ld s1, 32(sp)
; RV32I-NEXT: sw s2, 20(sp)
; RV32I-NEXT: sw s3, 16(sp)
; RV32I-NEXT: sw s4, 12(sp)
-; RV32I-NEXT: sw s5, 8(sp)
; RV32I-NEXT: mv s1, a2
; RV32I-NEXT: mv s2, a1
; RV32I-NEXT: mv s3, a0
; RV32I-NEXT: lw a1, 4(a0)
; RV32I-NEXT: lw a2, 0(a0)
; RV32I-NEXT: mv s4, sp
-; RV32I-NEXT: addi s5, zero, 3
; RV32I-NEXT: .LBB207_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: beq a1, s1, .LBB207_3
; RV32I-NEXT: sw a1, 4(sp)
; RV32I-NEXT: mv a0, s3
; RV32I-NEXT: mv a1, s4
-; RV32I-NEXT: mv a4, s5
+; RV32I-NEXT: addi a4, zero, 3
; RV32I-NEXT: mv a5, zero
; RV32I-NEXT: call __atomic_compare_exchange_8
; RV32I-NEXT: lw a1, 4(sp)
; RV32I-NEXT: beqz a0, .LBB207_1
; RV32I-NEXT: # %bb.9: # %atomicrmw.end
; RV32I-NEXT: mv a0, a2
-; RV32I-NEXT: lw s5, 8(sp)
; RV32I-NEXT: lw s4, 12(sp)
; RV32I-NEXT: lw s3, 16(sp)
; RV32I-NEXT: lw s2, 20(sp)
; RV32IA-NEXT: sw s2, 20(sp)
; RV32IA-NEXT: sw s3, 16(sp)
; RV32IA-NEXT: sw s4, 12(sp)
-; RV32IA-NEXT: sw s5, 8(sp)
; RV32IA-NEXT: mv s1, a2
; RV32IA-NEXT: mv s2, a1
; RV32IA-NEXT: mv s3, a0
; RV32IA-NEXT: lw a1, 4(a0)
; RV32IA-NEXT: lw a2, 0(a0)
; RV32IA-NEXT: mv s4, sp
-; RV32IA-NEXT: addi s5, zero, 3
; RV32IA-NEXT: .LBB207_1: # %atomicrmw.start
; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: beq a1, s1, .LBB207_3
; RV32IA-NEXT: sw a1, 4(sp)
; RV32IA-NEXT: mv a0, s3
; RV32IA-NEXT: mv a1, s4
-; RV32IA-NEXT: mv a4, s5
+; RV32IA-NEXT: addi a4, zero, 3
; RV32IA-NEXT: mv a5, zero
; RV32IA-NEXT: call __atomic_compare_exchange_8
; RV32IA-NEXT: lw a1, 4(sp)
; RV32IA-NEXT: beqz a0, .LBB207_1
; RV32IA-NEXT: # %bb.9: # %atomicrmw.end
; RV32IA-NEXT: mv a0, a2
-; RV32IA-NEXT: lw s5, 8(sp)
; RV32IA-NEXT: lw s4, 12(sp)
; RV32IA-NEXT: lw s3, 16(sp)
; RV32IA-NEXT: lw s2, 20(sp)
; RV64I-NEXT: sd s1, 32(sp)
; RV64I-NEXT: sd s2, 24(sp)
; RV64I-NEXT: sd s3, 16(sp)
-; RV64I-NEXT: sd s4, 8(sp)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: mv s2, a0
; RV64I-NEXT: ld a2, 0(a0)
-; RV64I-NEXT: mv s3, sp
-; RV64I-NEXT: addi s4, zero, 3
+; RV64I-NEXT: addi s3, sp, 8
; RV64I-NEXT: .LBB207_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
-; RV64I-NEXT: sd a2, 0(sp)
+; RV64I-NEXT: sd a2, 8(sp)
; RV64I-NEXT: bge s1, a2, .LBB207_3
; RV64I-NEXT: # %bb.2: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB207_1 Depth=1
; RV64I-NEXT: # in Loop: Header=BB207_1 Depth=1
; RV64I-NEXT: mv a0, s2
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s4
+; RV64I-NEXT: addi a3, zero, 3
; RV64I-NEXT: mv a4, zero
; RV64I-NEXT: call __atomic_compare_exchange_8
-; RV64I-NEXT: ld a2, 0(sp)
+; RV64I-NEXT: ld a2, 8(sp)
; RV64I-NEXT: beqz a0, .LBB207_1
; RV64I-NEXT: # %bb.4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a2
-; RV64I-NEXT: ld s4, 8(sp)
; RV64I-NEXT: ld s3, 16(sp)
; RV64I-NEXT: ld s2, 24(sp)
; RV64I-NEXT: ld s1, 32(sp)
define i64 @atomicrmw_min_i64_acq_rel(i64 *%a, i64 %b) nounwind {
; RV32I-LABEL: atomicrmw_min_i64_acq_rel:
; RV32I: # %bb.0:
-; RV32I-NEXT: addi sp, sp, -48
-; RV32I-NEXT: sw ra, 44(sp)
-; RV32I-NEXT: sw s1, 40(sp)
-; RV32I-NEXT: sw s2, 36(sp)
-; RV32I-NEXT: sw s3, 32(sp)
-; RV32I-NEXT: sw s4, 28(sp)
-; RV32I-NEXT: sw s5, 24(sp)
-; RV32I-NEXT: sw s6, 20(sp)
+; RV32I-NEXT: addi sp, sp, -32
+; RV32I-NEXT: sw ra, 28(sp)
+; RV32I-NEXT: sw s1, 24(sp)
+; RV32I-NEXT: sw s2, 20(sp)
+; RV32I-NEXT: sw s3, 16(sp)
+; RV32I-NEXT: sw s4, 12(sp)
; RV32I-NEXT: mv s1, a2
; RV32I-NEXT: mv s2, a1
; RV32I-NEXT: mv s3, a0
; RV32I-NEXT: lw a1, 4(a0)
; RV32I-NEXT: lw a2, 0(a0)
-; RV32I-NEXT: addi s4, sp, 8
-; RV32I-NEXT: addi s5, zero, 4
-; RV32I-NEXT: addi s6, zero, 2
+; RV32I-NEXT: mv s4, sp
; RV32I-NEXT: .LBB208_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: beq a1, s1, .LBB208_3
; RV32I-NEXT: .LBB208_4: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB208_1 Depth=1
; RV32I-NEXT: xori a0, a0, 1
-; RV32I-NEXT: sw a2, 8(sp)
+; RV32I-NEXT: sw a2, 0(sp)
; RV32I-NEXT: bnez a0, .LBB208_6
; RV32I-NEXT: # %bb.5: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB208_1 Depth=1
; RV32I-NEXT: mv a3, s1
; RV32I-NEXT: .LBB208_8: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB208_1 Depth=1
-; RV32I-NEXT: sw a1, 12(sp)
+; RV32I-NEXT: sw a1, 4(sp)
; RV32I-NEXT: mv a0, s3
; RV32I-NEXT: mv a1, s4
-; RV32I-NEXT: mv a4, s5
-; RV32I-NEXT: mv a5, s6
+; RV32I-NEXT: addi a4, zero, 4
+; RV32I-NEXT: addi a5, zero, 2
; RV32I-NEXT: call __atomic_compare_exchange_8
-; RV32I-NEXT: lw a1, 12(sp)
-; RV32I-NEXT: lw a2, 8(sp)
+; RV32I-NEXT: lw a1, 4(sp)
+; RV32I-NEXT: lw a2, 0(sp)
; RV32I-NEXT: beqz a0, .LBB208_1
; RV32I-NEXT: # %bb.9: # %atomicrmw.end
; RV32I-NEXT: mv a0, a2
-; RV32I-NEXT: lw s6, 20(sp)
-; RV32I-NEXT: lw s5, 24(sp)
-; RV32I-NEXT: lw s4, 28(sp)
-; RV32I-NEXT: lw s3, 32(sp)
-; RV32I-NEXT: lw s2, 36(sp)
-; RV32I-NEXT: lw s1, 40(sp)
-; RV32I-NEXT: lw ra, 44(sp)
-; RV32I-NEXT: addi sp, sp, 48
+; RV32I-NEXT: lw s4, 12(sp)
+; RV32I-NEXT: lw s3, 16(sp)
+; RV32I-NEXT: lw s2, 20(sp)
+; RV32I-NEXT: lw s1, 24(sp)
+; RV32I-NEXT: lw ra, 28(sp)
+; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_min_i64_acq_rel:
; RV32IA: # %bb.0:
-; RV32IA-NEXT: addi sp, sp, -48
-; RV32IA-NEXT: sw ra, 44(sp)
-; RV32IA-NEXT: sw s1, 40(sp)
-; RV32IA-NEXT: sw s2, 36(sp)
-; RV32IA-NEXT: sw s3, 32(sp)
-; RV32IA-NEXT: sw s4, 28(sp)
-; RV32IA-NEXT: sw s5, 24(sp)
-; RV32IA-NEXT: sw s6, 20(sp)
+; RV32IA-NEXT: addi sp, sp, -32
+; RV32IA-NEXT: sw ra, 28(sp)
+; RV32IA-NEXT: sw s1, 24(sp)
+; RV32IA-NEXT: sw s2, 20(sp)
+; RV32IA-NEXT: sw s3, 16(sp)
+; RV32IA-NEXT: sw s4, 12(sp)
; RV32IA-NEXT: mv s1, a2
; RV32IA-NEXT: mv s2, a1
; RV32IA-NEXT: mv s3, a0
; RV32IA-NEXT: lw a1, 4(a0)
; RV32IA-NEXT: lw a2, 0(a0)
-; RV32IA-NEXT: addi s4, sp, 8
-; RV32IA-NEXT: addi s5, zero, 4
-; RV32IA-NEXT: addi s6, zero, 2
+; RV32IA-NEXT: mv s4, sp
; RV32IA-NEXT: .LBB208_1: # %atomicrmw.start
; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: beq a1, s1, .LBB208_3
; RV32IA-NEXT: .LBB208_4: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB208_1 Depth=1
; RV32IA-NEXT: xori a0, a0, 1
-; RV32IA-NEXT: sw a2, 8(sp)
+; RV32IA-NEXT: sw a2, 0(sp)
; RV32IA-NEXT: bnez a0, .LBB208_6
; RV32IA-NEXT: # %bb.5: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB208_1 Depth=1
; RV32IA-NEXT: mv a3, s1
; RV32IA-NEXT: .LBB208_8: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB208_1 Depth=1
-; RV32IA-NEXT: sw a1, 12(sp)
+; RV32IA-NEXT: sw a1, 4(sp)
; RV32IA-NEXT: mv a0, s3
; RV32IA-NEXT: mv a1, s4
-; RV32IA-NEXT: mv a4, s5
-; RV32IA-NEXT: mv a5, s6
+; RV32IA-NEXT: addi a4, zero, 4
+; RV32IA-NEXT: addi a5, zero, 2
; RV32IA-NEXT: call __atomic_compare_exchange_8
-; RV32IA-NEXT: lw a1, 12(sp)
-; RV32IA-NEXT: lw a2, 8(sp)
+; RV32IA-NEXT: lw a1, 4(sp)
+; RV32IA-NEXT: lw a2, 0(sp)
; RV32IA-NEXT: beqz a0, .LBB208_1
; RV32IA-NEXT: # %bb.9: # %atomicrmw.end
; RV32IA-NEXT: mv a0, a2
-; RV32IA-NEXT: lw s6, 20(sp)
-; RV32IA-NEXT: lw s5, 24(sp)
-; RV32IA-NEXT: lw s4, 28(sp)
-; RV32IA-NEXT: lw s3, 32(sp)
-; RV32IA-NEXT: lw s2, 36(sp)
-; RV32IA-NEXT: lw s1, 40(sp)
-; RV32IA-NEXT: lw ra, 44(sp)
-; RV32IA-NEXT: addi sp, sp, 48
+; RV32IA-NEXT: lw s4, 12(sp)
+; RV32IA-NEXT: lw s3, 16(sp)
+; RV32IA-NEXT: lw s2, 20(sp)
+; RV32IA-NEXT: lw s1, 24(sp)
+; RV32IA-NEXT: lw ra, 28(sp)
+; RV32IA-NEXT: addi sp, sp, 32
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_min_i64_acq_rel:
; RV64I: # %bb.0:
-; RV64I-NEXT: addi sp, sp, -64
-; RV64I-NEXT: sd ra, 56(sp)
-; RV64I-NEXT: sd s1, 48(sp)
-; RV64I-NEXT: sd s2, 40(sp)
-; RV64I-NEXT: sd s3, 32(sp)
-; RV64I-NEXT: sd s4, 24(sp)
-; RV64I-NEXT: sd s5, 16(sp)
+; RV64I-NEXT: addi sp, sp, -48
+; RV64I-NEXT: sd ra, 40(sp)
+; RV64I-NEXT: sd s1, 32(sp)
+; RV64I-NEXT: sd s2, 24(sp)
+; RV64I-NEXT: sd s3, 16(sp)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: mv s2, a0
; RV64I-NEXT: ld a2, 0(a0)
; RV64I-NEXT: addi s3, sp, 8
-; RV64I-NEXT: addi s4, zero, 4
-; RV64I-NEXT: addi s5, zero, 2
; RV64I-NEXT: .LBB208_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: sd a2, 8(sp)
; RV64I-NEXT: # in Loop: Header=BB208_1 Depth=1
; RV64I-NEXT: mv a0, s2
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s4
-; RV64I-NEXT: mv a4, s5
+; RV64I-NEXT: addi a3, zero, 4
+; RV64I-NEXT: addi a4, zero, 2
; RV64I-NEXT: call __atomic_compare_exchange_8
; RV64I-NEXT: ld a2, 8(sp)
; RV64I-NEXT: beqz a0, .LBB208_1
; RV64I-NEXT: # %bb.4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a2
-; RV64I-NEXT: ld s5, 16(sp)
-; RV64I-NEXT: ld s4, 24(sp)
-; RV64I-NEXT: ld s3, 32(sp)
-; RV64I-NEXT: ld s2, 40(sp)
-; RV64I-NEXT: ld s1, 48(sp)
-; RV64I-NEXT: ld ra, 56(sp)
-; RV64I-NEXT: addi sp, sp, 64
+; RV64I-NEXT: ld s3, 16(sp)
+; RV64I-NEXT: ld s2, 24(sp)
+; RV64I-NEXT: ld s1, 32(sp)
+; RV64I-NEXT: ld ra, 40(sp)
+; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_min_i64_acq_rel:
; RV32I-NEXT: sw s2, 20(sp)
; RV32I-NEXT: sw s3, 16(sp)
; RV32I-NEXT: sw s4, 12(sp)
-; RV32I-NEXT: sw s5, 8(sp)
; RV32I-NEXT: mv s1, a2
; RV32I-NEXT: mv s2, a1
; RV32I-NEXT: mv s3, a0
; RV32I-NEXT: lw a1, 4(a0)
; RV32I-NEXT: lw a2, 0(a0)
; RV32I-NEXT: mv s4, sp
-; RV32I-NEXT: addi s5, zero, 5
; RV32I-NEXT: .LBB209_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: beq a1, s1, .LBB209_3
; RV32I-NEXT: sw a1, 4(sp)
; RV32I-NEXT: mv a0, s3
; RV32I-NEXT: mv a1, s4
-; RV32I-NEXT: mv a4, s5
-; RV32I-NEXT: mv a5, s5
+; RV32I-NEXT: addi a4, zero, 5
+; RV32I-NEXT: addi a5, zero, 5
; RV32I-NEXT: call __atomic_compare_exchange_8
; RV32I-NEXT: lw a1, 4(sp)
; RV32I-NEXT: lw a2, 0(sp)
; RV32I-NEXT: beqz a0, .LBB209_1
; RV32I-NEXT: # %bb.9: # %atomicrmw.end
; RV32I-NEXT: mv a0, a2
-; RV32I-NEXT: lw s5, 8(sp)
; RV32I-NEXT: lw s4, 12(sp)
; RV32I-NEXT: lw s3, 16(sp)
; RV32I-NEXT: lw s2, 20(sp)
; RV32IA-NEXT: sw s2, 20(sp)
; RV32IA-NEXT: sw s3, 16(sp)
; RV32IA-NEXT: sw s4, 12(sp)
-; RV32IA-NEXT: sw s5, 8(sp)
; RV32IA-NEXT: mv s1, a2
; RV32IA-NEXT: mv s2, a1
; RV32IA-NEXT: mv s3, a0
; RV32IA-NEXT: lw a1, 4(a0)
; RV32IA-NEXT: lw a2, 0(a0)
; RV32IA-NEXT: mv s4, sp
-; RV32IA-NEXT: addi s5, zero, 5
; RV32IA-NEXT: .LBB209_1: # %atomicrmw.start
; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: beq a1, s1, .LBB209_3
; RV32IA-NEXT: sw a1, 4(sp)
; RV32IA-NEXT: mv a0, s3
; RV32IA-NEXT: mv a1, s4
-; RV32IA-NEXT: mv a4, s5
-; RV32IA-NEXT: mv a5, s5
+; RV32IA-NEXT: addi a4, zero, 5
+; RV32IA-NEXT: addi a5, zero, 5
; RV32IA-NEXT: call __atomic_compare_exchange_8
; RV32IA-NEXT: lw a1, 4(sp)
; RV32IA-NEXT: lw a2, 0(sp)
; RV32IA-NEXT: beqz a0, .LBB209_1
; RV32IA-NEXT: # %bb.9: # %atomicrmw.end
; RV32IA-NEXT: mv a0, a2
-; RV32IA-NEXT: lw s5, 8(sp)
; RV32IA-NEXT: lw s4, 12(sp)
; RV32IA-NEXT: lw s3, 16(sp)
; RV32IA-NEXT: lw s2, 20(sp)
; RV64I-NEXT: sd s1, 32(sp)
; RV64I-NEXT: sd s2, 24(sp)
; RV64I-NEXT: sd s3, 16(sp)
-; RV64I-NEXT: sd s4, 8(sp)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: mv s2, a0
; RV64I-NEXT: ld a2, 0(a0)
-; RV64I-NEXT: mv s3, sp
-; RV64I-NEXT: addi s4, zero, 5
+; RV64I-NEXT: addi s3, sp, 8
; RV64I-NEXT: .LBB209_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
-; RV64I-NEXT: sd a2, 0(sp)
+; RV64I-NEXT: sd a2, 8(sp)
; RV64I-NEXT: bge s1, a2, .LBB209_3
; RV64I-NEXT: # %bb.2: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB209_1 Depth=1
; RV64I-NEXT: # in Loop: Header=BB209_1 Depth=1
; RV64I-NEXT: mv a0, s2
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s4
-; RV64I-NEXT: mv a4, s4
+; RV64I-NEXT: addi a3, zero, 5
+; RV64I-NEXT: addi a4, zero, 5
; RV64I-NEXT: call __atomic_compare_exchange_8
-; RV64I-NEXT: ld a2, 0(sp)
+; RV64I-NEXT: ld a2, 8(sp)
; RV64I-NEXT: beqz a0, .LBB209_1
; RV64I-NEXT: # %bb.4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a2
-; RV64I-NEXT: ld s4, 8(sp)
; RV64I-NEXT: ld s3, 16(sp)
; RV64I-NEXT: ld s2, 24(sp)
; RV64I-NEXT: ld s1, 32(sp)
; RV32I-NEXT: sw s2, 20(sp)
; RV32I-NEXT: sw s3, 16(sp)
; RV32I-NEXT: sw s4, 12(sp)
-; RV32I-NEXT: sw s5, 8(sp)
; RV32I-NEXT: mv s1, a2
; RV32I-NEXT: mv s2, a1
; RV32I-NEXT: mv s3, a0
; RV32I-NEXT: lw a1, 4(a0)
; RV32I-NEXT: lw a2, 0(a0)
; RV32I-NEXT: mv s4, sp
-; RV32I-NEXT: addi s5, zero, 2
; RV32I-NEXT: .LBB211_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: beq a1, s1, .LBB211_3
; RV32I-NEXT: sw a1, 4(sp)
; RV32I-NEXT: mv a0, s3
; RV32I-NEXT: mv a1, s4
-; RV32I-NEXT: mv a4, s5
-; RV32I-NEXT: mv a5, s5
+; RV32I-NEXT: addi a4, zero, 2
+; RV32I-NEXT: addi a5, zero, 2
; RV32I-NEXT: call __atomic_compare_exchange_8
; RV32I-NEXT: lw a1, 4(sp)
; RV32I-NEXT: lw a2, 0(sp)
; RV32I-NEXT: beqz a0, .LBB211_1
; RV32I-NEXT: # %bb.8: # %atomicrmw.end
; RV32I-NEXT: mv a0, a2
-; RV32I-NEXT: lw s5, 8(sp)
; RV32I-NEXT: lw s4, 12(sp)
; RV32I-NEXT: lw s3, 16(sp)
; RV32I-NEXT: lw s2, 20(sp)
; RV32IA-NEXT: sw s2, 20(sp)
; RV32IA-NEXT: sw s3, 16(sp)
; RV32IA-NEXT: sw s4, 12(sp)
-; RV32IA-NEXT: sw s5, 8(sp)
; RV32IA-NEXT: mv s1, a2
; RV32IA-NEXT: mv s2, a1
; RV32IA-NEXT: mv s3, a0
; RV32IA-NEXT: lw a1, 4(a0)
; RV32IA-NEXT: lw a2, 0(a0)
; RV32IA-NEXT: mv s4, sp
-; RV32IA-NEXT: addi s5, zero, 2
; RV32IA-NEXT: .LBB211_1: # %atomicrmw.start
; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: beq a1, s1, .LBB211_3
; RV32IA-NEXT: sw a1, 4(sp)
; RV32IA-NEXT: mv a0, s3
; RV32IA-NEXT: mv a1, s4
-; RV32IA-NEXT: mv a4, s5
-; RV32IA-NEXT: mv a5, s5
+; RV32IA-NEXT: addi a4, zero, 2
+; RV32IA-NEXT: addi a5, zero, 2
; RV32IA-NEXT: call __atomic_compare_exchange_8
; RV32IA-NEXT: lw a1, 4(sp)
; RV32IA-NEXT: lw a2, 0(sp)
; RV32IA-NEXT: beqz a0, .LBB211_1
; RV32IA-NEXT: # %bb.8: # %atomicrmw.end
; RV32IA-NEXT: mv a0, a2
-; RV32IA-NEXT: lw s5, 8(sp)
; RV32IA-NEXT: lw s4, 12(sp)
; RV32IA-NEXT: lw s3, 16(sp)
; RV32IA-NEXT: lw s2, 20(sp)
; RV64I-NEXT: sd s1, 32(sp)
; RV64I-NEXT: sd s2, 24(sp)
; RV64I-NEXT: sd s3, 16(sp)
-; RV64I-NEXT: sd s4, 8(sp)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: mv s2, a0
; RV64I-NEXT: ld a2, 0(a0)
-; RV64I-NEXT: mv s3, sp
-; RV64I-NEXT: addi s4, zero, 2
+; RV64I-NEXT: addi s3, sp, 8
; RV64I-NEXT: .LBB211_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
-; RV64I-NEXT: sd a2, 0(sp)
+; RV64I-NEXT: sd a2, 8(sp)
; RV64I-NEXT: bltu s1, a2, .LBB211_3
; RV64I-NEXT: # %bb.2: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB211_1 Depth=1
; RV64I-NEXT: # in Loop: Header=BB211_1 Depth=1
; RV64I-NEXT: mv a0, s2
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s4
-; RV64I-NEXT: mv a4, s4
+; RV64I-NEXT: addi a3, zero, 2
+; RV64I-NEXT: addi a4, zero, 2
; RV64I-NEXT: call __atomic_compare_exchange_8
-; RV64I-NEXT: ld a2, 0(sp)
+; RV64I-NEXT: ld a2, 8(sp)
; RV64I-NEXT: beqz a0, .LBB211_1
; RV64I-NEXT: # %bb.4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a2
-; RV64I-NEXT: ld s4, 8(sp)
; RV64I-NEXT: ld s3, 16(sp)
; RV64I-NEXT: ld s2, 24(sp)
; RV64I-NEXT: ld s1, 32(sp)
; RV32I-NEXT: sw s2, 20(sp)
; RV32I-NEXT: sw s3, 16(sp)
; RV32I-NEXT: sw s4, 12(sp)
-; RV32I-NEXT: sw s5, 8(sp)
; RV32I-NEXT: mv s1, a2
; RV32I-NEXT: mv s2, a1
; RV32I-NEXT: mv s3, a0
; RV32I-NEXT: lw a1, 4(a0)
; RV32I-NEXT: lw a2, 0(a0)
; RV32I-NEXT: mv s4, sp
-; RV32I-NEXT: addi s5, zero, 3
; RV32I-NEXT: .LBB212_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: beq a1, s1, .LBB212_3
; RV32I-NEXT: sw a1, 4(sp)
; RV32I-NEXT: mv a0, s3
; RV32I-NEXT: mv a1, s4
-; RV32I-NEXT: mv a4, s5
+; RV32I-NEXT: addi a4, zero, 3
; RV32I-NEXT: mv a5, zero
; RV32I-NEXT: call __atomic_compare_exchange_8
; RV32I-NEXT: lw a1, 4(sp)
; RV32I-NEXT: beqz a0, .LBB212_1
; RV32I-NEXT: # %bb.8: # %atomicrmw.end
; RV32I-NEXT: mv a0, a2
-; RV32I-NEXT: lw s5, 8(sp)
; RV32I-NEXT: lw s4, 12(sp)
; RV32I-NEXT: lw s3, 16(sp)
; RV32I-NEXT: lw s2, 20(sp)
; RV32IA-NEXT: sw s2, 20(sp)
; RV32IA-NEXT: sw s3, 16(sp)
; RV32IA-NEXT: sw s4, 12(sp)
-; RV32IA-NEXT: sw s5, 8(sp)
; RV32IA-NEXT: mv s1, a2
; RV32IA-NEXT: mv s2, a1
; RV32IA-NEXT: mv s3, a0
; RV32IA-NEXT: lw a1, 4(a0)
; RV32IA-NEXT: lw a2, 0(a0)
; RV32IA-NEXT: mv s4, sp
-; RV32IA-NEXT: addi s5, zero, 3
; RV32IA-NEXT: .LBB212_1: # %atomicrmw.start
; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: beq a1, s1, .LBB212_3
; RV32IA-NEXT: sw a1, 4(sp)
; RV32IA-NEXT: mv a0, s3
; RV32IA-NEXT: mv a1, s4
-; RV32IA-NEXT: mv a4, s5
+; RV32IA-NEXT: addi a4, zero, 3
; RV32IA-NEXT: mv a5, zero
; RV32IA-NEXT: call __atomic_compare_exchange_8
; RV32IA-NEXT: lw a1, 4(sp)
; RV32IA-NEXT: beqz a0, .LBB212_1
; RV32IA-NEXT: # %bb.8: # %atomicrmw.end
; RV32IA-NEXT: mv a0, a2
-; RV32IA-NEXT: lw s5, 8(sp)
; RV32IA-NEXT: lw s4, 12(sp)
; RV32IA-NEXT: lw s3, 16(sp)
; RV32IA-NEXT: lw s2, 20(sp)
; RV64I-NEXT: sd s1, 32(sp)
; RV64I-NEXT: sd s2, 24(sp)
; RV64I-NEXT: sd s3, 16(sp)
-; RV64I-NEXT: sd s4, 8(sp)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: mv s2, a0
; RV64I-NEXT: ld a2, 0(a0)
-; RV64I-NEXT: mv s3, sp
-; RV64I-NEXT: addi s4, zero, 3
+; RV64I-NEXT: addi s3, sp, 8
; RV64I-NEXT: .LBB212_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
-; RV64I-NEXT: sd a2, 0(sp)
+; RV64I-NEXT: sd a2, 8(sp)
; RV64I-NEXT: bltu s1, a2, .LBB212_3
; RV64I-NEXT: # %bb.2: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB212_1 Depth=1
; RV64I-NEXT: # in Loop: Header=BB212_1 Depth=1
; RV64I-NEXT: mv a0, s2
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s4
+; RV64I-NEXT: addi a3, zero, 3
; RV64I-NEXT: mv a4, zero
; RV64I-NEXT: call __atomic_compare_exchange_8
-; RV64I-NEXT: ld a2, 0(sp)
+; RV64I-NEXT: ld a2, 8(sp)
; RV64I-NEXT: beqz a0, .LBB212_1
; RV64I-NEXT: # %bb.4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a2
-; RV64I-NEXT: ld s4, 8(sp)
; RV64I-NEXT: ld s3, 16(sp)
; RV64I-NEXT: ld s2, 24(sp)
; RV64I-NEXT: ld s1, 32(sp)
define i64 @atomicrmw_umax_i64_acq_rel(i64 *%a, i64 %b) nounwind {
; RV32I-LABEL: atomicrmw_umax_i64_acq_rel:
; RV32I: # %bb.0:
-; RV32I-NEXT: addi sp, sp, -48
-; RV32I-NEXT: sw ra, 44(sp)
-; RV32I-NEXT: sw s1, 40(sp)
-; RV32I-NEXT: sw s2, 36(sp)
-; RV32I-NEXT: sw s3, 32(sp)
-; RV32I-NEXT: sw s4, 28(sp)
-; RV32I-NEXT: sw s5, 24(sp)
-; RV32I-NEXT: sw s6, 20(sp)
+; RV32I-NEXT: addi sp, sp, -32
+; RV32I-NEXT: sw ra, 28(sp)
+; RV32I-NEXT: sw s1, 24(sp)
+; RV32I-NEXT: sw s2, 20(sp)
+; RV32I-NEXT: sw s3, 16(sp)
+; RV32I-NEXT: sw s4, 12(sp)
; RV32I-NEXT: mv s1, a2
; RV32I-NEXT: mv s2, a1
; RV32I-NEXT: mv s3, a0
; RV32I-NEXT: lw a1, 4(a0)
; RV32I-NEXT: lw a2, 0(a0)
-; RV32I-NEXT: addi s4, sp, 8
-; RV32I-NEXT: addi s5, zero, 4
-; RV32I-NEXT: addi s6, zero, 2
+; RV32I-NEXT: mv s4, sp
; RV32I-NEXT: .LBB213_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: beq a1, s1, .LBB213_3
; RV32I-NEXT: # %bb.2: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB213_1 Depth=1
; RV32I-NEXT: sltu a0, s1, a1
-; RV32I-NEXT: sw a2, 8(sp)
+; RV32I-NEXT: sw a2, 0(sp)
; RV32I-NEXT: beqz a0, .LBB213_4
; RV32I-NEXT: j .LBB213_5
; RV32I-NEXT: .LBB213_3: # in Loop: Header=BB213_1 Depth=1
; RV32I-NEXT: sltu a0, s2, a2
-; RV32I-NEXT: sw a2, 8(sp)
+; RV32I-NEXT: sw a2, 0(sp)
; RV32I-NEXT: bnez a0, .LBB213_5
; RV32I-NEXT: .LBB213_4: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB213_1 Depth=1
; RV32I-NEXT: mv a3, s1
; RV32I-NEXT: .LBB213_7: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB213_1 Depth=1
-; RV32I-NEXT: sw a1, 12(sp)
+; RV32I-NEXT: sw a1, 4(sp)
; RV32I-NEXT: mv a0, s3
; RV32I-NEXT: mv a1, s4
-; RV32I-NEXT: mv a4, s5
-; RV32I-NEXT: mv a5, s6
+; RV32I-NEXT: addi a4, zero, 4
+; RV32I-NEXT: addi a5, zero, 2
; RV32I-NEXT: call __atomic_compare_exchange_8
-; RV32I-NEXT: lw a1, 12(sp)
-; RV32I-NEXT: lw a2, 8(sp)
+; RV32I-NEXT: lw a1, 4(sp)
+; RV32I-NEXT: lw a2, 0(sp)
; RV32I-NEXT: beqz a0, .LBB213_1
; RV32I-NEXT: # %bb.8: # %atomicrmw.end
; RV32I-NEXT: mv a0, a2
-; RV32I-NEXT: lw s6, 20(sp)
-; RV32I-NEXT: lw s5, 24(sp)
-; RV32I-NEXT: lw s4, 28(sp)
-; RV32I-NEXT: lw s3, 32(sp)
-; RV32I-NEXT: lw s2, 36(sp)
-; RV32I-NEXT: lw s1, 40(sp)
-; RV32I-NEXT: lw ra, 44(sp)
-; RV32I-NEXT: addi sp, sp, 48
+; RV32I-NEXT: lw s4, 12(sp)
+; RV32I-NEXT: lw s3, 16(sp)
+; RV32I-NEXT: lw s2, 20(sp)
+; RV32I-NEXT: lw s1, 24(sp)
+; RV32I-NEXT: lw ra, 28(sp)
+; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_umax_i64_acq_rel:
; RV32IA: # %bb.0:
-; RV32IA-NEXT: addi sp, sp, -48
-; RV32IA-NEXT: sw ra, 44(sp)
-; RV32IA-NEXT: sw s1, 40(sp)
-; RV32IA-NEXT: sw s2, 36(sp)
-; RV32IA-NEXT: sw s3, 32(sp)
-; RV32IA-NEXT: sw s4, 28(sp)
-; RV32IA-NEXT: sw s5, 24(sp)
-; RV32IA-NEXT: sw s6, 20(sp)
+; RV32IA-NEXT: addi sp, sp, -32
+; RV32IA-NEXT: sw ra, 28(sp)
+; RV32IA-NEXT: sw s1, 24(sp)
+; RV32IA-NEXT: sw s2, 20(sp)
+; RV32IA-NEXT: sw s3, 16(sp)
+; RV32IA-NEXT: sw s4, 12(sp)
; RV32IA-NEXT: mv s1, a2
; RV32IA-NEXT: mv s2, a1
; RV32IA-NEXT: mv s3, a0
; RV32IA-NEXT: lw a1, 4(a0)
; RV32IA-NEXT: lw a2, 0(a0)
-; RV32IA-NEXT: addi s4, sp, 8
-; RV32IA-NEXT: addi s5, zero, 4
-; RV32IA-NEXT: addi s6, zero, 2
+; RV32IA-NEXT: mv s4, sp
; RV32IA-NEXT: .LBB213_1: # %atomicrmw.start
; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: beq a1, s1, .LBB213_3
; RV32IA-NEXT: # %bb.2: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB213_1 Depth=1
; RV32IA-NEXT: sltu a0, s1, a1
-; RV32IA-NEXT: sw a2, 8(sp)
+; RV32IA-NEXT: sw a2, 0(sp)
; RV32IA-NEXT: beqz a0, .LBB213_4
; RV32IA-NEXT: j .LBB213_5
; RV32IA-NEXT: .LBB213_3: # in Loop: Header=BB213_1 Depth=1
; RV32IA-NEXT: sltu a0, s2, a2
-; RV32IA-NEXT: sw a2, 8(sp)
+; RV32IA-NEXT: sw a2, 0(sp)
; RV32IA-NEXT: bnez a0, .LBB213_5
; RV32IA-NEXT: .LBB213_4: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB213_1 Depth=1
; RV32IA-NEXT: mv a3, s1
; RV32IA-NEXT: .LBB213_7: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB213_1 Depth=1
-; RV32IA-NEXT: sw a1, 12(sp)
+; RV32IA-NEXT: sw a1, 4(sp)
; RV32IA-NEXT: mv a0, s3
; RV32IA-NEXT: mv a1, s4
-; RV32IA-NEXT: mv a4, s5
-; RV32IA-NEXT: mv a5, s6
+; RV32IA-NEXT: addi a4, zero, 4
+; RV32IA-NEXT: addi a5, zero, 2
; RV32IA-NEXT: call __atomic_compare_exchange_8
-; RV32IA-NEXT: lw a1, 12(sp)
-; RV32IA-NEXT: lw a2, 8(sp)
+; RV32IA-NEXT: lw a1, 4(sp)
+; RV32IA-NEXT: lw a2, 0(sp)
; RV32IA-NEXT: beqz a0, .LBB213_1
; RV32IA-NEXT: # %bb.8: # %atomicrmw.end
; RV32IA-NEXT: mv a0, a2
-; RV32IA-NEXT: lw s6, 20(sp)
-; RV32IA-NEXT: lw s5, 24(sp)
-; RV32IA-NEXT: lw s4, 28(sp)
-; RV32IA-NEXT: lw s3, 32(sp)
-; RV32IA-NEXT: lw s2, 36(sp)
-; RV32IA-NEXT: lw s1, 40(sp)
-; RV32IA-NEXT: lw ra, 44(sp)
-; RV32IA-NEXT: addi sp, sp, 48
+; RV32IA-NEXT: lw s4, 12(sp)
+; RV32IA-NEXT: lw s3, 16(sp)
+; RV32IA-NEXT: lw s2, 20(sp)
+; RV32IA-NEXT: lw s1, 24(sp)
+; RV32IA-NEXT: lw ra, 28(sp)
+; RV32IA-NEXT: addi sp, sp, 32
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_umax_i64_acq_rel:
; RV64I: # %bb.0:
-; RV64I-NEXT: addi sp, sp, -64
-; RV64I-NEXT: sd ra, 56(sp)
-; RV64I-NEXT: sd s1, 48(sp)
-; RV64I-NEXT: sd s2, 40(sp)
-; RV64I-NEXT: sd s3, 32(sp)
-; RV64I-NEXT: sd s4, 24(sp)
-; RV64I-NEXT: sd s5, 16(sp)
+; RV64I-NEXT: addi sp, sp, -48
+; RV64I-NEXT: sd ra, 40(sp)
+; RV64I-NEXT: sd s1, 32(sp)
+; RV64I-NEXT: sd s2, 24(sp)
+; RV64I-NEXT: sd s3, 16(sp)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: mv s2, a0
; RV64I-NEXT: ld a2, 0(a0)
; RV64I-NEXT: addi s3, sp, 8
-; RV64I-NEXT: addi s4, zero, 4
-; RV64I-NEXT: addi s5, zero, 2
; RV64I-NEXT: .LBB213_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: sd a2, 8(sp)
; RV64I-NEXT: # in Loop: Header=BB213_1 Depth=1
; RV64I-NEXT: mv a0, s2
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s4
-; RV64I-NEXT: mv a4, s5
+; RV64I-NEXT: addi a3, zero, 4
+; RV64I-NEXT: addi a4, zero, 2
; RV64I-NEXT: call __atomic_compare_exchange_8
; RV64I-NEXT: ld a2, 8(sp)
; RV64I-NEXT: beqz a0, .LBB213_1
; RV64I-NEXT: # %bb.4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a2
-; RV64I-NEXT: ld s5, 16(sp)
-; RV64I-NEXT: ld s4, 24(sp)
-; RV64I-NEXT: ld s3, 32(sp)
-; RV64I-NEXT: ld s2, 40(sp)
-; RV64I-NEXT: ld s1, 48(sp)
-; RV64I-NEXT: ld ra, 56(sp)
-; RV64I-NEXT: addi sp, sp, 64
+; RV64I-NEXT: ld s3, 16(sp)
+; RV64I-NEXT: ld s2, 24(sp)
+; RV64I-NEXT: ld s1, 32(sp)
+; RV64I-NEXT: ld ra, 40(sp)
+; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_umax_i64_acq_rel:
; RV32I-NEXT: sw s2, 20(sp)
; RV32I-NEXT: sw s3, 16(sp)
; RV32I-NEXT: sw s4, 12(sp)
-; RV32I-NEXT: sw s5, 8(sp)
; RV32I-NEXT: mv s1, a2
; RV32I-NEXT: mv s2, a1
; RV32I-NEXT: mv s3, a0
; RV32I-NEXT: lw a1, 4(a0)
; RV32I-NEXT: lw a2, 0(a0)
; RV32I-NEXT: mv s4, sp
-; RV32I-NEXT: addi s5, zero, 5
; RV32I-NEXT: .LBB214_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: beq a1, s1, .LBB214_3
; RV32I-NEXT: sw a1, 4(sp)
; RV32I-NEXT: mv a0, s3
; RV32I-NEXT: mv a1, s4
-; RV32I-NEXT: mv a4, s5
-; RV32I-NEXT: mv a5, s5
+; RV32I-NEXT: addi a4, zero, 5
+; RV32I-NEXT: addi a5, zero, 5
; RV32I-NEXT: call __atomic_compare_exchange_8
; RV32I-NEXT: lw a1, 4(sp)
; RV32I-NEXT: lw a2, 0(sp)
; RV32I-NEXT: beqz a0, .LBB214_1
; RV32I-NEXT: # %bb.8: # %atomicrmw.end
; RV32I-NEXT: mv a0, a2
-; RV32I-NEXT: lw s5, 8(sp)
; RV32I-NEXT: lw s4, 12(sp)
; RV32I-NEXT: lw s3, 16(sp)
; RV32I-NEXT: lw s2, 20(sp)
; RV32IA-NEXT: sw s2, 20(sp)
; RV32IA-NEXT: sw s3, 16(sp)
; RV32IA-NEXT: sw s4, 12(sp)
-; RV32IA-NEXT: sw s5, 8(sp)
; RV32IA-NEXT: mv s1, a2
; RV32IA-NEXT: mv s2, a1
; RV32IA-NEXT: mv s3, a0
; RV32IA-NEXT: lw a1, 4(a0)
; RV32IA-NEXT: lw a2, 0(a0)
; RV32IA-NEXT: mv s4, sp
-; RV32IA-NEXT: addi s5, zero, 5
; RV32IA-NEXT: .LBB214_1: # %atomicrmw.start
; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: beq a1, s1, .LBB214_3
; RV32IA-NEXT: sw a1, 4(sp)
; RV32IA-NEXT: mv a0, s3
; RV32IA-NEXT: mv a1, s4
-; RV32IA-NEXT: mv a4, s5
-; RV32IA-NEXT: mv a5, s5
+; RV32IA-NEXT: addi a4, zero, 5
+; RV32IA-NEXT: addi a5, zero, 5
; RV32IA-NEXT: call __atomic_compare_exchange_8
; RV32IA-NEXT: lw a1, 4(sp)
; RV32IA-NEXT: lw a2, 0(sp)
; RV32IA-NEXT: beqz a0, .LBB214_1
; RV32IA-NEXT: # %bb.8: # %atomicrmw.end
; RV32IA-NEXT: mv a0, a2
-; RV32IA-NEXT: lw s5, 8(sp)
; RV32IA-NEXT: lw s4, 12(sp)
; RV32IA-NEXT: lw s3, 16(sp)
; RV32IA-NEXT: lw s2, 20(sp)
; RV64I-NEXT: sd s1, 32(sp)
; RV64I-NEXT: sd s2, 24(sp)
; RV64I-NEXT: sd s3, 16(sp)
-; RV64I-NEXT: sd s4, 8(sp)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: mv s2, a0
; RV64I-NEXT: ld a2, 0(a0)
-; RV64I-NEXT: mv s3, sp
-; RV64I-NEXT: addi s4, zero, 5
+; RV64I-NEXT: addi s3, sp, 8
; RV64I-NEXT: .LBB214_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
-; RV64I-NEXT: sd a2, 0(sp)
+; RV64I-NEXT: sd a2, 8(sp)
; RV64I-NEXT: bltu s1, a2, .LBB214_3
; RV64I-NEXT: # %bb.2: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB214_1 Depth=1
; RV64I-NEXT: # in Loop: Header=BB214_1 Depth=1
; RV64I-NEXT: mv a0, s2
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s4
-; RV64I-NEXT: mv a4, s4
+; RV64I-NEXT: addi a3, zero, 5
+; RV64I-NEXT: addi a4, zero, 5
; RV64I-NEXT: call __atomic_compare_exchange_8
-; RV64I-NEXT: ld a2, 0(sp)
+; RV64I-NEXT: ld a2, 8(sp)
; RV64I-NEXT: beqz a0, .LBB214_1
; RV64I-NEXT: # %bb.4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a2
-; RV64I-NEXT: ld s4, 8(sp)
; RV64I-NEXT: ld s3, 16(sp)
; RV64I-NEXT: ld s2, 24(sp)
; RV64I-NEXT: ld s1, 32(sp)
; RV32I-NEXT: sw s2, 20(sp)
; RV32I-NEXT: sw s3, 16(sp)
; RV32I-NEXT: sw s4, 12(sp)
-; RV32I-NEXT: sw s5, 8(sp)
; RV32I-NEXT: mv s1, a2
; RV32I-NEXT: mv s2, a1
; RV32I-NEXT: mv s3, a0
; RV32I-NEXT: lw a1, 4(a0)
; RV32I-NEXT: lw a2, 0(a0)
; RV32I-NEXT: mv s4, sp
-; RV32I-NEXT: addi s5, zero, 2
; RV32I-NEXT: .LBB216_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: beq a1, s1, .LBB216_3
; RV32I-NEXT: sw a1, 4(sp)
; RV32I-NEXT: mv a0, s3
; RV32I-NEXT: mv a1, s4
-; RV32I-NEXT: mv a4, s5
-; RV32I-NEXT: mv a5, s5
+; RV32I-NEXT: addi a4, zero, 2
+; RV32I-NEXT: addi a5, zero, 2
; RV32I-NEXT: call __atomic_compare_exchange_8
; RV32I-NEXT: lw a1, 4(sp)
; RV32I-NEXT: lw a2, 0(sp)
; RV32I-NEXT: beqz a0, .LBB216_1
; RV32I-NEXT: # %bb.9: # %atomicrmw.end
; RV32I-NEXT: mv a0, a2
-; RV32I-NEXT: lw s5, 8(sp)
; RV32I-NEXT: lw s4, 12(sp)
; RV32I-NEXT: lw s3, 16(sp)
; RV32I-NEXT: lw s2, 20(sp)
; RV32IA-NEXT: sw s2, 20(sp)
; RV32IA-NEXT: sw s3, 16(sp)
; RV32IA-NEXT: sw s4, 12(sp)
-; RV32IA-NEXT: sw s5, 8(sp)
; RV32IA-NEXT: mv s1, a2
; RV32IA-NEXT: mv s2, a1
; RV32IA-NEXT: mv s3, a0
; RV32IA-NEXT: lw a1, 4(a0)
; RV32IA-NEXT: lw a2, 0(a0)
; RV32IA-NEXT: mv s4, sp
-; RV32IA-NEXT: addi s5, zero, 2
; RV32IA-NEXT: .LBB216_1: # %atomicrmw.start
; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: beq a1, s1, .LBB216_3
; RV32IA-NEXT: sw a1, 4(sp)
; RV32IA-NEXT: mv a0, s3
; RV32IA-NEXT: mv a1, s4
-; RV32IA-NEXT: mv a4, s5
-; RV32IA-NEXT: mv a5, s5
+; RV32IA-NEXT: addi a4, zero, 2
+; RV32IA-NEXT: addi a5, zero, 2
; RV32IA-NEXT: call __atomic_compare_exchange_8
; RV32IA-NEXT: lw a1, 4(sp)
; RV32IA-NEXT: lw a2, 0(sp)
; RV32IA-NEXT: beqz a0, .LBB216_1
; RV32IA-NEXT: # %bb.9: # %atomicrmw.end
; RV32IA-NEXT: mv a0, a2
-; RV32IA-NEXT: lw s5, 8(sp)
; RV32IA-NEXT: lw s4, 12(sp)
; RV32IA-NEXT: lw s3, 16(sp)
; RV32IA-NEXT: lw s2, 20(sp)
; RV64I-NEXT: sd s1, 32(sp)
; RV64I-NEXT: sd s2, 24(sp)
; RV64I-NEXT: sd s3, 16(sp)
-; RV64I-NEXT: sd s4, 8(sp)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: mv s2, a0
; RV64I-NEXT: ld a2, 0(a0)
-; RV64I-NEXT: mv s3, sp
-; RV64I-NEXT: addi s4, zero, 2
+; RV64I-NEXT: addi s3, sp, 8
; RV64I-NEXT: .LBB216_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
-; RV64I-NEXT: sd a2, 0(sp)
+; RV64I-NEXT: sd a2, 8(sp)
; RV64I-NEXT: bgeu s1, a2, .LBB216_3
; RV64I-NEXT: # %bb.2: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB216_1 Depth=1
; RV64I-NEXT: # in Loop: Header=BB216_1 Depth=1
; RV64I-NEXT: mv a0, s2
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s4
-; RV64I-NEXT: mv a4, s4
+; RV64I-NEXT: addi a3, zero, 2
+; RV64I-NEXT: addi a4, zero, 2
; RV64I-NEXT: call __atomic_compare_exchange_8
-; RV64I-NEXT: ld a2, 0(sp)
+; RV64I-NEXT: ld a2, 8(sp)
; RV64I-NEXT: beqz a0, .LBB216_1
; RV64I-NEXT: # %bb.4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a2
-; RV64I-NEXT: ld s4, 8(sp)
; RV64I-NEXT: ld s3, 16(sp)
; RV64I-NEXT: ld s2, 24(sp)
; RV64I-NEXT: ld s1, 32(sp)
; RV32I-NEXT: sw s2, 20(sp)
; RV32I-NEXT: sw s3, 16(sp)
; RV32I-NEXT: sw s4, 12(sp)
-; RV32I-NEXT: sw s5, 8(sp)
; RV32I-NEXT: mv s1, a2
; RV32I-NEXT: mv s2, a1
; RV32I-NEXT: mv s3, a0
; RV32I-NEXT: lw a1, 4(a0)
; RV32I-NEXT: lw a2, 0(a0)
; RV32I-NEXT: mv s4, sp
-; RV32I-NEXT: addi s5, zero, 3
; RV32I-NEXT: .LBB217_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: beq a1, s1, .LBB217_3
; RV32I-NEXT: sw a1, 4(sp)
; RV32I-NEXT: mv a0, s3
; RV32I-NEXT: mv a1, s4
-; RV32I-NEXT: mv a4, s5
+; RV32I-NEXT: addi a4, zero, 3
; RV32I-NEXT: mv a5, zero
; RV32I-NEXT: call __atomic_compare_exchange_8
; RV32I-NEXT: lw a1, 4(sp)
; RV32I-NEXT: beqz a0, .LBB217_1
; RV32I-NEXT: # %bb.9: # %atomicrmw.end
; RV32I-NEXT: mv a0, a2
-; RV32I-NEXT: lw s5, 8(sp)
; RV32I-NEXT: lw s4, 12(sp)
; RV32I-NEXT: lw s3, 16(sp)
; RV32I-NEXT: lw s2, 20(sp)
; RV32IA-NEXT: sw s2, 20(sp)
; RV32IA-NEXT: sw s3, 16(sp)
; RV32IA-NEXT: sw s4, 12(sp)
-; RV32IA-NEXT: sw s5, 8(sp)
; RV32IA-NEXT: mv s1, a2
; RV32IA-NEXT: mv s2, a1
; RV32IA-NEXT: mv s3, a0
; RV32IA-NEXT: lw a1, 4(a0)
; RV32IA-NEXT: lw a2, 0(a0)
; RV32IA-NEXT: mv s4, sp
-; RV32IA-NEXT: addi s5, zero, 3
; RV32IA-NEXT: .LBB217_1: # %atomicrmw.start
; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: beq a1, s1, .LBB217_3
; RV32IA-NEXT: sw a1, 4(sp)
; RV32IA-NEXT: mv a0, s3
; RV32IA-NEXT: mv a1, s4
-; RV32IA-NEXT: mv a4, s5
+; RV32IA-NEXT: addi a4, zero, 3
; RV32IA-NEXT: mv a5, zero
; RV32IA-NEXT: call __atomic_compare_exchange_8
; RV32IA-NEXT: lw a1, 4(sp)
; RV32IA-NEXT: beqz a0, .LBB217_1
; RV32IA-NEXT: # %bb.9: # %atomicrmw.end
; RV32IA-NEXT: mv a0, a2
-; RV32IA-NEXT: lw s5, 8(sp)
; RV32IA-NEXT: lw s4, 12(sp)
; RV32IA-NEXT: lw s3, 16(sp)
; RV32IA-NEXT: lw s2, 20(sp)
; RV64I-NEXT: sd s1, 32(sp)
; RV64I-NEXT: sd s2, 24(sp)
; RV64I-NEXT: sd s3, 16(sp)
-; RV64I-NEXT: sd s4, 8(sp)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: mv s2, a0
; RV64I-NEXT: ld a2, 0(a0)
-; RV64I-NEXT: mv s3, sp
-; RV64I-NEXT: addi s4, zero, 3
+; RV64I-NEXT: addi s3, sp, 8
; RV64I-NEXT: .LBB217_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
-; RV64I-NEXT: sd a2, 0(sp)
+; RV64I-NEXT: sd a2, 8(sp)
; RV64I-NEXT: bgeu s1, a2, .LBB217_3
; RV64I-NEXT: # %bb.2: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB217_1 Depth=1
; RV64I-NEXT: # in Loop: Header=BB217_1 Depth=1
; RV64I-NEXT: mv a0, s2
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s4
+; RV64I-NEXT: addi a3, zero, 3
; RV64I-NEXT: mv a4, zero
; RV64I-NEXT: call __atomic_compare_exchange_8
-; RV64I-NEXT: ld a2, 0(sp)
+; RV64I-NEXT: ld a2, 8(sp)
; RV64I-NEXT: beqz a0, .LBB217_1
; RV64I-NEXT: # %bb.4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a2
-; RV64I-NEXT: ld s4, 8(sp)
; RV64I-NEXT: ld s3, 16(sp)
; RV64I-NEXT: ld s2, 24(sp)
; RV64I-NEXT: ld s1, 32(sp)
define i64 @atomicrmw_umin_i64_acq_rel(i64 *%a, i64 %b) nounwind {
; RV32I-LABEL: atomicrmw_umin_i64_acq_rel:
; RV32I: # %bb.0:
-; RV32I-NEXT: addi sp, sp, -48
-; RV32I-NEXT: sw ra, 44(sp)
-; RV32I-NEXT: sw s1, 40(sp)
-; RV32I-NEXT: sw s2, 36(sp)
-; RV32I-NEXT: sw s3, 32(sp)
-; RV32I-NEXT: sw s4, 28(sp)
-; RV32I-NEXT: sw s5, 24(sp)
-; RV32I-NEXT: sw s6, 20(sp)
+; RV32I-NEXT: addi sp, sp, -32
+; RV32I-NEXT: sw ra, 28(sp)
+; RV32I-NEXT: sw s1, 24(sp)
+; RV32I-NEXT: sw s2, 20(sp)
+; RV32I-NEXT: sw s3, 16(sp)
+; RV32I-NEXT: sw s4, 12(sp)
; RV32I-NEXT: mv s1, a2
; RV32I-NEXT: mv s2, a1
; RV32I-NEXT: mv s3, a0
; RV32I-NEXT: lw a1, 4(a0)
; RV32I-NEXT: lw a2, 0(a0)
-; RV32I-NEXT: addi s4, sp, 8
-; RV32I-NEXT: addi s5, zero, 4
-; RV32I-NEXT: addi s6, zero, 2
+; RV32I-NEXT: mv s4, sp
; RV32I-NEXT: .LBB218_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: beq a1, s1, .LBB218_3
; RV32I-NEXT: .LBB218_4: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB218_1 Depth=1
; RV32I-NEXT: xori a0, a0, 1
-; RV32I-NEXT: sw a2, 8(sp)
+; RV32I-NEXT: sw a2, 0(sp)
; RV32I-NEXT: bnez a0, .LBB218_6
; RV32I-NEXT: # %bb.5: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB218_1 Depth=1
; RV32I-NEXT: mv a3, s1
; RV32I-NEXT: .LBB218_8: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB218_1 Depth=1
-; RV32I-NEXT: sw a1, 12(sp)
+; RV32I-NEXT: sw a1, 4(sp)
; RV32I-NEXT: mv a0, s3
; RV32I-NEXT: mv a1, s4
-; RV32I-NEXT: mv a4, s5
-; RV32I-NEXT: mv a5, s6
+; RV32I-NEXT: addi a4, zero, 4
+; RV32I-NEXT: addi a5, zero, 2
; RV32I-NEXT: call __atomic_compare_exchange_8
-; RV32I-NEXT: lw a1, 12(sp)
-; RV32I-NEXT: lw a2, 8(sp)
+; RV32I-NEXT: lw a1, 4(sp)
+; RV32I-NEXT: lw a2, 0(sp)
; RV32I-NEXT: beqz a0, .LBB218_1
; RV32I-NEXT: # %bb.9: # %atomicrmw.end
; RV32I-NEXT: mv a0, a2
-; RV32I-NEXT: lw s6, 20(sp)
-; RV32I-NEXT: lw s5, 24(sp)
-; RV32I-NEXT: lw s4, 28(sp)
-; RV32I-NEXT: lw s3, 32(sp)
-; RV32I-NEXT: lw s2, 36(sp)
-; RV32I-NEXT: lw s1, 40(sp)
-; RV32I-NEXT: lw ra, 44(sp)
-; RV32I-NEXT: addi sp, sp, 48
+; RV32I-NEXT: lw s4, 12(sp)
+; RV32I-NEXT: lw s3, 16(sp)
+; RV32I-NEXT: lw s2, 20(sp)
+; RV32I-NEXT: lw s1, 24(sp)
+; RV32I-NEXT: lw ra, 28(sp)
+; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_umin_i64_acq_rel:
; RV32IA: # %bb.0:
-; RV32IA-NEXT: addi sp, sp, -48
-; RV32IA-NEXT: sw ra, 44(sp)
-; RV32IA-NEXT: sw s1, 40(sp)
-; RV32IA-NEXT: sw s2, 36(sp)
-; RV32IA-NEXT: sw s3, 32(sp)
-; RV32IA-NEXT: sw s4, 28(sp)
-; RV32IA-NEXT: sw s5, 24(sp)
-; RV32IA-NEXT: sw s6, 20(sp)
+; RV32IA-NEXT: addi sp, sp, -32
+; RV32IA-NEXT: sw ra, 28(sp)
+; RV32IA-NEXT: sw s1, 24(sp)
+; RV32IA-NEXT: sw s2, 20(sp)
+; RV32IA-NEXT: sw s3, 16(sp)
+; RV32IA-NEXT: sw s4, 12(sp)
; RV32IA-NEXT: mv s1, a2
; RV32IA-NEXT: mv s2, a1
; RV32IA-NEXT: mv s3, a0
; RV32IA-NEXT: lw a1, 4(a0)
; RV32IA-NEXT: lw a2, 0(a0)
-; RV32IA-NEXT: addi s4, sp, 8
-; RV32IA-NEXT: addi s5, zero, 4
-; RV32IA-NEXT: addi s6, zero, 2
+; RV32IA-NEXT: mv s4, sp
; RV32IA-NEXT: .LBB218_1: # %atomicrmw.start
; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: beq a1, s1, .LBB218_3
; RV32IA-NEXT: .LBB218_4: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB218_1 Depth=1
; RV32IA-NEXT: xori a0, a0, 1
-; RV32IA-NEXT: sw a2, 8(sp)
+; RV32IA-NEXT: sw a2, 0(sp)
; RV32IA-NEXT: bnez a0, .LBB218_6
; RV32IA-NEXT: # %bb.5: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB218_1 Depth=1
; RV32IA-NEXT: mv a3, s1
; RV32IA-NEXT: .LBB218_8: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB218_1 Depth=1
-; RV32IA-NEXT: sw a1, 12(sp)
+; RV32IA-NEXT: sw a1, 4(sp)
; RV32IA-NEXT: mv a0, s3
; RV32IA-NEXT: mv a1, s4
-; RV32IA-NEXT: mv a4, s5
-; RV32IA-NEXT: mv a5, s6
+; RV32IA-NEXT: addi a4, zero, 4
+; RV32IA-NEXT: addi a5, zero, 2
; RV32IA-NEXT: call __atomic_compare_exchange_8
-; RV32IA-NEXT: lw a1, 12(sp)
-; RV32IA-NEXT: lw a2, 8(sp)
+; RV32IA-NEXT: lw a1, 4(sp)
+; RV32IA-NEXT: lw a2, 0(sp)
; RV32IA-NEXT: beqz a0, .LBB218_1
; RV32IA-NEXT: # %bb.9: # %atomicrmw.end
; RV32IA-NEXT: mv a0, a2
-; RV32IA-NEXT: lw s6, 20(sp)
-; RV32IA-NEXT: lw s5, 24(sp)
-; RV32IA-NEXT: lw s4, 28(sp)
-; RV32IA-NEXT: lw s3, 32(sp)
-; RV32IA-NEXT: lw s2, 36(sp)
-; RV32IA-NEXT: lw s1, 40(sp)
-; RV32IA-NEXT: lw ra, 44(sp)
-; RV32IA-NEXT: addi sp, sp, 48
+; RV32IA-NEXT: lw s4, 12(sp)
+; RV32IA-NEXT: lw s3, 16(sp)
+; RV32IA-NEXT: lw s2, 20(sp)
+; RV32IA-NEXT: lw s1, 24(sp)
+; RV32IA-NEXT: lw ra, 28(sp)
+; RV32IA-NEXT: addi sp, sp, 32
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_umin_i64_acq_rel:
; RV64I: # %bb.0:
-; RV64I-NEXT: addi sp, sp, -64
-; RV64I-NEXT: sd ra, 56(sp)
-; RV64I-NEXT: sd s1, 48(sp)
-; RV64I-NEXT: sd s2, 40(sp)
-; RV64I-NEXT: sd s3, 32(sp)
-; RV64I-NEXT: sd s4, 24(sp)
-; RV64I-NEXT: sd s5, 16(sp)
+; RV64I-NEXT: addi sp, sp, -48
+; RV64I-NEXT: sd ra, 40(sp)
+; RV64I-NEXT: sd s1, 32(sp)
+; RV64I-NEXT: sd s2, 24(sp)
+; RV64I-NEXT: sd s3, 16(sp)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: mv s2, a0
; RV64I-NEXT: ld a2, 0(a0)
; RV64I-NEXT: addi s3, sp, 8
-; RV64I-NEXT: addi s4, zero, 4
-; RV64I-NEXT: addi s5, zero, 2
; RV64I-NEXT: .LBB218_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: sd a2, 8(sp)
; RV64I-NEXT: # in Loop: Header=BB218_1 Depth=1
; RV64I-NEXT: mv a0, s2
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s4
-; RV64I-NEXT: mv a4, s5
+; RV64I-NEXT: addi a3, zero, 4
+; RV64I-NEXT: addi a4, zero, 2
; RV64I-NEXT: call __atomic_compare_exchange_8
; RV64I-NEXT: ld a2, 8(sp)
; RV64I-NEXT: beqz a0, .LBB218_1
; RV64I-NEXT: # %bb.4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a2
-; RV64I-NEXT: ld s5, 16(sp)
-; RV64I-NEXT: ld s4, 24(sp)
-; RV64I-NEXT: ld s3, 32(sp)
-; RV64I-NEXT: ld s2, 40(sp)
-; RV64I-NEXT: ld s1, 48(sp)
-; RV64I-NEXT: ld ra, 56(sp)
-; RV64I-NEXT: addi sp, sp, 64
+; RV64I-NEXT: ld s3, 16(sp)
+; RV64I-NEXT: ld s2, 24(sp)
+; RV64I-NEXT: ld s1, 32(sp)
+; RV64I-NEXT: ld ra, 40(sp)
+; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_umin_i64_acq_rel:
; RV32I-NEXT: sw s2, 20(sp)
; RV32I-NEXT: sw s3, 16(sp)
; RV32I-NEXT: sw s4, 12(sp)
-; RV32I-NEXT: sw s5, 8(sp)
; RV32I-NEXT: mv s1, a2
; RV32I-NEXT: mv s2, a1
; RV32I-NEXT: mv s3, a0
; RV32I-NEXT: lw a1, 4(a0)
; RV32I-NEXT: lw a2, 0(a0)
; RV32I-NEXT: mv s4, sp
-; RV32I-NEXT: addi s5, zero, 5
; RV32I-NEXT: .LBB219_1: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: beq a1, s1, .LBB219_3
; RV32I-NEXT: sw a1, 4(sp)
; RV32I-NEXT: mv a0, s3
; RV32I-NEXT: mv a1, s4
-; RV32I-NEXT: mv a4, s5
-; RV32I-NEXT: mv a5, s5
+; RV32I-NEXT: addi a4, zero, 5
+; RV32I-NEXT: addi a5, zero, 5
; RV32I-NEXT: call __atomic_compare_exchange_8
; RV32I-NEXT: lw a1, 4(sp)
; RV32I-NEXT: lw a2, 0(sp)
; RV32I-NEXT: beqz a0, .LBB219_1
; RV32I-NEXT: # %bb.9: # %atomicrmw.end
; RV32I-NEXT: mv a0, a2
-; RV32I-NEXT: lw s5, 8(sp)
; RV32I-NEXT: lw s4, 12(sp)
; RV32I-NEXT: lw s3, 16(sp)
; RV32I-NEXT: lw s2, 20(sp)
; RV32IA-NEXT: sw s2, 20(sp)
; RV32IA-NEXT: sw s3, 16(sp)
; RV32IA-NEXT: sw s4, 12(sp)
-; RV32IA-NEXT: sw s5, 8(sp)
; RV32IA-NEXT: mv s1, a2
; RV32IA-NEXT: mv s2, a1
; RV32IA-NEXT: mv s3, a0
; RV32IA-NEXT: lw a1, 4(a0)
; RV32IA-NEXT: lw a2, 0(a0)
; RV32IA-NEXT: mv s4, sp
-; RV32IA-NEXT: addi s5, zero, 5
; RV32IA-NEXT: .LBB219_1: # %atomicrmw.start
; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: beq a1, s1, .LBB219_3
; RV32IA-NEXT: sw a1, 4(sp)
; RV32IA-NEXT: mv a0, s3
; RV32IA-NEXT: mv a1, s4
-; RV32IA-NEXT: mv a4, s5
-; RV32IA-NEXT: mv a5, s5
+; RV32IA-NEXT: addi a4, zero, 5
+; RV32IA-NEXT: addi a5, zero, 5
; RV32IA-NEXT: call __atomic_compare_exchange_8
; RV32IA-NEXT: lw a1, 4(sp)
; RV32IA-NEXT: lw a2, 0(sp)
; RV32IA-NEXT: beqz a0, .LBB219_1
; RV32IA-NEXT: # %bb.9: # %atomicrmw.end
; RV32IA-NEXT: mv a0, a2
-; RV32IA-NEXT: lw s5, 8(sp)
; RV32IA-NEXT: lw s4, 12(sp)
; RV32IA-NEXT: lw s3, 16(sp)
; RV32IA-NEXT: lw s2, 20(sp)
; RV64I-NEXT: sd s1, 32(sp)
; RV64I-NEXT: sd s2, 24(sp)
; RV64I-NEXT: sd s3, 16(sp)
-; RV64I-NEXT: sd s4, 8(sp)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: mv s2, a0
; RV64I-NEXT: ld a2, 0(a0)
-; RV64I-NEXT: mv s3, sp
-; RV64I-NEXT: addi s4, zero, 5
+; RV64I-NEXT: addi s3, sp, 8
; RV64I-NEXT: .LBB219_1: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
-; RV64I-NEXT: sd a2, 0(sp)
+; RV64I-NEXT: sd a2, 8(sp)
; RV64I-NEXT: bgeu s1, a2, .LBB219_3
; RV64I-NEXT: # %bb.2: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB219_1 Depth=1
; RV64I-NEXT: # in Loop: Header=BB219_1 Depth=1
; RV64I-NEXT: mv a0, s2
; RV64I-NEXT: mv a1, s3
-; RV64I-NEXT: mv a3, s4
-; RV64I-NEXT: mv a4, s4
+; RV64I-NEXT: addi a3, zero, 5
+; RV64I-NEXT: addi a4, zero, 5
; RV64I-NEXT: call __atomic_compare_exchange_8
-; RV64I-NEXT: ld a2, 0(sp)
+; RV64I-NEXT: ld a2, 8(sp)
; RV64I-NEXT: beqz a0, .LBB219_1
; RV64I-NEXT: # %bb.4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a2
-; RV64I-NEXT: ld s4, 8(sp)
; RV64I-NEXT: ld s3, 16(sp)
; RV64I-NEXT: ld s2, 24(sp)
; RV64I-NEXT: ld s1, 32(sp)