This is a similar change to one proposed for GCC: https://inbox.sourceware.org/gcc-patches/20230414170942.1695672-1-patrick@rivosinc.com/ The changes in this patch are based on the proposal by Hans Boehm to more closely match the intended semantics for sequentially consistent stores and to allow some platforms to avoid an ABI break when switching to more performant atomic instructions. Platforms that have already compiled code using the existing mappings will also have more time to gradually replace that code in preparation of the switch. Further details can be found in the psABI proposal: https://github.com/riscv-non-isa/riscv-elf-psabi-doc/pull/378. This patch implements a mapping that is stronger than the one outlined in table A.6 of the RISC-V unprivileged spec to be future compatible with table A.7 of the same document. The related discussion can be found at https://lists.riscv.org/g/tech-unprivileged/topic/risc_v_memory_model_topics/92916241 The major change to RISC-V code generation is that we will now emit a trailing fence for sequentially consistent stores. The new code sequence should have the following form: ``` fence rw,w; s{b|h|w|d}; fence rw,rw; ``` Other changes and optimizations like using amoswap will be handled separately. Reviewed By: asb Differential Revision: https://reviews.llvm.org/D149486
1665 lines
54 KiB
LLVM
1665 lines
54 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
|
; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \
|
|
; RUN: | FileCheck -check-prefix=RV32I %s
|
|
; RUN: llc -mtriple=riscv32 -mattr=+a -verify-machineinstrs < %s \
|
|
; RUN: | FileCheck -check-prefixes=RV32IA,RV32IA-WMO %s
|
|
; RUN: llc -mtriple=riscv32 -mattr=+a,+experimental-ztso -verify-machineinstrs < %s \
|
|
; RUN: | FileCheck -check-prefixes=RV32IA,RV32IA-TSO %s
|
|
; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \
|
|
; RUN: | FileCheck -check-prefix=RV64I %s
|
|
; RUN: llc -mtriple=riscv64 -mattr=+a -verify-machineinstrs < %s \
|
|
; RUN: | FileCheck -check-prefixes=RV64IA,RV64IA-WMO %s
|
|
; RUN: llc -mtriple=riscv64 -mattr=+a,+experimental-ztso -verify-machineinstrs < %s \
|
|
; RUN: | FileCheck -check-prefixes=RV64IA,RV64IA-TSO %s
|
|
|
|
|
|
; RUN: llc -mtriple=riscv32 -mattr=+a,+seq-cst-trailing-fence -verify-machineinstrs < %s \
|
|
; RUN: | FileCheck -check-prefixes=RV32IA,RV32IA-WMO-TRAILING-FENCE %s
|
|
; RUN: llc -mtriple=riscv32 -mattr=+a,+experimental-ztso,+seq-cst-trailing-fence -verify-machineinstrs < %s \
|
|
; RUN: | FileCheck -check-prefixes=RV32IA,RV32IA-TSO-TRAILING-FENCE %s
|
|
|
|
; RUN: llc -mtriple=riscv64 -mattr=+a,+seq-cst-trailing-fence -verify-machineinstrs < %s \
|
|
; RUN: | FileCheck -check-prefixes=RV64IA,RV64IA-WMO-TRAILING-FENCE %s
|
|
; RUN: llc -mtriple=riscv64 -mattr=+a,+experimental-ztso,+seq-cst-trailing-fence -verify-machineinstrs < %s \
|
|
; RUN: | FileCheck -check-prefixes=RV64IA,RV64IA-TSO-TRAILING-FENCE %s
|
|
|
|
|
|
define i8 @atomic_load_i8_unordered(ptr %a) nounwind {
|
|
; RV32I-LABEL: atomic_load_i8_unordered:
|
|
; RV32I: # %bb.0:
|
|
; RV32I-NEXT: addi sp, sp, -16
|
|
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
|
|
; RV32I-NEXT: li a1, 0
|
|
; RV32I-NEXT: call __atomic_load_1@plt
|
|
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
|
|
; RV32I-NEXT: addi sp, sp, 16
|
|
; RV32I-NEXT: ret
|
|
;
|
|
; RV32IA-LABEL: atomic_load_i8_unordered:
|
|
; RV32IA: # %bb.0:
|
|
; RV32IA-NEXT: lb a0, 0(a0)
|
|
; RV32IA-NEXT: ret
|
|
;
|
|
; RV64I-LABEL: atomic_load_i8_unordered:
|
|
; RV64I: # %bb.0:
|
|
; RV64I-NEXT: addi sp, sp, -16
|
|
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
|
|
; RV64I-NEXT: li a1, 0
|
|
; RV64I-NEXT: call __atomic_load_1@plt
|
|
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
|
|
; RV64I-NEXT: addi sp, sp, 16
|
|
; RV64I-NEXT: ret
|
|
;
|
|
; RV64IA-LABEL: atomic_load_i8_unordered:
|
|
; RV64IA: # %bb.0:
|
|
; RV64IA-NEXT: lb a0, 0(a0)
|
|
; RV64IA-NEXT: ret
|
|
%1 = load atomic i8, ptr %a unordered, align 1
|
|
ret i8 %1
|
|
}
|
|
|
|
define i8 @atomic_load_i8_monotonic(ptr %a) nounwind {
|
|
; RV32I-LABEL: atomic_load_i8_monotonic:
|
|
; RV32I: # %bb.0:
|
|
; RV32I-NEXT: addi sp, sp, -16
|
|
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
|
|
; RV32I-NEXT: li a1, 0
|
|
; RV32I-NEXT: call __atomic_load_1@plt
|
|
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
|
|
; RV32I-NEXT: addi sp, sp, 16
|
|
; RV32I-NEXT: ret
|
|
;
|
|
; RV32IA-LABEL: atomic_load_i8_monotonic:
|
|
; RV32IA: # %bb.0:
|
|
; RV32IA-NEXT: lb a0, 0(a0)
|
|
; RV32IA-NEXT: ret
|
|
;
|
|
; RV64I-LABEL: atomic_load_i8_monotonic:
|
|
; RV64I: # %bb.0:
|
|
; RV64I-NEXT: addi sp, sp, -16
|
|
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
|
|
; RV64I-NEXT: li a1, 0
|
|
; RV64I-NEXT: call __atomic_load_1@plt
|
|
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
|
|
; RV64I-NEXT: addi sp, sp, 16
|
|
; RV64I-NEXT: ret
|
|
;
|
|
; RV64IA-LABEL: atomic_load_i8_monotonic:
|
|
; RV64IA: # %bb.0:
|
|
; RV64IA-NEXT: lb a0, 0(a0)
|
|
; RV64IA-NEXT: ret
|
|
%1 = load atomic i8, ptr %a monotonic, align 1
|
|
ret i8 %1
|
|
}
|
|
|
|
define i8 @atomic_load_i8_acquire(ptr %a) nounwind {
|
|
; RV32I-LABEL: atomic_load_i8_acquire:
|
|
; RV32I: # %bb.0:
|
|
; RV32I-NEXT: addi sp, sp, -16
|
|
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
|
|
; RV32I-NEXT: li a1, 2
|
|
; RV32I-NEXT: call __atomic_load_1@plt
|
|
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
|
|
; RV32I-NEXT: addi sp, sp, 16
|
|
; RV32I-NEXT: ret
|
|
;
|
|
; RV32IA-WMO-LABEL: atomic_load_i8_acquire:
|
|
; RV32IA-WMO: # %bb.0:
|
|
; RV32IA-WMO-NEXT: lb a0, 0(a0)
|
|
; RV32IA-WMO-NEXT: fence r, rw
|
|
; RV32IA-WMO-NEXT: ret
|
|
;
|
|
; RV32IA-TSO-LABEL: atomic_load_i8_acquire:
|
|
; RV32IA-TSO: # %bb.0:
|
|
; RV32IA-TSO-NEXT: lb a0, 0(a0)
|
|
; RV32IA-TSO-NEXT: ret
|
|
;
|
|
; RV64I-LABEL: atomic_load_i8_acquire:
|
|
; RV64I: # %bb.0:
|
|
; RV64I-NEXT: addi sp, sp, -16
|
|
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
|
|
; RV64I-NEXT: li a1, 2
|
|
; RV64I-NEXT: call __atomic_load_1@plt
|
|
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
|
|
; RV64I-NEXT: addi sp, sp, 16
|
|
; RV64I-NEXT: ret
|
|
;
|
|
; RV64IA-WMO-LABEL: atomic_load_i8_acquire:
|
|
; RV64IA-WMO: # %bb.0:
|
|
; RV64IA-WMO-NEXT: lb a0, 0(a0)
|
|
; RV64IA-WMO-NEXT: fence r, rw
|
|
; RV64IA-WMO-NEXT: ret
|
|
;
|
|
; RV64IA-TSO-LABEL: atomic_load_i8_acquire:
|
|
; RV64IA-TSO: # %bb.0:
|
|
; RV64IA-TSO-NEXT: lb a0, 0(a0)
|
|
; RV64IA-TSO-NEXT: ret
|
|
;
|
|
; RV32IA-WMO-TRAILING-FENCE-LABEL: atomic_load_i8_acquire:
|
|
; RV32IA-WMO-TRAILING-FENCE: # %bb.0:
|
|
; RV32IA-WMO-TRAILING-FENCE-NEXT: lb a0, 0(a0)
|
|
; RV32IA-WMO-TRAILING-FENCE-NEXT: fence r, rw
|
|
; RV32IA-WMO-TRAILING-FENCE-NEXT: ret
|
|
;
|
|
; RV32IA-TSO-TRAILING-FENCE-LABEL: atomic_load_i8_acquire:
|
|
; RV32IA-TSO-TRAILING-FENCE: # %bb.0:
|
|
; RV32IA-TSO-TRAILING-FENCE-NEXT: lb a0, 0(a0)
|
|
; RV32IA-TSO-TRAILING-FENCE-NEXT: ret
|
|
;
|
|
; RV64IA-WMO-TRAILING-FENCE-LABEL: atomic_load_i8_acquire:
|
|
; RV64IA-WMO-TRAILING-FENCE: # %bb.0:
|
|
; RV64IA-WMO-TRAILING-FENCE-NEXT: lb a0, 0(a0)
|
|
; RV64IA-WMO-TRAILING-FENCE-NEXT: fence r, rw
|
|
; RV64IA-WMO-TRAILING-FENCE-NEXT: ret
|
|
;
|
|
; RV64IA-TSO-TRAILING-FENCE-LABEL: atomic_load_i8_acquire:
|
|
; RV64IA-TSO-TRAILING-FENCE: # %bb.0:
|
|
; RV64IA-TSO-TRAILING-FENCE-NEXT: lb a0, 0(a0)
|
|
; RV64IA-TSO-TRAILING-FENCE-NEXT: ret
|
|
%1 = load atomic i8, ptr %a acquire, align 1
|
|
ret i8 %1
|
|
}
|
|
|
|
define i8 @atomic_load_i8_seq_cst(ptr %a) nounwind {
|
|
; RV32I-LABEL: atomic_load_i8_seq_cst:
|
|
; RV32I: # %bb.0:
|
|
; RV32I-NEXT: addi sp, sp, -16
|
|
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
|
|
; RV32I-NEXT: li a1, 5
|
|
; RV32I-NEXT: call __atomic_load_1@plt
|
|
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
|
|
; RV32I-NEXT: addi sp, sp, 16
|
|
; RV32I-NEXT: ret
|
|
;
|
|
; RV32IA-WMO-LABEL: atomic_load_i8_seq_cst:
|
|
; RV32IA-WMO: # %bb.0:
|
|
; RV32IA-WMO-NEXT: fence rw, rw
|
|
; RV32IA-WMO-NEXT: lb a0, 0(a0)
|
|
; RV32IA-WMO-NEXT: fence r, rw
|
|
; RV32IA-WMO-NEXT: ret
|
|
;
|
|
; RV32IA-TSO-LABEL: atomic_load_i8_seq_cst:
|
|
; RV32IA-TSO: # %bb.0:
|
|
; RV32IA-TSO-NEXT: fence rw, rw
|
|
; RV32IA-TSO-NEXT: lb a0, 0(a0)
|
|
; RV32IA-TSO-NEXT: ret
|
|
;
|
|
; RV64I-LABEL: atomic_load_i8_seq_cst:
|
|
; RV64I: # %bb.0:
|
|
; RV64I-NEXT: addi sp, sp, -16
|
|
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
|
|
; RV64I-NEXT: li a1, 5
|
|
; RV64I-NEXT: call __atomic_load_1@plt
|
|
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
|
|
; RV64I-NEXT: addi sp, sp, 16
|
|
; RV64I-NEXT: ret
|
|
;
|
|
; RV64IA-WMO-LABEL: atomic_load_i8_seq_cst:
|
|
; RV64IA-WMO: # %bb.0:
|
|
; RV64IA-WMO-NEXT: fence rw, rw
|
|
; RV64IA-WMO-NEXT: lb a0, 0(a0)
|
|
; RV64IA-WMO-NEXT: fence r, rw
|
|
; RV64IA-WMO-NEXT: ret
|
|
;
|
|
; RV64IA-TSO-LABEL: atomic_load_i8_seq_cst:
|
|
; RV64IA-TSO: # %bb.0:
|
|
; RV64IA-TSO-NEXT: fence rw, rw
|
|
; RV64IA-TSO-NEXT: lb a0, 0(a0)
|
|
; RV64IA-TSO-NEXT: ret
|
|
;
|
|
; RV32IA-WMO-TRAILING-FENCE-LABEL: atomic_load_i8_seq_cst:
|
|
; RV32IA-WMO-TRAILING-FENCE: # %bb.0:
|
|
; RV32IA-WMO-TRAILING-FENCE-NEXT: fence rw, rw
|
|
; RV32IA-WMO-TRAILING-FENCE-NEXT: lb a0, 0(a0)
|
|
; RV32IA-WMO-TRAILING-FENCE-NEXT: fence r, rw
|
|
; RV32IA-WMO-TRAILING-FENCE-NEXT: ret
|
|
;
|
|
; RV32IA-TSO-TRAILING-FENCE-LABEL: atomic_load_i8_seq_cst:
|
|
; RV32IA-TSO-TRAILING-FENCE: # %bb.0:
|
|
; RV32IA-TSO-TRAILING-FENCE-NEXT: fence rw, rw
|
|
; RV32IA-TSO-TRAILING-FENCE-NEXT: lb a0, 0(a0)
|
|
; RV32IA-TSO-TRAILING-FENCE-NEXT: ret
|
|
;
|
|
; RV64IA-WMO-TRAILING-FENCE-LABEL: atomic_load_i8_seq_cst:
|
|
; RV64IA-WMO-TRAILING-FENCE: # %bb.0:
|
|
; RV64IA-WMO-TRAILING-FENCE-NEXT: fence rw, rw
|
|
; RV64IA-WMO-TRAILING-FENCE-NEXT: lb a0, 0(a0)
|
|
; RV64IA-WMO-TRAILING-FENCE-NEXT: fence r, rw
|
|
; RV64IA-WMO-TRAILING-FENCE-NEXT: ret
|
|
;
|
|
; RV64IA-TSO-TRAILING-FENCE-LABEL: atomic_load_i8_seq_cst:
|
|
; RV64IA-TSO-TRAILING-FENCE: # %bb.0:
|
|
; RV64IA-TSO-TRAILING-FENCE-NEXT: fence rw, rw
|
|
; RV64IA-TSO-TRAILING-FENCE-NEXT: lb a0, 0(a0)
|
|
; RV64IA-TSO-TRAILING-FENCE-NEXT: ret
|
|
%1 = load atomic i8, ptr %a seq_cst, align 1
|
|
ret i8 %1
|
|
}
|
|
|
|
define i16 @atomic_load_i16_unordered(ptr %a) nounwind {
|
|
; RV32I-LABEL: atomic_load_i16_unordered:
|
|
; RV32I: # %bb.0:
|
|
; RV32I-NEXT: addi sp, sp, -16
|
|
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
|
|
; RV32I-NEXT: li a1, 0
|
|
; RV32I-NEXT: call __atomic_load_2@plt
|
|
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
|
|
; RV32I-NEXT: addi sp, sp, 16
|
|
; RV32I-NEXT: ret
|
|
;
|
|
; RV32IA-LABEL: atomic_load_i16_unordered:
|
|
; RV32IA: # %bb.0:
|
|
; RV32IA-NEXT: lh a0, 0(a0)
|
|
; RV32IA-NEXT: ret
|
|
;
|
|
; RV64I-LABEL: atomic_load_i16_unordered:
|
|
; RV64I: # %bb.0:
|
|
; RV64I-NEXT: addi sp, sp, -16
|
|
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
|
|
; RV64I-NEXT: li a1, 0
|
|
; RV64I-NEXT: call __atomic_load_2@plt
|
|
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
|
|
; RV64I-NEXT: addi sp, sp, 16
|
|
; RV64I-NEXT: ret
|
|
;
|
|
; RV64IA-LABEL: atomic_load_i16_unordered:
|
|
; RV64IA: # %bb.0:
|
|
; RV64IA-NEXT: lh a0, 0(a0)
|
|
; RV64IA-NEXT: ret
|
|
%1 = load atomic i16, ptr %a unordered, align 2
|
|
ret i16 %1
|
|
}
|
|
|
|
define i16 @atomic_load_i16_monotonic(ptr %a) nounwind {
|
|
; RV32I-LABEL: atomic_load_i16_monotonic:
|
|
; RV32I: # %bb.0:
|
|
; RV32I-NEXT: addi sp, sp, -16
|
|
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
|
|
; RV32I-NEXT: li a1, 0
|
|
; RV32I-NEXT: call __atomic_load_2@plt
|
|
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
|
|
; RV32I-NEXT: addi sp, sp, 16
|
|
; RV32I-NEXT: ret
|
|
;
|
|
; RV32IA-LABEL: atomic_load_i16_monotonic:
|
|
; RV32IA: # %bb.0:
|
|
; RV32IA-NEXT: lh a0, 0(a0)
|
|
; RV32IA-NEXT: ret
|
|
;
|
|
; RV64I-LABEL: atomic_load_i16_monotonic:
|
|
; RV64I: # %bb.0:
|
|
; RV64I-NEXT: addi sp, sp, -16
|
|
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
|
|
; RV64I-NEXT: li a1, 0
|
|
; RV64I-NEXT: call __atomic_load_2@plt
|
|
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
|
|
; RV64I-NEXT: addi sp, sp, 16
|
|
; RV64I-NEXT: ret
|
|
;
|
|
; RV64IA-LABEL: atomic_load_i16_monotonic:
|
|
; RV64IA: # %bb.0:
|
|
; RV64IA-NEXT: lh a0, 0(a0)
|
|
; RV64IA-NEXT: ret
|
|
%1 = load atomic i16, ptr %a monotonic, align 2
|
|
ret i16 %1
|
|
}
|
|
|
|
define i16 @atomic_load_i16_acquire(ptr %a) nounwind {
|
|
; RV32I-LABEL: atomic_load_i16_acquire:
|
|
; RV32I: # %bb.0:
|
|
; RV32I-NEXT: addi sp, sp, -16
|
|
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
|
|
; RV32I-NEXT: li a1, 2
|
|
; RV32I-NEXT: call __atomic_load_2@plt
|
|
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
|
|
; RV32I-NEXT: addi sp, sp, 16
|
|
; RV32I-NEXT: ret
|
|
;
|
|
; RV32IA-WMO-LABEL: atomic_load_i16_acquire:
|
|
; RV32IA-WMO: # %bb.0:
|
|
; RV32IA-WMO-NEXT: lh a0, 0(a0)
|
|
; RV32IA-WMO-NEXT: fence r, rw
|
|
; RV32IA-WMO-NEXT: ret
|
|
;
|
|
; RV32IA-TSO-LABEL: atomic_load_i16_acquire:
|
|
; RV32IA-TSO: # %bb.0:
|
|
; RV32IA-TSO-NEXT: lh a0, 0(a0)
|
|
; RV32IA-TSO-NEXT: ret
|
|
;
|
|
; RV64I-LABEL: atomic_load_i16_acquire:
|
|
; RV64I: # %bb.0:
|
|
; RV64I-NEXT: addi sp, sp, -16
|
|
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
|
|
; RV64I-NEXT: li a1, 2
|
|
; RV64I-NEXT: call __atomic_load_2@plt
|
|
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
|
|
; RV64I-NEXT: addi sp, sp, 16
|
|
; RV64I-NEXT: ret
|
|
;
|
|
; RV64IA-WMO-LABEL: atomic_load_i16_acquire:
|
|
; RV64IA-WMO: # %bb.0:
|
|
; RV64IA-WMO-NEXT: lh a0, 0(a0)
|
|
; RV64IA-WMO-NEXT: fence r, rw
|
|
; RV64IA-WMO-NEXT: ret
|
|
;
|
|
; RV64IA-TSO-LABEL: atomic_load_i16_acquire:
|
|
; RV64IA-TSO: # %bb.0:
|
|
; RV64IA-TSO-NEXT: lh a0, 0(a0)
|
|
; RV64IA-TSO-NEXT: ret
|
|
;
|
|
; RV32IA-WMO-TRAILING-FENCE-LABEL: atomic_load_i16_acquire:
|
|
; RV32IA-WMO-TRAILING-FENCE: # %bb.0:
|
|
; RV32IA-WMO-TRAILING-FENCE-NEXT: lh a0, 0(a0)
|
|
; RV32IA-WMO-TRAILING-FENCE-NEXT: fence r, rw
|
|
; RV32IA-WMO-TRAILING-FENCE-NEXT: ret
|
|
;
|
|
; RV32IA-TSO-TRAILING-FENCE-LABEL: atomic_load_i16_acquire:
|
|
; RV32IA-TSO-TRAILING-FENCE: # %bb.0:
|
|
; RV32IA-TSO-TRAILING-FENCE-NEXT: lh a0, 0(a0)
|
|
; RV32IA-TSO-TRAILING-FENCE-NEXT: ret
|
|
;
|
|
; RV64IA-WMO-TRAILING-FENCE-LABEL: atomic_load_i16_acquire:
|
|
; RV64IA-WMO-TRAILING-FENCE: # %bb.0:
|
|
; RV64IA-WMO-TRAILING-FENCE-NEXT: lh a0, 0(a0)
|
|
; RV64IA-WMO-TRAILING-FENCE-NEXT: fence r, rw
|
|
; RV64IA-WMO-TRAILING-FENCE-NEXT: ret
|
|
;
|
|
; RV64IA-TSO-TRAILING-FENCE-LABEL: atomic_load_i16_acquire:
|
|
; RV64IA-TSO-TRAILING-FENCE: # %bb.0:
|
|
; RV64IA-TSO-TRAILING-FENCE-NEXT: lh a0, 0(a0)
|
|
; RV64IA-TSO-TRAILING-FENCE-NEXT: ret
|
|
%1 = load atomic i16, ptr %a acquire, align 2
|
|
ret i16 %1
|
|
}
|
|
|
|
define i16 @atomic_load_i16_seq_cst(ptr %a) nounwind {
|
|
; RV32I-LABEL: atomic_load_i16_seq_cst:
|
|
; RV32I: # %bb.0:
|
|
; RV32I-NEXT: addi sp, sp, -16
|
|
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
|
|
; RV32I-NEXT: li a1, 5
|
|
; RV32I-NEXT: call __atomic_load_2@plt
|
|
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
|
|
; RV32I-NEXT: addi sp, sp, 16
|
|
; RV32I-NEXT: ret
|
|
;
|
|
; RV32IA-WMO-LABEL: atomic_load_i16_seq_cst:
|
|
; RV32IA-WMO: # %bb.0:
|
|
; RV32IA-WMO-NEXT: fence rw, rw
|
|
; RV32IA-WMO-NEXT: lh a0, 0(a0)
|
|
; RV32IA-WMO-NEXT: fence r, rw
|
|
; RV32IA-WMO-NEXT: ret
|
|
;
|
|
; RV32IA-TSO-LABEL: atomic_load_i16_seq_cst:
|
|
; RV32IA-TSO: # %bb.0:
|
|
; RV32IA-TSO-NEXT: fence rw, rw
|
|
; RV32IA-TSO-NEXT: lh a0, 0(a0)
|
|
; RV32IA-TSO-NEXT: ret
|
|
;
|
|
; RV64I-LABEL: atomic_load_i16_seq_cst:
|
|
; RV64I: # %bb.0:
|
|
; RV64I-NEXT: addi sp, sp, -16
|
|
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
|
|
; RV64I-NEXT: li a1, 5
|
|
; RV64I-NEXT: call __atomic_load_2@plt
|
|
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
|
|
; RV64I-NEXT: addi sp, sp, 16
|
|
; RV64I-NEXT: ret
|
|
;
|
|
; RV64IA-WMO-LABEL: atomic_load_i16_seq_cst:
|
|
; RV64IA-WMO: # %bb.0:
|
|
; RV64IA-WMO-NEXT: fence rw, rw
|
|
; RV64IA-WMO-NEXT: lh a0, 0(a0)
|
|
; RV64IA-WMO-NEXT: fence r, rw
|
|
; RV64IA-WMO-NEXT: ret
|
|
;
|
|
; RV64IA-TSO-LABEL: atomic_load_i16_seq_cst:
|
|
; RV64IA-TSO: # %bb.0:
|
|
; RV64IA-TSO-NEXT: fence rw, rw
|
|
; RV64IA-TSO-NEXT: lh a0, 0(a0)
|
|
; RV64IA-TSO-NEXT: ret
|
|
;
|
|
; RV32IA-WMO-TRAILING-FENCE-LABEL: atomic_load_i16_seq_cst:
|
|
; RV32IA-WMO-TRAILING-FENCE: # %bb.0:
|
|
; RV32IA-WMO-TRAILING-FENCE-NEXT: fence rw, rw
|
|
; RV32IA-WMO-TRAILING-FENCE-NEXT: lh a0, 0(a0)
|
|
; RV32IA-WMO-TRAILING-FENCE-NEXT: fence r, rw
|
|
; RV32IA-WMO-TRAILING-FENCE-NEXT: ret
|
|
;
|
|
; RV32IA-TSO-TRAILING-FENCE-LABEL: atomic_load_i16_seq_cst:
|
|
; RV32IA-TSO-TRAILING-FENCE: # %bb.0:
|
|
; RV32IA-TSO-TRAILING-FENCE-NEXT: fence rw, rw
|
|
; RV32IA-TSO-TRAILING-FENCE-NEXT: lh a0, 0(a0)
|
|
; RV32IA-TSO-TRAILING-FENCE-NEXT: ret
|
|
;
|
|
; RV64IA-WMO-TRAILING-FENCE-LABEL: atomic_load_i16_seq_cst:
|
|
; RV64IA-WMO-TRAILING-FENCE: # %bb.0:
|
|
; RV64IA-WMO-TRAILING-FENCE-NEXT: fence rw, rw
|
|
; RV64IA-WMO-TRAILING-FENCE-NEXT: lh a0, 0(a0)
|
|
; RV64IA-WMO-TRAILING-FENCE-NEXT: fence r, rw
|
|
; RV64IA-WMO-TRAILING-FENCE-NEXT: ret
|
|
;
|
|
; RV64IA-TSO-TRAILING-FENCE-LABEL: atomic_load_i16_seq_cst:
|
|
; RV64IA-TSO-TRAILING-FENCE: # %bb.0:
|
|
; RV64IA-TSO-TRAILING-FENCE-NEXT: fence rw, rw
|
|
; RV64IA-TSO-TRAILING-FENCE-NEXT: lh a0, 0(a0)
|
|
; RV64IA-TSO-TRAILING-FENCE-NEXT: ret
|
|
%1 = load atomic i16, ptr %a seq_cst, align 2
|
|
ret i16 %1
|
|
}
|
|
|
|
define i32 @atomic_load_i32_unordered(ptr %a) nounwind {
|
|
; RV32I-LABEL: atomic_load_i32_unordered:
|
|
; RV32I: # %bb.0:
|
|
; RV32I-NEXT: addi sp, sp, -16
|
|
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
|
|
; RV32I-NEXT: li a1, 0
|
|
; RV32I-NEXT: call __atomic_load_4@plt
|
|
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
|
|
; RV32I-NEXT: addi sp, sp, 16
|
|
; RV32I-NEXT: ret
|
|
;
|
|
; RV32IA-LABEL: atomic_load_i32_unordered:
|
|
; RV32IA: # %bb.0:
|
|
; RV32IA-NEXT: lw a0, 0(a0)
|
|
; RV32IA-NEXT: ret
|
|
;
|
|
; RV64I-LABEL: atomic_load_i32_unordered:
|
|
; RV64I: # %bb.0:
|
|
; RV64I-NEXT: addi sp, sp, -16
|
|
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
|
|
; RV64I-NEXT: li a1, 0
|
|
; RV64I-NEXT: call __atomic_load_4@plt
|
|
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
|
|
; RV64I-NEXT: addi sp, sp, 16
|
|
; RV64I-NEXT: ret
|
|
;
|
|
; RV64IA-LABEL: atomic_load_i32_unordered:
|
|
; RV64IA: # %bb.0:
|
|
; RV64IA-NEXT: lw a0, 0(a0)
|
|
; RV64IA-NEXT: ret
|
|
%1 = load atomic i32, ptr %a unordered, align 4
|
|
ret i32 %1
|
|
}
|
|
|
|
define i32 @atomic_load_i32_monotonic(ptr %a) nounwind {
|
|
; RV32I-LABEL: atomic_load_i32_monotonic:
|
|
; RV32I: # %bb.0:
|
|
; RV32I-NEXT: addi sp, sp, -16
|
|
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
|
|
; RV32I-NEXT: li a1, 0
|
|
; RV32I-NEXT: call __atomic_load_4@plt
|
|
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
|
|
; RV32I-NEXT: addi sp, sp, 16
|
|
; RV32I-NEXT: ret
|
|
;
|
|
; RV32IA-LABEL: atomic_load_i32_monotonic:
|
|
; RV32IA: # %bb.0:
|
|
; RV32IA-NEXT: lw a0, 0(a0)
|
|
; RV32IA-NEXT: ret
|
|
;
|
|
; RV64I-LABEL: atomic_load_i32_monotonic:
|
|
; RV64I: # %bb.0:
|
|
; RV64I-NEXT: addi sp, sp, -16
|
|
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
|
|
; RV64I-NEXT: li a1, 0
|
|
; RV64I-NEXT: call __atomic_load_4@plt
|
|
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
|
|
; RV64I-NEXT: addi sp, sp, 16
|
|
; RV64I-NEXT: ret
|
|
;
|
|
; RV64IA-LABEL: atomic_load_i32_monotonic:
|
|
; RV64IA: # %bb.0:
|
|
; RV64IA-NEXT: lw a0, 0(a0)
|
|
; RV64IA-NEXT: ret
|
|
%1 = load atomic i32, ptr %a monotonic, align 4
|
|
ret i32 %1
|
|
}
|
|
|
|
define i32 @atomic_load_i32_acquire(ptr %a) nounwind {
|
|
; RV32I-LABEL: atomic_load_i32_acquire:
|
|
; RV32I: # %bb.0:
|
|
; RV32I-NEXT: addi sp, sp, -16
|
|
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
|
|
; RV32I-NEXT: li a1, 2
|
|
; RV32I-NEXT: call __atomic_load_4@plt
|
|
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
|
|
; RV32I-NEXT: addi sp, sp, 16
|
|
; RV32I-NEXT: ret
|
|
;
|
|
; RV32IA-WMO-LABEL: atomic_load_i32_acquire:
|
|
; RV32IA-WMO: # %bb.0:
|
|
; RV32IA-WMO-NEXT: lw a0, 0(a0)
|
|
; RV32IA-WMO-NEXT: fence r, rw
|
|
; RV32IA-WMO-NEXT: ret
|
|
;
|
|
; RV32IA-TSO-LABEL: atomic_load_i32_acquire:
|
|
; RV32IA-TSO: # %bb.0:
|
|
; RV32IA-TSO-NEXT: lw a0, 0(a0)
|
|
; RV32IA-TSO-NEXT: ret
|
|
;
|
|
; RV64I-LABEL: atomic_load_i32_acquire:
|
|
; RV64I: # %bb.0:
|
|
; RV64I-NEXT: addi sp, sp, -16
|
|
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
|
|
; RV64I-NEXT: li a1, 2
|
|
; RV64I-NEXT: call __atomic_load_4@plt
|
|
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
|
|
; RV64I-NEXT: addi sp, sp, 16
|
|
; RV64I-NEXT: ret
|
|
;
|
|
; RV64IA-WMO-LABEL: atomic_load_i32_acquire:
|
|
; RV64IA-WMO: # %bb.0:
|
|
; RV64IA-WMO-NEXT: lw a0, 0(a0)
|
|
; RV64IA-WMO-NEXT: fence r, rw
|
|
; RV64IA-WMO-NEXT: ret
|
|
;
|
|
; RV64IA-TSO-LABEL: atomic_load_i32_acquire:
|
|
; RV64IA-TSO: # %bb.0:
|
|
; RV64IA-TSO-NEXT: lw a0, 0(a0)
|
|
; RV64IA-TSO-NEXT: ret
|
|
;
|
|
; RV32IA-WMO-TRAILING-FENCE-LABEL: atomic_load_i32_acquire:
|
|
; RV32IA-WMO-TRAILING-FENCE: # %bb.0:
|
|
; RV32IA-WMO-TRAILING-FENCE-NEXT: lw a0, 0(a0)
|
|
; RV32IA-WMO-TRAILING-FENCE-NEXT: fence r, rw
|
|
; RV32IA-WMO-TRAILING-FENCE-NEXT: ret
|
|
;
|
|
; RV32IA-TSO-TRAILING-FENCE-LABEL: atomic_load_i32_acquire:
|
|
; RV32IA-TSO-TRAILING-FENCE: # %bb.0:
|
|
; RV32IA-TSO-TRAILING-FENCE-NEXT: lw a0, 0(a0)
|
|
; RV32IA-TSO-TRAILING-FENCE-NEXT: ret
|
|
;
|
|
; RV64IA-WMO-TRAILING-FENCE-LABEL: atomic_load_i32_acquire:
|
|
; RV64IA-WMO-TRAILING-FENCE: # %bb.0:
|
|
; RV64IA-WMO-TRAILING-FENCE-NEXT: lw a0, 0(a0)
|
|
; RV64IA-WMO-TRAILING-FENCE-NEXT: fence r, rw
|
|
; RV64IA-WMO-TRAILING-FENCE-NEXT: ret
|
|
;
|
|
; RV64IA-TSO-TRAILING-FENCE-LABEL: atomic_load_i32_acquire:
|
|
; RV64IA-TSO-TRAILING-FENCE: # %bb.0:
|
|
; RV64IA-TSO-TRAILING-FENCE-NEXT: lw a0, 0(a0)
|
|
; RV64IA-TSO-TRAILING-FENCE-NEXT: ret
|
|
%1 = load atomic i32, ptr %a acquire, align 4
|
|
ret i32 %1
|
|
}
|
|
|
|
define i32 @atomic_load_i32_seq_cst(ptr %a) nounwind {
|
|
; RV32I-LABEL: atomic_load_i32_seq_cst:
|
|
; RV32I: # %bb.0:
|
|
; RV32I-NEXT: addi sp, sp, -16
|
|
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
|
|
; RV32I-NEXT: li a1, 5
|
|
; RV32I-NEXT: call __atomic_load_4@plt
|
|
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
|
|
; RV32I-NEXT: addi sp, sp, 16
|
|
; RV32I-NEXT: ret
|
|
;
|
|
; RV32IA-WMO-LABEL: atomic_load_i32_seq_cst:
|
|
; RV32IA-WMO: # %bb.0:
|
|
; RV32IA-WMO-NEXT: fence rw, rw
|
|
; RV32IA-WMO-NEXT: lw a0, 0(a0)
|
|
; RV32IA-WMO-NEXT: fence r, rw
|
|
; RV32IA-WMO-NEXT: ret
|
|
;
|
|
; RV32IA-TSO-LABEL: atomic_load_i32_seq_cst:
|
|
; RV32IA-TSO: # %bb.0:
|
|
; RV32IA-TSO-NEXT: fence rw, rw
|
|
; RV32IA-TSO-NEXT: lw a0, 0(a0)
|
|
; RV32IA-TSO-NEXT: ret
|
|
;
|
|
; RV64I-LABEL: atomic_load_i32_seq_cst:
|
|
; RV64I: # %bb.0:
|
|
; RV64I-NEXT: addi sp, sp, -16
|
|
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
|
|
; RV64I-NEXT: li a1, 5
|
|
; RV64I-NEXT: call __atomic_load_4@plt
|
|
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
|
|
; RV64I-NEXT: addi sp, sp, 16
|
|
; RV64I-NEXT: ret
|
|
;
|
|
; RV64IA-WMO-LABEL: atomic_load_i32_seq_cst:
|
|
; RV64IA-WMO: # %bb.0:
|
|
; RV64IA-WMO-NEXT: fence rw, rw
|
|
; RV64IA-WMO-NEXT: lw a0, 0(a0)
|
|
; RV64IA-WMO-NEXT: fence r, rw
|
|
; RV64IA-WMO-NEXT: ret
|
|
;
|
|
; RV64IA-TSO-LABEL: atomic_load_i32_seq_cst:
|
|
; RV64IA-TSO: # %bb.0:
|
|
; RV64IA-TSO-NEXT: fence rw, rw
|
|
; RV64IA-TSO-NEXT: lw a0, 0(a0)
|
|
; RV64IA-TSO-NEXT: ret
|
|
;
|
|
; RV32IA-WMO-TRAILING-FENCE-LABEL: atomic_load_i32_seq_cst:
|
|
; RV32IA-WMO-TRAILING-FENCE: # %bb.0:
|
|
; RV32IA-WMO-TRAILING-FENCE-NEXT: fence rw, rw
|
|
; RV32IA-WMO-TRAILING-FENCE-NEXT: lw a0, 0(a0)
|
|
; RV32IA-WMO-TRAILING-FENCE-NEXT: fence r, rw
|
|
; RV32IA-WMO-TRAILING-FENCE-NEXT: ret
|
|
;
|
|
; RV32IA-TSO-TRAILING-FENCE-LABEL: atomic_load_i32_seq_cst:
|
|
; RV32IA-TSO-TRAILING-FENCE: # %bb.0:
|
|
; RV32IA-TSO-TRAILING-FENCE-NEXT: fence rw, rw
|
|
; RV32IA-TSO-TRAILING-FENCE-NEXT: lw a0, 0(a0)
|
|
; RV32IA-TSO-TRAILING-FENCE-NEXT: ret
|
|
;
|
|
; RV64IA-WMO-TRAILING-FENCE-LABEL: atomic_load_i32_seq_cst:
|
|
; RV64IA-WMO-TRAILING-FENCE: # %bb.0:
|
|
; RV64IA-WMO-TRAILING-FENCE-NEXT: fence rw, rw
|
|
; RV64IA-WMO-TRAILING-FENCE-NEXT: lw a0, 0(a0)
|
|
; RV64IA-WMO-TRAILING-FENCE-NEXT: fence r, rw
|
|
; RV64IA-WMO-TRAILING-FENCE-NEXT: ret
|
|
;
|
|
; RV64IA-TSO-TRAILING-FENCE-LABEL: atomic_load_i32_seq_cst:
|
|
; RV64IA-TSO-TRAILING-FENCE: # %bb.0:
|
|
; RV64IA-TSO-TRAILING-FENCE-NEXT: fence rw, rw
|
|
; RV64IA-TSO-TRAILING-FENCE-NEXT: lw a0, 0(a0)
|
|
; RV64IA-TSO-TRAILING-FENCE-NEXT: ret
|
|
%1 = load atomic i32, ptr %a seq_cst, align 4
|
|
ret i32 %1
|
|
}
|
|
|
|
define i64 @atomic_load_i64_unordered(ptr %a) nounwind {
|
|
; RV32I-LABEL: atomic_load_i64_unordered:
|
|
; RV32I: # %bb.0:
|
|
; RV32I-NEXT: addi sp, sp, -16
|
|
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
|
|
; RV32I-NEXT: li a1, 0
|
|
; RV32I-NEXT: call __atomic_load_8@plt
|
|
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
|
|
; RV32I-NEXT: addi sp, sp, 16
|
|
; RV32I-NEXT: ret
|
|
;
|
|
; RV32IA-LABEL: atomic_load_i64_unordered:
|
|
; RV32IA: # %bb.0:
|
|
; RV32IA-NEXT: addi sp, sp, -16
|
|
; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
|
|
; RV32IA-NEXT: li a1, 0
|
|
; RV32IA-NEXT: call __atomic_load_8@plt
|
|
; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
|
|
; RV32IA-NEXT: addi sp, sp, 16
|
|
; RV32IA-NEXT: ret
|
|
;
|
|
; RV64I-LABEL: atomic_load_i64_unordered:
|
|
; RV64I: # %bb.0:
|
|
; RV64I-NEXT: addi sp, sp, -16
|
|
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
|
|
; RV64I-NEXT: li a1, 0
|
|
; RV64I-NEXT: call __atomic_load_8@plt
|
|
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
|
|
; RV64I-NEXT: addi sp, sp, 16
|
|
; RV64I-NEXT: ret
|
|
;
|
|
; RV64IA-LABEL: atomic_load_i64_unordered:
|
|
; RV64IA: # %bb.0:
|
|
; RV64IA-NEXT: ld a0, 0(a0)
|
|
; RV64IA-NEXT: ret
|
|
%1 = load atomic i64, ptr %a unordered, align 8
|
|
ret i64 %1
|
|
}
|
|
|
|
define i64 @atomic_load_i64_monotonic(ptr %a) nounwind {
|
|
; RV32I-LABEL: atomic_load_i64_monotonic:
|
|
; RV32I: # %bb.0:
|
|
; RV32I-NEXT: addi sp, sp, -16
|
|
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
|
|
; RV32I-NEXT: li a1, 0
|
|
; RV32I-NEXT: call __atomic_load_8@plt
|
|
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
|
|
; RV32I-NEXT: addi sp, sp, 16
|
|
; RV32I-NEXT: ret
|
|
;
|
|
; RV32IA-LABEL: atomic_load_i64_monotonic:
|
|
; RV32IA: # %bb.0:
|
|
; RV32IA-NEXT: addi sp, sp, -16
|
|
; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
|
|
; RV32IA-NEXT: li a1, 0
|
|
; RV32IA-NEXT: call __atomic_load_8@plt
|
|
; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
|
|
; RV32IA-NEXT: addi sp, sp, 16
|
|
; RV32IA-NEXT: ret
|
|
;
|
|
; RV64I-LABEL: atomic_load_i64_monotonic:
|
|
; RV64I: # %bb.0:
|
|
; RV64I-NEXT: addi sp, sp, -16
|
|
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
|
|
; RV64I-NEXT: li a1, 0
|
|
; RV64I-NEXT: call __atomic_load_8@plt
|
|
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
|
|
; RV64I-NEXT: addi sp, sp, 16
|
|
; RV64I-NEXT: ret
|
|
;
|
|
; RV64IA-LABEL: atomic_load_i64_monotonic:
|
|
; RV64IA: # %bb.0:
|
|
; RV64IA-NEXT: ld a0, 0(a0)
|
|
; RV64IA-NEXT: ret
|
|
%1 = load atomic i64, ptr %a monotonic, align 8
|
|
ret i64 %1
|
|
}
|
|
|
|
define i64 @atomic_load_i64_acquire(ptr %a) nounwind {
|
|
; RV32I-LABEL: atomic_load_i64_acquire:
|
|
; RV32I: # %bb.0:
|
|
; RV32I-NEXT: addi sp, sp, -16
|
|
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
|
|
; RV32I-NEXT: li a1, 2
|
|
; RV32I-NEXT: call __atomic_load_8@plt
|
|
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
|
|
; RV32I-NEXT: addi sp, sp, 16
|
|
; RV32I-NEXT: ret
|
|
;
|
|
; RV32IA-LABEL: atomic_load_i64_acquire:
|
|
; RV32IA: # %bb.0:
|
|
; RV32IA-NEXT: addi sp, sp, -16
|
|
; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
|
|
; RV32IA-NEXT: li a1, 2
|
|
; RV32IA-NEXT: call __atomic_load_8@plt
|
|
; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
|
|
; RV32IA-NEXT: addi sp, sp, 16
|
|
; RV32IA-NEXT: ret
|
|
;
|
|
; RV64I-LABEL: atomic_load_i64_acquire:
|
|
; RV64I: # %bb.0:
|
|
; RV64I-NEXT: addi sp, sp, -16
|
|
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
|
|
; RV64I-NEXT: li a1, 2
|
|
; RV64I-NEXT: call __atomic_load_8@plt
|
|
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
|
|
; RV64I-NEXT: addi sp, sp, 16
|
|
; RV64I-NEXT: ret
|
|
;
|
|
; RV64IA-WMO-LABEL: atomic_load_i64_acquire:
|
|
; RV64IA-WMO: # %bb.0:
|
|
; RV64IA-WMO-NEXT: ld a0, 0(a0)
|
|
; RV64IA-WMO-NEXT: fence r, rw
|
|
; RV64IA-WMO-NEXT: ret
|
|
;
|
|
; RV64IA-TSO-LABEL: atomic_load_i64_acquire:
|
|
; RV64IA-TSO: # %bb.0:
|
|
; RV64IA-TSO-NEXT: ld a0, 0(a0)
|
|
; RV64IA-TSO-NEXT: ret
|
|
;
|
|
; RV64IA-WMO-TRAILING-FENCE-LABEL: atomic_load_i64_acquire:
|
|
; RV64IA-WMO-TRAILING-FENCE: # %bb.0:
|
|
; RV64IA-WMO-TRAILING-FENCE-NEXT: ld a0, 0(a0)
|
|
; RV64IA-WMO-TRAILING-FENCE-NEXT: fence r, rw
|
|
; RV64IA-WMO-TRAILING-FENCE-NEXT: ret
|
|
;
|
|
; RV64IA-TSO-TRAILING-FENCE-LABEL: atomic_load_i64_acquire:
|
|
; RV64IA-TSO-TRAILING-FENCE: # %bb.0:
|
|
; RV64IA-TSO-TRAILING-FENCE-NEXT: ld a0, 0(a0)
|
|
; RV64IA-TSO-TRAILING-FENCE-NEXT: ret
|
|
%1 = load atomic i64, ptr %a acquire, align 8
|
|
ret i64 %1
|
|
}
|
|
|
|
define i64 @atomic_load_i64_seq_cst(ptr %a) nounwind {
|
|
; RV32I-LABEL: atomic_load_i64_seq_cst:
|
|
; RV32I: # %bb.0:
|
|
; RV32I-NEXT: addi sp, sp, -16
|
|
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
|
|
; RV32I-NEXT: li a1, 5
|
|
; RV32I-NEXT: call __atomic_load_8@plt
|
|
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
|
|
; RV32I-NEXT: addi sp, sp, 16
|
|
; RV32I-NEXT: ret
|
|
;
|
|
; RV32IA-LABEL: atomic_load_i64_seq_cst:
|
|
; RV32IA: # %bb.0:
|
|
; RV32IA-NEXT: addi sp, sp, -16
|
|
; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
|
|
; RV32IA-NEXT: li a1, 5
|
|
; RV32IA-NEXT: call __atomic_load_8@plt
|
|
; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
|
|
; RV32IA-NEXT: addi sp, sp, 16
|
|
; RV32IA-NEXT: ret
|
|
;
|
|
; RV64I-LABEL: atomic_load_i64_seq_cst:
|
|
; RV64I: # %bb.0:
|
|
; RV64I-NEXT: addi sp, sp, -16
|
|
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
|
|
; RV64I-NEXT: li a1, 5
|
|
; RV64I-NEXT: call __atomic_load_8@plt
|
|
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
|
|
; RV64I-NEXT: addi sp, sp, 16
|
|
; RV64I-NEXT: ret
|
|
;
|
|
; RV64IA-WMO-LABEL: atomic_load_i64_seq_cst:
|
|
; RV64IA-WMO: # %bb.0:
|
|
; RV64IA-WMO-NEXT: fence rw, rw
|
|
; RV64IA-WMO-NEXT: ld a0, 0(a0)
|
|
; RV64IA-WMO-NEXT: fence r, rw
|
|
; RV64IA-WMO-NEXT: ret
|
|
;
|
|
; RV64IA-TSO-LABEL: atomic_load_i64_seq_cst:
|
|
; RV64IA-TSO: # %bb.0:
|
|
; RV64IA-TSO-NEXT: fence rw, rw
|
|
; RV64IA-TSO-NEXT: ld a0, 0(a0)
|
|
; RV64IA-TSO-NEXT: ret
|
|
;
|
|
; RV64IA-WMO-TRAILING-FENCE-LABEL: atomic_load_i64_seq_cst:
|
|
; RV64IA-WMO-TRAILING-FENCE: # %bb.0:
|
|
; RV64IA-WMO-TRAILING-FENCE-NEXT: fence rw, rw
|
|
; RV64IA-WMO-TRAILING-FENCE-NEXT: ld a0, 0(a0)
|
|
; RV64IA-WMO-TRAILING-FENCE-NEXT: fence r, rw
|
|
; RV64IA-WMO-TRAILING-FENCE-NEXT: ret
|
|
;
|
|
; RV64IA-TSO-TRAILING-FENCE-LABEL: atomic_load_i64_seq_cst:
|
|
; RV64IA-TSO-TRAILING-FENCE: # %bb.0:
|
|
; RV64IA-TSO-TRAILING-FENCE-NEXT: fence rw, rw
|
|
; RV64IA-TSO-TRAILING-FENCE-NEXT: ld a0, 0(a0)
|
|
; RV64IA-TSO-TRAILING-FENCE-NEXT: ret
|
|
%1 = load atomic i64, ptr %a seq_cst, align 8
|
|
ret i64 %1
|
|
}
|
|
|
|
define void @atomic_store_i8_unordered(ptr %a, i8 %b) nounwind {
|
|
; RV32I-LABEL: atomic_store_i8_unordered:
|
|
; RV32I: # %bb.0:
|
|
; RV32I-NEXT: addi sp, sp, -16
|
|
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
|
|
; RV32I-NEXT: li a2, 0
|
|
; RV32I-NEXT: call __atomic_store_1@plt
|
|
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
|
|
; RV32I-NEXT: addi sp, sp, 16
|
|
; RV32I-NEXT: ret
|
|
;
|
|
; RV32IA-LABEL: atomic_store_i8_unordered:
|
|
; RV32IA: # %bb.0:
|
|
; RV32IA-NEXT: sb a1, 0(a0)
|
|
; RV32IA-NEXT: ret
|
|
;
|
|
; RV64I-LABEL: atomic_store_i8_unordered:
|
|
; RV64I: # %bb.0:
|
|
; RV64I-NEXT: addi sp, sp, -16
|
|
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
|
|
; RV64I-NEXT: li a2, 0
|
|
; RV64I-NEXT: call __atomic_store_1@plt
|
|
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
|
|
; RV64I-NEXT: addi sp, sp, 16
|
|
; RV64I-NEXT: ret
|
|
;
|
|
; RV64IA-LABEL: atomic_store_i8_unordered:
|
|
; RV64IA: # %bb.0:
|
|
; RV64IA-NEXT: sb a1, 0(a0)
|
|
; RV64IA-NEXT: ret
|
|
store atomic i8 %b, ptr %a unordered, align 1
|
|
ret void
|
|
}
|
|
|
|
define void @atomic_store_i8_monotonic(ptr %a, i8 %b) nounwind {
|
|
; RV32I-LABEL: atomic_store_i8_monotonic:
|
|
; RV32I: # %bb.0:
|
|
; RV32I-NEXT: addi sp, sp, -16
|
|
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
|
|
; RV32I-NEXT: li a2, 0
|
|
; RV32I-NEXT: call __atomic_store_1@plt
|
|
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
|
|
; RV32I-NEXT: addi sp, sp, 16
|
|
; RV32I-NEXT: ret
|
|
;
|
|
; RV32IA-LABEL: atomic_store_i8_monotonic:
|
|
; RV32IA: # %bb.0:
|
|
; RV32IA-NEXT: sb a1, 0(a0)
|
|
; RV32IA-NEXT: ret
|
|
;
|
|
; RV64I-LABEL: atomic_store_i8_monotonic:
|
|
; RV64I: # %bb.0:
|
|
; RV64I-NEXT: addi sp, sp, -16
|
|
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
|
|
; RV64I-NEXT: li a2, 0
|
|
; RV64I-NEXT: call __atomic_store_1@plt
|
|
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
|
|
; RV64I-NEXT: addi sp, sp, 16
|
|
; RV64I-NEXT: ret
|
|
;
|
|
; RV64IA-LABEL: atomic_store_i8_monotonic:
|
|
; RV64IA: # %bb.0:
|
|
; RV64IA-NEXT: sb a1, 0(a0)
|
|
; RV64IA-NEXT: ret
|
|
store atomic i8 %b, ptr %a monotonic, align 1
|
|
ret void
|
|
}
|
|
|
|
define void @atomic_store_i8_release(ptr %a, i8 %b) nounwind {
|
|
; RV32I-LABEL: atomic_store_i8_release:
|
|
; RV32I: # %bb.0:
|
|
; RV32I-NEXT: addi sp, sp, -16
|
|
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
|
|
; RV32I-NEXT: li a2, 3
|
|
; RV32I-NEXT: call __atomic_store_1@plt
|
|
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
|
|
; RV32I-NEXT: addi sp, sp, 16
|
|
; RV32I-NEXT: ret
|
|
;
|
|
; RV32IA-WMO-LABEL: atomic_store_i8_release:
|
|
; RV32IA-WMO: # %bb.0:
|
|
; RV32IA-WMO-NEXT: fence rw, w
|
|
; RV32IA-WMO-NEXT: sb a1, 0(a0)
|
|
; RV32IA-WMO-NEXT: ret
|
|
;
|
|
; RV32IA-TSO-LABEL: atomic_store_i8_release:
|
|
; RV32IA-TSO: # %bb.0:
|
|
; RV32IA-TSO-NEXT: sb a1, 0(a0)
|
|
; RV32IA-TSO-NEXT: ret
|
|
;
|
|
; RV64I-LABEL: atomic_store_i8_release:
|
|
; RV64I: # %bb.0:
|
|
; RV64I-NEXT: addi sp, sp, -16
|
|
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
|
|
; RV64I-NEXT: li a2, 3
|
|
; RV64I-NEXT: call __atomic_store_1@plt
|
|
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
|
|
; RV64I-NEXT: addi sp, sp, 16
|
|
; RV64I-NEXT: ret
|
|
;
|
|
; RV64IA-WMO-LABEL: atomic_store_i8_release:
|
|
; RV64IA-WMO: # %bb.0:
|
|
; RV64IA-WMO-NEXT: fence rw, w
|
|
; RV64IA-WMO-NEXT: sb a1, 0(a0)
|
|
; RV64IA-WMO-NEXT: ret
|
|
;
|
|
; RV64IA-TSO-LABEL: atomic_store_i8_release:
|
|
; RV64IA-TSO: # %bb.0:
|
|
; RV64IA-TSO-NEXT: sb a1, 0(a0)
|
|
; RV64IA-TSO-NEXT: ret
|
|
;
|
|
; RV32IA-WMO-TRAILING-FENCE-LABEL: atomic_store_i8_release:
|
|
; RV32IA-WMO-TRAILING-FENCE: # %bb.0:
|
|
; RV32IA-WMO-TRAILING-FENCE-NEXT: fence rw, w
|
|
; RV32IA-WMO-TRAILING-FENCE-NEXT: sb a1, 0(a0)
|
|
; RV32IA-WMO-TRAILING-FENCE-NEXT: ret
|
|
;
|
|
; RV32IA-TSO-TRAILING-FENCE-LABEL: atomic_store_i8_release:
|
|
; RV32IA-TSO-TRAILING-FENCE: # %bb.0:
|
|
; RV32IA-TSO-TRAILING-FENCE-NEXT: sb a1, 0(a0)
|
|
; RV32IA-TSO-TRAILING-FENCE-NEXT: ret
|
|
;
|
|
; RV64IA-WMO-TRAILING-FENCE-LABEL: atomic_store_i8_release:
|
|
; RV64IA-WMO-TRAILING-FENCE: # %bb.0:
|
|
; RV64IA-WMO-TRAILING-FENCE-NEXT: fence rw, w
|
|
; RV64IA-WMO-TRAILING-FENCE-NEXT: sb a1, 0(a0)
|
|
; RV64IA-WMO-TRAILING-FENCE-NEXT: ret
|
|
;
|
|
; RV64IA-TSO-TRAILING-FENCE-LABEL: atomic_store_i8_release:
|
|
; RV64IA-TSO-TRAILING-FENCE: # %bb.0:
|
|
; RV64IA-TSO-TRAILING-FENCE-NEXT: sb a1, 0(a0)
|
|
; RV64IA-TSO-TRAILING-FENCE-NEXT: ret
|
|
store atomic i8 %b, ptr %a release, align 1
|
|
ret void
|
|
}
|
|
|
|
define void @atomic_store_i8_seq_cst(ptr %a, i8 %b) nounwind {
|
|
; RV32I-LABEL: atomic_store_i8_seq_cst:
|
|
; RV32I: # %bb.0:
|
|
; RV32I-NEXT: addi sp, sp, -16
|
|
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
|
|
; RV32I-NEXT: li a2, 5
|
|
; RV32I-NEXT: call __atomic_store_1@plt
|
|
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
|
|
; RV32I-NEXT: addi sp, sp, 16
|
|
; RV32I-NEXT: ret
|
|
;
|
|
; RV32IA-WMO-LABEL: atomic_store_i8_seq_cst:
|
|
; RV32IA-WMO: # %bb.0:
|
|
; RV32IA-WMO-NEXT: fence rw, w
|
|
; RV32IA-WMO-NEXT: sb a1, 0(a0)
|
|
; RV32IA-WMO-NEXT: ret
|
|
;
|
|
; RV32IA-TSO-LABEL: atomic_store_i8_seq_cst:
|
|
; RV32IA-TSO: # %bb.0:
|
|
; RV32IA-TSO-NEXT: sb a1, 0(a0)
|
|
; RV32IA-TSO-NEXT: ret
|
|
;
|
|
; RV64I-LABEL: atomic_store_i8_seq_cst:
|
|
; RV64I: # %bb.0:
|
|
; RV64I-NEXT: addi sp, sp, -16
|
|
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
|
|
; RV64I-NEXT: li a2, 5
|
|
; RV64I-NEXT: call __atomic_store_1@plt
|
|
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
|
|
; RV64I-NEXT: addi sp, sp, 16
|
|
; RV64I-NEXT: ret
|
|
;
|
|
; RV64IA-WMO-LABEL: atomic_store_i8_seq_cst:
|
|
; RV64IA-WMO: # %bb.0:
|
|
; RV64IA-WMO-NEXT: fence rw, w
|
|
; RV64IA-WMO-NEXT: sb a1, 0(a0)
|
|
; RV64IA-WMO-NEXT: ret
|
|
;
|
|
; RV64IA-TSO-LABEL: atomic_store_i8_seq_cst:
|
|
; RV64IA-TSO: # %bb.0:
|
|
; RV64IA-TSO-NEXT: sb a1, 0(a0)
|
|
; RV64IA-TSO-NEXT: ret
|
|
;
|
|
; RV32IA-WMO-TRAILING-FENCE-LABEL: atomic_store_i8_seq_cst:
|
|
; RV32IA-WMO-TRAILING-FENCE: # %bb.0:
|
|
; RV32IA-WMO-TRAILING-FENCE-NEXT: fence rw, w
|
|
; RV32IA-WMO-TRAILING-FENCE-NEXT: sb a1, 0(a0)
|
|
; RV32IA-WMO-TRAILING-FENCE-NEXT: fence rw, rw
|
|
; RV32IA-WMO-TRAILING-FENCE-NEXT: ret
|
|
;
|
|
; RV32IA-TSO-TRAILING-FENCE-LABEL: atomic_store_i8_seq_cst:
|
|
; RV32IA-TSO-TRAILING-FENCE: # %bb.0:
|
|
; RV32IA-TSO-TRAILING-FENCE-NEXT: sb a1, 0(a0)
|
|
; RV32IA-TSO-TRAILING-FENCE-NEXT: ret
|
|
;
|
|
; RV64IA-WMO-TRAILING-FENCE-LABEL: atomic_store_i8_seq_cst:
|
|
; RV64IA-WMO-TRAILING-FENCE: # %bb.0:
|
|
; RV64IA-WMO-TRAILING-FENCE-NEXT: fence rw, w
|
|
; RV64IA-WMO-TRAILING-FENCE-NEXT: sb a1, 0(a0)
|
|
; RV64IA-WMO-TRAILING-FENCE-NEXT: fence rw, rw
|
|
; RV64IA-WMO-TRAILING-FENCE-NEXT: ret
|
|
;
|
|
; RV64IA-TSO-TRAILING-FENCE-LABEL: atomic_store_i8_seq_cst:
|
|
; RV64IA-TSO-TRAILING-FENCE: # %bb.0:
|
|
; RV64IA-TSO-TRAILING-FENCE-NEXT: sb a1, 0(a0)
|
|
; RV64IA-TSO-TRAILING-FENCE-NEXT: ret
|
|
store atomic i8 %b, ptr %a seq_cst, align 1
|
|
ret void
|
|
}
|
|
|
|
define void @atomic_store_i16_unordered(ptr %a, i16 %b) nounwind {
|
|
; RV32I-LABEL: atomic_store_i16_unordered:
|
|
; RV32I: # %bb.0:
|
|
; RV32I-NEXT: addi sp, sp, -16
|
|
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
|
|
; RV32I-NEXT: li a2, 0
|
|
; RV32I-NEXT: call __atomic_store_2@plt
|
|
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
|
|
; RV32I-NEXT: addi sp, sp, 16
|
|
; RV32I-NEXT: ret
|
|
;
|
|
; RV32IA-LABEL: atomic_store_i16_unordered:
|
|
; RV32IA: # %bb.0:
|
|
; RV32IA-NEXT: sh a1, 0(a0)
|
|
; RV32IA-NEXT: ret
|
|
;
|
|
; RV64I-LABEL: atomic_store_i16_unordered:
|
|
; RV64I: # %bb.0:
|
|
; RV64I-NEXT: addi sp, sp, -16
|
|
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
|
|
; RV64I-NEXT: li a2, 0
|
|
; RV64I-NEXT: call __atomic_store_2@plt
|
|
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
|
|
; RV64I-NEXT: addi sp, sp, 16
|
|
; RV64I-NEXT: ret
|
|
;
|
|
; RV64IA-LABEL: atomic_store_i16_unordered:
|
|
; RV64IA: # %bb.0:
|
|
; RV64IA-NEXT: sh a1, 0(a0)
|
|
; RV64IA-NEXT: ret
|
|
store atomic i16 %b, ptr %a unordered, align 2
|
|
ret void
|
|
}
|
|
|
|
define void @atomic_store_i16_monotonic(ptr %a, i16 %b) nounwind {
|
|
; RV32I-LABEL: atomic_store_i16_monotonic:
|
|
; RV32I: # %bb.0:
|
|
; RV32I-NEXT: addi sp, sp, -16
|
|
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
|
|
; RV32I-NEXT: li a2, 0
|
|
; RV32I-NEXT: call __atomic_store_2@plt
|
|
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
|
|
; RV32I-NEXT: addi sp, sp, 16
|
|
; RV32I-NEXT: ret
|
|
;
|
|
; RV32IA-LABEL: atomic_store_i16_monotonic:
|
|
; RV32IA: # %bb.0:
|
|
; RV32IA-NEXT: sh a1, 0(a0)
|
|
; RV32IA-NEXT: ret
|
|
;
|
|
; RV64I-LABEL: atomic_store_i16_monotonic:
|
|
; RV64I: # %bb.0:
|
|
; RV64I-NEXT: addi sp, sp, -16
|
|
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
|
|
; RV64I-NEXT: li a2, 0
|
|
; RV64I-NEXT: call __atomic_store_2@plt
|
|
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
|
|
; RV64I-NEXT: addi sp, sp, 16
|
|
; RV64I-NEXT: ret
|
|
;
|
|
; RV64IA-LABEL: atomic_store_i16_monotonic:
|
|
; RV64IA: # %bb.0:
|
|
; RV64IA-NEXT: sh a1, 0(a0)
|
|
; RV64IA-NEXT: ret
|
|
store atomic i16 %b, ptr %a monotonic, align 2
|
|
ret void
|
|
}
|
|
|
|
define void @atomic_store_i16_release(ptr %a, i16 %b) nounwind {
|
|
; RV32I-LABEL: atomic_store_i16_release:
|
|
; RV32I: # %bb.0:
|
|
; RV32I-NEXT: addi sp, sp, -16
|
|
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
|
|
; RV32I-NEXT: li a2, 3
|
|
; RV32I-NEXT: call __atomic_store_2@plt
|
|
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
|
|
; RV32I-NEXT: addi sp, sp, 16
|
|
; RV32I-NEXT: ret
|
|
;
|
|
; RV32IA-WMO-LABEL: atomic_store_i16_release:
|
|
; RV32IA-WMO: # %bb.0:
|
|
; RV32IA-WMO-NEXT: fence rw, w
|
|
; RV32IA-WMO-NEXT: sh a1, 0(a0)
|
|
; RV32IA-WMO-NEXT: ret
|
|
;
|
|
; RV32IA-TSO-LABEL: atomic_store_i16_release:
|
|
; RV32IA-TSO: # %bb.0:
|
|
; RV32IA-TSO-NEXT: sh a1, 0(a0)
|
|
; RV32IA-TSO-NEXT: ret
|
|
;
|
|
; RV64I-LABEL: atomic_store_i16_release:
|
|
; RV64I: # %bb.0:
|
|
; RV64I-NEXT: addi sp, sp, -16
|
|
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
|
|
; RV64I-NEXT: li a2, 3
|
|
; RV64I-NEXT: call __atomic_store_2@plt
|
|
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
|
|
; RV64I-NEXT: addi sp, sp, 16
|
|
; RV64I-NEXT: ret
|
|
;
|
|
; RV64IA-WMO-LABEL: atomic_store_i16_release:
|
|
; RV64IA-WMO: # %bb.0:
|
|
; RV64IA-WMO-NEXT: fence rw, w
|
|
; RV64IA-WMO-NEXT: sh a1, 0(a0)
|
|
; RV64IA-WMO-NEXT: ret
|
|
;
|
|
; RV64IA-TSO-LABEL: atomic_store_i16_release:
|
|
; RV64IA-TSO: # %bb.0:
|
|
; RV64IA-TSO-NEXT: sh a1, 0(a0)
|
|
; RV64IA-TSO-NEXT: ret
|
|
;
|
|
; RV32IA-WMO-TRAILING-FENCE-LABEL: atomic_store_i16_release:
|
|
; RV32IA-WMO-TRAILING-FENCE: # %bb.0:
|
|
; RV32IA-WMO-TRAILING-FENCE-NEXT: fence rw, w
|
|
; RV32IA-WMO-TRAILING-FENCE-NEXT: sh a1, 0(a0)
|
|
; RV32IA-WMO-TRAILING-FENCE-NEXT: ret
|
|
;
|
|
; RV32IA-TSO-TRAILING-FENCE-LABEL: atomic_store_i16_release:
|
|
; RV32IA-TSO-TRAILING-FENCE: # %bb.0:
|
|
; RV32IA-TSO-TRAILING-FENCE-NEXT: sh a1, 0(a0)
|
|
; RV32IA-TSO-TRAILING-FENCE-NEXT: ret
|
|
;
|
|
; RV64IA-WMO-TRAILING-FENCE-LABEL: atomic_store_i16_release:
|
|
; RV64IA-WMO-TRAILING-FENCE: # %bb.0:
|
|
; RV64IA-WMO-TRAILING-FENCE-NEXT: fence rw, w
|
|
; RV64IA-WMO-TRAILING-FENCE-NEXT: sh a1, 0(a0)
|
|
; RV64IA-WMO-TRAILING-FENCE-NEXT: ret
|
|
;
|
|
; RV64IA-TSO-TRAILING-FENCE-LABEL: atomic_store_i16_release:
|
|
; RV64IA-TSO-TRAILING-FENCE: # %bb.0:
|
|
; RV64IA-TSO-TRAILING-FENCE-NEXT: sh a1, 0(a0)
|
|
; RV64IA-TSO-TRAILING-FENCE-NEXT: ret
|
|
store atomic i16 %b, ptr %a release, align 2
|
|
ret void
|
|
}
|
|
|
|
define void @atomic_store_i16_seq_cst(ptr %a, i16 %b) nounwind {
|
|
; RV32I-LABEL: atomic_store_i16_seq_cst:
|
|
; RV32I: # %bb.0:
|
|
; RV32I-NEXT: addi sp, sp, -16
|
|
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
|
|
; RV32I-NEXT: li a2, 5
|
|
; RV32I-NEXT: call __atomic_store_2@plt
|
|
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
|
|
; RV32I-NEXT: addi sp, sp, 16
|
|
; RV32I-NEXT: ret
|
|
;
|
|
; RV32IA-WMO-LABEL: atomic_store_i16_seq_cst:
|
|
; RV32IA-WMO: # %bb.0:
|
|
; RV32IA-WMO-NEXT: fence rw, w
|
|
; RV32IA-WMO-NEXT: sh a1, 0(a0)
|
|
; RV32IA-WMO-NEXT: ret
|
|
;
|
|
; RV32IA-TSO-LABEL: atomic_store_i16_seq_cst:
|
|
; RV32IA-TSO: # %bb.0:
|
|
; RV32IA-TSO-NEXT: sh a1, 0(a0)
|
|
; RV32IA-TSO-NEXT: ret
|
|
;
|
|
; RV64I-LABEL: atomic_store_i16_seq_cst:
|
|
; RV64I: # %bb.0:
|
|
; RV64I-NEXT: addi sp, sp, -16
|
|
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
|
|
; RV64I-NEXT: li a2, 5
|
|
; RV64I-NEXT: call __atomic_store_2@plt
|
|
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
|
|
; RV64I-NEXT: addi sp, sp, 16
|
|
; RV64I-NEXT: ret
|
|
;
|
|
; RV64IA-WMO-LABEL: atomic_store_i16_seq_cst:
|
|
; RV64IA-WMO: # %bb.0:
|
|
; RV64IA-WMO-NEXT: fence rw, w
|
|
; RV64IA-WMO-NEXT: sh a1, 0(a0)
|
|
; RV64IA-WMO-NEXT: ret
|
|
;
|
|
; RV64IA-TSO-LABEL: atomic_store_i16_seq_cst:
|
|
; RV64IA-TSO: # %bb.0:
|
|
; RV64IA-TSO-NEXT: sh a1, 0(a0)
|
|
; RV64IA-TSO-NEXT: ret
|
|
;
|
|
; RV32IA-WMO-TRAILING-FENCE-LABEL: atomic_store_i16_seq_cst:
|
|
; RV32IA-WMO-TRAILING-FENCE: # %bb.0:
|
|
; RV32IA-WMO-TRAILING-FENCE-NEXT: fence rw, w
|
|
; RV32IA-WMO-TRAILING-FENCE-NEXT: sh a1, 0(a0)
|
|
; RV32IA-WMO-TRAILING-FENCE-NEXT: fence rw, rw
|
|
; RV32IA-WMO-TRAILING-FENCE-NEXT: ret
|
|
;
|
|
; RV32IA-TSO-TRAILING-FENCE-LABEL: atomic_store_i16_seq_cst:
|
|
; RV32IA-TSO-TRAILING-FENCE: # %bb.0:
|
|
; RV32IA-TSO-TRAILING-FENCE-NEXT: sh a1, 0(a0)
|
|
; RV32IA-TSO-TRAILING-FENCE-NEXT: ret
|
|
;
|
|
; RV64IA-WMO-TRAILING-FENCE-LABEL: atomic_store_i16_seq_cst:
|
|
; RV64IA-WMO-TRAILING-FENCE: # %bb.0:
|
|
; RV64IA-WMO-TRAILING-FENCE-NEXT: fence rw, w
|
|
; RV64IA-WMO-TRAILING-FENCE-NEXT: sh a1, 0(a0)
|
|
; RV64IA-WMO-TRAILING-FENCE-NEXT: fence rw, rw
|
|
; RV64IA-WMO-TRAILING-FENCE-NEXT: ret
|
|
;
|
|
; RV64IA-TSO-TRAILING-FENCE-LABEL: atomic_store_i16_seq_cst:
|
|
; RV64IA-TSO-TRAILING-FENCE: # %bb.0:
|
|
; RV64IA-TSO-TRAILING-FENCE-NEXT: sh a1, 0(a0)
|
|
; RV64IA-TSO-TRAILING-FENCE-NEXT: ret
|
|
store atomic i16 %b, ptr %a seq_cst, align 2
|
|
ret void
|
|
}
|
|
|
|
define void @atomic_store_i32_unordered(ptr %a, i32 %b) nounwind {
|
|
; RV32I-LABEL: atomic_store_i32_unordered:
|
|
; RV32I: # %bb.0:
|
|
; RV32I-NEXT: addi sp, sp, -16
|
|
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
|
|
; RV32I-NEXT: li a2, 0
|
|
; RV32I-NEXT: call __atomic_store_4@plt
|
|
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
|
|
; RV32I-NEXT: addi sp, sp, 16
|
|
; RV32I-NEXT: ret
|
|
;
|
|
; RV32IA-LABEL: atomic_store_i32_unordered:
|
|
; RV32IA: # %bb.0:
|
|
; RV32IA-NEXT: sw a1, 0(a0)
|
|
; RV32IA-NEXT: ret
|
|
;
|
|
; RV64I-LABEL: atomic_store_i32_unordered:
|
|
; RV64I: # %bb.0:
|
|
; RV64I-NEXT: addi sp, sp, -16
|
|
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
|
|
; RV64I-NEXT: li a2, 0
|
|
; RV64I-NEXT: call __atomic_store_4@plt
|
|
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
|
|
; RV64I-NEXT: addi sp, sp, 16
|
|
; RV64I-NEXT: ret
|
|
;
|
|
; RV64IA-LABEL: atomic_store_i32_unordered:
|
|
; RV64IA: # %bb.0:
|
|
; RV64IA-NEXT: sw a1, 0(a0)
|
|
; RV64IA-NEXT: ret
|
|
store atomic i32 %b, ptr %a unordered, align 4
|
|
ret void
|
|
}
|
|
|
|
define void @atomic_store_i32_monotonic(ptr %a, i32 %b) nounwind {
|
|
; RV32I-LABEL: atomic_store_i32_monotonic:
|
|
; RV32I: # %bb.0:
|
|
; RV32I-NEXT: addi sp, sp, -16
|
|
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
|
|
; RV32I-NEXT: li a2, 0
|
|
; RV32I-NEXT: call __atomic_store_4@plt
|
|
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
|
|
; RV32I-NEXT: addi sp, sp, 16
|
|
; RV32I-NEXT: ret
|
|
;
|
|
; RV32IA-LABEL: atomic_store_i32_monotonic:
|
|
; RV32IA: # %bb.0:
|
|
; RV32IA-NEXT: sw a1, 0(a0)
|
|
; RV32IA-NEXT: ret
|
|
;
|
|
; RV64I-LABEL: atomic_store_i32_monotonic:
|
|
; RV64I: # %bb.0:
|
|
; RV64I-NEXT: addi sp, sp, -16
|
|
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
|
|
; RV64I-NEXT: li a2, 0
|
|
; RV64I-NEXT: call __atomic_store_4@plt
|
|
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
|
|
; RV64I-NEXT: addi sp, sp, 16
|
|
; RV64I-NEXT: ret
|
|
;
|
|
; RV64IA-LABEL: atomic_store_i32_monotonic:
|
|
; RV64IA: # %bb.0:
|
|
; RV64IA-NEXT: sw a1, 0(a0)
|
|
; RV64IA-NEXT: ret
|
|
store atomic i32 %b, ptr %a monotonic, align 4
|
|
ret void
|
|
}
|
|
|
|
define void @atomic_store_i32_release(ptr %a, i32 %b) nounwind {
|
|
; RV32I-LABEL: atomic_store_i32_release:
|
|
; RV32I: # %bb.0:
|
|
; RV32I-NEXT: addi sp, sp, -16
|
|
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
|
|
; RV32I-NEXT: li a2, 3
|
|
; RV32I-NEXT: call __atomic_store_4@plt
|
|
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
|
|
; RV32I-NEXT: addi sp, sp, 16
|
|
; RV32I-NEXT: ret
|
|
;
|
|
; RV32IA-WMO-LABEL: atomic_store_i32_release:
|
|
; RV32IA-WMO: # %bb.0:
|
|
; RV32IA-WMO-NEXT: fence rw, w
|
|
; RV32IA-WMO-NEXT: sw a1, 0(a0)
|
|
; RV32IA-WMO-NEXT: ret
|
|
;
|
|
; RV32IA-TSO-LABEL: atomic_store_i32_release:
|
|
; RV32IA-TSO: # %bb.0:
|
|
; RV32IA-TSO-NEXT: sw a1, 0(a0)
|
|
; RV32IA-TSO-NEXT: ret
|
|
;
|
|
; RV64I-LABEL: atomic_store_i32_release:
|
|
; RV64I: # %bb.0:
|
|
; RV64I-NEXT: addi sp, sp, -16
|
|
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
|
|
; RV64I-NEXT: li a2, 3
|
|
; RV64I-NEXT: call __atomic_store_4@plt
|
|
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
|
|
; RV64I-NEXT: addi sp, sp, 16
|
|
; RV64I-NEXT: ret
|
|
;
|
|
; RV64IA-WMO-LABEL: atomic_store_i32_release:
|
|
; RV64IA-WMO: # %bb.0:
|
|
; RV64IA-WMO-NEXT: fence rw, w
|
|
; RV64IA-WMO-NEXT: sw a1, 0(a0)
|
|
; RV64IA-WMO-NEXT: ret
|
|
;
|
|
; RV64IA-TSO-LABEL: atomic_store_i32_release:
|
|
; RV64IA-TSO: # %bb.0:
|
|
; RV64IA-TSO-NEXT: sw a1, 0(a0)
|
|
; RV64IA-TSO-NEXT: ret
|
|
;
|
|
; RV32IA-WMO-TRAILING-FENCE-LABEL: atomic_store_i32_release:
|
|
; RV32IA-WMO-TRAILING-FENCE: # %bb.0:
|
|
; RV32IA-WMO-TRAILING-FENCE-NEXT: fence rw, w
|
|
; RV32IA-WMO-TRAILING-FENCE-NEXT: sw a1, 0(a0)
|
|
; RV32IA-WMO-TRAILING-FENCE-NEXT: ret
|
|
;
|
|
; RV32IA-TSO-TRAILING-FENCE-LABEL: atomic_store_i32_release:
|
|
; RV32IA-TSO-TRAILING-FENCE: # %bb.0:
|
|
; RV32IA-TSO-TRAILING-FENCE-NEXT: sw a1, 0(a0)
|
|
; RV32IA-TSO-TRAILING-FENCE-NEXT: ret
|
|
;
|
|
; RV64IA-WMO-TRAILING-FENCE-LABEL: atomic_store_i32_release:
|
|
; RV64IA-WMO-TRAILING-FENCE: # %bb.0:
|
|
; RV64IA-WMO-TRAILING-FENCE-NEXT: fence rw, w
|
|
; RV64IA-WMO-TRAILING-FENCE-NEXT: sw a1, 0(a0)
|
|
; RV64IA-WMO-TRAILING-FENCE-NEXT: ret
|
|
;
|
|
; RV64IA-TSO-TRAILING-FENCE-LABEL: atomic_store_i32_release:
|
|
; RV64IA-TSO-TRAILING-FENCE: # %bb.0:
|
|
; RV64IA-TSO-TRAILING-FENCE-NEXT: sw a1, 0(a0)
|
|
; RV64IA-TSO-TRAILING-FENCE-NEXT: ret
|
|
store atomic i32 %b, ptr %a release, align 4
|
|
ret void
|
|
}
|
|
|
|
define void @atomic_store_i32_seq_cst(ptr %a, i32 %b) nounwind {
|
|
; RV32I-LABEL: atomic_store_i32_seq_cst:
|
|
; RV32I: # %bb.0:
|
|
; RV32I-NEXT: addi sp, sp, -16
|
|
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
|
|
; RV32I-NEXT: li a2, 5
|
|
; RV32I-NEXT: call __atomic_store_4@plt
|
|
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
|
|
; RV32I-NEXT: addi sp, sp, 16
|
|
; RV32I-NEXT: ret
|
|
;
|
|
; RV32IA-WMO-LABEL: atomic_store_i32_seq_cst:
|
|
; RV32IA-WMO: # %bb.0:
|
|
; RV32IA-WMO-NEXT: fence rw, w
|
|
; RV32IA-WMO-NEXT: sw a1, 0(a0)
|
|
; RV32IA-WMO-NEXT: ret
|
|
;
|
|
; RV32IA-TSO-LABEL: atomic_store_i32_seq_cst:
|
|
; RV32IA-TSO: # %bb.0:
|
|
; RV32IA-TSO-NEXT: sw a1, 0(a0)
|
|
; RV32IA-TSO-NEXT: ret
|
|
;
|
|
; RV64I-LABEL: atomic_store_i32_seq_cst:
|
|
; RV64I: # %bb.0:
|
|
; RV64I-NEXT: addi sp, sp, -16
|
|
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
|
|
; RV64I-NEXT: li a2, 5
|
|
; RV64I-NEXT: call __atomic_store_4@plt
|
|
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
|
|
; RV64I-NEXT: addi sp, sp, 16
|
|
; RV64I-NEXT: ret
|
|
;
|
|
; RV64IA-WMO-LABEL: atomic_store_i32_seq_cst:
|
|
; RV64IA-WMO: # %bb.0:
|
|
; RV64IA-WMO-NEXT: fence rw, w
|
|
; RV64IA-WMO-NEXT: sw a1, 0(a0)
|
|
; RV64IA-WMO-NEXT: ret
|
|
;
|
|
; RV64IA-TSO-LABEL: atomic_store_i32_seq_cst:
|
|
; RV64IA-TSO: # %bb.0:
|
|
; RV64IA-TSO-NEXT: sw a1, 0(a0)
|
|
; RV64IA-TSO-NEXT: ret
|
|
;
|
|
; RV32IA-WMO-TRAILING-FENCE-LABEL: atomic_store_i32_seq_cst:
|
|
; RV32IA-WMO-TRAILING-FENCE: # %bb.0:
|
|
; RV32IA-WMO-TRAILING-FENCE-NEXT: fence rw, w
|
|
; RV32IA-WMO-TRAILING-FENCE-NEXT: sw a1, 0(a0)
|
|
; RV32IA-WMO-TRAILING-FENCE-NEXT: fence rw, rw
|
|
; RV32IA-WMO-TRAILING-FENCE-NEXT: ret
|
|
;
|
|
; RV32IA-TSO-TRAILING-FENCE-LABEL: atomic_store_i32_seq_cst:
|
|
; RV32IA-TSO-TRAILING-FENCE: # %bb.0:
|
|
; RV32IA-TSO-TRAILING-FENCE-NEXT: sw a1, 0(a0)
|
|
; RV32IA-TSO-TRAILING-FENCE-NEXT: ret
|
|
;
|
|
; RV64IA-WMO-TRAILING-FENCE-LABEL: atomic_store_i32_seq_cst:
|
|
; RV64IA-WMO-TRAILING-FENCE: # %bb.0:
|
|
; RV64IA-WMO-TRAILING-FENCE-NEXT: fence rw, w
|
|
; RV64IA-WMO-TRAILING-FENCE-NEXT: sw a1, 0(a0)
|
|
; RV64IA-WMO-TRAILING-FENCE-NEXT: fence rw, rw
|
|
; RV64IA-WMO-TRAILING-FENCE-NEXT: ret
|
|
;
|
|
; RV64IA-TSO-TRAILING-FENCE-LABEL: atomic_store_i32_seq_cst:
|
|
; RV64IA-TSO-TRAILING-FENCE: # %bb.0:
|
|
; RV64IA-TSO-TRAILING-FENCE-NEXT: sw a1, 0(a0)
|
|
; RV64IA-TSO-TRAILING-FENCE-NEXT: ret
|
|
store atomic i32 %b, ptr %a seq_cst, align 4
|
|
ret void
|
|
}
|
|
|
|
define void @atomic_store_i64_unordered(ptr %a, i64 %b) nounwind {
|
|
; RV32I-LABEL: atomic_store_i64_unordered:
|
|
; RV32I: # %bb.0:
|
|
; RV32I-NEXT: addi sp, sp, -16
|
|
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
|
|
; RV32I-NEXT: li a3, 0
|
|
; RV32I-NEXT: call __atomic_store_8@plt
|
|
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
|
|
; RV32I-NEXT: addi sp, sp, 16
|
|
; RV32I-NEXT: ret
|
|
;
|
|
; RV32IA-LABEL: atomic_store_i64_unordered:
|
|
; RV32IA: # %bb.0:
|
|
; RV32IA-NEXT: addi sp, sp, -16
|
|
; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
|
|
; RV32IA-NEXT: li a3, 0
|
|
; RV32IA-NEXT: call __atomic_store_8@plt
|
|
; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
|
|
; RV32IA-NEXT: addi sp, sp, 16
|
|
; RV32IA-NEXT: ret
|
|
;
|
|
; RV64I-LABEL: atomic_store_i64_unordered:
|
|
; RV64I: # %bb.0:
|
|
; RV64I-NEXT: addi sp, sp, -16
|
|
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
|
|
; RV64I-NEXT: li a2, 0
|
|
; RV64I-NEXT: call __atomic_store_8@plt
|
|
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
|
|
; RV64I-NEXT: addi sp, sp, 16
|
|
; RV64I-NEXT: ret
|
|
;
|
|
; RV64IA-LABEL: atomic_store_i64_unordered:
|
|
; RV64IA: # %bb.0:
|
|
; RV64IA-NEXT: sd a1, 0(a0)
|
|
; RV64IA-NEXT: ret
|
|
store atomic i64 %b, ptr %a unordered, align 8
|
|
ret void
|
|
}
|
|
|
|
define void @atomic_store_i64_monotonic(ptr %a, i64 %b) nounwind {
|
|
; RV32I-LABEL: atomic_store_i64_monotonic:
|
|
; RV32I: # %bb.0:
|
|
; RV32I-NEXT: addi sp, sp, -16
|
|
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
|
|
; RV32I-NEXT: li a3, 0
|
|
; RV32I-NEXT: call __atomic_store_8@plt
|
|
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
|
|
; RV32I-NEXT: addi sp, sp, 16
|
|
; RV32I-NEXT: ret
|
|
;
|
|
; RV32IA-LABEL: atomic_store_i64_monotonic:
|
|
; RV32IA: # %bb.0:
|
|
; RV32IA-NEXT: addi sp, sp, -16
|
|
; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
|
|
; RV32IA-NEXT: li a3, 0
|
|
; RV32IA-NEXT: call __atomic_store_8@plt
|
|
; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
|
|
; RV32IA-NEXT: addi sp, sp, 16
|
|
; RV32IA-NEXT: ret
|
|
;
|
|
; RV64I-LABEL: atomic_store_i64_monotonic:
|
|
; RV64I: # %bb.0:
|
|
; RV64I-NEXT: addi sp, sp, -16
|
|
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
|
|
; RV64I-NEXT: li a2, 0
|
|
; RV64I-NEXT: call __atomic_store_8@plt
|
|
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
|
|
; RV64I-NEXT: addi sp, sp, 16
|
|
; RV64I-NEXT: ret
|
|
;
|
|
; RV64IA-LABEL: atomic_store_i64_monotonic:
|
|
; RV64IA: # %bb.0:
|
|
; RV64IA-NEXT: sd a1, 0(a0)
|
|
; RV64IA-NEXT: ret
|
|
store atomic i64 %b, ptr %a monotonic, align 8
|
|
ret void
|
|
}
|
|
|
|
define void @atomic_store_i64_release(ptr %a, i64 %b) nounwind {
|
|
; RV32I-LABEL: atomic_store_i64_release:
|
|
; RV32I: # %bb.0:
|
|
; RV32I-NEXT: addi sp, sp, -16
|
|
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
|
|
; RV32I-NEXT: li a3, 3
|
|
; RV32I-NEXT: call __atomic_store_8@plt
|
|
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
|
|
; RV32I-NEXT: addi sp, sp, 16
|
|
; RV32I-NEXT: ret
|
|
;
|
|
; RV32IA-LABEL: atomic_store_i64_release:
|
|
; RV32IA: # %bb.0:
|
|
; RV32IA-NEXT: addi sp, sp, -16
|
|
; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
|
|
; RV32IA-NEXT: li a3, 3
|
|
; RV32IA-NEXT: call __atomic_store_8@plt
|
|
; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
|
|
; RV32IA-NEXT: addi sp, sp, 16
|
|
; RV32IA-NEXT: ret
|
|
;
|
|
; RV64I-LABEL: atomic_store_i64_release:
|
|
; RV64I: # %bb.0:
|
|
; RV64I-NEXT: addi sp, sp, -16
|
|
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
|
|
; RV64I-NEXT: li a2, 3
|
|
; RV64I-NEXT: call __atomic_store_8@plt
|
|
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
|
|
; RV64I-NEXT: addi sp, sp, 16
|
|
; RV64I-NEXT: ret
|
|
;
|
|
; RV64IA-WMO-LABEL: atomic_store_i64_release:
|
|
; RV64IA-WMO: # %bb.0:
|
|
; RV64IA-WMO-NEXT: fence rw, w
|
|
; RV64IA-WMO-NEXT: sd a1, 0(a0)
|
|
; RV64IA-WMO-NEXT: ret
|
|
;
|
|
; RV64IA-TSO-LABEL: atomic_store_i64_release:
|
|
; RV64IA-TSO: # %bb.0:
|
|
; RV64IA-TSO-NEXT: sd a1, 0(a0)
|
|
; RV64IA-TSO-NEXT: ret
|
|
;
|
|
; RV64IA-WMO-TRAILING-FENCE-LABEL: atomic_store_i64_release:
|
|
; RV64IA-WMO-TRAILING-FENCE: # %bb.0:
|
|
; RV64IA-WMO-TRAILING-FENCE-NEXT: fence rw, w
|
|
; RV64IA-WMO-TRAILING-FENCE-NEXT: sd a1, 0(a0)
|
|
; RV64IA-WMO-TRAILING-FENCE-NEXT: ret
|
|
;
|
|
; RV64IA-TSO-TRAILING-FENCE-LABEL: atomic_store_i64_release:
|
|
; RV64IA-TSO-TRAILING-FENCE: # %bb.0:
|
|
; RV64IA-TSO-TRAILING-FENCE-NEXT: sd a1, 0(a0)
|
|
; RV64IA-TSO-TRAILING-FENCE-NEXT: ret
|
|
store atomic i64 %b, ptr %a release, align 8
|
|
ret void
|
|
}
|
|
|
|
define void @atomic_store_i64_seq_cst(ptr %a, i64 %b) nounwind {
|
|
; RV32I-LABEL: atomic_store_i64_seq_cst:
|
|
; RV32I: # %bb.0:
|
|
; RV32I-NEXT: addi sp, sp, -16
|
|
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
|
|
; RV32I-NEXT: li a3, 5
|
|
; RV32I-NEXT: call __atomic_store_8@plt
|
|
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
|
|
; RV32I-NEXT: addi sp, sp, 16
|
|
; RV32I-NEXT: ret
|
|
;
|
|
; RV32IA-LABEL: atomic_store_i64_seq_cst:
|
|
; RV32IA: # %bb.0:
|
|
; RV32IA-NEXT: addi sp, sp, -16
|
|
; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
|
|
; RV32IA-NEXT: li a3, 5
|
|
; RV32IA-NEXT: call __atomic_store_8@plt
|
|
; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
|
|
; RV32IA-NEXT: addi sp, sp, 16
|
|
; RV32IA-NEXT: ret
|
|
;
|
|
; RV64I-LABEL: atomic_store_i64_seq_cst:
|
|
; RV64I: # %bb.0:
|
|
; RV64I-NEXT: addi sp, sp, -16
|
|
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
|
|
; RV64I-NEXT: li a2, 5
|
|
; RV64I-NEXT: call __atomic_store_8@plt
|
|
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
|
|
; RV64I-NEXT: addi sp, sp, 16
|
|
; RV64I-NEXT: ret
|
|
;
|
|
; RV64IA-WMO-LABEL: atomic_store_i64_seq_cst:
|
|
; RV64IA-WMO: # %bb.0:
|
|
; RV64IA-WMO-NEXT: fence rw, w
|
|
; RV64IA-WMO-NEXT: sd a1, 0(a0)
|
|
; RV64IA-WMO-NEXT: ret
|
|
;
|
|
; RV64IA-TSO-LABEL: atomic_store_i64_seq_cst:
|
|
; RV64IA-TSO: # %bb.0:
|
|
; RV64IA-TSO-NEXT: sd a1, 0(a0)
|
|
; RV64IA-TSO-NEXT: ret
|
|
;
|
|
; RV64IA-WMO-TRAILING-FENCE-LABEL: atomic_store_i64_seq_cst:
|
|
; RV64IA-WMO-TRAILING-FENCE: # %bb.0:
|
|
; RV64IA-WMO-TRAILING-FENCE-NEXT: fence rw, w
|
|
; RV64IA-WMO-TRAILING-FENCE-NEXT: sd a1, 0(a0)
|
|
; RV64IA-WMO-TRAILING-FENCE-NEXT: fence rw, rw
|
|
; RV64IA-WMO-TRAILING-FENCE-NEXT: ret
|
|
;
|
|
; RV64IA-TSO-TRAILING-FENCE-LABEL: atomic_store_i64_seq_cst:
|
|
; RV64IA-TSO-TRAILING-FENCE: # %bb.0:
|
|
; RV64IA-TSO-TRAILING-FENCE-NEXT: sd a1, 0(a0)
|
|
; RV64IA-TSO-TRAILING-FENCE-NEXT: ret
|
|
store atomic i64 %b, ptr %a seq_cst, align 8
|
|
ret void
|
|
}
|