10416 lines
		
	
	
		
			332 KiB
		
	
	
	
		
			LLVM
		
	
	
	
			
		
		
	
	
			10416 lines
		
	
	
		
			332 KiB
		
	
	
	
		
			LLVM
		
	
	
	
| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
 | |
| ; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \
 | |
| ; RUN:   | FileCheck -check-prefix=RV32I %s
 | |
| ; RUN: llc -mtriple=riscv32 -mattr=+a -verify-machineinstrs < %s \
 | |
| ; RUN:   | FileCheck -check-prefix=RV32IA %s
 | |
| 
 | |
| define i8 @atomicrmw_xchg_i8_monotonic(i8* %a, i8 %b) {
 | |
| ; RV32I-LABEL: atomicrmw_xchg_i8_monotonic:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    mv a2, zero
 | |
| ; RV32I-NEXT:    call __atomic_exchange_1
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_xchg_i8_monotonic:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    addi a3, zero, 255
 | |
| ; RV32IA-NEXT:    sll a3, a3, a2
 | |
| ; RV32IA-NEXT:    andi a1, a1, 255
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB0_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w a4, (a0)
 | |
| ; RV32IA-NEXT:    add a5, zero, a1
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    and a5, a5, a3
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    sc.w a5, a5, (a0)
 | |
| ; RV32IA-NEXT:    bnez a5, .LBB0_1
 | |
| ; RV32IA-NEXT:  # %bb.2:
 | |
| ; RV32IA-NEXT:    srl a0, a4, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw xchg i8* %a, i8 %b monotonic
 | |
|   ret i8 %1
 | |
| }
 | |
| 
 | |
| define i8 @atomicrmw_xchg_i8_acquire(i8* %a, i8 %b) {
 | |
| ; RV32I-LABEL: atomicrmw_xchg_i8_acquire:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 2
 | |
| ; RV32I-NEXT:    call __atomic_exchange_1
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_xchg_i8_acquire:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    addi a3, zero, 255
 | |
| ; RV32IA-NEXT:    sll a3, a3, a2
 | |
| ; RV32IA-NEXT:    andi a1, a1, 255
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB1_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w.aq a4, (a0)
 | |
| ; RV32IA-NEXT:    add a5, zero, a1
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    and a5, a5, a3
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    sc.w a5, a5, (a0)
 | |
| ; RV32IA-NEXT:    bnez a5, .LBB1_1
 | |
| ; RV32IA-NEXT:  # %bb.2:
 | |
| ; RV32IA-NEXT:    srl a0, a4, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw xchg i8* %a, i8 %b acquire
 | |
|   ret i8 %1
 | |
| }
 | |
| 
 | |
| define i8 @atomicrmw_xchg_i8_release(i8* %a, i8 %b) {
 | |
| ; RV32I-LABEL: atomicrmw_xchg_i8_release:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 3
 | |
| ; RV32I-NEXT:    call __atomic_exchange_1
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_xchg_i8_release:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    addi a3, zero, 255
 | |
| ; RV32IA-NEXT:    sll a3, a3, a2
 | |
| ; RV32IA-NEXT:    andi a1, a1, 255
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB2_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w a4, (a0)
 | |
| ; RV32IA-NEXT:    add a5, zero, a1
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    and a5, a5, a3
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    sc.w.rl a5, a5, (a0)
 | |
| ; RV32IA-NEXT:    bnez a5, .LBB2_1
 | |
| ; RV32IA-NEXT:  # %bb.2:
 | |
| ; RV32IA-NEXT:    srl a0, a4, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw xchg i8* %a, i8 %b release
 | |
|   ret i8 %1
 | |
| }
 | |
| 
 | |
| define i8 @atomicrmw_xchg_i8_acq_rel(i8* %a, i8 %b) {
 | |
| ; RV32I-LABEL: atomicrmw_xchg_i8_acq_rel:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 4
 | |
| ; RV32I-NEXT:    call __atomic_exchange_1
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_xchg_i8_acq_rel:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    addi a3, zero, 255
 | |
| ; RV32IA-NEXT:    sll a3, a3, a2
 | |
| ; RV32IA-NEXT:    andi a1, a1, 255
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB3_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w.aq a4, (a0)
 | |
| ; RV32IA-NEXT:    add a5, zero, a1
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    and a5, a5, a3
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    sc.w.rl a5, a5, (a0)
 | |
| ; RV32IA-NEXT:    bnez a5, .LBB3_1
 | |
| ; RV32IA-NEXT:  # %bb.2:
 | |
| ; RV32IA-NEXT:    srl a0, a4, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw xchg i8* %a, i8 %b acq_rel
 | |
|   ret i8 %1
 | |
| }
 | |
| 
 | |
| define i8 @atomicrmw_xchg_i8_seq_cst(i8* %a, i8 %b) {
 | |
| ; RV32I-LABEL: atomicrmw_xchg_i8_seq_cst:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 5
 | |
| ; RV32I-NEXT:    call __atomic_exchange_1
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_xchg_i8_seq_cst:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    addi a3, zero, 255
 | |
| ; RV32IA-NEXT:    sll a3, a3, a2
 | |
| ; RV32IA-NEXT:    andi a1, a1, 255
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB4_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w.aqrl a4, (a0)
 | |
| ; RV32IA-NEXT:    add a5, zero, a1
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    and a5, a5, a3
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    sc.w.aqrl a5, a5, (a0)
 | |
| ; RV32IA-NEXT:    bnez a5, .LBB4_1
 | |
| ; RV32IA-NEXT:  # %bb.2:
 | |
| ; RV32IA-NEXT:    srl a0, a4, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw xchg i8* %a, i8 %b seq_cst
 | |
|   ret i8 %1
 | |
| }
 | |
| 
 | |
| define i8 @atomicrmw_add_i8_monotonic(i8 *%a, i8 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_add_i8_monotonic:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    mv a2, zero
 | |
| ; RV32I-NEXT:    call __atomic_fetch_add_1
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_add_i8_monotonic:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    addi a3, zero, 255
 | |
| ; RV32IA-NEXT:    sll a3, a3, a2
 | |
| ; RV32IA-NEXT:    andi a1, a1, 255
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB5_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w a4, (a0)
 | |
| ; RV32IA-NEXT:    add a5, a4, a1
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    and a5, a5, a3
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    sc.w a5, a5, (a0)
 | |
| ; RV32IA-NEXT:    bnez a5, .LBB5_1
 | |
| ; RV32IA-NEXT:  # %bb.2:
 | |
| ; RV32IA-NEXT:    srl a0, a4, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw add i8* %a, i8 %b monotonic
 | |
|   ret i8 %1
 | |
| }
 | |
| 
 | |
| define i8 @atomicrmw_add_i8_acquire(i8 *%a, i8 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_add_i8_acquire:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 2
 | |
| ; RV32I-NEXT:    call __atomic_fetch_add_1
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_add_i8_acquire:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    addi a3, zero, 255
 | |
| ; RV32IA-NEXT:    sll a3, a3, a2
 | |
| ; RV32IA-NEXT:    andi a1, a1, 255
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB6_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w.aq a4, (a0)
 | |
| ; RV32IA-NEXT:    add a5, a4, a1
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    and a5, a5, a3
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    sc.w a5, a5, (a0)
 | |
| ; RV32IA-NEXT:    bnez a5, .LBB6_1
 | |
| ; RV32IA-NEXT:  # %bb.2:
 | |
| ; RV32IA-NEXT:    srl a0, a4, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw add i8* %a, i8 %b acquire
 | |
|   ret i8 %1
 | |
| }
 | |
| 
 | |
| define i8 @atomicrmw_add_i8_release(i8 *%a, i8 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_add_i8_release:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 3
 | |
| ; RV32I-NEXT:    call __atomic_fetch_add_1
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_add_i8_release:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    addi a3, zero, 255
 | |
| ; RV32IA-NEXT:    sll a3, a3, a2
 | |
| ; RV32IA-NEXT:    andi a1, a1, 255
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB7_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w a4, (a0)
 | |
| ; RV32IA-NEXT:    add a5, a4, a1
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    and a5, a5, a3
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    sc.w.rl a5, a5, (a0)
 | |
| ; RV32IA-NEXT:    bnez a5, .LBB7_1
 | |
| ; RV32IA-NEXT:  # %bb.2:
 | |
| ; RV32IA-NEXT:    srl a0, a4, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw add i8* %a, i8 %b release
 | |
|   ret i8 %1
 | |
| }
 | |
| 
 | |
| define i8 @atomicrmw_add_i8_acq_rel(i8 *%a, i8 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_add_i8_acq_rel:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 4
 | |
| ; RV32I-NEXT:    call __atomic_fetch_add_1
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_add_i8_acq_rel:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    addi a3, zero, 255
 | |
| ; RV32IA-NEXT:    sll a3, a3, a2
 | |
| ; RV32IA-NEXT:    andi a1, a1, 255
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB8_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w.aq a4, (a0)
 | |
| ; RV32IA-NEXT:    add a5, a4, a1
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    and a5, a5, a3
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    sc.w.rl a5, a5, (a0)
 | |
| ; RV32IA-NEXT:    bnez a5, .LBB8_1
 | |
| ; RV32IA-NEXT:  # %bb.2:
 | |
| ; RV32IA-NEXT:    srl a0, a4, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw add i8* %a, i8 %b acq_rel
 | |
|   ret i8 %1
 | |
| }
 | |
| 
 | |
| define i8 @atomicrmw_add_i8_seq_cst(i8 *%a, i8 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_add_i8_seq_cst:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 5
 | |
| ; RV32I-NEXT:    call __atomic_fetch_add_1
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_add_i8_seq_cst:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    addi a3, zero, 255
 | |
| ; RV32IA-NEXT:    sll a3, a3, a2
 | |
| ; RV32IA-NEXT:    andi a1, a1, 255
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB9_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w.aqrl a4, (a0)
 | |
| ; RV32IA-NEXT:    add a5, a4, a1
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    and a5, a5, a3
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    sc.w.aqrl a5, a5, (a0)
 | |
| ; RV32IA-NEXT:    bnez a5, .LBB9_1
 | |
| ; RV32IA-NEXT:  # %bb.2:
 | |
| ; RV32IA-NEXT:    srl a0, a4, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw add i8* %a, i8 %b seq_cst
 | |
|   ret i8 %1
 | |
| }
 | |
| 
 | |
| define i8 @atomicrmw_sub_i8_monotonic(i8* %a, i8 %b) {
 | |
| ; RV32I-LABEL: atomicrmw_sub_i8_monotonic:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    mv a2, zero
 | |
| ; RV32I-NEXT:    call __atomic_fetch_sub_1
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_sub_i8_monotonic:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    addi a3, zero, 255
 | |
| ; RV32IA-NEXT:    sll a3, a3, a2
 | |
| ; RV32IA-NEXT:    andi a1, a1, 255
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB10_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w a4, (a0)
 | |
| ; RV32IA-NEXT:    sub a5, a4, a1
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    and a5, a5, a3
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    sc.w a5, a5, (a0)
 | |
| ; RV32IA-NEXT:    bnez a5, .LBB10_1
 | |
| ; RV32IA-NEXT:  # %bb.2:
 | |
| ; RV32IA-NEXT:    srl a0, a4, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw sub i8* %a, i8 %b monotonic
 | |
|   ret i8 %1
 | |
| }
 | |
| 
 | |
| define i8 @atomicrmw_sub_i8_acquire(i8* %a, i8 %b) {
 | |
| ; RV32I-LABEL: atomicrmw_sub_i8_acquire:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 2
 | |
| ; RV32I-NEXT:    call __atomic_fetch_sub_1
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_sub_i8_acquire:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    addi a3, zero, 255
 | |
| ; RV32IA-NEXT:    sll a3, a3, a2
 | |
| ; RV32IA-NEXT:    andi a1, a1, 255
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB11_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w.aq a4, (a0)
 | |
| ; RV32IA-NEXT:    sub a5, a4, a1
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    and a5, a5, a3
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    sc.w a5, a5, (a0)
 | |
| ; RV32IA-NEXT:    bnez a5, .LBB11_1
 | |
| ; RV32IA-NEXT:  # %bb.2:
 | |
| ; RV32IA-NEXT:    srl a0, a4, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw sub i8* %a, i8 %b acquire
 | |
|   ret i8 %1
 | |
| }
 | |
| 
 | |
| define i8 @atomicrmw_sub_i8_release(i8* %a, i8 %b) {
 | |
| ; RV32I-LABEL: atomicrmw_sub_i8_release:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 3
 | |
| ; RV32I-NEXT:    call __atomic_fetch_sub_1
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_sub_i8_release:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    addi a3, zero, 255
 | |
| ; RV32IA-NEXT:    sll a3, a3, a2
 | |
| ; RV32IA-NEXT:    andi a1, a1, 255
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB12_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w a4, (a0)
 | |
| ; RV32IA-NEXT:    sub a5, a4, a1
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    and a5, a5, a3
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    sc.w.rl a5, a5, (a0)
 | |
| ; RV32IA-NEXT:    bnez a5, .LBB12_1
 | |
| ; RV32IA-NEXT:  # %bb.2:
 | |
| ; RV32IA-NEXT:    srl a0, a4, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw sub i8* %a, i8 %b release
 | |
|   ret i8 %1
 | |
| }
 | |
| 
 | |
| define i8 @atomicrmw_sub_i8_acq_rel(i8* %a, i8 %b) {
 | |
| ; RV32I-LABEL: atomicrmw_sub_i8_acq_rel:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 4
 | |
| ; RV32I-NEXT:    call __atomic_fetch_sub_1
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_sub_i8_acq_rel:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    addi a3, zero, 255
 | |
| ; RV32IA-NEXT:    sll a3, a3, a2
 | |
| ; RV32IA-NEXT:    andi a1, a1, 255
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB13_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w.aq a4, (a0)
 | |
| ; RV32IA-NEXT:    sub a5, a4, a1
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    and a5, a5, a3
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    sc.w.rl a5, a5, (a0)
 | |
| ; RV32IA-NEXT:    bnez a5, .LBB13_1
 | |
| ; RV32IA-NEXT:  # %bb.2:
 | |
| ; RV32IA-NEXT:    srl a0, a4, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw sub i8* %a, i8 %b acq_rel
 | |
|   ret i8 %1
 | |
| }
 | |
| 
 | |
| define i8 @atomicrmw_sub_i8_seq_cst(i8* %a, i8 %b) {
 | |
| ; RV32I-LABEL: atomicrmw_sub_i8_seq_cst:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 5
 | |
| ; RV32I-NEXT:    call __atomic_fetch_sub_1
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_sub_i8_seq_cst:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    addi a3, zero, 255
 | |
| ; RV32IA-NEXT:    sll a3, a3, a2
 | |
| ; RV32IA-NEXT:    andi a1, a1, 255
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB14_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w.aqrl a4, (a0)
 | |
| ; RV32IA-NEXT:    sub a5, a4, a1
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    and a5, a5, a3
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    sc.w.aqrl a5, a5, (a0)
 | |
| ; RV32IA-NEXT:    bnez a5, .LBB14_1
 | |
| ; RV32IA-NEXT:  # %bb.2:
 | |
| ; RV32IA-NEXT:    srl a0, a4, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw sub i8* %a, i8 %b seq_cst
 | |
|   ret i8 %1
 | |
| }
 | |
| 
 | |
| define i8 @atomicrmw_and_i8_monotonic(i8 *%a, i8 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_and_i8_monotonic:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    mv a2, zero
 | |
| ; RV32I-NEXT:    call __atomic_fetch_and_1
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_and_i8_monotonic:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    andi a1, a1, 255
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    addi a3, zero, 255
 | |
| ; RV32IA-NEXT:    sll a3, a3, a2
 | |
| ; RV32IA-NEXT:    not a3, a3
 | |
| ; RV32IA-NEXT:    or a1, a3, a1
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:    amoand.w a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    srl a0, a0, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw and i8* %a, i8 %b monotonic
 | |
|   ret i8 %1
 | |
| }
 | |
| 
 | |
| define i8 @atomicrmw_and_i8_acquire(i8 *%a, i8 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_and_i8_acquire:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 2
 | |
| ; RV32I-NEXT:    call __atomic_fetch_and_1
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_and_i8_acquire:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    andi a1, a1, 255
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    addi a3, zero, 255
 | |
| ; RV32IA-NEXT:    sll a3, a3, a2
 | |
| ; RV32IA-NEXT:    not a3, a3
 | |
| ; RV32IA-NEXT:    or a1, a3, a1
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:    amoand.w.aq a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    srl a0, a0, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw and i8* %a, i8 %b acquire
 | |
|   ret i8 %1
 | |
| }
 | |
| 
 | |
| define i8 @atomicrmw_and_i8_release(i8 *%a, i8 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_and_i8_release:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 3
 | |
| ; RV32I-NEXT:    call __atomic_fetch_and_1
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_and_i8_release:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    andi a1, a1, 255
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    addi a3, zero, 255
 | |
| ; RV32IA-NEXT:    sll a3, a3, a2
 | |
| ; RV32IA-NEXT:    not a3, a3
 | |
| ; RV32IA-NEXT:    or a1, a3, a1
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:    amoand.w.rl a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    srl a0, a0, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw and i8* %a, i8 %b release
 | |
|   ret i8 %1
 | |
| }
 | |
| 
 | |
| define i8 @atomicrmw_and_i8_acq_rel(i8 *%a, i8 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_and_i8_acq_rel:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 4
 | |
| ; RV32I-NEXT:    call __atomic_fetch_and_1
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_and_i8_acq_rel:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    andi a1, a1, 255
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    addi a3, zero, 255
 | |
| ; RV32IA-NEXT:    sll a3, a3, a2
 | |
| ; RV32IA-NEXT:    not a3, a3
 | |
| ; RV32IA-NEXT:    or a1, a3, a1
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:    amoand.w.aqrl a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    srl a0, a0, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw and i8* %a, i8 %b acq_rel
 | |
|   ret i8 %1
 | |
| }
 | |
| 
 | |
| define i8 @atomicrmw_and_i8_seq_cst(i8 *%a, i8 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_and_i8_seq_cst:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 5
 | |
| ; RV32I-NEXT:    call __atomic_fetch_and_1
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_and_i8_seq_cst:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    andi a1, a1, 255
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    addi a3, zero, 255
 | |
| ; RV32IA-NEXT:    sll a3, a3, a2
 | |
| ; RV32IA-NEXT:    not a3, a3
 | |
| ; RV32IA-NEXT:    or a1, a3, a1
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:    amoand.w.aqrl a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    srl a0, a0, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw and i8* %a, i8 %b seq_cst
 | |
|   ret i8 %1
 | |
| }
 | |
| 
 | |
| define i8 @atomicrmw_nand_i8_monotonic(i8* %a, i8 %b) {
 | |
| ; RV32I-LABEL: atomicrmw_nand_i8_monotonic:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    mv a2, zero
 | |
| ; RV32I-NEXT:    call __atomic_fetch_nand_1
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_nand_i8_monotonic:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    addi a3, zero, 255
 | |
| ; RV32IA-NEXT:    sll a3, a3, a2
 | |
| ; RV32IA-NEXT:    andi a1, a1, 255
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB20_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w a4, (a0)
 | |
| ; RV32IA-NEXT:    and a5, a4, a1
 | |
| ; RV32IA-NEXT:    not a5, a5
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    and a5, a5, a3
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    sc.w a5, a5, (a0)
 | |
| ; RV32IA-NEXT:    bnez a5, .LBB20_1
 | |
| ; RV32IA-NEXT:  # %bb.2:
 | |
| ; RV32IA-NEXT:    srl a0, a4, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw nand i8* %a, i8 %b monotonic
 | |
|   ret i8 %1
 | |
| }
 | |
| 
 | |
| define i8 @atomicrmw_nand_i8_acquire(i8* %a, i8 %b) {
 | |
| ; RV32I-LABEL: atomicrmw_nand_i8_acquire:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 2
 | |
| ; RV32I-NEXT:    call __atomic_fetch_nand_1
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_nand_i8_acquire:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    addi a3, zero, 255
 | |
| ; RV32IA-NEXT:    sll a3, a3, a2
 | |
| ; RV32IA-NEXT:    andi a1, a1, 255
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB21_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w.aq a4, (a0)
 | |
| ; RV32IA-NEXT:    and a5, a4, a1
 | |
| ; RV32IA-NEXT:    not a5, a5
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    and a5, a5, a3
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    sc.w a5, a5, (a0)
 | |
| ; RV32IA-NEXT:    bnez a5, .LBB21_1
 | |
| ; RV32IA-NEXT:  # %bb.2:
 | |
| ; RV32IA-NEXT:    srl a0, a4, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw nand i8* %a, i8 %b acquire
 | |
|   ret i8 %1
 | |
| }
 | |
| 
 | |
| define i8 @atomicrmw_nand_i8_release(i8* %a, i8 %b) {
 | |
| ; RV32I-LABEL: atomicrmw_nand_i8_release:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 3
 | |
| ; RV32I-NEXT:    call __atomic_fetch_nand_1
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_nand_i8_release:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    addi a3, zero, 255
 | |
| ; RV32IA-NEXT:    sll a3, a3, a2
 | |
| ; RV32IA-NEXT:    andi a1, a1, 255
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB22_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w a4, (a0)
 | |
| ; RV32IA-NEXT:    and a5, a4, a1
 | |
| ; RV32IA-NEXT:    not a5, a5
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    and a5, a5, a3
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    sc.w.rl a5, a5, (a0)
 | |
| ; RV32IA-NEXT:    bnez a5, .LBB22_1
 | |
| ; RV32IA-NEXT:  # %bb.2:
 | |
| ; RV32IA-NEXT:    srl a0, a4, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw nand i8* %a, i8 %b release
 | |
|   ret i8 %1
 | |
| }
 | |
| 
 | |
| define i8 @atomicrmw_nand_i8_acq_rel(i8* %a, i8 %b) {
 | |
| ; RV32I-LABEL: atomicrmw_nand_i8_acq_rel:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 4
 | |
| ; RV32I-NEXT:    call __atomic_fetch_nand_1
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_nand_i8_acq_rel:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    addi a3, zero, 255
 | |
| ; RV32IA-NEXT:    sll a3, a3, a2
 | |
| ; RV32IA-NEXT:    andi a1, a1, 255
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB23_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w.aq a4, (a0)
 | |
| ; RV32IA-NEXT:    and a5, a4, a1
 | |
| ; RV32IA-NEXT:    not a5, a5
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    and a5, a5, a3
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    sc.w.rl a5, a5, (a0)
 | |
| ; RV32IA-NEXT:    bnez a5, .LBB23_1
 | |
| ; RV32IA-NEXT:  # %bb.2:
 | |
| ; RV32IA-NEXT:    srl a0, a4, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw nand i8* %a, i8 %b acq_rel
 | |
|   ret i8 %1
 | |
| }
 | |
| 
 | |
| define i8 @atomicrmw_nand_i8_seq_cst(i8* %a, i8 %b) {
 | |
| ; RV32I-LABEL: atomicrmw_nand_i8_seq_cst:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 5
 | |
| ; RV32I-NEXT:    call __atomic_fetch_nand_1
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_nand_i8_seq_cst:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    addi a3, zero, 255
 | |
| ; RV32IA-NEXT:    sll a3, a3, a2
 | |
| ; RV32IA-NEXT:    andi a1, a1, 255
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB24_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w.aqrl a4, (a0)
 | |
| ; RV32IA-NEXT:    and a5, a4, a1
 | |
| ; RV32IA-NEXT:    not a5, a5
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    and a5, a5, a3
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    sc.w.aqrl a5, a5, (a0)
 | |
| ; RV32IA-NEXT:    bnez a5, .LBB24_1
 | |
| ; RV32IA-NEXT:  # %bb.2:
 | |
| ; RV32IA-NEXT:    srl a0, a4, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw nand i8* %a, i8 %b seq_cst
 | |
|   ret i8 %1
 | |
| }
 | |
| 
 | |
| define i8 @atomicrmw_or_i8_monotonic(i8 *%a, i8 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_or_i8_monotonic:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    mv a2, zero
 | |
| ; RV32I-NEXT:    call __atomic_fetch_or_1
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_or_i8_monotonic:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    andi a1, a1, 255
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:    amoor.w a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    srl a0, a0, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw or i8* %a, i8 %b monotonic
 | |
|   ret i8 %1
 | |
| }
 | |
| 
 | |
| define i8 @atomicrmw_or_i8_acquire(i8 *%a, i8 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_or_i8_acquire:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 2
 | |
| ; RV32I-NEXT:    call __atomic_fetch_or_1
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_or_i8_acquire:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    andi a1, a1, 255
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:    amoor.w.aq a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    srl a0, a0, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw or i8* %a, i8 %b acquire
 | |
|   ret i8 %1
 | |
| }
 | |
| 
 | |
| define i8 @atomicrmw_or_i8_release(i8 *%a, i8 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_or_i8_release:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 3
 | |
| ; RV32I-NEXT:    call __atomic_fetch_or_1
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_or_i8_release:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    andi a1, a1, 255
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:    amoor.w.rl a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    srl a0, a0, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw or i8* %a, i8 %b release
 | |
|   ret i8 %1
 | |
| }
 | |
| 
 | |
| define i8 @atomicrmw_or_i8_acq_rel(i8 *%a, i8 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_or_i8_acq_rel:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 4
 | |
| ; RV32I-NEXT:    call __atomic_fetch_or_1
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_or_i8_acq_rel:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    andi a1, a1, 255
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:    amoor.w.aqrl a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    srl a0, a0, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw or i8* %a, i8 %b acq_rel
 | |
|   ret i8 %1
 | |
| }
 | |
| 
 | |
| define i8 @atomicrmw_or_i8_seq_cst(i8 *%a, i8 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_or_i8_seq_cst:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 5
 | |
| ; RV32I-NEXT:    call __atomic_fetch_or_1
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_or_i8_seq_cst:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    andi a1, a1, 255
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:    amoor.w.aqrl a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    srl a0, a0, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw or i8* %a, i8 %b seq_cst
 | |
|   ret i8 %1
 | |
| }
 | |
| 
 | |
| define i8 @atomicrmw_xor_i8_monotonic(i8 *%a, i8 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_xor_i8_monotonic:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    mv a2, zero
 | |
| ; RV32I-NEXT:    call __atomic_fetch_xor_1
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_xor_i8_monotonic:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    andi a1, a1, 255
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:    amoxor.w a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    srl a0, a0, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw xor i8* %a, i8 %b monotonic
 | |
|   ret i8 %1
 | |
| }
 | |
| 
 | |
| define i8 @atomicrmw_xor_i8_acquire(i8 *%a, i8 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_xor_i8_acquire:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 2
 | |
| ; RV32I-NEXT:    call __atomic_fetch_xor_1
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_xor_i8_acquire:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    andi a1, a1, 255
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:    amoxor.w.aq a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    srl a0, a0, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw xor i8* %a, i8 %b acquire
 | |
|   ret i8 %1
 | |
| }
 | |
| 
 | |
| define i8 @atomicrmw_xor_i8_release(i8 *%a, i8 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_xor_i8_release:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 3
 | |
| ; RV32I-NEXT:    call __atomic_fetch_xor_1
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_xor_i8_release:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    andi a1, a1, 255
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:    amoxor.w.rl a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    srl a0, a0, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw xor i8* %a, i8 %b release
 | |
|   ret i8 %1
 | |
| }
 | |
| 
 | |
| define i8 @atomicrmw_xor_i8_acq_rel(i8 *%a, i8 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_xor_i8_acq_rel:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 4
 | |
| ; RV32I-NEXT:    call __atomic_fetch_xor_1
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_xor_i8_acq_rel:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    andi a1, a1, 255
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:    amoxor.w.aqrl a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    srl a0, a0, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw xor i8* %a, i8 %b acq_rel
 | |
|   ret i8 %1
 | |
| }
 | |
| 
 | |
| define i8 @atomicrmw_xor_i8_seq_cst(i8 *%a, i8 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_xor_i8_seq_cst:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 5
 | |
| ; RV32I-NEXT:    call __atomic_fetch_xor_1
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_xor_i8_seq_cst:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    andi a1, a1, 255
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:    amoxor.w.aqrl a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    srl a0, a0, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw xor i8* %a, i8 %b seq_cst
 | |
|   ret i8 %1
 | |
| }
 | |
| 
 | |
| define i8 @atomicrmw_max_i8_monotonic(i8 *%a, i8 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_max_i8_monotonic:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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 s2, a1
 | |
| ; 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, 11
 | |
| ; RV32I-NEXT:  .LBB35_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 s1, a1, .LBB35_3
 | |
| ; RV32I-NEXT:  # %bb.2: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB35_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a2, s2
 | |
| ; RV32I-NEXT:  .LBB35_3: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB35_1 Depth=1
 | |
| ; RV32I-NEXT:    sb a0, 11(sp)
 | |
| ; RV32I-NEXT:    mv a0, s4
 | |
| ; RV32I-NEXT:    mv a1, s3
 | |
| ; RV32I-NEXT:    mv a3, zero
 | |
| ; RV32I-NEXT:    mv a4, zero
 | |
| ; RV32I-NEXT:    call __atomic_compare_exchange_1
 | |
| ; RV32I-NEXT:    mv a1, a0
 | |
| ; RV32I-NEXT:    lb a0, 11(sp)
 | |
| ; RV32I-NEXT:    beqz a1, .LBB35_1
 | |
| ; RV32I-NEXT:  # %bb.4: # %atomicrmw.end
 | |
| ; 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_i8_monotonic:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    addi a3, zero, 24
 | |
| ; RV32IA-NEXT:    sub a6, a3, a2
 | |
| ; RV32IA-NEXT:    addi a4, zero, 255
 | |
| ; RV32IA-NEXT:    sll a7, a4, a2
 | |
| ; RV32IA-NEXT:    slli a1, a1, 24
 | |
| ; RV32IA-NEXT:    srai a1, a1, 24
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB35_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w a5, (a0)
 | |
| ; RV32IA-NEXT:    and a4, a5, a7
 | |
| ; RV32IA-NEXT:    mv a3, a5
 | |
| ; RV32IA-NEXT:    sll a4, a4, a6
 | |
| ; RV32IA-NEXT:    sra a4, a4, a6
 | |
| ; RV32IA-NEXT:    bge a4, a1, .LBB35_3
 | |
| ; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB35_1 Depth=1
 | |
| ; RV32IA-NEXT:    xor a3, a5, a1
 | |
| ; RV32IA-NEXT:    and a3, a3, a7
 | |
| ; RV32IA-NEXT:    xor a3, a5, a3
 | |
| ; RV32IA-NEXT:  .LBB35_3: # in Loop: Header=BB35_1 Depth=1
 | |
| ; RV32IA-NEXT:    sc.w a3, a3, (a0)
 | |
| ; RV32IA-NEXT:    bnez a3, .LBB35_1
 | |
| ; RV32IA-NEXT:  # %bb.4:
 | |
| ; RV32IA-NEXT:    srl a0, a5, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw max i8* %a, i8 %b monotonic
 | |
|   ret i8 %1
 | |
| }
 | |
| 
 | |
| define i8 @atomicrmw_max_i8_acquire(i8 *%a, i8 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_max_i8_acquire:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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 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:  .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:  # %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:    mv a0, s4
 | |
| ; RV32I-NEXT:    mv a1, s3
 | |
| ; RV32I-NEXT:    mv a3, s1
 | |
| ; RV32I-NEXT:    mv a4, s1
 | |
| ; RV32I-NEXT:    call __atomic_compare_exchange_1
 | |
| ; RV32I-NEXT:    mv a1, a0
 | |
| ; RV32I-NEXT:    lb a0, 7(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)
 | |
| ; 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_i8_acquire:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    addi a3, zero, 24
 | |
| ; RV32IA-NEXT:    sub a6, a3, a2
 | |
| ; RV32IA-NEXT:    addi a4, zero, 255
 | |
| ; RV32IA-NEXT:    sll a7, a4, a2
 | |
| ; RV32IA-NEXT:    slli a1, a1, 24
 | |
| ; RV32IA-NEXT:    srai a1, a1, 24
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB36_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w.aq a5, (a0)
 | |
| ; RV32IA-NEXT:    and a4, a5, a7
 | |
| ; RV32IA-NEXT:    mv a3, a5
 | |
| ; RV32IA-NEXT:    sll a4, a4, a6
 | |
| ; RV32IA-NEXT:    sra a4, a4, a6
 | |
| ; RV32IA-NEXT:    bge a4, a1, .LBB36_3
 | |
| ; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB36_1 Depth=1
 | |
| ; RV32IA-NEXT:    xor a3, a5, a1
 | |
| ; RV32IA-NEXT:    and a3, a3, a7
 | |
| ; RV32IA-NEXT:    xor a3, a5, a3
 | |
| ; RV32IA-NEXT:  .LBB36_3: # in Loop: Header=BB36_1 Depth=1
 | |
| ; RV32IA-NEXT:    sc.w a3, a3, (a0)
 | |
| ; RV32IA-NEXT:    bnez a3, .LBB36_1
 | |
| ; RV32IA-NEXT:  # %bb.4:
 | |
| ; RV32IA-NEXT:    srl a0, a5, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw max i8* %a, i8 %b acquire
 | |
|   ret i8 %1
 | |
| }
 | |
| 
 | |
| define i8 @atomicrmw_max_i8_release(i8 *%a, i8 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_max_i8_release:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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 s5, 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:  .LBB37_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 s1, a1, .LBB37_3
 | |
| ; RV32I-NEXT:  # %bb.2: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB37_1 Depth=1
 | |
| ; 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:    mv a1, s3
 | |
| ; RV32I-NEXT:    mv a3, s4
 | |
| ; 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:    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)
 | |
| ; 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_i8_release:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    addi a3, zero, 24
 | |
| ; RV32IA-NEXT:    sub a6, a3, a2
 | |
| ; RV32IA-NEXT:    addi a4, zero, 255
 | |
| ; RV32IA-NEXT:    sll a7, a4, a2
 | |
| ; RV32IA-NEXT:    slli a1, a1, 24
 | |
| ; RV32IA-NEXT:    srai a1, a1, 24
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB37_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w a5, (a0)
 | |
| ; RV32IA-NEXT:    and a4, a5, a7
 | |
| ; RV32IA-NEXT:    mv a3, a5
 | |
| ; RV32IA-NEXT:    sll a4, a4, a6
 | |
| ; RV32IA-NEXT:    sra a4, a4, a6
 | |
| ; RV32IA-NEXT:    bge a4, a1, .LBB37_3
 | |
| ; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB37_1 Depth=1
 | |
| ; RV32IA-NEXT:    xor a3, a5, a1
 | |
| ; RV32IA-NEXT:    and a3, a3, a7
 | |
| ; RV32IA-NEXT:    xor a3, a5, a3
 | |
| ; RV32IA-NEXT:  .LBB37_3: # in Loop: Header=BB37_1 Depth=1
 | |
| ; RV32IA-NEXT:    sc.w.rl a3, a3, (a0)
 | |
| ; RV32IA-NEXT:    bnez a3, .LBB37_1
 | |
| ; RV32IA-NEXT:  # %bb.4:
 | |
| ; RV32IA-NEXT:    srl a0, a5, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw max i8* %a, i8 %b release
 | |
|   ret i8 %1
 | |
| }
 | |
| 
 | |
| define i8 @atomicrmw_max_i8_acq_rel(i8 *%a, i8 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_max_i8_acq_rel:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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:    sw s6, 4(sp)
 | |
| ; RV32I-NEXT:    mv s2, a1
 | |
| ; RV32I-NEXT:    mv s6, 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:  .LBB38_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 s1, a1, .LBB38_3
 | |
| ; RV32I-NEXT:  # %bb.2: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB38_1 Depth=1
 | |
| ; 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:    mv a1, s3
 | |
| ; RV32I-NEXT:    mv a3, s4
 | |
| ; RV32I-NEXT:    mv a4, s5
 | |
| ; RV32I-NEXT:    call __atomic_compare_exchange_1
 | |
| ; RV32I-NEXT:    mv a1, a0
 | |
| ; RV32I-NEXT:    lb a0, 3(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)
 | |
| ; 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_i8_acq_rel:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    addi a3, zero, 24
 | |
| ; RV32IA-NEXT:    sub a6, a3, a2
 | |
| ; RV32IA-NEXT:    addi a4, zero, 255
 | |
| ; RV32IA-NEXT:    sll a7, a4, a2
 | |
| ; RV32IA-NEXT:    slli a1, a1, 24
 | |
| ; RV32IA-NEXT:    srai a1, a1, 24
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB38_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w.aq a5, (a0)
 | |
| ; RV32IA-NEXT:    and a4, a5, a7
 | |
| ; RV32IA-NEXT:    mv a3, a5
 | |
| ; RV32IA-NEXT:    sll a4, a4, a6
 | |
| ; RV32IA-NEXT:    sra a4, a4, a6
 | |
| ; RV32IA-NEXT:    bge a4, a1, .LBB38_3
 | |
| ; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB38_1 Depth=1
 | |
| ; RV32IA-NEXT:    xor a3, a5, a1
 | |
| ; RV32IA-NEXT:    and a3, a3, a7
 | |
| ; RV32IA-NEXT:    xor a3, a5, a3
 | |
| ; RV32IA-NEXT:  .LBB38_3: # in Loop: Header=BB38_1 Depth=1
 | |
| ; RV32IA-NEXT:    sc.w.rl a3, a3, (a0)
 | |
| ; RV32IA-NEXT:    bnez a3, .LBB38_1
 | |
| ; RV32IA-NEXT:  # %bb.4:
 | |
| ; RV32IA-NEXT:    srl a0, a5, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw max i8* %a, i8 %b acq_rel
 | |
|   ret i8 %1
 | |
| }
 | |
| 
 | |
| define i8 @atomicrmw_max_i8_seq_cst(i8 *%a, i8 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_max_i8_seq_cst:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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 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:  .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:  # %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:    mv a0, s4
 | |
| ; RV32I-NEXT:    mv a1, s3
 | |
| ; RV32I-NEXT:    mv a3, s1
 | |
| ; RV32I-NEXT:    mv a4, s1
 | |
| ; RV32I-NEXT:    call __atomic_compare_exchange_1
 | |
| ; RV32I-NEXT:    mv a1, a0
 | |
| ; RV32I-NEXT:    lb a0, 7(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)
 | |
| ; 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_i8_seq_cst:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    addi a3, zero, 24
 | |
| ; RV32IA-NEXT:    sub a6, a3, a2
 | |
| ; RV32IA-NEXT:    addi a4, zero, 255
 | |
| ; RV32IA-NEXT:    sll a7, a4, a2
 | |
| ; RV32IA-NEXT:    slli a1, a1, 24
 | |
| ; RV32IA-NEXT:    srai a1, a1, 24
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB39_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w.aqrl a5, (a0)
 | |
| ; RV32IA-NEXT:    and a4, a5, a7
 | |
| ; RV32IA-NEXT:    mv a3, a5
 | |
| ; RV32IA-NEXT:    sll a4, a4, a6
 | |
| ; RV32IA-NEXT:    sra a4, a4, a6
 | |
| ; RV32IA-NEXT:    bge a4, a1, .LBB39_3
 | |
| ; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB39_1 Depth=1
 | |
| ; RV32IA-NEXT:    xor a3, a5, a1
 | |
| ; RV32IA-NEXT:    and a3, a3, a7
 | |
| ; RV32IA-NEXT:    xor a3, a5, a3
 | |
| ; RV32IA-NEXT:  .LBB39_3: # in Loop: Header=BB39_1 Depth=1
 | |
| ; RV32IA-NEXT:    sc.w.aqrl a3, a3, (a0)
 | |
| ; RV32IA-NEXT:    bnez a3, .LBB39_1
 | |
| ; RV32IA-NEXT:  # %bb.4:
 | |
| ; RV32IA-NEXT:    srl a0, a5, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw max i8* %a, i8 %b seq_cst
 | |
|   ret i8 %1
 | |
| }
 | |
| 
 | |
| define i8 @atomicrmw_min_i8_monotonic(i8 *%a, i8 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_min_i8_monotonic:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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 s2, a1
 | |
| ; 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, 11
 | |
| ; RV32I-NEXT:  .LBB40_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 s1, a1, .LBB40_3
 | |
| ; RV32I-NEXT:  # %bb.2: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB40_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a2, s2
 | |
| ; RV32I-NEXT:  .LBB40_3: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB40_1 Depth=1
 | |
| ; RV32I-NEXT:    sb a0, 11(sp)
 | |
| ; RV32I-NEXT:    mv a0, s4
 | |
| ; RV32I-NEXT:    mv a1, s3
 | |
| ; RV32I-NEXT:    mv a3, zero
 | |
| ; RV32I-NEXT:    mv a4, zero
 | |
| ; RV32I-NEXT:    call __atomic_compare_exchange_1
 | |
| ; RV32I-NEXT:    mv a1, a0
 | |
| ; RV32I-NEXT:    lb a0, 11(sp)
 | |
| ; RV32I-NEXT:    beqz a1, .LBB40_1
 | |
| ; RV32I-NEXT:  # %bb.4: # %atomicrmw.end
 | |
| ; 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_i8_monotonic:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    addi a3, zero, 24
 | |
| ; RV32IA-NEXT:    sub a6, a3, a2
 | |
| ; RV32IA-NEXT:    addi a4, zero, 255
 | |
| ; RV32IA-NEXT:    sll a7, a4, a2
 | |
| ; RV32IA-NEXT:    slli a1, a1, 24
 | |
| ; RV32IA-NEXT:    srai a1, a1, 24
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB40_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w a5, (a0)
 | |
| ; RV32IA-NEXT:    and a4, a5, a7
 | |
| ; RV32IA-NEXT:    mv a3, a5
 | |
| ; RV32IA-NEXT:    sll a4, a4, a6
 | |
| ; RV32IA-NEXT:    sra a4, a4, a6
 | |
| ; RV32IA-NEXT:    bge a1, a4, .LBB40_3
 | |
| ; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB40_1 Depth=1
 | |
| ; RV32IA-NEXT:    xor a3, a5, a1
 | |
| ; RV32IA-NEXT:    and a3, a3, a7
 | |
| ; RV32IA-NEXT:    xor a3, a5, a3
 | |
| ; RV32IA-NEXT:  .LBB40_3: # in Loop: Header=BB40_1 Depth=1
 | |
| ; RV32IA-NEXT:    sc.w a3, a3, (a0)
 | |
| ; RV32IA-NEXT:    bnez a3, .LBB40_1
 | |
| ; RV32IA-NEXT:  # %bb.4:
 | |
| ; RV32IA-NEXT:    srl a0, a5, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw min i8* %a, i8 %b monotonic
 | |
|   ret i8 %1
 | |
| }
 | |
| 
 | |
| define i8 @atomicrmw_min_i8_acquire(i8 *%a, i8 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_min_i8_acquire:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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 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:  .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:  # %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:    mv a0, s4
 | |
| ; RV32I-NEXT:    mv a1, s3
 | |
| ; RV32I-NEXT:    mv a3, s1
 | |
| ; RV32I-NEXT:    mv a4, s1
 | |
| ; RV32I-NEXT:    call __atomic_compare_exchange_1
 | |
| ; RV32I-NEXT:    mv a1, a0
 | |
| ; RV32I-NEXT:    lb a0, 7(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)
 | |
| ; 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_i8_acquire:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    addi a3, zero, 24
 | |
| ; RV32IA-NEXT:    sub a6, a3, a2
 | |
| ; RV32IA-NEXT:    addi a4, zero, 255
 | |
| ; RV32IA-NEXT:    sll a7, a4, a2
 | |
| ; RV32IA-NEXT:    slli a1, a1, 24
 | |
| ; RV32IA-NEXT:    srai a1, a1, 24
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB41_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w.aq a5, (a0)
 | |
| ; RV32IA-NEXT:    and a4, a5, a7
 | |
| ; RV32IA-NEXT:    mv a3, a5
 | |
| ; RV32IA-NEXT:    sll a4, a4, a6
 | |
| ; RV32IA-NEXT:    sra a4, a4, a6
 | |
| ; RV32IA-NEXT:    bge a1, a4, .LBB41_3
 | |
| ; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB41_1 Depth=1
 | |
| ; RV32IA-NEXT:    xor a3, a5, a1
 | |
| ; RV32IA-NEXT:    and a3, a3, a7
 | |
| ; RV32IA-NEXT:    xor a3, a5, a3
 | |
| ; RV32IA-NEXT:  .LBB41_3: # in Loop: Header=BB41_1 Depth=1
 | |
| ; RV32IA-NEXT:    sc.w a3, a3, (a0)
 | |
| ; RV32IA-NEXT:    bnez a3, .LBB41_1
 | |
| ; RV32IA-NEXT:  # %bb.4:
 | |
| ; RV32IA-NEXT:    srl a0, a5, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw min i8* %a, i8 %b acquire
 | |
|   ret i8 %1
 | |
| }
 | |
| 
 | |
| define i8 @atomicrmw_min_i8_release(i8 *%a, i8 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_min_i8_release:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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 s5, 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:  .LBB42_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 s1, a1, .LBB42_3
 | |
| ; RV32I-NEXT:  # %bb.2: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB42_1 Depth=1
 | |
| ; 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:    mv a1, s3
 | |
| ; RV32I-NEXT:    mv a3, s4
 | |
| ; 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:    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)
 | |
| ; 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_i8_release:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    addi a3, zero, 24
 | |
| ; RV32IA-NEXT:    sub a6, a3, a2
 | |
| ; RV32IA-NEXT:    addi a4, zero, 255
 | |
| ; RV32IA-NEXT:    sll a7, a4, a2
 | |
| ; RV32IA-NEXT:    slli a1, a1, 24
 | |
| ; RV32IA-NEXT:    srai a1, a1, 24
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB42_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w a5, (a0)
 | |
| ; RV32IA-NEXT:    and a4, a5, a7
 | |
| ; RV32IA-NEXT:    mv a3, a5
 | |
| ; RV32IA-NEXT:    sll a4, a4, a6
 | |
| ; RV32IA-NEXT:    sra a4, a4, a6
 | |
| ; RV32IA-NEXT:    bge a1, a4, .LBB42_3
 | |
| ; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB42_1 Depth=1
 | |
| ; RV32IA-NEXT:    xor a3, a5, a1
 | |
| ; RV32IA-NEXT:    and a3, a3, a7
 | |
| ; RV32IA-NEXT:    xor a3, a5, a3
 | |
| ; RV32IA-NEXT:  .LBB42_3: # in Loop: Header=BB42_1 Depth=1
 | |
| ; RV32IA-NEXT:    sc.w.rl a3, a3, (a0)
 | |
| ; RV32IA-NEXT:    bnez a3, .LBB42_1
 | |
| ; RV32IA-NEXT:  # %bb.4:
 | |
| ; RV32IA-NEXT:    srl a0, a5, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw min i8* %a, i8 %b release
 | |
|   ret i8 %1
 | |
| }
 | |
| 
 | |
| define i8 @atomicrmw_min_i8_acq_rel(i8 *%a, i8 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_min_i8_acq_rel:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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:    sw s6, 4(sp)
 | |
| ; RV32I-NEXT:    mv s2, a1
 | |
| ; RV32I-NEXT:    mv s6, 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:  .LBB43_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 s1, a1, .LBB43_3
 | |
| ; RV32I-NEXT:  # %bb.2: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB43_1 Depth=1
 | |
| ; 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:    mv a1, s3
 | |
| ; RV32I-NEXT:    mv a3, s4
 | |
| ; RV32I-NEXT:    mv a4, s5
 | |
| ; RV32I-NEXT:    call __atomic_compare_exchange_1
 | |
| ; RV32I-NEXT:    mv a1, a0
 | |
| ; RV32I-NEXT:    lb a0, 3(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)
 | |
| ; 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_i8_acq_rel:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    addi a3, zero, 24
 | |
| ; RV32IA-NEXT:    sub a6, a3, a2
 | |
| ; RV32IA-NEXT:    addi a4, zero, 255
 | |
| ; RV32IA-NEXT:    sll a7, a4, a2
 | |
| ; RV32IA-NEXT:    slli a1, a1, 24
 | |
| ; RV32IA-NEXT:    srai a1, a1, 24
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB43_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w.aq a5, (a0)
 | |
| ; RV32IA-NEXT:    and a4, a5, a7
 | |
| ; RV32IA-NEXT:    mv a3, a5
 | |
| ; RV32IA-NEXT:    sll a4, a4, a6
 | |
| ; RV32IA-NEXT:    sra a4, a4, a6
 | |
| ; RV32IA-NEXT:    bge a1, a4, .LBB43_3
 | |
| ; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB43_1 Depth=1
 | |
| ; RV32IA-NEXT:    xor a3, a5, a1
 | |
| ; RV32IA-NEXT:    and a3, a3, a7
 | |
| ; RV32IA-NEXT:    xor a3, a5, a3
 | |
| ; RV32IA-NEXT:  .LBB43_3: # in Loop: Header=BB43_1 Depth=1
 | |
| ; RV32IA-NEXT:    sc.w.rl a3, a3, (a0)
 | |
| ; RV32IA-NEXT:    bnez a3, .LBB43_1
 | |
| ; RV32IA-NEXT:  # %bb.4:
 | |
| ; RV32IA-NEXT:    srl a0, a5, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw min i8* %a, i8 %b acq_rel
 | |
|   ret i8 %1
 | |
| }
 | |
| 
 | |
| define i8 @atomicrmw_min_i8_seq_cst(i8 *%a, i8 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_min_i8_seq_cst:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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 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:  .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:  # %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:    mv a0, s4
 | |
| ; RV32I-NEXT:    mv a1, s3
 | |
| ; RV32I-NEXT:    mv a3, s1
 | |
| ; RV32I-NEXT:    mv a4, s1
 | |
| ; RV32I-NEXT:    call __atomic_compare_exchange_1
 | |
| ; RV32I-NEXT:    mv a1, a0
 | |
| ; RV32I-NEXT:    lb a0, 7(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)
 | |
| ; 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_i8_seq_cst:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    addi a3, zero, 24
 | |
| ; RV32IA-NEXT:    sub a6, a3, a2
 | |
| ; RV32IA-NEXT:    addi a4, zero, 255
 | |
| ; RV32IA-NEXT:    sll a7, a4, a2
 | |
| ; RV32IA-NEXT:    slli a1, a1, 24
 | |
| ; RV32IA-NEXT:    srai a1, a1, 24
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB44_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w.aqrl a5, (a0)
 | |
| ; RV32IA-NEXT:    and a4, a5, a7
 | |
| ; RV32IA-NEXT:    mv a3, a5
 | |
| ; RV32IA-NEXT:    sll a4, a4, a6
 | |
| ; RV32IA-NEXT:    sra a4, a4, a6
 | |
| ; RV32IA-NEXT:    bge a1, a4, .LBB44_3
 | |
| ; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB44_1 Depth=1
 | |
| ; RV32IA-NEXT:    xor a3, a5, a1
 | |
| ; RV32IA-NEXT:    and a3, a3, a7
 | |
| ; RV32IA-NEXT:    xor a3, a5, a3
 | |
| ; RV32IA-NEXT:  .LBB44_3: # in Loop: Header=BB44_1 Depth=1
 | |
| ; RV32IA-NEXT:    sc.w.aqrl a3, a3, (a0)
 | |
| ; RV32IA-NEXT:    bnez a3, .LBB44_1
 | |
| ; RV32IA-NEXT:  # %bb.4:
 | |
| ; RV32IA-NEXT:    srl a0, a5, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw min i8* %a, i8 %b seq_cst
 | |
|   ret i8 %1
 | |
| }
 | |
| 
 | |
| define i8 @atomicrmw_umax_i8_monotonic(i8 *%a, i8 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_umax_i8_monotonic:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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 s2, a1
 | |
| ; RV32I-NEXT:    mv s4, a0
 | |
| ; RV32I-NEXT:    lbu a0, 0(a0)
 | |
| ; RV32I-NEXT:    andi s1, a1, 255
 | |
| ; RV32I-NEXT:    addi s3, sp, 11
 | |
| ; RV32I-NEXT:  .LBB45_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 s1, a1, .LBB45_3
 | |
| ; RV32I-NEXT:  # %bb.2: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB45_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a2, s2
 | |
| ; RV32I-NEXT:  .LBB45_3: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB45_1 Depth=1
 | |
| ; RV32I-NEXT:    sb a0, 11(sp)
 | |
| ; RV32I-NEXT:    mv a0, s4
 | |
| ; RV32I-NEXT:    mv a1, s3
 | |
| ; RV32I-NEXT:    mv a3, zero
 | |
| ; RV32I-NEXT:    mv a4, zero
 | |
| ; RV32I-NEXT:    call __atomic_compare_exchange_1
 | |
| ; RV32I-NEXT:    mv a1, a0
 | |
| ; RV32I-NEXT:    lb a0, 11(sp)
 | |
| ; RV32I-NEXT:    beqz a1, .LBB45_1
 | |
| ; RV32I-NEXT:  # %bb.4: # %atomicrmw.end
 | |
| ; 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_i8_monotonic:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    addi a3, zero, 255
 | |
| ; RV32IA-NEXT:    sll a6, a3, a2
 | |
| ; RV32IA-NEXT:    andi a1, a1, 255
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB45_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w a4, (a0)
 | |
| ; RV32IA-NEXT:    and a3, a4, a6
 | |
| ; RV32IA-NEXT:    mv a5, a4
 | |
| ; RV32IA-NEXT:    bgeu a3, a1, .LBB45_3
 | |
| ; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB45_1 Depth=1
 | |
| ; RV32IA-NEXT:    xor a5, a4, a1
 | |
| ; RV32IA-NEXT:    and a5, a5, a6
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:  .LBB45_3: # in Loop: Header=BB45_1 Depth=1
 | |
| ; RV32IA-NEXT:    sc.w a5, a5, (a0)
 | |
| ; RV32IA-NEXT:    bnez a5, .LBB45_1
 | |
| ; RV32IA-NEXT:  # %bb.4:
 | |
| ; RV32IA-NEXT:    srl a0, a4, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw umax i8* %a, i8 %b monotonic
 | |
|   ret i8 %1
 | |
| }
 | |
| 
 | |
| define i8 @atomicrmw_umax_i8_acquire(i8 *%a, i8 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_umax_i8_acquire:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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 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:  .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:  # %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:    mv a0, s4
 | |
| ; RV32I-NEXT:    mv a1, s3
 | |
| ; RV32I-NEXT:    mv a3, s1
 | |
| ; RV32I-NEXT:    mv a4, s1
 | |
| ; RV32I-NEXT:    call __atomic_compare_exchange_1
 | |
| ; RV32I-NEXT:    mv a1, a0
 | |
| ; RV32I-NEXT:    lb a0, 7(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)
 | |
| ; 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_i8_acquire:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    addi a3, zero, 255
 | |
| ; RV32IA-NEXT:    sll a6, a3, a2
 | |
| ; RV32IA-NEXT:    andi a1, a1, 255
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB46_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w.aq a4, (a0)
 | |
| ; RV32IA-NEXT:    and a3, a4, a6
 | |
| ; RV32IA-NEXT:    mv a5, a4
 | |
| ; RV32IA-NEXT:    bgeu a3, a1, .LBB46_3
 | |
| ; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB46_1 Depth=1
 | |
| ; RV32IA-NEXT:    xor a5, a4, a1
 | |
| ; RV32IA-NEXT:    and a5, a5, a6
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:  .LBB46_3: # in Loop: Header=BB46_1 Depth=1
 | |
| ; RV32IA-NEXT:    sc.w a5, a5, (a0)
 | |
| ; RV32IA-NEXT:    bnez a5, .LBB46_1
 | |
| ; RV32IA-NEXT:  # %bb.4:
 | |
| ; RV32IA-NEXT:    srl a0, a4, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw umax i8* %a, i8 %b acquire
 | |
|   ret i8 %1
 | |
| }
 | |
| 
 | |
| define i8 @atomicrmw_umax_i8_release(i8 *%a, i8 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_umax_i8_release:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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 s5, 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:  .LBB47_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 s1, a1, .LBB47_3
 | |
| ; RV32I-NEXT:  # %bb.2: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB47_1 Depth=1
 | |
| ; 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:    mv a1, s3
 | |
| ; RV32I-NEXT:    mv a3, s4
 | |
| ; 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:    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)
 | |
| ; 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_i8_release:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    addi a3, zero, 255
 | |
| ; RV32IA-NEXT:    sll a6, a3, a2
 | |
| ; RV32IA-NEXT:    andi a1, a1, 255
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB47_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w a4, (a0)
 | |
| ; RV32IA-NEXT:    and a3, a4, a6
 | |
| ; RV32IA-NEXT:    mv a5, a4
 | |
| ; RV32IA-NEXT:    bgeu a3, a1, .LBB47_3
 | |
| ; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB47_1 Depth=1
 | |
| ; RV32IA-NEXT:    xor a5, a4, a1
 | |
| ; RV32IA-NEXT:    and a5, a5, a6
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:  .LBB47_3: # in Loop: Header=BB47_1 Depth=1
 | |
| ; RV32IA-NEXT:    sc.w.rl a5, a5, (a0)
 | |
| ; RV32IA-NEXT:    bnez a5, .LBB47_1
 | |
| ; RV32IA-NEXT:  # %bb.4:
 | |
| ; RV32IA-NEXT:    srl a0, a4, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw umax i8* %a, i8 %b release
 | |
|   ret i8 %1
 | |
| }
 | |
| 
 | |
| define i8 @atomicrmw_umax_i8_acq_rel(i8 *%a, i8 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_umax_i8_acq_rel:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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:    sw s6, 4(sp)
 | |
| ; RV32I-NEXT:    mv s2, a1
 | |
| ; RV32I-NEXT:    mv s6, 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:  .LBB48_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 s1, a1, .LBB48_3
 | |
| ; RV32I-NEXT:  # %bb.2: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB48_1 Depth=1
 | |
| ; 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:    mv a1, s3
 | |
| ; RV32I-NEXT:    mv a3, s4
 | |
| ; RV32I-NEXT:    mv a4, s5
 | |
| ; RV32I-NEXT:    call __atomic_compare_exchange_1
 | |
| ; RV32I-NEXT:    mv a1, a0
 | |
| ; RV32I-NEXT:    lb a0, 3(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)
 | |
| ; 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_i8_acq_rel:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    addi a3, zero, 255
 | |
| ; RV32IA-NEXT:    sll a6, a3, a2
 | |
| ; RV32IA-NEXT:    andi a1, a1, 255
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB48_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w.aq a4, (a0)
 | |
| ; RV32IA-NEXT:    and a3, a4, a6
 | |
| ; RV32IA-NEXT:    mv a5, a4
 | |
| ; RV32IA-NEXT:    bgeu a3, a1, .LBB48_3
 | |
| ; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB48_1 Depth=1
 | |
| ; RV32IA-NEXT:    xor a5, a4, a1
 | |
| ; RV32IA-NEXT:    and a5, a5, a6
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:  .LBB48_3: # in Loop: Header=BB48_1 Depth=1
 | |
| ; RV32IA-NEXT:    sc.w.rl a5, a5, (a0)
 | |
| ; RV32IA-NEXT:    bnez a5, .LBB48_1
 | |
| ; RV32IA-NEXT:  # %bb.4:
 | |
| ; RV32IA-NEXT:    srl a0, a4, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw umax i8* %a, i8 %b acq_rel
 | |
|   ret i8 %1
 | |
| }
 | |
| 
 | |
| define i8 @atomicrmw_umax_i8_seq_cst(i8 *%a, i8 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_umax_i8_seq_cst:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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 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:  .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:  # %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:    mv a0, s4
 | |
| ; RV32I-NEXT:    mv a1, s3
 | |
| ; RV32I-NEXT:    mv a3, s1
 | |
| ; RV32I-NEXT:    mv a4, s1
 | |
| ; RV32I-NEXT:    call __atomic_compare_exchange_1
 | |
| ; RV32I-NEXT:    mv a1, a0
 | |
| ; RV32I-NEXT:    lb a0, 7(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)
 | |
| ; 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_i8_seq_cst:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    addi a3, zero, 255
 | |
| ; RV32IA-NEXT:    sll a6, a3, a2
 | |
| ; RV32IA-NEXT:    andi a1, a1, 255
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB49_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w.aqrl a4, (a0)
 | |
| ; RV32IA-NEXT:    and a3, a4, a6
 | |
| ; RV32IA-NEXT:    mv a5, a4
 | |
| ; RV32IA-NEXT:    bgeu a3, a1, .LBB49_3
 | |
| ; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB49_1 Depth=1
 | |
| ; RV32IA-NEXT:    xor a5, a4, a1
 | |
| ; RV32IA-NEXT:    and a5, a5, a6
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:  .LBB49_3: # in Loop: Header=BB49_1 Depth=1
 | |
| ; RV32IA-NEXT:    sc.w.aqrl a5, a5, (a0)
 | |
| ; RV32IA-NEXT:    bnez a5, .LBB49_1
 | |
| ; RV32IA-NEXT:  # %bb.4:
 | |
| ; RV32IA-NEXT:    srl a0, a4, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw umax i8* %a, i8 %b seq_cst
 | |
|   ret i8 %1
 | |
| }
 | |
| 
 | |
| define i8 @atomicrmw_umin_i8_monotonic(i8 *%a, i8 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_umin_i8_monotonic:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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 s2, a1
 | |
| ; RV32I-NEXT:    mv s4, a0
 | |
| ; RV32I-NEXT:    lbu a0, 0(a0)
 | |
| ; RV32I-NEXT:    andi s1, a1, 255
 | |
| ; RV32I-NEXT:    addi s3, sp, 11
 | |
| ; RV32I-NEXT:  .LBB50_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 s1, a1, .LBB50_3
 | |
| ; RV32I-NEXT:  # %bb.2: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB50_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a2, s2
 | |
| ; RV32I-NEXT:  .LBB50_3: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB50_1 Depth=1
 | |
| ; RV32I-NEXT:    sb a0, 11(sp)
 | |
| ; RV32I-NEXT:    mv a0, s4
 | |
| ; RV32I-NEXT:    mv a1, s3
 | |
| ; RV32I-NEXT:    mv a3, zero
 | |
| ; RV32I-NEXT:    mv a4, zero
 | |
| ; RV32I-NEXT:    call __atomic_compare_exchange_1
 | |
| ; RV32I-NEXT:    mv a1, a0
 | |
| ; RV32I-NEXT:    lb a0, 11(sp)
 | |
| ; RV32I-NEXT:    beqz a1, .LBB50_1
 | |
| ; RV32I-NEXT:  # %bb.4: # %atomicrmw.end
 | |
| ; 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_i8_monotonic:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    addi a3, zero, 255
 | |
| ; RV32IA-NEXT:    sll a6, a3, a2
 | |
| ; RV32IA-NEXT:    andi a1, a1, 255
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB50_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w a4, (a0)
 | |
| ; RV32IA-NEXT:    and a3, a4, a6
 | |
| ; RV32IA-NEXT:    mv a5, a4
 | |
| ; RV32IA-NEXT:    bgeu a1, a3, .LBB50_3
 | |
| ; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB50_1 Depth=1
 | |
| ; RV32IA-NEXT:    xor a5, a4, a1
 | |
| ; RV32IA-NEXT:    and a5, a5, a6
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:  .LBB50_3: # in Loop: Header=BB50_1 Depth=1
 | |
| ; RV32IA-NEXT:    sc.w a5, a5, (a0)
 | |
| ; RV32IA-NEXT:    bnez a5, .LBB50_1
 | |
| ; RV32IA-NEXT:  # %bb.4:
 | |
| ; RV32IA-NEXT:    srl a0, a4, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw umin i8* %a, i8 %b monotonic
 | |
|   ret i8 %1
 | |
| }
 | |
| 
 | |
| define i8 @atomicrmw_umin_i8_acquire(i8 *%a, i8 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_umin_i8_acquire:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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 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:  .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:  # %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:    mv a0, s4
 | |
| ; RV32I-NEXT:    mv a1, s3
 | |
| ; RV32I-NEXT:    mv a3, s1
 | |
| ; RV32I-NEXT:    mv a4, s1
 | |
| ; RV32I-NEXT:    call __atomic_compare_exchange_1
 | |
| ; RV32I-NEXT:    mv a1, a0
 | |
| ; RV32I-NEXT:    lb a0, 7(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)
 | |
| ; 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_i8_acquire:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    addi a3, zero, 255
 | |
| ; RV32IA-NEXT:    sll a6, a3, a2
 | |
| ; RV32IA-NEXT:    andi a1, a1, 255
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB51_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w.aq a4, (a0)
 | |
| ; RV32IA-NEXT:    and a3, a4, a6
 | |
| ; RV32IA-NEXT:    mv a5, a4
 | |
| ; RV32IA-NEXT:    bgeu a1, a3, .LBB51_3
 | |
| ; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB51_1 Depth=1
 | |
| ; RV32IA-NEXT:    xor a5, a4, a1
 | |
| ; RV32IA-NEXT:    and a5, a5, a6
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:  .LBB51_3: # in Loop: Header=BB51_1 Depth=1
 | |
| ; RV32IA-NEXT:    sc.w a5, a5, (a0)
 | |
| ; RV32IA-NEXT:    bnez a5, .LBB51_1
 | |
| ; RV32IA-NEXT:  # %bb.4:
 | |
| ; RV32IA-NEXT:    srl a0, a4, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw umin i8* %a, i8 %b acquire
 | |
|   ret i8 %1
 | |
| }
 | |
| 
 | |
| define i8 @atomicrmw_umin_i8_release(i8 *%a, i8 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_umin_i8_release:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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 s5, 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:  .LBB52_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 s1, a1, .LBB52_3
 | |
| ; RV32I-NEXT:  # %bb.2: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB52_1 Depth=1
 | |
| ; 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:    mv a1, s3
 | |
| ; RV32I-NEXT:    mv a3, s4
 | |
| ; 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:    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)
 | |
| ; 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_i8_release:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    addi a3, zero, 255
 | |
| ; RV32IA-NEXT:    sll a6, a3, a2
 | |
| ; RV32IA-NEXT:    andi a1, a1, 255
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB52_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w a4, (a0)
 | |
| ; RV32IA-NEXT:    and a3, a4, a6
 | |
| ; RV32IA-NEXT:    mv a5, a4
 | |
| ; RV32IA-NEXT:    bgeu a1, a3, .LBB52_3
 | |
| ; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB52_1 Depth=1
 | |
| ; RV32IA-NEXT:    xor a5, a4, a1
 | |
| ; RV32IA-NEXT:    and a5, a5, a6
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:  .LBB52_3: # in Loop: Header=BB52_1 Depth=1
 | |
| ; RV32IA-NEXT:    sc.w.rl a5, a5, (a0)
 | |
| ; RV32IA-NEXT:    bnez a5, .LBB52_1
 | |
| ; RV32IA-NEXT:  # %bb.4:
 | |
| ; RV32IA-NEXT:    srl a0, a4, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw umin i8* %a, i8 %b release
 | |
|   ret i8 %1
 | |
| }
 | |
| 
 | |
| define i8 @atomicrmw_umin_i8_acq_rel(i8 *%a, i8 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_umin_i8_acq_rel:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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:    sw s6, 4(sp)
 | |
| ; RV32I-NEXT:    mv s2, a1
 | |
| ; RV32I-NEXT:    mv s6, 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:  .LBB53_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 s1, a1, .LBB53_3
 | |
| ; RV32I-NEXT:  # %bb.2: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB53_1 Depth=1
 | |
| ; 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:    mv a1, s3
 | |
| ; RV32I-NEXT:    mv a3, s4
 | |
| ; RV32I-NEXT:    mv a4, s5
 | |
| ; RV32I-NEXT:    call __atomic_compare_exchange_1
 | |
| ; RV32I-NEXT:    mv a1, a0
 | |
| ; RV32I-NEXT:    lb a0, 3(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)
 | |
| ; 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_i8_acq_rel:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    addi a3, zero, 255
 | |
| ; RV32IA-NEXT:    sll a6, a3, a2
 | |
| ; RV32IA-NEXT:    andi a1, a1, 255
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB53_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w.aq a4, (a0)
 | |
| ; RV32IA-NEXT:    and a3, a4, a6
 | |
| ; RV32IA-NEXT:    mv a5, a4
 | |
| ; RV32IA-NEXT:    bgeu a1, a3, .LBB53_3
 | |
| ; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB53_1 Depth=1
 | |
| ; RV32IA-NEXT:    xor a5, a4, a1
 | |
| ; RV32IA-NEXT:    and a5, a5, a6
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:  .LBB53_3: # in Loop: Header=BB53_1 Depth=1
 | |
| ; RV32IA-NEXT:    sc.w.rl a5, a5, (a0)
 | |
| ; RV32IA-NEXT:    bnez a5, .LBB53_1
 | |
| ; RV32IA-NEXT:  # %bb.4:
 | |
| ; RV32IA-NEXT:    srl a0, a4, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw umin i8* %a, i8 %b acq_rel
 | |
|   ret i8 %1
 | |
| }
 | |
| 
 | |
| define i8 @atomicrmw_umin_i8_seq_cst(i8 *%a, i8 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_umin_i8_seq_cst:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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 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:  .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:  # %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:    mv a0, s4
 | |
| ; RV32I-NEXT:    mv a1, s3
 | |
| ; RV32I-NEXT:    mv a3, s1
 | |
| ; RV32I-NEXT:    mv a4, s1
 | |
| ; RV32I-NEXT:    call __atomic_compare_exchange_1
 | |
| ; RV32I-NEXT:    mv a1, a0
 | |
| ; RV32I-NEXT:    lb a0, 7(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)
 | |
| ; 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_i8_seq_cst:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    addi a3, zero, 255
 | |
| ; RV32IA-NEXT:    sll a6, a3, a2
 | |
| ; RV32IA-NEXT:    andi a1, a1, 255
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB54_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w.aqrl a4, (a0)
 | |
| ; RV32IA-NEXT:    and a3, a4, a6
 | |
| ; RV32IA-NEXT:    mv a5, a4
 | |
| ; RV32IA-NEXT:    bgeu a1, a3, .LBB54_3
 | |
| ; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB54_1 Depth=1
 | |
| ; RV32IA-NEXT:    xor a5, a4, a1
 | |
| ; RV32IA-NEXT:    and a5, a5, a6
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:  .LBB54_3: # in Loop: Header=BB54_1 Depth=1
 | |
| ; RV32IA-NEXT:    sc.w.aqrl a5, a5, (a0)
 | |
| ; RV32IA-NEXT:    bnez a5, .LBB54_1
 | |
| ; RV32IA-NEXT:  # %bb.4:
 | |
| ; RV32IA-NEXT:    srl a0, a4, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw umin i8* %a, i8 %b seq_cst
 | |
|   ret i8 %1
 | |
| }
 | |
| 
 | |
| define i16 @atomicrmw_xchg_i16_monotonic(i16* %a, i16 %b) {
 | |
| ; RV32I-LABEL: atomicrmw_xchg_i16_monotonic:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    mv a2, zero
 | |
| ; RV32I-NEXT:    call __atomic_exchange_2
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_xchg_i16_monotonic:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    lui a2, 16
 | |
| ; RV32IA-NEXT:    addi a2, a2, -1
 | |
| ; RV32IA-NEXT:    and a1, a1, a2
 | |
| ; RV32IA-NEXT:    slli a3, a0, 3
 | |
| ; RV32IA-NEXT:    andi a3, a3, 24
 | |
| ; RV32IA-NEXT:    sll a2, a2, a3
 | |
| ; RV32IA-NEXT:    sll a1, a1, a3
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB55_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w a4, (a0)
 | |
| ; RV32IA-NEXT:    add a5, zero, a1
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    and a5, a5, a2
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    sc.w a5, a5, (a0)
 | |
| ; RV32IA-NEXT:    bnez a5, .LBB55_1
 | |
| ; RV32IA-NEXT:  # %bb.2:
 | |
| ; RV32IA-NEXT:    srl a0, a4, a3
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw xchg i16* %a, i16 %b monotonic
 | |
|   ret i16 %1
 | |
| }
 | |
| 
 | |
| define i16 @atomicrmw_xchg_i16_acquire(i16* %a, i16 %b) {
 | |
| ; RV32I-LABEL: atomicrmw_xchg_i16_acquire:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 2
 | |
| ; RV32I-NEXT:    call __atomic_exchange_2
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_xchg_i16_acquire:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    lui a2, 16
 | |
| ; RV32IA-NEXT:    addi a2, a2, -1
 | |
| ; RV32IA-NEXT:    and a1, a1, a2
 | |
| ; RV32IA-NEXT:    slli a3, a0, 3
 | |
| ; RV32IA-NEXT:    andi a3, a3, 24
 | |
| ; RV32IA-NEXT:    sll a2, a2, a3
 | |
| ; RV32IA-NEXT:    sll a1, a1, a3
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB56_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w.aq a4, (a0)
 | |
| ; RV32IA-NEXT:    add a5, zero, a1
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    and a5, a5, a2
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    sc.w a5, a5, (a0)
 | |
| ; RV32IA-NEXT:    bnez a5, .LBB56_1
 | |
| ; RV32IA-NEXT:  # %bb.2:
 | |
| ; RV32IA-NEXT:    srl a0, a4, a3
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw xchg i16* %a, i16 %b acquire
 | |
|   ret i16 %1
 | |
| }
 | |
| 
 | |
| define i16 @atomicrmw_xchg_i16_release(i16* %a, i16 %b) {
 | |
| ; RV32I-LABEL: atomicrmw_xchg_i16_release:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 3
 | |
| ; RV32I-NEXT:    call __atomic_exchange_2
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_xchg_i16_release:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    lui a2, 16
 | |
| ; RV32IA-NEXT:    addi a2, a2, -1
 | |
| ; RV32IA-NEXT:    and a1, a1, a2
 | |
| ; RV32IA-NEXT:    slli a3, a0, 3
 | |
| ; RV32IA-NEXT:    andi a3, a3, 24
 | |
| ; RV32IA-NEXT:    sll a2, a2, a3
 | |
| ; RV32IA-NEXT:    sll a1, a1, a3
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB57_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w a4, (a0)
 | |
| ; RV32IA-NEXT:    add a5, zero, a1
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    and a5, a5, a2
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    sc.w.rl a5, a5, (a0)
 | |
| ; RV32IA-NEXT:    bnez a5, .LBB57_1
 | |
| ; RV32IA-NEXT:  # %bb.2:
 | |
| ; RV32IA-NEXT:    srl a0, a4, a3
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw xchg i16* %a, i16 %b release
 | |
|   ret i16 %1
 | |
| }
 | |
| 
 | |
| define i16 @atomicrmw_xchg_i16_acq_rel(i16* %a, i16 %b) {
 | |
| ; RV32I-LABEL: atomicrmw_xchg_i16_acq_rel:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 4
 | |
| ; RV32I-NEXT:    call __atomic_exchange_2
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_xchg_i16_acq_rel:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    lui a2, 16
 | |
| ; RV32IA-NEXT:    addi a2, a2, -1
 | |
| ; RV32IA-NEXT:    and a1, a1, a2
 | |
| ; RV32IA-NEXT:    slli a3, a0, 3
 | |
| ; RV32IA-NEXT:    andi a3, a3, 24
 | |
| ; RV32IA-NEXT:    sll a2, a2, a3
 | |
| ; RV32IA-NEXT:    sll a1, a1, a3
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB58_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w.aq a4, (a0)
 | |
| ; RV32IA-NEXT:    add a5, zero, a1
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    and a5, a5, a2
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    sc.w.rl a5, a5, (a0)
 | |
| ; RV32IA-NEXT:    bnez a5, .LBB58_1
 | |
| ; RV32IA-NEXT:  # %bb.2:
 | |
| ; RV32IA-NEXT:    srl a0, a4, a3
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw xchg i16* %a, i16 %b acq_rel
 | |
|   ret i16 %1
 | |
| }
 | |
| 
 | |
| define i16 @atomicrmw_xchg_i16_seq_cst(i16* %a, i16 %b) {
 | |
| ; RV32I-LABEL: atomicrmw_xchg_i16_seq_cst:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 5
 | |
| ; RV32I-NEXT:    call __atomic_exchange_2
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_xchg_i16_seq_cst:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    lui a2, 16
 | |
| ; RV32IA-NEXT:    addi a2, a2, -1
 | |
| ; RV32IA-NEXT:    and a1, a1, a2
 | |
| ; RV32IA-NEXT:    slli a3, a0, 3
 | |
| ; RV32IA-NEXT:    andi a3, a3, 24
 | |
| ; RV32IA-NEXT:    sll a2, a2, a3
 | |
| ; RV32IA-NEXT:    sll a1, a1, a3
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB59_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w.aqrl a4, (a0)
 | |
| ; RV32IA-NEXT:    add a5, zero, a1
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    and a5, a5, a2
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    sc.w.aqrl a5, a5, (a0)
 | |
| ; RV32IA-NEXT:    bnez a5, .LBB59_1
 | |
| ; RV32IA-NEXT:  # %bb.2:
 | |
| ; RV32IA-NEXT:    srl a0, a4, a3
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw xchg i16* %a, i16 %b seq_cst
 | |
|   ret i16 %1
 | |
| }
 | |
| 
 | |
| define i16 @atomicrmw_add_i16_monotonic(i16 *%a, i16 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_add_i16_monotonic:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    mv a2, zero
 | |
| ; RV32I-NEXT:    call __atomic_fetch_add_2
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_add_i16_monotonic:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    lui a2, 16
 | |
| ; RV32IA-NEXT:    addi a2, a2, -1
 | |
| ; RV32IA-NEXT:    and a1, a1, a2
 | |
| ; RV32IA-NEXT:    slli a3, a0, 3
 | |
| ; RV32IA-NEXT:    andi a3, a3, 24
 | |
| ; RV32IA-NEXT:    sll a2, a2, a3
 | |
| ; RV32IA-NEXT:    sll a1, a1, a3
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB60_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w a4, (a0)
 | |
| ; RV32IA-NEXT:    add a5, a4, a1
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    and a5, a5, a2
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    sc.w a5, a5, (a0)
 | |
| ; RV32IA-NEXT:    bnez a5, .LBB60_1
 | |
| ; RV32IA-NEXT:  # %bb.2:
 | |
| ; RV32IA-NEXT:    srl a0, a4, a3
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw add i16* %a, i16 %b monotonic
 | |
|   ret i16 %1
 | |
| }
 | |
| 
 | |
| define i16 @atomicrmw_add_i16_acquire(i16 *%a, i16 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_add_i16_acquire:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 2
 | |
| ; RV32I-NEXT:    call __atomic_fetch_add_2
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_add_i16_acquire:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    lui a2, 16
 | |
| ; RV32IA-NEXT:    addi a2, a2, -1
 | |
| ; RV32IA-NEXT:    and a1, a1, a2
 | |
| ; RV32IA-NEXT:    slli a3, a0, 3
 | |
| ; RV32IA-NEXT:    andi a3, a3, 24
 | |
| ; RV32IA-NEXT:    sll a2, a2, a3
 | |
| ; RV32IA-NEXT:    sll a1, a1, a3
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB61_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w.aq a4, (a0)
 | |
| ; RV32IA-NEXT:    add a5, a4, a1
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    and a5, a5, a2
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    sc.w a5, a5, (a0)
 | |
| ; RV32IA-NEXT:    bnez a5, .LBB61_1
 | |
| ; RV32IA-NEXT:  # %bb.2:
 | |
| ; RV32IA-NEXT:    srl a0, a4, a3
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw add i16* %a, i16 %b acquire
 | |
|   ret i16 %1
 | |
| }
 | |
| 
 | |
| define i16 @atomicrmw_add_i16_release(i16 *%a, i16 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_add_i16_release:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 3
 | |
| ; RV32I-NEXT:    call __atomic_fetch_add_2
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_add_i16_release:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    lui a2, 16
 | |
| ; RV32IA-NEXT:    addi a2, a2, -1
 | |
| ; RV32IA-NEXT:    and a1, a1, a2
 | |
| ; RV32IA-NEXT:    slli a3, a0, 3
 | |
| ; RV32IA-NEXT:    andi a3, a3, 24
 | |
| ; RV32IA-NEXT:    sll a2, a2, a3
 | |
| ; RV32IA-NEXT:    sll a1, a1, a3
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB62_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w a4, (a0)
 | |
| ; RV32IA-NEXT:    add a5, a4, a1
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    and a5, a5, a2
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    sc.w.rl a5, a5, (a0)
 | |
| ; RV32IA-NEXT:    bnez a5, .LBB62_1
 | |
| ; RV32IA-NEXT:  # %bb.2:
 | |
| ; RV32IA-NEXT:    srl a0, a4, a3
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw add i16* %a, i16 %b release
 | |
|   ret i16 %1
 | |
| }
 | |
| 
 | |
| define i16 @atomicrmw_add_i16_acq_rel(i16 *%a, i16 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_add_i16_acq_rel:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 4
 | |
| ; RV32I-NEXT:    call __atomic_fetch_add_2
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_add_i16_acq_rel:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    lui a2, 16
 | |
| ; RV32IA-NEXT:    addi a2, a2, -1
 | |
| ; RV32IA-NEXT:    and a1, a1, a2
 | |
| ; RV32IA-NEXT:    slli a3, a0, 3
 | |
| ; RV32IA-NEXT:    andi a3, a3, 24
 | |
| ; RV32IA-NEXT:    sll a2, a2, a3
 | |
| ; RV32IA-NEXT:    sll a1, a1, a3
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB63_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w.aq a4, (a0)
 | |
| ; RV32IA-NEXT:    add a5, a4, a1
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    and a5, a5, a2
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    sc.w.rl a5, a5, (a0)
 | |
| ; RV32IA-NEXT:    bnez a5, .LBB63_1
 | |
| ; RV32IA-NEXT:  # %bb.2:
 | |
| ; RV32IA-NEXT:    srl a0, a4, a3
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw add i16* %a, i16 %b acq_rel
 | |
|   ret i16 %1
 | |
| }
 | |
| 
 | |
| define i16 @atomicrmw_add_i16_seq_cst(i16 *%a, i16 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_add_i16_seq_cst:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 5
 | |
| ; RV32I-NEXT:    call __atomic_fetch_add_2
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_add_i16_seq_cst:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    lui a2, 16
 | |
| ; RV32IA-NEXT:    addi a2, a2, -1
 | |
| ; RV32IA-NEXT:    and a1, a1, a2
 | |
| ; RV32IA-NEXT:    slli a3, a0, 3
 | |
| ; RV32IA-NEXT:    andi a3, a3, 24
 | |
| ; RV32IA-NEXT:    sll a2, a2, a3
 | |
| ; RV32IA-NEXT:    sll a1, a1, a3
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB64_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w.aqrl a4, (a0)
 | |
| ; RV32IA-NEXT:    add a5, a4, a1
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    and a5, a5, a2
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    sc.w.aqrl a5, a5, (a0)
 | |
| ; RV32IA-NEXT:    bnez a5, .LBB64_1
 | |
| ; RV32IA-NEXT:  # %bb.2:
 | |
| ; RV32IA-NEXT:    srl a0, a4, a3
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw add i16* %a, i16 %b seq_cst
 | |
|   ret i16 %1
 | |
| }
 | |
| 
 | |
| define i16 @atomicrmw_sub_i16_monotonic(i16* %a, i16 %b) {
 | |
| ; RV32I-LABEL: atomicrmw_sub_i16_monotonic:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    mv a2, zero
 | |
| ; RV32I-NEXT:    call __atomic_fetch_sub_2
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_sub_i16_monotonic:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    lui a2, 16
 | |
| ; RV32IA-NEXT:    addi a2, a2, -1
 | |
| ; RV32IA-NEXT:    and a1, a1, a2
 | |
| ; RV32IA-NEXT:    slli a3, a0, 3
 | |
| ; RV32IA-NEXT:    andi a3, a3, 24
 | |
| ; RV32IA-NEXT:    sll a2, a2, a3
 | |
| ; RV32IA-NEXT:    sll a1, a1, a3
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB65_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w a4, (a0)
 | |
| ; RV32IA-NEXT:    sub a5, a4, a1
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    and a5, a5, a2
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    sc.w a5, a5, (a0)
 | |
| ; RV32IA-NEXT:    bnez a5, .LBB65_1
 | |
| ; RV32IA-NEXT:  # %bb.2:
 | |
| ; RV32IA-NEXT:    srl a0, a4, a3
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw sub i16* %a, i16 %b monotonic
 | |
|   ret i16 %1
 | |
| }
 | |
| 
 | |
| define i16 @atomicrmw_sub_i16_acquire(i16* %a, i16 %b) {
 | |
| ; RV32I-LABEL: atomicrmw_sub_i16_acquire:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 2
 | |
| ; RV32I-NEXT:    call __atomic_fetch_sub_2
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_sub_i16_acquire:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    lui a2, 16
 | |
| ; RV32IA-NEXT:    addi a2, a2, -1
 | |
| ; RV32IA-NEXT:    and a1, a1, a2
 | |
| ; RV32IA-NEXT:    slli a3, a0, 3
 | |
| ; RV32IA-NEXT:    andi a3, a3, 24
 | |
| ; RV32IA-NEXT:    sll a2, a2, a3
 | |
| ; RV32IA-NEXT:    sll a1, a1, a3
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB66_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w.aq a4, (a0)
 | |
| ; RV32IA-NEXT:    sub a5, a4, a1
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    and a5, a5, a2
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    sc.w a5, a5, (a0)
 | |
| ; RV32IA-NEXT:    bnez a5, .LBB66_1
 | |
| ; RV32IA-NEXT:  # %bb.2:
 | |
| ; RV32IA-NEXT:    srl a0, a4, a3
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw sub i16* %a, i16 %b acquire
 | |
|   ret i16 %1
 | |
| }
 | |
| 
 | |
| define i16 @atomicrmw_sub_i16_release(i16* %a, i16 %b) {
 | |
| ; RV32I-LABEL: atomicrmw_sub_i16_release:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 3
 | |
| ; RV32I-NEXT:    call __atomic_fetch_sub_2
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_sub_i16_release:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    lui a2, 16
 | |
| ; RV32IA-NEXT:    addi a2, a2, -1
 | |
| ; RV32IA-NEXT:    and a1, a1, a2
 | |
| ; RV32IA-NEXT:    slli a3, a0, 3
 | |
| ; RV32IA-NEXT:    andi a3, a3, 24
 | |
| ; RV32IA-NEXT:    sll a2, a2, a3
 | |
| ; RV32IA-NEXT:    sll a1, a1, a3
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB67_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w a4, (a0)
 | |
| ; RV32IA-NEXT:    sub a5, a4, a1
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    and a5, a5, a2
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    sc.w.rl a5, a5, (a0)
 | |
| ; RV32IA-NEXT:    bnez a5, .LBB67_1
 | |
| ; RV32IA-NEXT:  # %bb.2:
 | |
| ; RV32IA-NEXT:    srl a0, a4, a3
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw sub i16* %a, i16 %b release
 | |
|   ret i16 %1
 | |
| }
 | |
| 
 | |
| define i16 @atomicrmw_sub_i16_acq_rel(i16* %a, i16 %b) {
 | |
| ; RV32I-LABEL: atomicrmw_sub_i16_acq_rel:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 4
 | |
| ; RV32I-NEXT:    call __atomic_fetch_sub_2
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_sub_i16_acq_rel:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    lui a2, 16
 | |
| ; RV32IA-NEXT:    addi a2, a2, -1
 | |
| ; RV32IA-NEXT:    and a1, a1, a2
 | |
| ; RV32IA-NEXT:    slli a3, a0, 3
 | |
| ; RV32IA-NEXT:    andi a3, a3, 24
 | |
| ; RV32IA-NEXT:    sll a2, a2, a3
 | |
| ; RV32IA-NEXT:    sll a1, a1, a3
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB68_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w.aq a4, (a0)
 | |
| ; RV32IA-NEXT:    sub a5, a4, a1
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    and a5, a5, a2
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    sc.w.rl a5, a5, (a0)
 | |
| ; RV32IA-NEXT:    bnez a5, .LBB68_1
 | |
| ; RV32IA-NEXT:  # %bb.2:
 | |
| ; RV32IA-NEXT:    srl a0, a4, a3
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw sub i16* %a, i16 %b acq_rel
 | |
|   ret i16 %1
 | |
| }
 | |
| 
 | |
| define i16 @atomicrmw_sub_i16_seq_cst(i16* %a, i16 %b) {
 | |
| ; RV32I-LABEL: atomicrmw_sub_i16_seq_cst:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 5
 | |
| ; RV32I-NEXT:    call __atomic_fetch_sub_2
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_sub_i16_seq_cst:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    lui a2, 16
 | |
| ; RV32IA-NEXT:    addi a2, a2, -1
 | |
| ; RV32IA-NEXT:    and a1, a1, a2
 | |
| ; RV32IA-NEXT:    slli a3, a0, 3
 | |
| ; RV32IA-NEXT:    andi a3, a3, 24
 | |
| ; RV32IA-NEXT:    sll a2, a2, a3
 | |
| ; RV32IA-NEXT:    sll a1, a1, a3
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB69_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w.aqrl a4, (a0)
 | |
| ; RV32IA-NEXT:    sub a5, a4, a1
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    and a5, a5, a2
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    sc.w.aqrl a5, a5, (a0)
 | |
| ; RV32IA-NEXT:    bnez a5, .LBB69_1
 | |
| ; RV32IA-NEXT:  # %bb.2:
 | |
| ; RV32IA-NEXT:    srl a0, a4, a3
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw sub i16* %a, i16 %b seq_cst
 | |
|   ret i16 %1
 | |
| }
 | |
| 
 | |
| define i16 @atomicrmw_and_i16_monotonic(i16 *%a, i16 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_and_i16_monotonic:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    mv a2, zero
 | |
| ; RV32I-NEXT:    call __atomic_fetch_and_2
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_and_i16_monotonic:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    lui a2, 16
 | |
| ; RV32IA-NEXT:    addi a2, a2, -1
 | |
| ; RV32IA-NEXT:    and a1, a1, a2
 | |
| ; RV32IA-NEXT:    slli a3, a0, 3
 | |
| ; RV32IA-NEXT:    andi a3, a3, 24
 | |
| ; RV32IA-NEXT:    sll a1, a1, a3
 | |
| ; RV32IA-NEXT:    sll a2, a2, a3
 | |
| ; RV32IA-NEXT:    not a2, a2
 | |
| ; RV32IA-NEXT:    or a1, a2, a1
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:    amoand.w a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    srl a0, a0, a3
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw and i16* %a, i16 %b monotonic
 | |
|   ret i16 %1
 | |
| }
 | |
| 
 | |
| define i16 @atomicrmw_and_i16_acquire(i16 *%a, i16 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_and_i16_acquire:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 2
 | |
| ; RV32I-NEXT:    call __atomic_fetch_and_2
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_and_i16_acquire:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    lui a2, 16
 | |
| ; RV32IA-NEXT:    addi a2, a2, -1
 | |
| ; RV32IA-NEXT:    and a1, a1, a2
 | |
| ; RV32IA-NEXT:    slli a3, a0, 3
 | |
| ; RV32IA-NEXT:    andi a3, a3, 24
 | |
| ; RV32IA-NEXT:    sll a1, a1, a3
 | |
| ; RV32IA-NEXT:    sll a2, a2, a3
 | |
| ; RV32IA-NEXT:    not a2, a2
 | |
| ; RV32IA-NEXT:    or a1, a2, a1
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:    amoand.w.aq a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    srl a0, a0, a3
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw and i16* %a, i16 %b acquire
 | |
|   ret i16 %1
 | |
| }
 | |
| 
 | |
| define i16 @atomicrmw_and_i16_release(i16 *%a, i16 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_and_i16_release:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 3
 | |
| ; RV32I-NEXT:    call __atomic_fetch_and_2
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_and_i16_release:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    lui a2, 16
 | |
| ; RV32IA-NEXT:    addi a2, a2, -1
 | |
| ; RV32IA-NEXT:    and a1, a1, a2
 | |
| ; RV32IA-NEXT:    slli a3, a0, 3
 | |
| ; RV32IA-NEXT:    andi a3, a3, 24
 | |
| ; RV32IA-NEXT:    sll a1, a1, a3
 | |
| ; RV32IA-NEXT:    sll a2, a2, a3
 | |
| ; RV32IA-NEXT:    not a2, a2
 | |
| ; RV32IA-NEXT:    or a1, a2, a1
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:    amoand.w.rl a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    srl a0, a0, a3
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw and i16* %a, i16 %b release
 | |
|   ret i16 %1
 | |
| }
 | |
| 
 | |
| define i16 @atomicrmw_and_i16_acq_rel(i16 *%a, i16 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_and_i16_acq_rel:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 4
 | |
| ; RV32I-NEXT:    call __atomic_fetch_and_2
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_and_i16_acq_rel:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    lui a2, 16
 | |
| ; RV32IA-NEXT:    addi a2, a2, -1
 | |
| ; RV32IA-NEXT:    and a1, a1, a2
 | |
| ; RV32IA-NEXT:    slli a3, a0, 3
 | |
| ; RV32IA-NEXT:    andi a3, a3, 24
 | |
| ; RV32IA-NEXT:    sll a1, a1, a3
 | |
| ; RV32IA-NEXT:    sll a2, a2, a3
 | |
| ; RV32IA-NEXT:    not a2, a2
 | |
| ; RV32IA-NEXT:    or a1, a2, a1
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:    amoand.w.aqrl a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    srl a0, a0, a3
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw and i16* %a, i16 %b acq_rel
 | |
|   ret i16 %1
 | |
| }
 | |
| 
 | |
| define i16 @atomicrmw_and_i16_seq_cst(i16 *%a, i16 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_and_i16_seq_cst:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 5
 | |
| ; RV32I-NEXT:    call __atomic_fetch_and_2
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_and_i16_seq_cst:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    lui a2, 16
 | |
| ; RV32IA-NEXT:    addi a2, a2, -1
 | |
| ; RV32IA-NEXT:    and a1, a1, a2
 | |
| ; RV32IA-NEXT:    slli a3, a0, 3
 | |
| ; RV32IA-NEXT:    andi a3, a3, 24
 | |
| ; RV32IA-NEXT:    sll a1, a1, a3
 | |
| ; RV32IA-NEXT:    sll a2, a2, a3
 | |
| ; RV32IA-NEXT:    not a2, a2
 | |
| ; RV32IA-NEXT:    or a1, a2, a1
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:    amoand.w.aqrl a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    srl a0, a0, a3
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw and i16* %a, i16 %b seq_cst
 | |
|   ret i16 %1
 | |
| }
 | |
| 
 | |
| define i16 @atomicrmw_nand_i16_monotonic(i16* %a, i16 %b) {
 | |
| ; RV32I-LABEL: atomicrmw_nand_i16_monotonic:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    mv a2, zero
 | |
| ; RV32I-NEXT:    call __atomic_fetch_nand_2
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_nand_i16_monotonic:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    lui a2, 16
 | |
| ; RV32IA-NEXT:    addi a2, a2, -1
 | |
| ; RV32IA-NEXT:    and a1, a1, a2
 | |
| ; RV32IA-NEXT:    slli a3, a0, 3
 | |
| ; RV32IA-NEXT:    andi a3, a3, 24
 | |
| ; RV32IA-NEXT:    sll a2, a2, a3
 | |
| ; RV32IA-NEXT:    sll a1, a1, a3
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB75_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w a4, (a0)
 | |
| ; RV32IA-NEXT:    and a5, a4, a1
 | |
| ; RV32IA-NEXT:    not a5, a5
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    and a5, a5, a2
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    sc.w a5, a5, (a0)
 | |
| ; RV32IA-NEXT:    bnez a5, .LBB75_1
 | |
| ; RV32IA-NEXT:  # %bb.2:
 | |
| ; RV32IA-NEXT:    srl a0, a4, a3
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw nand i16* %a, i16 %b monotonic
 | |
|   ret i16 %1
 | |
| }
 | |
| 
 | |
| define i16 @atomicrmw_nand_i16_acquire(i16* %a, i16 %b) {
 | |
| ; RV32I-LABEL: atomicrmw_nand_i16_acquire:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 2
 | |
| ; RV32I-NEXT:    call __atomic_fetch_nand_2
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_nand_i16_acquire:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    lui a2, 16
 | |
| ; RV32IA-NEXT:    addi a2, a2, -1
 | |
| ; RV32IA-NEXT:    and a1, a1, a2
 | |
| ; RV32IA-NEXT:    slli a3, a0, 3
 | |
| ; RV32IA-NEXT:    andi a3, a3, 24
 | |
| ; RV32IA-NEXT:    sll a2, a2, a3
 | |
| ; RV32IA-NEXT:    sll a1, a1, a3
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB76_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w.aq a4, (a0)
 | |
| ; RV32IA-NEXT:    and a5, a4, a1
 | |
| ; RV32IA-NEXT:    not a5, a5
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    and a5, a5, a2
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    sc.w a5, a5, (a0)
 | |
| ; RV32IA-NEXT:    bnez a5, .LBB76_1
 | |
| ; RV32IA-NEXT:  # %bb.2:
 | |
| ; RV32IA-NEXT:    srl a0, a4, a3
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw nand i16* %a, i16 %b acquire
 | |
|   ret i16 %1
 | |
| }
 | |
| 
 | |
| define i16 @atomicrmw_nand_i16_release(i16* %a, i16 %b) {
 | |
| ; RV32I-LABEL: atomicrmw_nand_i16_release:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 3
 | |
| ; RV32I-NEXT:    call __atomic_fetch_nand_2
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_nand_i16_release:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    lui a2, 16
 | |
| ; RV32IA-NEXT:    addi a2, a2, -1
 | |
| ; RV32IA-NEXT:    and a1, a1, a2
 | |
| ; RV32IA-NEXT:    slli a3, a0, 3
 | |
| ; RV32IA-NEXT:    andi a3, a3, 24
 | |
| ; RV32IA-NEXT:    sll a2, a2, a3
 | |
| ; RV32IA-NEXT:    sll a1, a1, a3
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB77_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w a4, (a0)
 | |
| ; RV32IA-NEXT:    and a5, a4, a1
 | |
| ; RV32IA-NEXT:    not a5, a5
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    and a5, a5, a2
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    sc.w.rl a5, a5, (a0)
 | |
| ; RV32IA-NEXT:    bnez a5, .LBB77_1
 | |
| ; RV32IA-NEXT:  # %bb.2:
 | |
| ; RV32IA-NEXT:    srl a0, a4, a3
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw nand i16* %a, i16 %b release
 | |
|   ret i16 %1
 | |
| }
 | |
| 
 | |
| define i16 @atomicrmw_nand_i16_acq_rel(i16* %a, i16 %b) {
 | |
| ; RV32I-LABEL: atomicrmw_nand_i16_acq_rel:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 4
 | |
| ; RV32I-NEXT:    call __atomic_fetch_nand_2
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_nand_i16_acq_rel:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    lui a2, 16
 | |
| ; RV32IA-NEXT:    addi a2, a2, -1
 | |
| ; RV32IA-NEXT:    and a1, a1, a2
 | |
| ; RV32IA-NEXT:    slli a3, a0, 3
 | |
| ; RV32IA-NEXT:    andi a3, a3, 24
 | |
| ; RV32IA-NEXT:    sll a2, a2, a3
 | |
| ; RV32IA-NEXT:    sll a1, a1, a3
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB78_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w.aq a4, (a0)
 | |
| ; RV32IA-NEXT:    and a5, a4, a1
 | |
| ; RV32IA-NEXT:    not a5, a5
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    and a5, a5, a2
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    sc.w.rl a5, a5, (a0)
 | |
| ; RV32IA-NEXT:    bnez a5, .LBB78_1
 | |
| ; RV32IA-NEXT:  # %bb.2:
 | |
| ; RV32IA-NEXT:    srl a0, a4, a3
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw nand i16* %a, i16 %b acq_rel
 | |
|   ret i16 %1
 | |
| }
 | |
| 
 | |
| define i16 @atomicrmw_nand_i16_seq_cst(i16* %a, i16 %b) {
 | |
| ; RV32I-LABEL: atomicrmw_nand_i16_seq_cst:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 5
 | |
| ; RV32I-NEXT:    call __atomic_fetch_nand_2
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_nand_i16_seq_cst:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    lui a2, 16
 | |
| ; RV32IA-NEXT:    addi a2, a2, -1
 | |
| ; RV32IA-NEXT:    and a1, a1, a2
 | |
| ; RV32IA-NEXT:    slli a3, a0, 3
 | |
| ; RV32IA-NEXT:    andi a3, a3, 24
 | |
| ; RV32IA-NEXT:    sll a2, a2, a3
 | |
| ; RV32IA-NEXT:    sll a1, a1, a3
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB79_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w.aqrl a4, (a0)
 | |
| ; RV32IA-NEXT:    and a5, a4, a1
 | |
| ; RV32IA-NEXT:    not a5, a5
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    and a5, a5, a2
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:    sc.w.aqrl a5, a5, (a0)
 | |
| ; RV32IA-NEXT:    bnez a5, .LBB79_1
 | |
| ; RV32IA-NEXT:  # %bb.2:
 | |
| ; RV32IA-NEXT:    srl a0, a4, a3
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw nand i16* %a, i16 %b seq_cst
 | |
|   ret i16 %1
 | |
| }
 | |
| 
 | |
| define i16 @atomicrmw_or_i16_monotonic(i16 *%a, i16 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_or_i16_monotonic:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    mv a2, zero
 | |
| ; RV32I-NEXT:    call __atomic_fetch_or_2
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_or_i16_monotonic:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    lui a2, 16
 | |
| ; RV32IA-NEXT:    addi a2, a2, -1
 | |
| ; RV32IA-NEXT:    and a1, a1, a2
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:    amoor.w a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    srl a0, a0, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw or i16* %a, i16 %b monotonic
 | |
|   ret i16 %1
 | |
| }
 | |
| 
 | |
| define i16 @atomicrmw_or_i16_acquire(i16 *%a, i16 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_or_i16_acquire:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 2
 | |
| ; RV32I-NEXT:    call __atomic_fetch_or_2
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_or_i16_acquire:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    lui a2, 16
 | |
| ; RV32IA-NEXT:    addi a2, a2, -1
 | |
| ; RV32IA-NEXT:    and a1, a1, a2
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:    amoor.w.aq a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    srl a0, a0, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw or i16* %a, i16 %b acquire
 | |
|   ret i16 %1
 | |
| }
 | |
| 
 | |
| define i16 @atomicrmw_or_i16_release(i16 *%a, i16 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_or_i16_release:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 3
 | |
| ; RV32I-NEXT:    call __atomic_fetch_or_2
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_or_i16_release:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    lui a2, 16
 | |
| ; RV32IA-NEXT:    addi a2, a2, -1
 | |
| ; RV32IA-NEXT:    and a1, a1, a2
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:    amoor.w.rl a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    srl a0, a0, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw or i16* %a, i16 %b release
 | |
|   ret i16 %1
 | |
| }
 | |
| 
 | |
| define i16 @atomicrmw_or_i16_acq_rel(i16 *%a, i16 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_or_i16_acq_rel:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 4
 | |
| ; RV32I-NEXT:    call __atomic_fetch_or_2
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_or_i16_acq_rel:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    lui a2, 16
 | |
| ; RV32IA-NEXT:    addi a2, a2, -1
 | |
| ; RV32IA-NEXT:    and a1, a1, a2
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:    amoor.w.aqrl a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    srl a0, a0, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw or i16* %a, i16 %b acq_rel
 | |
|   ret i16 %1
 | |
| }
 | |
| 
 | |
| define i16 @atomicrmw_or_i16_seq_cst(i16 *%a, i16 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_or_i16_seq_cst:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 5
 | |
| ; RV32I-NEXT:    call __atomic_fetch_or_2
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_or_i16_seq_cst:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    lui a2, 16
 | |
| ; RV32IA-NEXT:    addi a2, a2, -1
 | |
| ; RV32IA-NEXT:    and a1, a1, a2
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:    amoor.w.aqrl a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    srl a0, a0, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw or i16* %a, i16 %b seq_cst
 | |
|   ret i16 %1
 | |
| }
 | |
| 
 | |
| define i16 @atomicrmw_xor_i16_monotonic(i16 *%a, i16 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_xor_i16_monotonic:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    mv a2, zero
 | |
| ; RV32I-NEXT:    call __atomic_fetch_xor_2
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_xor_i16_monotonic:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    lui a2, 16
 | |
| ; RV32IA-NEXT:    addi a2, a2, -1
 | |
| ; RV32IA-NEXT:    and a1, a1, a2
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:    amoxor.w a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    srl a0, a0, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw xor i16* %a, i16 %b monotonic
 | |
|   ret i16 %1
 | |
| }
 | |
| 
 | |
| define i16 @atomicrmw_xor_i16_acquire(i16 *%a, i16 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_xor_i16_acquire:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 2
 | |
| ; RV32I-NEXT:    call __atomic_fetch_xor_2
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_xor_i16_acquire:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    lui a2, 16
 | |
| ; RV32IA-NEXT:    addi a2, a2, -1
 | |
| ; RV32IA-NEXT:    and a1, a1, a2
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:    amoxor.w.aq a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    srl a0, a0, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw xor i16* %a, i16 %b acquire
 | |
|   ret i16 %1
 | |
| }
 | |
| 
 | |
| define i16 @atomicrmw_xor_i16_release(i16 *%a, i16 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_xor_i16_release:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 3
 | |
| ; RV32I-NEXT:    call __atomic_fetch_xor_2
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_xor_i16_release:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    lui a2, 16
 | |
| ; RV32IA-NEXT:    addi a2, a2, -1
 | |
| ; RV32IA-NEXT:    and a1, a1, a2
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:    amoxor.w.rl a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    srl a0, a0, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw xor i16* %a, i16 %b release
 | |
|   ret i16 %1
 | |
| }
 | |
| 
 | |
| define i16 @atomicrmw_xor_i16_acq_rel(i16 *%a, i16 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_xor_i16_acq_rel:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 4
 | |
| ; RV32I-NEXT:    call __atomic_fetch_xor_2
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_xor_i16_acq_rel:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    lui a2, 16
 | |
| ; RV32IA-NEXT:    addi a2, a2, -1
 | |
| ; RV32IA-NEXT:    and a1, a1, a2
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:    amoxor.w.aqrl a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    srl a0, a0, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw xor i16* %a, i16 %b acq_rel
 | |
|   ret i16 %1
 | |
| }
 | |
| 
 | |
| define i16 @atomicrmw_xor_i16_seq_cst(i16 *%a, i16 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_xor_i16_seq_cst:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 5
 | |
| ; RV32I-NEXT:    call __atomic_fetch_xor_2
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_xor_i16_seq_cst:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    lui a2, 16
 | |
| ; RV32IA-NEXT:    addi a2, a2, -1
 | |
| ; RV32IA-NEXT:    and a1, a1, a2
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:    amoxor.w.aqrl a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    srl a0, a0, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw xor i16* %a, i16 %b seq_cst
 | |
|   ret i16 %1
 | |
| }
 | |
| 
 | |
| define i16 @atomicrmw_max_i16_monotonic(i16 *%a, i16 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_max_i16_monotonic:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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 s2, a1
 | |
| ; 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, 10
 | |
| ; RV32I-NEXT:  .LBB90_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 s1, a1, .LBB90_3
 | |
| ; RV32I-NEXT:  # %bb.2: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB90_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a2, s2
 | |
| ; RV32I-NEXT:  .LBB90_3: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB90_1 Depth=1
 | |
| ; RV32I-NEXT:    sh a0, 10(sp)
 | |
| ; RV32I-NEXT:    mv a0, s4
 | |
| ; RV32I-NEXT:    mv a1, s3
 | |
| ; RV32I-NEXT:    mv a3, zero
 | |
| ; RV32I-NEXT:    mv a4, zero
 | |
| ; RV32I-NEXT:    call __atomic_compare_exchange_2
 | |
| ; RV32I-NEXT:    mv a1, a0
 | |
| ; RV32I-NEXT:    lh a0, 10(sp)
 | |
| ; RV32I-NEXT:    beqz a1, .LBB90_1
 | |
| ; RV32I-NEXT:  # %bb.4: # %atomicrmw.end
 | |
| ; 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_i16_monotonic:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    addi a3, zero, 16
 | |
| ; RV32IA-NEXT:    sub a6, a3, a2
 | |
| ; RV32IA-NEXT:    lui a4, 16
 | |
| ; RV32IA-NEXT:    addi a4, a4, -1
 | |
| ; RV32IA-NEXT:    sll a7, a4, a2
 | |
| ; RV32IA-NEXT:    slli a1, a1, 16
 | |
| ; RV32IA-NEXT:    srai a1, a1, 16
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB90_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w a5, (a0)
 | |
| ; RV32IA-NEXT:    and a4, a5, a7
 | |
| ; RV32IA-NEXT:    mv a3, a5
 | |
| ; RV32IA-NEXT:    sll a4, a4, a6
 | |
| ; RV32IA-NEXT:    sra a4, a4, a6
 | |
| ; RV32IA-NEXT:    bge a4, a1, .LBB90_3
 | |
| ; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB90_1 Depth=1
 | |
| ; RV32IA-NEXT:    xor a3, a5, a1
 | |
| ; RV32IA-NEXT:    and a3, a3, a7
 | |
| ; RV32IA-NEXT:    xor a3, a5, a3
 | |
| ; RV32IA-NEXT:  .LBB90_3: # in Loop: Header=BB90_1 Depth=1
 | |
| ; RV32IA-NEXT:    sc.w a3, a3, (a0)
 | |
| ; RV32IA-NEXT:    bnez a3, .LBB90_1
 | |
| ; RV32IA-NEXT:  # %bb.4:
 | |
| ; RV32IA-NEXT:    srl a0, a5, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw max i16* %a, i16 %b monotonic
 | |
|   ret i16 %1
 | |
| }
 | |
| 
 | |
| define i16 @atomicrmw_max_i16_acquire(i16 *%a, i16 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_max_i16_acquire:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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 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:  .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:  # %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:    mv a0, s4
 | |
| ; RV32I-NEXT:    mv a1, s3
 | |
| ; RV32I-NEXT:    mv a3, s1
 | |
| ; RV32I-NEXT:    mv a4, s1
 | |
| ; RV32I-NEXT:    call __atomic_compare_exchange_2
 | |
| ; RV32I-NEXT:    mv a1, a0
 | |
| ; RV32I-NEXT:    lh a0, 6(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)
 | |
| ; 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_i16_acquire:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    addi a3, zero, 16
 | |
| ; RV32IA-NEXT:    sub a6, a3, a2
 | |
| ; RV32IA-NEXT:    lui a4, 16
 | |
| ; RV32IA-NEXT:    addi a4, a4, -1
 | |
| ; RV32IA-NEXT:    sll a7, a4, a2
 | |
| ; RV32IA-NEXT:    slli a1, a1, 16
 | |
| ; RV32IA-NEXT:    srai a1, a1, 16
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB91_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w.aq a5, (a0)
 | |
| ; RV32IA-NEXT:    and a4, a5, a7
 | |
| ; RV32IA-NEXT:    mv a3, a5
 | |
| ; RV32IA-NEXT:    sll a4, a4, a6
 | |
| ; RV32IA-NEXT:    sra a4, a4, a6
 | |
| ; RV32IA-NEXT:    bge a4, a1, .LBB91_3
 | |
| ; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB91_1 Depth=1
 | |
| ; RV32IA-NEXT:    xor a3, a5, a1
 | |
| ; RV32IA-NEXT:    and a3, a3, a7
 | |
| ; RV32IA-NEXT:    xor a3, a5, a3
 | |
| ; RV32IA-NEXT:  .LBB91_3: # in Loop: Header=BB91_1 Depth=1
 | |
| ; RV32IA-NEXT:    sc.w a3, a3, (a0)
 | |
| ; RV32IA-NEXT:    bnez a3, .LBB91_1
 | |
| ; RV32IA-NEXT:  # %bb.4:
 | |
| ; RV32IA-NEXT:    srl a0, a5, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw max i16* %a, i16 %b acquire
 | |
|   ret i16 %1
 | |
| }
 | |
| 
 | |
| define i16 @atomicrmw_max_i16_release(i16 *%a, i16 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_max_i16_release:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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 s5, 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:  .LBB92_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 s1, a1, .LBB92_3
 | |
| ; RV32I-NEXT:  # %bb.2: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB92_1 Depth=1
 | |
| ; 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:    mv a1, s3
 | |
| ; RV32I-NEXT:    mv a3, s4
 | |
| ; 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:    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)
 | |
| ; 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_i16_release:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    addi a3, zero, 16
 | |
| ; RV32IA-NEXT:    sub a6, a3, a2
 | |
| ; RV32IA-NEXT:    lui a4, 16
 | |
| ; RV32IA-NEXT:    addi a4, a4, -1
 | |
| ; RV32IA-NEXT:    sll a7, a4, a2
 | |
| ; RV32IA-NEXT:    slli a1, a1, 16
 | |
| ; RV32IA-NEXT:    srai a1, a1, 16
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB92_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w a5, (a0)
 | |
| ; RV32IA-NEXT:    and a4, a5, a7
 | |
| ; RV32IA-NEXT:    mv a3, a5
 | |
| ; RV32IA-NEXT:    sll a4, a4, a6
 | |
| ; RV32IA-NEXT:    sra a4, a4, a6
 | |
| ; RV32IA-NEXT:    bge a4, a1, .LBB92_3
 | |
| ; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB92_1 Depth=1
 | |
| ; RV32IA-NEXT:    xor a3, a5, a1
 | |
| ; RV32IA-NEXT:    and a3, a3, a7
 | |
| ; RV32IA-NEXT:    xor a3, a5, a3
 | |
| ; RV32IA-NEXT:  .LBB92_3: # in Loop: Header=BB92_1 Depth=1
 | |
| ; RV32IA-NEXT:    sc.w.rl a3, a3, (a0)
 | |
| ; RV32IA-NEXT:    bnez a3, .LBB92_1
 | |
| ; RV32IA-NEXT:  # %bb.4:
 | |
| ; RV32IA-NEXT:    srl a0, a5, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw max i16* %a, i16 %b release
 | |
|   ret i16 %1
 | |
| }
 | |
| 
 | |
| define i16 @atomicrmw_max_i16_acq_rel(i16 *%a, i16 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_max_i16_acq_rel:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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:    sw s6, 4(sp)
 | |
| ; RV32I-NEXT:    mv s2, a1
 | |
| ; RV32I-NEXT:    mv s6, 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:  .LBB93_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 s1, a1, .LBB93_3
 | |
| ; RV32I-NEXT:  # %bb.2: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB93_1 Depth=1
 | |
| ; 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:    mv a1, s3
 | |
| ; RV32I-NEXT:    mv a3, s4
 | |
| ; RV32I-NEXT:    mv a4, s5
 | |
| ; RV32I-NEXT:    call __atomic_compare_exchange_2
 | |
| ; RV32I-NEXT:    mv a1, a0
 | |
| ; RV32I-NEXT:    lh a0, 2(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)
 | |
| ; 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_i16_acq_rel:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    addi a3, zero, 16
 | |
| ; RV32IA-NEXT:    sub a6, a3, a2
 | |
| ; RV32IA-NEXT:    lui a4, 16
 | |
| ; RV32IA-NEXT:    addi a4, a4, -1
 | |
| ; RV32IA-NEXT:    sll a7, a4, a2
 | |
| ; RV32IA-NEXT:    slli a1, a1, 16
 | |
| ; RV32IA-NEXT:    srai a1, a1, 16
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB93_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w.aq a5, (a0)
 | |
| ; RV32IA-NEXT:    and a4, a5, a7
 | |
| ; RV32IA-NEXT:    mv a3, a5
 | |
| ; RV32IA-NEXT:    sll a4, a4, a6
 | |
| ; RV32IA-NEXT:    sra a4, a4, a6
 | |
| ; RV32IA-NEXT:    bge a4, a1, .LBB93_3
 | |
| ; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB93_1 Depth=1
 | |
| ; RV32IA-NEXT:    xor a3, a5, a1
 | |
| ; RV32IA-NEXT:    and a3, a3, a7
 | |
| ; RV32IA-NEXT:    xor a3, a5, a3
 | |
| ; RV32IA-NEXT:  .LBB93_3: # in Loop: Header=BB93_1 Depth=1
 | |
| ; RV32IA-NEXT:    sc.w.rl a3, a3, (a0)
 | |
| ; RV32IA-NEXT:    bnez a3, .LBB93_1
 | |
| ; RV32IA-NEXT:  # %bb.4:
 | |
| ; RV32IA-NEXT:    srl a0, a5, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw max i16* %a, i16 %b acq_rel
 | |
|   ret i16 %1
 | |
| }
 | |
| 
 | |
| define i16 @atomicrmw_max_i16_seq_cst(i16 *%a, i16 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_max_i16_seq_cst:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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 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:  .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:  # %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:    mv a0, s4
 | |
| ; RV32I-NEXT:    mv a1, s3
 | |
| ; RV32I-NEXT:    mv a3, s1
 | |
| ; RV32I-NEXT:    mv a4, s1
 | |
| ; RV32I-NEXT:    call __atomic_compare_exchange_2
 | |
| ; RV32I-NEXT:    mv a1, a0
 | |
| ; RV32I-NEXT:    lh a0, 6(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)
 | |
| ; 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_i16_seq_cst:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    addi a3, zero, 16
 | |
| ; RV32IA-NEXT:    sub a6, a3, a2
 | |
| ; RV32IA-NEXT:    lui a4, 16
 | |
| ; RV32IA-NEXT:    addi a4, a4, -1
 | |
| ; RV32IA-NEXT:    sll a7, a4, a2
 | |
| ; RV32IA-NEXT:    slli a1, a1, 16
 | |
| ; RV32IA-NEXT:    srai a1, a1, 16
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB94_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w.aqrl a5, (a0)
 | |
| ; RV32IA-NEXT:    and a4, a5, a7
 | |
| ; RV32IA-NEXT:    mv a3, a5
 | |
| ; RV32IA-NEXT:    sll a4, a4, a6
 | |
| ; RV32IA-NEXT:    sra a4, a4, a6
 | |
| ; RV32IA-NEXT:    bge a4, a1, .LBB94_3
 | |
| ; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB94_1 Depth=1
 | |
| ; RV32IA-NEXT:    xor a3, a5, a1
 | |
| ; RV32IA-NEXT:    and a3, a3, a7
 | |
| ; RV32IA-NEXT:    xor a3, a5, a3
 | |
| ; RV32IA-NEXT:  .LBB94_3: # in Loop: Header=BB94_1 Depth=1
 | |
| ; RV32IA-NEXT:    sc.w.aqrl a3, a3, (a0)
 | |
| ; RV32IA-NEXT:    bnez a3, .LBB94_1
 | |
| ; RV32IA-NEXT:  # %bb.4:
 | |
| ; RV32IA-NEXT:    srl a0, a5, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw max i16* %a, i16 %b seq_cst
 | |
|   ret i16 %1
 | |
| }
 | |
| 
 | |
| define i16 @atomicrmw_min_i16_monotonic(i16 *%a, i16 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_min_i16_monotonic:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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 s2, a1
 | |
| ; 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, 10
 | |
| ; RV32I-NEXT:  .LBB95_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 s1, a1, .LBB95_3
 | |
| ; RV32I-NEXT:  # %bb.2: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB95_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a2, s2
 | |
| ; RV32I-NEXT:  .LBB95_3: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB95_1 Depth=1
 | |
| ; RV32I-NEXT:    sh a0, 10(sp)
 | |
| ; RV32I-NEXT:    mv a0, s4
 | |
| ; RV32I-NEXT:    mv a1, s3
 | |
| ; RV32I-NEXT:    mv a3, zero
 | |
| ; RV32I-NEXT:    mv a4, zero
 | |
| ; RV32I-NEXT:    call __atomic_compare_exchange_2
 | |
| ; RV32I-NEXT:    mv a1, a0
 | |
| ; RV32I-NEXT:    lh a0, 10(sp)
 | |
| ; RV32I-NEXT:    beqz a1, .LBB95_1
 | |
| ; RV32I-NEXT:  # %bb.4: # %atomicrmw.end
 | |
| ; 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_i16_monotonic:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    addi a3, zero, 16
 | |
| ; RV32IA-NEXT:    sub a6, a3, a2
 | |
| ; RV32IA-NEXT:    lui a4, 16
 | |
| ; RV32IA-NEXT:    addi a4, a4, -1
 | |
| ; RV32IA-NEXT:    sll a7, a4, a2
 | |
| ; RV32IA-NEXT:    slli a1, a1, 16
 | |
| ; RV32IA-NEXT:    srai a1, a1, 16
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB95_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w a5, (a0)
 | |
| ; RV32IA-NEXT:    and a4, a5, a7
 | |
| ; RV32IA-NEXT:    mv a3, a5
 | |
| ; RV32IA-NEXT:    sll a4, a4, a6
 | |
| ; RV32IA-NEXT:    sra a4, a4, a6
 | |
| ; RV32IA-NEXT:    bge a1, a4, .LBB95_3
 | |
| ; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB95_1 Depth=1
 | |
| ; RV32IA-NEXT:    xor a3, a5, a1
 | |
| ; RV32IA-NEXT:    and a3, a3, a7
 | |
| ; RV32IA-NEXT:    xor a3, a5, a3
 | |
| ; RV32IA-NEXT:  .LBB95_3: # in Loop: Header=BB95_1 Depth=1
 | |
| ; RV32IA-NEXT:    sc.w a3, a3, (a0)
 | |
| ; RV32IA-NEXT:    bnez a3, .LBB95_1
 | |
| ; RV32IA-NEXT:  # %bb.4:
 | |
| ; RV32IA-NEXT:    srl a0, a5, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw min i16* %a, i16 %b monotonic
 | |
|   ret i16 %1
 | |
| }
 | |
| 
 | |
| define i16 @atomicrmw_min_i16_acquire(i16 *%a, i16 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_min_i16_acquire:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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 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:  .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:  # %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:    mv a0, s4
 | |
| ; RV32I-NEXT:    mv a1, s3
 | |
| ; RV32I-NEXT:    mv a3, s1
 | |
| ; RV32I-NEXT:    mv a4, s1
 | |
| ; RV32I-NEXT:    call __atomic_compare_exchange_2
 | |
| ; RV32I-NEXT:    mv a1, a0
 | |
| ; RV32I-NEXT:    lh a0, 6(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)
 | |
| ; 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_i16_acquire:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    addi a3, zero, 16
 | |
| ; RV32IA-NEXT:    sub a6, a3, a2
 | |
| ; RV32IA-NEXT:    lui a4, 16
 | |
| ; RV32IA-NEXT:    addi a4, a4, -1
 | |
| ; RV32IA-NEXT:    sll a7, a4, a2
 | |
| ; RV32IA-NEXT:    slli a1, a1, 16
 | |
| ; RV32IA-NEXT:    srai a1, a1, 16
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB96_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w.aq a5, (a0)
 | |
| ; RV32IA-NEXT:    and a4, a5, a7
 | |
| ; RV32IA-NEXT:    mv a3, a5
 | |
| ; RV32IA-NEXT:    sll a4, a4, a6
 | |
| ; RV32IA-NEXT:    sra a4, a4, a6
 | |
| ; RV32IA-NEXT:    bge a1, a4, .LBB96_3
 | |
| ; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB96_1 Depth=1
 | |
| ; RV32IA-NEXT:    xor a3, a5, a1
 | |
| ; RV32IA-NEXT:    and a3, a3, a7
 | |
| ; RV32IA-NEXT:    xor a3, a5, a3
 | |
| ; RV32IA-NEXT:  .LBB96_3: # in Loop: Header=BB96_1 Depth=1
 | |
| ; RV32IA-NEXT:    sc.w a3, a3, (a0)
 | |
| ; RV32IA-NEXT:    bnez a3, .LBB96_1
 | |
| ; RV32IA-NEXT:  # %bb.4:
 | |
| ; RV32IA-NEXT:    srl a0, a5, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw min i16* %a, i16 %b acquire
 | |
|   ret i16 %1
 | |
| }
 | |
| 
 | |
| define i16 @atomicrmw_min_i16_release(i16 *%a, i16 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_min_i16_release:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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 s5, 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:  .LBB97_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 s1, a1, .LBB97_3
 | |
| ; RV32I-NEXT:  # %bb.2: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB97_1 Depth=1
 | |
| ; 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:    mv a1, s3
 | |
| ; RV32I-NEXT:    mv a3, s4
 | |
| ; 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:    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)
 | |
| ; 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_i16_release:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    addi a3, zero, 16
 | |
| ; RV32IA-NEXT:    sub a6, a3, a2
 | |
| ; RV32IA-NEXT:    lui a4, 16
 | |
| ; RV32IA-NEXT:    addi a4, a4, -1
 | |
| ; RV32IA-NEXT:    sll a7, a4, a2
 | |
| ; RV32IA-NEXT:    slli a1, a1, 16
 | |
| ; RV32IA-NEXT:    srai a1, a1, 16
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB97_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w a5, (a0)
 | |
| ; RV32IA-NEXT:    and a4, a5, a7
 | |
| ; RV32IA-NEXT:    mv a3, a5
 | |
| ; RV32IA-NEXT:    sll a4, a4, a6
 | |
| ; RV32IA-NEXT:    sra a4, a4, a6
 | |
| ; RV32IA-NEXT:    bge a1, a4, .LBB97_3
 | |
| ; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB97_1 Depth=1
 | |
| ; RV32IA-NEXT:    xor a3, a5, a1
 | |
| ; RV32IA-NEXT:    and a3, a3, a7
 | |
| ; RV32IA-NEXT:    xor a3, a5, a3
 | |
| ; RV32IA-NEXT:  .LBB97_3: # in Loop: Header=BB97_1 Depth=1
 | |
| ; RV32IA-NEXT:    sc.w.rl a3, a3, (a0)
 | |
| ; RV32IA-NEXT:    bnez a3, .LBB97_1
 | |
| ; RV32IA-NEXT:  # %bb.4:
 | |
| ; RV32IA-NEXT:    srl a0, a5, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw min i16* %a, i16 %b release
 | |
|   ret i16 %1
 | |
| }
 | |
| 
 | |
| define i16 @atomicrmw_min_i16_acq_rel(i16 *%a, i16 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_min_i16_acq_rel:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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:    sw s6, 4(sp)
 | |
| ; RV32I-NEXT:    mv s2, a1
 | |
| ; RV32I-NEXT:    mv s6, 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:  .LBB98_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 s1, a1, .LBB98_3
 | |
| ; RV32I-NEXT:  # %bb.2: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB98_1 Depth=1
 | |
| ; 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:    mv a1, s3
 | |
| ; RV32I-NEXT:    mv a3, s4
 | |
| ; RV32I-NEXT:    mv a4, s5
 | |
| ; RV32I-NEXT:    call __atomic_compare_exchange_2
 | |
| ; RV32I-NEXT:    mv a1, a0
 | |
| ; RV32I-NEXT:    lh a0, 2(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)
 | |
| ; 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_i16_acq_rel:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    addi a3, zero, 16
 | |
| ; RV32IA-NEXT:    sub a6, a3, a2
 | |
| ; RV32IA-NEXT:    lui a4, 16
 | |
| ; RV32IA-NEXT:    addi a4, a4, -1
 | |
| ; RV32IA-NEXT:    sll a7, a4, a2
 | |
| ; RV32IA-NEXT:    slli a1, a1, 16
 | |
| ; RV32IA-NEXT:    srai a1, a1, 16
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB98_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w.aq a5, (a0)
 | |
| ; RV32IA-NEXT:    and a4, a5, a7
 | |
| ; RV32IA-NEXT:    mv a3, a5
 | |
| ; RV32IA-NEXT:    sll a4, a4, a6
 | |
| ; RV32IA-NEXT:    sra a4, a4, a6
 | |
| ; RV32IA-NEXT:    bge a1, a4, .LBB98_3
 | |
| ; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB98_1 Depth=1
 | |
| ; RV32IA-NEXT:    xor a3, a5, a1
 | |
| ; RV32IA-NEXT:    and a3, a3, a7
 | |
| ; RV32IA-NEXT:    xor a3, a5, a3
 | |
| ; RV32IA-NEXT:  .LBB98_3: # in Loop: Header=BB98_1 Depth=1
 | |
| ; RV32IA-NEXT:    sc.w.rl a3, a3, (a0)
 | |
| ; RV32IA-NEXT:    bnez a3, .LBB98_1
 | |
| ; RV32IA-NEXT:  # %bb.4:
 | |
| ; RV32IA-NEXT:    srl a0, a5, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw min i16* %a, i16 %b acq_rel
 | |
|   ret i16 %1
 | |
| }
 | |
| 
 | |
| define i16 @atomicrmw_min_i16_seq_cst(i16 *%a, i16 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_min_i16_seq_cst:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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 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:  .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:  # %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:    mv a0, s4
 | |
| ; RV32I-NEXT:    mv a1, s3
 | |
| ; RV32I-NEXT:    mv a3, s1
 | |
| ; RV32I-NEXT:    mv a4, s1
 | |
| ; RV32I-NEXT:    call __atomic_compare_exchange_2
 | |
| ; RV32I-NEXT:    mv a1, a0
 | |
| ; RV32I-NEXT:    lh a0, 6(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)
 | |
| ; 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_i16_seq_cst:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    slli a2, a0, 3
 | |
| ; RV32IA-NEXT:    andi a2, a2, 24
 | |
| ; RV32IA-NEXT:    addi a3, zero, 16
 | |
| ; RV32IA-NEXT:    sub a6, a3, a2
 | |
| ; RV32IA-NEXT:    lui a4, 16
 | |
| ; RV32IA-NEXT:    addi a4, a4, -1
 | |
| ; RV32IA-NEXT:    sll a7, a4, a2
 | |
| ; RV32IA-NEXT:    slli a1, a1, 16
 | |
| ; RV32IA-NEXT:    srai a1, a1, 16
 | |
| ; RV32IA-NEXT:    sll a1, a1, a2
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB99_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w.aqrl a5, (a0)
 | |
| ; RV32IA-NEXT:    and a4, a5, a7
 | |
| ; RV32IA-NEXT:    mv a3, a5
 | |
| ; RV32IA-NEXT:    sll a4, a4, a6
 | |
| ; RV32IA-NEXT:    sra a4, a4, a6
 | |
| ; RV32IA-NEXT:    bge a1, a4, .LBB99_3
 | |
| ; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB99_1 Depth=1
 | |
| ; RV32IA-NEXT:    xor a3, a5, a1
 | |
| ; RV32IA-NEXT:    and a3, a3, a7
 | |
| ; RV32IA-NEXT:    xor a3, a5, a3
 | |
| ; RV32IA-NEXT:  .LBB99_3: # in Loop: Header=BB99_1 Depth=1
 | |
| ; RV32IA-NEXT:    sc.w.aqrl a3, a3, (a0)
 | |
| ; RV32IA-NEXT:    bnez a3, .LBB99_1
 | |
| ; RV32IA-NEXT:  # %bb.4:
 | |
| ; RV32IA-NEXT:    srl a0, a5, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw min i16* %a, i16 %b seq_cst
 | |
|   ret i16 %1
 | |
| }
 | |
| 
 | |
| define i16 @atomicrmw_umax_i16_monotonic(i16 *%a, i16 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_umax_i16_monotonic:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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 s4, a0
 | |
| ; RV32I-NEXT:    lhu a0, 0(a0)
 | |
| ; RV32I-NEXT:    lui a1, 16
 | |
| ; RV32I-NEXT:    addi s1, a1, -1
 | |
| ; RV32I-NEXT:    and s5, s2, s1
 | |
| ; RV32I-NEXT:    addi s3, sp, 6
 | |
| ; RV32I-NEXT:  .LBB100_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 s5, a1, .LBB100_3
 | |
| ; RV32I-NEXT:  # %bb.2: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB100_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a2, s2
 | |
| ; RV32I-NEXT:  .LBB100_3: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB100_1 Depth=1
 | |
| ; RV32I-NEXT:    sh a0, 6(sp)
 | |
| ; RV32I-NEXT:    mv a0, s4
 | |
| ; RV32I-NEXT:    mv a1, s3
 | |
| ; RV32I-NEXT:    mv a3, zero
 | |
| ; 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:    beqz a1, .LBB100_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)
 | |
| ; 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_monotonic:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    lui a2, 16
 | |
| ; RV32IA-NEXT:    addi a2, a2, -1
 | |
| ; RV32IA-NEXT:    and a1, a1, a2
 | |
| ; RV32IA-NEXT:    slli a3, a0, 3
 | |
| ; RV32IA-NEXT:    andi a3, a3, 24
 | |
| ; RV32IA-NEXT:    sll a6, a2, a3
 | |
| ; RV32IA-NEXT:    sll a1, a1, a3
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB100_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w a4, (a0)
 | |
| ; RV32IA-NEXT:    and a2, a4, a6
 | |
| ; RV32IA-NEXT:    mv a5, a4
 | |
| ; RV32IA-NEXT:    bgeu a2, a1, .LBB100_3
 | |
| ; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB100_1 Depth=1
 | |
| ; RV32IA-NEXT:    xor a5, a4, a1
 | |
| ; RV32IA-NEXT:    and a5, a5, a6
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:  .LBB100_3: # in Loop: Header=BB100_1 Depth=1
 | |
| ; RV32IA-NEXT:    sc.w a5, a5, (a0)
 | |
| ; RV32IA-NEXT:    bnez a5, .LBB100_1
 | |
| ; RV32IA-NEXT:  # %bb.4:
 | |
| ; RV32IA-NEXT:    srl a0, a4, a3
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw umax i16* %a, i16 %b monotonic
 | |
|   ret i16 %1
 | |
| }
 | |
| 
 | |
| define i16 @atomicrmw_umax_i16_acquire(i16 *%a, i16 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_umax_i16_acquire:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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:    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:  .LBB101_1: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
 | |
| ; RV32I-NEXT:    and a1, a0, s5
 | |
| ; RV32I-NEXT:    mv a2, a0
 | |
| ; RV32I-NEXT:    bltu s6, 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:    mv a0, s4
 | |
| ; RV32I-NEXT:    mv a1, s3
 | |
| ; RV32I-NEXT:    mv a3, s1
 | |
| ; RV32I-NEXT:    mv a4, s1
 | |
| ; RV32I-NEXT:    call __atomic_compare_exchange_2
 | |
| ; RV32I-NEXT:    mv a1, a0
 | |
| ; RV32I-NEXT:    lh a0, 2(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)
 | |
| ; 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_acquire:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    lui a2, 16
 | |
| ; RV32IA-NEXT:    addi a2, a2, -1
 | |
| ; RV32IA-NEXT:    and a1, a1, a2
 | |
| ; RV32IA-NEXT:    slli a3, a0, 3
 | |
| ; RV32IA-NEXT:    andi a3, a3, 24
 | |
| ; RV32IA-NEXT:    sll a6, a2, a3
 | |
| ; RV32IA-NEXT:    sll a1, a1, a3
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB101_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w.aq a4, (a0)
 | |
| ; RV32IA-NEXT:    and a2, a4, a6
 | |
| ; RV32IA-NEXT:    mv a5, a4
 | |
| ; RV32IA-NEXT:    bgeu a2, a1, .LBB101_3
 | |
| ; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB101_1 Depth=1
 | |
| ; RV32IA-NEXT:    xor a5, a4, a1
 | |
| ; RV32IA-NEXT:    and a5, a5, a6
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:  .LBB101_3: # in Loop: Header=BB101_1 Depth=1
 | |
| ; RV32IA-NEXT:    sc.w a5, a5, (a0)
 | |
| ; RV32IA-NEXT:    bnez a5, .LBB101_1
 | |
| ; RV32IA-NEXT:  # %bb.4:
 | |
| ; RV32IA-NEXT:    srl a0, a4, a3
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw umax i16* %a, i16 %b acquire
 | |
|   ret i16 %1
 | |
| }
 | |
| 
 | |
| define i16 @atomicrmw_umax_i16_release(i16 *%a, i16 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_umax_i16_release:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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:    sw s6, 4(sp)
 | |
| ; RV32I-NEXT:    mv s2, a1
 | |
| ; RV32I-NEXT:    mv s5, 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:  .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:  # %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:    mv a1, s3
 | |
| ; RV32I-NEXT:    mv a3, s4
 | |
| ; 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:    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)
 | |
| ; 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_release:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    lui a2, 16
 | |
| ; RV32IA-NEXT:    addi a2, a2, -1
 | |
| ; RV32IA-NEXT:    and a1, a1, a2
 | |
| ; RV32IA-NEXT:    slli a3, a0, 3
 | |
| ; RV32IA-NEXT:    andi a3, a3, 24
 | |
| ; RV32IA-NEXT:    sll a6, a2, a3
 | |
| ; RV32IA-NEXT:    sll a1, a1, a3
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB102_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w a4, (a0)
 | |
| ; RV32IA-NEXT:    and a2, a4, a6
 | |
| ; RV32IA-NEXT:    mv a5, a4
 | |
| ; RV32IA-NEXT:    bgeu a2, a1, .LBB102_3
 | |
| ; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB102_1 Depth=1
 | |
| ; RV32IA-NEXT:    xor a5, a4, a1
 | |
| ; RV32IA-NEXT:    and a5, a5, a6
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:  .LBB102_3: # in Loop: Header=BB102_1 Depth=1
 | |
| ; RV32IA-NEXT:    sc.w.rl a5, a5, (a0)
 | |
| ; RV32IA-NEXT:    bnez a5, .LBB102_1
 | |
| ; RV32IA-NEXT:  # %bb.4:
 | |
| ; RV32IA-NEXT:    srl a0, a4, a3
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw umax i16* %a, i16 %b release
 | |
|   ret i16 %1
 | |
| }
 | |
| 
 | |
| 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:    mv s2, a1
 | |
| ; RV32I-NEXT:    mv s6, 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:  .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:  # %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:    mv a1, s3
 | |
| ; RV32I-NEXT:    mv a3, s4
 | |
| ; RV32I-NEXT:    mv a4, s5
 | |
| ; RV32I-NEXT:    call __atomic_compare_exchange_2
 | |
| ; RV32I-NEXT:    mv a1, a0
 | |
| ; RV32I-NEXT:    lh a0, 14(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:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_umax_i16_acq_rel:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    lui a2, 16
 | |
| ; RV32IA-NEXT:    addi a2, a2, -1
 | |
| ; RV32IA-NEXT:    and a1, a1, a2
 | |
| ; RV32IA-NEXT:    slli a3, a0, 3
 | |
| ; RV32IA-NEXT:    andi a3, a3, 24
 | |
| ; RV32IA-NEXT:    sll a6, a2, a3
 | |
| ; RV32IA-NEXT:    sll a1, a1, a3
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB103_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w.aq a4, (a0)
 | |
| ; RV32IA-NEXT:    and a2, a4, a6
 | |
| ; RV32IA-NEXT:    mv a5, a4
 | |
| ; RV32IA-NEXT:    bgeu a2, a1, .LBB103_3
 | |
| ; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB103_1 Depth=1
 | |
| ; RV32IA-NEXT:    xor a5, a4, a1
 | |
| ; RV32IA-NEXT:    and a5, a5, a6
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:  .LBB103_3: # in Loop: Header=BB103_1 Depth=1
 | |
| ; RV32IA-NEXT:    sc.w.rl a5, a5, (a0)
 | |
| ; RV32IA-NEXT:    bnez a5, .LBB103_1
 | |
| ; RV32IA-NEXT:  # %bb.4:
 | |
| ; RV32IA-NEXT:    srl a0, a4, a3
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw umax i16* %a, i16 %b acq_rel
 | |
|   ret i16 %1
 | |
| }
 | |
| 
 | |
| define i16 @atomicrmw_umax_i16_seq_cst(i16 *%a, i16 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_umax_i16_seq_cst:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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:    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:  .LBB104_1: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
 | |
| ; RV32I-NEXT:    and a1, a0, s5
 | |
| ; RV32I-NEXT:    mv a2, a0
 | |
| ; RV32I-NEXT:    bltu s6, 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:    mv a0, s4
 | |
| ; RV32I-NEXT:    mv a1, s3
 | |
| ; RV32I-NEXT:    mv a3, s1
 | |
| ; RV32I-NEXT:    mv a4, s1
 | |
| ; RV32I-NEXT:    call __atomic_compare_exchange_2
 | |
| ; RV32I-NEXT:    mv a1, a0
 | |
| ; RV32I-NEXT:    lh a0, 2(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)
 | |
| ; 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_seq_cst:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    lui a2, 16
 | |
| ; RV32IA-NEXT:    addi a2, a2, -1
 | |
| ; RV32IA-NEXT:    and a1, a1, a2
 | |
| ; RV32IA-NEXT:    slli a3, a0, 3
 | |
| ; RV32IA-NEXT:    andi a3, a3, 24
 | |
| ; RV32IA-NEXT:    sll a6, a2, a3
 | |
| ; RV32IA-NEXT:    sll a1, a1, a3
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB104_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w.aqrl a4, (a0)
 | |
| ; RV32IA-NEXT:    and a2, a4, a6
 | |
| ; RV32IA-NEXT:    mv a5, a4
 | |
| ; RV32IA-NEXT:    bgeu a2, a1, .LBB104_3
 | |
| ; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB104_1 Depth=1
 | |
| ; RV32IA-NEXT:    xor a5, a4, a1
 | |
| ; RV32IA-NEXT:    and a5, a5, a6
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:  .LBB104_3: # in Loop: Header=BB104_1 Depth=1
 | |
| ; RV32IA-NEXT:    sc.w.aqrl a5, a5, (a0)
 | |
| ; RV32IA-NEXT:    bnez a5, .LBB104_1
 | |
| ; RV32IA-NEXT:  # %bb.4:
 | |
| ; RV32IA-NEXT:    srl a0, a4, a3
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw umax i16* %a, i16 %b seq_cst
 | |
|   ret i16 %1
 | |
| }
 | |
| 
 | |
| define i16 @atomicrmw_umin_i16_monotonic(i16 *%a, i16 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_umin_i16_monotonic:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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 s4, a0
 | |
| ; RV32I-NEXT:    lhu a0, 0(a0)
 | |
| ; RV32I-NEXT:    lui a1, 16
 | |
| ; RV32I-NEXT:    addi s1, a1, -1
 | |
| ; RV32I-NEXT:    and s5, s2, s1
 | |
| ; RV32I-NEXT:    addi s3, sp, 6
 | |
| ; RV32I-NEXT:  .LBB105_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 s5, a1, .LBB105_3
 | |
| ; RV32I-NEXT:  # %bb.2: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB105_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a2, s2
 | |
| ; RV32I-NEXT:  .LBB105_3: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB105_1 Depth=1
 | |
| ; RV32I-NEXT:    sh a0, 6(sp)
 | |
| ; RV32I-NEXT:    mv a0, s4
 | |
| ; RV32I-NEXT:    mv a1, s3
 | |
| ; RV32I-NEXT:    mv a3, zero
 | |
| ; 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:    beqz a1, .LBB105_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)
 | |
| ; 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_monotonic:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    lui a2, 16
 | |
| ; RV32IA-NEXT:    addi a2, a2, -1
 | |
| ; RV32IA-NEXT:    and a1, a1, a2
 | |
| ; RV32IA-NEXT:    slli a3, a0, 3
 | |
| ; RV32IA-NEXT:    andi a3, a3, 24
 | |
| ; RV32IA-NEXT:    sll a6, a2, a3
 | |
| ; RV32IA-NEXT:    sll a1, a1, a3
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB105_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w a4, (a0)
 | |
| ; RV32IA-NEXT:    and a2, a4, a6
 | |
| ; RV32IA-NEXT:    mv a5, a4
 | |
| ; RV32IA-NEXT:    bgeu a1, a2, .LBB105_3
 | |
| ; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB105_1 Depth=1
 | |
| ; RV32IA-NEXT:    xor a5, a4, a1
 | |
| ; RV32IA-NEXT:    and a5, a5, a6
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:  .LBB105_3: # in Loop: Header=BB105_1 Depth=1
 | |
| ; RV32IA-NEXT:    sc.w a5, a5, (a0)
 | |
| ; RV32IA-NEXT:    bnez a5, .LBB105_1
 | |
| ; RV32IA-NEXT:  # %bb.4:
 | |
| ; RV32IA-NEXT:    srl a0, a4, a3
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw umin i16* %a, i16 %b monotonic
 | |
|   ret i16 %1
 | |
| }
 | |
| 
 | |
| define i16 @atomicrmw_umin_i16_acquire(i16 *%a, i16 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_umin_i16_acquire:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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:    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:  .LBB106_1: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
 | |
| ; RV32I-NEXT:    and a1, a0, s5
 | |
| ; RV32I-NEXT:    mv a2, a0
 | |
| ; RV32I-NEXT:    bgeu s6, 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:    mv a0, s4
 | |
| ; RV32I-NEXT:    mv a1, s3
 | |
| ; RV32I-NEXT:    mv a3, s1
 | |
| ; RV32I-NEXT:    mv a4, s1
 | |
| ; RV32I-NEXT:    call __atomic_compare_exchange_2
 | |
| ; RV32I-NEXT:    mv a1, a0
 | |
| ; RV32I-NEXT:    lh a0, 2(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)
 | |
| ; 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_acquire:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    lui a2, 16
 | |
| ; RV32IA-NEXT:    addi a2, a2, -1
 | |
| ; RV32IA-NEXT:    and a1, a1, a2
 | |
| ; RV32IA-NEXT:    slli a3, a0, 3
 | |
| ; RV32IA-NEXT:    andi a3, a3, 24
 | |
| ; RV32IA-NEXT:    sll a6, a2, a3
 | |
| ; RV32IA-NEXT:    sll a1, a1, a3
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB106_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w.aq a4, (a0)
 | |
| ; RV32IA-NEXT:    and a2, a4, a6
 | |
| ; RV32IA-NEXT:    mv a5, a4
 | |
| ; RV32IA-NEXT:    bgeu a1, a2, .LBB106_3
 | |
| ; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB106_1 Depth=1
 | |
| ; RV32IA-NEXT:    xor a5, a4, a1
 | |
| ; RV32IA-NEXT:    and a5, a5, a6
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:  .LBB106_3: # in Loop: Header=BB106_1 Depth=1
 | |
| ; RV32IA-NEXT:    sc.w a5, a5, (a0)
 | |
| ; RV32IA-NEXT:    bnez a5, .LBB106_1
 | |
| ; RV32IA-NEXT:  # %bb.4:
 | |
| ; RV32IA-NEXT:    srl a0, a4, a3
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw umin i16* %a, i16 %b acquire
 | |
|   ret i16 %1
 | |
| }
 | |
| 
 | |
| define i16 @atomicrmw_umin_i16_release(i16 *%a, i16 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_umin_i16_release:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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:    sw s6, 4(sp)
 | |
| ; RV32I-NEXT:    mv s2, a1
 | |
| ; RV32I-NEXT:    mv s5, 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:  .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:  # %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:    mv a1, s3
 | |
| ; RV32I-NEXT:    mv a3, s4
 | |
| ; 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:    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)
 | |
| ; 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_release:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    lui a2, 16
 | |
| ; RV32IA-NEXT:    addi a2, a2, -1
 | |
| ; RV32IA-NEXT:    and a1, a1, a2
 | |
| ; RV32IA-NEXT:    slli a3, a0, 3
 | |
| ; RV32IA-NEXT:    andi a3, a3, 24
 | |
| ; RV32IA-NEXT:    sll a6, a2, a3
 | |
| ; RV32IA-NEXT:    sll a1, a1, a3
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB107_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w a4, (a0)
 | |
| ; RV32IA-NEXT:    and a2, a4, a6
 | |
| ; RV32IA-NEXT:    mv a5, a4
 | |
| ; RV32IA-NEXT:    bgeu a1, a2, .LBB107_3
 | |
| ; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB107_1 Depth=1
 | |
| ; RV32IA-NEXT:    xor a5, a4, a1
 | |
| ; RV32IA-NEXT:    and a5, a5, a6
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:  .LBB107_3: # in Loop: Header=BB107_1 Depth=1
 | |
| ; RV32IA-NEXT:    sc.w.rl a5, a5, (a0)
 | |
| ; RV32IA-NEXT:    bnez a5, .LBB107_1
 | |
| ; RV32IA-NEXT:  # %bb.4:
 | |
| ; RV32IA-NEXT:    srl a0, a4, a3
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw umin i16* %a, i16 %b release
 | |
|   ret i16 %1
 | |
| }
 | |
| 
 | |
| 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:    mv s2, a1
 | |
| ; RV32I-NEXT:    mv s6, 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:  .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:  # %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:    mv a1, s3
 | |
| ; RV32I-NEXT:    mv a3, s4
 | |
| ; RV32I-NEXT:    mv a4, s5
 | |
| ; RV32I-NEXT:    call __atomic_compare_exchange_2
 | |
| ; RV32I-NEXT:    mv a1, a0
 | |
| ; RV32I-NEXT:    lh a0, 14(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:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_umin_i16_acq_rel:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    lui a2, 16
 | |
| ; RV32IA-NEXT:    addi a2, a2, -1
 | |
| ; RV32IA-NEXT:    and a1, a1, a2
 | |
| ; RV32IA-NEXT:    slli a3, a0, 3
 | |
| ; RV32IA-NEXT:    andi a3, a3, 24
 | |
| ; RV32IA-NEXT:    sll a6, a2, a3
 | |
| ; RV32IA-NEXT:    sll a1, a1, a3
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB108_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w.aq a4, (a0)
 | |
| ; RV32IA-NEXT:    and a2, a4, a6
 | |
| ; RV32IA-NEXT:    mv a5, a4
 | |
| ; RV32IA-NEXT:    bgeu a1, a2, .LBB108_3
 | |
| ; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB108_1 Depth=1
 | |
| ; RV32IA-NEXT:    xor a5, a4, a1
 | |
| ; RV32IA-NEXT:    and a5, a5, a6
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:  .LBB108_3: # in Loop: Header=BB108_1 Depth=1
 | |
| ; RV32IA-NEXT:    sc.w.rl a5, a5, (a0)
 | |
| ; RV32IA-NEXT:    bnez a5, .LBB108_1
 | |
| ; RV32IA-NEXT:  # %bb.4:
 | |
| ; RV32IA-NEXT:    srl a0, a4, a3
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw umin i16* %a, i16 %b acq_rel
 | |
|   ret i16 %1
 | |
| }
 | |
| 
 | |
| define i16 @atomicrmw_umin_i16_seq_cst(i16 *%a, i16 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_umin_i16_seq_cst:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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:    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:  .LBB109_1: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
 | |
| ; RV32I-NEXT:    and a1, a0, s5
 | |
| ; RV32I-NEXT:    mv a2, a0
 | |
| ; RV32I-NEXT:    bgeu s6, 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:    mv a0, s4
 | |
| ; RV32I-NEXT:    mv a1, s3
 | |
| ; RV32I-NEXT:    mv a3, s1
 | |
| ; RV32I-NEXT:    mv a4, s1
 | |
| ; RV32I-NEXT:    call __atomic_compare_exchange_2
 | |
| ; RV32I-NEXT:    mv a1, a0
 | |
| ; RV32I-NEXT:    lh a0, 2(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)
 | |
| ; 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_seq_cst:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    lui a2, 16
 | |
| ; RV32IA-NEXT:    addi a2, a2, -1
 | |
| ; RV32IA-NEXT:    and a1, a1, a2
 | |
| ; RV32IA-NEXT:    slli a3, a0, 3
 | |
| ; RV32IA-NEXT:    andi a3, a3, 24
 | |
| ; RV32IA-NEXT:    sll a6, a2, a3
 | |
| ; RV32IA-NEXT:    sll a1, a1, a3
 | |
| ; RV32IA-NEXT:    andi a0, a0, -4
 | |
| ; RV32IA-NEXT:  .LBB109_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w.aqrl a4, (a0)
 | |
| ; RV32IA-NEXT:    and a2, a4, a6
 | |
| ; RV32IA-NEXT:    mv a5, a4
 | |
| ; RV32IA-NEXT:    bgeu a1, a2, .LBB109_3
 | |
| ; RV32IA-NEXT:  # %bb.2: # in Loop: Header=BB109_1 Depth=1
 | |
| ; RV32IA-NEXT:    xor a5, a4, a1
 | |
| ; RV32IA-NEXT:    and a5, a5, a6
 | |
| ; RV32IA-NEXT:    xor a5, a4, a5
 | |
| ; RV32IA-NEXT:  .LBB109_3: # in Loop: Header=BB109_1 Depth=1
 | |
| ; RV32IA-NEXT:    sc.w.aqrl a5, a5, (a0)
 | |
| ; RV32IA-NEXT:    bnez a5, .LBB109_1
 | |
| ; RV32IA-NEXT:  # %bb.4:
 | |
| ; RV32IA-NEXT:    srl a0, a4, a3
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw umin i16* %a, i16 %b seq_cst
 | |
|   ret i16 %1
 | |
| }
 | |
| 
 | |
| define i32 @atomicrmw_xchg_i32_monotonic(i32* %a, i32 %b) {
 | |
| ; RV32I-LABEL: atomicrmw_xchg_i32_monotonic:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    mv a2, zero
 | |
| ; RV32I-NEXT:    call __atomic_exchange_4
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_xchg_i32_monotonic:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    amoswap.w a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw xchg i32* %a, i32 %b monotonic
 | |
|   ret i32 %1
 | |
| }
 | |
| 
 | |
| define i32 @atomicrmw_xchg_i32_acquire(i32* %a, i32 %b) {
 | |
| ; RV32I-LABEL: atomicrmw_xchg_i32_acquire:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 2
 | |
| ; RV32I-NEXT:    call __atomic_exchange_4
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_xchg_i32_acquire:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    amoswap.w.aq a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw xchg i32* %a, i32 %b acquire
 | |
|   ret i32 %1
 | |
| }
 | |
| 
 | |
| define i32 @atomicrmw_xchg_i32_release(i32* %a, i32 %b) {
 | |
| ; RV32I-LABEL: atomicrmw_xchg_i32_release:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 3
 | |
| ; RV32I-NEXT:    call __atomic_exchange_4
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_xchg_i32_release:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    amoswap.w.rl a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw xchg i32* %a, i32 %b release
 | |
|   ret i32 %1
 | |
| }
 | |
| 
 | |
| define i32 @atomicrmw_xchg_i32_acq_rel(i32* %a, i32 %b) {
 | |
| ; RV32I-LABEL: atomicrmw_xchg_i32_acq_rel:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 4
 | |
| ; RV32I-NEXT:    call __atomic_exchange_4
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_xchg_i32_acq_rel:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    amoswap.w.aqrl a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw xchg i32* %a, i32 %b acq_rel
 | |
|   ret i32 %1
 | |
| }
 | |
| 
 | |
| define i32 @atomicrmw_xchg_i32_seq_cst(i32* %a, i32 %b) {
 | |
| ; RV32I-LABEL: atomicrmw_xchg_i32_seq_cst:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 5
 | |
| ; RV32I-NEXT:    call __atomic_exchange_4
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_xchg_i32_seq_cst:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    amoswap.w.aqrl a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw xchg i32* %a, i32 %b seq_cst
 | |
|   ret i32 %1
 | |
| }
 | |
| 
 | |
| define i32 @atomicrmw_add_i32_monotonic(i32 *%a, i32 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_add_i32_monotonic:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    mv a2, zero
 | |
| ; RV32I-NEXT:    call __atomic_fetch_add_4
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_add_i32_monotonic:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    amoadd.w a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw add i32* %a, i32 %b monotonic
 | |
|   ret i32 %1
 | |
| }
 | |
| 
 | |
| define i32 @atomicrmw_add_i32_acquire(i32 *%a, i32 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_add_i32_acquire:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 2
 | |
| ; RV32I-NEXT:    call __atomic_fetch_add_4
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_add_i32_acquire:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    amoadd.w.aq a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw add i32* %a, i32 %b acquire
 | |
|   ret i32 %1
 | |
| }
 | |
| 
 | |
| define i32 @atomicrmw_add_i32_release(i32 *%a, i32 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_add_i32_release:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 3
 | |
| ; RV32I-NEXT:    call __atomic_fetch_add_4
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_add_i32_release:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    amoadd.w.rl a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw add i32* %a, i32 %b release
 | |
|   ret i32 %1
 | |
| }
 | |
| 
 | |
| define i32 @atomicrmw_add_i32_acq_rel(i32 *%a, i32 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_add_i32_acq_rel:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 4
 | |
| ; RV32I-NEXT:    call __atomic_fetch_add_4
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_add_i32_acq_rel:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    amoadd.w.aqrl a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw add i32* %a, i32 %b acq_rel
 | |
|   ret i32 %1
 | |
| }
 | |
| 
 | |
| define i32 @atomicrmw_add_i32_seq_cst(i32 *%a, i32 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_add_i32_seq_cst:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 5
 | |
| ; RV32I-NEXT:    call __atomic_fetch_add_4
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_add_i32_seq_cst:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    amoadd.w.aqrl a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw add i32* %a, i32 %b seq_cst
 | |
|   ret i32 %1
 | |
| }
 | |
| 
 | |
| define i32 @atomicrmw_sub_i32_monotonic(i32* %a, i32 %b) {
 | |
| ; RV32I-LABEL: atomicrmw_sub_i32_monotonic:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    mv a2, zero
 | |
| ; RV32I-NEXT:    call __atomic_fetch_sub_4
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_sub_i32_monotonic:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    neg a1, a1
 | |
| ; RV32IA-NEXT:    amoadd.w a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw sub i32* %a, i32 %b monotonic
 | |
|   ret i32 %1
 | |
| }
 | |
| 
 | |
| define i32 @atomicrmw_sub_i32_acquire(i32* %a, i32 %b) {
 | |
| ; RV32I-LABEL: atomicrmw_sub_i32_acquire:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 2
 | |
| ; RV32I-NEXT:    call __atomic_fetch_sub_4
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_sub_i32_acquire:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    neg a1, a1
 | |
| ; RV32IA-NEXT:    amoadd.w.aq a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw sub i32* %a, i32 %b acquire
 | |
|   ret i32 %1
 | |
| }
 | |
| 
 | |
| define i32 @atomicrmw_sub_i32_release(i32* %a, i32 %b) {
 | |
| ; RV32I-LABEL: atomicrmw_sub_i32_release:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 3
 | |
| ; RV32I-NEXT:    call __atomic_fetch_sub_4
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_sub_i32_release:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    neg a1, a1
 | |
| ; RV32IA-NEXT:    amoadd.w.rl a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw sub i32* %a, i32 %b release
 | |
|   ret i32 %1
 | |
| }
 | |
| 
 | |
| define i32 @atomicrmw_sub_i32_acq_rel(i32* %a, i32 %b) {
 | |
| ; RV32I-LABEL: atomicrmw_sub_i32_acq_rel:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 4
 | |
| ; RV32I-NEXT:    call __atomic_fetch_sub_4
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_sub_i32_acq_rel:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    neg a1, a1
 | |
| ; RV32IA-NEXT:    amoadd.w.aqrl a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw sub i32* %a, i32 %b acq_rel
 | |
|   ret i32 %1
 | |
| }
 | |
| 
 | |
| define i32 @atomicrmw_sub_i32_seq_cst(i32* %a, i32 %b) {
 | |
| ; RV32I-LABEL: atomicrmw_sub_i32_seq_cst:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 5
 | |
| ; RV32I-NEXT:    call __atomic_fetch_sub_4
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_sub_i32_seq_cst:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    neg a1, a1
 | |
| ; RV32IA-NEXT:    amoadd.w.aqrl a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw sub i32* %a, i32 %b seq_cst
 | |
|   ret i32 %1
 | |
| }
 | |
| 
 | |
| define i32 @atomicrmw_and_i32_monotonic(i32 *%a, i32 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_and_i32_monotonic:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    mv a2, zero
 | |
| ; RV32I-NEXT:    call __atomic_fetch_and_4
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_and_i32_monotonic:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    amoand.w a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw and i32* %a, i32 %b monotonic
 | |
|   ret i32 %1
 | |
| }
 | |
| 
 | |
| define i32 @atomicrmw_and_i32_acquire(i32 *%a, i32 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_and_i32_acquire:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 2
 | |
| ; RV32I-NEXT:    call __atomic_fetch_and_4
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_and_i32_acquire:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    amoand.w.aq a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw and i32* %a, i32 %b acquire
 | |
|   ret i32 %1
 | |
| }
 | |
| 
 | |
| define i32 @atomicrmw_and_i32_release(i32 *%a, i32 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_and_i32_release:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 3
 | |
| ; RV32I-NEXT:    call __atomic_fetch_and_4
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_and_i32_release:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    amoand.w.rl a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw and i32* %a, i32 %b release
 | |
|   ret i32 %1
 | |
| }
 | |
| 
 | |
| define i32 @atomicrmw_and_i32_acq_rel(i32 *%a, i32 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_and_i32_acq_rel:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 4
 | |
| ; RV32I-NEXT:    call __atomic_fetch_and_4
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_and_i32_acq_rel:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    amoand.w.aqrl a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw and i32* %a, i32 %b acq_rel
 | |
|   ret i32 %1
 | |
| }
 | |
| 
 | |
| define i32 @atomicrmw_and_i32_seq_cst(i32 *%a, i32 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_and_i32_seq_cst:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 5
 | |
| ; RV32I-NEXT:    call __atomic_fetch_and_4
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_and_i32_seq_cst:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    amoand.w.aqrl a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw and i32* %a, i32 %b seq_cst
 | |
|   ret i32 %1
 | |
| }
 | |
| 
 | |
| define i32 @atomicrmw_nand_i32_monotonic(i32* %a, i32 %b) {
 | |
| ; RV32I-LABEL: atomicrmw_nand_i32_monotonic:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    mv a2, zero
 | |
| ; RV32I-NEXT:    call __atomic_fetch_nand_4
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_nand_i32_monotonic:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:  .LBB130_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w a2, (a0)
 | |
| ; RV32IA-NEXT:    and a3, a2, a1
 | |
| ; RV32IA-NEXT:    not a3, a3
 | |
| ; RV32IA-NEXT:    sc.w a3, a3, (a0)
 | |
| ; RV32IA-NEXT:    bnez a3, .LBB130_1
 | |
| ; RV32IA-NEXT:  # %bb.2:
 | |
| ; RV32IA-NEXT:    mv a0, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw nand i32* %a, i32 %b monotonic
 | |
|   ret i32 %1
 | |
| }
 | |
| 
 | |
| define i32 @atomicrmw_nand_i32_acquire(i32* %a, i32 %b) {
 | |
| ; RV32I-LABEL: atomicrmw_nand_i32_acquire:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 2
 | |
| ; RV32I-NEXT:    call __atomic_fetch_nand_4
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_nand_i32_acquire:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:  .LBB131_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w.aq a2, (a0)
 | |
| ; RV32IA-NEXT:    and a3, a2, a1
 | |
| ; RV32IA-NEXT:    not a3, a3
 | |
| ; RV32IA-NEXT:    sc.w a3, a3, (a0)
 | |
| ; RV32IA-NEXT:    bnez a3, .LBB131_1
 | |
| ; RV32IA-NEXT:  # %bb.2:
 | |
| ; RV32IA-NEXT:    mv a0, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw nand i32* %a, i32 %b acquire
 | |
|   ret i32 %1
 | |
| }
 | |
| 
 | |
| define i32 @atomicrmw_nand_i32_release(i32* %a, i32 %b) {
 | |
| ; RV32I-LABEL: atomicrmw_nand_i32_release:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 3
 | |
| ; RV32I-NEXT:    call __atomic_fetch_nand_4
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_nand_i32_release:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:  .LBB132_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w a2, (a0)
 | |
| ; RV32IA-NEXT:    and a3, a2, a1
 | |
| ; RV32IA-NEXT:    not a3, a3
 | |
| ; RV32IA-NEXT:    sc.w.rl a3, a3, (a0)
 | |
| ; RV32IA-NEXT:    bnez a3, .LBB132_1
 | |
| ; RV32IA-NEXT:  # %bb.2:
 | |
| ; RV32IA-NEXT:    mv a0, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw nand i32* %a, i32 %b release
 | |
|   ret i32 %1
 | |
| }
 | |
| 
 | |
| define i32 @atomicrmw_nand_i32_acq_rel(i32* %a, i32 %b) {
 | |
| ; RV32I-LABEL: atomicrmw_nand_i32_acq_rel:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 4
 | |
| ; RV32I-NEXT:    call __atomic_fetch_nand_4
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_nand_i32_acq_rel:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:  .LBB133_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w.aq a2, (a0)
 | |
| ; RV32IA-NEXT:    and a3, a2, a1
 | |
| ; RV32IA-NEXT:    not a3, a3
 | |
| ; RV32IA-NEXT:    sc.w.rl a3, a3, (a0)
 | |
| ; RV32IA-NEXT:    bnez a3, .LBB133_1
 | |
| ; RV32IA-NEXT:  # %bb.2:
 | |
| ; RV32IA-NEXT:    mv a0, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw nand i32* %a, i32 %b acq_rel
 | |
|   ret i32 %1
 | |
| }
 | |
| 
 | |
| define i32 @atomicrmw_nand_i32_seq_cst(i32* %a, i32 %b) {
 | |
| ; RV32I-LABEL: atomicrmw_nand_i32_seq_cst:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 5
 | |
| ; RV32I-NEXT:    call __atomic_fetch_nand_4
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_nand_i32_seq_cst:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:  .LBB134_1: # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    lr.w.aqrl a2, (a0)
 | |
| ; RV32IA-NEXT:    and a3, a2, a1
 | |
| ; RV32IA-NEXT:    not a3, a3
 | |
| ; RV32IA-NEXT:    sc.w.aqrl a3, a3, (a0)
 | |
| ; RV32IA-NEXT:    bnez a3, .LBB134_1
 | |
| ; RV32IA-NEXT:  # %bb.2:
 | |
| ; RV32IA-NEXT:    mv a0, a2
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw nand i32* %a, i32 %b seq_cst
 | |
|   ret i32 %1
 | |
| }
 | |
| 
 | |
| define i32 @atomicrmw_or_i32_monotonic(i32 *%a, i32 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_or_i32_monotonic:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    mv a2, zero
 | |
| ; RV32I-NEXT:    call __atomic_fetch_or_4
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_or_i32_monotonic:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    amoor.w a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw or i32* %a, i32 %b monotonic
 | |
|   ret i32 %1
 | |
| }
 | |
| 
 | |
| define i32 @atomicrmw_or_i32_acquire(i32 *%a, i32 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_or_i32_acquire:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 2
 | |
| ; RV32I-NEXT:    call __atomic_fetch_or_4
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_or_i32_acquire:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    amoor.w.aq a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw or i32* %a, i32 %b acquire
 | |
|   ret i32 %1
 | |
| }
 | |
| 
 | |
| define i32 @atomicrmw_or_i32_release(i32 *%a, i32 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_or_i32_release:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 3
 | |
| ; RV32I-NEXT:    call __atomic_fetch_or_4
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_or_i32_release:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    amoor.w.rl a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw or i32* %a, i32 %b release
 | |
|   ret i32 %1
 | |
| }
 | |
| 
 | |
| define i32 @atomicrmw_or_i32_acq_rel(i32 *%a, i32 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_or_i32_acq_rel:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 4
 | |
| ; RV32I-NEXT:    call __atomic_fetch_or_4
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_or_i32_acq_rel:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    amoor.w.aqrl a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw or i32* %a, i32 %b acq_rel
 | |
|   ret i32 %1
 | |
| }
 | |
| 
 | |
| define i32 @atomicrmw_or_i32_seq_cst(i32 *%a, i32 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_or_i32_seq_cst:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 5
 | |
| ; RV32I-NEXT:    call __atomic_fetch_or_4
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_or_i32_seq_cst:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    amoor.w.aqrl a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw or i32* %a, i32 %b seq_cst
 | |
|   ret i32 %1
 | |
| }
 | |
| 
 | |
| define i32 @atomicrmw_xor_i32_monotonic(i32 *%a, i32 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_xor_i32_monotonic:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    mv a2, zero
 | |
| ; RV32I-NEXT:    call __atomic_fetch_xor_4
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_xor_i32_monotonic:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    amoxor.w a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw xor i32* %a, i32 %b monotonic
 | |
|   ret i32 %1
 | |
| }
 | |
| 
 | |
| define i32 @atomicrmw_xor_i32_acquire(i32 *%a, i32 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_xor_i32_acquire:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 2
 | |
| ; RV32I-NEXT:    call __atomic_fetch_xor_4
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_xor_i32_acquire:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    amoxor.w.aq a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw xor i32* %a, i32 %b acquire
 | |
|   ret i32 %1
 | |
| }
 | |
| 
 | |
| define i32 @atomicrmw_xor_i32_release(i32 *%a, i32 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_xor_i32_release:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 3
 | |
| ; RV32I-NEXT:    call __atomic_fetch_xor_4
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_xor_i32_release:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    amoxor.w.rl a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw xor i32* %a, i32 %b release
 | |
|   ret i32 %1
 | |
| }
 | |
| 
 | |
| define i32 @atomicrmw_xor_i32_acq_rel(i32 *%a, i32 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_xor_i32_acq_rel:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 4
 | |
| ; RV32I-NEXT:    call __atomic_fetch_xor_4
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_xor_i32_acq_rel:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    amoxor.w.aqrl a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw xor i32* %a, i32 %b acq_rel
 | |
|   ret i32 %1
 | |
| }
 | |
| 
 | |
| define i32 @atomicrmw_xor_i32_seq_cst(i32 *%a, i32 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_xor_i32_seq_cst:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a2, zero, 5
 | |
| ; RV32I-NEXT:    call __atomic_fetch_xor_4
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_xor_i32_seq_cst:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    amoxor.w.aqrl a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw xor i32* %a, i32 %b seq_cst
 | |
|   ret i32 %1
 | |
| }
 | |
| 
 | |
| define i32 @atomicrmw_max_i32_monotonic(i32 *%a, i32 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_max_i32_monotonic:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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:    mv s1, a1
 | |
| ; RV32I-NEXT:    mv s2, a0
 | |
| ; RV32I-NEXT:    lw a2, 0(a0)
 | |
| ; RV32I-NEXT:    addi s3, sp, 12
 | |
| ; RV32I-NEXT:  .LBB145_1: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
 | |
| ; RV32I-NEXT:    sw a2, 12(sp)
 | |
| ; RV32I-NEXT:    blt s1, a2, .LBB145_3
 | |
| ; RV32I-NEXT:  # %bb.2: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB145_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a2, s1
 | |
| ; RV32I-NEXT:  .LBB145_3: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB145_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a0, s2
 | |
| ; RV32I-NEXT:    mv a1, s3
 | |
| ; RV32I-NEXT:    mv a3, zero
 | |
| ; RV32I-NEXT:    mv a4, zero
 | |
| ; RV32I-NEXT:    call __atomic_compare_exchange_4
 | |
| ; RV32I-NEXT:    lw a2, 12(sp)
 | |
| ; RV32I-NEXT:    beqz a0, .LBB145_1
 | |
| ; RV32I-NEXT:  # %bb.4: # %atomicrmw.end
 | |
| ; RV32I-NEXT:    mv a0, a2
 | |
| ; 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_i32_monotonic:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    amomax.w a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw max i32* %a, i32 %b monotonic
 | |
|   ret i32 %1
 | |
| }
 | |
| 
 | |
| define i32 @atomicrmw_max_i32_acquire(i32 *%a, i32 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_max_i32_acquire:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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, 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:  .LBB146_1: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
 | |
| ; RV32I-NEXT:    sw a2, 8(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:    mv a2, s1
 | |
| ; RV32I-NEXT:  .LBB146_3: # %atomicrmw.start
 | |
| ; 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:    call __atomic_compare_exchange_4
 | |
| ; RV32I-NEXT:    lw a2, 8(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)
 | |
| ; RV32I-NEXT:    lw ra, 28(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 32
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_max_i32_acquire:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    amomax.w.aq a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw max i32* %a, i32 %b acquire
 | |
|   ret i32 %1
 | |
| }
 | |
| 
 | |
| define i32 @atomicrmw_max_i32_release(i32 *%a, i32 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_max_i32_release:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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, 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:  .LBB147_1: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
 | |
| ; RV32I-NEXT:    sw a2, 8(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:    mv a2, s1
 | |
| ; RV32I-NEXT:  .LBB147_3: # %atomicrmw.start
 | |
| ; 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:    mv a4, zero
 | |
| ; RV32I-NEXT:    call __atomic_compare_exchange_4
 | |
| ; RV32I-NEXT:    lw a2, 8(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)
 | |
| ; RV32I-NEXT:    lw ra, 28(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 32
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_max_i32_release:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    amomax.w.rl a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw max i32* %a, i32 %b release
 | |
|   ret i32 %1
 | |
| }
 | |
| 
 | |
| define i32 @atomicrmw_max_i32_acq_rel(i32 *%a, i32 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_max_i32_acq_rel:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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 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:  .LBB148_1: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
 | |
| ; RV32I-NEXT:    sw a2, 4(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:    mv a2, s1
 | |
| ; RV32I-NEXT:  .LBB148_3: # %atomicrmw.start
 | |
| ; 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:    call __atomic_compare_exchange_4
 | |
| ; RV32I-NEXT:    lw a2, 4(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)
 | |
| ; RV32I-NEXT:    lw ra, 28(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 32
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_max_i32_acq_rel:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    amomax.w.aqrl a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw max i32* %a, i32 %b acq_rel
 | |
|   ret i32 %1
 | |
| }
 | |
| 
 | |
| define i32 @atomicrmw_max_i32_seq_cst(i32 *%a, i32 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_max_i32_seq_cst:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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, 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:  .LBB149_1: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
 | |
| ; RV32I-NEXT:    sw a2, 8(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:    mv a2, s1
 | |
| ; RV32I-NEXT:  .LBB149_3: # %atomicrmw.start
 | |
| ; 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:    call __atomic_compare_exchange_4
 | |
| ; RV32I-NEXT:    lw a2, 8(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)
 | |
| ; RV32I-NEXT:    lw ra, 28(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 32
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_max_i32_seq_cst:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    amomax.w.aqrl a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw max i32* %a, i32 %b seq_cst
 | |
|   ret i32 %1
 | |
| }
 | |
| 
 | |
| define i32 @atomicrmw_min_i32_monotonic(i32 *%a, i32 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_min_i32_monotonic:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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:    mv s1, a1
 | |
| ; RV32I-NEXT:    mv s2, a0
 | |
| ; RV32I-NEXT:    lw a2, 0(a0)
 | |
| ; RV32I-NEXT:    addi s3, sp, 12
 | |
| ; RV32I-NEXT:  .LBB150_1: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
 | |
| ; RV32I-NEXT:    sw a2, 12(sp)
 | |
| ; RV32I-NEXT:    bge s1, a2, .LBB150_3
 | |
| ; RV32I-NEXT:  # %bb.2: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB150_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a2, s1
 | |
| ; RV32I-NEXT:  .LBB150_3: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB150_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a0, s2
 | |
| ; RV32I-NEXT:    mv a1, s3
 | |
| ; RV32I-NEXT:    mv a3, zero
 | |
| ; RV32I-NEXT:    mv a4, zero
 | |
| ; RV32I-NEXT:    call __atomic_compare_exchange_4
 | |
| ; RV32I-NEXT:    lw a2, 12(sp)
 | |
| ; RV32I-NEXT:    beqz a0, .LBB150_1
 | |
| ; RV32I-NEXT:  # %bb.4: # %atomicrmw.end
 | |
| ; RV32I-NEXT:    mv a0, a2
 | |
| ; 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_i32_monotonic:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    amomin.w a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw min i32* %a, i32 %b monotonic
 | |
|   ret i32 %1
 | |
| }
 | |
| 
 | |
| define i32 @atomicrmw_min_i32_acquire(i32 *%a, i32 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_min_i32_acquire:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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, 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:  .LBB151_1: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
 | |
| ; RV32I-NEXT:    sw a2, 8(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:    mv a2, s1
 | |
| ; RV32I-NEXT:  .LBB151_3: # %atomicrmw.start
 | |
| ; 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:    call __atomic_compare_exchange_4
 | |
| ; RV32I-NEXT:    lw a2, 8(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)
 | |
| ; RV32I-NEXT:    lw ra, 28(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 32
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_min_i32_acquire:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    amomin.w.aq a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw min i32* %a, i32 %b acquire
 | |
|   ret i32 %1
 | |
| }
 | |
| 
 | |
| define i32 @atomicrmw_min_i32_release(i32 *%a, i32 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_min_i32_release:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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, 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:  .LBB152_1: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
 | |
| ; RV32I-NEXT:    sw a2, 8(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:    mv a2, s1
 | |
| ; RV32I-NEXT:  .LBB152_3: # %atomicrmw.start
 | |
| ; 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:    mv a4, zero
 | |
| ; RV32I-NEXT:    call __atomic_compare_exchange_4
 | |
| ; RV32I-NEXT:    lw a2, 8(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)
 | |
| ; RV32I-NEXT:    lw ra, 28(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 32
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_min_i32_release:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    amomin.w.rl a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw min i32* %a, i32 %b release
 | |
|   ret i32 %1
 | |
| }
 | |
| 
 | |
| define i32 @atomicrmw_min_i32_acq_rel(i32 *%a, i32 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_min_i32_acq_rel:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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 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:  .LBB153_1: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
 | |
| ; RV32I-NEXT:    sw a2, 4(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:    mv a2, s1
 | |
| ; RV32I-NEXT:  .LBB153_3: # %atomicrmw.start
 | |
| ; 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:    call __atomic_compare_exchange_4
 | |
| ; RV32I-NEXT:    lw a2, 4(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)
 | |
| ; RV32I-NEXT:    lw ra, 28(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 32
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_min_i32_acq_rel:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    amomin.w.aqrl a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw min i32* %a, i32 %b acq_rel
 | |
|   ret i32 %1
 | |
| }
 | |
| 
 | |
| define i32 @atomicrmw_min_i32_seq_cst(i32 *%a, i32 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_min_i32_seq_cst:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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, 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:  .LBB154_1: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
 | |
| ; RV32I-NEXT:    sw a2, 8(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:    mv a2, s1
 | |
| ; RV32I-NEXT:  .LBB154_3: # %atomicrmw.start
 | |
| ; 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:    call __atomic_compare_exchange_4
 | |
| ; RV32I-NEXT:    lw a2, 8(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)
 | |
| ; RV32I-NEXT:    lw ra, 28(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 32
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_min_i32_seq_cst:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    amomin.w.aqrl a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw min i32* %a, i32 %b seq_cst
 | |
|   ret i32 %1
 | |
| }
 | |
| 
 | |
| define i32 @atomicrmw_umax_i32_monotonic(i32 *%a, i32 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_umax_i32_monotonic:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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:    mv s1, a1
 | |
| ; RV32I-NEXT:    mv s2, a0
 | |
| ; RV32I-NEXT:    lw a2, 0(a0)
 | |
| ; RV32I-NEXT:    addi s3, sp, 12
 | |
| ; RV32I-NEXT:  .LBB155_1: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
 | |
| ; RV32I-NEXT:    sw a2, 12(sp)
 | |
| ; RV32I-NEXT:    bltu s1, a2, .LBB155_3
 | |
| ; RV32I-NEXT:  # %bb.2: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB155_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a2, s1
 | |
| ; RV32I-NEXT:  .LBB155_3: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB155_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a0, s2
 | |
| ; RV32I-NEXT:    mv a1, s3
 | |
| ; RV32I-NEXT:    mv a3, zero
 | |
| ; RV32I-NEXT:    mv a4, zero
 | |
| ; RV32I-NEXT:    call __atomic_compare_exchange_4
 | |
| ; RV32I-NEXT:    lw a2, 12(sp)
 | |
| ; RV32I-NEXT:    beqz a0, .LBB155_1
 | |
| ; RV32I-NEXT:  # %bb.4: # %atomicrmw.end
 | |
| ; RV32I-NEXT:    mv a0, a2
 | |
| ; 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_i32_monotonic:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    amomaxu.w a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw umax i32* %a, i32 %b monotonic
 | |
|   ret i32 %1
 | |
| }
 | |
| 
 | |
| define i32 @atomicrmw_umax_i32_acquire(i32 *%a, i32 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_umax_i32_acquire:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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, 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:  .LBB156_1: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
 | |
| ; RV32I-NEXT:    sw a2, 8(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:    mv a2, s1
 | |
| ; RV32I-NEXT:  .LBB156_3: # %atomicrmw.start
 | |
| ; 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:    call __atomic_compare_exchange_4
 | |
| ; RV32I-NEXT:    lw a2, 8(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)
 | |
| ; RV32I-NEXT:    lw ra, 28(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 32
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_umax_i32_acquire:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    amomaxu.w.aq a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw umax i32* %a, i32 %b acquire
 | |
|   ret i32 %1
 | |
| }
 | |
| 
 | |
| define i32 @atomicrmw_umax_i32_release(i32 *%a, i32 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_umax_i32_release:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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, 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:  .LBB157_1: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
 | |
| ; RV32I-NEXT:    sw a2, 8(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:    mv a2, s1
 | |
| ; RV32I-NEXT:  .LBB157_3: # %atomicrmw.start
 | |
| ; 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:    mv a4, zero
 | |
| ; RV32I-NEXT:    call __atomic_compare_exchange_4
 | |
| ; RV32I-NEXT:    lw a2, 8(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)
 | |
| ; RV32I-NEXT:    lw ra, 28(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 32
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_umax_i32_release:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    amomaxu.w.rl a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw umax i32* %a, i32 %b release
 | |
|   ret i32 %1
 | |
| }
 | |
| 
 | |
| define i32 @atomicrmw_umax_i32_acq_rel(i32 *%a, i32 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_umax_i32_acq_rel:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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 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:  .LBB158_1: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
 | |
| ; RV32I-NEXT:    sw a2, 4(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:    mv a2, s1
 | |
| ; RV32I-NEXT:  .LBB158_3: # %atomicrmw.start
 | |
| ; 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:    call __atomic_compare_exchange_4
 | |
| ; RV32I-NEXT:    lw a2, 4(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)
 | |
| ; RV32I-NEXT:    lw ra, 28(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 32
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_umax_i32_acq_rel:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    amomaxu.w.aqrl a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw umax i32* %a, i32 %b acq_rel
 | |
|   ret i32 %1
 | |
| }
 | |
| 
 | |
| define i32 @atomicrmw_umax_i32_seq_cst(i32 *%a, i32 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_umax_i32_seq_cst:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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, 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:  .LBB159_1: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
 | |
| ; RV32I-NEXT:    sw a2, 8(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:    mv a2, s1
 | |
| ; RV32I-NEXT:  .LBB159_3: # %atomicrmw.start
 | |
| ; 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:    call __atomic_compare_exchange_4
 | |
| ; RV32I-NEXT:    lw a2, 8(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)
 | |
| ; RV32I-NEXT:    lw ra, 28(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 32
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_umax_i32_seq_cst:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    amomaxu.w.aqrl a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw umax i32* %a, i32 %b seq_cst
 | |
|   ret i32 %1
 | |
| }
 | |
| 
 | |
| define i32 @atomicrmw_umin_i32_monotonic(i32 *%a, i32 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_umin_i32_monotonic:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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:    mv s1, a1
 | |
| ; RV32I-NEXT:    mv s2, a0
 | |
| ; RV32I-NEXT:    lw a2, 0(a0)
 | |
| ; RV32I-NEXT:    addi s3, sp, 12
 | |
| ; RV32I-NEXT:  .LBB160_1: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
 | |
| ; RV32I-NEXT:    sw a2, 12(sp)
 | |
| ; RV32I-NEXT:    bgeu s1, a2, .LBB160_3
 | |
| ; RV32I-NEXT:  # %bb.2: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB160_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a2, s1
 | |
| ; RV32I-NEXT:  .LBB160_3: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB160_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a0, s2
 | |
| ; RV32I-NEXT:    mv a1, s3
 | |
| ; RV32I-NEXT:    mv a3, zero
 | |
| ; RV32I-NEXT:    mv a4, zero
 | |
| ; RV32I-NEXT:    call __atomic_compare_exchange_4
 | |
| ; RV32I-NEXT:    lw a2, 12(sp)
 | |
| ; RV32I-NEXT:    beqz a0, .LBB160_1
 | |
| ; RV32I-NEXT:  # %bb.4: # %atomicrmw.end
 | |
| ; RV32I-NEXT:    mv a0, a2
 | |
| ; 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_i32_monotonic:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    amominu.w a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw umin i32* %a, i32 %b monotonic
 | |
|   ret i32 %1
 | |
| }
 | |
| 
 | |
| define i32 @atomicrmw_umin_i32_acquire(i32 *%a, i32 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_umin_i32_acquire:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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, 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:  .LBB161_1: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
 | |
| ; RV32I-NEXT:    sw a2, 8(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:    mv a2, s1
 | |
| ; RV32I-NEXT:  .LBB161_3: # %atomicrmw.start
 | |
| ; 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:    call __atomic_compare_exchange_4
 | |
| ; RV32I-NEXT:    lw a2, 8(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)
 | |
| ; RV32I-NEXT:    lw ra, 28(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 32
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_umin_i32_acquire:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    amominu.w.aq a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw umin i32* %a, i32 %b acquire
 | |
|   ret i32 %1
 | |
| }
 | |
| 
 | |
| define i32 @atomicrmw_umin_i32_release(i32 *%a, i32 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_umin_i32_release:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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, 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:  .LBB162_1: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
 | |
| ; RV32I-NEXT:    sw a2, 8(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:    mv a2, s1
 | |
| ; RV32I-NEXT:  .LBB162_3: # %atomicrmw.start
 | |
| ; 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:    mv a4, zero
 | |
| ; RV32I-NEXT:    call __atomic_compare_exchange_4
 | |
| ; RV32I-NEXT:    lw a2, 8(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)
 | |
| ; RV32I-NEXT:    lw ra, 28(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 32
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_umin_i32_release:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    amominu.w.rl a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw umin i32* %a, i32 %b release
 | |
|   ret i32 %1
 | |
| }
 | |
| 
 | |
| define i32 @atomicrmw_umin_i32_acq_rel(i32 *%a, i32 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_umin_i32_acq_rel:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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 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:  .LBB163_1: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
 | |
| ; RV32I-NEXT:    sw a2, 4(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:    mv a2, s1
 | |
| ; RV32I-NEXT:  .LBB163_3: # %atomicrmw.start
 | |
| ; 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:    call __atomic_compare_exchange_4
 | |
| ; RV32I-NEXT:    lw a2, 4(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)
 | |
| ; RV32I-NEXT:    lw ra, 28(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 32
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_umin_i32_acq_rel:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    amominu.w.aqrl a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw umin i32* %a, i32 %b acq_rel
 | |
|   ret i32 %1
 | |
| }
 | |
| 
 | |
| define i32 @atomicrmw_umin_i32_seq_cst(i32 *%a, i32 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_umin_i32_seq_cst:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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, 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:  .LBB164_1: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
 | |
| ; RV32I-NEXT:    sw a2, 8(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:    mv a2, s1
 | |
| ; RV32I-NEXT:  .LBB164_3: # %atomicrmw.start
 | |
| ; 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:    call __atomic_compare_exchange_4
 | |
| ; RV32I-NEXT:    lw a2, 8(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)
 | |
| ; RV32I-NEXT:    lw ra, 28(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 32
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_umin_i32_seq_cst:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    amominu.w.aqrl a0, a1, (a0)
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw umin i32* %a, i32 %b seq_cst
 | |
|   ret i32 %1
 | |
| }
 | |
| 
 | |
| define i64 @atomicrmw_xchg_i64_monotonic(i64* %a, i64 %b) {
 | |
| ; RV32I-LABEL: atomicrmw_xchg_i64_monotonic:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    mv a3, zero
 | |
| ; RV32I-NEXT:    call __atomic_exchange_8
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_xchg_i64_monotonic:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    addi sp, sp, -16
 | |
| ; RV32IA-NEXT:    sw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    mv a3, zero
 | |
| ; RV32IA-NEXT:    call __atomic_exchange_8
 | |
| ; RV32IA-NEXT:    lw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    addi sp, sp, 16
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw xchg i64* %a, i64 %b monotonic
 | |
|   ret i64 %1
 | |
| }
 | |
| 
 | |
| define i64 @atomicrmw_xchg_i64_acquire(i64* %a, i64 %b) {
 | |
| ; RV32I-LABEL: atomicrmw_xchg_i64_acquire:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a3, zero, 2
 | |
| ; RV32I-NEXT:    call __atomic_exchange_8
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_xchg_i64_acquire:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    addi sp, sp, -16
 | |
| ; RV32IA-NEXT:    sw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    addi a3, zero, 2
 | |
| ; RV32IA-NEXT:    call __atomic_exchange_8
 | |
| ; RV32IA-NEXT:    lw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    addi sp, sp, 16
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw xchg i64* %a, i64 %b acquire
 | |
|   ret i64 %1
 | |
| }
 | |
| 
 | |
| define i64 @atomicrmw_xchg_i64_release(i64* %a, i64 %b) {
 | |
| ; RV32I-LABEL: atomicrmw_xchg_i64_release:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a3, zero, 3
 | |
| ; RV32I-NEXT:    call __atomic_exchange_8
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_xchg_i64_release:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    addi sp, sp, -16
 | |
| ; RV32IA-NEXT:    sw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    addi a3, zero, 3
 | |
| ; RV32IA-NEXT:    call __atomic_exchange_8
 | |
| ; RV32IA-NEXT:    lw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    addi sp, sp, 16
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw xchg i64* %a, i64 %b release
 | |
|   ret i64 %1
 | |
| }
 | |
| 
 | |
| define i64 @atomicrmw_xchg_i64_acq_rel(i64* %a, i64 %b) {
 | |
| ; RV32I-LABEL: atomicrmw_xchg_i64_acq_rel:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a3, zero, 4
 | |
| ; RV32I-NEXT:    call __atomic_exchange_8
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_xchg_i64_acq_rel:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    addi sp, sp, -16
 | |
| ; RV32IA-NEXT:    sw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    addi a3, zero, 4
 | |
| ; RV32IA-NEXT:    call __atomic_exchange_8
 | |
| ; RV32IA-NEXT:    lw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    addi sp, sp, 16
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw xchg i64* %a, i64 %b acq_rel
 | |
|   ret i64 %1
 | |
| }
 | |
| 
 | |
| define i64 @atomicrmw_xchg_i64_seq_cst(i64* %a, i64 %b) {
 | |
| ; RV32I-LABEL: atomicrmw_xchg_i64_seq_cst:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a3, zero, 5
 | |
| ; RV32I-NEXT:    call __atomic_exchange_8
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_xchg_i64_seq_cst:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    addi sp, sp, -16
 | |
| ; RV32IA-NEXT:    sw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    addi a3, zero, 5
 | |
| ; RV32IA-NEXT:    call __atomic_exchange_8
 | |
| ; RV32IA-NEXT:    lw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    addi sp, sp, 16
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw xchg i64* %a, i64 %b seq_cst
 | |
|   ret i64 %1
 | |
| }
 | |
| 
 | |
| define i64 @atomicrmw_add_i64_monotonic(i64 *%a, i64 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_add_i64_monotonic:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    mv a3, zero
 | |
| ; RV32I-NEXT:    call __atomic_fetch_add_8
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_add_i64_monotonic:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    addi sp, sp, -16
 | |
| ; RV32IA-NEXT:    sw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    mv a3, zero
 | |
| ; RV32IA-NEXT:    call __atomic_fetch_add_8
 | |
| ; RV32IA-NEXT:    lw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    addi sp, sp, 16
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw add i64* %a, i64 %b monotonic
 | |
|   ret i64 %1
 | |
| }
 | |
| 
 | |
| define i64 @atomicrmw_add_i64_acquire(i64 *%a, i64 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_add_i64_acquire:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a3, zero, 2
 | |
| ; RV32I-NEXT:    call __atomic_fetch_add_8
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_add_i64_acquire:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    addi sp, sp, -16
 | |
| ; RV32IA-NEXT:    sw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    addi a3, zero, 2
 | |
| ; RV32IA-NEXT:    call __atomic_fetch_add_8
 | |
| ; RV32IA-NEXT:    lw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    addi sp, sp, 16
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw add i64* %a, i64 %b acquire
 | |
|   ret i64 %1
 | |
| }
 | |
| 
 | |
| define i64 @atomicrmw_add_i64_release(i64 *%a, i64 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_add_i64_release:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a3, zero, 3
 | |
| ; RV32I-NEXT:    call __atomic_fetch_add_8
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_add_i64_release:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    addi sp, sp, -16
 | |
| ; RV32IA-NEXT:    sw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    addi a3, zero, 3
 | |
| ; RV32IA-NEXT:    call __atomic_fetch_add_8
 | |
| ; RV32IA-NEXT:    lw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    addi sp, sp, 16
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw add i64* %a, i64 %b release
 | |
|   ret i64 %1
 | |
| }
 | |
| 
 | |
| define i64 @atomicrmw_add_i64_acq_rel(i64 *%a, i64 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_add_i64_acq_rel:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a3, zero, 4
 | |
| ; RV32I-NEXT:    call __atomic_fetch_add_8
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_add_i64_acq_rel:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    addi sp, sp, -16
 | |
| ; RV32IA-NEXT:    sw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    addi a3, zero, 4
 | |
| ; RV32IA-NEXT:    call __atomic_fetch_add_8
 | |
| ; RV32IA-NEXT:    lw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    addi sp, sp, 16
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw add i64* %a, i64 %b acq_rel
 | |
|   ret i64 %1
 | |
| }
 | |
| 
 | |
| define i64 @atomicrmw_add_i64_seq_cst(i64 *%a, i64 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_add_i64_seq_cst:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a3, zero, 5
 | |
| ; RV32I-NEXT:    call __atomic_fetch_add_8
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_add_i64_seq_cst:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    addi sp, sp, -16
 | |
| ; RV32IA-NEXT:    sw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    addi a3, zero, 5
 | |
| ; RV32IA-NEXT:    call __atomic_fetch_add_8
 | |
| ; RV32IA-NEXT:    lw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    addi sp, sp, 16
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw add i64* %a, i64 %b seq_cst
 | |
|   ret i64 %1
 | |
| }
 | |
| 
 | |
| define i64 @atomicrmw_sub_i64_monotonic(i64* %a, i64 %b) {
 | |
| ; RV32I-LABEL: atomicrmw_sub_i64_monotonic:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    mv a3, zero
 | |
| ; RV32I-NEXT:    call __atomic_fetch_sub_8
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_sub_i64_monotonic:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    addi sp, sp, -16
 | |
| ; RV32IA-NEXT:    sw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    mv a3, zero
 | |
| ; RV32IA-NEXT:    call __atomic_fetch_sub_8
 | |
| ; RV32IA-NEXT:    lw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    addi sp, sp, 16
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw sub i64* %a, i64 %b monotonic
 | |
|   ret i64 %1
 | |
| }
 | |
| 
 | |
| define i64 @atomicrmw_sub_i64_acquire(i64* %a, i64 %b) {
 | |
| ; RV32I-LABEL: atomicrmw_sub_i64_acquire:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a3, zero, 2
 | |
| ; RV32I-NEXT:    call __atomic_fetch_sub_8
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_sub_i64_acquire:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    addi sp, sp, -16
 | |
| ; RV32IA-NEXT:    sw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    addi a3, zero, 2
 | |
| ; RV32IA-NEXT:    call __atomic_fetch_sub_8
 | |
| ; RV32IA-NEXT:    lw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    addi sp, sp, 16
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw sub i64* %a, i64 %b acquire
 | |
|   ret i64 %1
 | |
| }
 | |
| 
 | |
| define i64 @atomicrmw_sub_i64_release(i64* %a, i64 %b) {
 | |
| ; RV32I-LABEL: atomicrmw_sub_i64_release:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a3, zero, 3
 | |
| ; RV32I-NEXT:    call __atomic_fetch_sub_8
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_sub_i64_release:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    addi sp, sp, -16
 | |
| ; RV32IA-NEXT:    sw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    addi a3, zero, 3
 | |
| ; RV32IA-NEXT:    call __atomic_fetch_sub_8
 | |
| ; RV32IA-NEXT:    lw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    addi sp, sp, 16
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw sub i64* %a, i64 %b release
 | |
|   ret i64 %1
 | |
| }
 | |
| 
 | |
| define i64 @atomicrmw_sub_i64_acq_rel(i64* %a, i64 %b) {
 | |
| ; RV32I-LABEL: atomicrmw_sub_i64_acq_rel:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a3, zero, 4
 | |
| ; RV32I-NEXT:    call __atomic_fetch_sub_8
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_sub_i64_acq_rel:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    addi sp, sp, -16
 | |
| ; RV32IA-NEXT:    sw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    addi a3, zero, 4
 | |
| ; RV32IA-NEXT:    call __atomic_fetch_sub_8
 | |
| ; RV32IA-NEXT:    lw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    addi sp, sp, 16
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw sub i64* %a, i64 %b acq_rel
 | |
|   ret i64 %1
 | |
| }
 | |
| 
 | |
| define i64 @atomicrmw_sub_i64_seq_cst(i64* %a, i64 %b) {
 | |
| ; RV32I-LABEL: atomicrmw_sub_i64_seq_cst:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a3, zero, 5
 | |
| ; RV32I-NEXT:    call __atomic_fetch_sub_8
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_sub_i64_seq_cst:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    addi sp, sp, -16
 | |
| ; RV32IA-NEXT:    sw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    addi a3, zero, 5
 | |
| ; RV32IA-NEXT:    call __atomic_fetch_sub_8
 | |
| ; RV32IA-NEXT:    lw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    addi sp, sp, 16
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw sub i64* %a, i64 %b seq_cst
 | |
|   ret i64 %1
 | |
| }
 | |
| 
 | |
| define i64 @atomicrmw_and_i64_monotonic(i64 *%a, i64 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_and_i64_monotonic:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    mv a3, zero
 | |
| ; RV32I-NEXT:    call __atomic_fetch_and_8
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_and_i64_monotonic:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    addi sp, sp, -16
 | |
| ; RV32IA-NEXT:    sw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    mv a3, zero
 | |
| ; RV32IA-NEXT:    call __atomic_fetch_and_8
 | |
| ; RV32IA-NEXT:    lw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    addi sp, sp, 16
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw and i64* %a, i64 %b monotonic
 | |
|   ret i64 %1
 | |
| }
 | |
| 
 | |
| define i64 @atomicrmw_and_i64_acquire(i64 *%a, i64 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_and_i64_acquire:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a3, zero, 2
 | |
| ; RV32I-NEXT:    call __atomic_fetch_and_8
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_and_i64_acquire:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    addi sp, sp, -16
 | |
| ; RV32IA-NEXT:    sw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    addi a3, zero, 2
 | |
| ; RV32IA-NEXT:    call __atomic_fetch_and_8
 | |
| ; RV32IA-NEXT:    lw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    addi sp, sp, 16
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw and i64* %a, i64 %b acquire
 | |
|   ret i64 %1
 | |
| }
 | |
| 
 | |
| define i64 @atomicrmw_and_i64_release(i64 *%a, i64 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_and_i64_release:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a3, zero, 3
 | |
| ; RV32I-NEXT:    call __atomic_fetch_and_8
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_and_i64_release:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    addi sp, sp, -16
 | |
| ; RV32IA-NEXT:    sw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    addi a3, zero, 3
 | |
| ; RV32IA-NEXT:    call __atomic_fetch_and_8
 | |
| ; RV32IA-NEXT:    lw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    addi sp, sp, 16
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw and i64* %a, i64 %b release
 | |
|   ret i64 %1
 | |
| }
 | |
| 
 | |
| define i64 @atomicrmw_and_i64_acq_rel(i64 *%a, i64 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_and_i64_acq_rel:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a3, zero, 4
 | |
| ; RV32I-NEXT:    call __atomic_fetch_and_8
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_and_i64_acq_rel:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    addi sp, sp, -16
 | |
| ; RV32IA-NEXT:    sw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    addi a3, zero, 4
 | |
| ; RV32IA-NEXT:    call __atomic_fetch_and_8
 | |
| ; RV32IA-NEXT:    lw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    addi sp, sp, 16
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw and i64* %a, i64 %b acq_rel
 | |
|   ret i64 %1
 | |
| }
 | |
| 
 | |
| define i64 @atomicrmw_and_i64_seq_cst(i64 *%a, i64 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_and_i64_seq_cst:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a3, zero, 5
 | |
| ; RV32I-NEXT:    call __atomic_fetch_and_8
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_and_i64_seq_cst:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    addi sp, sp, -16
 | |
| ; RV32IA-NEXT:    sw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    addi a3, zero, 5
 | |
| ; RV32IA-NEXT:    call __atomic_fetch_and_8
 | |
| ; RV32IA-NEXT:    lw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    addi sp, sp, 16
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw and i64* %a, i64 %b seq_cst
 | |
|   ret i64 %1
 | |
| }
 | |
| 
 | |
| define i64 @atomicrmw_nand_i64_monotonic(i64* %a, i64 %b) {
 | |
| ; RV32I-LABEL: atomicrmw_nand_i64_monotonic:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    mv a3, zero
 | |
| ; RV32I-NEXT:    call __atomic_fetch_nand_8
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_nand_i64_monotonic:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    addi sp, sp, -16
 | |
| ; RV32IA-NEXT:    sw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    mv a3, zero
 | |
| ; RV32IA-NEXT:    call __atomic_fetch_nand_8
 | |
| ; RV32IA-NEXT:    lw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    addi sp, sp, 16
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw nand i64* %a, i64 %b monotonic
 | |
|   ret i64 %1
 | |
| }
 | |
| 
 | |
| define i64 @atomicrmw_nand_i64_acquire(i64* %a, i64 %b) {
 | |
| ; RV32I-LABEL: atomicrmw_nand_i64_acquire:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a3, zero, 2
 | |
| ; RV32I-NEXT:    call __atomic_fetch_nand_8
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_nand_i64_acquire:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    addi sp, sp, -16
 | |
| ; RV32IA-NEXT:    sw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    addi a3, zero, 2
 | |
| ; RV32IA-NEXT:    call __atomic_fetch_nand_8
 | |
| ; RV32IA-NEXT:    lw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    addi sp, sp, 16
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw nand i64* %a, i64 %b acquire
 | |
|   ret i64 %1
 | |
| }
 | |
| 
 | |
| define i64 @atomicrmw_nand_i64_release(i64* %a, i64 %b) {
 | |
| ; RV32I-LABEL: atomicrmw_nand_i64_release:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a3, zero, 3
 | |
| ; RV32I-NEXT:    call __atomic_fetch_nand_8
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_nand_i64_release:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    addi sp, sp, -16
 | |
| ; RV32IA-NEXT:    sw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    addi a3, zero, 3
 | |
| ; RV32IA-NEXT:    call __atomic_fetch_nand_8
 | |
| ; RV32IA-NEXT:    lw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    addi sp, sp, 16
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw nand i64* %a, i64 %b release
 | |
|   ret i64 %1
 | |
| }
 | |
| 
 | |
| define i64 @atomicrmw_nand_i64_acq_rel(i64* %a, i64 %b) {
 | |
| ; RV32I-LABEL: atomicrmw_nand_i64_acq_rel:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a3, zero, 4
 | |
| ; RV32I-NEXT:    call __atomic_fetch_nand_8
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_nand_i64_acq_rel:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    addi sp, sp, -16
 | |
| ; RV32IA-NEXT:    sw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    addi a3, zero, 4
 | |
| ; RV32IA-NEXT:    call __atomic_fetch_nand_8
 | |
| ; RV32IA-NEXT:    lw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    addi sp, sp, 16
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw nand i64* %a, i64 %b acq_rel
 | |
|   ret i64 %1
 | |
| }
 | |
| 
 | |
| define i64 @atomicrmw_nand_i64_seq_cst(i64* %a, i64 %b) {
 | |
| ; RV32I-LABEL: atomicrmw_nand_i64_seq_cst:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a3, zero, 5
 | |
| ; RV32I-NEXT:    call __atomic_fetch_nand_8
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_nand_i64_seq_cst:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    addi sp, sp, -16
 | |
| ; RV32IA-NEXT:    sw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    addi a3, zero, 5
 | |
| ; RV32IA-NEXT:    call __atomic_fetch_nand_8
 | |
| ; RV32IA-NEXT:    lw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    addi sp, sp, 16
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw nand i64* %a, i64 %b seq_cst
 | |
|   ret i64 %1
 | |
| }
 | |
| 
 | |
| define i64 @atomicrmw_or_i64_monotonic(i64 *%a, i64 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_or_i64_monotonic:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    mv a3, zero
 | |
| ; RV32I-NEXT:    call __atomic_fetch_or_8
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_or_i64_monotonic:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    addi sp, sp, -16
 | |
| ; RV32IA-NEXT:    sw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    mv a3, zero
 | |
| ; RV32IA-NEXT:    call __atomic_fetch_or_8
 | |
| ; RV32IA-NEXT:    lw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    addi sp, sp, 16
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw or i64* %a, i64 %b monotonic
 | |
|   ret i64 %1
 | |
| }
 | |
| 
 | |
| define i64 @atomicrmw_or_i64_acquire(i64 *%a, i64 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_or_i64_acquire:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a3, zero, 2
 | |
| ; RV32I-NEXT:    call __atomic_fetch_or_8
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_or_i64_acquire:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    addi sp, sp, -16
 | |
| ; RV32IA-NEXT:    sw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    addi a3, zero, 2
 | |
| ; RV32IA-NEXT:    call __atomic_fetch_or_8
 | |
| ; RV32IA-NEXT:    lw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    addi sp, sp, 16
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw or i64* %a, i64 %b acquire
 | |
|   ret i64 %1
 | |
| }
 | |
| 
 | |
| define i64 @atomicrmw_or_i64_release(i64 *%a, i64 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_or_i64_release:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a3, zero, 3
 | |
| ; RV32I-NEXT:    call __atomic_fetch_or_8
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_or_i64_release:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    addi sp, sp, -16
 | |
| ; RV32IA-NEXT:    sw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    addi a3, zero, 3
 | |
| ; RV32IA-NEXT:    call __atomic_fetch_or_8
 | |
| ; RV32IA-NEXT:    lw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    addi sp, sp, 16
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw or i64* %a, i64 %b release
 | |
|   ret i64 %1
 | |
| }
 | |
| 
 | |
| define i64 @atomicrmw_or_i64_acq_rel(i64 *%a, i64 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_or_i64_acq_rel:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a3, zero, 4
 | |
| ; RV32I-NEXT:    call __atomic_fetch_or_8
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_or_i64_acq_rel:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    addi sp, sp, -16
 | |
| ; RV32IA-NEXT:    sw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    addi a3, zero, 4
 | |
| ; RV32IA-NEXT:    call __atomic_fetch_or_8
 | |
| ; RV32IA-NEXT:    lw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    addi sp, sp, 16
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw or i64* %a, i64 %b acq_rel
 | |
|   ret i64 %1
 | |
| }
 | |
| 
 | |
| define i64 @atomicrmw_or_i64_seq_cst(i64 *%a, i64 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_or_i64_seq_cst:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a3, zero, 5
 | |
| ; RV32I-NEXT:    call __atomic_fetch_or_8
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_or_i64_seq_cst:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    addi sp, sp, -16
 | |
| ; RV32IA-NEXT:    sw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    addi a3, zero, 5
 | |
| ; RV32IA-NEXT:    call __atomic_fetch_or_8
 | |
| ; RV32IA-NEXT:    lw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    addi sp, sp, 16
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw or i64* %a, i64 %b seq_cst
 | |
|   ret i64 %1
 | |
| }
 | |
| 
 | |
| define i64 @atomicrmw_xor_i64_monotonic(i64 *%a, i64 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_xor_i64_monotonic:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    mv a3, zero
 | |
| ; RV32I-NEXT:    call __atomic_fetch_xor_8
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_xor_i64_monotonic:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    addi sp, sp, -16
 | |
| ; RV32IA-NEXT:    sw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    mv a3, zero
 | |
| ; RV32IA-NEXT:    call __atomic_fetch_xor_8
 | |
| ; RV32IA-NEXT:    lw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    addi sp, sp, 16
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw xor i64* %a, i64 %b monotonic
 | |
|   ret i64 %1
 | |
| }
 | |
| 
 | |
| define i64 @atomicrmw_xor_i64_acquire(i64 *%a, i64 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_xor_i64_acquire:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a3, zero, 2
 | |
| ; RV32I-NEXT:    call __atomic_fetch_xor_8
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_xor_i64_acquire:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    addi sp, sp, -16
 | |
| ; RV32IA-NEXT:    sw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    addi a3, zero, 2
 | |
| ; RV32IA-NEXT:    call __atomic_fetch_xor_8
 | |
| ; RV32IA-NEXT:    lw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    addi sp, sp, 16
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw xor i64* %a, i64 %b acquire
 | |
|   ret i64 %1
 | |
| }
 | |
| 
 | |
| define i64 @atomicrmw_xor_i64_release(i64 *%a, i64 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_xor_i64_release:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a3, zero, 3
 | |
| ; RV32I-NEXT:    call __atomic_fetch_xor_8
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_xor_i64_release:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    addi sp, sp, -16
 | |
| ; RV32IA-NEXT:    sw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    addi a3, zero, 3
 | |
| ; RV32IA-NEXT:    call __atomic_fetch_xor_8
 | |
| ; RV32IA-NEXT:    lw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    addi sp, sp, 16
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw xor i64* %a, i64 %b release
 | |
|   ret i64 %1
 | |
| }
 | |
| 
 | |
| define i64 @atomicrmw_xor_i64_acq_rel(i64 *%a, i64 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_xor_i64_acq_rel:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a3, zero, 4
 | |
| ; RV32I-NEXT:    call __atomic_fetch_xor_8
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_xor_i64_acq_rel:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    addi sp, sp, -16
 | |
| ; RV32IA-NEXT:    sw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    addi a3, zero, 4
 | |
| ; RV32IA-NEXT:    call __atomic_fetch_xor_8
 | |
| ; RV32IA-NEXT:    lw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    addi sp, sp, 16
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw xor i64* %a, i64 %b acq_rel
 | |
|   ret i64 %1
 | |
| }
 | |
| 
 | |
| define i64 @atomicrmw_xor_i64_seq_cst(i64 *%a, i64 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_xor_i64_seq_cst:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; RV32I-NEXT:    addi sp, sp, -16
 | |
| ; RV32I-NEXT:    sw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi a3, zero, 5
 | |
| ; RV32I-NEXT:    call __atomic_fetch_xor_8
 | |
| ; RV32I-NEXT:    lw ra, 12(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 16
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_xor_i64_seq_cst:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; RV32IA-NEXT:    addi sp, sp, -16
 | |
| ; RV32IA-NEXT:    sw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    addi a3, zero, 5
 | |
| ; RV32IA-NEXT:    call __atomic_fetch_xor_8
 | |
| ; RV32IA-NEXT:    lw ra, 12(sp)
 | |
| ; RV32IA-NEXT:    addi sp, sp, 16
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw xor i64* %a, i64 %b seq_cst
 | |
|   ret i64 %1
 | |
| }
 | |
| 
 | |
| define i64 @atomicrmw_max_i64_monotonic(i64 *%a, i64 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_max_i64_monotonic:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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:    mv s4, sp
 | |
| ; RV32I-NEXT:  .LBB200_1: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
 | |
| ; RV32I-NEXT:    beq a1, s1, .LBB200_3
 | |
| ; RV32I-NEXT:  # %bb.2: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB200_1 Depth=1
 | |
| ; RV32I-NEXT:    slt a0, s1, a1
 | |
| ; RV32I-NEXT:    sw a2, 0(sp)
 | |
| ; RV32I-NEXT:    beqz a0, .LBB200_4
 | |
| ; RV32I-NEXT:    j .LBB200_5
 | |
| ; RV32I-NEXT:  .LBB200_3: # in Loop: Header=BB200_1 Depth=1
 | |
| ; RV32I-NEXT:    sltu a0, s2, a2
 | |
| ; RV32I-NEXT:    sw a2, 0(sp)
 | |
| ; RV32I-NEXT:    bnez a0, .LBB200_5
 | |
| ; RV32I-NEXT:  .LBB200_4: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB200_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a2, s2
 | |
| ; RV32I-NEXT:  .LBB200_5: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB200_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a3, a1
 | |
| ; RV32I-NEXT:    bnez a0, .LBB200_7
 | |
| ; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB200_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a3, s1
 | |
| ; RV32I-NEXT:  .LBB200_7: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB200_1 Depth=1
 | |
| ; RV32I-NEXT:    sw a1, 4(sp)
 | |
| ; RV32I-NEXT:    mv a0, s3
 | |
| ; RV32I-NEXT:    mv a1, s4
 | |
| ; RV32I-NEXT:    mv a4, zero
 | |
| ; RV32I-NEXT:    mv a5, zero
 | |
| ; RV32I-NEXT:    call __atomic_compare_exchange_8
 | |
| ; RV32I-NEXT:    lw a1, 4(sp)
 | |
| ; RV32I-NEXT:    lw a2, 0(sp)
 | |
| ; RV32I-NEXT:    beqz a0, .LBB200_1
 | |
| ; RV32I-NEXT:  # %bb.8: # %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)
 | |
| ; RV32I-NEXT:    lw ra, 28(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 32
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_max_i64_monotonic:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; 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:    mv s4, sp
 | |
| ; RV32IA-NEXT:  .LBB200_1: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    beq a1, s1, .LBB200_3
 | |
| ; RV32IA-NEXT:  # %bb.2: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB200_1 Depth=1
 | |
| ; RV32IA-NEXT:    slt a0, s1, a1
 | |
| ; RV32IA-NEXT:    sw a2, 0(sp)
 | |
| ; RV32IA-NEXT:    beqz a0, .LBB200_4
 | |
| ; RV32IA-NEXT:    j .LBB200_5
 | |
| ; RV32IA-NEXT:  .LBB200_3: # in Loop: Header=BB200_1 Depth=1
 | |
| ; RV32IA-NEXT:    sltu a0, s2, a2
 | |
| ; RV32IA-NEXT:    sw a2, 0(sp)
 | |
| ; RV32IA-NEXT:    bnez a0, .LBB200_5
 | |
| ; RV32IA-NEXT:  .LBB200_4: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB200_1 Depth=1
 | |
| ; RV32IA-NEXT:    mv a2, s2
 | |
| ; RV32IA-NEXT:  .LBB200_5: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB200_1 Depth=1
 | |
| ; RV32IA-NEXT:    mv a3, a1
 | |
| ; RV32IA-NEXT:    bnez a0, .LBB200_7
 | |
| ; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB200_1 Depth=1
 | |
| ; RV32IA-NEXT:    mv a3, s1
 | |
| ; RV32IA-NEXT:  .LBB200_7: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB200_1 Depth=1
 | |
| ; RV32IA-NEXT:    sw a1, 4(sp)
 | |
| ; RV32IA-NEXT:    mv a0, s3
 | |
| ; RV32IA-NEXT:    mv a1, s4
 | |
| ; RV32IA-NEXT:    mv a4, zero
 | |
| ; RV32IA-NEXT:    mv a5, zero
 | |
| ; RV32IA-NEXT:    call __atomic_compare_exchange_8
 | |
| ; RV32IA-NEXT:    lw a1, 4(sp)
 | |
| ; RV32IA-NEXT:    lw a2, 0(sp)
 | |
| ; RV32IA-NEXT:    beqz a0, .LBB200_1
 | |
| ; RV32IA-NEXT:  # %bb.8: # %atomicrmw.end
 | |
| ; RV32IA-NEXT:    mv a0, a2
 | |
| ; 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
 | |
|   %1 = atomicrmw max i64* %a, i64 %b monotonic
 | |
|   ret i64 %1
 | |
| }
 | |
| 
 | |
| define i64 @atomicrmw_max_i64_acquire(i64 *%a, i64 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_max_i64_acquire:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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 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:  # %bb.2: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB201_1 Depth=1
 | |
| ; RV32I-NEXT:    slt a0, s1, a1
 | |
| ; RV32I-NEXT:    sw a2, 0(sp)
 | |
| ; RV32I-NEXT:    beqz a0, .LBB201_4
 | |
| ; RV32I-NEXT:    j .LBB201_5
 | |
| ; RV32I-NEXT:  .LBB201_3: # in Loop: Header=BB201_1 Depth=1
 | |
| ; RV32I-NEXT:    sltu a0, s2, a2
 | |
| ; RV32I-NEXT:    sw a2, 0(sp)
 | |
| ; RV32I-NEXT:    bnez a0, .LBB201_5
 | |
| ; RV32I-NEXT:  .LBB201_4: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB201_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a2, s2
 | |
| ; RV32I-NEXT:  .LBB201_5: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB201_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a3, a1
 | |
| ; RV32I-NEXT:    bnez a0, .LBB201_7
 | |
| ; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB201_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a3, s1
 | |
| ; RV32I-NEXT:  .LBB201_7: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB201_1 Depth=1
 | |
| ; 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:    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)
 | |
| ; 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_acquire:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; 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:    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:  # %bb.2: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB201_1 Depth=1
 | |
| ; RV32IA-NEXT:    slt a0, s1, a1
 | |
| ; RV32IA-NEXT:    sw a2, 0(sp)
 | |
| ; RV32IA-NEXT:    beqz a0, .LBB201_4
 | |
| ; RV32IA-NEXT:    j .LBB201_5
 | |
| ; RV32IA-NEXT:  .LBB201_3: # in Loop: Header=BB201_1 Depth=1
 | |
| ; RV32IA-NEXT:    sltu a0, s2, a2
 | |
| ; RV32IA-NEXT:    sw a2, 0(sp)
 | |
| ; RV32IA-NEXT:    bnez a0, .LBB201_5
 | |
| ; RV32IA-NEXT:  .LBB201_4: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB201_1 Depth=1
 | |
| ; RV32IA-NEXT:    mv a2, s2
 | |
| ; RV32IA-NEXT:  .LBB201_5: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB201_1 Depth=1
 | |
| ; RV32IA-NEXT:    mv a3, a1
 | |
| ; RV32IA-NEXT:    bnez a0, .LBB201_7
 | |
| ; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB201_1 Depth=1
 | |
| ; RV32IA-NEXT:    mv a3, s1
 | |
| ; RV32IA-NEXT:  .LBB201_7: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB201_1 Depth=1
 | |
| ; 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:    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)
 | |
| ; RV32IA-NEXT:    lw s1, 24(sp)
 | |
| ; RV32IA-NEXT:    lw ra, 28(sp)
 | |
| ; RV32IA-NEXT:    addi sp, sp, 32
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw max i64* %a, i64 %b acquire
 | |
|   ret i64 %1
 | |
| }
 | |
| 
 | |
| define i64 @atomicrmw_max_i64_release(i64 *%a, i64 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_max_i64_release:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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 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:  # %bb.2: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB202_1 Depth=1
 | |
| ; RV32I-NEXT:    slt a0, s1, a1
 | |
| ; RV32I-NEXT:    sw a2, 0(sp)
 | |
| ; RV32I-NEXT:    beqz a0, .LBB202_4
 | |
| ; RV32I-NEXT:    j .LBB202_5
 | |
| ; RV32I-NEXT:  .LBB202_3: # in Loop: Header=BB202_1 Depth=1
 | |
| ; RV32I-NEXT:    sltu a0, s2, a2
 | |
| ; RV32I-NEXT:    sw a2, 0(sp)
 | |
| ; RV32I-NEXT:    bnez a0, .LBB202_5
 | |
| ; RV32I-NEXT:  .LBB202_4: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB202_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a2, s2
 | |
| ; RV32I-NEXT:  .LBB202_5: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB202_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a3, a1
 | |
| ; RV32I-NEXT:    bnez a0, .LBB202_7
 | |
| ; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB202_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a3, s1
 | |
| ; RV32I-NEXT:  .LBB202_7: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB202_1 Depth=1
 | |
| ; 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, zero
 | |
| ; RV32I-NEXT:    call __atomic_compare_exchange_8
 | |
| ; RV32I-NEXT:    lw a1, 4(sp)
 | |
| ; RV32I-NEXT:    lw a2, 0(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)
 | |
| ; 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_release:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; 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:    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:  # %bb.2: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB202_1 Depth=1
 | |
| ; RV32IA-NEXT:    slt a0, s1, a1
 | |
| ; RV32IA-NEXT:    sw a2, 0(sp)
 | |
| ; RV32IA-NEXT:    beqz a0, .LBB202_4
 | |
| ; RV32IA-NEXT:    j .LBB202_5
 | |
| ; RV32IA-NEXT:  .LBB202_3: # in Loop: Header=BB202_1 Depth=1
 | |
| ; RV32IA-NEXT:    sltu a0, s2, a2
 | |
| ; RV32IA-NEXT:    sw a2, 0(sp)
 | |
| ; RV32IA-NEXT:    bnez a0, .LBB202_5
 | |
| ; RV32IA-NEXT:  .LBB202_4: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB202_1 Depth=1
 | |
| ; RV32IA-NEXT:    mv a2, s2
 | |
| ; RV32IA-NEXT:  .LBB202_5: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB202_1 Depth=1
 | |
| ; RV32IA-NEXT:    mv a3, a1
 | |
| ; RV32IA-NEXT:    bnez a0, .LBB202_7
 | |
| ; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB202_1 Depth=1
 | |
| ; RV32IA-NEXT:    mv a3, s1
 | |
| ; RV32IA-NEXT:  .LBB202_7: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB202_1 Depth=1
 | |
| ; 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, zero
 | |
| ; RV32IA-NEXT:    call __atomic_compare_exchange_8
 | |
| ; RV32IA-NEXT:    lw a1, 4(sp)
 | |
| ; RV32IA-NEXT:    lw a2, 0(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)
 | |
| ; RV32IA-NEXT:    lw s1, 24(sp)
 | |
| ; RV32IA-NEXT:    lw ra, 28(sp)
 | |
| ; RV32IA-NEXT:    addi sp, sp, 32
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw max i64* %a, i64 %b release
 | |
|   ret i64 %1
 | |
| }
 | |
| 
 | |
| 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:    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:  .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:    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:    bnez a0, .LBB203_5
 | |
| ; RV32I-NEXT:  .LBB203_4: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB203_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a2, s2
 | |
| ; RV32I-NEXT:  .LBB203_5: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB203_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a3, a1
 | |
| ; RV32I-NEXT:    bnez a0, .LBB203_7
 | |
| ; RV32I-NEXT:  # %bb.6: # %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:    mv a0, s3
 | |
| ; RV32I-NEXT:    mv a1, s4
 | |
| ; RV32I-NEXT:    mv a4, s5
 | |
| ; RV32I-NEXT:    mv a5, s6
 | |
| ; RV32I-NEXT:    call __atomic_compare_exchange_8
 | |
| ; RV32I-NEXT:    lw a1, 12(sp)
 | |
| ; RV32I-NEXT:    lw a2, 8(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:    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:    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:  .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:    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:    bnez a0, .LBB203_5
 | |
| ; RV32IA-NEXT:  .LBB203_4: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB203_1 Depth=1
 | |
| ; RV32IA-NEXT:    mv a2, s2
 | |
| ; RV32IA-NEXT:  .LBB203_5: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB203_1 Depth=1
 | |
| ; RV32IA-NEXT:    mv a3, a1
 | |
| ; RV32IA-NEXT:    bnez a0, .LBB203_7
 | |
| ; RV32IA-NEXT:  # %bb.6: # %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:    mv a0, s3
 | |
| ; RV32IA-NEXT:    mv a1, s4
 | |
| ; RV32IA-NEXT:    mv a4, s5
 | |
| ; RV32IA-NEXT:    mv a5, s6
 | |
| ; RV32IA-NEXT:    call __atomic_compare_exchange_8
 | |
| ; RV32IA-NEXT:    lw a1, 12(sp)
 | |
| ; RV32IA-NEXT:    lw a2, 8(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:    ret
 | |
|   %1 = atomicrmw max i64* %a, i64 %b acq_rel
 | |
|   ret i64 %1
 | |
| }
 | |
| 
 | |
| define i64 @atomicrmw_max_i64_seq_cst(i64 *%a, i64 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_max_i64_seq_cst:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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 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:  # %bb.2: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB204_1 Depth=1
 | |
| ; RV32I-NEXT:    slt a0, s1, a1
 | |
| ; RV32I-NEXT:    sw a2, 0(sp)
 | |
| ; RV32I-NEXT:    beqz a0, .LBB204_4
 | |
| ; RV32I-NEXT:    j .LBB204_5
 | |
| ; RV32I-NEXT:  .LBB204_3: # in Loop: Header=BB204_1 Depth=1
 | |
| ; RV32I-NEXT:    sltu a0, s2, a2
 | |
| ; RV32I-NEXT:    sw a2, 0(sp)
 | |
| ; RV32I-NEXT:    bnez a0, .LBB204_5
 | |
| ; RV32I-NEXT:  .LBB204_4: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB204_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a2, s2
 | |
| ; RV32I-NEXT:  .LBB204_5: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB204_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a3, a1
 | |
| ; RV32I-NEXT:    bnez a0, .LBB204_7
 | |
| ; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB204_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a3, s1
 | |
| ; RV32I-NEXT:  .LBB204_7: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB204_1 Depth=1
 | |
| ; 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:    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)
 | |
| ; 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_seq_cst:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; 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:    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:  # %bb.2: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB204_1 Depth=1
 | |
| ; RV32IA-NEXT:    slt a0, s1, a1
 | |
| ; RV32IA-NEXT:    sw a2, 0(sp)
 | |
| ; RV32IA-NEXT:    beqz a0, .LBB204_4
 | |
| ; RV32IA-NEXT:    j .LBB204_5
 | |
| ; RV32IA-NEXT:  .LBB204_3: # in Loop: Header=BB204_1 Depth=1
 | |
| ; RV32IA-NEXT:    sltu a0, s2, a2
 | |
| ; RV32IA-NEXT:    sw a2, 0(sp)
 | |
| ; RV32IA-NEXT:    bnez a0, .LBB204_5
 | |
| ; RV32IA-NEXT:  .LBB204_4: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB204_1 Depth=1
 | |
| ; RV32IA-NEXT:    mv a2, s2
 | |
| ; RV32IA-NEXT:  .LBB204_5: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB204_1 Depth=1
 | |
| ; RV32IA-NEXT:    mv a3, a1
 | |
| ; RV32IA-NEXT:    bnez a0, .LBB204_7
 | |
| ; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB204_1 Depth=1
 | |
| ; RV32IA-NEXT:    mv a3, s1
 | |
| ; RV32IA-NEXT:  .LBB204_7: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB204_1 Depth=1
 | |
| ; 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:    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)
 | |
| ; RV32IA-NEXT:    lw s1, 24(sp)
 | |
| ; RV32IA-NEXT:    lw ra, 28(sp)
 | |
| ; RV32IA-NEXT:    addi sp, sp, 32
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw max i64* %a, i64 %b seq_cst
 | |
|   ret i64 %1
 | |
| }
 | |
| 
 | |
| define i64 @atomicrmw_min_i64_monotonic(i64 *%a, i64 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_min_i64_monotonic:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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:    mv s4, sp
 | |
| ; RV32I-NEXT:  .LBB205_1: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
 | |
| ; RV32I-NEXT:    beq a1, s1, .LBB205_3
 | |
| ; RV32I-NEXT:  # %bb.2: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB205_1 Depth=1
 | |
| ; RV32I-NEXT:    slt a0, s1, a1
 | |
| ; RV32I-NEXT:    j .LBB205_4
 | |
| ; RV32I-NEXT:  .LBB205_3: # in Loop: Header=BB205_1 Depth=1
 | |
| ; RV32I-NEXT:    sltu a0, s2, a2
 | |
| ; RV32I-NEXT:  .LBB205_4: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB205_1 Depth=1
 | |
| ; RV32I-NEXT:    xori a0, a0, 1
 | |
| ; RV32I-NEXT:    sw a2, 0(sp)
 | |
| ; RV32I-NEXT:    bnez a0, .LBB205_6
 | |
| ; RV32I-NEXT:  # %bb.5: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB205_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a2, s2
 | |
| ; RV32I-NEXT:  .LBB205_6: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB205_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a3, a1
 | |
| ; RV32I-NEXT:    bnez a0, .LBB205_8
 | |
| ; RV32I-NEXT:  # %bb.7: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB205_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a3, s1
 | |
| ; RV32I-NEXT:  .LBB205_8: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB205_1 Depth=1
 | |
| ; RV32I-NEXT:    sw a1, 4(sp)
 | |
| ; RV32I-NEXT:    mv a0, s3
 | |
| ; RV32I-NEXT:    mv a1, s4
 | |
| ; RV32I-NEXT:    mv a4, zero
 | |
| ; RV32I-NEXT:    mv a5, zero
 | |
| ; RV32I-NEXT:    call __atomic_compare_exchange_8
 | |
| ; RV32I-NEXT:    lw a1, 4(sp)
 | |
| ; RV32I-NEXT:    lw a2, 0(sp)
 | |
| ; RV32I-NEXT:    beqz a0, .LBB205_1
 | |
| ; RV32I-NEXT:  # %bb.9: # %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)
 | |
| ; RV32I-NEXT:    lw ra, 28(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 32
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_min_i64_monotonic:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; 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:    mv s4, sp
 | |
| ; RV32IA-NEXT:  .LBB205_1: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    beq a1, s1, .LBB205_3
 | |
| ; RV32IA-NEXT:  # %bb.2: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB205_1 Depth=1
 | |
| ; RV32IA-NEXT:    slt a0, s1, a1
 | |
| ; RV32IA-NEXT:    j .LBB205_4
 | |
| ; RV32IA-NEXT:  .LBB205_3: # in Loop: Header=BB205_1 Depth=1
 | |
| ; RV32IA-NEXT:    sltu a0, s2, a2
 | |
| ; RV32IA-NEXT:  .LBB205_4: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB205_1 Depth=1
 | |
| ; RV32IA-NEXT:    xori a0, a0, 1
 | |
| ; RV32IA-NEXT:    sw a2, 0(sp)
 | |
| ; RV32IA-NEXT:    bnez a0, .LBB205_6
 | |
| ; RV32IA-NEXT:  # %bb.5: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB205_1 Depth=1
 | |
| ; RV32IA-NEXT:    mv a2, s2
 | |
| ; RV32IA-NEXT:  .LBB205_6: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB205_1 Depth=1
 | |
| ; RV32IA-NEXT:    mv a3, a1
 | |
| ; RV32IA-NEXT:    bnez a0, .LBB205_8
 | |
| ; RV32IA-NEXT:  # %bb.7: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB205_1 Depth=1
 | |
| ; RV32IA-NEXT:    mv a3, s1
 | |
| ; RV32IA-NEXT:  .LBB205_8: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB205_1 Depth=1
 | |
| ; RV32IA-NEXT:    sw a1, 4(sp)
 | |
| ; RV32IA-NEXT:    mv a0, s3
 | |
| ; RV32IA-NEXT:    mv a1, s4
 | |
| ; RV32IA-NEXT:    mv a4, zero
 | |
| ; RV32IA-NEXT:    mv a5, zero
 | |
| ; RV32IA-NEXT:    call __atomic_compare_exchange_8
 | |
| ; RV32IA-NEXT:    lw a1, 4(sp)
 | |
| ; RV32IA-NEXT:    lw a2, 0(sp)
 | |
| ; RV32IA-NEXT:    beqz a0, .LBB205_1
 | |
| ; RV32IA-NEXT:  # %bb.9: # %atomicrmw.end
 | |
| ; RV32IA-NEXT:    mv a0, a2
 | |
| ; 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
 | |
|   %1 = atomicrmw min i64* %a, i64 %b monotonic
 | |
|   ret i64 %1
 | |
| }
 | |
| 
 | |
| define i64 @atomicrmw_min_i64_acquire(i64 *%a, i64 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_min_i64_acquire:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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 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:  # %bb.2: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB206_1 Depth=1
 | |
| ; RV32I-NEXT:    slt a0, s1, a1
 | |
| ; RV32I-NEXT:    j .LBB206_4
 | |
| ; RV32I-NEXT:  .LBB206_3: # in Loop: Header=BB206_1 Depth=1
 | |
| ; RV32I-NEXT:    sltu a0, s2, a2
 | |
| ; RV32I-NEXT:  .LBB206_4: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB206_1 Depth=1
 | |
| ; RV32I-NEXT:    xori a0, a0, 1
 | |
| ; RV32I-NEXT:    sw a2, 0(sp)
 | |
| ; RV32I-NEXT:    bnez a0, .LBB206_6
 | |
| ; RV32I-NEXT:  # %bb.5: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB206_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a2, s2
 | |
| ; RV32I-NEXT:  .LBB206_6: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB206_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a3, a1
 | |
| ; RV32I-NEXT:    bnez a0, .LBB206_8
 | |
| ; RV32I-NEXT:  # %bb.7: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB206_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a3, s1
 | |
| ; RV32I-NEXT:  .LBB206_8: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB206_1 Depth=1
 | |
| ; 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:    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)
 | |
| ; 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_acquire:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; 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:    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:  # %bb.2: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB206_1 Depth=1
 | |
| ; RV32IA-NEXT:    slt a0, s1, a1
 | |
| ; RV32IA-NEXT:    j .LBB206_4
 | |
| ; RV32IA-NEXT:  .LBB206_3: # in Loop: Header=BB206_1 Depth=1
 | |
| ; RV32IA-NEXT:    sltu a0, s2, a2
 | |
| ; RV32IA-NEXT:  .LBB206_4: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB206_1 Depth=1
 | |
| ; RV32IA-NEXT:    xori a0, a0, 1
 | |
| ; RV32IA-NEXT:    sw a2, 0(sp)
 | |
| ; RV32IA-NEXT:    bnez a0, .LBB206_6
 | |
| ; RV32IA-NEXT:  # %bb.5: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB206_1 Depth=1
 | |
| ; RV32IA-NEXT:    mv a2, s2
 | |
| ; RV32IA-NEXT:  .LBB206_6: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB206_1 Depth=1
 | |
| ; RV32IA-NEXT:    mv a3, a1
 | |
| ; RV32IA-NEXT:    bnez a0, .LBB206_8
 | |
| ; RV32IA-NEXT:  # %bb.7: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB206_1 Depth=1
 | |
| ; RV32IA-NEXT:    mv a3, s1
 | |
| ; RV32IA-NEXT:  .LBB206_8: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB206_1 Depth=1
 | |
| ; 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:    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)
 | |
| ; RV32IA-NEXT:    lw s1, 24(sp)
 | |
| ; RV32IA-NEXT:    lw ra, 28(sp)
 | |
| ; RV32IA-NEXT:    addi sp, sp, 32
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw min i64* %a, i64 %b acquire
 | |
|   ret i64 %1
 | |
| }
 | |
| 
 | |
| define i64 @atomicrmw_min_i64_release(i64 *%a, i64 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_min_i64_release:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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 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:  # %bb.2: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB207_1 Depth=1
 | |
| ; RV32I-NEXT:    slt a0, s1, a1
 | |
| ; RV32I-NEXT:    j .LBB207_4
 | |
| ; RV32I-NEXT:  .LBB207_3: # in Loop: Header=BB207_1 Depth=1
 | |
| ; RV32I-NEXT:    sltu a0, s2, a2
 | |
| ; RV32I-NEXT:  .LBB207_4: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB207_1 Depth=1
 | |
| ; RV32I-NEXT:    xori a0, a0, 1
 | |
| ; RV32I-NEXT:    sw a2, 0(sp)
 | |
| ; RV32I-NEXT:    bnez a0, .LBB207_6
 | |
| ; RV32I-NEXT:  # %bb.5: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB207_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a2, s2
 | |
| ; RV32I-NEXT:  .LBB207_6: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB207_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a3, a1
 | |
| ; RV32I-NEXT:    bnez a0, .LBB207_8
 | |
| ; RV32I-NEXT:  # %bb.7: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB207_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a3, s1
 | |
| ; RV32I-NEXT:  .LBB207_8: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB207_1 Depth=1
 | |
| ; 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, zero
 | |
| ; RV32I-NEXT:    call __atomic_compare_exchange_8
 | |
| ; RV32I-NEXT:    lw a1, 4(sp)
 | |
| ; RV32I-NEXT:    lw a2, 0(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)
 | |
| ; 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_release:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; 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:    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:  # %bb.2: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB207_1 Depth=1
 | |
| ; RV32IA-NEXT:    slt a0, s1, a1
 | |
| ; RV32IA-NEXT:    j .LBB207_4
 | |
| ; RV32IA-NEXT:  .LBB207_3: # in Loop: Header=BB207_1 Depth=1
 | |
| ; RV32IA-NEXT:    sltu a0, s2, a2
 | |
| ; RV32IA-NEXT:  .LBB207_4: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB207_1 Depth=1
 | |
| ; RV32IA-NEXT:    xori a0, a0, 1
 | |
| ; RV32IA-NEXT:    sw a2, 0(sp)
 | |
| ; RV32IA-NEXT:    bnez a0, .LBB207_6
 | |
| ; RV32IA-NEXT:  # %bb.5: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB207_1 Depth=1
 | |
| ; RV32IA-NEXT:    mv a2, s2
 | |
| ; RV32IA-NEXT:  .LBB207_6: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB207_1 Depth=1
 | |
| ; RV32IA-NEXT:    mv a3, a1
 | |
| ; RV32IA-NEXT:    bnez a0, .LBB207_8
 | |
| ; RV32IA-NEXT:  # %bb.7: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB207_1 Depth=1
 | |
| ; RV32IA-NEXT:    mv a3, s1
 | |
| ; RV32IA-NEXT:  .LBB207_8: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB207_1 Depth=1
 | |
| ; 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, zero
 | |
| ; RV32IA-NEXT:    call __atomic_compare_exchange_8
 | |
| ; RV32IA-NEXT:    lw a1, 4(sp)
 | |
| ; RV32IA-NEXT:    lw a2, 0(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)
 | |
| ; RV32IA-NEXT:    lw s1, 24(sp)
 | |
| ; RV32IA-NEXT:    lw ra, 28(sp)
 | |
| ; RV32IA-NEXT:    addi sp, sp, 32
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw min i64* %a, i64 %b release
 | |
|   ret i64 %1
 | |
| }
 | |
| 
 | |
| 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:    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:  .LBB208_1: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
 | |
| ; RV32I-NEXT:    beq a1, s1, .LBB208_3
 | |
| ; RV32I-NEXT:  # %bb.2: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB208_1 Depth=1
 | |
| ; RV32I-NEXT:    slt a0, s1, a1
 | |
| ; RV32I-NEXT:    j .LBB208_4
 | |
| ; RV32I-NEXT:  .LBB208_3: # in Loop: Header=BB208_1 Depth=1
 | |
| ; RV32I-NEXT:    sltu a0, s2, a2
 | |
| ; 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:    bnez a0, .LBB208_6
 | |
| ; RV32I-NEXT:  # %bb.5: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB208_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a2, s2
 | |
| ; RV32I-NEXT:  .LBB208_6: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB208_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a3, a1
 | |
| ; RV32I-NEXT:    bnez a0, .LBB208_8
 | |
| ; RV32I-NEXT:  # %bb.7: # %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:    mv a0, s3
 | |
| ; RV32I-NEXT:    mv a1, s4
 | |
| ; RV32I-NEXT:    mv a4, s5
 | |
| ; RV32I-NEXT:    mv a5, s6
 | |
| ; RV32I-NEXT:    call __atomic_compare_exchange_8
 | |
| ; RV32I-NEXT:    lw a1, 12(sp)
 | |
| ; RV32I-NEXT:    lw a2, 8(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:    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:    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:  .LBB208_1: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    beq a1, s1, .LBB208_3
 | |
| ; RV32IA-NEXT:  # %bb.2: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB208_1 Depth=1
 | |
| ; RV32IA-NEXT:    slt a0, s1, a1
 | |
| ; RV32IA-NEXT:    j .LBB208_4
 | |
| ; RV32IA-NEXT:  .LBB208_3: # in Loop: Header=BB208_1 Depth=1
 | |
| ; RV32IA-NEXT:    sltu a0, s2, a2
 | |
| ; 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:    bnez a0, .LBB208_6
 | |
| ; RV32IA-NEXT:  # %bb.5: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB208_1 Depth=1
 | |
| ; RV32IA-NEXT:    mv a2, s2
 | |
| ; RV32IA-NEXT:  .LBB208_6: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB208_1 Depth=1
 | |
| ; RV32IA-NEXT:    mv a3, a1
 | |
| ; RV32IA-NEXT:    bnez a0, .LBB208_8
 | |
| ; RV32IA-NEXT:  # %bb.7: # %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:    mv a0, s3
 | |
| ; RV32IA-NEXT:    mv a1, s4
 | |
| ; RV32IA-NEXT:    mv a4, s5
 | |
| ; RV32IA-NEXT:    mv a5, s6
 | |
| ; RV32IA-NEXT:    call __atomic_compare_exchange_8
 | |
| ; RV32IA-NEXT:    lw a1, 12(sp)
 | |
| ; RV32IA-NEXT:    lw a2, 8(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:    ret
 | |
|   %1 = atomicrmw min i64* %a, i64 %b acq_rel
 | |
|   ret i64 %1
 | |
| }
 | |
| 
 | |
| define i64 @atomicrmw_min_i64_seq_cst(i64 *%a, i64 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_min_i64_seq_cst:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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 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:  # %bb.2: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB209_1 Depth=1
 | |
| ; RV32I-NEXT:    slt a0, s1, a1
 | |
| ; RV32I-NEXT:    j .LBB209_4
 | |
| ; RV32I-NEXT:  .LBB209_3: # in Loop: Header=BB209_1 Depth=1
 | |
| ; RV32I-NEXT:    sltu a0, s2, a2
 | |
| ; RV32I-NEXT:  .LBB209_4: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB209_1 Depth=1
 | |
| ; RV32I-NEXT:    xori a0, a0, 1
 | |
| ; RV32I-NEXT:    sw a2, 0(sp)
 | |
| ; RV32I-NEXT:    bnez a0, .LBB209_6
 | |
| ; RV32I-NEXT:  # %bb.5: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB209_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a2, s2
 | |
| ; RV32I-NEXT:  .LBB209_6: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB209_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a3, a1
 | |
| ; RV32I-NEXT:    bnez a0, .LBB209_8
 | |
| ; RV32I-NEXT:  # %bb.7: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB209_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a3, s1
 | |
| ; RV32I-NEXT:  .LBB209_8: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB209_1 Depth=1
 | |
| ; 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:    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)
 | |
| ; 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_seq_cst:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; 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:    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:  # %bb.2: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB209_1 Depth=1
 | |
| ; RV32IA-NEXT:    slt a0, s1, a1
 | |
| ; RV32IA-NEXT:    j .LBB209_4
 | |
| ; RV32IA-NEXT:  .LBB209_3: # in Loop: Header=BB209_1 Depth=1
 | |
| ; RV32IA-NEXT:    sltu a0, s2, a2
 | |
| ; RV32IA-NEXT:  .LBB209_4: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB209_1 Depth=1
 | |
| ; RV32IA-NEXT:    xori a0, a0, 1
 | |
| ; RV32IA-NEXT:    sw a2, 0(sp)
 | |
| ; RV32IA-NEXT:    bnez a0, .LBB209_6
 | |
| ; RV32IA-NEXT:  # %bb.5: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB209_1 Depth=1
 | |
| ; RV32IA-NEXT:    mv a2, s2
 | |
| ; RV32IA-NEXT:  .LBB209_6: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB209_1 Depth=1
 | |
| ; RV32IA-NEXT:    mv a3, a1
 | |
| ; RV32IA-NEXT:    bnez a0, .LBB209_8
 | |
| ; RV32IA-NEXT:  # %bb.7: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB209_1 Depth=1
 | |
| ; RV32IA-NEXT:    mv a3, s1
 | |
| ; RV32IA-NEXT:  .LBB209_8: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB209_1 Depth=1
 | |
| ; 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:    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)
 | |
| ; RV32IA-NEXT:    lw s1, 24(sp)
 | |
| ; RV32IA-NEXT:    lw ra, 28(sp)
 | |
| ; RV32IA-NEXT:    addi sp, sp, 32
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw min i64* %a, i64 %b seq_cst
 | |
|   ret i64 %1
 | |
| }
 | |
| 
 | |
| define i64 @atomicrmw_umax_i64_monotonic(i64 *%a, i64 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_umax_i64_monotonic:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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:    mv s4, sp
 | |
| ; RV32I-NEXT:  .LBB210_1: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
 | |
| ; RV32I-NEXT:    beq a1, s1, .LBB210_3
 | |
| ; RV32I-NEXT:  # %bb.2: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB210_1 Depth=1
 | |
| ; RV32I-NEXT:    sltu a0, s1, a1
 | |
| ; RV32I-NEXT:    sw a2, 0(sp)
 | |
| ; RV32I-NEXT:    beqz a0, .LBB210_4
 | |
| ; RV32I-NEXT:    j .LBB210_5
 | |
| ; RV32I-NEXT:  .LBB210_3: # in Loop: Header=BB210_1 Depth=1
 | |
| ; RV32I-NEXT:    sltu a0, s2, a2
 | |
| ; RV32I-NEXT:    sw a2, 0(sp)
 | |
| ; RV32I-NEXT:    bnez a0, .LBB210_5
 | |
| ; RV32I-NEXT:  .LBB210_4: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB210_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a2, s2
 | |
| ; RV32I-NEXT:  .LBB210_5: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB210_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a3, a1
 | |
| ; RV32I-NEXT:    bnez a0, .LBB210_7
 | |
| ; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB210_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a3, s1
 | |
| ; RV32I-NEXT:  .LBB210_7: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB210_1 Depth=1
 | |
| ; RV32I-NEXT:    sw a1, 4(sp)
 | |
| ; RV32I-NEXT:    mv a0, s3
 | |
| ; RV32I-NEXT:    mv a1, s4
 | |
| ; RV32I-NEXT:    mv a4, zero
 | |
| ; RV32I-NEXT:    mv a5, zero
 | |
| ; RV32I-NEXT:    call __atomic_compare_exchange_8
 | |
| ; RV32I-NEXT:    lw a1, 4(sp)
 | |
| ; RV32I-NEXT:    lw a2, 0(sp)
 | |
| ; RV32I-NEXT:    beqz a0, .LBB210_1
 | |
| ; RV32I-NEXT:  # %bb.8: # %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)
 | |
| ; RV32I-NEXT:    lw ra, 28(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 32
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_umax_i64_monotonic:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; 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:    mv s4, sp
 | |
| ; RV32IA-NEXT:  .LBB210_1: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    beq a1, s1, .LBB210_3
 | |
| ; RV32IA-NEXT:  # %bb.2: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB210_1 Depth=1
 | |
| ; RV32IA-NEXT:    sltu a0, s1, a1
 | |
| ; RV32IA-NEXT:    sw a2, 0(sp)
 | |
| ; RV32IA-NEXT:    beqz a0, .LBB210_4
 | |
| ; RV32IA-NEXT:    j .LBB210_5
 | |
| ; RV32IA-NEXT:  .LBB210_3: # in Loop: Header=BB210_1 Depth=1
 | |
| ; RV32IA-NEXT:    sltu a0, s2, a2
 | |
| ; RV32IA-NEXT:    sw a2, 0(sp)
 | |
| ; RV32IA-NEXT:    bnez a0, .LBB210_5
 | |
| ; RV32IA-NEXT:  .LBB210_4: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB210_1 Depth=1
 | |
| ; RV32IA-NEXT:    mv a2, s2
 | |
| ; RV32IA-NEXT:  .LBB210_5: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB210_1 Depth=1
 | |
| ; RV32IA-NEXT:    mv a3, a1
 | |
| ; RV32IA-NEXT:    bnez a0, .LBB210_7
 | |
| ; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB210_1 Depth=1
 | |
| ; RV32IA-NEXT:    mv a3, s1
 | |
| ; RV32IA-NEXT:  .LBB210_7: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB210_1 Depth=1
 | |
| ; RV32IA-NEXT:    sw a1, 4(sp)
 | |
| ; RV32IA-NEXT:    mv a0, s3
 | |
| ; RV32IA-NEXT:    mv a1, s4
 | |
| ; RV32IA-NEXT:    mv a4, zero
 | |
| ; RV32IA-NEXT:    mv a5, zero
 | |
| ; RV32IA-NEXT:    call __atomic_compare_exchange_8
 | |
| ; RV32IA-NEXT:    lw a1, 4(sp)
 | |
| ; RV32IA-NEXT:    lw a2, 0(sp)
 | |
| ; RV32IA-NEXT:    beqz a0, .LBB210_1
 | |
| ; RV32IA-NEXT:  # %bb.8: # %atomicrmw.end
 | |
| ; RV32IA-NEXT:    mv a0, a2
 | |
| ; 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
 | |
|   %1 = atomicrmw umax i64* %a, i64 %b monotonic
 | |
|   ret i64 %1
 | |
| }
 | |
| 
 | |
| define i64 @atomicrmw_umax_i64_acquire(i64 *%a, i64 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_umax_i64_acquire:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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 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:  # %bb.2: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB211_1 Depth=1
 | |
| ; RV32I-NEXT:    sltu a0, s1, a1
 | |
| ; RV32I-NEXT:    sw a2, 0(sp)
 | |
| ; RV32I-NEXT:    beqz a0, .LBB211_4
 | |
| ; RV32I-NEXT:    j .LBB211_5
 | |
| ; RV32I-NEXT:  .LBB211_3: # in Loop: Header=BB211_1 Depth=1
 | |
| ; RV32I-NEXT:    sltu a0, s2, a2
 | |
| ; RV32I-NEXT:    sw a2, 0(sp)
 | |
| ; RV32I-NEXT:    bnez a0, .LBB211_5
 | |
| ; RV32I-NEXT:  .LBB211_4: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB211_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a2, s2
 | |
| ; RV32I-NEXT:  .LBB211_5: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB211_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a3, a1
 | |
| ; RV32I-NEXT:    bnez a0, .LBB211_7
 | |
| ; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB211_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a3, s1
 | |
| ; RV32I-NEXT:  .LBB211_7: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB211_1 Depth=1
 | |
| ; 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:    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)
 | |
| ; 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_acquire:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; 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:    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:  # %bb.2: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB211_1 Depth=1
 | |
| ; RV32IA-NEXT:    sltu a0, s1, a1
 | |
| ; RV32IA-NEXT:    sw a2, 0(sp)
 | |
| ; RV32IA-NEXT:    beqz a0, .LBB211_4
 | |
| ; RV32IA-NEXT:    j .LBB211_5
 | |
| ; RV32IA-NEXT:  .LBB211_3: # in Loop: Header=BB211_1 Depth=1
 | |
| ; RV32IA-NEXT:    sltu a0, s2, a2
 | |
| ; RV32IA-NEXT:    sw a2, 0(sp)
 | |
| ; RV32IA-NEXT:    bnez a0, .LBB211_5
 | |
| ; RV32IA-NEXT:  .LBB211_4: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB211_1 Depth=1
 | |
| ; RV32IA-NEXT:    mv a2, s2
 | |
| ; RV32IA-NEXT:  .LBB211_5: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB211_1 Depth=1
 | |
| ; RV32IA-NEXT:    mv a3, a1
 | |
| ; RV32IA-NEXT:    bnez a0, .LBB211_7
 | |
| ; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB211_1 Depth=1
 | |
| ; RV32IA-NEXT:    mv a3, s1
 | |
| ; RV32IA-NEXT:  .LBB211_7: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB211_1 Depth=1
 | |
| ; 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:    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)
 | |
| ; RV32IA-NEXT:    lw s1, 24(sp)
 | |
| ; RV32IA-NEXT:    lw ra, 28(sp)
 | |
| ; RV32IA-NEXT:    addi sp, sp, 32
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw umax i64* %a, i64 %b acquire
 | |
|   ret i64 %1
 | |
| }
 | |
| 
 | |
| define i64 @atomicrmw_umax_i64_release(i64 *%a, i64 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_umax_i64_release:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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 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:  # %bb.2: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB212_1 Depth=1
 | |
| ; RV32I-NEXT:    sltu a0, s1, a1
 | |
| ; RV32I-NEXT:    sw a2, 0(sp)
 | |
| ; RV32I-NEXT:    beqz a0, .LBB212_4
 | |
| ; RV32I-NEXT:    j .LBB212_5
 | |
| ; RV32I-NEXT:  .LBB212_3: # in Loop: Header=BB212_1 Depth=1
 | |
| ; RV32I-NEXT:    sltu a0, s2, a2
 | |
| ; RV32I-NEXT:    sw a2, 0(sp)
 | |
| ; RV32I-NEXT:    bnez a0, .LBB212_5
 | |
| ; RV32I-NEXT:  .LBB212_4: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB212_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a2, s2
 | |
| ; RV32I-NEXT:  .LBB212_5: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB212_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a3, a1
 | |
| ; RV32I-NEXT:    bnez a0, .LBB212_7
 | |
| ; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB212_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a3, s1
 | |
| ; RV32I-NEXT:  .LBB212_7: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB212_1 Depth=1
 | |
| ; 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, zero
 | |
| ; RV32I-NEXT:    call __atomic_compare_exchange_8
 | |
| ; RV32I-NEXT:    lw a1, 4(sp)
 | |
| ; RV32I-NEXT:    lw a2, 0(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)
 | |
| ; 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_release:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; 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:    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:  # %bb.2: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB212_1 Depth=1
 | |
| ; RV32IA-NEXT:    sltu a0, s1, a1
 | |
| ; RV32IA-NEXT:    sw a2, 0(sp)
 | |
| ; RV32IA-NEXT:    beqz a0, .LBB212_4
 | |
| ; RV32IA-NEXT:    j .LBB212_5
 | |
| ; RV32IA-NEXT:  .LBB212_3: # in Loop: Header=BB212_1 Depth=1
 | |
| ; RV32IA-NEXT:    sltu a0, s2, a2
 | |
| ; RV32IA-NEXT:    sw a2, 0(sp)
 | |
| ; RV32IA-NEXT:    bnez a0, .LBB212_5
 | |
| ; RV32IA-NEXT:  .LBB212_4: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB212_1 Depth=1
 | |
| ; RV32IA-NEXT:    mv a2, s2
 | |
| ; RV32IA-NEXT:  .LBB212_5: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB212_1 Depth=1
 | |
| ; RV32IA-NEXT:    mv a3, a1
 | |
| ; RV32IA-NEXT:    bnez a0, .LBB212_7
 | |
| ; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB212_1 Depth=1
 | |
| ; RV32IA-NEXT:    mv a3, s1
 | |
| ; RV32IA-NEXT:  .LBB212_7: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB212_1 Depth=1
 | |
| ; 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, zero
 | |
| ; RV32IA-NEXT:    call __atomic_compare_exchange_8
 | |
| ; RV32IA-NEXT:    lw a1, 4(sp)
 | |
| ; RV32IA-NEXT:    lw a2, 0(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)
 | |
| ; RV32IA-NEXT:    lw s1, 24(sp)
 | |
| ; RV32IA-NEXT:    lw ra, 28(sp)
 | |
| ; RV32IA-NEXT:    addi sp, sp, 32
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw umax i64* %a, i64 %b release
 | |
|   ret i64 %1
 | |
| }
 | |
| 
 | |
| 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:    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:  .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:    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:    bnez a0, .LBB213_5
 | |
| ; RV32I-NEXT:  .LBB213_4: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB213_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a2, s2
 | |
| ; RV32I-NEXT:  .LBB213_5: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB213_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a3, a1
 | |
| ; RV32I-NEXT:    bnez a0, .LBB213_7
 | |
| ; RV32I-NEXT:  # %bb.6: # %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:    mv a0, s3
 | |
| ; RV32I-NEXT:    mv a1, s4
 | |
| ; RV32I-NEXT:    mv a4, s5
 | |
| ; RV32I-NEXT:    mv a5, s6
 | |
| ; RV32I-NEXT:    call __atomic_compare_exchange_8
 | |
| ; RV32I-NEXT:    lw a1, 12(sp)
 | |
| ; RV32I-NEXT:    lw a2, 8(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:    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:    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:  .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:    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:    bnez a0, .LBB213_5
 | |
| ; RV32IA-NEXT:  .LBB213_4: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB213_1 Depth=1
 | |
| ; RV32IA-NEXT:    mv a2, s2
 | |
| ; RV32IA-NEXT:  .LBB213_5: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB213_1 Depth=1
 | |
| ; RV32IA-NEXT:    mv a3, a1
 | |
| ; RV32IA-NEXT:    bnez a0, .LBB213_7
 | |
| ; RV32IA-NEXT:  # %bb.6: # %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:    mv a0, s3
 | |
| ; RV32IA-NEXT:    mv a1, s4
 | |
| ; RV32IA-NEXT:    mv a4, s5
 | |
| ; RV32IA-NEXT:    mv a5, s6
 | |
| ; RV32IA-NEXT:    call __atomic_compare_exchange_8
 | |
| ; RV32IA-NEXT:    lw a1, 12(sp)
 | |
| ; RV32IA-NEXT:    lw a2, 8(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:    ret
 | |
|   %1 = atomicrmw umax i64* %a, i64 %b acq_rel
 | |
|   ret i64 %1
 | |
| }
 | |
| 
 | |
| define i64 @atomicrmw_umax_i64_seq_cst(i64 *%a, i64 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_umax_i64_seq_cst:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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 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:  # %bb.2: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB214_1 Depth=1
 | |
| ; RV32I-NEXT:    sltu a0, s1, a1
 | |
| ; RV32I-NEXT:    sw a2, 0(sp)
 | |
| ; RV32I-NEXT:    beqz a0, .LBB214_4
 | |
| ; RV32I-NEXT:    j .LBB214_5
 | |
| ; RV32I-NEXT:  .LBB214_3: # in Loop: Header=BB214_1 Depth=1
 | |
| ; RV32I-NEXT:    sltu a0, s2, a2
 | |
| ; RV32I-NEXT:    sw a2, 0(sp)
 | |
| ; RV32I-NEXT:    bnez a0, .LBB214_5
 | |
| ; RV32I-NEXT:  .LBB214_4: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB214_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a2, s2
 | |
| ; RV32I-NEXT:  .LBB214_5: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB214_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a3, a1
 | |
| ; RV32I-NEXT:    bnez a0, .LBB214_7
 | |
| ; RV32I-NEXT:  # %bb.6: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB214_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a3, s1
 | |
| ; RV32I-NEXT:  .LBB214_7: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB214_1 Depth=1
 | |
| ; 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:    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)
 | |
| ; 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_seq_cst:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; 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:    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:  # %bb.2: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB214_1 Depth=1
 | |
| ; RV32IA-NEXT:    sltu a0, s1, a1
 | |
| ; RV32IA-NEXT:    sw a2, 0(sp)
 | |
| ; RV32IA-NEXT:    beqz a0, .LBB214_4
 | |
| ; RV32IA-NEXT:    j .LBB214_5
 | |
| ; RV32IA-NEXT:  .LBB214_3: # in Loop: Header=BB214_1 Depth=1
 | |
| ; RV32IA-NEXT:    sltu a0, s2, a2
 | |
| ; RV32IA-NEXT:    sw a2, 0(sp)
 | |
| ; RV32IA-NEXT:    bnez a0, .LBB214_5
 | |
| ; RV32IA-NEXT:  .LBB214_4: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB214_1 Depth=1
 | |
| ; RV32IA-NEXT:    mv a2, s2
 | |
| ; RV32IA-NEXT:  .LBB214_5: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB214_1 Depth=1
 | |
| ; RV32IA-NEXT:    mv a3, a1
 | |
| ; RV32IA-NEXT:    bnez a0, .LBB214_7
 | |
| ; RV32IA-NEXT:  # %bb.6: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB214_1 Depth=1
 | |
| ; RV32IA-NEXT:    mv a3, s1
 | |
| ; RV32IA-NEXT:  .LBB214_7: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB214_1 Depth=1
 | |
| ; 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:    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)
 | |
| ; RV32IA-NEXT:    lw s1, 24(sp)
 | |
| ; RV32IA-NEXT:    lw ra, 28(sp)
 | |
| ; RV32IA-NEXT:    addi sp, sp, 32
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw umax i64* %a, i64 %b seq_cst
 | |
|   ret i64 %1
 | |
| }
 | |
| 
 | |
| define i64 @atomicrmw_umin_i64_monotonic(i64 *%a, i64 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_umin_i64_monotonic:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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:    mv s4, sp
 | |
| ; RV32I-NEXT:  .LBB215_1: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
 | |
| ; RV32I-NEXT:    beq a1, s1, .LBB215_3
 | |
| ; RV32I-NEXT:  # %bb.2: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB215_1 Depth=1
 | |
| ; RV32I-NEXT:    sltu a0, s1, a1
 | |
| ; RV32I-NEXT:    j .LBB215_4
 | |
| ; RV32I-NEXT:  .LBB215_3: # in Loop: Header=BB215_1 Depth=1
 | |
| ; RV32I-NEXT:    sltu a0, s2, a2
 | |
| ; RV32I-NEXT:  .LBB215_4: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB215_1 Depth=1
 | |
| ; RV32I-NEXT:    xori a0, a0, 1
 | |
| ; RV32I-NEXT:    sw a2, 0(sp)
 | |
| ; RV32I-NEXT:    bnez a0, .LBB215_6
 | |
| ; RV32I-NEXT:  # %bb.5: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB215_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a2, s2
 | |
| ; RV32I-NEXT:  .LBB215_6: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB215_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a3, a1
 | |
| ; RV32I-NEXT:    bnez a0, .LBB215_8
 | |
| ; RV32I-NEXT:  # %bb.7: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB215_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a3, s1
 | |
| ; RV32I-NEXT:  .LBB215_8: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB215_1 Depth=1
 | |
| ; RV32I-NEXT:    sw a1, 4(sp)
 | |
| ; RV32I-NEXT:    mv a0, s3
 | |
| ; RV32I-NEXT:    mv a1, s4
 | |
| ; RV32I-NEXT:    mv a4, zero
 | |
| ; RV32I-NEXT:    mv a5, zero
 | |
| ; RV32I-NEXT:    call __atomic_compare_exchange_8
 | |
| ; RV32I-NEXT:    lw a1, 4(sp)
 | |
| ; RV32I-NEXT:    lw a2, 0(sp)
 | |
| ; RV32I-NEXT:    beqz a0, .LBB215_1
 | |
| ; RV32I-NEXT:  # %bb.9: # %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)
 | |
| ; RV32I-NEXT:    lw ra, 28(sp)
 | |
| ; RV32I-NEXT:    addi sp, sp, 32
 | |
| ; RV32I-NEXT:    ret
 | |
| ;
 | |
| ; RV32IA-LABEL: atomicrmw_umin_i64_monotonic:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; 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:    mv s4, sp
 | |
| ; RV32IA-NEXT:  .LBB215_1: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    beq a1, s1, .LBB215_3
 | |
| ; RV32IA-NEXT:  # %bb.2: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB215_1 Depth=1
 | |
| ; RV32IA-NEXT:    sltu a0, s1, a1
 | |
| ; RV32IA-NEXT:    j .LBB215_4
 | |
| ; RV32IA-NEXT:  .LBB215_3: # in Loop: Header=BB215_1 Depth=1
 | |
| ; RV32IA-NEXT:    sltu a0, s2, a2
 | |
| ; RV32IA-NEXT:  .LBB215_4: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB215_1 Depth=1
 | |
| ; RV32IA-NEXT:    xori a0, a0, 1
 | |
| ; RV32IA-NEXT:    sw a2, 0(sp)
 | |
| ; RV32IA-NEXT:    bnez a0, .LBB215_6
 | |
| ; RV32IA-NEXT:  # %bb.5: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB215_1 Depth=1
 | |
| ; RV32IA-NEXT:    mv a2, s2
 | |
| ; RV32IA-NEXT:  .LBB215_6: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB215_1 Depth=1
 | |
| ; RV32IA-NEXT:    mv a3, a1
 | |
| ; RV32IA-NEXT:    bnez a0, .LBB215_8
 | |
| ; RV32IA-NEXT:  # %bb.7: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB215_1 Depth=1
 | |
| ; RV32IA-NEXT:    mv a3, s1
 | |
| ; RV32IA-NEXT:  .LBB215_8: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB215_1 Depth=1
 | |
| ; RV32IA-NEXT:    sw a1, 4(sp)
 | |
| ; RV32IA-NEXT:    mv a0, s3
 | |
| ; RV32IA-NEXT:    mv a1, s4
 | |
| ; RV32IA-NEXT:    mv a4, zero
 | |
| ; RV32IA-NEXT:    mv a5, zero
 | |
| ; RV32IA-NEXT:    call __atomic_compare_exchange_8
 | |
| ; RV32IA-NEXT:    lw a1, 4(sp)
 | |
| ; RV32IA-NEXT:    lw a2, 0(sp)
 | |
| ; RV32IA-NEXT:    beqz a0, .LBB215_1
 | |
| ; RV32IA-NEXT:  # %bb.9: # %atomicrmw.end
 | |
| ; RV32IA-NEXT:    mv a0, a2
 | |
| ; 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
 | |
|   %1 = atomicrmw umin i64* %a, i64 %b monotonic
 | |
|   ret i64 %1
 | |
| }
 | |
| 
 | |
| define i64 @atomicrmw_umin_i64_acquire(i64 *%a, i64 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_umin_i64_acquire:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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 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:  # %bb.2: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB216_1 Depth=1
 | |
| ; RV32I-NEXT:    sltu a0, s1, a1
 | |
| ; RV32I-NEXT:    j .LBB216_4
 | |
| ; RV32I-NEXT:  .LBB216_3: # in Loop: Header=BB216_1 Depth=1
 | |
| ; RV32I-NEXT:    sltu a0, s2, a2
 | |
| ; RV32I-NEXT:  .LBB216_4: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB216_1 Depth=1
 | |
| ; RV32I-NEXT:    xori a0, a0, 1
 | |
| ; RV32I-NEXT:    sw a2, 0(sp)
 | |
| ; RV32I-NEXT:    bnez a0, .LBB216_6
 | |
| ; RV32I-NEXT:  # %bb.5: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB216_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a2, s2
 | |
| ; RV32I-NEXT:  .LBB216_6: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB216_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a3, a1
 | |
| ; RV32I-NEXT:    bnez a0, .LBB216_8
 | |
| ; RV32I-NEXT:  # %bb.7: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB216_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a3, s1
 | |
| ; RV32I-NEXT:  .LBB216_8: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB216_1 Depth=1
 | |
| ; 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:    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)
 | |
| ; 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_acquire:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; 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:    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:  # %bb.2: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB216_1 Depth=1
 | |
| ; RV32IA-NEXT:    sltu a0, s1, a1
 | |
| ; RV32IA-NEXT:    j .LBB216_4
 | |
| ; RV32IA-NEXT:  .LBB216_3: # in Loop: Header=BB216_1 Depth=1
 | |
| ; RV32IA-NEXT:    sltu a0, s2, a2
 | |
| ; RV32IA-NEXT:  .LBB216_4: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB216_1 Depth=1
 | |
| ; RV32IA-NEXT:    xori a0, a0, 1
 | |
| ; RV32IA-NEXT:    sw a2, 0(sp)
 | |
| ; RV32IA-NEXT:    bnez a0, .LBB216_6
 | |
| ; RV32IA-NEXT:  # %bb.5: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB216_1 Depth=1
 | |
| ; RV32IA-NEXT:    mv a2, s2
 | |
| ; RV32IA-NEXT:  .LBB216_6: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB216_1 Depth=1
 | |
| ; RV32IA-NEXT:    mv a3, a1
 | |
| ; RV32IA-NEXT:    bnez a0, .LBB216_8
 | |
| ; RV32IA-NEXT:  # %bb.7: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB216_1 Depth=1
 | |
| ; RV32IA-NEXT:    mv a3, s1
 | |
| ; RV32IA-NEXT:  .LBB216_8: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB216_1 Depth=1
 | |
| ; 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:    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)
 | |
| ; RV32IA-NEXT:    lw s1, 24(sp)
 | |
| ; RV32IA-NEXT:    lw ra, 28(sp)
 | |
| ; RV32IA-NEXT:    addi sp, sp, 32
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw umin i64* %a, i64 %b acquire
 | |
|   ret i64 %1
 | |
| }
 | |
| 
 | |
| define i64 @atomicrmw_umin_i64_release(i64 *%a, i64 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_umin_i64_release:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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 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:  # %bb.2: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB217_1 Depth=1
 | |
| ; RV32I-NEXT:    sltu a0, s1, a1
 | |
| ; RV32I-NEXT:    j .LBB217_4
 | |
| ; RV32I-NEXT:  .LBB217_3: # in Loop: Header=BB217_1 Depth=1
 | |
| ; RV32I-NEXT:    sltu a0, s2, a2
 | |
| ; RV32I-NEXT:  .LBB217_4: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB217_1 Depth=1
 | |
| ; RV32I-NEXT:    xori a0, a0, 1
 | |
| ; RV32I-NEXT:    sw a2, 0(sp)
 | |
| ; RV32I-NEXT:    bnez a0, .LBB217_6
 | |
| ; RV32I-NEXT:  # %bb.5: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB217_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a2, s2
 | |
| ; RV32I-NEXT:  .LBB217_6: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB217_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a3, a1
 | |
| ; RV32I-NEXT:    bnez a0, .LBB217_8
 | |
| ; RV32I-NEXT:  # %bb.7: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB217_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a3, s1
 | |
| ; RV32I-NEXT:  .LBB217_8: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB217_1 Depth=1
 | |
| ; 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, zero
 | |
| ; RV32I-NEXT:    call __atomic_compare_exchange_8
 | |
| ; RV32I-NEXT:    lw a1, 4(sp)
 | |
| ; RV32I-NEXT:    lw a2, 0(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)
 | |
| ; 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_release:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; 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:    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:  # %bb.2: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB217_1 Depth=1
 | |
| ; RV32IA-NEXT:    sltu a0, s1, a1
 | |
| ; RV32IA-NEXT:    j .LBB217_4
 | |
| ; RV32IA-NEXT:  .LBB217_3: # in Loop: Header=BB217_1 Depth=1
 | |
| ; RV32IA-NEXT:    sltu a0, s2, a2
 | |
| ; RV32IA-NEXT:  .LBB217_4: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB217_1 Depth=1
 | |
| ; RV32IA-NEXT:    xori a0, a0, 1
 | |
| ; RV32IA-NEXT:    sw a2, 0(sp)
 | |
| ; RV32IA-NEXT:    bnez a0, .LBB217_6
 | |
| ; RV32IA-NEXT:  # %bb.5: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB217_1 Depth=1
 | |
| ; RV32IA-NEXT:    mv a2, s2
 | |
| ; RV32IA-NEXT:  .LBB217_6: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB217_1 Depth=1
 | |
| ; RV32IA-NEXT:    mv a3, a1
 | |
| ; RV32IA-NEXT:    bnez a0, .LBB217_8
 | |
| ; RV32IA-NEXT:  # %bb.7: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB217_1 Depth=1
 | |
| ; RV32IA-NEXT:    mv a3, s1
 | |
| ; RV32IA-NEXT:  .LBB217_8: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB217_1 Depth=1
 | |
| ; 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, zero
 | |
| ; RV32IA-NEXT:    call __atomic_compare_exchange_8
 | |
| ; RV32IA-NEXT:    lw a1, 4(sp)
 | |
| ; RV32IA-NEXT:    lw a2, 0(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)
 | |
| ; RV32IA-NEXT:    lw s1, 24(sp)
 | |
| ; RV32IA-NEXT:    lw ra, 28(sp)
 | |
| ; RV32IA-NEXT:    addi sp, sp, 32
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw umin i64* %a, i64 %b release
 | |
|   ret i64 %1
 | |
| }
 | |
| 
 | |
| 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:    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:  .LBB218_1: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
 | |
| ; RV32I-NEXT:    beq a1, s1, .LBB218_3
 | |
| ; RV32I-NEXT:  # %bb.2: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB218_1 Depth=1
 | |
| ; RV32I-NEXT:    sltu a0, s1, a1
 | |
| ; RV32I-NEXT:    j .LBB218_4
 | |
| ; RV32I-NEXT:  .LBB218_3: # in Loop: Header=BB218_1 Depth=1
 | |
| ; RV32I-NEXT:    sltu a0, s2, a2
 | |
| ; 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:    bnez a0, .LBB218_6
 | |
| ; RV32I-NEXT:  # %bb.5: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB218_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a2, s2
 | |
| ; RV32I-NEXT:  .LBB218_6: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB218_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a3, a1
 | |
| ; RV32I-NEXT:    bnez a0, .LBB218_8
 | |
| ; RV32I-NEXT:  # %bb.7: # %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:    mv a0, s3
 | |
| ; RV32I-NEXT:    mv a1, s4
 | |
| ; RV32I-NEXT:    mv a4, s5
 | |
| ; RV32I-NEXT:    mv a5, s6
 | |
| ; RV32I-NEXT:    call __atomic_compare_exchange_8
 | |
| ; RV32I-NEXT:    lw a1, 12(sp)
 | |
| ; RV32I-NEXT:    lw a2, 8(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:    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:    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:  .LBB218_1: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # =>This Inner Loop Header: Depth=1
 | |
| ; RV32IA-NEXT:    beq a1, s1, .LBB218_3
 | |
| ; RV32IA-NEXT:  # %bb.2: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB218_1 Depth=1
 | |
| ; RV32IA-NEXT:    sltu a0, s1, a1
 | |
| ; RV32IA-NEXT:    j .LBB218_4
 | |
| ; RV32IA-NEXT:  .LBB218_3: # in Loop: Header=BB218_1 Depth=1
 | |
| ; RV32IA-NEXT:    sltu a0, s2, a2
 | |
| ; 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:    bnez a0, .LBB218_6
 | |
| ; RV32IA-NEXT:  # %bb.5: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB218_1 Depth=1
 | |
| ; RV32IA-NEXT:    mv a2, s2
 | |
| ; RV32IA-NEXT:  .LBB218_6: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB218_1 Depth=1
 | |
| ; RV32IA-NEXT:    mv a3, a1
 | |
| ; RV32IA-NEXT:    bnez a0, .LBB218_8
 | |
| ; RV32IA-NEXT:  # %bb.7: # %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:    mv a0, s3
 | |
| ; RV32IA-NEXT:    mv a1, s4
 | |
| ; RV32IA-NEXT:    mv a4, s5
 | |
| ; RV32IA-NEXT:    mv a5, s6
 | |
| ; RV32IA-NEXT:    call __atomic_compare_exchange_8
 | |
| ; RV32IA-NEXT:    lw a1, 12(sp)
 | |
| ; RV32IA-NEXT:    lw a2, 8(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:    ret
 | |
|   %1 = atomicrmw umin i64* %a, i64 %b acq_rel
 | |
|   ret i64 %1
 | |
| }
 | |
| 
 | |
| define i64 @atomicrmw_umin_i64_seq_cst(i64 *%a, i64 %b) nounwind {
 | |
| ; RV32I-LABEL: atomicrmw_umin_i64_seq_cst:
 | |
| ; RV32I:       # %bb.0:
 | |
| ; 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 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:  # %bb.2: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB219_1 Depth=1
 | |
| ; RV32I-NEXT:    sltu a0, s1, a1
 | |
| ; RV32I-NEXT:    j .LBB219_4
 | |
| ; RV32I-NEXT:  .LBB219_3: # in Loop: Header=BB219_1 Depth=1
 | |
| ; RV32I-NEXT:    sltu a0, s2, a2
 | |
| ; RV32I-NEXT:  .LBB219_4: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB219_1 Depth=1
 | |
| ; RV32I-NEXT:    xori a0, a0, 1
 | |
| ; RV32I-NEXT:    sw a2, 0(sp)
 | |
| ; RV32I-NEXT:    bnez a0, .LBB219_6
 | |
| ; RV32I-NEXT:  # %bb.5: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB219_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a2, s2
 | |
| ; RV32I-NEXT:  .LBB219_6: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB219_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a3, a1
 | |
| ; RV32I-NEXT:    bnez a0, .LBB219_8
 | |
| ; RV32I-NEXT:  # %bb.7: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB219_1 Depth=1
 | |
| ; RV32I-NEXT:    mv a3, s1
 | |
| ; RV32I-NEXT:  .LBB219_8: # %atomicrmw.start
 | |
| ; RV32I-NEXT:    # in Loop: Header=BB219_1 Depth=1
 | |
| ; 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:    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)
 | |
| ; 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_seq_cst:
 | |
| ; RV32IA:       # %bb.0:
 | |
| ; 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:    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:  # %bb.2: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB219_1 Depth=1
 | |
| ; RV32IA-NEXT:    sltu a0, s1, a1
 | |
| ; RV32IA-NEXT:    j .LBB219_4
 | |
| ; RV32IA-NEXT:  .LBB219_3: # in Loop: Header=BB219_1 Depth=1
 | |
| ; RV32IA-NEXT:    sltu a0, s2, a2
 | |
| ; RV32IA-NEXT:  .LBB219_4: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB219_1 Depth=1
 | |
| ; RV32IA-NEXT:    xori a0, a0, 1
 | |
| ; RV32IA-NEXT:    sw a2, 0(sp)
 | |
| ; RV32IA-NEXT:    bnez a0, .LBB219_6
 | |
| ; RV32IA-NEXT:  # %bb.5: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB219_1 Depth=1
 | |
| ; RV32IA-NEXT:    mv a2, s2
 | |
| ; RV32IA-NEXT:  .LBB219_6: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB219_1 Depth=1
 | |
| ; RV32IA-NEXT:    mv a3, a1
 | |
| ; RV32IA-NEXT:    bnez a0, .LBB219_8
 | |
| ; RV32IA-NEXT:  # %bb.7: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB219_1 Depth=1
 | |
| ; RV32IA-NEXT:    mv a3, s1
 | |
| ; RV32IA-NEXT:  .LBB219_8: # %atomicrmw.start
 | |
| ; RV32IA-NEXT:    # in Loop: Header=BB219_1 Depth=1
 | |
| ; 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:    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)
 | |
| ; RV32IA-NEXT:    lw s1, 24(sp)
 | |
| ; RV32IA-NEXT:    lw ra, 28(sp)
 | |
| ; RV32IA-NEXT:    addi sp, sp, 32
 | |
| ; RV32IA-NEXT:    ret
 | |
|   %1 = atomicrmw umin i64* %a, i64 %b seq_cst
 | |
|   ret i64 %1
 | |
| }
 |