
Normally, generic processor does not have any SubtargetFeature. And it can just generate most basic instructions which have no Predicates to guard. But it needs to enbale predicate for the btsti16 instruction as one of the most basic instructions. Or the generic processor can't finish codegen process. So Add FeatureBTST16 SubtargetFeature to generic ProcessorModel.
6808 lines
231 KiB
LLVM
6808 lines
231 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
|
; RUN: llc -mtriple=csky -verify-machineinstrs -csky-no-aliases -mattr=+2e3 < %s \
|
|
; RUN: | FileCheck -check-prefix=CSKY %s
|
|
|
|
define i8 @atomicrmw_xchg_i8_monotonic(i8* %a, i8 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_xchg_i8_monotonic:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 0
|
|
; CSKY-NEXT: jsri32 [.LCPI0_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI0_0:
|
|
; CSKY-NEXT: .long __atomic_exchange_1
|
|
%1 = atomicrmw xchg i8* %a, i8 %b monotonic
|
|
ret i8 %1
|
|
}
|
|
|
|
define i8 @atomicrmw_xchg_i8_acquire(i8* %a, i8 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_xchg_i8_acquire:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 2
|
|
; CSKY-NEXT: jsri32 [.LCPI1_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI1_0:
|
|
; CSKY-NEXT: .long __atomic_exchange_1
|
|
%1 = atomicrmw xchg i8* %a, i8 %b acquire
|
|
ret i8 %1
|
|
}
|
|
|
|
define i8 @atomicrmw_xchg_i8_release(i8* %a, i8 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_xchg_i8_release:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 3
|
|
; CSKY-NEXT: jsri32 [.LCPI2_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI2_0:
|
|
; CSKY-NEXT: .long __atomic_exchange_1
|
|
%1 = atomicrmw xchg i8* %a, i8 %b release
|
|
ret i8 %1
|
|
}
|
|
|
|
define i8 @atomicrmw_xchg_i8_acq_rel(i8* %a, i8 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_xchg_i8_acq_rel:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 4
|
|
; CSKY-NEXT: jsri32 [.LCPI3_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI3_0:
|
|
; CSKY-NEXT: .long __atomic_exchange_1
|
|
%1 = atomicrmw xchg i8* %a, i8 %b acq_rel
|
|
ret i8 %1
|
|
}
|
|
|
|
define i8 @atomicrmw_xchg_i8_seq_cst(i8* %a, i8 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_xchg_i8_seq_cst:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 5
|
|
; CSKY-NEXT: jsri32 [.LCPI4_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI4_0:
|
|
; CSKY-NEXT: .long __atomic_exchange_1
|
|
%1 = atomicrmw xchg i8* %a, i8 %b seq_cst
|
|
ret i8 %1
|
|
}
|
|
|
|
define i8 @atomicrmw_add_i8_monotonic(i8 *%a, i8 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_add_i8_monotonic:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 0
|
|
; CSKY-NEXT: jsri32 [.LCPI5_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI5_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_add_1
|
|
%1 = atomicrmw add i8* %a, i8 %b monotonic
|
|
ret i8 %1
|
|
}
|
|
|
|
define i8 @atomicrmw_add_i8_acquire(i8 *%a, i8 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_add_i8_acquire:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 2
|
|
; CSKY-NEXT: jsri32 [.LCPI6_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI6_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_add_1
|
|
%1 = atomicrmw add i8* %a, i8 %b acquire
|
|
ret i8 %1
|
|
}
|
|
|
|
define i8 @atomicrmw_add_i8_release(i8 *%a, i8 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_add_i8_release:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 3
|
|
; CSKY-NEXT: jsri32 [.LCPI7_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI7_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_add_1
|
|
%1 = atomicrmw add i8* %a, i8 %b release
|
|
ret i8 %1
|
|
}
|
|
|
|
define i8 @atomicrmw_add_i8_acq_rel(i8 *%a, i8 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_add_i8_acq_rel:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 4
|
|
; CSKY-NEXT: jsri32 [.LCPI8_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI8_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_add_1
|
|
%1 = atomicrmw add i8* %a, i8 %b acq_rel
|
|
ret i8 %1
|
|
}
|
|
|
|
define i8 @atomicrmw_add_i8_seq_cst(i8 *%a, i8 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_add_i8_seq_cst:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 5
|
|
; CSKY-NEXT: jsri32 [.LCPI9_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI9_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_add_1
|
|
%1 = atomicrmw add i8* %a, i8 %b seq_cst
|
|
ret i8 %1
|
|
}
|
|
|
|
define i8 @atomicrmw_sub_i8_monotonic(i8* %a, i8 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_sub_i8_monotonic:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 0
|
|
; CSKY-NEXT: jsri32 [.LCPI10_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI10_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_sub_1
|
|
%1 = atomicrmw sub i8* %a, i8 %b monotonic
|
|
ret i8 %1
|
|
}
|
|
|
|
define i8 @atomicrmw_sub_i8_acquire(i8* %a, i8 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_sub_i8_acquire:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 2
|
|
; CSKY-NEXT: jsri32 [.LCPI11_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI11_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_sub_1
|
|
%1 = atomicrmw sub i8* %a, i8 %b acquire
|
|
ret i8 %1
|
|
}
|
|
|
|
define i8 @atomicrmw_sub_i8_release(i8* %a, i8 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_sub_i8_release:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 3
|
|
; CSKY-NEXT: jsri32 [.LCPI12_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI12_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_sub_1
|
|
%1 = atomicrmw sub i8* %a, i8 %b release
|
|
ret i8 %1
|
|
}
|
|
|
|
define i8 @atomicrmw_sub_i8_acq_rel(i8* %a, i8 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_sub_i8_acq_rel:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 4
|
|
; CSKY-NEXT: jsri32 [.LCPI13_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI13_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_sub_1
|
|
%1 = atomicrmw sub i8* %a, i8 %b acq_rel
|
|
ret i8 %1
|
|
}
|
|
|
|
define i8 @atomicrmw_sub_i8_seq_cst(i8* %a, i8 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_sub_i8_seq_cst:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 5
|
|
; CSKY-NEXT: jsri32 [.LCPI14_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI14_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_sub_1
|
|
%1 = atomicrmw sub i8* %a, i8 %b seq_cst
|
|
ret i8 %1
|
|
}
|
|
|
|
define i8 @atomicrmw_and_i8_monotonic(i8 *%a, i8 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_and_i8_monotonic:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 0
|
|
; CSKY-NEXT: jsri32 [.LCPI15_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI15_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_and_1
|
|
%1 = atomicrmw and i8* %a, i8 %b monotonic
|
|
ret i8 %1
|
|
}
|
|
|
|
define i8 @atomicrmw_and_i8_acquire(i8 *%a, i8 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_and_i8_acquire:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 2
|
|
; CSKY-NEXT: jsri32 [.LCPI16_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI16_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_and_1
|
|
%1 = atomicrmw and i8* %a, i8 %b acquire
|
|
ret i8 %1
|
|
}
|
|
|
|
define i8 @atomicrmw_and_i8_release(i8 *%a, i8 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_and_i8_release:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 3
|
|
; CSKY-NEXT: jsri32 [.LCPI17_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI17_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_and_1
|
|
%1 = atomicrmw and i8* %a, i8 %b release
|
|
ret i8 %1
|
|
}
|
|
|
|
define i8 @atomicrmw_and_i8_acq_rel(i8 *%a, i8 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_and_i8_acq_rel:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 4
|
|
; CSKY-NEXT: jsri32 [.LCPI18_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI18_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_and_1
|
|
%1 = atomicrmw and i8* %a, i8 %b acq_rel
|
|
ret i8 %1
|
|
}
|
|
|
|
define i8 @atomicrmw_and_i8_seq_cst(i8 *%a, i8 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_and_i8_seq_cst:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 5
|
|
; CSKY-NEXT: jsri32 [.LCPI19_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI19_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_and_1
|
|
%1 = atomicrmw and i8* %a, i8 %b seq_cst
|
|
ret i8 %1
|
|
}
|
|
|
|
define i8 @atomicrmw_nand_i8_monotonic(i8* %a, i8 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_nand_i8_monotonic:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 0
|
|
; CSKY-NEXT: jsri32 [.LCPI20_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI20_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_nand_1
|
|
%1 = atomicrmw nand i8* %a, i8 %b monotonic
|
|
ret i8 %1
|
|
}
|
|
|
|
define i8 @atomicrmw_nand_i8_acquire(i8* %a, i8 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_nand_i8_acquire:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 2
|
|
; CSKY-NEXT: jsri32 [.LCPI21_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI21_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_nand_1
|
|
%1 = atomicrmw nand i8* %a, i8 %b acquire
|
|
ret i8 %1
|
|
}
|
|
|
|
define i8 @atomicrmw_nand_i8_release(i8* %a, i8 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_nand_i8_release:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 3
|
|
; CSKY-NEXT: jsri32 [.LCPI22_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI22_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_nand_1
|
|
%1 = atomicrmw nand i8* %a, i8 %b release
|
|
ret i8 %1
|
|
}
|
|
|
|
define i8 @atomicrmw_nand_i8_acq_rel(i8* %a, i8 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_nand_i8_acq_rel:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 4
|
|
; CSKY-NEXT: jsri32 [.LCPI23_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI23_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_nand_1
|
|
%1 = atomicrmw nand i8* %a, i8 %b acq_rel
|
|
ret i8 %1
|
|
}
|
|
|
|
define i8 @atomicrmw_nand_i8_seq_cst(i8* %a, i8 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_nand_i8_seq_cst:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 5
|
|
; CSKY-NEXT: jsri32 [.LCPI24_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI24_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_nand_1
|
|
%1 = atomicrmw nand i8* %a, i8 %b seq_cst
|
|
ret i8 %1
|
|
}
|
|
|
|
define i8 @atomicrmw_or_i8_monotonic(i8 *%a, i8 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_or_i8_monotonic:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 0
|
|
; CSKY-NEXT: jsri32 [.LCPI25_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI25_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_or_1
|
|
%1 = atomicrmw or i8* %a, i8 %b monotonic
|
|
ret i8 %1
|
|
}
|
|
|
|
define i8 @atomicrmw_or_i8_acquire(i8 *%a, i8 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_or_i8_acquire:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 2
|
|
; CSKY-NEXT: jsri32 [.LCPI26_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI26_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_or_1
|
|
%1 = atomicrmw or i8* %a, i8 %b acquire
|
|
ret i8 %1
|
|
}
|
|
|
|
define i8 @atomicrmw_or_i8_release(i8 *%a, i8 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_or_i8_release:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 3
|
|
; CSKY-NEXT: jsri32 [.LCPI27_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI27_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_or_1
|
|
%1 = atomicrmw or i8* %a, i8 %b release
|
|
ret i8 %1
|
|
}
|
|
|
|
define i8 @atomicrmw_or_i8_acq_rel(i8 *%a, i8 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_or_i8_acq_rel:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 4
|
|
; CSKY-NEXT: jsri32 [.LCPI28_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI28_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_or_1
|
|
%1 = atomicrmw or i8* %a, i8 %b acq_rel
|
|
ret i8 %1
|
|
}
|
|
|
|
define i8 @atomicrmw_or_i8_seq_cst(i8 *%a, i8 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_or_i8_seq_cst:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 5
|
|
; CSKY-NEXT: jsri32 [.LCPI29_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI29_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_or_1
|
|
%1 = atomicrmw or i8* %a, i8 %b seq_cst
|
|
ret i8 %1
|
|
}
|
|
|
|
define i8 @atomicrmw_xor_i8_monotonic(i8 *%a, i8 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_xor_i8_monotonic:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 0
|
|
; CSKY-NEXT: jsri32 [.LCPI30_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI30_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_xor_1
|
|
%1 = atomicrmw xor i8* %a, i8 %b monotonic
|
|
ret i8 %1
|
|
}
|
|
|
|
define i8 @atomicrmw_xor_i8_acquire(i8 *%a, i8 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_xor_i8_acquire:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 2
|
|
; CSKY-NEXT: jsri32 [.LCPI31_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI31_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_xor_1
|
|
%1 = atomicrmw xor i8* %a, i8 %b acquire
|
|
ret i8 %1
|
|
}
|
|
|
|
define i8 @atomicrmw_xor_i8_release(i8 *%a, i8 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_xor_i8_release:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 3
|
|
; CSKY-NEXT: jsri32 [.LCPI32_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI32_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_xor_1
|
|
%1 = atomicrmw xor i8* %a, i8 %b release
|
|
ret i8 %1
|
|
}
|
|
|
|
define i8 @atomicrmw_xor_i8_acq_rel(i8 *%a, i8 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_xor_i8_acq_rel:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 4
|
|
; CSKY-NEXT: jsri32 [.LCPI33_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI33_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_xor_1
|
|
%1 = atomicrmw xor i8* %a, i8 %b acq_rel
|
|
ret i8 %1
|
|
}
|
|
|
|
define i8 @atomicrmw_xor_i8_seq_cst(i8 *%a, i8 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_xor_i8_seq_cst:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 5
|
|
; CSKY-NEXT: jsri32 [.LCPI34_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI34_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_xor_1
|
|
%1 = atomicrmw xor i8* %a, i8 %b seq_cst
|
|
ret i8 %1
|
|
}
|
|
|
|
define i8 @atomicrmw_max_i8_monotonic(i8 *%a, i8 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_max_i8_monotonic:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 20
|
|
; CSKY-NEXT: st16.w l3, (sp, 16) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 8
|
|
; CSKY-NEXT: mov16 l0, a1
|
|
; CSKY-NEXT: mov16 l1, a0
|
|
; CSKY-NEXT: ld16.b a0, (a0, 0)
|
|
; CSKY-NEXT: sextb16 l2, a1
|
|
; CSKY-NEXT: movi16 l3, 0
|
|
; CSKY-NEXT: .LBB35_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: sextb16 a1, a0
|
|
; CSKY-NEXT: cmplt16 l2, a1
|
|
; CSKY-NEXT: mov16 a2, l0
|
|
; CSKY-NEXT: movt32 a2, a0
|
|
; CSKY-NEXT: st32.b a0, (sp, 7)
|
|
; CSKY-NEXT: st16.w l3, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l1
|
|
; CSKY-NEXT: addi32 a1, sp, 7
|
|
; CSKY-NEXT: movi16 a3, 0
|
|
; CSKY-NEXT: jsri32 [.LCPI35_0]
|
|
; CSKY-NEXT: mov16 a1, a0
|
|
; CSKY-NEXT: ld32.b a0, (sp, 7)
|
|
; CSKY-NEXT: bez32 a1, .LBB35_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 8
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l3, (sp, 16) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 20
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI35_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_1
|
|
%1 = atomicrmw max i8* %a, i8 %b monotonic
|
|
ret i8 %1
|
|
}
|
|
|
|
define i8 @atomicrmw_max_i8_acquire(i8 *%a, i8 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_max_i8_acquire:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 20
|
|
; CSKY-NEXT: st16.w l3, (sp, 16) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 8
|
|
; CSKY-NEXT: mov16 l0, a1
|
|
; CSKY-NEXT: mov16 l1, a0
|
|
; CSKY-NEXT: ld16.b a0, (a0, 0)
|
|
; CSKY-NEXT: sextb16 l2, a1
|
|
; CSKY-NEXT: movi16 l3, 2
|
|
; CSKY-NEXT: .LBB36_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: sextb16 a1, a0
|
|
; CSKY-NEXT: cmplt16 l2, a1
|
|
; CSKY-NEXT: mov16 a2, l0
|
|
; CSKY-NEXT: movt32 a2, a0
|
|
; CSKY-NEXT: st32.b a0, (sp, 7)
|
|
; CSKY-NEXT: st16.w l3, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l1
|
|
; CSKY-NEXT: addi32 a1, sp, 7
|
|
; CSKY-NEXT: movi16 a3, 2
|
|
; CSKY-NEXT: jsri32 [.LCPI36_0]
|
|
; CSKY-NEXT: mov16 a1, a0
|
|
; CSKY-NEXT: ld32.b a0, (sp, 7)
|
|
; CSKY-NEXT: bez32 a1, .LBB36_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 8
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l3, (sp, 16) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 20
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI36_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_1
|
|
%1 = atomicrmw max i8* %a, i8 %b acquire
|
|
ret i8 %1
|
|
}
|
|
|
|
define i8 @atomicrmw_max_i8_release(i8 *%a, i8 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_max_i8_release:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 20
|
|
; CSKY-NEXT: st16.w l3, (sp, 16) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 8
|
|
; CSKY-NEXT: mov16 l0, a1
|
|
; CSKY-NEXT: mov16 l1, a0
|
|
; CSKY-NEXT: ld16.b a0, (a0, 0)
|
|
; CSKY-NEXT: sextb16 l2, a1
|
|
; CSKY-NEXT: movi16 l3, 0
|
|
; CSKY-NEXT: .LBB37_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: sextb16 a1, a0
|
|
; CSKY-NEXT: cmplt16 l2, a1
|
|
; CSKY-NEXT: mov16 a2, l0
|
|
; CSKY-NEXT: movt32 a2, a0
|
|
; CSKY-NEXT: st32.b a0, (sp, 7)
|
|
; CSKY-NEXT: st16.w l3, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l1
|
|
; CSKY-NEXT: addi32 a1, sp, 7
|
|
; CSKY-NEXT: movi16 a3, 3
|
|
; CSKY-NEXT: jsri32 [.LCPI37_0]
|
|
; CSKY-NEXT: mov16 a1, a0
|
|
; CSKY-NEXT: ld32.b a0, (sp, 7)
|
|
; CSKY-NEXT: bez32 a1, .LBB37_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 8
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l3, (sp, 16) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 20
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI37_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_1
|
|
%1 = atomicrmw max i8* %a, i8 %b release
|
|
ret i8 %1
|
|
}
|
|
|
|
define i8 @atomicrmw_max_i8_acq_rel(i8 *%a, i8 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_max_i8_acq_rel:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 20
|
|
; CSKY-NEXT: st16.w l3, (sp, 16) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 8
|
|
; CSKY-NEXT: mov16 l0, a1
|
|
; CSKY-NEXT: mov16 l1, a0
|
|
; CSKY-NEXT: ld16.b a0, (a0, 0)
|
|
; CSKY-NEXT: sextb16 l2, a1
|
|
; CSKY-NEXT: movi16 l3, 2
|
|
; CSKY-NEXT: .LBB38_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: sextb16 a1, a0
|
|
; CSKY-NEXT: cmplt16 l2, a1
|
|
; CSKY-NEXT: mov16 a2, l0
|
|
; CSKY-NEXT: movt32 a2, a0
|
|
; CSKY-NEXT: st32.b a0, (sp, 7)
|
|
; CSKY-NEXT: st16.w l3, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l1
|
|
; CSKY-NEXT: addi32 a1, sp, 7
|
|
; CSKY-NEXT: movi16 a3, 4
|
|
; CSKY-NEXT: jsri32 [.LCPI38_0]
|
|
; CSKY-NEXT: mov16 a1, a0
|
|
; CSKY-NEXT: ld32.b a0, (sp, 7)
|
|
; CSKY-NEXT: bez32 a1, .LBB38_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 8
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l3, (sp, 16) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 20
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI38_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_1
|
|
%1 = atomicrmw max i8* %a, i8 %b acq_rel
|
|
ret i8 %1
|
|
}
|
|
|
|
define i8 @atomicrmw_max_i8_seq_cst(i8 *%a, i8 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_max_i8_seq_cst:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 20
|
|
; CSKY-NEXT: st16.w l3, (sp, 16) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 8
|
|
; CSKY-NEXT: mov16 l0, a1
|
|
; CSKY-NEXT: mov16 l1, a0
|
|
; CSKY-NEXT: ld16.b a0, (a0, 0)
|
|
; CSKY-NEXT: sextb16 l2, a1
|
|
; CSKY-NEXT: movi16 l3, 5
|
|
; CSKY-NEXT: .LBB39_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: sextb16 a1, a0
|
|
; CSKY-NEXT: cmplt16 l2, a1
|
|
; CSKY-NEXT: mov16 a2, l0
|
|
; CSKY-NEXT: movt32 a2, a0
|
|
; CSKY-NEXT: st32.b a0, (sp, 7)
|
|
; CSKY-NEXT: st16.w l3, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l1
|
|
; CSKY-NEXT: addi32 a1, sp, 7
|
|
; CSKY-NEXT: movi16 a3, 5
|
|
; CSKY-NEXT: jsri32 [.LCPI39_0]
|
|
; CSKY-NEXT: mov16 a1, a0
|
|
; CSKY-NEXT: ld32.b a0, (sp, 7)
|
|
; CSKY-NEXT: bez32 a1, .LBB39_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 8
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l3, (sp, 16) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 20
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI39_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_1
|
|
%1 = atomicrmw max i8* %a, i8 %b seq_cst
|
|
ret i8 %1
|
|
}
|
|
|
|
define i8 @atomicrmw_min_i8_monotonic(i8 *%a, i8 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_min_i8_monotonic:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 20
|
|
; CSKY-NEXT: st16.w l3, (sp, 16) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 8
|
|
; CSKY-NEXT: mov16 l0, a1
|
|
; CSKY-NEXT: mov16 l1, a0
|
|
; CSKY-NEXT: ld16.b a0, (a0, 0)
|
|
; CSKY-NEXT: sextb16 l2, a1
|
|
; CSKY-NEXT: movi16 l3, 0
|
|
; CSKY-NEXT: .LBB40_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: sextb16 a1, a0
|
|
; CSKY-NEXT: cmplt16 l2, a1
|
|
; CSKY-NEXT: mov16 a2, l0
|
|
; CSKY-NEXT: movf32 a2, a0
|
|
; CSKY-NEXT: st32.b a0, (sp, 7)
|
|
; CSKY-NEXT: st16.w l3, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l1
|
|
; CSKY-NEXT: addi32 a1, sp, 7
|
|
; CSKY-NEXT: movi16 a3, 0
|
|
; CSKY-NEXT: jsri32 [.LCPI40_0]
|
|
; CSKY-NEXT: mov16 a1, a0
|
|
; CSKY-NEXT: ld32.b a0, (sp, 7)
|
|
; CSKY-NEXT: bez32 a1, .LBB40_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 8
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l3, (sp, 16) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 20
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI40_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_1
|
|
%1 = atomicrmw min i8* %a, i8 %b monotonic
|
|
ret i8 %1
|
|
}
|
|
|
|
define i8 @atomicrmw_min_i8_acquire(i8 *%a, i8 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_min_i8_acquire:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 20
|
|
; CSKY-NEXT: st16.w l3, (sp, 16) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 8
|
|
; CSKY-NEXT: mov16 l0, a1
|
|
; CSKY-NEXT: mov16 l1, a0
|
|
; CSKY-NEXT: ld16.b a0, (a0, 0)
|
|
; CSKY-NEXT: sextb16 l2, a1
|
|
; CSKY-NEXT: movi16 l3, 2
|
|
; CSKY-NEXT: .LBB41_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: sextb16 a1, a0
|
|
; CSKY-NEXT: cmplt16 l2, a1
|
|
; CSKY-NEXT: mov16 a2, l0
|
|
; CSKY-NEXT: movf32 a2, a0
|
|
; CSKY-NEXT: st32.b a0, (sp, 7)
|
|
; CSKY-NEXT: st16.w l3, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l1
|
|
; CSKY-NEXT: addi32 a1, sp, 7
|
|
; CSKY-NEXT: movi16 a3, 2
|
|
; CSKY-NEXT: jsri32 [.LCPI41_0]
|
|
; CSKY-NEXT: mov16 a1, a0
|
|
; CSKY-NEXT: ld32.b a0, (sp, 7)
|
|
; CSKY-NEXT: bez32 a1, .LBB41_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 8
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l3, (sp, 16) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 20
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI41_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_1
|
|
%1 = atomicrmw min i8* %a, i8 %b acquire
|
|
ret i8 %1
|
|
}
|
|
|
|
define i8 @atomicrmw_min_i8_release(i8 *%a, i8 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_min_i8_release:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 20
|
|
; CSKY-NEXT: st16.w l3, (sp, 16) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 8
|
|
; CSKY-NEXT: mov16 l0, a1
|
|
; CSKY-NEXT: mov16 l1, a0
|
|
; CSKY-NEXT: ld16.b a0, (a0, 0)
|
|
; CSKY-NEXT: sextb16 l2, a1
|
|
; CSKY-NEXT: movi16 l3, 0
|
|
; CSKY-NEXT: .LBB42_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: sextb16 a1, a0
|
|
; CSKY-NEXT: cmplt16 l2, a1
|
|
; CSKY-NEXT: mov16 a2, l0
|
|
; CSKY-NEXT: movf32 a2, a0
|
|
; CSKY-NEXT: st32.b a0, (sp, 7)
|
|
; CSKY-NEXT: st16.w l3, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l1
|
|
; CSKY-NEXT: addi32 a1, sp, 7
|
|
; CSKY-NEXT: movi16 a3, 3
|
|
; CSKY-NEXT: jsri32 [.LCPI42_0]
|
|
; CSKY-NEXT: mov16 a1, a0
|
|
; CSKY-NEXT: ld32.b a0, (sp, 7)
|
|
; CSKY-NEXT: bez32 a1, .LBB42_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 8
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l3, (sp, 16) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 20
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI42_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_1
|
|
%1 = atomicrmw min i8* %a, i8 %b release
|
|
ret i8 %1
|
|
}
|
|
|
|
define i8 @atomicrmw_min_i8_acq_rel(i8 *%a, i8 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_min_i8_acq_rel:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 20
|
|
; CSKY-NEXT: st16.w l3, (sp, 16) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 8
|
|
; CSKY-NEXT: mov16 l0, a1
|
|
; CSKY-NEXT: mov16 l1, a0
|
|
; CSKY-NEXT: ld16.b a0, (a0, 0)
|
|
; CSKY-NEXT: sextb16 l2, a1
|
|
; CSKY-NEXT: movi16 l3, 2
|
|
; CSKY-NEXT: .LBB43_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: sextb16 a1, a0
|
|
; CSKY-NEXT: cmplt16 l2, a1
|
|
; CSKY-NEXT: mov16 a2, l0
|
|
; CSKY-NEXT: movf32 a2, a0
|
|
; CSKY-NEXT: st32.b a0, (sp, 7)
|
|
; CSKY-NEXT: st16.w l3, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l1
|
|
; CSKY-NEXT: addi32 a1, sp, 7
|
|
; CSKY-NEXT: movi16 a3, 4
|
|
; CSKY-NEXT: jsri32 [.LCPI43_0]
|
|
; CSKY-NEXT: mov16 a1, a0
|
|
; CSKY-NEXT: ld32.b a0, (sp, 7)
|
|
; CSKY-NEXT: bez32 a1, .LBB43_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 8
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l3, (sp, 16) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 20
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI43_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_1
|
|
%1 = atomicrmw min i8* %a, i8 %b acq_rel
|
|
ret i8 %1
|
|
}
|
|
|
|
define i8 @atomicrmw_min_i8_seq_cst(i8 *%a, i8 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_min_i8_seq_cst:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 20
|
|
; CSKY-NEXT: st16.w l3, (sp, 16) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 8
|
|
; CSKY-NEXT: mov16 l0, a1
|
|
; CSKY-NEXT: mov16 l1, a0
|
|
; CSKY-NEXT: ld16.b a0, (a0, 0)
|
|
; CSKY-NEXT: sextb16 l2, a1
|
|
; CSKY-NEXT: movi16 l3, 5
|
|
; CSKY-NEXT: .LBB44_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: sextb16 a1, a0
|
|
; CSKY-NEXT: cmplt16 l2, a1
|
|
; CSKY-NEXT: mov16 a2, l0
|
|
; CSKY-NEXT: movf32 a2, a0
|
|
; CSKY-NEXT: st32.b a0, (sp, 7)
|
|
; CSKY-NEXT: st16.w l3, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l1
|
|
; CSKY-NEXT: addi32 a1, sp, 7
|
|
; CSKY-NEXT: movi16 a3, 5
|
|
; CSKY-NEXT: jsri32 [.LCPI44_0]
|
|
; CSKY-NEXT: mov16 a1, a0
|
|
; CSKY-NEXT: ld32.b a0, (sp, 7)
|
|
; CSKY-NEXT: bez32 a1, .LBB44_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 8
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l3, (sp, 16) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 20
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI44_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_1
|
|
%1 = atomicrmw min i8* %a, i8 %b seq_cst
|
|
ret i8 %1
|
|
}
|
|
|
|
define i8 @atomicrmw_umax_i8_monotonic(i8 *%a, i8 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_umax_i8_monotonic:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 20
|
|
; CSKY-NEXT: st16.w l3, (sp, 16) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 8
|
|
; CSKY-NEXT: mov16 l0, a1
|
|
; CSKY-NEXT: mov16 l1, a0
|
|
; CSKY-NEXT: ld16.b a0, (a0, 0)
|
|
; CSKY-NEXT: zextb16 l2, a1
|
|
; CSKY-NEXT: movi16 l3, 0
|
|
; CSKY-NEXT: .LBB45_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: zextb16 a1, a0
|
|
; CSKY-NEXT: cmphs16 l2, a1
|
|
; CSKY-NEXT: mov16 a2, l0
|
|
; CSKY-NEXT: movf32 a2, a0
|
|
; CSKY-NEXT: st32.b a0, (sp, 7)
|
|
; CSKY-NEXT: st16.w l3, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l1
|
|
; CSKY-NEXT: addi32 a1, sp, 7
|
|
; CSKY-NEXT: movi16 a3, 0
|
|
; CSKY-NEXT: jsri32 [.LCPI45_0]
|
|
; CSKY-NEXT: mov16 a1, a0
|
|
; CSKY-NEXT: ld32.b a0, (sp, 7)
|
|
; CSKY-NEXT: bez32 a1, .LBB45_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 8
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l3, (sp, 16) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 20
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI45_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_1
|
|
%1 = atomicrmw umax i8* %a, i8 %b monotonic
|
|
ret i8 %1
|
|
}
|
|
|
|
define i8 @atomicrmw_umax_i8_acquire(i8 *%a, i8 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_umax_i8_acquire:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 20
|
|
; CSKY-NEXT: st16.w l3, (sp, 16) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 8
|
|
; CSKY-NEXT: mov16 l0, a1
|
|
; CSKY-NEXT: mov16 l1, a0
|
|
; CSKY-NEXT: ld16.b a0, (a0, 0)
|
|
; CSKY-NEXT: zextb16 l2, a1
|
|
; CSKY-NEXT: movi16 l3, 2
|
|
; CSKY-NEXT: .LBB46_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: zextb16 a1, a0
|
|
; CSKY-NEXT: cmphs16 l2, a1
|
|
; CSKY-NEXT: mov16 a2, l0
|
|
; CSKY-NEXT: movf32 a2, a0
|
|
; CSKY-NEXT: st32.b a0, (sp, 7)
|
|
; CSKY-NEXT: st16.w l3, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l1
|
|
; CSKY-NEXT: addi32 a1, sp, 7
|
|
; CSKY-NEXT: movi16 a3, 2
|
|
; CSKY-NEXT: jsri32 [.LCPI46_0]
|
|
; CSKY-NEXT: mov16 a1, a0
|
|
; CSKY-NEXT: ld32.b a0, (sp, 7)
|
|
; CSKY-NEXT: bez32 a1, .LBB46_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 8
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l3, (sp, 16) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 20
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI46_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_1
|
|
%1 = atomicrmw umax i8* %a, i8 %b acquire
|
|
ret i8 %1
|
|
}
|
|
|
|
define i8 @atomicrmw_umax_i8_release(i8 *%a, i8 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_umax_i8_release:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 20
|
|
; CSKY-NEXT: st16.w l3, (sp, 16) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 8
|
|
; CSKY-NEXT: mov16 l0, a1
|
|
; CSKY-NEXT: mov16 l1, a0
|
|
; CSKY-NEXT: ld16.b a0, (a0, 0)
|
|
; CSKY-NEXT: zextb16 l2, a1
|
|
; CSKY-NEXT: movi16 l3, 0
|
|
; CSKY-NEXT: .LBB47_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: zextb16 a1, a0
|
|
; CSKY-NEXT: cmphs16 l2, a1
|
|
; CSKY-NEXT: mov16 a2, l0
|
|
; CSKY-NEXT: movf32 a2, a0
|
|
; CSKY-NEXT: st32.b a0, (sp, 7)
|
|
; CSKY-NEXT: st16.w l3, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l1
|
|
; CSKY-NEXT: addi32 a1, sp, 7
|
|
; CSKY-NEXT: movi16 a3, 3
|
|
; CSKY-NEXT: jsri32 [.LCPI47_0]
|
|
; CSKY-NEXT: mov16 a1, a0
|
|
; CSKY-NEXT: ld32.b a0, (sp, 7)
|
|
; CSKY-NEXT: bez32 a1, .LBB47_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 8
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l3, (sp, 16) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 20
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI47_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_1
|
|
%1 = atomicrmw umax i8* %a, i8 %b release
|
|
ret i8 %1
|
|
}
|
|
|
|
define i8 @atomicrmw_umax_i8_acq_rel(i8 *%a, i8 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_umax_i8_acq_rel:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 20
|
|
; CSKY-NEXT: st16.w l3, (sp, 16) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 8
|
|
; CSKY-NEXT: mov16 l0, a1
|
|
; CSKY-NEXT: mov16 l1, a0
|
|
; CSKY-NEXT: ld16.b a0, (a0, 0)
|
|
; CSKY-NEXT: zextb16 l2, a1
|
|
; CSKY-NEXT: movi16 l3, 2
|
|
; CSKY-NEXT: .LBB48_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: zextb16 a1, a0
|
|
; CSKY-NEXT: cmphs16 l2, a1
|
|
; CSKY-NEXT: mov16 a2, l0
|
|
; CSKY-NEXT: movf32 a2, a0
|
|
; CSKY-NEXT: st32.b a0, (sp, 7)
|
|
; CSKY-NEXT: st16.w l3, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l1
|
|
; CSKY-NEXT: addi32 a1, sp, 7
|
|
; CSKY-NEXT: movi16 a3, 4
|
|
; CSKY-NEXT: jsri32 [.LCPI48_0]
|
|
; CSKY-NEXT: mov16 a1, a0
|
|
; CSKY-NEXT: ld32.b a0, (sp, 7)
|
|
; CSKY-NEXT: bez32 a1, .LBB48_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 8
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l3, (sp, 16) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 20
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI48_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_1
|
|
%1 = atomicrmw umax i8* %a, i8 %b acq_rel
|
|
ret i8 %1
|
|
}
|
|
|
|
define i8 @atomicrmw_umax_i8_seq_cst(i8 *%a, i8 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_umax_i8_seq_cst:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 20
|
|
; CSKY-NEXT: st16.w l3, (sp, 16) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 8
|
|
; CSKY-NEXT: mov16 l0, a1
|
|
; CSKY-NEXT: mov16 l1, a0
|
|
; CSKY-NEXT: ld16.b a0, (a0, 0)
|
|
; CSKY-NEXT: zextb16 l2, a1
|
|
; CSKY-NEXT: movi16 l3, 5
|
|
; CSKY-NEXT: .LBB49_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: zextb16 a1, a0
|
|
; CSKY-NEXT: cmphs16 l2, a1
|
|
; CSKY-NEXT: mov16 a2, l0
|
|
; CSKY-NEXT: movf32 a2, a0
|
|
; CSKY-NEXT: st32.b a0, (sp, 7)
|
|
; CSKY-NEXT: st16.w l3, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l1
|
|
; CSKY-NEXT: addi32 a1, sp, 7
|
|
; CSKY-NEXT: movi16 a3, 5
|
|
; CSKY-NEXT: jsri32 [.LCPI49_0]
|
|
; CSKY-NEXT: mov16 a1, a0
|
|
; CSKY-NEXT: ld32.b a0, (sp, 7)
|
|
; CSKY-NEXT: bez32 a1, .LBB49_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 8
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l3, (sp, 16) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 20
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI49_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_1
|
|
%1 = atomicrmw umax i8* %a, i8 %b seq_cst
|
|
ret i8 %1
|
|
}
|
|
|
|
define i8 @atomicrmw_umin_i8_monotonic(i8 *%a, i8 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_umin_i8_monotonic:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 20
|
|
; CSKY-NEXT: st16.w l3, (sp, 16) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 8
|
|
; CSKY-NEXT: mov16 l0, a1
|
|
; CSKY-NEXT: mov16 l1, a0
|
|
; CSKY-NEXT: ld16.b a0, (a0, 0)
|
|
; CSKY-NEXT: zextb16 l2, a1
|
|
; CSKY-NEXT: movi16 l3, 0
|
|
; CSKY-NEXT: .LBB50_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: zextb16 a1, a0
|
|
; CSKY-NEXT: cmphs16 l2, a1
|
|
; CSKY-NEXT: mov16 a2, l0
|
|
; CSKY-NEXT: movt32 a2, a0
|
|
; CSKY-NEXT: st32.b a0, (sp, 7)
|
|
; CSKY-NEXT: st16.w l3, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l1
|
|
; CSKY-NEXT: addi32 a1, sp, 7
|
|
; CSKY-NEXT: movi16 a3, 0
|
|
; CSKY-NEXT: jsri32 [.LCPI50_0]
|
|
; CSKY-NEXT: mov16 a1, a0
|
|
; CSKY-NEXT: ld32.b a0, (sp, 7)
|
|
; CSKY-NEXT: bez32 a1, .LBB50_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 8
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l3, (sp, 16) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 20
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI50_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_1
|
|
%1 = atomicrmw umin i8* %a, i8 %b monotonic
|
|
ret i8 %1
|
|
}
|
|
|
|
define i8 @atomicrmw_umin_i8_acquire(i8 *%a, i8 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_umin_i8_acquire:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 20
|
|
; CSKY-NEXT: st16.w l3, (sp, 16) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 8
|
|
; CSKY-NEXT: mov16 l0, a1
|
|
; CSKY-NEXT: mov16 l1, a0
|
|
; CSKY-NEXT: ld16.b a0, (a0, 0)
|
|
; CSKY-NEXT: zextb16 l2, a1
|
|
; CSKY-NEXT: movi16 l3, 2
|
|
; CSKY-NEXT: .LBB51_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: zextb16 a1, a0
|
|
; CSKY-NEXT: cmphs16 l2, a1
|
|
; CSKY-NEXT: mov16 a2, l0
|
|
; CSKY-NEXT: movt32 a2, a0
|
|
; CSKY-NEXT: st32.b a0, (sp, 7)
|
|
; CSKY-NEXT: st16.w l3, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l1
|
|
; CSKY-NEXT: addi32 a1, sp, 7
|
|
; CSKY-NEXT: movi16 a3, 2
|
|
; CSKY-NEXT: jsri32 [.LCPI51_0]
|
|
; CSKY-NEXT: mov16 a1, a0
|
|
; CSKY-NEXT: ld32.b a0, (sp, 7)
|
|
; CSKY-NEXT: bez32 a1, .LBB51_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 8
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l3, (sp, 16) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 20
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI51_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_1
|
|
%1 = atomicrmw umin i8* %a, i8 %b acquire
|
|
ret i8 %1
|
|
}
|
|
|
|
define i8 @atomicrmw_umin_i8_release(i8 *%a, i8 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_umin_i8_release:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 20
|
|
; CSKY-NEXT: st16.w l3, (sp, 16) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 8
|
|
; CSKY-NEXT: mov16 l0, a1
|
|
; CSKY-NEXT: mov16 l1, a0
|
|
; CSKY-NEXT: ld16.b a0, (a0, 0)
|
|
; CSKY-NEXT: zextb16 l2, a1
|
|
; CSKY-NEXT: movi16 l3, 0
|
|
; CSKY-NEXT: .LBB52_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: zextb16 a1, a0
|
|
; CSKY-NEXT: cmphs16 l2, a1
|
|
; CSKY-NEXT: mov16 a2, l0
|
|
; CSKY-NEXT: movt32 a2, a0
|
|
; CSKY-NEXT: st32.b a0, (sp, 7)
|
|
; CSKY-NEXT: st16.w l3, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l1
|
|
; CSKY-NEXT: addi32 a1, sp, 7
|
|
; CSKY-NEXT: movi16 a3, 3
|
|
; CSKY-NEXT: jsri32 [.LCPI52_0]
|
|
; CSKY-NEXT: mov16 a1, a0
|
|
; CSKY-NEXT: ld32.b a0, (sp, 7)
|
|
; CSKY-NEXT: bez32 a1, .LBB52_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 8
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l3, (sp, 16) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 20
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI52_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_1
|
|
%1 = atomicrmw umin i8* %a, i8 %b release
|
|
ret i8 %1
|
|
}
|
|
|
|
define i8 @atomicrmw_umin_i8_acq_rel(i8 *%a, i8 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_umin_i8_acq_rel:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 20
|
|
; CSKY-NEXT: st16.w l3, (sp, 16) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 8
|
|
; CSKY-NEXT: mov16 l0, a1
|
|
; CSKY-NEXT: mov16 l1, a0
|
|
; CSKY-NEXT: ld16.b a0, (a0, 0)
|
|
; CSKY-NEXT: zextb16 l2, a1
|
|
; CSKY-NEXT: movi16 l3, 2
|
|
; CSKY-NEXT: .LBB53_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: zextb16 a1, a0
|
|
; CSKY-NEXT: cmphs16 l2, a1
|
|
; CSKY-NEXT: mov16 a2, l0
|
|
; CSKY-NEXT: movt32 a2, a0
|
|
; CSKY-NEXT: st32.b a0, (sp, 7)
|
|
; CSKY-NEXT: st16.w l3, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l1
|
|
; CSKY-NEXT: addi32 a1, sp, 7
|
|
; CSKY-NEXT: movi16 a3, 4
|
|
; CSKY-NEXT: jsri32 [.LCPI53_0]
|
|
; CSKY-NEXT: mov16 a1, a0
|
|
; CSKY-NEXT: ld32.b a0, (sp, 7)
|
|
; CSKY-NEXT: bez32 a1, .LBB53_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 8
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l3, (sp, 16) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 20
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI53_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_1
|
|
%1 = atomicrmw umin i8* %a, i8 %b acq_rel
|
|
ret i8 %1
|
|
}
|
|
|
|
define i8 @atomicrmw_umin_i8_seq_cst(i8 *%a, i8 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_umin_i8_seq_cst:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 20
|
|
; CSKY-NEXT: st16.w l3, (sp, 16) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 8
|
|
; CSKY-NEXT: mov16 l0, a1
|
|
; CSKY-NEXT: mov16 l1, a0
|
|
; CSKY-NEXT: ld16.b a0, (a0, 0)
|
|
; CSKY-NEXT: zextb16 l2, a1
|
|
; CSKY-NEXT: movi16 l3, 5
|
|
; CSKY-NEXT: .LBB54_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: zextb16 a1, a0
|
|
; CSKY-NEXT: cmphs16 l2, a1
|
|
; CSKY-NEXT: mov16 a2, l0
|
|
; CSKY-NEXT: movt32 a2, a0
|
|
; CSKY-NEXT: st32.b a0, (sp, 7)
|
|
; CSKY-NEXT: st16.w l3, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l1
|
|
; CSKY-NEXT: addi32 a1, sp, 7
|
|
; CSKY-NEXT: movi16 a3, 5
|
|
; CSKY-NEXT: jsri32 [.LCPI54_0]
|
|
; CSKY-NEXT: mov16 a1, a0
|
|
; CSKY-NEXT: ld32.b a0, (sp, 7)
|
|
; CSKY-NEXT: bez32 a1, .LBB54_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 8
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l3, (sp, 16) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 20
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI54_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_1
|
|
%1 = atomicrmw umin i8* %a, i8 %b seq_cst
|
|
ret i8 %1
|
|
}
|
|
|
|
define i16 @atomicrmw_xchg_i16_monotonic(i16* %a, i16 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_xchg_i16_monotonic:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 0
|
|
; CSKY-NEXT: jsri32 [.LCPI55_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI55_0:
|
|
; CSKY-NEXT: .long __atomic_exchange_2
|
|
%1 = atomicrmw xchg i16* %a, i16 %b monotonic
|
|
ret i16 %1
|
|
}
|
|
|
|
define i16 @atomicrmw_xchg_i16_acquire(i16* %a, i16 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_xchg_i16_acquire:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 2
|
|
; CSKY-NEXT: jsri32 [.LCPI56_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI56_0:
|
|
; CSKY-NEXT: .long __atomic_exchange_2
|
|
%1 = atomicrmw xchg i16* %a, i16 %b acquire
|
|
ret i16 %1
|
|
}
|
|
|
|
define i16 @atomicrmw_xchg_i16_release(i16* %a, i16 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_xchg_i16_release:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 3
|
|
; CSKY-NEXT: jsri32 [.LCPI57_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI57_0:
|
|
; CSKY-NEXT: .long __atomic_exchange_2
|
|
%1 = atomicrmw xchg i16* %a, i16 %b release
|
|
ret i16 %1
|
|
}
|
|
|
|
define i16 @atomicrmw_xchg_i16_acq_rel(i16* %a, i16 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_xchg_i16_acq_rel:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 4
|
|
; CSKY-NEXT: jsri32 [.LCPI58_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI58_0:
|
|
; CSKY-NEXT: .long __atomic_exchange_2
|
|
%1 = atomicrmw xchg i16* %a, i16 %b acq_rel
|
|
ret i16 %1
|
|
}
|
|
|
|
define i16 @atomicrmw_xchg_i16_seq_cst(i16* %a, i16 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_xchg_i16_seq_cst:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 5
|
|
; CSKY-NEXT: jsri32 [.LCPI59_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI59_0:
|
|
; CSKY-NEXT: .long __atomic_exchange_2
|
|
%1 = atomicrmw xchg i16* %a, i16 %b seq_cst
|
|
ret i16 %1
|
|
}
|
|
|
|
define i16 @atomicrmw_add_i16_monotonic(i16 *%a, i16 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_add_i16_monotonic:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 0
|
|
; CSKY-NEXT: jsri32 [.LCPI60_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI60_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_add_2
|
|
%1 = atomicrmw add i16* %a, i16 %b monotonic
|
|
ret i16 %1
|
|
}
|
|
|
|
define i16 @atomicrmw_add_i16_acquire(i16 *%a, i16 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_add_i16_acquire:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 2
|
|
; CSKY-NEXT: jsri32 [.LCPI61_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI61_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_add_2
|
|
%1 = atomicrmw add i16* %a, i16 %b acquire
|
|
ret i16 %1
|
|
}
|
|
|
|
define i16 @atomicrmw_add_i16_release(i16 *%a, i16 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_add_i16_release:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 3
|
|
; CSKY-NEXT: jsri32 [.LCPI62_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI62_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_add_2
|
|
%1 = atomicrmw add i16* %a, i16 %b release
|
|
ret i16 %1
|
|
}
|
|
|
|
define i16 @atomicrmw_add_i16_acq_rel(i16 *%a, i16 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_add_i16_acq_rel:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 4
|
|
; CSKY-NEXT: jsri32 [.LCPI63_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI63_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_add_2
|
|
%1 = atomicrmw add i16* %a, i16 %b acq_rel
|
|
ret i16 %1
|
|
}
|
|
|
|
define i16 @atomicrmw_add_i16_seq_cst(i16 *%a, i16 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_add_i16_seq_cst:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 5
|
|
; CSKY-NEXT: jsri32 [.LCPI64_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI64_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_add_2
|
|
%1 = atomicrmw add i16* %a, i16 %b seq_cst
|
|
ret i16 %1
|
|
}
|
|
|
|
define i16 @atomicrmw_sub_i16_monotonic(i16* %a, i16 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_sub_i16_monotonic:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 0
|
|
; CSKY-NEXT: jsri32 [.LCPI65_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI65_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_sub_2
|
|
%1 = atomicrmw sub i16* %a, i16 %b monotonic
|
|
ret i16 %1
|
|
}
|
|
|
|
define i16 @atomicrmw_sub_i16_acquire(i16* %a, i16 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_sub_i16_acquire:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 2
|
|
; CSKY-NEXT: jsri32 [.LCPI66_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI66_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_sub_2
|
|
%1 = atomicrmw sub i16* %a, i16 %b acquire
|
|
ret i16 %1
|
|
}
|
|
|
|
define i16 @atomicrmw_sub_i16_release(i16* %a, i16 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_sub_i16_release:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 3
|
|
; CSKY-NEXT: jsri32 [.LCPI67_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI67_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_sub_2
|
|
%1 = atomicrmw sub i16* %a, i16 %b release
|
|
ret i16 %1
|
|
}
|
|
|
|
define i16 @atomicrmw_sub_i16_acq_rel(i16* %a, i16 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_sub_i16_acq_rel:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 4
|
|
; CSKY-NEXT: jsri32 [.LCPI68_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI68_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_sub_2
|
|
%1 = atomicrmw sub i16* %a, i16 %b acq_rel
|
|
ret i16 %1
|
|
}
|
|
|
|
define i16 @atomicrmw_sub_i16_seq_cst(i16* %a, i16 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_sub_i16_seq_cst:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 5
|
|
; CSKY-NEXT: jsri32 [.LCPI69_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI69_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_sub_2
|
|
%1 = atomicrmw sub i16* %a, i16 %b seq_cst
|
|
ret i16 %1
|
|
}
|
|
|
|
define i16 @atomicrmw_and_i16_monotonic(i16 *%a, i16 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_and_i16_monotonic:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 0
|
|
; CSKY-NEXT: jsri32 [.LCPI70_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI70_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_and_2
|
|
%1 = atomicrmw and i16* %a, i16 %b monotonic
|
|
ret i16 %1
|
|
}
|
|
|
|
define i16 @atomicrmw_and_i16_acquire(i16 *%a, i16 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_and_i16_acquire:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 2
|
|
; CSKY-NEXT: jsri32 [.LCPI71_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI71_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_and_2
|
|
%1 = atomicrmw and i16* %a, i16 %b acquire
|
|
ret i16 %1
|
|
}
|
|
|
|
define i16 @atomicrmw_and_i16_release(i16 *%a, i16 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_and_i16_release:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 3
|
|
; CSKY-NEXT: jsri32 [.LCPI72_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI72_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_and_2
|
|
%1 = atomicrmw and i16* %a, i16 %b release
|
|
ret i16 %1
|
|
}
|
|
|
|
define i16 @atomicrmw_and_i16_acq_rel(i16 *%a, i16 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_and_i16_acq_rel:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 4
|
|
; CSKY-NEXT: jsri32 [.LCPI73_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI73_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_and_2
|
|
%1 = atomicrmw and i16* %a, i16 %b acq_rel
|
|
ret i16 %1
|
|
}
|
|
|
|
define i16 @atomicrmw_and_i16_seq_cst(i16 *%a, i16 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_and_i16_seq_cst:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 5
|
|
; CSKY-NEXT: jsri32 [.LCPI74_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI74_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_and_2
|
|
%1 = atomicrmw and i16* %a, i16 %b seq_cst
|
|
ret i16 %1
|
|
}
|
|
|
|
define i16 @atomicrmw_nand_i16_monotonic(i16* %a, i16 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_nand_i16_monotonic:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 0
|
|
; CSKY-NEXT: jsri32 [.LCPI75_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI75_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_nand_2
|
|
%1 = atomicrmw nand i16* %a, i16 %b monotonic
|
|
ret i16 %1
|
|
}
|
|
|
|
define i16 @atomicrmw_nand_i16_acquire(i16* %a, i16 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_nand_i16_acquire:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 2
|
|
; CSKY-NEXT: jsri32 [.LCPI76_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI76_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_nand_2
|
|
%1 = atomicrmw nand i16* %a, i16 %b acquire
|
|
ret i16 %1
|
|
}
|
|
|
|
define i16 @atomicrmw_nand_i16_release(i16* %a, i16 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_nand_i16_release:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 3
|
|
; CSKY-NEXT: jsri32 [.LCPI77_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI77_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_nand_2
|
|
%1 = atomicrmw nand i16* %a, i16 %b release
|
|
ret i16 %1
|
|
}
|
|
|
|
define i16 @atomicrmw_nand_i16_acq_rel(i16* %a, i16 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_nand_i16_acq_rel:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 4
|
|
; CSKY-NEXT: jsri32 [.LCPI78_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI78_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_nand_2
|
|
%1 = atomicrmw nand i16* %a, i16 %b acq_rel
|
|
ret i16 %1
|
|
}
|
|
|
|
define i16 @atomicrmw_nand_i16_seq_cst(i16* %a, i16 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_nand_i16_seq_cst:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 5
|
|
; CSKY-NEXT: jsri32 [.LCPI79_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI79_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_nand_2
|
|
%1 = atomicrmw nand i16* %a, i16 %b seq_cst
|
|
ret i16 %1
|
|
}
|
|
|
|
define i16 @atomicrmw_or_i16_monotonic(i16 *%a, i16 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_or_i16_monotonic:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 0
|
|
; CSKY-NEXT: jsri32 [.LCPI80_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI80_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_or_2
|
|
%1 = atomicrmw or i16* %a, i16 %b monotonic
|
|
ret i16 %1
|
|
}
|
|
|
|
define i16 @atomicrmw_or_i16_acquire(i16 *%a, i16 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_or_i16_acquire:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 2
|
|
; CSKY-NEXT: jsri32 [.LCPI81_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI81_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_or_2
|
|
%1 = atomicrmw or i16* %a, i16 %b acquire
|
|
ret i16 %1
|
|
}
|
|
|
|
define i16 @atomicrmw_or_i16_release(i16 *%a, i16 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_or_i16_release:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 3
|
|
; CSKY-NEXT: jsri32 [.LCPI82_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI82_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_or_2
|
|
%1 = atomicrmw or i16* %a, i16 %b release
|
|
ret i16 %1
|
|
}
|
|
|
|
define i16 @atomicrmw_or_i16_acq_rel(i16 *%a, i16 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_or_i16_acq_rel:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 4
|
|
; CSKY-NEXT: jsri32 [.LCPI83_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI83_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_or_2
|
|
%1 = atomicrmw or i16* %a, i16 %b acq_rel
|
|
ret i16 %1
|
|
}
|
|
|
|
define i16 @atomicrmw_or_i16_seq_cst(i16 *%a, i16 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_or_i16_seq_cst:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 5
|
|
; CSKY-NEXT: jsri32 [.LCPI84_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI84_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_or_2
|
|
%1 = atomicrmw or i16* %a, i16 %b seq_cst
|
|
ret i16 %1
|
|
}
|
|
|
|
define i16 @atomicrmw_xor_i16_monotonic(i16 *%a, i16 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_xor_i16_monotonic:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 0
|
|
; CSKY-NEXT: jsri32 [.LCPI85_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI85_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_xor_2
|
|
%1 = atomicrmw xor i16* %a, i16 %b monotonic
|
|
ret i16 %1
|
|
}
|
|
|
|
define i16 @atomicrmw_xor_i16_acquire(i16 *%a, i16 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_xor_i16_acquire:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 2
|
|
; CSKY-NEXT: jsri32 [.LCPI86_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI86_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_xor_2
|
|
%1 = atomicrmw xor i16* %a, i16 %b acquire
|
|
ret i16 %1
|
|
}
|
|
|
|
define i16 @atomicrmw_xor_i16_release(i16 *%a, i16 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_xor_i16_release:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 3
|
|
; CSKY-NEXT: jsri32 [.LCPI87_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI87_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_xor_2
|
|
%1 = atomicrmw xor i16* %a, i16 %b release
|
|
ret i16 %1
|
|
}
|
|
|
|
define i16 @atomicrmw_xor_i16_acq_rel(i16 *%a, i16 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_xor_i16_acq_rel:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 4
|
|
; CSKY-NEXT: jsri32 [.LCPI88_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI88_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_xor_2
|
|
%1 = atomicrmw xor i16* %a, i16 %b acq_rel
|
|
ret i16 %1
|
|
}
|
|
|
|
define i16 @atomicrmw_xor_i16_seq_cst(i16 *%a, i16 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_xor_i16_seq_cst:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 5
|
|
; CSKY-NEXT: jsri32 [.LCPI89_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI89_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_xor_2
|
|
%1 = atomicrmw xor i16* %a, i16 %b seq_cst
|
|
ret i16 %1
|
|
}
|
|
|
|
define i16 @atomicrmw_max_i16_monotonic(i16 *%a, i16 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_max_i16_monotonic:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 20
|
|
; CSKY-NEXT: st16.w l3, (sp, 16) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 8
|
|
; CSKY-NEXT: mov16 l0, a1
|
|
; CSKY-NEXT: mov16 l1, a0
|
|
; CSKY-NEXT: ld16.h a0, (a0, 0)
|
|
; CSKY-NEXT: sexth16 l2, a1
|
|
; CSKY-NEXT: movi16 l3, 0
|
|
; CSKY-NEXT: .LBB90_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: sexth16 a1, a0
|
|
; CSKY-NEXT: cmplt16 l2, a1
|
|
; CSKY-NEXT: mov16 a2, l0
|
|
; CSKY-NEXT: movt32 a2, a0
|
|
; CSKY-NEXT: st32.h a0, (sp, 6)
|
|
; CSKY-NEXT: st16.w l3, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l1
|
|
; CSKY-NEXT: addi32 a1, sp, 6
|
|
; CSKY-NEXT: movi16 a3, 0
|
|
; CSKY-NEXT: jsri32 [.LCPI90_0]
|
|
; CSKY-NEXT: mov16 a1, a0
|
|
; CSKY-NEXT: ld32.h a0, (sp, 6)
|
|
; CSKY-NEXT: bez32 a1, .LBB90_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 8
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l3, (sp, 16) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 20
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI90_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_2
|
|
%1 = atomicrmw max i16* %a, i16 %b monotonic
|
|
ret i16 %1
|
|
}
|
|
|
|
define i16 @atomicrmw_max_i16_acquire(i16 *%a, i16 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_max_i16_acquire:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 20
|
|
; CSKY-NEXT: st16.w l3, (sp, 16) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 8
|
|
; CSKY-NEXT: mov16 l0, a1
|
|
; CSKY-NEXT: mov16 l1, a0
|
|
; CSKY-NEXT: ld16.h a0, (a0, 0)
|
|
; CSKY-NEXT: sexth16 l2, a1
|
|
; CSKY-NEXT: movi16 l3, 2
|
|
; CSKY-NEXT: .LBB91_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: sexth16 a1, a0
|
|
; CSKY-NEXT: cmplt16 l2, a1
|
|
; CSKY-NEXT: mov16 a2, l0
|
|
; CSKY-NEXT: movt32 a2, a0
|
|
; CSKY-NEXT: st32.h a0, (sp, 6)
|
|
; CSKY-NEXT: st16.w l3, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l1
|
|
; CSKY-NEXT: addi32 a1, sp, 6
|
|
; CSKY-NEXT: movi16 a3, 2
|
|
; CSKY-NEXT: jsri32 [.LCPI91_0]
|
|
; CSKY-NEXT: mov16 a1, a0
|
|
; CSKY-NEXT: ld32.h a0, (sp, 6)
|
|
; CSKY-NEXT: bez32 a1, .LBB91_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 8
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l3, (sp, 16) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 20
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI91_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_2
|
|
%1 = atomicrmw max i16* %a, i16 %b acquire
|
|
ret i16 %1
|
|
}
|
|
|
|
define i16 @atomicrmw_max_i16_release(i16 *%a, i16 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_max_i16_release:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 20
|
|
; CSKY-NEXT: st16.w l3, (sp, 16) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 8
|
|
; CSKY-NEXT: mov16 l0, a1
|
|
; CSKY-NEXT: mov16 l1, a0
|
|
; CSKY-NEXT: ld16.h a0, (a0, 0)
|
|
; CSKY-NEXT: sexth16 l2, a1
|
|
; CSKY-NEXT: movi16 l3, 0
|
|
; CSKY-NEXT: .LBB92_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: sexth16 a1, a0
|
|
; CSKY-NEXT: cmplt16 l2, a1
|
|
; CSKY-NEXT: mov16 a2, l0
|
|
; CSKY-NEXT: movt32 a2, a0
|
|
; CSKY-NEXT: st32.h a0, (sp, 6)
|
|
; CSKY-NEXT: st16.w l3, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l1
|
|
; CSKY-NEXT: addi32 a1, sp, 6
|
|
; CSKY-NEXT: movi16 a3, 3
|
|
; CSKY-NEXT: jsri32 [.LCPI92_0]
|
|
; CSKY-NEXT: mov16 a1, a0
|
|
; CSKY-NEXT: ld32.h a0, (sp, 6)
|
|
; CSKY-NEXT: bez32 a1, .LBB92_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 8
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l3, (sp, 16) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 20
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI92_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_2
|
|
%1 = atomicrmw max i16* %a, i16 %b release
|
|
ret i16 %1
|
|
}
|
|
|
|
define i16 @atomicrmw_max_i16_acq_rel(i16 *%a, i16 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_max_i16_acq_rel:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 20
|
|
; CSKY-NEXT: st16.w l3, (sp, 16) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 8
|
|
; CSKY-NEXT: mov16 l0, a1
|
|
; CSKY-NEXT: mov16 l1, a0
|
|
; CSKY-NEXT: ld16.h a0, (a0, 0)
|
|
; CSKY-NEXT: sexth16 l2, a1
|
|
; CSKY-NEXT: movi16 l3, 2
|
|
; CSKY-NEXT: .LBB93_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: sexth16 a1, a0
|
|
; CSKY-NEXT: cmplt16 l2, a1
|
|
; CSKY-NEXT: mov16 a2, l0
|
|
; CSKY-NEXT: movt32 a2, a0
|
|
; CSKY-NEXT: st32.h a0, (sp, 6)
|
|
; CSKY-NEXT: st16.w l3, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l1
|
|
; CSKY-NEXT: addi32 a1, sp, 6
|
|
; CSKY-NEXT: movi16 a3, 4
|
|
; CSKY-NEXT: jsri32 [.LCPI93_0]
|
|
; CSKY-NEXT: mov16 a1, a0
|
|
; CSKY-NEXT: ld32.h a0, (sp, 6)
|
|
; CSKY-NEXT: bez32 a1, .LBB93_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 8
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l3, (sp, 16) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 20
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI93_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_2
|
|
%1 = atomicrmw max i16* %a, i16 %b acq_rel
|
|
ret i16 %1
|
|
}
|
|
|
|
define i16 @atomicrmw_max_i16_seq_cst(i16 *%a, i16 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_max_i16_seq_cst:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 20
|
|
; CSKY-NEXT: st16.w l3, (sp, 16) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 8
|
|
; CSKY-NEXT: mov16 l0, a1
|
|
; CSKY-NEXT: mov16 l1, a0
|
|
; CSKY-NEXT: ld16.h a0, (a0, 0)
|
|
; CSKY-NEXT: sexth16 l2, a1
|
|
; CSKY-NEXT: movi16 l3, 5
|
|
; CSKY-NEXT: .LBB94_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: sexth16 a1, a0
|
|
; CSKY-NEXT: cmplt16 l2, a1
|
|
; CSKY-NEXT: mov16 a2, l0
|
|
; CSKY-NEXT: movt32 a2, a0
|
|
; CSKY-NEXT: st32.h a0, (sp, 6)
|
|
; CSKY-NEXT: st16.w l3, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l1
|
|
; CSKY-NEXT: addi32 a1, sp, 6
|
|
; CSKY-NEXT: movi16 a3, 5
|
|
; CSKY-NEXT: jsri32 [.LCPI94_0]
|
|
; CSKY-NEXT: mov16 a1, a0
|
|
; CSKY-NEXT: ld32.h a0, (sp, 6)
|
|
; CSKY-NEXT: bez32 a1, .LBB94_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 8
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l3, (sp, 16) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 20
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI94_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_2
|
|
%1 = atomicrmw max i16* %a, i16 %b seq_cst
|
|
ret i16 %1
|
|
}
|
|
|
|
define i16 @atomicrmw_min_i16_monotonic(i16 *%a, i16 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_min_i16_monotonic:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 20
|
|
; CSKY-NEXT: st16.w l3, (sp, 16) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 8
|
|
; CSKY-NEXT: mov16 l0, a1
|
|
; CSKY-NEXT: mov16 l1, a0
|
|
; CSKY-NEXT: ld16.h a0, (a0, 0)
|
|
; CSKY-NEXT: sexth16 l2, a1
|
|
; CSKY-NEXT: movi16 l3, 0
|
|
; CSKY-NEXT: .LBB95_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: sexth16 a1, a0
|
|
; CSKY-NEXT: cmplt16 l2, a1
|
|
; CSKY-NEXT: mov16 a2, l0
|
|
; CSKY-NEXT: movf32 a2, a0
|
|
; CSKY-NEXT: st32.h a0, (sp, 6)
|
|
; CSKY-NEXT: st16.w l3, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l1
|
|
; CSKY-NEXT: addi32 a1, sp, 6
|
|
; CSKY-NEXT: movi16 a3, 0
|
|
; CSKY-NEXT: jsri32 [.LCPI95_0]
|
|
; CSKY-NEXT: mov16 a1, a0
|
|
; CSKY-NEXT: ld32.h a0, (sp, 6)
|
|
; CSKY-NEXT: bez32 a1, .LBB95_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 8
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l3, (sp, 16) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 20
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI95_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_2
|
|
%1 = atomicrmw min i16* %a, i16 %b monotonic
|
|
ret i16 %1
|
|
}
|
|
|
|
define i16 @atomicrmw_min_i16_acquire(i16 *%a, i16 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_min_i16_acquire:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 20
|
|
; CSKY-NEXT: st16.w l3, (sp, 16) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 8
|
|
; CSKY-NEXT: mov16 l0, a1
|
|
; CSKY-NEXT: mov16 l1, a0
|
|
; CSKY-NEXT: ld16.h a0, (a0, 0)
|
|
; CSKY-NEXT: sexth16 l2, a1
|
|
; CSKY-NEXT: movi16 l3, 2
|
|
; CSKY-NEXT: .LBB96_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: sexth16 a1, a0
|
|
; CSKY-NEXT: cmplt16 l2, a1
|
|
; CSKY-NEXT: mov16 a2, l0
|
|
; CSKY-NEXT: movf32 a2, a0
|
|
; CSKY-NEXT: st32.h a0, (sp, 6)
|
|
; CSKY-NEXT: st16.w l3, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l1
|
|
; CSKY-NEXT: addi32 a1, sp, 6
|
|
; CSKY-NEXT: movi16 a3, 2
|
|
; CSKY-NEXT: jsri32 [.LCPI96_0]
|
|
; CSKY-NEXT: mov16 a1, a0
|
|
; CSKY-NEXT: ld32.h a0, (sp, 6)
|
|
; CSKY-NEXT: bez32 a1, .LBB96_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 8
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l3, (sp, 16) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 20
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI96_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_2
|
|
%1 = atomicrmw min i16* %a, i16 %b acquire
|
|
ret i16 %1
|
|
}
|
|
|
|
define i16 @atomicrmw_min_i16_release(i16 *%a, i16 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_min_i16_release:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 20
|
|
; CSKY-NEXT: st16.w l3, (sp, 16) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 8
|
|
; CSKY-NEXT: mov16 l0, a1
|
|
; CSKY-NEXT: mov16 l1, a0
|
|
; CSKY-NEXT: ld16.h a0, (a0, 0)
|
|
; CSKY-NEXT: sexth16 l2, a1
|
|
; CSKY-NEXT: movi16 l3, 0
|
|
; CSKY-NEXT: .LBB97_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: sexth16 a1, a0
|
|
; CSKY-NEXT: cmplt16 l2, a1
|
|
; CSKY-NEXT: mov16 a2, l0
|
|
; CSKY-NEXT: movf32 a2, a0
|
|
; CSKY-NEXT: st32.h a0, (sp, 6)
|
|
; CSKY-NEXT: st16.w l3, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l1
|
|
; CSKY-NEXT: addi32 a1, sp, 6
|
|
; CSKY-NEXT: movi16 a3, 3
|
|
; CSKY-NEXT: jsri32 [.LCPI97_0]
|
|
; CSKY-NEXT: mov16 a1, a0
|
|
; CSKY-NEXT: ld32.h a0, (sp, 6)
|
|
; CSKY-NEXT: bez32 a1, .LBB97_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 8
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l3, (sp, 16) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 20
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI97_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_2
|
|
%1 = atomicrmw min i16* %a, i16 %b release
|
|
ret i16 %1
|
|
}
|
|
|
|
define i16 @atomicrmw_min_i16_acq_rel(i16 *%a, i16 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_min_i16_acq_rel:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 20
|
|
; CSKY-NEXT: st16.w l3, (sp, 16) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 8
|
|
; CSKY-NEXT: mov16 l0, a1
|
|
; CSKY-NEXT: mov16 l1, a0
|
|
; CSKY-NEXT: ld16.h a0, (a0, 0)
|
|
; CSKY-NEXT: sexth16 l2, a1
|
|
; CSKY-NEXT: movi16 l3, 2
|
|
; CSKY-NEXT: .LBB98_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: sexth16 a1, a0
|
|
; CSKY-NEXT: cmplt16 l2, a1
|
|
; CSKY-NEXT: mov16 a2, l0
|
|
; CSKY-NEXT: movf32 a2, a0
|
|
; CSKY-NEXT: st32.h a0, (sp, 6)
|
|
; CSKY-NEXT: st16.w l3, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l1
|
|
; CSKY-NEXT: addi32 a1, sp, 6
|
|
; CSKY-NEXT: movi16 a3, 4
|
|
; CSKY-NEXT: jsri32 [.LCPI98_0]
|
|
; CSKY-NEXT: mov16 a1, a0
|
|
; CSKY-NEXT: ld32.h a0, (sp, 6)
|
|
; CSKY-NEXT: bez32 a1, .LBB98_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 8
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l3, (sp, 16) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 20
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI98_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_2
|
|
%1 = atomicrmw min i16* %a, i16 %b acq_rel
|
|
ret i16 %1
|
|
}
|
|
|
|
define i16 @atomicrmw_min_i16_seq_cst(i16 *%a, i16 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_min_i16_seq_cst:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 20
|
|
; CSKY-NEXT: st16.w l3, (sp, 16) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 8
|
|
; CSKY-NEXT: mov16 l0, a1
|
|
; CSKY-NEXT: mov16 l1, a0
|
|
; CSKY-NEXT: ld16.h a0, (a0, 0)
|
|
; CSKY-NEXT: sexth16 l2, a1
|
|
; CSKY-NEXT: movi16 l3, 5
|
|
; CSKY-NEXT: .LBB99_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: sexth16 a1, a0
|
|
; CSKY-NEXT: cmplt16 l2, a1
|
|
; CSKY-NEXT: mov16 a2, l0
|
|
; CSKY-NEXT: movf32 a2, a0
|
|
; CSKY-NEXT: st32.h a0, (sp, 6)
|
|
; CSKY-NEXT: st16.w l3, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l1
|
|
; CSKY-NEXT: addi32 a1, sp, 6
|
|
; CSKY-NEXT: movi16 a3, 5
|
|
; CSKY-NEXT: jsri32 [.LCPI99_0]
|
|
; CSKY-NEXT: mov16 a1, a0
|
|
; CSKY-NEXT: ld32.h a0, (sp, 6)
|
|
; CSKY-NEXT: bez32 a1, .LBB99_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 8
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l3, (sp, 16) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 20
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI99_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_2
|
|
%1 = atomicrmw min i16* %a, i16 %b seq_cst
|
|
ret i16 %1
|
|
}
|
|
|
|
define i16 @atomicrmw_umax_i16_monotonic(i16 *%a, i16 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_umax_i16_monotonic:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 20
|
|
; CSKY-NEXT: st16.w l3, (sp, 16) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 8
|
|
; CSKY-NEXT: mov16 l0, a1
|
|
; CSKY-NEXT: mov16 l1, a0
|
|
; CSKY-NEXT: ld16.h a0, (a0, 0)
|
|
; CSKY-NEXT: zexth16 l2, a1
|
|
; CSKY-NEXT: movi16 l3, 0
|
|
; CSKY-NEXT: .LBB100_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: zexth16 a1, a0
|
|
; CSKY-NEXT: cmphs16 l2, a1
|
|
; CSKY-NEXT: mov16 a2, l0
|
|
; CSKY-NEXT: movf32 a2, a0
|
|
; CSKY-NEXT: st32.h a0, (sp, 6)
|
|
; CSKY-NEXT: st16.w l3, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l1
|
|
; CSKY-NEXT: addi32 a1, sp, 6
|
|
; CSKY-NEXT: movi16 a3, 0
|
|
; CSKY-NEXT: jsri32 [.LCPI100_0]
|
|
; CSKY-NEXT: mov16 a1, a0
|
|
; CSKY-NEXT: ld32.h a0, (sp, 6)
|
|
; CSKY-NEXT: bez32 a1, .LBB100_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 8
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l3, (sp, 16) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 20
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI100_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_2
|
|
%1 = atomicrmw umax i16* %a, i16 %b monotonic
|
|
ret i16 %1
|
|
}
|
|
|
|
define i16 @atomicrmw_umax_i16_acquire(i16 *%a, i16 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_umax_i16_acquire:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 20
|
|
; CSKY-NEXT: st16.w l3, (sp, 16) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 8
|
|
; CSKY-NEXT: mov16 l0, a1
|
|
; CSKY-NEXT: mov16 l1, a0
|
|
; CSKY-NEXT: ld16.h a0, (a0, 0)
|
|
; CSKY-NEXT: zexth16 l2, a1
|
|
; CSKY-NEXT: movi16 l3, 2
|
|
; CSKY-NEXT: .LBB101_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: zexth16 a1, a0
|
|
; CSKY-NEXT: cmphs16 l2, a1
|
|
; CSKY-NEXT: mov16 a2, l0
|
|
; CSKY-NEXT: movf32 a2, a0
|
|
; CSKY-NEXT: st32.h a0, (sp, 6)
|
|
; CSKY-NEXT: st16.w l3, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l1
|
|
; CSKY-NEXT: addi32 a1, sp, 6
|
|
; CSKY-NEXT: movi16 a3, 2
|
|
; CSKY-NEXT: jsri32 [.LCPI101_0]
|
|
; CSKY-NEXT: mov16 a1, a0
|
|
; CSKY-NEXT: ld32.h a0, (sp, 6)
|
|
; CSKY-NEXT: bez32 a1, .LBB101_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 8
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l3, (sp, 16) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 20
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI101_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_2
|
|
%1 = atomicrmw umax i16* %a, i16 %b acquire
|
|
ret i16 %1
|
|
}
|
|
|
|
define i16 @atomicrmw_umax_i16_release(i16 *%a, i16 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_umax_i16_release:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 20
|
|
; CSKY-NEXT: st16.w l3, (sp, 16) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 8
|
|
; CSKY-NEXT: mov16 l0, a1
|
|
; CSKY-NEXT: mov16 l1, a0
|
|
; CSKY-NEXT: ld16.h a0, (a0, 0)
|
|
; CSKY-NEXT: zexth16 l2, a1
|
|
; CSKY-NEXT: movi16 l3, 0
|
|
; CSKY-NEXT: .LBB102_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: zexth16 a1, a0
|
|
; CSKY-NEXT: cmphs16 l2, a1
|
|
; CSKY-NEXT: mov16 a2, l0
|
|
; CSKY-NEXT: movf32 a2, a0
|
|
; CSKY-NEXT: st32.h a0, (sp, 6)
|
|
; CSKY-NEXT: st16.w l3, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l1
|
|
; CSKY-NEXT: addi32 a1, sp, 6
|
|
; CSKY-NEXT: movi16 a3, 3
|
|
; CSKY-NEXT: jsri32 [.LCPI102_0]
|
|
; CSKY-NEXT: mov16 a1, a0
|
|
; CSKY-NEXT: ld32.h a0, (sp, 6)
|
|
; CSKY-NEXT: bez32 a1, .LBB102_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 8
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l3, (sp, 16) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 20
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI102_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_2
|
|
%1 = atomicrmw umax i16* %a, i16 %b release
|
|
ret i16 %1
|
|
}
|
|
|
|
define i16 @atomicrmw_umax_i16_acq_rel(i16 *%a, i16 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_umax_i16_acq_rel:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 20
|
|
; CSKY-NEXT: st16.w l3, (sp, 16) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 8
|
|
; CSKY-NEXT: mov16 l0, a1
|
|
; CSKY-NEXT: mov16 l1, a0
|
|
; CSKY-NEXT: ld16.h a0, (a0, 0)
|
|
; CSKY-NEXT: zexth16 l2, a1
|
|
; CSKY-NEXT: movi16 l3, 2
|
|
; CSKY-NEXT: .LBB103_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: zexth16 a1, a0
|
|
; CSKY-NEXT: cmphs16 l2, a1
|
|
; CSKY-NEXT: mov16 a2, l0
|
|
; CSKY-NEXT: movf32 a2, a0
|
|
; CSKY-NEXT: st32.h a0, (sp, 6)
|
|
; CSKY-NEXT: st16.w l3, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l1
|
|
; CSKY-NEXT: addi32 a1, sp, 6
|
|
; CSKY-NEXT: movi16 a3, 4
|
|
; CSKY-NEXT: jsri32 [.LCPI103_0]
|
|
; CSKY-NEXT: mov16 a1, a0
|
|
; CSKY-NEXT: ld32.h a0, (sp, 6)
|
|
; CSKY-NEXT: bez32 a1, .LBB103_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 8
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l3, (sp, 16) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 20
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI103_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_2
|
|
%1 = atomicrmw umax i16* %a, i16 %b acq_rel
|
|
ret i16 %1
|
|
}
|
|
|
|
define i16 @atomicrmw_umax_i16_seq_cst(i16 *%a, i16 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_umax_i16_seq_cst:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 20
|
|
; CSKY-NEXT: st16.w l3, (sp, 16) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 8
|
|
; CSKY-NEXT: mov16 l0, a1
|
|
; CSKY-NEXT: mov16 l1, a0
|
|
; CSKY-NEXT: ld16.h a0, (a0, 0)
|
|
; CSKY-NEXT: zexth16 l2, a1
|
|
; CSKY-NEXT: movi16 l3, 5
|
|
; CSKY-NEXT: .LBB104_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: zexth16 a1, a0
|
|
; CSKY-NEXT: cmphs16 l2, a1
|
|
; CSKY-NEXT: mov16 a2, l0
|
|
; CSKY-NEXT: movf32 a2, a0
|
|
; CSKY-NEXT: st32.h a0, (sp, 6)
|
|
; CSKY-NEXT: st16.w l3, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l1
|
|
; CSKY-NEXT: addi32 a1, sp, 6
|
|
; CSKY-NEXT: movi16 a3, 5
|
|
; CSKY-NEXT: jsri32 [.LCPI104_0]
|
|
; CSKY-NEXT: mov16 a1, a0
|
|
; CSKY-NEXT: ld32.h a0, (sp, 6)
|
|
; CSKY-NEXT: bez32 a1, .LBB104_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 8
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l3, (sp, 16) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 20
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI104_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_2
|
|
%1 = atomicrmw umax i16* %a, i16 %b seq_cst
|
|
ret i16 %1
|
|
}
|
|
|
|
define i16 @atomicrmw_umin_i16_monotonic(i16 *%a, i16 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_umin_i16_monotonic:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 20
|
|
; CSKY-NEXT: st16.w l3, (sp, 16) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 8
|
|
; CSKY-NEXT: mov16 l0, a1
|
|
; CSKY-NEXT: mov16 l1, a0
|
|
; CSKY-NEXT: ld16.h a0, (a0, 0)
|
|
; CSKY-NEXT: zexth16 l2, a1
|
|
; CSKY-NEXT: movi16 l3, 0
|
|
; CSKY-NEXT: .LBB105_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: zexth16 a1, a0
|
|
; CSKY-NEXT: cmphs16 l2, a1
|
|
; CSKY-NEXT: mov16 a2, l0
|
|
; CSKY-NEXT: movt32 a2, a0
|
|
; CSKY-NEXT: st32.h a0, (sp, 6)
|
|
; CSKY-NEXT: st16.w l3, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l1
|
|
; CSKY-NEXT: addi32 a1, sp, 6
|
|
; CSKY-NEXT: movi16 a3, 0
|
|
; CSKY-NEXT: jsri32 [.LCPI105_0]
|
|
; CSKY-NEXT: mov16 a1, a0
|
|
; CSKY-NEXT: ld32.h a0, (sp, 6)
|
|
; CSKY-NEXT: bez32 a1, .LBB105_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 8
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l3, (sp, 16) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 20
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI105_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_2
|
|
%1 = atomicrmw umin i16* %a, i16 %b monotonic
|
|
ret i16 %1
|
|
}
|
|
|
|
define i16 @atomicrmw_umin_i16_acquire(i16 *%a, i16 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_umin_i16_acquire:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 20
|
|
; CSKY-NEXT: st16.w l3, (sp, 16) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 8
|
|
; CSKY-NEXT: mov16 l0, a1
|
|
; CSKY-NEXT: mov16 l1, a0
|
|
; CSKY-NEXT: ld16.h a0, (a0, 0)
|
|
; CSKY-NEXT: zexth16 l2, a1
|
|
; CSKY-NEXT: movi16 l3, 2
|
|
; CSKY-NEXT: .LBB106_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: zexth16 a1, a0
|
|
; CSKY-NEXT: cmphs16 l2, a1
|
|
; CSKY-NEXT: mov16 a2, l0
|
|
; CSKY-NEXT: movt32 a2, a0
|
|
; CSKY-NEXT: st32.h a0, (sp, 6)
|
|
; CSKY-NEXT: st16.w l3, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l1
|
|
; CSKY-NEXT: addi32 a1, sp, 6
|
|
; CSKY-NEXT: movi16 a3, 2
|
|
; CSKY-NEXT: jsri32 [.LCPI106_0]
|
|
; CSKY-NEXT: mov16 a1, a0
|
|
; CSKY-NEXT: ld32.h a0, (sp, 6)
|
|
; CSKY-NEXT: bez32 a1, .LBB106_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 8
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l3, (sp, 16) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 20
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI106_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_2
|
|
%1 = atomicrmw umin i16* %a, i16 %b acquire
|
|
ret i16 %1
|
|
}
|
|
|
|
define i16 @atomicrmw_umin_i16_release(i16 *%a, i16 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_umin_i16_release:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 20
|
|
; CSKY-NEXT: st16.w l3, (sp, 16) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 8
|
|
; CSKY-NEXT: mov16 l0, a1
|
|
; CSKY-NEXT: mov16 l1, a0
|
|
; CSKY-NEXT: ld16.h a0, (a0, 0)
|
|
; CSKY-NEXT: zexth16 l2, a1
|
|
; CSKY-NEXT: movi16 l3, 0
|
|
; CSKY-NEXT: .LBB107_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: zexth16 a1, a0
|
|
; CSKY-NEXT: cmphs16 l2, a1
|
|
; CSKY-NEXT: mov16 a2, l0
|
|
; CSKY-NEXT: movt32 a2, a0
|
|
; CSKY-NEXT: st32.h a0, (sp, 6)
|
|
; CSKY-NEXT: st16.w l3, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l1
|
|
; CSKY-NEXT: addi32 a1, sp, 6
|
|
; CSKY-NEXT: movi16 a3, 3
|
|
; CSKY-NEXT: jsri32 [.LCPI107_0]
|
|
; CSKY-NEXT: mov16 a1, a0
|
|
; CSKY-NEXT: ld32.h a0, (sp, 6)
|
|
; CSKY-NEXT: bez32 a1, .LBB107_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 8
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l3, (sp, 16) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 20
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI107_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_2
|
|
%1 = atomicrmw umin i16* %a, i16 %b release
|
|
ret i16 %1
|
|
}
|
|
|
|
define i16 @atomicrmw_umin_i16_acq_rel(i16 *%a, i16 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_umin_i16_acq_rel:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 20
|
|
; CSKY-NEXT: st16.w l3, (sp, 16) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 8
|
|
; CSKY-NEXT: mov16 l0, a1
|
|
; CSKY-NEXT: mov16 l1, a0
|
|
; CSKY-NEXT: ld16.h a0, (a0, 0)
|
|
; CSKY-NEXT: zexth16 l2, a1
|
|
; CSKY-NEXT: movi16 l3, 2
|
|
; CSKY-NEXT: .LBB108_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: zexth16 a1, a0
|
|
; CSKY-NEXT: cmphs16 l2, a1
|
|
; CSKY-NEXT: mov16 a2, l0
|
|
; CSKY-NEXT: movt32 a2, a0
|
|
; CSKY-NEXT: st32.h a0, (sp, 6)
|
|
; CSKY-NEXT: st16.w l3, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l1
|
|
; CSKY-NEXT: addi32 a1, sp, 6
|
|
; CSKY-NEXT: movi16 a3, 4
|
|
; CSKY-NEXT: jsri32 [.LCPI108_0]
|
|
; CSKY-NEXT: mov16 a1, a0
|
|
; CSKY-NEXT: ld32.h a0, (sp, 6)
|
|
; CSKY-NEXT: bez32 a1, .LBB108_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 8
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l3, (sp, 16) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 20
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI108_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_2
|
|
%1 = atomicrmw umin i16* %a, i16 %b acq_rel
|
|
ret i16 %1
|
|
}
|
|
|
|
define i16 @atomicrmw_umin_i16_seq_cst(i16 *%a, i16 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_umin_i16_seq_cst:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 20
|
|
; CSKY-NEXT: st16.w l3, (sp, 16) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 8
|
|
; CSKY-NEXT: mov16 l0, a1
|
|
; CSKY-NEXT: mov16 l1, a0
|
|
; CSKY-NEXT: ld16.h a0, (a0, 0)
|
|
; CSKY-NEXT: zexth16 l2, a1
|
|
; CSKY-NEXT: movi16 l3, 5
|
|
; CSKY-NEXT: .LBB109_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: zexth16 a1, a0
|
|
; CSKY-NEXT: cmphs16 l2, a1
|
|
; CSKY-NEXT: mov16 a2, l0
|
|
; CSKY-NEXT: movt32 a2, a0
|
|
; CSKY-NEXT: st32.h a0, (sp, 6)
|
|
; CSKY-NEXT: st16.w l3, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l1
|
|
; CSKY-NEXT: addi32 a1, sp, 6
|
|
; CSKY-NEXT: movi16 a3, 5
|
|
; CSKY-NEXT: jsri32 [.LCPI109_0]
|
|
; CSKY-NEXT: mov16 a1, a0
|
|
; CSKY-NEXT: ld32.h a0, (sp, 6)
|
|
; CSKY-NEXT: bez32 a1, .LBB109_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 8
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l3, (sp, 16) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 20
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI109_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_2
|
|
%1 = atomicrmw umin i16* %a, i16 %b seq_cst
|
|
ret i16 %1
|
|
}
|
|
|
|
define i32 @atomicrmw_xchg_i32_monotonic(i32* %a, i32 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_xchg_i32_monotonic:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 0
|
|
; CSKY-NEXT: jsri32 [.LCPI110_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI110_0:
|
|
; CSKY-NEXT: .long __atomic_exchange_4
|
|
%1 = atomicrmw xchg i32* %a, i32 %b monotonic
|
|
ret i32 %1
|
|
}
|
|
|
|
define i32 @atomicrmw_xchg_i32_acquire(i32* %a, i32 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_xchg_i32_acquire:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 2
|
|
; CSKY-NEXT: jsri32 [.LCPI111_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI111_0:
|
|
; CSKY-NEXT: .long __atomic_exchange_4
|
|
%1 = atomicrmw xchg i32* %a, i32 %b acquire
|
|
ret i32 %1
|
|
}
|
|
|
|
define i32 @atomicrmw_xchg_i32_release(i32* %a, i32 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_xchg_i32_release:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 3
|
|
; CSKY-NEXT: jsri32 [.LCPI112_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI112_0:
|
|
; CSKY-NEXT: .long __atomic_exchange_4
|
|
%1 = atomicrmw xchg i32* %a, i32 %b release
|
|
ret i32 %1
|
|
}
|
|
|
|
define i32 @atomicrmw_xchg_i32_acq_rel(i32* %a, i32 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_xchg_i32_acq_rel:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 4
|
|
; CSKY-NEXT: jsri32 [.LCPI113_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI113_0:
|
|
; CSKY-NEXT: .long __atomic_exchange_4
|
|
%1 = atomicrmw xchg i32* %a, i32 %b acq_rel
|
|
ret i32 %1
|
|
}
|
|
|
|
define i32 @atomicrmw_xchg_i32_seq_cst(i32* %a, i32 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_xchg_i32_seq_cst:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 5
|
|
; CSKY-NEXT: jsri32 [.LCPI114_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI114_0:
|
|
; CSKY-NEXT: .long __atomic_exchange_4
|
|
%1 = atomicrmw xchg i32* %a, i32 %b seq_cst
|
|
ret i32 %1
|
|
}
|
|
|
|
define i32 @atomicrmw_add_i32_monotonic(i32 *%a, i32 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_add_i32_monotonic:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 0
|
|
; CSKY-NEXT: jsri32 [.LCPI115_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI115_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_add_4
|
|
%1 = atomicrmw add i32* %a, i32 %b monotonic
|
|
ret i32 %1
|
|
}
|
|
|
|
define i32 @atomicrmw_add_i32_acquire(i32 *%a, i32 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_add_i32_acquire:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 2
|
|
; CSKY-NEXT: jsri32 [.LCPI116_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI116_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_add_4
|
|
%1 = atomicrmw add i32* %a, i32 %b acquire
|
|
ret i32 %1
|
|
}
|
|
|
|
define i32 @atomicrmw_add_i32_release(i32 *%a, i32 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_add_i32_release:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 3
|
|
; CSKY-NEXT: jsri32 [.LCPI117_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI117_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_add_4
|
|
%1 = atomicrmw add i32* %a, i32 %b release
|
|
ret i32 %1
|
|
}
|
|
|
|
define i32 @atomicrmw_add_i32_acq_rel(i32 *%a, i32 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_add_i32_acq_rel:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 4
|
|
; CSKY-NEXT: jsri32 [.LCPI118_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI118_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_add_4
|
|
%1 = atomicrmw add i32* %a, i32 %b acq_rel
|
|
ret i32 %1
|
|
}
|
|
|
|
define i32 @atomicrmw_add_i32_seq_cst(i32 *%a, i32 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_add_i32_seq_cst:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 5
|
|
; CSKY-NEXT: jsri32 [.LCPI119_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI119_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_add_4
|
|
%1 = atomicrmw add i32* %a, i32 %b seq_cst
|
|
ret i32 %1
|
|
}
|
|
|
|
define i32 @atomicrmw_sub_i32_monotonic(i32* %a, i32 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_sub_i32_monotonic:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 0
|
|
; CSKY-NEXT: jsri32 [.LCPI120_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI120_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_sub_4
|
|
%1 = atomicrmw sub i32* %a, i32 %b monotonic
|
|
ret i32 %1
|
|
}
|
|
|
|
define i32 @atomicrmw_sub_i32_acquire(i32* %a, i32 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_sub_i32_acquire:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 2
|
|
; CSKY-NEXT: jsri32 [.LCPI121_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI121_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_sub_4
|
|
%1 = atomicrmw sub i32* %a, i32 %b acquire
|
|
ret i32 %1
|
|
}
|
|
|
|
define i32 @atomicrmw_sub_i32_release(i32* %a, i32 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_sub_i32_release:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 3
|
|
; CSKY-NEXT: jsri32 [.LCPI122_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI122_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_sub_4
|
|
%1 = atomicrmw sub i32* %a, i32 %b release
|
|
ret i32 %1
|
|
}
|
|
|
|
define i32 @atomicrmw_sub_i32_acq_rel(i32* %a, i32 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_sub_i32_acq_rel:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 4
|
|
; CSKY-NEXT: jsri32 [.LCPI123_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI123_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_sub_4
|
|
%1 = atomicrmw sub i32* %a, i32 %b acq_rel
|
|
ret i32 %1
|
|
}
|
|
|
|
define i32 @atomicrmw_sub_i32_seq_cst(i32* %a, i32 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_sub_i32_seq_cst:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 5
|
|
; CSKY-NEXT: jsri32 [.LCPI124_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI124_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_sub_4
|
|
%1 = atomicrmw sub i32* %a, i32 %b seq_cst
|
|
ret i32 %1
|
|
}
|
|
|
|
define i32 @atomicrmw_and_i32_monotonic(i32 *%a, i32 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_and_i32_monotonic:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 0
|
|
; CSKY-NEXT: jsri32 [.LCPI125_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI125_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_and_4
|
|
%1 = atomicrmw and i32* %a, i32 %b monotonic
|
|
ret i32 %1
|
|
}
|
|
|
|
define i32 @atomicrmw_and_i32_acquire(i32 *%a, i32 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_and_i32_acquire:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 2
|
|
; CSKY-NEXT: jsri32 [.LCPI126_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI126_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_and_4
|
|
%1 = atomicrmw and i32* %a, i32 %b acquire
|
|
ret i32 %1
|
|
}
|
|
|
|
define i32 @atomicrmw_and_i32_release(i32 *%a, i32 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_and_i32_release:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 3
|
|
; CSKY-NEXT: jsri32 [.LCPI127_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI127_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_and_4
|
|
%1 = atomicrmw and i32* %a, i32 %b release
|
|
ret i32 %1
|
|
}
|
|
|
|
define i32 @atomicrmw_and_i32_acq_rel(i32 *%a, i32 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_and_i32_acq_rel:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 4
|
|
; CSKY-NEXT: jsri32 [.LCPI128_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI128_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_and_4
|
|
%1 = atomicrmw and i32* %a, i32 %b acq_rel
|
|
ret i32 %1
|
|
}
|
|
|
|
define i32 @atomicrmw_and_i32_seq_cst(i32 *%a, i32 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_and_i32_seq_cst:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 5
|
|
; CSKY-NEXT: jsri32 [.LCPI129_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI129_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_and_4
|
|
%1 = atomicrmw and i32* %a, i32 %b seq_cst
|
|
ret i32 %1
|
|
}
|
|
|
|
define i32 @atomicrmw_nand_i32_monotonic(i32* %a, i32 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_nand_i32_monotonic:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 0
|
|
; CSKY-NEXT: jsri32 [.LCPI130_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI130_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_nand_4
|
|
%1 = atomicrmw nand i32* %a, i32 %b monotonic
|
|
ret i32 %1
|
|
}
|
|
|
|
define i32 @atomicrmw_nand_i32_acquire(i32* %a, i32 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_nand_i32_acquire:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 2
|
|
; CSKY-NEXT: jsri32 [.LCPI131_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI131_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_nand_4
|
|
%1 = atomicrmw nand i32* %a, i32 %b acquire
|
|
ret i32 %1
|
|
}
|
|
|
|
define i32 @atomicrmw_nand_i32_release(i32* %a, i32 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_nand_i32_release:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 3
|
|
; CSKY-NEXT: jsri32 [.LCPI132_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI132_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_nand_4
|
|
%1 = atomicrmw nand i32* %a, i32 %b release
|
|
ret i32 %1
|
|
}
|
|
|
|
define i32 @atomicrmw_nand_i32_acq_rel(i32* %a, i32 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_nand_i32_acq_rel:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 4
|
|
; CSKY-NEXT: jsri32 [.LCPI133_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI133_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_nand_4
|
|
%1 = atomicrmw nand i32* %a, i32 %b acq_rel
|
|
ret i32 %1
|
|
}
|
|
|
|
define i32 @atomicrmw_nand_i32_seq_cst(i32* %a, i32 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_nand_i32_seq_cst:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 5
|
|
; CSKY-NEXT: jsri32 [.LCPI134_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI134_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_nand_4
|
|
%1 = atomicrmw nand i32* %a, i32 %b seq_cst
|
|
ret i32 %1
|
|
}
|
|
|
|
define i32 @atomicrmw_or_i32_monotonic(i32 *%a, i32 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_or_i32_monotonic:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 0
|
|
; CSKY-NEXT: jsri32 [.LCPI135_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI135_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_or_4
|
|
%1 = atomicrmw or i32* %a, i32 %b monotonic
|
|
ret i32 %1
|
|
}
|
|
|
|
define i32 @atomicrmw_or_i32_acquire(i32 *%a, i32 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_or_i32_acquire:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 2
|
|
; CSKY-NEXT: jsri32 [.LCPI136_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI136_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_or_4
|
|
%1 = atomicrmw or i32* %a, i32 %b acquire
|
|
ret i32 %1
|
|
}
|
|
|
|
define i32 @atomicrmw_or_i32_release(i32 *%a, i32 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_or_i32_release:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 3
|
|
; CSKY-NEXT: jsri32 [.LCPI137_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI137_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_or_4
|
|
%1 = atomicrmw or i32* %a, i32 %b release
|
|
ret i32 %1
|
|
}
|
|
|
|
define i32 @atomicrmw_or_i32_acq_rel(i32 *%a, i32 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_or_i32_acq_rel:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 4
|
|
; CSKY-NEXT: jsri32 [.LCPI138_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI138_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_or_4
|
|
%1 = atomicrmw or i32* %a, i32 %b acq_rel
|
|
ret i32 %1
|
|
}
|
|
|
|
define i32 @atomicrmw_or_i32_seq_cst(i32 *%a, i32 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_or_i32_seq_cst:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 5
|
|
; CSKY-NEXT: jsri32 [.LCPI139_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI139_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_or_4
|
|
%1 = atomicrmw or i32* %a, i32 %b seq_cst
|
|
ret i32 %1
|
|
}
|
|
|
|
define i32 @atomicrmw_xor_i32_monotonic(i32 *%a, i32 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_xor_i32_monotonic:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 0
|
|
; CSKY-NEXT: jsri32 [.LCPI140_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI140_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_xor_4
|
|
%1 = atomicrmw xor i32* %a, i32 %b monotonic
|
|
ret i32 %1
|
|
}
|
|
|
|
define i32 @atomicrmw_xor_i32_acquire(i32 *%a, i32 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_xor_i32_acquire:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 2
|
|
; CSKY-NEXT: jsri32 [.LCPI141_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI141_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_xor_4
|
|
%1 = atomicrmw xor i32* %a, i32 %b acquire
|
|
ret i32 %1
|
|
}
|
|
|
|
define i32 @atomicrmw_xor_i32_release(i32 *%a, i32 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_xor_i32_release:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 3
|
|
; CSKY-NEXT: jsri32 [.LCPI142_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI142_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_xor_4
|
|
%1 = atomicrmw xor i32* %a, i32 %b release
|
|
ret i32 %1
|
|
}
|
|
|
|
define i32 @atomicrmw_xor_i32_acq_rel(i32 *%a, i32 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_xor_i32_acq_rel:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 4
|
|
; CSKY-NEXT: jsri32 [.LCPI143_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI143_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_xor_4
|
|
%1 = atomicrmw xor i32* %a, i32 %b acq_rel
|
|
ret i32 %1
|
|
}
|
|
|
|
define i32 @atomicrmw_xor_i32_seq_cst(i32 *%a, i32 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_xor_i32_seq_cst:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a2, 5
|
|
; CSKY-NEXT: jsri32 [.LCPI144_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI144_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_xor_4
|
|
%1 = atomicrmw xor i32* %a, i32 %b seq_cst
|
|
ret i32 %1
|
|
}
|
|
|
|
define i32 @atomicrmw_max_i32_monotonic(i32 *%a, i32 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_max_i32_monotonic:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 16
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 8
|
|
; CSKY-NEXT: mov16 l0, a1
|
|
; CSKY-NEXT: mov16 l1, a0
|
|
; CSKY-NEXT: ld16.w a0, (a0, 0)
|
|
; CSKY-NEXT: movi16 l2, 0
|
|
; CSKY-NEXT: .LBB145_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: cmplt16 l0, a0
|
|
; CSKY-NEXT: mov16 a2, l0
|
|
; CSKY-NEXT: movt32 a2, a0
|
|
; CSKY-NEXT: st16.w a0, (sp, 4)
|
|
; CSKY-NEXT: st16.w l2, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l1
|
|
; CSKY-NEXT: addi16 a1, sp, 4
|
|
; CSKY-NEXT: movi16 a3, 0
|
|
; CSKY-NEXT: jsri32 [.LCPI145_0]
|
|
; CSKY-NEXT: mov16 a1, a0
|
|
; CSKY-NEXT: ld16.w a0, (sp, 4)
|
|
; CSKY-NEXT: bez32 a1, .LBB145_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 8
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 16
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI145_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_4
|
|
%1 = atomicrmw max i32* %a, i32 %b monotonic
|
|
ret i32 %1
|
|
}
|
|
|
|
define i32 @atomicrmw_max_i32_acquire(i32 *%a, i32 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_max_i32_acquire:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 16
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 8
|
|
; CSKY-NEXT: mov16 l0, a1
|
|
; CSKY-NEXT: mov16 l1, a0
|
|
; CSKY-NEXT: ld16.w a0, (a0, 0)
|
|
; CSKY-NEXT: movi16 l2, 2
|
|
; CSKY-NEXT: .LBB146_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: cmplt16 l0, a0
|
|
; CSKY-NEXT: mov16 a2, l0
|
|
; CSKY-NEXT: movt32 a2, a0
|
|
; CSKY-NEXT: st16.w a0, (sp, 4)
|
|
; CSKY-NEXT: st16.w l2, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l1
|
|
; CSKY-NEXT: addi16 a1, sp, 4
|
|
; CSKY-NEXT: movi16 a3, 2
|
|
; CSKY-NEXT: jsri32 [.LCPI146_0]
|
|
; CSKY-NEXT: mov16 a1, a0
|
|
; CSKY-NEXT: ld16.w a0, (sp, 4)
|
|
; CSKY-NEXT: bez32 a1, .LBB146_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 8
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 16
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI146_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_4
|
|
%1 = atomicrmw max i32* %a, i32 %b acquire
|
|
ret i32 %1
|
|
}
|
|
|
|
define i32 @atomicrmw_max_i32_release(i32 *%a, i32 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_max_i32_release:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 16
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 8
|
|
; CSKY-NEXT: mov16 l0, a1
|
|
; CSKY-NEXT: mov16 l1, a0
|
|
; CSKY-NEXT: ld16.w a0, (a0, 0)
|
|
; CSKY-NEXT: movi16 l2, 0
|
|
; CSKY-NEXT: .LBB147_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: cmplt16 l0, a0
|
|
; CSKY-NEXT: mov16 a2, l0
|
|
; CSKY-NEXT: movt32 a2, a0
|
|
; CSKY-NEXT: st16.w a0, (sp, 4)
|
|
; CSKY-NEXT: st16.w l2, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l1
|
|
; CSKY-NEXT: addi16 a1, sp, 4
|
|
; CSKY-NEXT: movi16 a3, 3
|
|
; CSKY-NEXT: jsri32 [.LCPI147_0]
|
|
; CSKY-NEXT: mov16 a1, a0
|
|
; CSKY-NEXT: ld16.w a0, (sp, 4)
|
|
; CSKY-NEXT: bez32 a1, .LBB147_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 8
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 16
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI147_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_4
|
|
%1 = atomicrmw max i32* %a, i32 %b release
|
|
ret i32 %1
|
|
}
|
|
|
|
define i32 @atomicrmw_max_i32_acq_rel(i32 *%a, i32 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_max_i32_acq_rel:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 16
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 8
|
|
; CSKY-NEXT: mov16 l0, a1
|
|
; CSKY-NEXT: mov16 l1, a0
|
|
; CSKY-NEXT: ld16.w a0, (a0, 0)
|
|
; CSKY-NEXT: movi16 l2, 2
|
|
; CSKY-NEXT: .LBB148_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: cmplt16 l0, a0
|
|
; CSKY-NEXT: mov16 a2, l0
|
|
; CSKY-NEXT: movt32 a2, a0
|
|
; CSKY-NEXT: st16.w a0, (sp, 4)
|
|
; CSKY-NEXT: st16.w l2, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l1
|
|
; CSKY-NEXT: addi16 a1, sp, 4
|
|
; CSKY-NEXT: movi16 a3, 4
|
|
; CSKY-NEXT: jsri32 [.LCPI148_0]
|
|
; CSKY-NEXT: mov16 a1, a0
|
|
; CSKY-NEXT: ld16.w a0, (sp, 4)
|
|
; CSKY-NEXT: bez32 a1, .LBB148_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 8
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 16
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI148_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_4
|
|
%1 = atomicrmw max i32* %a, i32 %b acq_rel
|
|
ret i32 %1
|
|
}
|
|
|
|
define i32 @atomicrmw_max_i32_seq_cst(i32 *%a, i32 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_max_i32_seq_cst:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 16
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 8
|
|
; CSKY-NEXT: mov16 l0, a1
|
|
; CSKY-NEXT: mov16 l1, a0
|
|
; CSKY-NEXT: ld16.w a0, (a0, 0)
|
|
; CSKY-NEXT: movi16 l2, 5
|
|
; CSKY-NEXT: .LBB149_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: cmplt16 l0, a0
|
|
; CSKY-NEXT: mov16 a2, l0
|
|
; CSKY-NEXT: movt32 a2, a0
|
|
; CSKY-NEXT: st16.w a0, (sp, 4)
|
|
; CSKY-NEXT: st16.w l2, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l1
|
|
; CSKY-NEXT: addi16 a1, sp, 4
|
|
; CSKY-NEXT: movi16 a3, 5
|
|
; CSKY-NEXT: jsri32 [.LCPI149_0]
|
|
; CSKY-NEXT: mov16 a1, a0
|
|
; CSKY-NEXT: ld16.w a0, (sp, 4)
|
|
; CSKY-NEXT: bez32 a1, .LBB149_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 8
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 16
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI149_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_4
|
|
%1 = atomicrmw max i32* %a, i32 %b seq_cst
|
|
ret i32 %1
|
|
}
|
|
|
|
define i32 @atomicrmw_min_i32_monotonic(i32 *%a, i32 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_min_i32_monotonic:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 16
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 8
|
|
; CSKY-NEXT: mov16 l0, a1
|
|
; CSKY-NEXT: mov16 l1, a0
|
|
; CSKY-NEXT: ld16.w a0, (a0, 0)
|
|
; CSKY-NEXT: movi16 l2, 0
|
|
; CSKY-NEXT: .LBB150_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: cmplt16 l0, a0
|
|
; CSKY-NEXT: mov16 a2, l0
|
|
; CSKY-NEXT: movf32 a2, a0
|
|
; CSKY-NEXT: st16.w a0, (sp, 4)
|
|
; CSKY-NEXT: st16.w l2, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l1
|
|
; CSKY-NEXT: addi16 a1, sp, 4
|
|
; CSKY-NEXT: movi16 a3, 0
|
|
; CSKY-NEXT: jsri32 [.LCPI150_0]
|
|
; CSKY-NEXT: mov16 a1, a0
|
|
; CSKY-NEXT: ld16.w a0, (sp, 4)
|
|
; CSKY-NEXT: bez32 a1, .LBB150_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 8
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 16
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI150_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_4
|
|
%1 = atomicrmw min i32* %a, i32 %b monotonic
|
|
ret i32 %1
|
|
}
|
|
|
|
define i32 @atomicrmw_min_i32_acquire(i32 *%a, i32 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_min_i32_acquire:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 16
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 8
|
|
; CSKY-NEXT: mov16 l0, a1
|
|
; CSKY-NEXT: mov16 l1, a0
|
|
; CSKY-NEXT: ld16.w a0, (a0, 0)
|
|
; CSKY-NEXT: movi16 l2, 2
|
|
; CSKY-NEXT: .LBB151_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: cmplt16 l0, a0
|
|
; CSKY-NEXT: mov16 a2, l0
|
|
; CSKY-NEXT: movf32 a2, a0
|
|
; CSKY-NEXT: st16.w a0, (sp, 4)
|
|
; CSKY-NEXT: st16.w l2, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l1
|
|
; CSKY-NEXT: addi16 a1, sp, 4
|
|
; CSKY-NEXT: movi16 a3, 2
|
|
; CSKY-NEXT: jsri32 [.LCPI151_0]
|
|
; CSKY-NEXT: mov16 a1, a0
|
|
; CSKY-NEXT: ld16.w a0, (sp, 4)
|
|
; CSKY-NEXT: bez32 a1, .LBB151_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 8
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 16
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI151_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_4
|
|
%1 = atomicrmw min i32* %a, i32 %b acquire
|
|
ret i32 %1
|
|
}
|
|
|
|
define i32 @atomicrmw_min_i32_release(i32 *%a, i32 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_min_i32_release:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 16
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 8
|
|
; CSKY-NEXT: mov16 l0, a1
|
|
; CSKY-NEXT: mov16 l1, a0
|
|
; CSKY-NEXT: ld16.w a0, (a0, 0)
|
|
; CSKY-NEXT: movi16 l2, 0
|
|
; CSKY-NEXT: .LBB152_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: cmplt16 l0, a0
|
|
; CSKY-NEXT: mov16 a2, l0
|
|
; CSKY-NEXT: movf32 a2, a0
|
|
; CSKY-NEXT: st16.w a0, (sp, 4)
|
|
; CSKY-NEXT: st16.w l2, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l1
|
|
; CSKY-NEXT: addi16 a1, sp, 4
|
|
; CSKY-NEXT: movi16 a3, 3
|
|
; CSKY-NEXT: jsri32 [.LCPI152_0]
|
|
; CSKY-NEXT: mov16 a1, a0
|
|
; CSKY-NEXT: ld16.w a0, (sp, 4)
|
|
; CSKY-NEXT: bez32 a1, .LBB152_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 8
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 16
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI152_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_4
|
|
%1 = atomicrmw min i32* %a, i32 %b release
|
|
ret i32 %1
|
|
}
|
|
|
|
define i32 @atomicrmw_min_i32_acq_rel(i32 *%a, i32 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_min_i32_acq_rel:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 16
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 8
|
|
; CSKY-NEXT: mov16 l0, a1
|
|
; CSKY-NEXT: mov16 l1, a0
|
|
; CSKY-NEXT: ld16.w a0, (a0, 0)
|
|
; CSKY-NEXT: movi16 l2, 2
|
|
; CSKY-NEXT: .LBB153_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: cmplt16 l0, a0
|
|
; CSKY-NEXT: mov16 a2, l0
|
|
; CSKY-NEXT: movf32 a2, a0
|
|
; CSKY-NEXT: st16.w a0, (sp, 4)
|
|
; CSKY-NEXT: st16.w l2, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l1
|
|
; CSKY-NEXT: addi16 a1, sp, 4
|
|
; CSKY-NEXT: movi16 a3, 4
|
|
; CSKY-NEXT: jsri32 [.LCPI153_0]
|
|
; CSKY-NEXT: mov16 a1, a0
|
|
; CSKY-NEXT: ld16.w a0, (sp, 4)
|
|
; CSKY-NEXT: bez32 a1, .LBB153_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 8
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 16
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI153_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_4
|
|
%1 = atomicrmw min i32* %a, i32 %b acq_rel
|
|
ret i32 %1
|
|
}
|
|
|
|
define i32 @atomicrmw_min_i32_seq_cst(i32 *%a, i32 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_min_i32_seq_cst:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 16
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 8
|
|
; CSKY-NEXT: mov16 l0, a1
|
|
; CSKY-NEXT: mov16 l1, a0
|
|
; CSKY-NEXT: ld16.w a0, (a0, 0)
|
|
; CSKY-NEXT: movi16 l2, 5
|
|
; CSKY-NEXT: .LBB154_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: cmplt16 l0, a0
|
|
; CSKY-NEXT: mov16 a2, l0
|
|
; CSKY-NEXT: movf32 a2, a0
|
|
; CSKY-NEXT: st16.w a0, (sp, 4)
|
|
; CSKY-NEXT: st16.w l2, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l1
|
|
; CSKY-NEXT: addi16 a1, sp, 4
|
|
; CSKY-NEXT: movi16 a3, 5
|
|
; CSKY-NEXT: jsri32 [.LCPI154_0]
|
|
; CSKY-NEXT: mov16 a1, a0
|
|
; CSKY-NEXT: ld16.w a0, (sp, 4)
|
|
; CSKY-NEXT: bez32 a1, .LBB154_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 8
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 16
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI154_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_4
|
|
%1 = atomicrmw min i32* %a, i32 %b seq_cst
|
|
ret i32 %1
|
|
}
|
|
|
|
define i32 @atomicrmw_umax_i32_monotonic(i32 *%a, i32 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_umax_i32_monotonic:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 16
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 8
|
|
; CSKY-NEXT: mov16 l0, a1
|
|
; CSKY-NEXT: mov16 l1, a0
|
|
; CSKY-NEXT: ld16.w a0, (a0, 0)
|
|
; CSKY-NEXT: movi16 l2, 0
|
|
; CSKY-NEXT: .LBB155_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: cmphs16 l0, a0
|
|
; CSKY-NEXT: mov16 a2, l0
|
|
; CSKY-NEXT: movf32 a2, a0
|
|
; CSKY-NEXT: st16.w a0, (sp, 4)
|
|
; CSKY-NEXT: st16.w l2, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l1
|
|
; CSKY-NEXT: addi16 a1, sp, 4
|
|
; CSKY-NEXT: movi16 a3, 0
|
|
; CSKY-NEXT: jsri32 [.LCPI155_0]
|
|
; CSKY-NEXT: mov16 a1, a0
|
|
; CSKY-NEXT: ld16.w a0, (sp, 4)
|
|
; CSKY-NEXT: bez32 a1, .LBB155_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 8
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 16
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI155_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_4
|
|
%1 = atomicrmw umax i32* %a, i32 %b monotonic
|
|
ret i32 %1
|
|
}
|
|
|
|
define i32 @atomicrmw_umax_i32_acquire(i32 *%a, i32 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_umax_i32_acquire:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 16
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 8
|
|
; CSKY-NEXT: mov16 l0, a1
|
|
; CSKY-NEXT: mov16 l1, a0
|
|
; CSKY-NEXT: ld16.w a0, (a0, 0)
|
|
; CSKY-NEXT: movi16 l2, 2
|
|
; CSKY-NEXT: .LBB156_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: cmphs16 l0, a0
|
|
; CSKY-NEXT: mov16 a2, l0
|
|
; CSKY-NEXT: movf32 a2, a0
|
|
; CSKY-NEXT: st16.w a0, (sp, 4)
|
|
; CSKY-NEXT: st16.w l2, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l1
|
|
; CSKY-NEXT: addi16 a1, sp, 4
|
|
; CSKY-NEXT: movi16 a3, 2
|
|
; CSKY-NEXT: jsri32 [.LCPI156_0]
|
|
; CSKY-NEXT: mov16 a1, a0
|
|
; CSKY-NEXT: ld16.w a0, (sp, 4)
|
|
; CSKY-NEXT: bez32 a1, .LBB156_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 8
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 16
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI156_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_4
|
|
%1 = atomicrmw umax i32* %a, i32 %b acquire
|
|
ret i32 %1
|
|
}
|
|
|
|
define i32 @atomicrmw_umax_i32_release(i32 *%a, i32 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_umax_i32_release:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 16
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 8
|
|
; CSKY-NEXT: mov16 l0, a1
|
|
; CSKY-NEXT: mov16 l1, a0
|
|
; CSKY-NEXT: ld16.w a0, (a0, 0)
|
|
; CSKY-NEXT: movi16 l2, 0
|
|
; CSKY-NEXT: .LBB157_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: cmphs16 l0, a0
|
|
; CSKY-NEXT: mov16 a2, l0
|
|
; CSKY-NEXT: movf32 a2, a0
|
|
; CSKY-NEXT: st16.w a0, (sp, 4)
|
|
; CSKY-NEXT: st16.w l2, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l1
|
|
; CSKY-NEXT: addi16 a1, sp, 4
|
|
; CSKY-NEXT: movi16 a3, 3
|
|
; CSKY-NEXT: jsri32 [.LCPI157_0]
|
|
; CSKY-NEXT: mov16 a1, a0
|
|
; CSKY-NEXT: ld16.w a0, (sp, 4)
|
|
; CSKY-NEXT: bez32 a1, .LBB157_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 8
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 16
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI157_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_4
|
|
%1 = atomicrmw umax i32* %a, i32 %b release
|
|
ret i32 %1
|
|
}
|
|
|
|
define i32 @atomicrmw_umax_i32_acq_rel(i32 *%a, i32 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_umax_i32_acq_rel:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 16
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 8
|
|
; CSKY-NEXT: mov16 l0, a1
|
|
; CSKY-NEXT: mov16 l1, a0
|
|
; CSKY-NEXT: ld16.w a0, (a0, 0)
|
|
; CSKY-NEXT: movi16 l2, 2
|
|
; CSKY-NEXT: .LBB158_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: cmphs16 l0, a0
|
|
; CSKY-NEXT: mov16 a2, l0
|
|
; CSKY-NEXT: movf32 a2, a0
|
|
; CSKY-NEXT: st16.w a0, (sp, 4)
|
|
; CSKY-NEXT: st16.w l2, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l1
|
|
; CSKY-NEXT: addi16 a1, sp, 4
|
|
; CSKY-NEXT: movi16 a3, 4
|
|
; CSKY-NEXT: jsri32 [.LCPI158_0]
|
|
; CSKY-NEXT: mov16 a1, a0
|
|
; CSKY-NEXT: ld16.w a0, (sp, 4)
|
|
; CSKY-NEXT: bez32 a1, .LBB158_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 8
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 16
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI158_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_4
|
|
%1 = atomicrmw umax i32* %a, i32 %b acq_rel
|
|
ret i32 %1
|
|
}
|
|
|
|
define i32 @atomicrmw_umax_i32_seq_cst(i32 *%a, i32 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_umax_i32_seq_cst:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 16
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 8
|
|
; CSKY-NEXT: mov16 l0, a1
|
|
; CSKY-NEXT: mov16 l1, a0
|
|
; CSKY-NEXT: ld16.w a0, (a0, 0)
|
|
; CSKY-NEXT: movi16 l2, 5
|
|
; CSKY-NEXT: .LBB159_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: cmphs16 l0, a0
|
|
; CSKY-NEXT: mov16 a2, l0
|
|
; CSKY-NEXT: movf32 a2, a0
|
|
; CSKY-NEXT: st16.w a0, (sp, 4)
|
|
; CSKY-NEXT: st16.w l2, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l1
|
|
; CSKY-NEXT: addi16 a1, sp, 4
|
|
; CSKY-NEXT: movi16 a3, 5
|
|
; CSKY-NEXT: jsri32 [.LCPI159_0]
|
|
; CSKY-NEXT: mov16 a1, a0
|
|
; CSKY-NEXT: ld16.w a0, (sp, 4)
|
|
; CSKY-NEXT: bez32 a1, .LBB159_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 8
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 16
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI159_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_4
|
|
%1 = atomicrmw umax i32* %a, i32 %b seq_cst
|
|
ret i32 %1
|
|
}
|
|
|
|
define i32 @atomicrmw_umin_i32_monotonic(i32 *%a, i32 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_umin_i32_monotonic:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 16
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 8
|
|
; CSKY-NEXT: mov16 l0, a1
|
|
; CSKY-NEXT: mov16 l1, a0
|
|
; CSKY-NEXT: ld16.w a0, (a0, 0)
|
|
; CSKY-NEXT: movi16 l2, 0
|
|
; CSKY-NEXT: .LBB160_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: cmphs16 l0, a0
|
|
; CSKY-NEXT: mov16 a2, l0
|
|
; CSKY-NEXT: movt32 a2, a0
|
|
; CSKY-NEXT: st16.w a0, (sp, 4)
|
|
; CSKY-NEXT: st16.w l2, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l1
|
|
; CSKY-NEXT: addi16 a1, sp, 4
|
|
; CSKY-NEXT: movi16 a3, 0
|
|
; CSKY-NEXT: jsri32 [.LCPI160_0]
|
|
; CSKY-NEXT: mov16 a1, a0
|
|
; CSKY-NEXT: ld16.w a0, (sp, 4)
|
|
; CSKY-NEXT: bez32 a1, .LBB160_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 8
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 16
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI160_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_4
|
|
%1 = atomicrmw umin i32* %a, i32 %b monotonic
|
|
ret i32 %1
|
|
}
|
|
|
|
define i32 @atomicrmw_umin_i32_acquire(i32 *%a, i32 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_umin_i32_acquire:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 16
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 8
|
|
; CSKY-NEXT: mov16 l0, a1
|
|
; CSKY-NEXT: mov16 l1, a0
|
|
; CSKY-NEXT: ld16.w a0, (a0, 0)
|
|
; CSKY-NEXT: movi16 l2, 2
|
|
; CSKY-NEXT: .LBB161_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: cmphs16 l0, a0
|
|
; CSKY-NEXT: mov16 a2, l0
|
|
; CSKY-NEXT: movt32 a2, a0
|
|
; CSKY-NEXT: st16.w a0, (sp, 4)
|
|
; CSKY-NEXT: st16.w l2, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l1
|
|
; CSKY-NEXT: addi16 a1, sp, 4
|
|
; CSKY-NEXT: movi16 a3, 2
|
|
; CSKY-NEXT: jsri32 [.LCPI161_0]
|
|
; CSKY-NEXT: mov16 a1, a0
|
|
; CSKY-NEXT: ld16.w a0, (sp, 4)
|
|
; CSKY-NEXT: bez32 a1, .LBB161_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 8
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 16
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI161_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_4
|
|
%1 = atomicrmw umin i32* %a, i32 %b acquire
|
|
ret i32 %1
|
|
}
|
|
|
|
define i32 @atomicrmw_umin_i32_release(i32 *%a, i32 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_umin_i32_release:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 16
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 8
|
|
; CSKY-NEXT: mov16 l0, a1
|
|
; CSKY-NEXT: mov16 l1, a0
|
|
; CSKY-NEXT: ld16.w a0, (a0, 0)
|
|
; CSKY-NEXT: movi16 l2, 0
|
|
; CSKY-NEXT: .LBB162_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: cmphs16 l0, a0
|
|
; CSKY-NEXT: mov16 a2, l0
|
|
; CSKY-NEXT: movt32 a2, a0
|
|
; CSKY-NEXT: st16.w a0, (sp, 4)
|
|
; CSKY-NEXT: st16.w l2, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l1
|
|
; CSKY-NEXT: addi16 a1, sp, 4
|
|
; CSKY-NEXT: movi16 a3, 3
|
|
; CSKY-NEXT: jsri32 [.LCPI162_0]
|
|
; CSKY-NEXT: mov16 a1, a0
|
|
; CSKY-NEXT: ld16.w a0, (sp, 4)
|
|
; CSKY-NEXT: bez32 a1, .LBB162_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 8
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 16
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI162_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_4
|
|
%1 = atomicrmw umin i32* %a, i32 %b release
|
|
ret i32 %1
|
|
}
|
|
|
|
define i32 @atomicrmw_umin_i32_acq_rel(i32 *%a, i32 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_umin_i32_acq_rel:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 16
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 8
|
|
; CSKY-NEXT: mov16 l0, a1
|
|
; CSKY-NEXT: mov16 l1, a0
|
|
; CSKY-NEXT: ld16.w a0, (a0, 0)
|
|
; CSKY-NEXT: movi16 l2, 2
|
|
; CSKY-NEXT: .LBB163_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: cmphs16 l0, a0
|
|
; CSKY-NEXT: mov16 a2, l0
|
|
; CSKY-NEXT: movt32 a2, a0
|
|
; CSKY-NEXT: st16.w a0, (sp, 4)
|
|
; CSKY-NEXT: st16.w l2, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l1
|
|
; CSKY-NEXT: addi16 a1, sp, 4
|
|
; CSKY-NEXT: movi16 a3, 4
|
|
; CSKY-NEXT: jsri32 [.LCPI163_0]
|
|
; CSKY-NEXT: mov16 a1, a0
|
|
; CSKY-NEXT: ld16.w a0, (sp, 4)
|
|
; CSKY-NEXT: bez32 a1, .LBB163_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 8
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 16
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI163_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_4
|
|
%1 = atomicrmw umin i32* %a, i32 %b acq_rel
|
|
ret i32 %1
|
|
}
|
|
|
|
define i32 @atomicrmw_umin_i32_seq_cst(i32 *%a, i32 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_umin_i32_seq_cst:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 16
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 8
|
|
; CSKY-NEXT: mov16 l0, a1
|
|
; CSKY-NEXT: mov16 l1, a0
|
|
; CSKY-NEXT: ld16.w a0, (a0, 0)
|
|
; CSKY-NEXT: movi16 l2, 5
|
|
; CSKY-NEXT: .LBB164_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: cmphs16 l0, a0
|
|
; CSKY-NEXT: mov16 a2, l0
|
|
; CSKY-NEXT: movt32 a2, a0
|
|
; CSKY-NEXT: st16.w a0, (sp, 4)
|
|
; CSKY-NEXT: st16.w l2, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l1
|
|
; CSKY-NEXT: addi16 a1, sp, 4
|
|
; CSKY-NEXT: movi16 a3, 5
|
|
; CSKY-NEXT: jsri32 [.LCPI164_0]
|
|
; CSKY-NEXT: mov16 a1, a0
|
|
; CSKY-NEXT: ld16.w a0, (sp, 4)
|
|
; CSKY-NEXT: bez32 a1, .LBB164_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 8
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 16
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI164_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_4
|
|
%1 = atomicrmw umin i32* %a, i32 %b seq_cst
|
|
ret i32 %1
|
|
}
|
|
|
|
define i64 @atomicrmw_xchg_i64_monotonic(i64* %a, i64 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_xchg_i64_monotonic:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a3, 0
|
|
; CSKY-NEXT: jsri32 [.LCPI165_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI165_0:
|
|
; CSKY-NEXT: .long __atomic_exchange_8
|
|
%1 = atomicrmw xchg i64* %a, i64 %b monotonic
|
|
ret i64 %1
|
|
}
|
|
|
|
define i64 @atomicrmw_xchg_i64_acquire(i64* %a, i64 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_xchg_i64_acquire:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a3, 2
|
|
; CSKY-NEXT: jsri32 [.LCPI166_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI166_0:
|
|
; CSKY-NEXT: .long __atomic_exchange_8
|
|
%1 = atomicrmw xchg i64* %a, i64 %b acquire
|
|
ret i64 %1
|
|
}
|
|
|
|
define i64 @atomicrmw_xchg_i64_release(i64* %a, i64 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_xchg_i64_release:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a3, 3
|
|
; CSKY-NEXT: jsri32 [.LCPI167_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI167_0:
|
|
; CSKY-NEXT: .long __atomic_exchange_8
|
|
%1 = atomicrmw xchg i64* %a, i64 %b release
|
|
ret i64 %1
|
|
}
|
|
|
|
define i64 @atomicrmw_xchg_i64_acq_rel(i64* %a, i64 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_xchg_i64_acq_rel:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a3, 4
|
|
; CSKY-NEXT: jsri32 [.LCPI168_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI168_0:
|
|
; CSKY-NEXT: .long __atomic_exchange_8
|
|
%1 = atomicrmw xchg i64* %a, i64 %b acq_rel
|
|
ret i64 %1
|
|
}
|
|
|
|
define i64 @atomicrmw_xchg_i64_seq_cst(i64* %a, i64 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_xchg_i64_seq_cst:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a3, 5
|
|
; CSKY-NEXT: jsri32 [.LCPI169_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI169_0:
|
|
; CSKY-NEXT: .long __atomic_exchange_8
|
|
%1 = atomicrmw xchg i64* %a, i64 %b seq_cst
|
|
ret i64 %1
|
|
}
|
|
|
|
define i64 @atomicrmw_add_i64_monotonic(i64 *%a, i64 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_add_i64_monotonic:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a3, 0
|
|
; CSKY-NEXT: jsri32 [.LCPI170_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI170_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_add_8
|
|
%1 = atomicrmw add i64* %a, i64 %b monotonic
|
|
ret i64 %1
|
|
}
|
|
|
|
define i64 @atomicrmw_add_i64_acquire(i64 *%a, i64 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_add_i64_acquire:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a3, 2
|
|
; CSKY-NEXT: jsri32 [.LCPI171_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI171_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_add_8
|
|
%1 = atomicrmw add i64* %a, i64 %b acquire
|
|
ret i64 %1
|
|
}
|
|
|
|
define i64 @atomicrmw_add_i64_release(i64 *%a, i64 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_add_i64_release:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a3, 3
|
|
; CSKY-NEXT: jsri32 [.LCPI172_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI172_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_add_8
|
|
%1 = atomicrmw add i64* %a, i64 %b release
|
|
ret i64 %1
|
|
}
|
|
|
|
define i64 @atomicrmw_add_i64_acq_rel(i64 *%a, i64 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_add_i64_acq_rel:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a3, 4
|
|
; CSKY-NEXT: jsri32 [.LCPI173_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI173_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_add_8
|
|
%1 = atomicrmw add i64* %a, i64 %b acq_rel
|
|
ret i64 %1
|
|
}
|
|
|
|
define i64 @atomicrmw_add_i64_seq_cst(i64 *%a, i64 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_add_i64_seq_cst:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a3, 5
|
|
; CSKY-NEXT: jsri32 [.LCPI174_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI174_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_add_8
|
|
%1 = atomicrmw add i64* %a, i64 %b seq_cst
|
|
ret i64 %1
|
|
}
|
|
|
|
define i64 @atomicrmw_sub_i64_monotonic(i64* %a, i64 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_sub_i64_monotonic:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a3, 0
|
|
; CSKY-NEXT: jsri32 [.LCPI175_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI175_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_sub_8
|
|
%1 = atomicrmw sub i64* %a, i64 %b monotonic
|
|
ret i64 %1
|
|
}
|
|
|
|
define i64 @atomicrmw_sub_i64_acquire(i64* %a, i64 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_sub_i64_acquire:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a3, 2
|
|
; CSKY-NEXT: jsri32 [.LCPI176_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI176_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_sub_8
|
|
%1 = atomicrmw sub i64* %a, i64 %b acquire
|
|
ret i64 %1
|
|
}
|
|
|
|
define i64 @atomicrmw_sub_i64_release(i64* %a, i64 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_sub_i64_release:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a3, 3
|
|
; CSKY-NEXT: jsri32 [.LCPI177_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI177_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_sub_8
|
|
%1 = atomicrmw sub i64* %a, i64 %b release
|
|
ret i64 %1
|
|
}
|
|
|
|
define i64 @atomicrmw_sub_i64_acq_rel(i64* %a, i64 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_sub_i64_acq_rel:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a3, 4
|
|
; CSKY-NEXT: jsri32 [.LCPI178_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI178_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_sub_8
|
|
%1 = atomicrmw sub i64* %a, i64 %b acq_rel
|
|
ret i64 %1
|
|
}
|
|
|
|
define i64 @atomicrmw_sub_i64_seq_cst(i64* %a, i64 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_sub_i64_seq_cst:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a3, 5
|
|
; CSKY-NEXT: jsri32 [.LCPI179_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI179_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_sub_8
|
|
%1 = atomicrmw sub i64* %a, i64 %b seq_cst
|
|
ret i64 %1
|
|
}
|
|
|
|
define i64 @atomicrmw_and_i64_monotonic(i64 *%a, i64 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_and_i64_monotonic:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a3, 0
|
|
; CSKY-NEXT: jsri32 [.LCPI180_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI180_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_and_8
|
|
%1 = atomicrmw and i64* %a, i64 %b monotonic
|
|
ret i64 %1
|
|
}
|
|
|
|
define i64 @atomicrmw_and_i64_acquire(i64 *%a, i64 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_and_i64_acquire:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a3, 2
|
|
; CSKY-NEXT: jsri32 [.LCPI181_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI181_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_and_8
|
|
%1 = atomicrmw and i64* %a, i64 %b acquire
|
|
ret i64 %1
|
|
}
|
|
|
|
define i64 @atomicrmw_and_i64_release(i64 *%a, i64 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_and_i64_release:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a3, 3
|
|
; CSKY-NEXT: jsri32 [.LCPI182_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI182_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_and_8
|
|
%1 = atomicrmw and i64* %a, i64 %b release
|
|
ret i64 %1
|
|
}
|
|
|
|
define i64 @atomicrmw_and_i64_acq_rel(i64 *%a, i64 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_and_i64_acq_rel:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a3, 4
|
|
; CSKY-NEXT: jsri32 [.LCPI183_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI183_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_and_8
|
|
%1 = atomicrmw and i64* %a, i64 %b acq_rel
|
|
ret i64 %1
|
|
}
|
|
|
|
define i64 @atomicrmw_and_i64_seq_cst(i64 *%a, i64 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_and_i64_seq_cst:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a3, 5
|
|
; CSKY-NEXT: jsri32 [.LCPI184_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI184_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_and_8
|
|
%1 = atomicrmw and i64* %a, i64 %b seq_cst
|
|
ret i64 %1
|
|
}
|
|
|
|
define i64 @atomicrmw_nand_i64_monotonic(i64* %a, i64 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_nand_i64_monotonic:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a3, 0
|
|
; CSKY-NEXT: jsri32 [.LCPI185_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI185_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_nand_8
|
|
%1 = atomicrmw nand i64* %a, i64 %b monotonic
|
|
ret i64 %1
|
|
}
|
|
|
|
define i64 @atomicrmw_nand_i64_acquire(i64* %a, i64 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_nand_i64_acquire:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a3, 2
|
|
; CSKY-NEXT: jsri32 [.LCPI186_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI186_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_nand_8
|
|
%1 = atomicrmw nand i64* %a, i64 %b acquire
|
|
ret i64 %1
|
|
}
|
|
|
|
define i64 @atomicrmw_nand_i64_release(i64* %a, i64 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_nand_i64_release:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a3, 3
|
|
; CSKY-NEXT: jsri32 [.LCPI187_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI187_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_nand_8
|
|
%1 = atomicrmw nand i64* %a, i64 %b release
|
|
ret i64 %1
|
|
}
|
|
|
|
define i64 @atomicrmw_nand_i64_acq_rel(i64* %a, i64 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_nand_i64_acq_rel:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a3, 4
|
|
; CSKY-NEXT: jsri32 [.LCPI188_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI188_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_nand_8
|
|
%1 = atomicrmw nand i64* %a, i64 %b acq_rel
|
|
ret i64 %1
|
|
}
|
|
|
|
define i64 @atomicrmw_nand_i64_seq_cst(i64* %a, i64 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_nand_i64_seq_cst:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a3, 5
|
|
; CSKY-NEXT: jsri32 [.LCPI189_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI189_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_nand_8
|
|
%1 = atomicrmw nand i64* %a, i64 %b seq_cst
|
|
ret i64 %1
|
|
}
|
|
|
|
define i64 @atomicrmw_or_i64_monotonic(i64 *%a, i64 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_or_i64_monotonic:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a3, 0
|
|
; CSKY-NEXT: jsri32 [.LCPI190_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI190_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_or_8
|
|
%1 = atomicrmw or i64* %a, i64 %b monotonic
|
|
ret i64 %1
|
|
}
|
|
|
|
define i64 @atomicrmw_or_i64_acquire(i64 *%a, i64 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_or_i64_acquire:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a3, 2
|
|
; CSKY-NEXT: jsri32 [.LCPI191_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI191_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_or_8
|
|
%1 = atomicrmw or i64* %a, i64 %b acquire
|
|
ret i64 %1
|
|
}
|
|
|
|
define i64 @atomicrmw_or_i64_release(i64 *%a, i64 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_or_i64_release:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a3, 3
|
|
; CSKY-NEXT: jsri32 [.LCPI192_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI192_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_or_8
|
|
%1 = atomicrmw or i64* %a, i64 %b release
|
|
ret i64 %1
|
|
}
|
|
|
|
define i64 @atomicrmw_or_i64_acq_rel(i64 *%a, i64 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_or_i64_acq_rel:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a3, 4
|
|
; CSKY-NEXT: jsri32 [.LCPI193_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI193_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_or_8
|
|
%1 = atomicrmw or i64* %a, i64 %b acq_rel
|
|
ret i64 %1
|
|
}
|
|
|
|
define i64 @atomicrmw_or_i64_seq_cst(i64 *%a, i64 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_or_i64_seq_cst:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a3, 5
|
|
; CSKY-NEXT: jsri32 [.LCPI194_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI194_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_or_8
|
|
%1 = atomicrmw or i64* %a, i64 %b seq_cst
|
|
ret i64 %1
|
|
}
|
|
|
|
define i64 @atomicrmw_xor_i64_monotonic(i64 *%a, i64 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_xor_i64_monotonic:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a3, 0
|
|
; CSKY-NEXT: jsri32 [.LCPI195_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI195_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_xor_8
|
|
%1 = atomicrmw xor i64* %a, i64 %b monotonic
|
|
ret i64 %1
|
|
}
|
|
|
|
define i64 @atomicrmw_xor_i64_acquire(i64 *%a, i64 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_xor_i64_acquire:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a3, 2
|
|
; CSKY-NEXT: jsri32 [.LCPI196_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI196_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_xor_8
|
|
%1 = atomicrmw xor i64* %a, i64 %b acquire
|
|
ret i64 %1
|
|
}
|
|
|
|
define i64 @atomicrmw_xor_i64_release(i64 *%a, i64 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_xor_i64_release:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a3, 3
|
|
; CSKY-NEXT: jsri32 [.LCPI197_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI197_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_xor_8
|
|
%1 = atomicrmw xor i64* %a, i64 %b release
|
|
ret i64 %1
|
|
}
|
|
|
|
define i64 @atomicrmw_xor_i64_acq_rel(i64 *%a, i64 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_xor_i64_acq_rel:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a3, 4
|
|
; CSKY-NEXT: jsri32 [.LCPI198_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI198_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_xor_8
|
|
%1 = atomicrmw xor i64* %a, i64 %b acq_rel
|
|
ret i64 %1
|
|
}
|
|
|
|
define i64 @atomicrmw_xor_i64_seq_cst(i64 *%a, i64 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_xor_i64_seq_cst:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 4
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: movi16 a3, 5
|
|
; CSKY-NEXT: jsri32 [.LCPI199_0]
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 4
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.1:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI199_0:
|
|
; CSKY-NEXT: .long __atomic_fetch_xor_8
|
|
%1 = atomicrmw xor i64* %a, i64 %b seq_cst
|
|
ret i64 %1
|
|
}
|
|
|
|
define i64 @atomicrmw_max_i64_monotonic(i64 *%a, i64 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_max_i64_monotonic:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 20
|
|
; CSKY-NEXT: st16.w l3, (sp, 16) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 28
|
|
; CSKY-NEXT: mov16 l0, a2
|
|
; CSKY-NEXT: mov16 l1, a1
|
|
; CSKY-NEXT: mov16 l2, a0
|
|
; CSKY-NEXT: ld16.w a1, (a0, 4)
|
|
; CSKY-NEXT: ld16.w a0, (a0, 0)
|
|
; CSKY-NEXT: movi16 l3, 0
|
|
; CSKY-NEXT: .LBB200_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: cmplt16 l0, a1
|
|
; CSKY-NEXT: mvc32 a2
|
|
; CSKY-NEXT: st16.w a2, (sp, 12)
|
|
; CSKY-NEXT: cmpne16 a1, l0
|
|
; CSKY-NEXT: mvc32 a2
|
|
; CSKY-NEXT: st16.w a2, (sp, 16)
|
|
; CSKY-NEXT: cmphs16 l1, a0
|
|
; CSKY-NEXT: mvcv16 a2
|
|
; CSKY-NEXT: ld16.w a3, (sp, 12)
|
|
; CSKY-NEXT: btsti16 a3, 0
|
|
; CSKY-NEXT: mvc32 a3
|
|
; CSKY-NEXT: ld32.w t0, (sp, 16)
|
|
; CSKY-NEXT: btsti32 t0, 0
|
|
; CSKY-NEXT: movf32 a3, a2
|
|
; CSKY-NEXT: btsti16 a3, 0
|
|
; CSKY-NEXT: mov16 a2, l1
|
|
; CSKY-NEXT: movt32 a2, a0
|
|
; CSKY-NEXT: mov16 a3, l0
|
|
; CSKY-NEXT: movt32 a3, a1
|
|
; CSKY-NEXT: st16.w a0, (sp, 20)
|
|
; CSKY-NEXT: st16.w a1, (sp, 24)
|
|
; CSKY-NEXT: st16.w l3, (sp, 4)
|
|
; CSKY-NEXT: st16.w l3, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l2
|
|
; CSKY-NEXT: addi16 a1, sp, 20
|
|
; CSKY-NEXT: jsri32 [.LCPI200_0]
|
|
; CSKY-NEXT: mov16 a2, a0
|
|
; CSKY-NEXT: ld16.w a1, (sp, 24)
|
|
; CSKY-NEXT: ld16.w a0, (sp, 20)
|
|
; CSKY-NEXT: bez32 a2, .LBB200_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 28
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l3, (sp, 16) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 20
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI200_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_8
|
|
%1 = atomicrmw max i64* %a, i64 %b monotonic
|
|
ret i64 %1
|
|
}
|
|
|
|
define i64 @atomicrmw_max_i64_acquire(i64 *%a, i64 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_max_i64_acquire:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 20
|
|
; CSKY-NEXT: st16.w l3, (sp, 16) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 28
|
|
; CSKY-NEXT: mov16 l0, a2
|
|
; CSKY-NEXT: mov16 l1, a1
|
|
; CSKY-NEXT: mov16 l2, a0
|
|
; CSKY-NEXT: ld16.w a1, (a0, 4)
|
|
; CSKY-NEXT: ld16.w a0, (a0, 0)
|
|
; CSKY-NEXT: movi16 l3, 2
|
|
; CSKY-NEXT: .LBB201_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: cmplt16 l0, a1
|
|
; CSKY-NEXT: mvc32 a2
|
|
; CSKY-NEXT: st16.w a2, (sp, 12)
|
|
; CSKY-NEXT: cmpne16 a1, l0
|
|
; CSKY-NEXT: mvc32 a2
|
|
; CSKY-NEXT: st16.w a2, (sp, 16)
|
|
; CSKY-NEXT: cmphs16 l1, a0
|
|
; CSKY-NEXT: mvcv16 a2
|
|
; CSKY-NEXT: ld16.w a3, (sp, 12)
|
|
; CSKY-NEXT: btsti16 a3, 0
|
|
; CSKY-NEXT: mvc32 a3
|
|
; CSKY-NEXT: ld32.w t0, (sp, 16)
|
|
; CSKY-NEXT: btsti32 t0, 0
|
|
; CSKY-NEXT: movf32 a3, a2
|
|
; CSKY-NEXT: btsti16 a3, 0
|
|
; CSKY-NEXT: mov16 a2, l1
|
|
; CSKY-NEXT: movt32 a2, a0
|
|
; CSKY-NEXT: mov16 a3, l0
|
|
; CSKY-NEXT: movt32 a3, a1
|
|
; CSKY-NEXT: st16.w a0, (sp, 20)
|
|
; CSKY-NEXT: st16.w a1, (sp, 24)
|
|
; CSKY-NEXT: st16.w l3, (sp, 4)
|
|
; CSKY-NEXT: st16.w l3, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l2
|
|
; CSKY-NEXT: addi16 a1, sp, 20
|
|
; CSKY-NEXT: jsri32 [.LCPI201_0]
|
|
; CSKY-NEXT: mov16 a2, a0
|
|
; CSKY-NEXT: ld16.w a1, (sp, 24)
|
|
; CSKY-NEXT: ld16.w a0, (sp, 20)
|
|
; CSKY-NEXT: bez32 a2, .LBB201_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 28
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l3, (sp, 16) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 20
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI201_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_8
|
|
%1 = atomicrmw max i64* %a, i64 %b acquire
|
|
ret i64 %1
|
|
}
|
|
|
|
define i64 @atomicrmw_max_i64_release(i64 *%a, i64 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_max_i64_release:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 24
|
|
; CSKY-NEXT: st16.w l3, (sp, 20) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l2, (sp, 16) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w l4, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 28
|
|
; CSKY-NEXT: mov16 l0, a2
|
|
; CSKY-NEXT: mov16 l1, a1
|
|
; CSKY-NEXT: mov16 l2, a0
|
|
; CSKY-NEXT: ld16.w a1, (a0, 4)
|
|
; CSKY-NEXT: ld16.w a0, (a0, 0)
|
|
; CSKY-NEXT: movi16 l3, 0
|
|
; CSKY-NEXT: movi32 l4, 3
|
|
; CSKY-NEXT: .LBB202_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: cmplt16 l0, a1
|
|
; CSKY-NEXT: mvc32 a2
|
|
; CSKY-NEXT: st16.w a2, (sp, 12)
|
|
; CSKY-NEXT: cmpne16 a1, l0
|
|
; CSKY-NEXT: mvc32 a2
|
|
; CSKY-NEXT: st16.w a2, (sp, 16)
|
|
; CSKY-NEXT: cmphs16 l1, a0
|
|
; CSKY-NEXT: mvcv16 a2
|
|
; CSKY-NEXT: ld16.w a3, (sp, 12)
|
|
; CSKY-NEXT: btsti16 a3, 0
|
|
; CSKY-NEXT: mvc32 a3
|
|
; CSKY-NEXT: ld32.w t0, (sp, 16)
|
|
; CSKY-NEXT: btsti32 t0, 0
|
|
; CSKY-NEXT: movf32 a3, a2
|
|
; CSKY-NEXT: btsti16 a3, 0
|
|
; CSKY-NEXT: mov16 a2, l1
|
|
; CSKY-NEXT: movt32 a2, a0
|
|
; CSKY-NEXT: mov16 a3, l0
|
|
; CSKY-NEXT: movt32 a3, a1
|
|
; CSKY-NEXT: st16.w a0, (sp, 20)
|
|
; CSKY-NEXT: st16.w a1, (sp, 24)
|
|
; CSKY-NEXT: st16.w l3, (sp, 4)
|
|
; CSKY-NEXT: st32.w l4, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l2
|
|
; CSKY-NEXT: addi16 a1, sp, 20
|
|
; CSKY-NEXT: jsri32 [.LCPI202_0]
|
|
; CSKY-NEXT: mov16 a2, a0
|
|
; CSKY-NEXT: ld16.w a1, (sp, 24)
|
|
; CSKY-NEXT: ld16.w a0, (sp, 20)
|
|
; CSKY-NEXT: bez32 a2, .LBB202_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 28
|
|
; CSKY-NEXT: ld32.w l4, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld32.w lr, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 16) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l3, (sp, 20) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 24
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI202_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_8
|
|
%1 = atomicrmw max i64* %a, i64 %b release
|
|
ret i64 %1
|
|
}
|
|
|
|
define i64 @atomicrmw_max_i64_acq_rel(i64 *%a, i64 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_max_i64_acq_rel:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 24
|
|
; CSKY-NEXT: st16.w l3, (sp, 20) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l2, (sp, 16) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w l4, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 28
|
|
; CSKY-NEXT: mov16 l0, a2
|
|
; CSKY-NEXT: mov16 l1, a1
|
|
; CSKY-NEXT: mov16 l2, a0
|
|
; CSKY-NEXT: ld16.w a1, (a0, 4)
|
|
; CSKY-NEXT: ld16.w a0, (a0, 0)
|
|
; CSKY-NEXT: movi16 l3, 2
|
|
; CSKY-NEXT: movi32 l4, 4
|
|
; CSKY-NEXT: .LBB203_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: cmplt16 l0, a1
|
|
; CSKY-NEXT: mvc32 a2
|
|
; CSKY-NEXT: st16.w a2, (sp, 12)
|
|
; CSKY-NEXT: cmpne16 a1, l0
|
|
; CSKY-NEXT: mvc32 a2
|
|
; CSKY-NEXT: st16.w a2, (sp, 16)
|
|
; CSKY-NEXT: cmphs16 l1, a0
|
|
; CSKY-NEXT: mvcv16 a2
|
|
; CSKY-NEXT: ld16.w a3, (sp, 12)
|
|
; CSKY-NEXT: btsti16 a3, 0
|
|
; CSKY-NEXT: mvc32 a3
|
|
; CSKY-NEXT: ld32.w t0, (sp, 16)
|
|
; CSKY-NEXT: btsti32 t0, 0
|
|
; CSKY-NEXT: movf32 a3, a2
|
|
; CSKY-NEXT: btsti16 a3, 0
|
|
; CSKY-NEXT: mov16 a2, l1
|
|
; CSKY-NEXT: movt32 a2, a0
|
|
; CSKY-NEXT: mov16 a3, l0
|
|
; CSKY-NEXT: movt32 a3, a1
|
|
; CSKY-NEXT: st16.w a0, (sp, 20)
|
|
; CSKY-NEXT: st16.w a1, (sp, 24)
|
|
; CSKY-NEXT: st16.w l3, (sp, 4)
|
|
; CSKY-NEXT: st32.w l4, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l2
|
|
; CSKY-NEXT: addi16 a1, sp, 20
|
|
; CSKY-NEXT: jsri32 [.LCPI203_0]
|
|
; CSKY-NEXT: mov16 a2, a0
|
|
; CSKY-NEXT: ld16.w a1, (sp, 24)
|
|
; CSKY-NEXT: ld16.w a0, (sp, 20)
|
|
; CSKY-NEXT: bez32 a2, .LBB203_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 28
|
|
; CSKY-NEXT: ld32.w l4, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld32.w lr, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 16) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l3, (sp, 20) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 24
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI203_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_8
|
|
%1 = atomicrmw max i64* %a, i64 %b acq_rel
|
|
ret i64 %1
|
|
}
|
|
|
|
define i64 @atomicrmw_max_i64_seq_cst(i64 *%a, i64 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_max_i64_seq_cst:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 20
|
|
; CSKY-NEXT: st16.w l3, (sp, 16) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 28
|
|
; CSKY-NEXT: mov16 l0, a2
|
|
; CSKY-NEXT: mov16 l1, a1
|
|
; CSKY-NEXT: mov16 l2, a0
|
|
; CSKY-NEXT: ld16.w a1, (a0, 4)
|
|
; CSKY-NEXT: ld16.w a0, (a0, 0)
|
|
; CSKY-NEXT: movi16 l3, 5
|
|
; CSKY-NEXT: .LBB204_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: cmplt16 l0, a1
|
|
; CSKY-NEXT: mvc32 a2
|
|
; CSKY-NEXT: st16.w a2, (sp, 12)
|
|
; CSKY-NEXT: cmpne16 a1, l0
|
|
; CSKY-NEXT: mvc32 a2
|
|
; CSKY-NEXT: st16.w a2, (sp, 16)
|
|
; CSKY-NEXT: cmphs16 l1, a0
|
|
; CSKY-NEXT: mvcv16 a2
|
|
; CSKY-NEXT: ld16.w a3, (sp, 12)
|
|
; CSKY-NEXT: btsti16 a3, 0
|
|
; CSKY-NEXT: mvc32 a3
|
|
; CSKY-NEXT: ld32.w t0, (sp, 16)
|
|
; CSKY-NEXT: btsti32 t0, 0
|
|
; CSKY-NEXT: movf32 a3, a2
|
|
; CSKY-NEXT: btsti16 a3, 0
|
|
; CSKY-NEXT: mov16 a2, l1
|
|
; CSKY-NEXT: movt32 a2, a0
|
|
; CSKY-NEXT: mov16 a3, l0
|
|
; CSKY-NEXT: movt32 a3, a1
|
|
; CSKY-NEXT: st16.w a0, (sp, 20)
|
|
; CSKY-NEXT: st16.w a1, (sp, 24)
|
|
; CSKY-NEXT: st16.w l3, (sp, 4)
|
|
; CSKY-NEXT: st16.w l3, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l2
|
|
; CSKY-NEXT: addi16 a1, sp, 20
|
|
; CSKY-NEXT: jsri32 [.LCPI204_0]
|
|
; CSKY-NEXT: mov16 a2, a0
|
|
; CSKY-NEXT: ld16.w a1, (sp, 24)
|
|
; CSKY-NEXT: ld16.w a0, (sp, 20)
|
|
; CSKY-NEXT: bez32 a2, .LBB204_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 28
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l3, (sp, 16) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 20
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI204_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_8
|
|
%1 = atomicrmw max i64* %a, i64 %b seq_cst
|
|
ret i64 %1
|
|
}
|
|
|
|
define i64 @atomicrmw_min_i64_monotonic(i64 *%a, i64 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_min_i64_monotonic:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 20
|
|
; CSKY-NEXT: st16.w l3, (sp, 16) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 28
|
|
; CSKY-NEXT: mov16 l0, a2
|
|
; CSKY-NEXT: mov16 l1, a1
|
|
; CSKY-NEXT: mov16 l2, a0
|
|
; CSKY-NEXT: ld16.w a1, (a0, 4)
|
|
; CSKY-NEXT: ld16.w a0, (a0, 0)
|
|
; CSKY-NEXT: movi16 l3, 0
|
|
; CSKY-NEXT: .LBB205_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: cmphs16 l1, a0
|
|
; CSKY-NEXT: mvc32 a2
|
|
; CSKY-NEXT: st16.w a2, (sp, 12)
|
|
; CSKY-NEXT: cmpne16 a1, l0
|
|
; CSKY-NEXT: mvc32 a2
|
|
; CSKY-NEXT: st16.w a2, (sp, 16)
|
|
; CSKY-NEXT: cmplt16 l0, a1
|
|
; CSKY-NEXT: mvcv16 a2
|
|
; CSKY-NEXT: ld16.w a3, (sp, 12)
|
|
; CSKY-NEXT: btsti16 a3, 0
|
|
; CSKY-NEXT: mvc32 a3
|
|
; CSKY-NEXT: ld32.w t0, (sp, 16)
|
|
; CSKY-NEXT: btsti32 t0, 0
|
|
; CSKY-NEXT: movf32 a2, a3
|
|
; CSKY-NEXT: btsti16 a2, 0
|
|
; CSKY-NEXT: mov16 a2, l1
|
|
; CSKY-NEXT: movt32 a2, a0
|
|
; CSKY-NEXT: mov16 a3, l0
|
|
; CSKY-NEXT: movt32 a3, a1
|
|
; CSKY-NEXT: st16.w a0, (sp, 20)
|
|
; CSKY-NEXT: st16.w a1, (sp, 24)
|
|
; CSKY-NEXT: st16.w l3, (sp, 4)
|
|
; CSKY-NEXT: st16.w l3, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l2
|
|
; CSKY-NEXT: addi16 a1, sp, 20
|
|
; CSKY-NEXT: jsri32 [.LCPI205_0]
|
|
; CSKY-NEXT: mov16 a2, a0
|
|
; CSKY-NEXT: ld16.w a1, (sp, 24)
|
|
; CSKY-NEXT: ld16.w a0, (sp, 20)
|
|
; CSKY-NEXT: bez32 a2, .LBB205_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 28
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l3, (sp, 16) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 20
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI205_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_8
|
|
%1 = atomicrmw min i64* %a, i64 %b monotonic
|
|
ret i64 %1
|
|
}
|
|
|
|
define i64 @atomicrmw_min_i64_acquire(i64 *%a, i64 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_min_i64_acquire:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 20
|
|
; CSKY-NEXT: st16.w l3, (sp, 16) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 28
|
|
; CSKY-NEXT: mov16 l0, a2
|
|
; CSKY-NEXT: mov16 l1, a1
|
|
; CSKY-NEXT: mov16 l2, a0
|
|
; CSKY-NEXT: ld16.w a1, (a0, 4)
|
|
; CSKY-NEXT: ld16.w a0, (a0, 0)
|
|
; CSKY-NEXT: movi16 l3, 2
|
|
; CSKY-NEXT: .LBB206_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: cmphs16 l1, a0
|
|
; CSKY-NEXT: mvc32 a2
|
|
; CSKY-NEXT: st16.w a2, (sp, 12)
|
|
; CSKY-NEXT: cmpne16 a1, l0
|
|
; CSKY-NEXT: mvc32 a2
|
|
; CSKY-NEXT: st16.w a2, (sp, 16)
|
|
; CSKY-NEXT: cmplt16 l0, a1
|
|
; CSKY-NEXT: mvcv16 a2
|
|
; CSKY-NEXT: ld16.w a3, (sp, 12)
|
|
; CSKY-NEXT: btsti16 a3, 0
|
|
; CSKY-NEXT: mvc32 a3
|
|
; CSKY-NEXT: ld32.w t0, (sp, 16)
|
|
; CSKY-NEXT: btsti32 t0, 0
|
|
; CSKY-NEXT: movf32 a2, a3
|
|
; CSKY-NEXT: btsti16 a2, 0
|
|
; CSKY-NEXT: mov16 a2, l1
|
|
; CSKY-NEXT: movt32 a2, a0
|
|
; CSKY-NEXT: mov16 a3, l0
|
|
; CSKY-NEXT: movt32 a3, a1
|
|
; CSKY-NEXT: st16.w a0, (sp, 20)
|
|
; CSKY-NEXT: st16.w a1, (sp, 24)
|
|
; CSKY-NEXT: st16.w l3, (sp, 4)
|
|
; CSKY-NEXT: st16.w l3, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l2
|
|
; CSKY-NEXT: addi16 a1, sp, 20
|
|
; CSKY-NEXT: jsri32 [.LCPI206_0]
|
|
; CSKY-NEXT: mov16 a2, a0
|
|
; CSKY-NEXT: ld16.w a1, (sp, 24)
|
|
; CSKY-NEXT: ld16.w a0, (sp, 20)
|
|
; CSKY-NEXT: bez32 a2, .LBB206_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 28
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l3, (sp, 16) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 20
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI206_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_8
|
|
%1 = atomicrmw min i64* %a, i64 %b acquire
|
|
ret i64 %1
|
|
}
|
|
|
|
define i64 @atomicrmw_min_i64_release(i64 *%a, i64 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_min_i64_release:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 24
|
|
; CSKY-NEXT: st16.w l3, (sp, 20) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l2, (sp, 16) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w l4, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 28
|
|
; CSKY-NEXT: mov16 l0, a2
|
|
; CSKY-NEXT: mov16 l1, a1
|
|
; CSKY-NEXT: mov16 l2, a0
|
|
; CSKY-NEXT: ld16.w a1, (a0, 4)
|
|
; CSKY-NEXT: ld16.w a0, (a0, 0)
|
|
; CSKY-NEXT: movi16 l3, 0
|
|
; CSKY-NEXT: movi32 l4, 3
|
|
; CSKY-NEXT: .LBB207_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: cmphs16 l1, a0
|
|
; CSKY-NEXT: mvc32 a2
|
|
; CSKY-NEXT: st16.w a2, (sp, 12)
|
|
; CSKY-NEXT: cmpne16 a1, l0
|
|
; CSKY-NEXT: mvc32 a2
|
|
; CSKY-NEXT: st16.w a2, (sp, 16)
|
|
; CSKY-NEXT: cmplt16 l0, a1
|
|
; CSKY-NEXT: mvcv16 a2
|
|
; CSKY-NEXT: ld16.w a3, (sp, 12)
|
|
; CSKY-NEXT: btsti16 a3, 0
|
|
; CSKY-NEXT: mvc32 a3
|
|
; CSKY-NEXT: ld32.w t0, (sp, 16)
|
|
; CSKY-NEXT: btsti32 t0, 0
|
|
; CSKY-NEXT: movf32 a2, a3
|
|
; CSKY-NEXT: btsti16 a2, 0
|
|
; CSKY-NEXT: mov16 a2, l1
|
|
; CSKY-NEXT: movt32 a2, a0
|
|
; CSKY-NEXT: mov16 a3, l0
|
|
; CSKY-NEXT: movt32 a3, a1
|
|
; CSKY-NEXT: st16.w a0, (sp, 20)
|
|
; CSKY-NEXT: st16.w a1, (sp, 24)
|
|
; CSKY-NEXT: st16.w l3, (sp, 4)
|
|
; CSKY-NEXT: st32.w l4, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l2
|
|
; CSKY-NEXT: addi16 a1, sp, 20
|
|
; CSKY-NEXT: jsri32 [.LCPI207_0]
|
|
; CSKY-NEXT: mov16 a2, a0
|
|
; CSKY-NEXT: ld16.w a1, (sp, 24)
|
|
; CSKY-NEXT: ld16.w a0, (sp, 20)
|
|
; CSKY-NEXT: bez32 a2, .LBB207_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 28
|
|
; CSKY-NEXT: ld32.w l4, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld32.w lr, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 16) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l3, (sp, 20) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 24
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI207_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_8
|
|
%1 = atomicrmw min i64* %a, i64 %b release
|
|
ret i64 %1
|
|
}
|
|
|
|
define i64 @atomicrmw_min_i64_acq_rel(i64 *%a, i64 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_min_i64_acq_rel:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 24
|
|
; CSKY-NEXT: st16.w l3, (sp, 20) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l2, (sp, 16) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w l4, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 28
|
|
; CSKY-NEXT: mov16 l0, a2
|
|
; CSKY-NEXT: mov16 l1, a1
|
|
; CSKY-NEXT: mov16 l2, a0
|
|
; CSKY-NEXT: ld16.w a1, (a0, 4)
|
|
; CSKY-NEXT: ld16.w a0, (a0, 0)
|
|
; CSKY-NEXT: movi16 l3, 2
|
|
; CSKY-NEXT: movi32 l4, 4
|
|
; CSKY-NEXT: .LBB208_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: cmphs16 l1, a0
|
|
; CSKY-NEXT: mvc32 a2
|
|
; CSKY-NEXT: st16.w a2, (sp, 12)
|
|
; CSKY-NEXT: cmpne16 a1, l0
|
|
; CSKY-NEXT: mvc32 a2
|
|
; CSKY-NEXT: st16.w a2, (sp, 16)
|
|
; CSKY-NEXT: cmplt16 l0, a1
|
|
; CSKY-NEXT: mvcv16 a2
|
|
; CSKY-NEXT: ld16.w a3, (sp, 12)
|
|
; CSKY-NEXT: btsti16 a3, 0
|
|
; CSKY-NEXT: mvc32 a3
|
|
; CSKY-NEXT: ld32.w t0, (sp, 16)
|
|
; CSKY-NEXT: btsti32 t0, 0
|
|
; CSKY-NEXT: movf32 a2, a3
|
|
; CSKY-NEXT: btsti16 a2, 0
|
|
; CSKY-NEXT: mov16 a2, l1
|
|
; CSKY-NEXT: movt32 a2, a0
|
|
; CSKY-NEXT: mov16 a3, l0
|
|
; CSKY-NEXT: movt32 a3, a1
|
|
; CSKY-NEXT: st16.w a0, (sp, 20)
|
|
; CSKY-NEXT: st16.w a1, (sp, 24)
|
|
; CSKY-NEXT: st16.w l3, (sp, 4)
|
|
; CSKY-NEXT: st32.w l4, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l2
|
|
; CSKY-NEXT: addi16 a1, sp, 20
|
|
; CSKY-NEXT: jsri32 [.LCPI208_0]
|
|
; CSKY-NEXT: mov16 a2, a0
|
|
; CSKY-NEXT: ld16.w a1, (sp, 24)
|
|
; CSKY-NEXT: ld16.w a0, (sp, 20)
|
|
; CSKY-NEXT: bez32 a2, .LBB208_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 28
|
|
; CSKY-NEXT: ld32.w l4, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld32.w lr, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 16) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l3, (sp, 20) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 24
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI208_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_8
|
|
%1 = atomicrmw min i64* %a, i64 %b acq_rel
|
|
ret i64 %1
|
|
}
|
|
|
|
define i64 @atomicrmw_min_i64_seq_cst(i64 *%a, i64 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_min_i64_seq_cst:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 20
|
|
; CSKY-NEXT: st16.w l3, (sp, 16) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 28
|
|
; CSKY-NEXT: mov16 l0, a2
|
|
; CSKY-NEXT: mov16 l1, a1
|
|
; CSKY-NEXT: mov16 l2, a0
|
|
; CSKY-NEXT: ld16.w a1, (a0, 4)
|
|
; CSKY-NEXT: ld16.w a0, (a0, 0)
|
|
; CSKY-NEXT: movi16 l3, 5
|
|
; CSKY-NEXT: .LBB209_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: cmphs16 l1, a0
|
|
; CSKY-NEXT: mvc32 a2
|
|
; CSKY-NEXT: st16.w a2, (sp, 12)
|
|
; CSKY-NEXT: cmpne16 a1, l0
|
|
; CSKY-NEXT: mvc32 a2
|
|
; CSKY-NEXT: st16.w a2, (sp, 16)
|
|
; CSKY-NEXT: cmplt16 l0, a1
|
|
; CSKY-NEXT: mvcv16 a2
|
|
; CSKY-NEXT: ld16.w a3, (sp, 12)
|
|
; CSKY-NEXT: btsti16 a3, 0
|
|
; CSKY-NEXT: mvc32 a3
|
|
; CSKY-NEXT: ld32.w t0, (sp, 16)
|
|
; CSKY-NEXT: btsti32 t0, 0
|
|
; CSKY-NEXT: movf32 a2, a3
|
|
; CSKY-NEXT: btsti16 a2, 0
|
|
; CSKY-NEXT: mov16 a2, l1
|
|
; CSKY-NEXT: movt32 a2, a0
|
|
; CSKY-NEXT: mov16 a3, l0
|
|
; CSKY-NEXT: movt32 a3, a1
|
|
; CSKY-NEXT: st16.w a0, (sp, 20)
|
|
; CSKY-NEXT: st16.w a1, (sp, 24)
|
|
; CSKY-NEXT: st16.w l3, (sp, 4)
|
|
; CSKY-NEXT: st16.w l3, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l2
|
|
; CSKY-NEXT: addi16 a1, sp, 20
|
|
; CSKY-NEXT: jsri32 [.LCPI209_0]
|
|
; CSKY-NEXT: mov16 a2, a0
|
|
; CSKY-NEXT: ld16.w a1, (sp, 24)
|
|
; CSKY-NEXT: ld16.w a0, (sp, 20)
|
|
; CSKY-NEXT: bez32 a2, .LBB209_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 28
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l3, (sp, 16) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 20
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI209_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_8
|
|
%1 = atomicrmw min i64* %a, i64 %b seq_cst
|
|
ret i64 %1
|
|
}
|
|
|
|
define i64 @atomicrmw_umax_i64_monotonic(i64 *%a, i64 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_umax_i64_monotonic:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 20
|
|
; CSKY-NEXT: st16.w l3, (sp, 16) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 24
|
|
; CSKY-NEXT: mov16 l0, a2
|
|
; CSKY-NEXT: mov16 l1, a1
|
|
; CSKY-NEXT: mov16 l2, a0
|
|
; CSKY-NEXT: ld16.w a1, (a0, 4)
|
|
; CSKY-NEXT: ld16.w a0, (a0, 0)
|
|
; CSKY-NEXT: movi16 l3, 0
|
|
; CSKY-NEXT: .LBB210_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: cmpne16 a1, l0
|
|
; CSKY-NEXT: mvc32 a2
|
|
; CSKY-NEXT: st16.w a2, (sp, 12)
|
|
; CSKY-NEXT: cmphs16 l1, a0
|
|
; CSKY-NEXT: mvcv16 a2
|
|
; CSKY-NEXT: cmphs16 l0, a1
|
|
; CSKY-NEXT: mvcv16 a3
|
|
; CSKY-NEXT: ld32.w t0, (sp, 12)
|
|
; CSKY-NEXT: btsti32 t0, 0
|
|
; CSKY-NEXT: movf32 a3, a2
|
|
; CSKY-NEXT: btsti16 a3, 0
|
|
; CSKY-NEXT: mov16 a2, l1
|
|
; CSKY-NEXT: movt32 a2, a0
|
|
; CSKY-NEXT: mov16 a3, l0
|
|
; CSKY-NEXT: movt32 a3, a1
|
|
; CSKY-NEXT: st16.w a0, (sp, 16)
|
|
; CSKY-NEXT: st16.w a1, (sp, 20)
|
|
; CSKY-NEXT: st16.w l3, (sp, 4)
|
|
; CSKY-NEXT: st16.w l3, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l2
|
|
; CSKY-NEXT: addi16 a1, sp, 16
|
|
; CSKY-NEXT: jsri32 [.LCPI210_0]
|
|
; CSKY-NEXT: mov16 a2, a0
|
|
; CSKY-NEXT: ld16.w a1, (sp, 20)
|
|
; CSKY-NEXT: ld16.w a0, (sp, 16)
|
|
; CSKY-NEXT: bez32 a2, .LBB210_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 24
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l3, (sp, 16) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 20
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI210_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_8
|
|
%1 = atomicrmw umax i64* %a, i64 %b monotonic
|
|
ret i64 %1
|
|
}
|
|
|
|
define i64 @atomicrmw_umax_i64_acquire(i64 *%a, i64 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_umax_i64_acquire:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 20
|
|
; CSKY-NEXT: st16.w l3, (sp, 16) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 24
|
|
; CSKY-NEXT: mov16 l0, a2
|
|
; CSKY-NEXT: mov16 l1, a1
|
|
; CSKY-NEXT: mov16 l2, a0
|
|
; CSKY-NEXT: ld16.w a1, (a0, 4)
|
|
; CSKY-NEXT: ld16.w a0, (a0, 0)
|
|
; CSKY-NEXT: movi16 l3, 2
|
|
; CSKY-NEXT: .LBB211_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: cmpne16 a1, l0
|
|
; CSKY-NEXT: mvc32 a2
|
|
; CSKY-NEXT: st16.w a2, (sp, 12)
|
|
; CSKY-NEXT: cmphs16 l1, a0
|
|
; CSKY-NEXT: mvcv16 a2
|
|
; CSKY-NEXT: cmphs16 l0, a1
|
|
; CSKY-NEXT: mvcv16 a3
|
|
; CSKY-NEXT: ld32.w t0, (sp, 12)
|
|
; CSKY-NEXT: btsti32 t0, 0
|
|
; CSKY-NEXT: movf32 a3, a2
|
|
; CSKY-NEXT: btsti16 a3, 0
|
|
; CSKY-NEXT: mov16 a2, l1
|
|
; CSKY-NEXT: movt32 a2, a0
|
|
; CSKY-NEXT: mov16 a3, l0
|
|
; CSKY-NEXT: movt32 a3, a1
|
|
; CSKY-NEXT: st16.w a0, (sp, 16)
|
|
; CSKY-NEXT: st16.w a1, (sp, 20)
|
|
; CSKY-NEXT: st16.w l3, (sp, 4)
|
|
; CSKY-NEXT: st16.w l3, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l2
|
|
; CSKY-NEXT: addi16 a1, sp, 16
|
|
; CSKY-NEXT: jsri32 [.LCPI211_0]
|
|
; CSKY-NEXT: mov16 a2, a0
|
|
; CSKY-NEXT: ld16.w a1, (sp, 20)
|
|
; CSKY-NEXT: ld16.w a0, (sp, 16)
|
|
; CSKY-NEXT: bez32 a2, .LBB211_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 24
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l3, (sp, 16) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 20
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI211_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_8
|
|
%1 = atomicrmw umax i64* %a, i64 %b acquire
|
|
ret i64 %1
|
|
}
|
|
|
|
define i64 @atomicrmw_umax_i64_release(i64 *%a, i64 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_umax_i64_release:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 24
|
|
; CSKY-NEXT: st16.w l3, (sp, 20) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l2, (sp, 16) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w l4, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 24
|
|
; CSKY-NEXT: mov16 l0, a2
|
|
; CSKY-NEXT: mov16 l1, a1
|
|
; CSKY-NEXT: mov16 l2, a0
|
|
; CSKY-NEXT: ld16.w a1, (a0, 4)
|
|
; CSKY-NEXT: ld16.w a0, (a0, 0)
|
|
; CSKY-NEXT: movi16 l3, 0
|
|
; CSKY-NEXT: movi32 l4, 3
|
|
; CSKY-NEXT: .LBB212_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: cmpne16 a1, l0
|
|
; CSKY-NEXT: mvc32 a2
|
|
; CSKY-NEXT: st16.w a2, (sp, 12)
|
|
; CSKY-NEXT: cmphs16 l1, a0
|
|
; CSKY-NEXT: mvcv16 a2
|
|
; CSKY-NEXT: cmphs16 l0, a1
|
|
; CSKY-NEXT: mvcv16 a3
|
|
; CSKY-NEXT: ld32.w t0, (sp, 12)
|
|
; CSKY-NEXT: btsti32 t0, 0
|
|
; CSKY-NEXT: movf32 a3, a2
|
|
; CSKY-NEXT: btsti16 a3, 0
|
|
; CSKY-NEXT: mov16 a2, l1
|
|
; CSKY-NEXT: movt32 a2, a0
|
|
; CSKY-NEXT: mov16 a3, l0
|
|
; CSKY-NEXT: movt32 a3, a1
|
|
; CSKY-NEXT: st16.w a0, (sp, 16)
|
|
; CSKY-NEXT: st16.w a1, (sp, 20)
|
|
; CSKY-NEXT: st16.w l3, (sp, 4)
|
|
; CSKY-NEXT: st32.w l4, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l2
|
|
; CSKY-NEXT: addi16 a1, sp, 16
|
|
; CSKY-NEXT: jsri32 [.LCPI212_0]
|
|
; CSKY-NEXT: mov16 a2, a0
|
|
; CSKY-NEXT: ld16.w a1, (sp, 20)
|
|
; CSKY-NEXT: ld16.w a0, (sp, 16)
|
|
; CSKY-NEXT: bez32 a2, .LBB212_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 24
|
|
; CSKY-NEXT: ld32.w l4, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld32.w lr, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 16) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l3, (sp, 20) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 24
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI212_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_8
|
|
%1 = atomicrmw umax i64* %a, i64 %b release
|
|
ret i64 %1
|
|
}
|
|
|
|
define i64 @atomicrmw_umax_i64_acq_rel(i64 *%a, i64 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_umax_i64_acq_rel:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 24
|
|
; CSKY-NEXT: st16.w l3, (sp, 20) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l2, (sp, 16) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w l4, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 24
|
|
; CSKY-NEXT: mov16 l0, a2
|
|
; CSKY-NEXT: mov16 l1, a1
|
|
; CSKY-NEXT: mov16 l2, a0
|
|
; CSKY-NEXT: ld16.w a1, (a0, 4)
|
|
; CSKY-NEXT: ld16.w a0, (a0, 0)
|
|
; CSKY-NEXT: movi16 l3, 2
|
|
; CSKY-NEXT: movi32 l4, 4
|
|
; CSKY-NEXT: .LBB213_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: cmpne16 a1, l0
|
|
; CSKY-NEXT: mvc32 a2
|
|
; CSKY-NEXT: st16.w a2, (sp, 12)
|
|
; CSKY-NEXT: cmphs16 l1, a0
|
|
; CSKY-NEXT: mvcv16 a2
|
|
; CSKY-NEXT: cmphs16 l0, a1
|
|
; CSKY-NEXT: mvcv16 a3
|
|
; CSKY-NEXT: ld32.w t0, (sp, 12)
|
|
; CSKY-NEXT: btsti32 t0, 0
|
|
; CSKY-NEXT: movf32 a3, a2
|
|
; CSKY-NEXT: btsti16 a3, 0
|
|
; CSKY-NEXT: mov16 a2, l1
|
|
; CSKY-NEXT: movt32 a2, a0
|
|
; CSKY-NEXT: mov16 a3, l0
|
|
; CSKY-NEXT: movt32 a3, a1
|
|
; CSKY-NEXT: st16.w a0, (sp, 16)
|
|
; CSKY-NEXT: st16.w a1, (sp, 20)
|
|
; CSKY-NEXT: st16.w l3, (sp, 4)
|
|
; CSKY-NEXT: st32.w l4, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l2
|
|
; CSKY-NEXT: addi16 a1, sp, 16
|
|
; CSKY-NEXT: jsri32 [.LCPI213_0]
|
|
; CSKY-NEXT: mov16 a2, a0
|
|
; CSKY-NEXT: ld16.w a1, (sp, 20)
|
|
; CSKY-NEXT: ld16.w a0, (sp, 16)
|
|
; CSKY-NEXT: bez32 a2, .LBB213_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 24
|
|
; CSKY-NEXT: ld32.w l4, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld32.w lr, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 16) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l3, (sp, 20) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 24
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI213_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_8
|
|
%1 = atomicrmw umax i64* %a, i64 %b acq_rel
|
|
ret i64 %1
|
|
}
|
|
|
|
define i64 @atomicrmw_umax_i64_seq_cst(i64 *%a, i64 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_umax_i64_seq_cst:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 20
|
|
; CSKY-NEXT: st16.w l3, (sp, 16) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 24
|
|
; CSKY-NEXT: mov16 l0, a2
|
|
; CSKY-NEXT: mov16 l1, a1
|
|
; CSKY-NEXT: mov16 l2, a0
|
|
; CSKY-NEXT: ld16.w a1, (a0, 4)
|
|
; CSKY-NEXT: ld16.w a0, (a0, 0)
|
|
; CSKY-NEXT: movi16 l3, 5
|
|
; CSKY-NEXT: .LBB214_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: cmpne16 a1, l0
|
|
; CSKY-NEXT: mvc32 a2
|
|
; CSKY-NEXT: st16.w a2, (sp, 12)
|
|
; CSKY-NEXT: cmphs16 l1, a0
|
|
; CSKY-NEXT: mvcv16 a2
|
|
; CSKY-NEXT: cmphs16 l0, a1
|
|
; CSKY-NEXT: mvcv16 a3
|
|
; CSKY-NEXT: ld32.w t0, (sp, 12)
|
|
; CSKY-NEXT: btsti32 t0, 0
|
|
; CSKY-NEXT: movf32 a3, a2
|
|
; CSKY-NEXT: btsti16 a3, 0
|
|
; CSKY-NEXT: mov16 a2, l1
|
|
; CSKY-NEXT: movt32 a2, a0
|
|
; CSKY-NEXT: mov16 a3, l0
|
|
; CSKY-NEXT: movt32 a3, a1
|
|
; CSKY-NEXT: st16.w a0, (sp, 16)
|
|
; CSKY-NEXT: st16.w a1, (sp, 20)
|
|
; CSKY-NEXT: st16.w l3, (sp, 4)
|
|
; CSKY-NEXT: st16.w l3, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l2
|
|
; CSKY-NEXT: addi16 a1, sp, 16
|
|
; CSKY-NEXT: jsri32 [.LCPI214_0]
|
|
; CSKY-NEXT: mov16 a2, a0
|
|
; CSKY-NEXT: ld16.w a1, (sp, 20)
|
|
; CSKY-NEXT: ld16.w a0, (sp, 16)
|
|
; CSKY-NEXT: bez32 a2, .LBB214_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 24
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l3, (sp, 16) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 20
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI214_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_8
|
|
%1 = atomicrmw umax i64* %a, i64 %b seq_cst
|
|
ret i64 %1
|
|
}
|
|
|
|
define i64 @atomicrmw_umin_i64_monotonic(i64 *%a, i64 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_umin_i64_monotonic:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 20
|
|
; CSKY-NEXT: st16.w l3, (sp, 16) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 32
|
|
; CSKY-NEXT: mov16 l0, a2
|
|
; CSKY-NEXT: mov16 l1, a1
|
|
; CSKY-NEXT: mov16 l2, a0
|
|
; CSKY-NEXT: ld16.w a1, (a0, 4)
|
|
; CSKY-NEXT: ld16.w a0, (a0, 0)
|
|
; CSKY-NEXT: movi16 l3, 0
|
|
; CSKY-NEXT: .LBB215_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: cmphs16 l1, a0
|
|
; CSKY-NEXT: mvc32 a2
|
|
; CSKY-NEXT: st16.w a2, (sp, 16)
|
|
; CSKY-NEXT: cmphs16 l0, a1
|
|
; CSKY-NEXT: mvc32 a2
|
|
; CSKY-NEXT: st16.w a2, (sp, 12)
|
|
; CSKY-NEXT: cmpne16 a1, l0
|
|
; CSKY-NEXT: mvc32 a2
|
|
; CSKY-NEXT: st16.w a2, (sp, 20)
|
|
; CSKY-NEXT: ld16.w a2, (sp, 16)
|
|
; CSKY-NEXT: btsti16 a2, 0
|
|
; CSKY-NEXT: mvc32 a2
|
|
; CSKY-NEXT: ld16.w a3, (sp, 12)
|
|
; CSKY-NEXT: btsti16 a3, 0
|
|
; CSKY-NEXT: mvc32 a3
|
|
; CSKY-NEXT: ld32.w t0, (sp, 20)
|
|
; CSKY-NEXT: btsti32 t0, 0
|
|
; CSKY-NEXT: movf32 a3, a2
|
|
; CSKY-NEXT: btsti16 a3, 0
|
|
; CSKY-NEXT: mov16 a2, l1
|
|
; CSKY-NEXT: movt32 a2, a0
|
|
; CSKY-NEXT: mov16 a3, l0
|
|
; CSKY-NEXT: movt32 a3, a1
|
|
; CSKY-NEXT: st16.w a0, (sp, 24)
|
|
; CSKY-NEXT: st16.w a1, (sp, 28)
|
|
; CSKY-NEXT: st16.w l3, (sp, 4)
|
|
; CSKY-NEXT: st16.w l3, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l2
|
|
; CSKY-NEXT: addi16 a1, sp, 24
|
|
; CSKY-NEXT: jsri32 [.LCPI215_0]
|
|
; CSKY-NEXT: mov16 a2, a0
|
|
; CSKY-NEXT: ld16.w a1, (sp, 28)
|
|
; CSKY-NEXT: ld16.w a0, (sp, 24)
|
|
; CSKY-NEXT: bez32 a2, .LBB215_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 32
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l3, (sp, 16) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 20
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI215_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_8
|
|
%1 = atomicrmw umin i64* %a, i64 %b monotonic
|
|
ret i64 %1
|
|
}
|
|
|
|
define i64 @atomicrmw_umin_i64_acquire(i64 *%a, i64 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_umin_i64_acquire:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 20
|
|
; CSKY-NEXT: st16.w l3, (sp, 16) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 32
|
|
; CSKY-NEXT: mov16 l0, a2
|
|
; CSKY-NEXT: mov16 l1, a1
|
|
; CSKY-NEXT: mov16 l2, a0
|
|
; CSKY-NEXT: ld16.w a1, (a0, 4)
|
|
; CSKY-NEXT: ld16.w a0, (a0, 0)
|
|
; CSKY-NEXT: movi16 l3, 2
|
|
; CSKY-NEXT: .LBB216_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: cmphs16 l1, a0
|
|
; CSKY-NEXT: mvc32 a2
|
|
; CSKY-NEXT: st16.w a2, (sp, 16)
|
|
; CSKY-NEXT: cmphs16 l0, a1
|
|
; CSKY-NEXT: mvc32 a2
|
|
; CSKY-NEXT: st16.w a2, (sp, 12)
|
|
; CSKY-NEXT: cmpne16 a1, l0
|
|
; CSKY-NEXT: mvc32 a2
|
|
; CSKY-NEXT: st16.w a2, (sp, 20)
|
|
; CSKY-NEXT: ld16.w a2, (sp, 16)
|
|
; CSKY-NEXT: btsti16 a2, 0
|
|
; CSKY-NEXT: mvc32 a2
|
|
; CSKY-NEXT: ld16.w a3, (sp, 12)
|
|
; CSKY-NEXT: btsti16 a3, 0
|
|
; CSKY-NEXT: mvc32 a3
|
|
; CSKY-NEXT: ld32.w t0, (sp, 20)
|
|
; CSKY-NEXT: btsti32 t0, 0
|
|
; CSKY-NEXT: movf32 a3, a2
|
|
; CSKY-NEXT: btsti16 a3, 0
|
|
; CSKY-NEXT: mov16 a2, l1
|
|
; CSKY-NEXT: movt32 a2, a0
|
|
; CSKY-NEXT: mov16 a3, l0
|
|
; CSKY-NEXT: movt32 a3, a1
|
|
; CSKY-NEXT: st16.w a0, (sp, 24)
|
|
; CSKY-NEXT: st16.w a1, (sp, 28)
|
|
; CSKY-NEXT: st16.w l3, (sp, 4)
|
|
; CSKY-NEXT: st16.w l3, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l2
|
|
; CSKY-NEXT: addi16 a1, sp, 24
|
|
; CSKY-NEXT: jsri32 [.LCPI216_0]
|
|
; CSKY-NEXT: mov16 a2, a0
|
|
; CSKY-NEXT: ld16.w a1, (sp, 28)
|
|
; CSKY-NEXT: ld16.w a0, (sp, 24)
|
|
; CSKY-NEXT: bez32 a2, .LBB216_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 32
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l3, (sp, 16) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 20
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI216_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_8
|
|
%1 = atomicrmw umin i64* %a, i64 %b acquire
|
|
ret i64 %1
|
|
}
|
|
|
|
define i64 @atomicrmw_umin_i64_release(i64 *%a, i64 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_umin_i64_release:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 24
|
|
; CSKY-NEXT: st16.w l3, (sp, 20) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l2, (sp, 16) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w l4, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 32
|
|
; CSKY-NEXT: mov16 l0, a2
|
|
; CSKY-NEXT: mov16 l1, a1
|
|
; CSKY-NEXT: mov16 l2, a0
|
|
; CSKY-NEXT: ld16.w a1, (a0, 4)
|
|
; CSKY-NEXT: ld16.w a0, (a0, 0)
|
|
; CSKY-NEXT: movi16 l3, 0
|
|
; CSKY-NEXT: movi32 l4, 3
|
|
; CSKY-NEXT: .LBB217_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: cmphs16 l1, a0
|
|
; CSKY-NEXT: mvc32 a2
|
|
; CSKY-NEXT: st16.w a2, (sp, 16)
|
|
; CSKY-NEXT: cmphs16 l0, a1
|
|
; CSKY-NEXT: mvc32 a2
|
|
; CSKY-NEXT: st16.w a2, (sp, 12)
|
|
; CSKY-NEXT: cmpne16 a1, l0
|
|
; CSKY-NEXT: mvc32 a2
|
|
; CSKY-NEXT: st16.w a2, (sp, 20)
|
|
; CSKY-NEXT: ld16.w a2, (sp, 16)
|
|
; CSKY-NEXT: btsti16 a2, 0
|
|
; CSKY-NEXT: mvc32 a2
|
|
; CSKY-NEXT: ld16.w a3, (sp, 12)
|
|
; CSKY-NEXT: btsti16 a3, 0
|
|
; CSKY-NEXT: mvc32 a3
|
|
; CSKY-NEXT: ld32.w t0, (sp, 20)
|
|
; CSKY-NEXT: btsti32 t0, 0
|
|
; CSKY-NEXT: movf32 a3, a2
|
|
; CSKY-NEXT: btsti16 a3, 0
|
|
; CSKY-NEXT: mov16 a2, l1
|
|
; CSKY-NEXT: movt32 a2, a0
|
|
; CSKY-NEXT: mov16 a3, l0
|
|
; CSKY-NEXT: movt32 a3, a1
|
|
; CSKY-NEXT: st16.w a0, (sp, 24)
|
|
; CSKY-NEXT: st16.w a1, (sp, 28)
|
|
; CSKY-NEXT: st16.w l3, (sp, 4)
|
|
; CSKY-NEXT: st32.w l4, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l2
|
|
; CSKY-NEXT: addi16 a1, sp, 24
|
|
; CSKY-NEXT: jsri32 [.LCPI217_0]
|
|
; CSKY-NEXT: mov16 a2, a0
|
|
; CSKY-NEXT: ld16.w a1, (sp, 28)
|
|
; CSKY-NEXT: ld16.w a0, (sp, 24)
|
|
; CSKY-NEXT: bez32 a2, .LBB217_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 32
|
|
; CSKY-NEXT: ld32.w l4, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld32.w lr, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 16) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l3, (sp, 20) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 24
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI217_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_8
|
|
%1 = atomicrmw umin i64* %a, i64 %b release
|
|
ret i64 %1
|
|
}
|
|
|
|
define i64 @atomicrmw_umin_i64_acq_rel(i64 *%a, i64 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_umin_i64_acq_rel:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 24
|
|
; CSKY-NEXT: st16.w l3, (sp, 20) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l2, (sp, 16) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w l4, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 32
|
|
; CSKY-NEXT: mov16 l0, a2
|
|
; CSKY-NEXT: mov16 l1, a1
|
|
; CSKY-NEXT: mov16 l2, a0
|
|
; CSKY-NEXT: ld16.w a1, (a0, 4)
|
|
; CSKY-NEXT: ld16.w a0, (a0, 0)
|
|
; CSKY-NEXT: movi16 l3, 2
|
|
; CSKY-NEXT: movi32 l4, 4
|
|
; CSKY-NEXT: .LBB218_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: cmphs16 l1, a0
|
|
; CSKY-NEXT: mvc32 a2
|
|
; CSKY-NEXT: st16.w a2, (sp, 16)
|
|
; CSKY-NEXT: cmphs16 l0, a1
|
|
; CSKY-NEXT: mvc32 a2
|
|
; CSKY-NEXT: st16.w a2, (sp, 12)
|
|
; CSKY-NEXT: cmpne16 a1, l0
|
|
; CSKY-NEXT: mvc32 a2
|
|
; CSKY-NEXT: st16.w a2, (sp, 20)
|
|
; CSKY-NEXT: ld16.w a2, (sp, 16)
|
|
; CSKY-NEXT: btsti16 a2, 0
|
|
; CSKY-NEXT: mvc32 a2
|
|
; CSKY-NEXT: ld16.w a3, (sp, 12)
|
|
; CSKY-NEXT: btsti16 a3, 0
|
|
; CSKY-NEXT: mvc32 a3
|
|
; CSKY-NEXT: ld32.w t0, (sp, 20)
|
|
; CSKY-NEXT: btsti32 t0, 0
|
|
; CSKY-NEXT: movf32 a3, a2
|
|
; CSKY-NEXT: btsti16 a3, 0
|
|
; CSKY-NEXT: mov16 a2, l1
|
|
; CSKY-NEXT: movt32 a2, a0
|
|
; CSKY-NEXT: mov16 a3, l0
|
|
; CSKY-NEXT: movt32 a3, a1
|
|
; CSKY-NEXT: st16.w a0, (sp, 24)
|
|
; CSKY-NEXT: st16.w a1, (sp, 28)
|
|
; CSKY-NEXT: st16.w l3, (sp, 4)
|
|
; CSKY-NEXT: st32.w l4, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l2
|
|
; CSKY-NEXT: addi16 a1, sp, 24
|
|
; CSKY-NEXT: jsri32 [.LCPI218_0]
|
|
; CSKY-NEXT: mov16 a2, a0
|
|
; CSKY-NEXT: ld16.w a1, (sp, 28)
|
|
; CSKY-NEXT: ld16.w a0, (sp, 24)
|
|
; CSKY-NEXT: bez32 a2, .LBB218_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 32
|
|
; CSKY-NEXT: ld32.w l4, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld32.w lr, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 16) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l3, (sp, 20) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 24
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI218_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_8
|
|
%1 = atomicrmw umin i64* %a, i64 %b acq_rel
|
|
ret i64 %1
|
|
}
|
|
|
|
define i64 @atomicrmw_umin_i64_seq_cst(i64 *%a, i64 %b) nounwind {
|
|
; CSKY-LABEL: atomicrmw_umin_i64_seq_cst:
|
|
; CSKY: # %bb.0:
|
|
; CSKY-NEXT: subi16 sp, sp, 20
|
|
; CSKY-NEXT: st16.w l3, (sp, 16) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l2, (sp, 12) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l1, (sp, 8) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st16.w l0, (sp, 4) # 4-byte Folded Spill
|
|
; CSKY-NEXT: st32.w lr, (sp, 0) # 4-byte Folded Spill
|
|
; CSKY-NEXT: subi16 sp, sp, 32
|
|
; CSKY-NEXT: mov16 l0, a2
|
|
; CSKY-NEXT: mov16 l1, a1
|
|
; CSKY-NEXT: mov16 l2, a0
|
|
; CSKY-NEXT: ld16.w a1, (a0, 4)
|
|
; CSKY-NEXT: ld16.w a0, (a0, 0)
|
|
; CSKY-NEXT: movi16 l3, 5
|
|
; CSKY-NEXT: .LBB219_1: # %atomicrmw.start
|
|
; CSKY-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CSKY-NEXT: cmphs16 l1, a0
|
|
; CSKY-NEXT: mvc32 a2
|
|
; CSKY-NEXT: st16.w a2, (sp, 16)
|
|
; CSKY-NEXT: cmphs16 l0, a1
|
|
; CSKY-NEXT: mvc32 a2
|
|
; CSKY-NEXT: st16.w a2, (sp, 12)
|
|
; CSKY-NEXT: cmpne16 a1, l0
|
|
; CSKY-NEXT: mvc32 a2
|
|
; CSKY-NEXT: st16.w a2, (sp, 20)
|
|
; CSKY-NEXT: ld16.w a2, (sp, 16)
|
|
; CSKY-NEXT: btsti16 a2, 0
|
|
; CSKY-NEXT: mvc32 a2
|
|
; CSKY-NEXT: ld16.w a3, (sp, 12)
|
|
; CSKY-NEXT: btsti16 a3, 0
|
|
; CSKY-NEXT: mvc32 a3
|
|
; CSKY-NEXT: ld32.w t0, (sp, 20)
|
|
; CSKY-NEXT: btsti32 t0, 0
|
|
; CSKY-NEXT: movf32 a3, a2
|
|
; CSKY-NEXT: btsti16 a3, 0
|
|
; CSKY-NEXT: mov16 a2, l1
|
|
; CSKY-NEXT: movt32 a2, a0
|
|
; CSKY-NEXT: mov16 a3, l0
|
|
; CSKY-NEXT: movt32 a3, a1
|
|
; CSKY-NEXT: st16.w a0, (sp, 24)
|
|
; CSKY-NEXT: st16.w a1, (sp, 28)
|
|
; CSKY-NEXT: st16.w l3, (sp, 4)
|
|
; CSKY-NEXT: st16.w l3, (sp, 0)
|
|
; CSKY-NEXT: mov16 a0, l2
|
|
; CSKY-NEXT: addi16 a1, sp, 24
|
|
; CSKY-NEXT: jsri32 [.LCPI219_0]
|
|
; CSKY-NEXT: mov16 a2, a0
|
|
; CSKY-NEXT: ld16.w a1, (sp, 28)
|
|
; CSKY-NEXT: ld16.w a0, (sp, 24)
|
|
; CSKY-NEXT: bez32 a2, .LBB219_1
|
|
; CSKY-NEXT: # %bb.2: # %atomicrmw.end
|
|
; CSKY-NEXT: addi16 sp, sp, 32
|
|
; CSKY-NEXT: ld32.w lr, (sp, 0) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l0, (sp, 4) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l1, (sp, 8) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l2, (sp, 12) # 4-byte Folded Reload
|
|
; CSKY-NEXT: ld16.w l3, (sp, 16) # 4-byte Folded Reload
|
|
; CSKY-NEXT: addi16 sp, sp, 20
|
|
; CSKY-NEXT: rts16
|
|
; CSKY-NEXT: .p2align 1
|
|
; CSKY-NEXT: # %bb.3:
|
|
; CSKY-NEXT: .p2align 2
|
|
; CSKY-NEXT: .LCPI219_0:
|
|
; CSKY-NEXT: .long __atomic_compare_exchange_8
|
|
%1 = atomicrmw umin i64* %a, i64 %b seq_cst
|
|
ret i64 %1
|
|
}
|