[llvm] [AArch64] Add support for 16/32/64-bit floating-point atomic read-modify-write ops (PR #125686)
Jonathan Thackray via llvm-commits
llvm-commits at lists.llvm.org
Tue Feb 11 01:21:35 PST 2025
https://github.com/jthackray updated https://github.com/llvm/llvm-project/pull/125686
>From 74f93aa6ead8a101f81fe508664be6e86efdf9a9 Mon Sep 17 00:00:00 2001
From: Jonathan Thackray <jonathan.thackray at arm.com>
Date: Thu, 30 Jan 2025 11:57:22 +0000
Subject: [PATCH 1/3] [AArch64] Add support for 16/32/64-bit floating-point
atomic read-modify-write ops
Add support for 16/32/64-bit floating-point atomic read-modify-write
operations (FADD, FMAX, FMIN) using LDFADD, LDFMAX, LDFMIN atomic
instructions.
---
.../Target/AArch64/AArch64ISelLowering.cpp | 22 +
.../lib/Target/AArch64/AArch64InstrAtomics.td | 10 +
.../lib/Target/AArch64/AArch64InstrFormats.td | 26 +
.../AArch64/Atomics/aarch64-atomicrmw-lsfe.ll | 949 +++++++++++++++++
.../Atomics/aarch64_be-atomicrmw-lsfe.ll | 964 ++++++++++++++++++
.../CodeGen/AArch64/Atomics/generate-tests.py | 39 +-
6 files changed, 2006 insertions(+), 4 deletions(-)
create mode 100644 llvm/test/CodeGen/AArch64/Atomics/aarch64-atomicrmw-lsfe.ll
create mode 100644 llvm/test/CodeGen/AArch64/Atomics/aarch64_be-atomicrmw-lsfe.ll
diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
index 84f6d421b70f961..de7180d78c1326e 100644
--- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
+++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
@@ -974,6 +974,20 @@ AArch64TargetLowering::AArch64TargetLowering(const TargetMachine &TM,
#undef LCALLNAME5
}
+ if (Subtarget->outlineAtomics() && !Subtarget->hasLSFE()) {
+ setOperationAction(ISD::ATOMIC_LOAD_FADD, MVT::f16, LibCall);
+ setOperationAction(ISD::ATOMIC_LOAD_FADD, MVT::f32, LibCall);
+ setOperationAction(ISD::ATOMIC_LOAD_FADD, MVT::f64, LibCall);
+
+ setOperationAction(ISD::ATOMIC_LOAD_FMAX, MVT::f16, LibCall);
+ setOperationAction(ISD::ATOMIC_LOAD_FMAX, MVT::f32, LibCall);
+ setOperationAction(ISD::ATOMIC_LOAD_FMAX, MVT::f64, LibCall);
+
+ setOperationAction(ISD::ATOMIC_LOAD_FMIN, MVT::f16, LibCall);
+ setOperationAction(ISD::ATOMIC_LOAD_FMIN, MVT::f32, LibCall);
+ setOperationAction(ISD::ATOMIC_LOAD_FMIN, MVT::f64, LibCall);
+ }
+
if (Subtarget->hasLSE128()) {
// Custom lowering because i128 is not legal. Must be replaced by 2x64
// values. ATOMIC_LOAD_AND also needs op legalisation to emit LDCLRP.
@@ -27825,6 +27839,14 @@ AArch64TargetLowering::shouldExpandAtomicRMWInIR(AtomicRMWInst *AI) const {
if (CanUseLSE128)
return AtomicExpansionKind::None;
+ // Add support for LDFADD and friends
+ bool CanUseAtomicFP =
+ Subtarget->hasLSFE() && (AI->getOperation() == AtomicRMWInst::FAdd ||
+ AI->getOperation() == AtomicRMWInst::FMax ||
+ AI->getOperation() == AtomicRMWInst::FMin);
+ if (CanUseAtomicFP)
+ return AtomicExpansionKind::None;
+
// Nand is not supported in LSE.
// Leave 128 bits to LLSC or CmpXChg.
if (AI->getOperation() != AtomicRMWInst::Nand && Size < 128 &&
diff --git a/llvm/lib/Target/AArch64/AArch64InstrAtomics.td b/llvm/lib/Target/AArch64/AArch64InstrAtomics.td
index 5e6db9d007a5557..045bebf15a701ab 100644
--- a/llvm/lib/Target/AArch64/AArch64InstrAtomics.td
+++ b/llvm/lib/Target/AArch64/AArch64InstrAtomics.td
@@ -543,6 +543,16 @@ let Predicates = [HasLSE] in {
defm : LDOPregister_patterns_mod<"LDCLR", "atomic_load_and", "ORN">;
}
+defm atomic_load_fadd : binary_atomic_op_fp<atomic_load_fadd>;
+defm atomic_load_fmin : binary_atomic_op_fp<atomic_load_fmin>;
+defm atomic_load_fmax : binary_atomic_op_fp<atomic_load_fmax>;
+
+let Predicates = [HasLSFE] in {
+ defm : LDFPOPregister_patterns<"LDFADD", "atomic_load_fadd">;
+ defm : LDFPOPregister_patterns<"LDFMAX", "atomic_load_fmax">;
+ defm : LDFPOPregister_patterns<"LDFMIN", "atomic_load_fmin">;
+}
+
// v8.9a/v9.4a FEAT_LRCPC patterns
let Predicates = [HasRCPC3, HasNEON] in {
// LDAP1 loads
diff --git a/llvm/lib/Target/AArch64/AArch64InstrFormats.td b/llvm/lib/Target/AArch64/AArch64InstrFormats.td
index 3bb5d3cb4d09def..810255eabfded8b 100644
--- a/llvm/lib/Target/AArch64/AArch64InstrFormats.td
+++ b/llvm/lib/Target/AArch64/AArch64InstrFormats.td
@@ -12474,6 +12474,32 @@ multiclass LDOPregister_patterns_mod<string inst, string op, string mod> {
(i32 (!cast<Instruction>(mod#Wrr) WZR, GPR32:$Rm))>;
}
+let Predicates = [HasLSFE] in
+multiclass LDFPOPregister_patterns_ord_dag<string inst, string suffix, string op,
+ ValueType vt, dag SrcRHS, dag DstRHS> {
+ def : Pat<(!cast<PatFrag>(op#"_"#vt#"_monotonic") FPR64:$Rn, SrcRHS),
+ (!cast<Instruction>(inst # suffix) DstRHS, FPR64:$Rn)>;
+ def : Pat<(!cast<PatFrag>(op#"_"#vt#"_acquire") FPR64:$Rn, SrcRHS),
+ (!cast<Instruction>(inst # "A" # suffix) DstRHS, FPR64:$Rn)>;
+ def : Pat<(!cast<PatFrag>(op#"_"#vt#"_release") FPR64:$Rn, SrcRHS),
+ (!cast<Instruction>(inst # "L" # suffix) DstRHS, FPR64:$Rn)>;
+ def : Pat<(!cast<PatFrag>(op#"_"#vt#"_acq_rel") FPR64:$Rn, SrcRHS),
+ (!cast<Instruction>(inst # "AL" # suffix) DstRHS, FPR64:$Rn)>;
+ def : Pat<(!cast<PatFrag>(op#"_"#vt#"_seq_cst") FPR64:$Rn, SrcRHS),
+ (!cast<Instruction>(inst # "AL" # suffix) DstRHS, FPR64:$Rn)>;
+}
+
+multiclass LDFPOPregister_patterns_ord<string inst, string suffix, string op,
+ ValueType vt, dag RHS> {
+ defm : LDFPOPregister_patterns_ord_dag<inst, suffix, op, vt, RHS, RHS>;
+}
+
+multiclass LDFPOPregister_patterns<string inst, string op> {
+ defm : LDFPOPregister_patterns_ord<inst, "H", op, f16, (f16 FPR16:$Rm)>;
+ defm : LDFPOPregister_patterns_ord<inst, "S", op, f32, (f32 FPR32:$Rm)>;
+ defm : LDFPOPregister_patterns_ord<inst, "D", op, f64, (f64 FPR64:$Rm)>;
+}
+
let Predicates = [HasLSE] in
multiclass CASregister_patterns_ord_dag<string inst, string suffix, string op,
ValueType vt, dag OLD, dag NEW> {
diff --git a/llvm/test/CodeGen/AArch64/Atomics/aarch64-atomicrmw-lsfe.ll b/llvm/test/CodeGen/AArch64/Atomics/aarch64-atomicrmw-lsfe.ll
new file mode 100644
index 000000000000000..3d6ad81ea674cc5
--- /dev/null
+++ b/llvm/test/CodeGen/AArch64/Atomics/aarch64-atomicrmw-lsfe.ll
@@ -0,0 +1,949 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --filter-out "\b(sp)\b" --filter "^\s*(ld[^r]|st[^r]|swp|cas|bl|add|and|eor|orn|orr|sub|mvn|sxt|cmp|ccmp|csel|dmb)"
+; The base test file was generated by ./llvm/test/CodeGen/AArch64/Atomics/generate-tests.py
+; RUN: llc %s -o - -verify-machineinstrs -mtriple=aarch64 -mattr=+lsfe -O0 | FileCheck %s --check-prefixes=CHECK,-O0
+; RUN: llc %s -o - -verify-machineinstrs -mtriple=aarch64 -mattr=+lsfe -O1 | FileCheck %s --check-prefixes=CHECK,-O1
+
+define dso_local half @atomicrmw_fadd_half_aligned_monotonic(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fadd_half_aligned_monotonic:
+; CHECK: ldfadd h0, h0, [x0]
+ %r = atomicrmw fadd ptr %ptr, half %value monotonic, align 2
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fadd_half_aligned_acquire(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fadd_half_aligned_acquire:
+; CHECK: ldfadda h0, h0, [x0]
+ %r = atomicrmw fadd ptr %ptr, half %value acquire, align 2
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fadd_half_aligned_release(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fadd_half_aligned_release:
+; CHECK: ldfaddl h0, h0, [x0]
+ %r = atomicrmw fadd ptr %ptr, half %value release, align 2
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fadd_half_aligned_acq_rel(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fadd_half_aligned_acq_rel:
+; CHECK: ldfaddal h0, h0, [x0]
+ %r = atomicrmw fadd ptr %ptr, half %value acq_rel, align 2
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fadd_half_aligned_seq_cst(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fadd_half_aligned_seq_cst:
+; CHECK: ldfaddal h0, h0, [x0]
+ %r = atomicrmw fadd ptr %ptr, half %value seq_cst, align 2
+ ret half %r
+}
+
+define dso_local float @atomicrmw_fadd_float_aligned_monotonic(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fadd_float_aligned_monotonic:
+; CHECK: ldfadd s0, s0, [x0]
+ %r = atomicrmw fadd ptr %ptr, float %value monotonic, align 4
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fadd_float_aligned_acquire(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fadd_float_aligned_acquire:
+; CHECK: ldfadda s0, s0, [x0]
+ %r = atomicrmw fadd ptr %ptr, float %value acquire, align 4
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fadd_float_aligned_release(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fadd_float_aligned_release:
+; CHECK: ldfaddl s0, s0, [x0]
+ %r = atomicrmw fadd ptr %ptr, float %value release, align 4
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fadd_float_aligned_acq_rel(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fadd_float_aligned_acq_rel:
+; CHECK: ldfaddal s0, s0, [x0]
+ %r = atomicrmw fadd ptr %ptr, float %value acq_rel, align 4
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fadd_float_aligned_seq_cst(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fadd_float_aligned_seq_cst:
+; CHECK: ldfaddal s0, s0, [x0]
+ %r = atomicrmw fadd ptr %ptr, float %value seq_cst, align 4
+ ret float %r
+}
+
+define dso_local double @atomicrmw_fadd_double_aligned_monotonic(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fadd_double_aligned_monotonic:
+; CHECK: ldfadd d0, d0, [x0]
+ %r = atomicrmw fadd ptr %ptr, double %value monotonic, align 8
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fadd_double_aligned_acquire(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fadd_double_aligned_acquire:
+; CHECK: ldfadda d0, d0, [x0]
+ %r = atomicrmw fadd ptr %ptr, double %value acquire, align 8
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fadd_double_aligned_release(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fadd_double_aligned_release:
+; CHECK: ldfaddl d0, d0, [x0]
+ %r = atomicrmw fadd ptr %ptr, double %value release, align 8
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fadd_double_aligned_acq_rel(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fadd_double_aligned_acq_rel:
+; CHECK: ldfaddal d0, d0, [x0]
+ %r = atomicrmw fadd ptr %ptr, double %value acq_rel, align 8
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fadd_double_aligned_seq_cst(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fadd_double_aligned_seq_cst:
+; CHECK: ldfaddal d0, d0, [x0]
+ %r = atomicrmw fadd ptr %ptr, double %value seq_cst, align 8
+ ret double %r
+}
+
+define dso_local half @atomicrmw_fadd_half_unaligned_monotonic(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fadd_half_unaligned_monotonic:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fadd ptr %ptr, half %value monotonic, align 1
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fadd_half_unaligned_acquire(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fadd_half_unaligned_acquire:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fadd ptr %ptr, half %value acquire, align 1
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fadd_half_unaligned_release(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fadd_half_unaligned_release:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fadd ptr %ptr, half %value release, align 1
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fadd_half_unaligned_acq_rel(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fadd_half_unaligned_acq_rel:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fadd ptr %ptr, half %value acq_rel, align 1
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fadd_half_unaligned_seq_cst(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fadd_half_unaligned_seq_cst:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fadd ptr %ptr, half %value seq_cst, align 1
+ ret half %r
+}
+
+define dso_local float @atomicrmw_fadd_float_unaligned_monotonic(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fadd_float_unaligned_monotonic:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fadd ptr %ptr, float %value monotonic, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fadd_float_unaligned_acquire(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fadd_float_unaligned_acquire:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fadd ptr %ptr, float %value acquire, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fadd_float_unaligned_release(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fadd_float_unaligned_release:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fadd ptr %ptr, float %value release, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fadd_float_unaligned_acq_rel(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fadd_float_unaligned_acq_rel:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fadd ptr %ptr, float %value acq_rel, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fadd_float_unaligned_seq_cst(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fadd_float_unaligned_seq_cst:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fadd ptr %ptr, float %value seq_cst, align 1
+ ret float %r
+}
+
+define dso_local double @atomicrmw_fadd_double_unaligned_monotonic(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fadd_double_unaligned_monotonic:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fadd ptr %ptr, double %value monotonic, align 1
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fadd_double_unaligned_acquire(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fadd_double_unaligned_acquire:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fadd ptr %ptr, double %value acquire, align 1
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fadd_double_unaligned_release(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fadd_double_unaligned_release:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fadd ptr %ptr, double %value release, align 1
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fadd_double_unaligned_acq_rel(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fadd_double_unaligned_acq_rel:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fadd ptr %ptr, double %value acq_rel, align 1
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fadd_double_unaligned_seq_cst(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fadd_double_unaligned_seq_cst:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fadd ptr %ptr, double %value seq_cst, align 1
+ ret double %r
+}
+
+define dso_local half @atomicrmw_fsub_half_aligned_monotonic(ptr %ptr, half %value) {
+; -O0-LABEL: atomicrmw_fsub_half_aligned_monotonic:
+; -O0: ldaxrh w0, [x9]
+; -O0: cmp w0, w10, uxth
+; -O0: stlxrh w8, w11, [x9]
+; -O0: subs w8, w8, w0, uxth
+;
+; -O1-LABEL: atomicrmw_fsub_half_aligned_monotonic:
+; -O1: ldxrh w8, [x0]
+; -O1: stxrh w9, w8, [x0]
+ %r = atomicrmw fsub ptr %ptr, half %value monotonic, align 2
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fsub_half_aligned_acquire(ptr %ptr, half %value) {
+; -O0-LABEL: atomicrmw_fsub_half_aligned_acquire:
+; -O0: ldaxrh w0, [x9]
+; -O0: cmp w0, w10, uxth
+; -O0: stlxrh w8, w11, [x9]
+; -O0: subs w8, w8, w0, uxth
+;
+; -O1-LABEL: atomicrmw_fsub_half_aligned_acquire:
+; -O1: ldaxrh w8, [x0]
+; -O1: stxrh w9, w8, [x0]
+ %r = atomicrmw fsub ptr %ptr, half %value acquire, align 2
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fsub_half_aligned_release(ptr %ptr, half %value) {
+; -O0-LABEL: atomicrmw_fsub_half_aligned_release:
+; -O0: ldaxrh w0, [x9]
+; -O0: cmp w0, w10, uxth
+; -O0: stlxrh w8, w11, [x9]
+; -O0: subs w8, w8, w0, uxth
+;
+; -O1-LABEL: atomicrmw_fsub_half_aligned_release:
+; -O1: ldxrh w8, [x0]
+; -O1: stlxrh w9, w8, [x0]
+ %r = atomicrmw fsub ptr %ptr, half %value release, align 2
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fsub_half_aligned_acq_rel(ptr %ptr, half %value) {
+; -O0-LABEL: atomicrmw_fsub_half_aligned_acq_rel:
+; -O0: ldaxrh w0, [x9]
+; -O0: cmp w0, w10, uxth
+; -O0: stlxrh w8, w11, [x9]
+; -O0: subs w8, w8, w0, uxth
+;
+; -O1-LABEL: atomicrmw_fsub_half_aligned_acq_rel:
+; -O1: ldaxrh w8, [x0]
+; -O1: stlxrh w9, w8, [x0]
+ %r = atomicrmw fsub ptr %ptr, half %value acq_rel, align 2
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fsub_half_aligned_seq_cst(ptr %ptr, half %value) {
+; -O0-LABEL: atomicrmw_fsub_half_aligned_seq_cst:
+; -O0: ldaxrh w0, [x9]
+; -O0: cmp w0, w10, uxth
+; -O0: stlxrh w8, w11, [x9]
+; -O0: subs w8, w8, w0, uxth
+;
+; -O1-LABEL: atomicrmw_fsub_half_aligned_seq_cst:
+; -O1: ldaxrh w8, [x0]
+; -O1: stlxrh w9, w8, [x0]
+ %r = atomicrmw fsub ptr %ptr, half %value seq_cst, align 2
+ ret half %r
+}
+
+define dso_local float @atomicrmw_fsub_float_aligned_monotonic(ptr %ptr, float %value) {
+; -O0-LABEL: atomicrmw_fsub_float_aligned_monotonic:
+; -O0: ldaxr w0, [x9]
+; -O0: cmp w0, w10
+; -O0: stlxr w8, w11, [x9]
+; -O0: subs w8, w0, w8
+;
+; -O1-LABEL: atomicrmw_fsub_float_aligned_monotonic:
+; -O1: ldxr w8, [x0]
+; -O1: stxr w9, w8, [x0]
+ %r = atomicrmw fsub ptr %ptr, float %value monotonic, align 4
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fsub_float_aligned_acquire(ptr %ptr, float %value) {
+; -O0-LABEL: atomicrmw_fsub_float_aligned_acquire:
+; -O0: ldaxr w0, [x9]
+; -O0: cmp w0, w10
+; -O0: stlxr w8, w11, [x9]
+; -O0: subs w8, w0, w8
+;
+; -O1-LABEL: atomicrmw_fsub_float_aligned_acquire:
+; -O1: ldaxr w8, [x0]
+; -O1: stxr w9, w8, [x0]
+ %r = atomicrmw fsub ptr %ptr, float %value acquire, align 4
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fsub_float_aligned_release(ptr %ptr, float %value) {
+; -O0-LABEL: atomicrmw_fsub_float_aligned_release:
+; -O0: ldaxr w0, [x9]
+; -O0: cmp w0, w10
+; -O0: stlxr w8, w11, [x9]
+; -O0: subs w8, w0, w8
+;
+; -O1-LABEL: atomicrmw_fsub_float_aligned_release:
+; -O1: ldxr w8, [x0]
+; -O1: stlxr w9, w8, [x0]
+ %r = atomicrmw fsub ptr %ptr, float %value release, align 4
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fsub_float_aligned_acq_rel(ptr %ptr, float %value) {
+; -O0-LABEL: atomicrmw_fsub_float_aligned_acq_rel:
+; -O0: ldaxr w0, [x9]
+; -O0: cmp w0, w10
+; -O0: stlxr w8, w11, [x9]
+; -O0: subs w8, w0, w8
+;
+; -O1-LABEL: atomicrmw_fsub_float_aligned_acq_rel:
+; -O1: ldaxr w8, [x0]
+; -O1: stlxr w9, w8, [x0]
+ %r = atomicrmw fsub ptr %ptr, float %value acq_rel, align 4
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fsub_float_aligned_seq_cst(ptr %ptr, float %value) {
+; -O0-LABEL: atomicrmw_fsub_float_aligned_seq_cst:
+; -O0: ldaxr w0, [x9]
+; -O0: cmp w0, w10
+; -O0: stlxr w8, w11, [x9]
+; -O0: subs w8, w0, w8
+;
+; -O1-LABEL: atomicrmw_fsub_float_aligned_seq_cst:
+; -O1: ldaxr w8, [x0]
+; -O1: stlxr w9, w8, [x0]
+ %r = atomicrmw fsub ptr %ptr, float %value seq_cst, align 4
+ ret float %r
+}
+
+define dso_local double @atomicrmw_fsub_double_aligned_monotonic(ptr %ptr, double %value) {
+; -O0-LABEL: atomicrmw_fsub_double_aligned_monotonic:
+; -O0: ldaxr x0, [x9]
+; -O0: cmp x0, x10
+; -O0: stlxr w8, x11, [x9]
+; -O0: subs x8, x0, x8
+;
+; -O1-LABEL: atomicrmw_fsub_double_aligned_monotonic:
+; -O1: ldxr x8, [x0]
+; -O1: stxr w9, x8, [x0]
+ %r = atomicrmw fsub ptr %ptr, double %value monotonic, align 8
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fsub_double_aligned_acquire(ptr %ptr, double %value) {
+; -O0-LABEL: atomicrmw_fsub_double_aligned_acquire:
+; -O0: ldaxr x0, [x9]
+; -O0: cmp x0, x10
+; -O0: stlxr w8, x11, [x9]
+; -O0: subs x8, x0, x8
+;
+; -O1-LABEL: atomicrmw_fsub_double_aligned_acquire:
+; -O1: ldaxr x8, [x0]
+; -O1: stxr w9, x8, [x0]
+ %r = atomicrmw fsub ptr %ptr, double %value acquire, align 8
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fsub_double_aligned_release(ptr %ptr, double %value) {
+; -O0-LABEL: atomicrmw_fsub_double_aligned_release:
+; -O0: ldaxr x0, [x9]
+; -O0: cmp x0, x10
+; -O0: stlxr w8, x11, [x9]
+; -O0: subs x8, x0, x8
+;
+; -O1-LABEL: atomicrmw_fsub_double_aligned_release:
+; -O1: ldxr x8, [x0]
+; -O1: stlxr w9, x8, [x0]
+ %r = atomicrmw fsub ptr %ptr, double %value release, align 8
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fsub_double_aligned_acq_rel(ptr %ptr, double %value) {
+; -O0-LABEL: atomicrmw_fsub_double_aligned_acq_rel:
+; -O0: ldaxr x0, [x9]
+; -O0: cmp x0, x10
+; -O0: stlxr w8, x11, [x9]
+; -O0: subs x8, x0, x8
+;
+; -O1-LABEL: atomicrmw_fsub_double_aligned_acq_rel:
+; -O1: ldaxr x8, [x0]
+; -O1: stlxr w9, x8, [x0]
+ %r = atomicrmw fsub ptr %ptr, double %value acq_rel, align 8
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fsub_double_aligned_seq_cst(ptr %ptr, double %value) {
+; -O0-LABEL: atomicrmw_fsub_double_aligned_seq_cst:
+; -O0: ldaxr x0, [x9]
+; -O0: cmp x0, x10
+; -O0: stlxr w8, x11, [x9]
+; -O0: subs x8, x0, x8
+;
+; -O1-LABEL: atomicrmw_fsub_double_aligned_seq_cst:
+; -O1: ldaxr x8, [x0]
+; -O1: stlxr w9, x8, [x0]
+ %r = atomicrmw fsub ptr %ptr, double %value seq_cst, align 8
+ ret double %r
+}
+
+define dso_local half @atomicrmw_fsub_half_unaligned_monotonic(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fsub_half_unaligned_monotonic:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fsub ptr %ptr, half %value monotonic, align 1
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fsub_half_unaligned_acquire(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fsub_half_unaligned_acquire:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fsub ptr %ptr, half %value acquire, align 1
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fsub_half_unaligned_release(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fsub_half_unaligned_release:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fsub ptr %ptr, half %value release, align 1
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fsub_half_unaligned_acq_rel(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fsub_half_unaligned_acq_rel:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fsub ptr %ptr, half %value acq_rel, align 1
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fsub_half_unaligned_seq_cst(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fsub_half_unaligned_seq_cst:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fsub ptr %ptr, half %value seq_cst, align 1
+ ret half %r
+}
+
+define dso_local float @atomicrmw_fsub_float_unaligned_monotonic(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fsub_float_unaligned_monotonic:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fsub ptr %ptr, float %value monotonic, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fsub_float_unaligned_acquire(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fsub_float_unaligned_acquire:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fsub ptr %ptr, float %value acquire, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fsub_float_unaligned_release(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fsub_float_unaligned_release:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fsub ptr %ptr, float %value release, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fsub_float_unaligned_acq_rel(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fsub_float_unaligned_acq_rel:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fsub ptr %ptr, float %value acq_rel, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fsub_float_unaligned_seq_cst(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fsub_float_unaligned_seq_cst:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fsub ptr %ptr, float %value seq_cst, align 1
+ ret float %r
+}
+
+define dso_local double @atomicrmw_fsub_double_unaligned_monotonic(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fsub_double_unaligned_monotonic:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fsub ptr %ptr, double %value monotonic, align 1
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fsub_double_unaligned_acquire(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fsub_double_unaligned_acquire:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fsub ptr %ptr, double %value acquire, align 1
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fsub_double_unaligned_release(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fsub_double_unaligned_release:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fsub ptr %ptr, double %value release, align 1
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fsub_double_unaligned_acq_rel(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fsub_double_unaligned_acq_rel:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fsub ptr %ptr, double %value acq_rel, align 1
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fsub_double_unaligned_seq_cst(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fsub_double_unaligned_seq_cst:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fsub ptr %ptr, double %value seq_cst, align 1
+ ret double %r
+}
+
+define dso_local half @atomicrmw_fmax_half_aligned_monotonic(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fmax_half_aligned_monotonic:
+; CHECK: ldfmax h0, h0, [x0]
+ %r = atomicrmw fmax ptr %ptr, half %value monotonic, align 2
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fmax_half_aligned_acquire(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fmax_half_aligned_acquire:
+; CHECK: ldfmaxa h0, h0, [x0]
+ %r = atomicrmw fmax ptr %ptr, half %value acquire, align 2
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fmax_half_aligned_release(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fmax_half_aligned_release:
+; CHECK: ldfmaxl h0, h0, [x0]
+ %r = atomicrmw fmax ptr %ptr, half %value release, align 2
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fmax_half_aligned_acq_rel(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fmax_half_aligned_acq_rel:
+; CHECK: ldfmaxal h0, h0, [x0]
+ %r = atomicrmw fmax ptr %ptr, half %value acq_rel, align 2
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fmax_half_aligned_seq_cst(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fmax_half_aligned_seq_cst:
+; CHECK: ldfmaxal h0, h0, [x0]
+ %r = atomicrmw fmax ptr %ptr, half %value seq_cst, align 2
+ ret half %r
+}
+
+define dso_local float @atomicrmw_fmax_float_aligned_monotonic(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fmax_float_aligned_monotonic:
+; CHECK: ldfmax s0, s0, [x0]
+ %r = atomicrmw fmax ptr %ptr, float %value monotonic, align 4
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fmax_float_aligned_acquire(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fmax_float_aligned_acquire:
+; CHECK: ldfmaxa s0, s0, [x0]
+ %r = atomicrmw fmax ptr %ptr, float %value acquire, align 4
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fmax_float_aligned_release(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fmax_float_aligned_release:
+; CHECK: ldfmaxl s0, s0, [x0]
+ %r = atomicrmw fmax ptr %ptr, float %value release, align 4
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fmax_float_aligned_acq_rel(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fmax_float_aligned_acq_rel:
+; CHECK: ldfmaxal s0, s0, [x0]
+ %r = atomicrmw fmax ptr %ptr, float %value acq_rel, align 4
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fmax_float_aligned_seq_cst(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fmax_float_aligned_seq_cst:
+; CHECK: ldfmaxal s0, s0, [x0]
+ %r = atomicrmw fmax ptr %ptr, float %value seq_cst, align 4
+ ret float %r
+}
+
+define dso_local double @atomicrmw_fmax_double_aligned_monotonic(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fmax_double_aligned_monotonic:
+; CHECK: ldfmax d0, d0, [x0]
+ %r = atomicrmw fmax ptr %ptr, double %value monotonic, align 8
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fmax_double_aligned_acquire(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fmax_double_aligned_acquire:
+; CHECK: ldfmaxa d0, d0, [x0]
+ %r = atomicrmw fmax ptr %ptr, double %value acquire, align 8
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fmax_double_aligned_release(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fmax_double_aligned_release:
+; CHECK: ldfmaxl d0, d0, [x0]
+ %r = atomicrmw fmax ptr %ptr, double %value release, align 8
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fmax_double_aligned_acq_rel(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fmax_double_aligned_acq_rel:
+; CHECK: ldfmaxal d0, d0, [x0]
+ %r = atomicrmw fmax ptr %ptr, double %value acq_rel, align 8
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fmax_double_aligned_seq_cst(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fmax_double_aligned_seq_cst:
+; CHECK: ldfmaxal d0, d0, [x0]
+ %r = atomicrmw fmax ptr %ptr, double %value seq_cst, align 8
+ ret double %r
+}
+
+define dso_local half @atomicrmw_fmax_half_unaligned_monotonic(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fmax_half_unaligned_monotonic:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fmax ptr %ptr, half %value monotonic, align 1
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fmax_half_unaligned_acquire(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fmax_half_unaligned_acquire:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fmax ptr %ptr, half %value acquire, align 1
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fmax_half_unaligned_release(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fmax_half_unaligned_release:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fmax ptr %ptr, half %value release, align 1
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fmax_half_unaligned_acq_rel(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fmax_half_unaligned_acq_rel:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fmax ptr %ptr, half %value acq_rel, align 1
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fmax_half_unaligned_seq_cst(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fmax_half_unaligned_seq_cst:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fmax ptr %ptr, half %value seq_cst, align 1
+ ret half %r
+}
+
+define dso_local float @atomicrmw_fmax_float_unaligned_monotonic(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fmax_float_unaligned_monotonic:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fmax ptr %ptr, float %value monotonic, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fmax_float_unaligned_acquire(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fmax_float_unaligned_acquire:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fmax ptr %ptr, float %value acquire, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fmax_float_unaligned_release(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fmax_float_unaligned_release:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fmax ptr %ptr, float %value release, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fmax_float_unaligned_acq_rel(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fmax_float_unaligned_acq_rel:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fmax ptr %ptr, float %value acq_rel, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fmax_float_unaligned_seq_cst(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fmax_float_unaligned_seq_cst:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fmax ptr %ptr, float %value seq_cst, align 1
+ ret float %r
+}
+
+define dso_local double @atomicrmw_fmax_double_unaligned_monotonic(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fmax_double_unaligned_monotonic:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fmax ptr %ptr, double %value monotonic, align 1
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fmax_double_unaligned_acquire(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fmax_double_unaligned_acquire:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fmax ptr %ptr, double %value acquire, align 1
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fmax_double_unaligned_release(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fmax_double_unaligned_release:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fmax ptr %ptr, double %value release, align 1
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fmax_double_unaligned_acq_rel(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fmax_double_unaligned_acq_rel:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fmax ptr %ptr, double %value acq_rel, align 1
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fmax_double_unaligned_seq_cst(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fmax_double_unaligned_seq_cst:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fmax ptr %ptr, double %value seq_cst, align 1
+ ret double %r
+}
+
+define dso_local half @atomicrmw_fmin_half_aligned_monotonic(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fmin_half_aligned_monotonic:
+; CHECK: ldfmin h0, h0, [x0]
+ %r = atomicrmw fmin ptr %ptr, half %value monotonic, align 2
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fmin_half_aligned_acquire(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fmin_half_aligned_acquire:
+; CHECK: ldfmina h0, h0, [x0]
+ %r = atomicrmw fmin ptr %ptr, half %value acquire, align 2
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fmin_half_aligned_release(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fmin_half_aligned_release:
+; CHECK: ldfminl h0, h0, [x0]
+ %r = atomicrmw fmin ptr %ptr, half %value release, align 2
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fmin_half_aligned_acq_rel(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fmin_half_aligned_acq_rel:
+; CHECK: ldfminal h0, h0, [x0]
+ %r = atomicrmw fmin ptr %ptr, half %value acq_rel, align 2
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fmin_half_aligned_seq_cst(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fmin_half_aligned_seq_cst:
+; CHECK: ldfminal h0, h0, [x0]
+ %r = atomicrmw fmin ptr %ptr, half %value seq_cst, align 2
+ ret half %r
+}
+
+define dso_local float @atomicrmw_fmin_float_aligned_monotonic(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fmin_float_aligned_monotonic:
+; CHECK: ldfmin s0, s0, [x0]
+ %r = atomicrmw fmin ptr %ptr, float %value monotonic, align 4
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fmin_float_aligned_acquire(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fmin_float_aligned_acquire:
+; CHECK: ldfmina s0, s0, [x0]
+ %r = atomicrmw fmin ptr %ptr, float %value acquire, align 4
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fmin_float_aligned_release(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fmin_float_aligned_release:
+; CHECK: ldfminl s0, s0, [x0]
+ %r = atomicrmw fmin ptr %ptr, float %value release, align 4
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fmin_float_aligned_acq_rel(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fmin_float_aligned_acq_rel:
+; CHECK: ldfminal s0, s0, [x0]
+ %r = atomicrmw fmin ptr %ptr, float %value acq_rel, align 4
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fmin_float_aligned_seq_cst(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fmin_float_aligned_seq_cst:
+; CHECK: ldfminal s0, s0, [x0]
+ %r = atomicrmw fmin ptr %ptr, float %value seq_cst, align 4
+ ret float %r
+}
+
+define dso_local double @atomicrmw_fmin_double_aligned_monotonic(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fmin_double_aligned_monotonic:
+; CHECK: ldfmin d0, d0, [x0]
+ %r = atomicrmw fmin ptr %ptr, double %value monotonic, align 8
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fmin_double_aligned_acquire(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fmin_double_aligned_acquire:
+; CHECK: ldfmina d0, d0, [x0]
+ %r = atomicrmw fmin ptr %ptr, double %value acquire, align 8
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fmin_double_aligned_release(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fmin_double_aligned_release:
+; CHECK: ldfminl d0, d0, [x0]
+ %r = atomicrmw fmin ptr %ptr, double %value release, align 8
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fmin_double_aligned_acq_rel(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fmin_double_aligned_acq_rel:
+; CHECK: ldfminal d0, d0, [x0]
+ %r = atomicrmw fmin ptr %ptr, double %value acq_rel, align 8
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fmin_double_aligned_seq_cst(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fmin_double_aligned_seq_cst:
+; CHECK: ldfminal d0, d0, [x0]
+ %r = atomicrmw fmin ptr %ptr, double %value seq_cst, align 8
+ ret double %r
+}
+
+define dso_local half @atomicrmw_fmin_half_unaligned_monotonic(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fmin_half_unaligned_monotonic:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fmin ptr %ptr, half %value monotonic, align 1
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fmin_half_unaligned_acquire(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fmin_half_unaligned_acquire:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fmin ptr %ptr, half %value acquire, align 1
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fmin_half_unaligned_release(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fmin_half_unaligned_release:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fmin ptr %ptr, half %value release, align 1
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fmin_half_unaligned_acq_rel(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fmin_half_unaligned_acq_rel:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fmin ptr %ptr, half %value acq_rel, align 1
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fmin_half_unaligned_seq_cst(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fmin_half_unaligned_seq_cst:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fmin ptr %ptr, half %value seq_cst, align 1
+ ret half %r
+}
+
+define dso_local float @atomicrmw_fmin_float_unaligned_monotonic(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fmin_float_unaligned_monotonic:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fmin ptr %ptr, float %value monotonic, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fmin_float_unaligned_acquire(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fmin_float_unaligned_acquire:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fmin ptr %ptr, float %value acquire, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fmin_float_unaligned_release(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fmin_float_unaligned_release:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fmin ptr %ptr, float %value release, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fmin_float_unaligned_acq_rel(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fmin_float_unaligned_acq_rel:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fmin ptr %ptr, float %value acq_rel, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fmin_float_unaligned_seq_cst(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fmin_float_unaligned_seq_cst:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fmin ptr %ptr, float %value seq_cst, align 1
+ ret float %r
+}
+
+define dso_local double @atomicrmw_fmin_double_unaligned_monotonic(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fmin_double_unaligned_monotonic:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fmin ptr %ptr, double %value monotonic, align 1
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fmin_double_unaligned_acquire(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fmin_double_unaligned_acquire:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fmin ptr %ptr, double %value acquire, align 1
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fmin_double_unaligned_release(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fmin_double_unaligned_release:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fmin ptr %ptr, double %value release, align 1
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fmin_double_unaligned_acq_rel(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fmin_double_unaligned_acq_rel:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fmin ptr %ptr, double %value acq_rel, align 1
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fmin_double_unaligned_seq_cst(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fmin_double_unaligned_seq_cst:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fmin ptr %ptr, double %value seq_cst, align 1
+ ret double %r
+}
diff --git a/llvm/test/CodeGen/AArch64/Atomics/aarch64_be-atomicrmw-lsfe.ll b/llvm/test/CodeGen/AArch64/Atomics/aarch64_be-atomicrmw-lsfe.ll
new file mode 100644
index 000000000000000..d6ae20f4f18a1a4
--- /dev/null
+++ b/llvm/test/CodeGen/AArch64/Atomics/aarch64_be-atomicrmw-lsfe.ll
@@ -0,0 +1,964 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --filter-out "\b(sp)\b" --filter "^\s*(ld[^r]|st[^r]|swp|cas|bl|add|and|eor|orn|orr|sub|mvn|sxt|cmp|ccmp|csel|dmb)"
+; The base test file was generated by ./llvm/test/CodeGen/AArch64/Atomics/generate-tests.py
+; RUN: llc %s -o - -verify-machineinstrs -mtriple=aarch64_be -mattr=+lsfe -O0 | FileCheck %s --check-prefixes=CHECK,-O0
+; RUN: llc %s -o - -verify-machineinstrs -mtriple=aarch64_be -mattr=+lsfe -O1 | FileCheck %s --check-prefixes=CHECK,-O1
+
+define dso_local half @atomicrmw_fadd_half_aligned_monotonic(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fadd_half_aligned_monotonic:
+; CHECK: ldfadd h0, h0, [x0]
+ %r = atomicrmw fadd ptr %ptr, half %value monotonic, align 2
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fadd_half_aligned_acquire(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fadd_half_aligned_acquire:
+; CHECK: ldfadda h0, h0, [x0]
+ %r = atomicrmw fadd ptr %ptr, half %value acquire, align 2
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fadd_half_aligned_release(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fadd_half_aligned_release:
+; CHECK: ldfaddl h0, h0, [x0]
+ %r = atomicrmw fadd ptr %ptr, half %value release, align 2
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fadd_half_aligned_acq_rel(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fadd_half_aligned_acq_rel:
+; CHECK: ldfaddal h0, h0, [x0]
+ %r = atomicrmw fadd ptr %ptr, half %value acq_rel, align 2
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fadd_half_aligned_seq_cst(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fadd_half_aligned_seq_cst:
+; CHECK: ldfaddal h0, h0, [x0]
+ %r = atomicrmw fadd ptr %ptr, half %value seq_cst, align 2
+ ret half %r
+}
+
+define dso_local float @atomicrmw_fadd_float_aligned_monotonic(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fadd_float_aligned_monotonic:
+; CHECK: ldfadd s0, s0, [x0]
+ %r = atomicrmw fadd ptr %ptr, float %value monotonic, align 4
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fadd_float_aligned_acquire(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fadd_float_aligned_acquire:
+; CHECK: ldfadda s0, s0, [x0]
+ %r = atomicrmw fadd ptr %ptr, float %value acquire, align 4
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fadd_float_aligned_release(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fadd_float_aligned_release:
+; CHECK: ldfaddl s0, s0, [x0]
+ %r = atomicrmw fadd ptr %ptr, float %value release, align 4
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fadd_float_aligned_acq_rel(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fadd_float_aligned_acq_rel:
+; CHECK: ldfaddal s0, s0, [x0]
+ %r = atomicrmw fadd ptr %ptr, float %value acq_rel, align 4
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fadd_float_aligned_seq_cst(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fadd_float_aligned_seq_cst:
+; CHECK: ldfaddal s0, s0, [x0]
+ %r = atomicrmw fadd ptr %ptr, float %value seq_cst, align 4
+ ret float %r
+}
+
+define dso_local double @atomicrmw_fadd_double_aligned_monotonic(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fadd_double_aligned_monotonic:
+; CHECK: ldfadd d0, d0, [x0]
+ %r = atomicrmw fadd ptr %ptr, double %value monotonic, align 8
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fadd_double_aligned_acquire(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fadd_double_aligned_acquire:
+; CHECK: ldfadda d0, d0, [x0]
+ %r = atomicrmw fadd ptr %ptr, double %value acquire, align 8
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fadd_double_aligned_release(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fadd_double_aligned_release:
+; CHECK: ldfaddl d0, d0, [x0]
+ %r = atomicrmw fadd ptr %ptr, double %value release, align 8
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fadd_double_aligned_acq_rel(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fadd_double_aligned_acq_rel:
+; CHECK: ldfaddal d0, d0, [x0]
+ %r = atomicrmw fadd ptr %ptr, double %value acq_rel, align 8
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fadd_double_aligned_seq_cst(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fadd_double_aligned_seq_cst:
+; CHECK: ldfaddal d0, d0, [x0]
+ %r = atomicrmw fadd ptr %ptr, double %value seq_cst, align 8
+ ret double %r
+}
+
+define dso_local half @atomicrmw_fadd_half_unaligned_monotonic(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fadd_half_unaligned_monotonic:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fadd ptr %ptr, half %value monotonic, align 1
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fadd_half_unaligned_acquire(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fadd_half_unaligned_acquire:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fadd ptr %ptr, half %value acquire, align 1
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fadd_half_unaligned_release(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fadd_half_unaligned_release:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fadd ptr %ptr, half %value release, align 1
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fadd_half_unaligned_acq_rel(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fadd_half_unaligned_acq_rel:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fadd ptr %ptr, half %value acq_rel, align 1
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fadd_half_unaligned_seq_cst(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fadd_half_unaligned_seq_cst:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fadd ptr %ptr, half %value seq_cst, align 1
+ ret half %r
+}
+
+define dso_local float @atomicrmw_fadd_float_unaligned_monotonic(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fadd_float_unaligned_monotonic:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fadd ptr %ptr, float %value monotonic, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fadd_float_unaligned_acquire(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fadd_float_unaligned_acquire:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fadd ptr %ptr, float %value acquire, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fadd_float_unaligned_release(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fadd_float_unaligned_release:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fadd ptr %ptr, float %value release, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fadd_float_unaligned_acq_rel(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fadd_float_unaligned_acq_rel:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fadd ptr %ptr, float %value acq_rel, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fadd_float_unaligned_seq_cst(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fadd_float_unaligned_seq_cst:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fadd ptr %ptr, float %value seq_cst, align 1
+ ret float %r
+}
+
+define dso_local double @atomicrmw_fadd_double_unaligned_monotonic(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fadd_double_unaligned_monotonic:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fadd ptr %ptr, double %value monotonic, align 1
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fadd_double_unaligned_acquire(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fadd_double_unaligned_acquire:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fadd ptr %ptr, double %value acquire, align 1
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fadd_double_unaligned_release(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fadd_double_unaligned_release:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fadd ptr %ptr, double %value release, align 1
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fadd_double_unaligned_acq_rel(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fadd_double_unaligned_acq_rel:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fadd ptr %ptr, double %value acq_rel, align 1
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fadd_double_unaligned_seq_cst(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fadd_double_unaligned_seq_cst:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fadd ptr %ptr, double %value seq_cst, align 1
+ ret double %r
+}
+
+define dso_local half @atomicrmw_fsub_half_aligned_monotonic(ptr %ptr, half %value) {
+; -O0-LABEL: atomicrmw_fsub_half_aligned_monotonic:
+; -O0: ldaxrh w9, [x11]
+; -O0: cmp w9, w8, uxth
+; -O0: stlxrh w10, w12, [x11]
+; -O0: subs w8, w9, w8, uxth
+; -O0: subs w8, w8, #1
+;
+; -O1-LABEL: atomicrmw_fsub_half_aligned_monotonic:
+; -O1: ldxrh w8, [x0]
+; -O1: stxrh w9, w8, [x0]
+ %r = atomicrmw fsub ptr %ptr, half %value monotonic, align 2
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fsub_half_aligned_acquire(ptr %ptr, half %value) {
+; -O0-LABEL: atomicrmw_fsub_half_aligned_acquire:
+; -O0: ldaxrh w9, [x11]
+; -O0: cmp w9, w8, uxth
+; -O0: stlxrh w10, w12, [x11]
+; -O0: subs w8, w9, w8, uxth
+; -O0: subs w8, w8, #1
+;
+; -O1-LABEL: atomicrmw_fsub_half_aligned_acquire:
+; -O1: ldaxrh w8, [x0]
+; -O1: stxrh w9, w8, [x0]
+ %r = atomicrmw fsub ptr %ptr, half %value acquire, align 2
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fsub_half_aligned_release(ptr %ptr, half %value) {
+; -O0-LABEL: atomicrmw_fsub_half_aligned_release:
+; -O0: ldaxrh w9, [x11]
+; -O0: cmp w9, w8, uxth
+; -O0: stlxrh w10, w12, [x11]
+; -O0: subs w8, w9, w8, uxth
+; -O0: subs w8, w8, #1
+;
+; -O1-LABEL: atomicrmw_fsub_half_aligned_release:
+; -O1: ldxrh w8, [x0]
+; -O1: stlxrh w9, w8, [x0]
+ %r = atomicrmw fsub ptr %ptr, half %value release, align 2
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fsub_half_aligned_acq_rel(ptr %ptr, half %value) {
+; -O0-LABEL: atomicrmw_fsub_half_aligned_acq_rel:
+; -O0: ldaxrh w9, [x11]
+; -O0: cmp w9, w8, uxth
+; -O0: stlxrh w10, w12, [x11]
+; -O0: subs w8, w9, w8, uxth
+; -O0: subs w8, w8, #1
+;
+; -O1-LABEL: atomicrmw_fsub_half_aligned_acq_rel:
+; -O1: ldaxrh w8, [x0]
+; -O1: stlxrh w9, w8, [x0]
+ %r = atomicrmw fsub ptr %ptr, half %value acq_rel, align 2
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fsub_half_aligned_seq_cst(ptr %ptr, half %value) {
+; -O0-LABEL: atomicrmw_fsub_half_aligned_seq_cst:
+; -O0: ldaxrh w9, [x11]
+; -O0: cmp w9, w8, uxth
+; -O0: stlxrh w10, w12, [x11]
+; -O0: subs w8, w9, w8, uxth
+; -O0: subs w8, w8, #1
+;
+; -O1-LABEL: atomicrmw_fsub_half_aligned_seq_cst:
+; -O1: ldaxrh w8, [x0]
+; -O1: stlxrh w9, w8, [x0]
+ %r = atomicrmw fsub ptr %ptr, half %value seq_cst, align 2
+ ret half %r
+}
+
+define dso_local float @atomicrmw_fsub_float_aligned_monotonic(ptr %ptr, float %value) {
+; -O0-LABEL: atomicrmw_fsub_float_aligned_monotonic:
+; -O0: ldaxr w9, [x11]
+; -O0: cmp w9, w8
+; -O0: stlxr w10, w12, [x11]
+; -O0: subs w8, w9, w8
+; -O0: subs w8, w8, #1
+;
+; -O1-LABEL: atomicrmw_fsub_float_aligned_monotonic:
+; -O1: ldxr w8, [x0]
+; -O1: stxr w9, w8, [x0]
+ %r = atomicrmw fsub ptr %ptr, float %value monotonic, align 4
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fsub_float_aligned_acquire(ptr %ptr, float %value) {
+; -O0-LABEL: atomicrmw_fsub_float_aligned_acquire:
+; -O0: ldaxr w9, [x11]
+; -O0: cmp w9, w8
+; -O0: stlxr w10, w12, [x11]
+; -O0: subs w8, w9, w8
+; -O0: subs w8, w8, #1
+;
+; -O1-LABEL: atomicrmw_fsub_float_aligned_acquire:
+; -O1: ldaxr w8, [x0]
+; -O1: stxr w9, w8, [x0]
+ %r = atomicrmw fsub ptr %ptr, float %value acquire, align 4
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fsub_float_aligned_release(ptr %ptr, float %value) {
+; -O0-LABEL: atomicrmw_fsub_float_aligned_release:
+; -O0: ldaxr w9, [x11]
+; -O0: cmp w9, w8
+; -O0: stlxr w10, w12, [x11]
+; -O0: subs w8, w9, w8
+; -O0: subs w8, w8, #1
+;
+; -O1-LABEL: atomicrmw_fsub_float_aligned_release:
+; -O1: ldxr w8, [x0]
+; -O1: stlxr w9, w8, [x0]
+ %r = atomicrmw fsub ptr %ptr, float %value release, align 4
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fsub_float_aligned_acq_rel(ptr %ptr, float %value) {
+; -O0-LABEL: atomicrmw_fsub_float_aligned_acq_rel:
+; -O0: ldaxr w9, [x11]
+; -O0: cmp w9, w8
+; -O0: stlxr w10, w12, [x11]
+; -O0: subs w8, w9, w8
+; -O0: subs w8, w8, #1
+;
+; -O1-LABEL: atomicrmw_fsub_float_aligned_acq_rel:
+; -O1: ldaxr w8, [x0]
+; -O1: stlxr w9, w8, [x0]
+ %r = atomicrmw fsub ptr %ptr, float %value acq_rel, align 4
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fsub_float_aligned_seq_cst(ptr %ptr, float %value) {
+; -O0-LABEL: atomicrmw_fsub_float_aligned_seq_cst:
+; -O0: ldaxr w9, [x11]
+; -O0: cmp w9, w8
+; -O0: stlxr w10, w12, [x11]
+; -O0: subs w8, w9, w8
+; -O0: subs w8, w8, #1
+;
+; -O1-LABEL: atomicrmw_fsub_float_aligned_seq_cst:
+; -O1: ldaxr w8, [x0]
+; -O1: stlxr w9, w8, [x0]
+ %r = atomicrmw fsub ptr %ptr, float %value seq_cst, align 4
+ ret float %r
+}
+
+define dso_local double @atomicrmw_fsub_double_aligned_monotonic(ptr %ptr, double %value) {
+; -O0-LABEL: atomicrmw_fsub_double_aligned_monotonic:
+; -O0: ldaxr x9, [x11]
+; -O0: cmp x9, x8
+; -O0: stlxr w10, x12, [x11]
+; -O0: subs x8, x9, x8
+; -O0: subs w8, w8, #1
+;
+; -O1-LABEL: atomicrmw_fsub_double_aligned_monotonic:
+; -O1: ldxr x8, [x0]
+; -O1: stxr w9, x8, [x0]
+ %r = atomicrmw fsub ptr %ptr, double %value monotonic, align 8
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fsub_double_aligned_acquire(ptr %ptr, double %value) {
+; -O0-LABEL: atomicrmw_fsub_double_aligned_acquire:
+; -O0: ldaxr x9, [x11]
+; -O0: cmp x9, x8
+; -O0: stlxr w10, x12, [x11]
+; -O0: subs x8, x9, x8
+; -O0: subs w8, w8, #1
+;
+; -O1-LABEL: atomicrmw_fsub_double_aligned_acquire:
+; -O1: ldaxr x8, [x0]
+; -O1: stxr w9, x8, [x0]
+ %r = atomicrmw fsub ptr %ptr, double %value acquire, align 8
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fsub_double_aligned_release(ptr %ptr, double %value) {
+; -O0-LABEL: atomicrmw_fsub_double_aligned_release:
+; -O0: ldaxr x9, [x11]
+; -O0: cmp x9, x8
+; -O0: stlxr w10, x12, [x11]
+; -O0: subs x8, x9, x8
+; -O0: subs w8, w8, #1
+;
+; -O1-LABEL: atomicrmw_fsub_double_aligned_release:
+; -O1: ldxr x8, [x0]
+; -O1: stlxr w9, x8, [x0]
+ %r = atomicrmw fsub ptr %ptr, double %value release, align 8
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fsub_double_aligned_acq_rel(ptr %ptr, double %value) {
+; -O0-LABEL: atomicrmw_fsub_double_aligned_acq_rel:
+; -O0: ldaxr x9, [x11]
+; -O0: cmp x9, x8
+; -O0: stlxr w10, x12, [x11]
+; -O0: subs x8, x9, x8
+; -O0: subs w8, w8, #1
+;
+; -O1-LABEL: atomicrmw_fsub_double_aligned_acq_rel:
+; -O1: ldaxr x8, [x0]
+; -O1: stlxr w9, x8, [x0]
+ %r = atomicrmw fsub ptr %ptr, double %value acq_rel, align 8
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fsub_double_aligned_seq_cst(ptr %ptr, double %value) {
+; -O0-LABEL: atomicrmw_fsub_double_aligned_seq_cst:
+; -O0: ldaxr x9, [x11]
+; -O0: cmp x9, x8
+; -O0: stlxr w10, x12, [x11]
+; -O0: subs x8, x9, x8
+; -O0: subs w8, w8, #1
+;
+; -O1-LABEL: atomicrmw_fsub_double_aligned_seq_cst:
+; -O1: ldaxr x8, [x0]
+; -O1: stlxr w9, x8, [x0]
+ %r = atomicrmw fsub ptr %ptr, double %value seq_cst, align 8
+ ret double %r
+}
+
+define dso_local half @atomicrmw_fsub_half_unaligned_monotonic(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fsub_half_unaligned_monotonic:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fsub ptr %ptr, half %value monotonic, align 1
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fsub_half_unaligned_acquire(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fsub_half_unaligned_acquire:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fsub ptr %ptr, half %value acquire, align 1
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fsub_half_unaligned_release(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fsub_half_unaligned_release:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fsub ptr %ptr, half %value release, align 1
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fsub_half_unaligned_acq_rel(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fsub_half_unaligned_acq_rel:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fsub ptr %ptr, half %value acq_rel, align 1
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fsub_half_unaligned_seq_cst(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fsub_half_unaligned_seq_cst:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fsub ptr %ptr, half %value seq_cst, align 1
+ ret half %r
+}
+
+define dso_local float @atomicrmw_fsub_float_unaligned_monotonic(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fsub_float_unaligned_monotonic:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fsub ptr %ptr, float %value monotonic, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fsub_float_unaligned_acquire(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fsub_float_unaligned_acquire:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fsub ptr %ptr, float %value acquire, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fsub_float_unaligned_release(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fsub_float_unaligned_release:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fsub ptr %ptr, float %value release, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fsub_float_unaligned_acq_rel(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fsub_float_unaligned_acq_rel:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fsub ptr %ptr, float %value acq_rel, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fsub_float_unaligned_seq_cst(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fsub_float_unaligned_seq_cst:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fsub ptr %ptr, float %value seq_cst, align 1
+ ret float %r
+}
+
+define dso_local double @atomicrmw_fsub_double_unaligned_monotonic(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fsub_double_unaligned_monotonic:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fsub ptr %ptr, double %value monotonic, align 1
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fsub_double_unaligned_acquire(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fsub_double_unaligned_acquire:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fsub ptr %ptr, double %value acquire, align 1
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fsub_double_unaligned_release(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fsub_double_unaligned_release:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fsub ptr %ptr, double %value release, align 1
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fsub_double_unaligned_acq_rel(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fsub_double_unaligned_acq_rel:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fsub ptr %ptr, double %value acq_rel, align 1
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fsub_double_unaligned_seq_cst(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fsub_double_unaligned_seq_cst:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fsub ptr %ptr, double %value seq_cst, align 1
+ ret double %r
+}
+
+define dso_local half @atomicrmw_fmax_half_aligned_monotonic(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fmax_half_aligned_monotonic:
+; CHECK: ldfmax h0, h0, [x0]
+ %r = atomicrmw fmax ptr %ptr, half %value monotonic, align 2
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fmax_half_aligned_acquire(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fmax_half_aligned_acquire:
+; CHECK: ldfmaxa h0, h0, [x0]
+ %r = atomicrmw fmax ptr %ptr, half %value acquire, align 2
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fmax_half_aligned_release(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fmax_half_aligned_release:
+; CHECK: ldfmaxl h0, h0, [x0]
+ %r = atomicrmw fmax ptr %ptr, half %value release, align 2
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fmax_half_aligned_acq_rel(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fmax_half_aligned_acq_rel:
+; CHECK: ldfmaxal h0, h0, [x0]
+ %r = atomicrmw fmax ptr %ptr, half %value acq_rel, align 2
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fmax_half_aligned_seq_cst(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fmax_half_aligned_seq_cst:
+; CHECK: ldfmaxal h0, h0, [x0]
+ %r = atomicrmw fmax ptr %ptr, half %value seq_cst, align 2
+ ret half %r
+}
+
+define dso_local float @atomicrmw_fmax_float_aligned_monotonic(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fmax_float_aligned_monotonic:
+; CHECK: ldfmax s0, s0, [x0]
+ %r = atomicrmw fmax ptr %ptr, float %value monotonic, align 4
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fmax_float_aligned_acquire(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fmax_float_aligned_acquire:
+; CHECK: ldfmaxa s0, s0, [x0]
+ %r = atomicrmw fmax ptr %ptr, float %value acquire, align 4
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fmax_float_aligned_release(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fmax_float_aligned_release:
+; CHECK: ldfmaxl s0, s0, [x0]
+ %r = atomicrmw fmax ptr %ptr, float %value release, align 4
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fmax_float_aligned_acq_rel(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fmax_float_aligned_acq_rel:
+; CHECK: ldfmaxal s0, s0, [x0]
+ %r = atomicrmw fmax ptr %ptr, float %value acq_rel, align 4
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fmax_float_aligned_seq_cst(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fmax_float_aligned_seq_cst:
+; CHECK: ldfmaxal s0, s0, [x0]
+ %r = atomicrmw fmax ptr %ptr, float %value seq_cst, align 4
+ ret float %r
+}
+
+define dso_local double @atomicrmw_fmax_double_aligned_monotonic(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fmax_double_aligned_monotonic:
+; CHECK: ldfmax d0, d0, [x0]
+ %r = atomicrmw fmax ptr %ptr, double %value monotonic, align 8
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fmax_double_aligned_acquire(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fmax_double_aligned_acquire:
+; CHECK: ldfmaxa d0, d0, [x0]
+ %r = atomicrmw fmax ptr %ptr, double %value acquire, align 8
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fmax_double_aligned_release(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fmax_double_aligned_release:
+; CHECK: ldfmaxl d0, d0, [x0]
+ %r = atomicrmw fmax ptr %ptr, double %value release, align 8
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fmax_double_aligned_acq_rel(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fmax_double_aligned_acq_rel:
+; CHECK: ldfmaxal d0, d0, [x0]
+ %r = atomicrmw fmax ptr %ptr, double %value acq_rel, align 8
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fmax_double_aligned_seq_cst(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fmax_double_aligned_seq_cst:
+; CHECK: ldfmaxal d0, d0, [x0]
+ %r = atomicrmw fmax ptr %ptr, double %value seq_cst, align 8
+ ret double %r
+}
+
+define dso_local half @atomicrmw_fmax_half_unaligned_monotonic(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fmax_half_unaligned_monotonic:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fmax ptr %ptr, half %value monotonic, align 1
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fmax_half_unaligned_acquire(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fmax_half_unaligned_acquire:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fmax ptr %ptr, half %value acquire, align 1
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fmax_half_unaligned_release(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fmax_half_unaligned_release:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fmax ptr %ptr, half %value release, align 1
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fmax_half_unaligned_acq_rel(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fmax_half_unaligned_acq_rel:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fmax ptr %ptr, half %value acq_rel, align 1
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fmax_half_unaligned_seq_cst(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fmax_half_unaligned_seq_cst:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fmax ptr %ptr, half %value seq_cst, align 1
+ ret half %r
+}
+
+define dso_local float @atomicrmw_fmax_float_unaligned_monotonic(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fmax_float_unaligned_monotonic:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fmax ptr %ptr, float %value monotonic, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fmax_float_unaligned_acquire(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fmax_float_unaligned_acquire:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fmax ptr %ptr, float %value acquire, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fmax_float_unaligned_release(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fmax_float_unaligned_release:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fmax ptr %ptr, float %value release, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fmax_float_unaligned_acq_rel(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fmax_float_unaligned_acq_rel:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fmax ptr %ptr, float %value acq_rel, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fmax_float_unaligned_seq_cst(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fmax_float_unaligned_seq_cst:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fmax ptr %ptr, float %value seq_cst, align 1
+ ret float %r
+}
+
+define dso_local double @atomicrmw_fmax_double_unaligned_monotonic(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fmax_double_unaligned_monotonic:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fmax ptr %ptr, double %value monotonic, align 1
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fmax_double_unaligned_acquire(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fmax_double_unaligned_acquire:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fmax ptr %ptr, double %value acquire, align 1
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fmax_double_unaligned_release(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fmax_double_unaligned_release:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fmax ptr %ptr, double %value release, align 1
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fmax_double_unaligned_acq_rel(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fmax_double_unaligned_acq_rel:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fmax ptr %ptr, double %value acq_rel, align 1
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fmax_double_unaligned_seq_cst(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fmax_double_unaligned_seq_cst:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fmax ptr %ptr, double %value seq_cst, align 1
+ ret double %r
+}
+
+define dso_local half @atomicrmw_fmin_half_aligned_monotonic(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fmin_half_aligned_monotonic:
+; CHECK: ldfmin h0, h0, [x0]
+ %r = atomicrmw fmin ptr %ptr, half %value monotonic, align 2
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fmin_half_aligned_acquire(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fmin_half_aligned_acquire:
+; CHECK: ldfmina h0, h0, [x0]
+ %r = atomicrmw fmin ptr %ptr, half %value acquire, align 2
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fmin_half_aligned_release(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fmin_half_aligned_release:
+; CHECK: ldfminl h0, h0, [x0]
+ %r = atomicrmw fmin ptr %ptr, half %value release, align 2
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fmin_half_aligned_acq_rel(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fmin_half_aligned_acq_rel:
+; CHECK: ldfminal h0, h0, [x0]
+ %r = atomicrmw fmin ptr %ptr, half %value acq_rel, align 2
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fmin_half_aligned_seq_cst(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fmin_half_aligned_seq_cst:
+; CHECK: ldfminal h0, h0, [x0]
+ %r = atomicrmw fmin ptr %ptr, half %value seq_cst, align 2
+ ret half %r
+}
+
+define dso_local float @atomicrmw_fmin_float_aligned_monotonic(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fmin_float_aligned_monotonic:
+; CHECK: ldfmin s0, s0, [x0]
+ %r = atomicrmw fmin ptr %ptr, float %value monotonic, align 4
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fmin_float_aligned_acquire(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fmin_float_aligned_acquire:
+; CHECK: ldfmina s0, s0, [x0]
+ %r = atomicrmw fmin ptr %ptr, float %value acquire, align 4
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fmin_float_aligned_release(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fmin_float_aligned_release:
+; CHECK: ldfminl s0, s0, [x0]
+ %r = atomicrmw fmin ptr %ptr, float %value release, align 4
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fmin_float_aligned_acq_rel(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fmin_float_aligned_acq_rel:
+; CHECK: ldfminal s0, s0, [x0]
+ %r = atomicrmw fmin ptr %ptr, float %value acq_rel, align 4
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fmin_float_aligned_seq_cst(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fmin_float_aligned_seq_cst:
+; CHECK: ldfminal s0, s0, [x0]
+ %r = atomicrmw fmin ptr %ptr, float %value seq_cst, align 4
+ ret float %r
+}
+
+define dso_local double @atomicrmw_fmin_double_aligned_monotonic(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fmin_double_aligned_monotonic:
+; CHECK: ldfmin d0, d0, [x0]
+ %r = atomicrmw fmin ptr %ptr, double %value monotonic, align 8
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fmin_double_aligned_acquire(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fmin_double_aligned_acquire:
+; CHECK: ldfmina d0, d0, [x0]
+ %r = atomicrmw fmin ptr %ptr, double %value acquire, align 8
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fmin_double_aligned_release(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fmin_double_aligned_release:
+; CHECK: ldfminl d0, d0, [x0]
+ %r = atomicrmw fmin ptr %ptr, double %value release, align 8
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fmin_double_aligned_acq_rel(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fmin_double_aligned_acq_rel:
+; CHECK: ldfminal d0, d0, [x0]
+ %r = atomicrmw fmin ptr %ptr, double %value acq_rel, align 8
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fmin_double_aligned_seq_cst(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fmin_double_aligned_seq_cst:
+; CHECK: ldfminal d0, d0, [x0]
+ %r = atomicrmw fmin ptr %ptr, double %value seq_cst, align 8
+ ret double %r
+}
+
+define dso_local half @atomicrmw_fmin_half_unaligned_monotonic(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fmin_half_unaligned_monotonic:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fmin ptr %ptr, half %value monotonic, align 1
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fmin_half_unaligned_acquire(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fmin_half_unaligned_acquire:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fmin ptr %ptr, half %value acquire, align 1
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fmin_half_unaligned_release(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fmin_half_unaligned_release:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fmin ptr %ptr, half %value release, align 1
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fmin_half_unaligned_acq_rel(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fmin_half_unaligned_acq_rel:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fmin ptr %ptr, half %value acq_rel, align 1
+ ret half %r
+}
+
+define dso_local half @atomicrmw_fmin_half_unaligned_seq_cst(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fmin_half_unaligned_seq_cst:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fmin ptr %ptr, half %value seq_cst, align 1
+ ret half %r
+}
+
+define dso_local float @atomicrmw_fmin_float_unaligned_monotonic(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fmin_float_unaligned_monotonic:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fmin ptr %ptr, float %value monotonic, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fmin_float_unaligned_acquire(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fmin_float_unaligned_acquire:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fmin ptr %ptr, float %value acquire, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fmin_float_unaligned_release(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fmin_float_unaligned_release:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fmin ptr %ptr, float %value release, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fmin_float_unaligned_acq_rel(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fmin_float_unaligned_acq_rel:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fmin ptr %ptr, float %value acq_rel, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fmin_float_unaligned_seq_cst(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fmin_float_unaligned_seq_cst:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fmin ptr %ptr, float %value seq_cst, align 1
+ ret float %r
+}
+
+define dso_local double @atomicrmw_fmin_double_unaligned_monotonic(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fmin_double_unaligned_monotonic:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fmin ptr %ptr, double %value monotonic, align 1
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fmin_double_unaligned_acquire(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fmin_double_unaligned_acquire:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fmin ptr %ptr, double %value acquire, align 1
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fmin_double_unaligned_release(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fmin_double_unaligned_release:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fmin ptr %ptr, double %value release, align 1
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fmin_double_unaligned_acq_rel(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fmin_double_unaligned_acq_rel:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fmin ptr %ptr, double %value acq_rel, align 1
+ ret double %r
+}
+
+define dso_local double @atomicrmw_fmin_double_unaligned_seq_cst(ptr %ptr, double %value) {
+; CHECK-LABEL: atomicrmw_fmin_double_unaligned_seq_cst:
+; CHECK: bl __atomic_compare_exchange
+ %r = atomicrmw fmin ptr %ptr, double %value seq_cst, align 1
+ ret double %r
+}
diff --git a/llvm/test/CodeGen/AArch64/Atomics/generate-tests.py b/llvm/test/CodeGen/AArch64/Atomics/generate-tests.py
index ecda5fd69ca5d93..2f74254e32dcae9 100755
--- a/llvm/test/CodeGen/AArch64/Atomics/generate-tests.py
+++ b/llvm/test/CodeGen/AArch64/Atomics/generate-tests.py
@@ -29,6 +29,20 @@ def __str__(self) -> str:
return self.name
+# FP Type name size
+class FPType(enum.Enum):
+ # Value is the size in bytes
+ half = 2
+ float = 4
+ double = 8
+
+ def align(self, aligned: bool) -> int:
+ return self.value if aligned else 1
+
+ def __str__(self) -> str:
+ return self.name
+
+
# Is this an aligned or unaligned access?
class Aligned(enum.Enum):
aligned = True
@@ -111,6 +125,7 @@ class Feature(enum.Flag):
v8_1a = enum.auto() # -mattr=+v8.1a, mandatory FEAT_LOR, FEAT_LSE
rcpc = enum.auto() # FEAT_LRCPC
lse2 = enum.auto() # FEAT_LSE2
+ lsfe = enum.auto() # FEAT_LSFE
outline_atomics = enum.auto() # -moutline-atomics
rcpc3 = enum.auto() # FEAT_LSE2 + FEAT_LRCPC3
lse2_lse128 = enum.auto() # FEAT_LSE2 + FEAT_LSE128
@@ -125,6 +140,8 @@ def mattr(self):
return "+lse2,+rcpc3"
if self == Feature.lse2_lse128:
return "+lse2,+lse128"
+ if self == Feature.lsfe:
+ return "+lsfe"
return "+" + self.name
@@ -142,11 +159,18 @@ def mattr(self):
"umin",
]
+FP_ATOMICRMW_OPS = [
+ "fadd",
+ "fsub",
+ "fmax",
+ "fmin",
+]
+
-def all_atomicrmw(f):
- for op in ATOMICRMW_OPS:
+def all_atomicrmw(f, datatype, atomicrmw_ops):
+ for op in atomicrmw_ops:
for aligned in Aligned:
- for ty in Type:
+ for ty in datatype:
for ordering in ATOMICRMW_ORDERS:
name = f"atomicrmw_{op}_{ty}_{aligned}_{ordering}"
instr = "atomicrmw"
@@ -286,7 +310,14 @@ def write_lit_tests():
with open(f"{triple}-atomicrmw-{feat.name}.ll", "w") as f:
filter_args = r'--filter-out "\b(sp)\b" --filter "^\s*(ld[^r]|st[^r]|swp|cas|bl|add|and|eor|orn|orr|sub|mvn|sxt|cmp|ccmp|csel|dmb)"'
header(f, triple, [feat], filter_args)
- all_atomicrmw(f)
+ if feat != Feature.lsfe:
+ all_atomicrmw(f, Type, ATOMICRMW_OPS)
+ else:
+ all_atomicrmw(f, FPType, FP_ATOMICRMW_OPS)
+
+ # Floating point atomics only supported for atomicrmw currently
+ if feat == Feature.lsfe:
+ continue
with open(f"{triple}-cmpxchg-{feat.name}.ll", "w") as f:
filter_args = r'--filter-out "\b(sp)\b" --filter "^\s*(ld[^r]|st[^r]|swp|cas|bl|add|and|eor|orn|orr|sub|mvn|sxt|cmp|ccmp|csel|dmb)"'
>From 912238c04c429da326a9b818a49153473fe22fe0 Mon Sep 17 00:00:00 2001
From: Jonathan Thackray <jonathan.thackray at arm.com>
Date: Fri, 7 Feb 2025 17:22:39 +0000
Subject: [PATCH 2/3] fixup! Also add support for lowering to
LDBFADD/LDBFMAX/LDBFMIN
---
.../Target/AArch64/AArch64ISelLowering.cpp | 3 +
.../lib/Target/AArch64/AArch64InstrAtomics.td | 10 +-
.../lib/Target/AArch64/AArch64InstrFormats.td | 4 +
llvm/lib/Target/AArch64/AArch64InstrInfo.td | 2 +-
.../AArch64/Atomics/aarch64-atomicrmw-lsfe.ll | 540 +++++++++++++++++-
.../Atomics/aarch64_be-atomicrmw-lsfe.ll | 540 +++++++++++++++++-
.../CodeGen/AArch64/Atomics/generate-tests.py | 69 ++-
7 files changed, 1073 insertions(+), 95 deletions(-)
diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
index de7180d78c1326e..68953428921ac92 100644
--- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
+++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
@@ -978,14 +978,17 @@ AArch64TargetLowering::AArch64TargetLowering(const TargetMachine &TM,
setOperationAction(ISD::ATOMIC_LOAD_FADD, MVT::f16, LibCall);
setOperationAction(ISD::ATOMIC_LOAD_FADD, MVT::f32, LibCall);
setOperationAction(ISD::ATOMIC_LOAD_FADD, MVT::f64, LibCall);
+ setOperationAction(ISD::ATOMIC_LOAD_FADD, MVT::bf16, LibCall);
setOperationAction(ISD::ATOMIC_LOAD_FMAX, MVT::f16, LibCall);
setOperationAction(ISD::ATOMIC_LOAD_FMAX, MVT::f32, LibCall);
setOperationAction(ISD::ATOMIC_LOAD_FMAX, MVT::f64, LibCall);
+ setOperationAction(ISD::ATOMIC_LOAD_FMAX, MVT::bf16, LibCall);
setOperationAction(ISD::ATOMIC_LOAD_FMIN, MVT::f16, LibCall);
setOperationAction(ISD::ATOMIC_LOAD_FMIN, MVT::f32, LibCall);
setOperationAction(ISD::ATOMIC_LOAD_FMIN, MVT::f64, LibCall);
+ setOperationAction(ISD::ATOMIC_LOAD_FMIN, MVT::bf16, LibCall);
}
if (Subtarget->hasLSE128()) {
diff --git a/llvm/lib/Target/AArch64/AArch64InstrAtomics.td b/llvm/lib/Target/AArch64/AArch64InstrAtomics.td
index 045bebf15a701ab..2d7a9d6f00bd0e9 100644
--- a/llvm/lib/Target/AArch64/AArch64InstrAtomics.td
+++ b/llvm/lib/Target/AArch64/AArch64InstrAtomics.td
@@ -548,9 +548,13 @@ defm atomic_load_fmin : binary_atomic_op_fp<atomic_load_fmin>;
defm atomic_load_fmax : binary_atomic_op_fp<atomic_load_fmax>;
let Predicates = [HasLSFE] in {
- defm : LDFPOPregister_patterns<"LDFADD", "atomic_load_fadd">;
- defm : LDFPOPregister_patterns<"LDFMAX", "atomic_load_fmax">;
- defm : LDFPOPregister_patterns<"LDFMIN", "atomic_load_fmin">;
+ defm : LDFPOPregister_patterns<"LDFADD", "atomic_load_fadd">;
+ defm : LDFPOPregister_patterns<"LDFMAXNM", "atomic_load_fmax">;
+ defm : LDFPOPregister_patterns<"LDFMINNM", "atomic_load_fmin">;
+
+ defm : LDBFPOPregister_patterns<"LDBFADD", "atomic_load_fadd">;
+ defm : LDBFPOPregister_patterns<"LDBFMAXNM", "atomic_load_fmax">;
+ defm : LDBFPOPregister_patterns<"LDBFMINNM", "atomic_load_fmin">;
}
// v8.9a/v9.4a FEAT_LRCPC patterns
diff --git a/llvm/lib/Target/AArch64/AArch64InstrFormats.td b/llvm/lib/Target/AArch64/AArch64InstrFormats.td
index 810255eabfded8b..02f8ac8784b6169 100644
--- a/llvm/lib/Target/AArch64/AArch64InstrFormats.td
+++ b/llvm/lib/Target/AArch64/AArch64InstrFormats.td
@@ -12500,6 +12500,10 @@ multiclass LDFPOPregister_patterns<string inst, string op> {
defm : LDFPOPregister_patterns_ord<inst, "D", op, f64, (f64 FPR64:$Rm)>;
}
+multiclass LDBFPOPregister_patterns<string inst, string op> {
+ defm : LDFPOPregister_patterns_ord<inst, "", op, bf16, (bf16 FPR16:$Rm)>;
+}
+
let Predicates = [HasLSE] in
multiclass CASregister_patterns_ord_dag<string inst, string suffix, string op,
ValueType vt, dag OLD, dag NEW> {
diff --git a/llvm/lib/Target/AArch64/AArch64InstrInfo.td b/llvm/lib/Target/AArch64/AArch64InstrInfo.td
index 3c57ba414b2bf07..5576a5136ff8a32 100644
--- a/llvm/lib/Target/AArch64/AArch64InstrInfo.td
+++ b/llvm/lib/Target/AArch64/AArch64InstrInfo.td
@@ -10565,7 +10565,7 @@ let Predicates = [HasLSFE] in {
defm LDFMAXNML : AtomicFPLoad<0b01, 0b110, "ldfmaxnml">;
defm LDFMINNMA : AtomicFPLoad<0b10, 0b111, "ldfminnma">;
defm LDFMINNMAL : AtomicFPLoad<0b11, 0b111, "ldfminnmal">;
- defm LDFMINMN : AtomicFPLoad<0b00, 0b111, "ldfminnm">;
+ defm LDFMINNM : AtomicFPLoad<0b00, 0b111, "ldfminnm">;
defm LDFMINNML : AtomicFPLoad<0b01, 0b111, "ldfminnml">;
// BFloat16
def LDBFADDA : BaseAtomicFPLoad<FPR16, 0b00, 0b10, 0b000, "ldbfadda">;
diff --git a/llvm/test/CodeGen/AArch64/Atomics/aarch64-atomicrmw-lsfe.ll b/llvm/test/CodeGen/AArch64/Atomics/aarch64-atomicrmw-lsfe.ll
index 3d6ad81ea674cc5..666501c937e6520 100644
--- a/llvm/test/CodeGen/AArch64/Atomics/aarch64-atomicrmw-lsfe.ll
+++ b/llvm/test/CodeGen/AArch64/Atomics/aarch64-atomicrmw-lsfe.ll
@@ -73,6 +73,41 @@ define dso_local float @atomicrmw_fadd_float_aligned_seq_cst(ptr %ptr, float %va
ret float %r
}
+define dso_local bfloat @atomicrmw_fadd_bfloat_aligned_monotonic(ptr %ptr, bfloat %value) {
+; CHECK-LABEL: atomicrmw_fadd_bfloat_aligned_monotonic:
+; CHECK: ldbfadd h0, h0, [x0]
+ %r = atomicrmw fadd ptr %ptr, bfloat %value monotonic, align 4
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fadd_bfloat_aligned_acquire(ptr %ptr, bfloat %value) {
+; CHECK-LABEL: atomicrmw_fadd_bfloat_aligned_acquire:
+; CHECK: ldbfadda h0, h0, [x0]
+ %r = atomicrmw fadd ptr %ptr, bfloat %value acquire, align 4
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fadd_bfloat_aligned_release(ptr %ptr, bfloat %value) {
+; CHECK-LABEL: atomicrmw_fadd_bfloat_aligned_release:
+; CHECK: ldbfaddl h0, h0, [x0]
+ %r = atomicrmw fadd ptr %ptr, bfloat %value release, align 4
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fadd_bfloat_aligned_acq_rel(ptr %ptr, bfloat %value) {
+; CHECK-LABEL: atomicrmw_fadd_bfloat_aligned_acq_rel:
+; CHECK: ldbfaddal h0, h0, [x0]
+ %r = atomicrmw fadd ptr %ptr, bfloat %value acq_rel, align 4
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fadd_bfloat_aligned_seq_cst(ptr %ptr, bfloat %value) {
+; CHECK-LABEL: atomicrmw_fadd_bfloat_aligned_seq_cst:
+; CHECK: ldbfaddal h0, h0, [x0]
+ %r = atomicrmw fadd ptr %ptr, bfloat %value seq_cst, align 4
+ ret bfloat %r
+}
+
define dso_local double @atomicrmw_fadd_double_aligned_monotonic(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fadd_double_aligned_monotonic:
; CHECK: ldfadd d0, d0, [x0]
@@ -178,6 +213,76 @@ define dso_local float @atomicrmw_fadd_float_unaligned_seq_cst(ptr %ptr, float %
ret float %r
}
+define dso_local bfloat @atomicrmw_fadd_bfloat_unaligned_monotonic(ptr %ptr, bfloat %value) {
+; -O0-LABEL: atomicrmw_fadd_bfloat_unaligned_monotonic:
+; -O0: add w8, w8, w9
+; -O0: add w8, w8, w9
+; -O0: bl __atomic_compare_exchange
+;
+; -O1-LABEL: atomicrmw_fadd_bfloat_unaligned_monotonic:
+; -O1: add w8, w8, w20
+; -O1: add w8, w9, w8
+; -O1: bl __atomic_compare_exchange
+ %r = atomicrmw fadd ptr %ptr, bfloat %value monotonic, align 1
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fadd_bfloat_unaligned_acquire(ptr %ptr, bfloat %value) {
+; -O0-LABEL: atomicrmw_fadd_bfloat_unaligned_acquire:
+; -O0: add w8, w8, w9
+; -O0: add w8, w8, w9
+; -O0: bl __atomic_compare_exchange
+;
+; -O1-LABEL: atomicrmw_fadd_bfloat_unaligned_acquire:
+; -O1: add w8, w8, w20
+; -O1: add w8, w9, w8
+; -O1: bl __atomic_compare_exchange
+ %r = atomicrmw fadd ptr %ptr, bfloat %value acquire, align 1
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fadd_bfloat_unaligned_release(ptr %ptr, bfloat %value) {
+; -O0-LABEL: atomicrmw_fadd_bfloat_unaligned_release:
+; -O0: add w8, w8, w9
+; -O0: add w8, w8, w9
+; -O0: bl __atomic_compare_exchange
+;
+; -O1-LABEL: atomicrmw_fadd_bfloat_unaligned_release:
+; -O1: add w8, w8, w20
+; -O1: add w8, w9, w8
+; -O1: bl __atomic_compare_exchange
+ %r = atomicrmw fadd ptr %ptr, bfloat %value release, align 1
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fadd_bfloat_unaligned_acq_rel(ptr %ptr, bfloat %value) {
+; -O0-LABEL: atomicrmw_fadd_bfloat_unaligned_acq_rel:
+; -O0: add w8, w8, w9
+; -O0: add w8, w8, w9
+; -O0: bl __atomic_compare_exchange
+;
+; -O1-LABEL: atomicrmw_fadd_bfloat_unaligned_acq_rel:
+; -O1: add w8, w8, w20
+; -O1: add w8, w9, w8
+; -O1: bl __atomic_compare_exchange
+ %r = atomicrmw fadd ptr %ptr, bfloat %value acq_rel, align 1
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fadd_bfloat_unaligned_seq_cst(ptr %ptr, bfloat %value) {
+; -O0-LABEL: atomicrmw_fadd_bfloat_unaligned_seq_cst:
+; -O0: add w8, w8, w9
+; -O0: add w8, w8, w9
+; -O0: bl __atomic_compare_exchange
+;
+; -O1-LABEL: atomicrmw_fadd_bfloat_unaligned_seq_cst:
+; -O1: add w8, w8, w20
+; -O1: add w8, w9, w8
+; -O1: bl __atomic_compare_exchange
+ %r = atomicrmw fadd ptr %ptr, bfloat %value seq_cst, align 1
+ ret bfloat %r
+}
+
define dso_local double @atomicrmw_fadd_double_unaligned_monotonic(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fadd_double_unaligned_monotonic:
; CHECK: bl __atomic_compare_exchange
@@ -353,6 +458,101 @@ define dso_local float @atomicrmw_fsub_float_aligned_seq_cst(ptr %ptr, float %va
ret float %r
}
+define dso_local bfloat @atomicrmw_fsub_bfloat_aligned_monotonic(ptr %ptr, bfloat %value) {
+; -O0-LABEL: atomicrmw_fsub_bfloat_aligned_monotonic:
+; -O0: add w8, w8, w9
+; -O0: add w8, w8, w9
+; -O0: ldaxrh w9, [x11]
+; -O0: cmp w9, w8, uxth
+; -O0: stlxrh w10, w12, [x11]
+; -O0: subs w8, w9, w8, uxth
+; -O0: subs w8, w8, #1
+;
+; -O1-LABEL: atomicrmw_fsub_bfloat_aligned_monotonic:
+; -O1: ldxrh w9, [x0]
+; -O1: add w9, w9, w8
+; -O1: add w9, w10, w9
+; -O1: stxrh w10, w9, [x0]
+ %r = atomicrmw fsub ptr %ptr, bfloat %value monotonic, align 4
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fsub_bfloat_aligned_acquire(ptr %ptr, bfloat %value) {
+; -O0-LABEL: atomicrmw_fsub_bfloat_aligned_acquire:
+; -O0: add w8, w8, w9
+; -O0: add w8, w8, w9
+; -O0: ldaxrh w9, [x11]
+; -O0: cmp w9, w8, uxth
+; -O0: stlxrh w10, w12, [x11]
+; -O0: subs w8, w9, w8, uxth
+; -O0: subs w8, w8, #1
+;
+; -O1-LABEL: atomicrmw_fsub_bfloat_aligned_acquire:
+; -O1: ldaxrh w9, [x0]
+; -O1: add w9, w9, w8
+; -O1: add w9, w10, w9
+; -O1: stxrh w10, w9, [x0]
+ %r = atomicrmw fsub ptr %ptr, bfloat %value acquire, align 4
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fsub_bfloat_aligned_release(ptr %ptr, bfloat %value) {
+; -O0-LABEL: atomicrmw_fsub_bfloat_aligned_release:
+; -O0: add w8, w8, w9
+; -O0: add w8, w8, w9
+; -O0: ldaxrh w9, [x11]
+; -O0: cmp w9, w8, uxth
+; -O0: stlxrh w10, w12, [x11]
+; -O0: subs w8, w9, w8, uxth
+; -O0: subs w8, w8, #1
+;
+; -O1-LABEL: atomicrmw_fsub_bfloat_aligned_release:
+; -O1: ldxrh w9, [x0]
+; -O1: add w9, w9, w8
+; -O1: add w9, w10, w9
+; -O1: stlxrh w10, w9, [x0]
+ %r = atomicrmw fsub ptr %ptr, bfloat %value release, align 4
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fsub_bfloat_aligned_acq_rel(ptr %ptr, bfloat %value) {
+; -O0-LABEL: atomicrmw_fsub_bfloat_aligned_acq_rel:
+; -O0: add w8, w8, w9
+; -O0: add w8, w8, w9
+; -O0: ldaxrh w9, [x11]
+; -O0: cmp w9, w8, uxth
+; -O0: stlxrh w10, w12, [x11]
+; -O0: subs w8, w9, w8, uxth
+; -O0: subs w8, w8, #1
+;
+; -O1-LABEL: atomicrmw_fsub_bfloat_aligned_acq_rel:
+; -O1: ldaxrh w9, [x0]
+; -O1: add w9, w9, w8
+; -O1: add w9, w10, w9
+; -O1: stlxrh w10, w9, [x0]
+ %r = atomicrmw fsub ptr %ptr, bfloat %value acq_rel, align 4
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fsub_bfloat_aligned_seq_cst(ptr %ptr, bfloat %value) {
+; -O0-LABEL: atomicrmw_fsub_bfloat_aligned_seq_cst:
+; -O0: add w8, w8, w9
+; -O0: add w8, w8, w9
+; -O0: ldaxrh w9, [x11]
+; -O0: cmp w9, w8, uxth
+; -O0: stlxrh w10, w12, [x11]
+; -O0: subs w8, w9, w8, uxth
+; -O0: subs w8, w8, #1
+;
+; -O1-LABEL: atomicrmw_fsub_bfloat_aligned_seq_cst:
+; -O1: ldaxrh w9, [x0]
+; -O1: add w9, w9, w8
+; -O1: add w9, w10, w9
+; -O1: stlxrh w10, w9, [x0]
+ %r = atomicrmw fsub ptr %ptr, bfloat %value seq_cst, align 4
+ ret bfloat %r
+}
+
define dso_local double @atomicrmw_fsub_double_aligned_monotonic(ptr %ptr, double %value) {
; -O0-LABEL: atomicrmw_fsub_double_aligned_monotonic:
; -O0: ldaxr x0, [x9]
@@ -493,6 +693,76 @@ define dso_local float @atomicrmw_fsub_float_unaligned_seq_cst(ptr %ptr, float %
ret float %r
}
+define dso_local bfloat @atomicrmw_fsub_bfloat_unaligned_monotonic(ptr %ptr, bfloat %value) {
+; -O0-LABEL: atomicrmw_fsub_bfloat_unaligned_monotonic:
+; -O0: add w8, w8, w9
+; -O0: add w8, w8, w9
+; -O0: bl __atomic_compare_exchange
+;
+; -O1-LABEL: atomicrmw_fsub_bfloat_unaligned_monotonic:
+; -O1: add w8, w8, w20
+; -O1: add w8, w9, w8
+; -O1: bl __atomic_compare_exchange
+ %r = atomicrmw fsub ptr %ptr, bfloat %value monotonic, align 1
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fsub_bfloat_unaligned_acquire(ptr %ptr, bfloat %value) {
+; -O0-LABEL: atomicrmw_fsub_bfloat_unaligned_acquire:
+; -O0: add w8, w8, w9
+; -O0: add w8, w8, w9
+; -O0: bl __atomic_compare_exchange
+;
+; -O1-LABEL: atomicrmw_fsub_bfloat_unaligned_acquire:
+; -O1: add w8, w8, w20
+; -O1: add w8, w9, w8
+; -O1: bl __atomic_compare_exchange
+ %r = atomicrmw fsub ptr %ptr, bfloat %value acquire, align 1
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fsub_bfloat_unaligned_release(ptr %ptr, bfloat %value) {
+; -O0-LABEL: atomicrmw_fsub_bfloat_unaligned_release:
+; -O0: add w8, w8, w9
+; -O0: add w8, w8, w9
+; -O0: bl __atomic_compare_exchange
+;
+; -O1-LABEL: atomicrmw_fsub_bfloat_unaligned_release:
+; -O1: add w8, w8, w20
+; -O1: add w8, w9, w8
+; -O1: bl __atomic_compare_exchange
+ %r = atomicrmw fsub ptr %ptr, bfloat %value release, align 1
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fsub_bfloat_unaligned_acq_rel(ptr %ptr, bfloat %value) {
+; -O0-LABEL: atomicrmw_fsub_bfloat_unaligned_acq_rel:
+; -O0: add w8, w8, w9
+; -O0: add w8, w8, w9
+; -O0: bl __atomic_compare_exchange
+;
+; -O1-LABEL: atomicrmw_fsub_bfloat_unaligned_acq_rel:
+; -O1: add w8, w8, w20
+; -O1: add w8, w9, w8
+; -O1: bl __atomic_compare_exchange
+ %r = atomicrmw fsub ptr %ptr, bfloat %value acq_rel, align 1
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fsub_bfloat_unaligned_seq_cst(ptr %ptr, bfloat %value) {
+; -O0-LABEL: atomicrmw_fsub_bfloat_unaligned_seq_cst:
+; -O0: add w8, w8, w9
+; -O0: add w8, w8, w9
+; -O0: bl __atomic_compare_exchange
+;
+; -O1-LABEL: atomicrmw_fsub_bfloat_unaligned_seq_cst:
+; -O1: add w8, w8, w20
+; -O1: add w8, w9, w8
+; -O1: bl __atomic_compare_exchange
+ %r = atomicrmw fsub ptr %ptr, bfloat %value seq_cst, align 1
+ ret bfloat %r
+}
+
define dso_local double @atomicrmw_fsub_double_unaligned_monotonic(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fsub_double_unaligned_monotonic:
; CHECK: bl __atomic_compare_exchange
@@ -530,105 +800,140 @@ define dso_local double @atomicrmw_fsub_double_unaligned_seq_cst(ptr %ptr, doubl
define dso_local half @atomicrmw_fmax_half_aligned_monotonic(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fmax_half_aligned_monotonic:
-; CHECK: ldfmax h0, h0, [x0]
+; CHECK: ldfmaxnm h0, h0, [x0]
%r = atomicrmw fmax ptr %ptr, half %value monotonic, align 2
ret half %r
}
define dso_local half @atomicrmw_fmax_half_aligned_acquire(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fmax_half_aligned_acquire:
-; CHECK: ldfmaxa h0, h0, [x0]
+; CHECK: ldfmaxnma h0, h0, [x0]
%r = atomicrmw fmax ptr %ptr, half %value acquire, align 2
ret half %r
}
define dso_local half @atomicrmw_fmax_half_aligned_release(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fmax_half_aligned_release:
-; CHECK: ldfmaxl h0, h0, [x0]
+; CHECK: ldfmaxnml h0, h0, [x0]
%r = atomicrmw fmax ptr %ptr, half %value release, align 2
ret half %r
}
define dso_local half @atomicrmw_fmax_half_aligned_acq_rel(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fmax_half_aligned_acq_rel:
-; CHECK: ldfmaxal h0, h0, [x0]
+; CHECK: ldfmaxnmal h0, h0, [x0]
%r = atomicrmw fmax ptr %ptr, half %value acq_rel, align 2
ret half %r
}
define dso_local half @atomicrmw_fmax_half_aligned_seq_cst(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fmax_half_aligned_seq_cst:
-; CHECK: ldfmaxal h0, h0, [x0]
+; CHECK: ldfmaxnmal h0, h0, [x0]
%r = atomicrmw fmax ptr %ptr, half %value seq_cst, align 2
ret half %r
}
define dso_local float @atomicrmw_fmax_float_aligned_monotonic(ptr %ptr, float %value) {
; CHECK-LABEL: atomicrmw_fmax_float_aligned_monotonic:
-; CHECK: ldfmax s0, s0, [x0]
+; CHECK: ldfmaxnm s0, s0, [x0]
%r = atomicrmw fmax ptr %ptr, float %value monotonic, align 4
ret float %r
}
define dso_local float @atomicrmw_fmax_float_aligned_acquire(ptr %ptr, float %value) {
; CHECK-LABEL: atomicrmw_fmax_float_aligned_acquire:
-; CHECK: ldfmaxa s0, s0, [x0]
+; CHECK: ldfmaxnma s0, s0, [x0]
%r = atomicrmw fmax ptr %ptr, float %value acquire, align 4
ret float %r
}
define dso_local float @atomicrmw_fmax_float_aligned_release(ptr %ptr, float %value) {
; CHECK-LABEL: atomicrmw_fmax_float_aligned_release:
-; CHECK: ldfmaxl s0, s0, [x0]
+; CHECK: ldfmaxnml s0, s0, [x0]
%r = atomicrmw fmax ptr %ptr, float %value release, align 4
ret float %r
}
define dso_local float @atomicrmw_fmax_float_aligned_acq_rel(ptr %ptr, float %value) {
; CHECK-LABEL: atomicrmw_fmax_float_aligned_acq_rel:
-; CHECK: ldfmaxal s0, s0, [x0]
+; CHECK: ldfmaxnmal s0, s0, [x0]
%r = atomicrmw fmax ptr %ptr, float %value acq_rel, align 4
ret float %r
}
define dso_local float @atomicrmw_fmax_float_aligned_seq_cst(ptr %ptr, float %value) {
; CHECK-LABEL: atomicrmw_fmax_float_aligned_seq_cst:
-; CHECK: ldfmaxal s0, s0, [x0]
+; CHECK: ldfmaxnmal s0, s0, [x0]
%r = atomicrmw fmax ptr %ptr, float %value seq_cst, align 4
ret float %r
}
+define dso_local bfloat @atomicrmw_fmax_bfloat_aligned_monotonic(ptr %ptr, bfloat %value) {
+; CHECK-LABEL: atomicrmw_fmax_bfloat_aligned_monotonic:
+; CHECK: ldbfmaxnm h0, h0, [x0]
+ %r = atomicrmw fmax ptr %ptr, bfloat %value monotonic, align 4
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fmax_bfloat_aligned_acquire(ptr %ptr, bfloat %value) {
+; CHECK-LABEL: atomicrmw_fmax_bfloat_aligned_acquire:
+; CHECK: ldbfmaxnma h0, h0, [x0]
+ %r = atomicrmw fmax ptr %ptr, bfloat %value acquire, align 4
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fmax_bfloat_aligned_release(ptr %ptr, bfloat %value) {
+; CHECK-LABEL: atomicrmw_fmax_bfloat_aligned_release:
+; CHECK: ldbfmaxnml h0, h0, [x0]
+ %r = atomicrmw fmax ptr %ptr, bfloat %value release, align 4
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fmax_bfloat_aligned_acq_rel(ptr %ptr, bfloat %value) {
+; CHECK-LABEL: atomicrmw_fmax_bfloat_aligned_acq_rel:
+; CHECK: ldbfmaxnmal h0, h0, [x0]
+ %r = atomicrmw fmax ptr %ptr, bfloat %value acq_rel, align 4
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fmax_bfloat_aligned_seq_cst(ptr %ptr, bfloat %value) {
+; CHECK-LABEL: atomicrmw_fmax_bfloat_aligned_seq_cst:
+; CHECK: ldbfmaxnmal h0, h0, [x0]
+ %r = atomicrmw fmax ptr %ptr, bfloat %value seq_cst, align 4
+ ret bfloat %r
+}
+
define dso_local double @atomicrmw_fmax_double_aligned_monotonic(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmax_double_aligned_monotonic:
-; CHECK: ldfmax d0, d0, [x0]
+; CHECK: ldfmaxnm d0, d0, [x0]
%r = atomicrmw fmax ptr %ptr, double %value monotonic, align 8
ret double %r
}
define dso_local double @atomicrmw_fmax_double_aligned_acquire(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmax_double_aligned_acquire:
-; CHECK: ldfmaxa d0, d0, [x0]
+; CHECK: ldfmaxnma d0, d0, [x0]
%r = atomicrmw fmax ptr %ptr, double %value acquire, align 8
ret double %r
}
define dso_local double @atomicrmw_fmax_double_aligned_release(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmax_double_aligned_release:
-; CHECK: ldfmaxl d0, d0, [x0]
+; CHECK: ldfmaxnml d0, d0, [x0]
%r = atomicrmw fmax ptr %ptr, double %value release, align 8
ret double %r
}
define dso_local double @atomicrmw_fmax_double_aligned_acq_rel(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmax_double_aligned_acq_rel:
-; CHECK: ldfmaxal d0, d0, [x0]
+; CHECK: ldfmaxnmal d0, d0, [x0]
%r = atomicrmw fmax ptr %ptr, double %value acq_rel, align 8
ret double %r
}
define dso_local double @atomicrmw_fmax_double_aligned_seq_cst(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmax_double_aligned_seq_cst:
-; CHECK: ldfmaxal d0, d0, [x0]
+; CHECK: ldfmaxnmal d0, d0, [x0]
%r = atomicrmw fmax ptr %ptr, double %value seq_cst, align 8
ret double %r
}
@@ -703,6 +1008,76 @@ define dso_local float @atomicrmw_fmax_float_unaligned_seq_cst(ptr %ptr, float %
ret float %r
}
+define dso_local bfloat @atomicrmw_fmax_bfloat_unaligned_monotonic(ptr %ptr, bfloat %value) {
+; -O0-LABEL: atomicrmw_fmax_bfloat_unaligned_monotonic:
+; -O0: add w8, w8, w9
+; -O0: add w8, w8, w9
+; -O0: bl __atomic_compare_exchange
+;
+; -O1-LABEL: atomicrmw_fmax_bfloat_unaligned_monotonic:
+; -O1: add w8, w8, w20
+; -O1: add w8, w9, w8
+; -O1: bl __atomic_compare_exchange
+ %r = atomicrmw fmax ptr %ptr, bfloat %value monotonic, align 1
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fmax_bfloat_unaligned_acquire(ptr %ptr, bfloat %value) {
+; -O0-LABEL: atomicrmw_fmax_bfloat_unaligned_acquire:
+; -O0: add w8, w8, w9
+; -O0: add w8, w8, w9
+; -O0: bl __atomic_compare_exchange
+;
+; -O1-LABEL: atomicrmw_fmax_bfloat_unaligned_acquire:
+; -O1: add w8, w8, w20
+; -O1: add w8, w9, w8
+; -O1: bl __atomic_compare_exchange
+ %r = atomicrmw fmax ptr %ptr, bfloat %value acquire, align 1
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fmax_bfloat_unaligned_release(ptr %ptr, bfloat %value) {
+; -O0-LABEL: atomicrmw_fmax_bfloat_unaligned_release:
+; -O0: add w8, w8, w9
+; -O0: add w8, w8, w9
+; -O0: bl __atomic_compare_exchange
+;
+; -O1-LABEL: atomicrmw_fmax_bfloat_unaligned_release:
+; -O1: add w8, w8, w20
+; -O1: add w8, w9, w8
+; -O1: bl __atomic_compare_exchange
+ %r = atomicrmw fmax ptr %ptr, bfloat %value release, align 1
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fmax_bfloat_unaligned_acq_rel(ptr %ptr, bfloat %value) {
+; -O0-LABEL: atomicrmw_fmax_bfloat_unaligned_acq_rel:
+; -O0: add w8, w8, w9
+; -O0: add w8, w8, w9
+; -O0: bl __atomic_compare_exchange
+;
+; -O1-LABEL: atomicrmw_fmax_bfloat_unaligned_acq_rel:
+; -O1: add w8, w8, w20
+; -O1: add w8, w9, w8
+; -O1: bl __atomic_compare_exchange
+ %r = atomicrmw fmax ptr %ptr, bfloat %value acq_rel, align 1
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fmax_bfloat_unaligned_seq_cst(ptr %ptr, bfloat %value) {
+; -O0-LABEL: atomicrmw_fmax_bfloat_unaligned_seq_cst:
+; -O0: add w8, w8, w9
+; -O0: add w8, w8, w9
+; -O0: bl __atomic_compare_exchange
+;
+; -O1-LABEL: atomicrmw_fmax_bfloat_unaligned_seq_cst:
+; -O1: add w8, w8, w20
+; -O1: add w8, w9, w8
+; -O1: bl __atomic_compare_exchange
+ %r = atomicrmw fmax ptr %ptr, bfloat %value seq_cst, align 1
+ ret bfloat %r
+}
+
define dso_local double @atomicrmw_fmax_double_unaligned_monotonic(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmax_double_unaligned_monotonic:
; CHECK: bl __atomic_compare_exchange
@@ -740,105 +1115,140 @@ define dso_local double @atomicrmw_fmax_double_unaligned_seq_cst(ptr %ptr, doubl
define dso_local half @atomicrmw_fmin_half_aligned_monotonic(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fmin_half_aligned_monotonic:
-; CHECK: ldfmin h0, h0, [x0]
+; CHECK: ldfminnm h0, h0, [x0]
%r = atomicrmw fmin ptr %ptr, half %value monotonic, align 2
ret half %r
}
define dso_local half @atomicrmw_fmin_half_aligned_acquire(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fmin_half_aligned_acquire:
-; CHECK: ldfmina h0, h0, [x0]
+; CHECK: ldfminnma h0, h0, [x0]
%r = atomicrmw fmin ptr %ptr, half %value acquire, align 2
ret half %r
}
define dso_local half @atomicrmw_fmin_half_aligned_release(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fmin_half_aligned_release:
-; CHECK: ldfminl h0, h0, [x0]
+; CHECK: ldfminnml h0, h0, [x0]
%r = atomicrmw fmin ptr %ptr, half %value release, align 2
ret half %r
}
define dso_local half @atomicrmw_fmin_half_aligned_acq_rel(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fmin_half_aligned_acq_rel:
-; CHECK: ldfminal h0, h0, [x0]
+; CHECK: ldfminnmal h0, h0, [x0]
%r = atomicrmw fmin ptr %ptr, half %value acq_rel, align 2
ret half %r
}
define dso_local half @atomicrmw_fmin_half_aligned_seq_cst(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fmin_half_aligned_seq_cst:
-; CHECK: ldfminal h0, h0, [x0]
+; CHECK: ldfminnmal h0, h0, [x0]
%r = atomicrmw fmin ptr %ptr, half %value seq_cst, align 2
ret half %r
}
define dso_local float @atomicrmw_fmin_float_aligned_monotonic(ptr %ptr, float %value) {
; CHECK-LABEL: atomicrmw_fmin_float_aligned_monotonic:
-; CHECK: ldfmin s0, s0, [x0]
+; CHECK: ldfminnm s0, s0, [x0]
%r = atomicrmw fmin ptr %ptr, float %value monotonic, align 4
ret float %r
}
define dso_local float @atomicrmw_fmin_float_aligned_acquire(ptr %ptr, float %value) {
; CHECK-LABEL: atomicrmw_fmin_float_aligned_acquire:
-; CHECK: ldfmina s0, s0, [x0]
+; CHECK: ldfminnma s0, s0, [x0]
%r = atomicrmw fmin ptr %ptr, float %value acquire, align 4
ret float %r
}
define dso_local float @atomicrmw_fmin_float_aligned_release(ptr %ptr, float %value) {
; CHECK-LABEL: atomicrmw_fmin_float_aligned_release:
-; CHECK: ldfminl s0, s0, [x0]
+; CHECK: ldfminnml s0, s0, [x0]
%r = atomicrmw fmin ptr %ptr, float %value release, align 4
ret float %r
}
define dso_local float @atomicrmw_fmin_float_aligned_acq_rel(ptr %ptr, float %value) {
; CHECK-LABEL: atomicrmw_fmin_float_aligned_acq_rel:
-; CHECK: ldfminal s0, s0, [x0]
+; CHECK: ldfminnmal s0, s0, [x0]
%r = atomicrmw fmin ptr %ptr, float %value acq_rel, align 4
ret float %r
}
define dso_local float @atomicrmw_fmin_float_aligned_seq_cst(ptr %ptr, float %value) {
; CHECK-LABEL: atomicrmw_fmin_float_aligned_seq_cst:
-; CHECK: ldfminal s0, s0, [x0]
+; CHECK: ldfminnmal s0, s0, [x0]
%r = atomicrmw fmin ptr %ptr, float %value seq_cst, align 4
ret float %r
}
+define dso_local bfloat @atomicrmw_fmin_bfloat_aligned_monotonic(ptr %ptr, bfloat %value) {
+; CHECK-LABEL: atomicrmw_fmin_bfloat_aligned_monotonic:
+; CHECK: ldbfminnm h0, h0, [x0]
+ %r = atomicrmw fmin ptr %ptr, bfloat %value monotonic, align 4
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fmin_bfloat_aligned_acquire(ptr %ptr, bfloat %value) {
+; CHECK-LABEL: atomicrmw_fmin_bfloat_aligned_acquire:
+; CHECK: ldbfminnma h0, h0, [x0]
+ %r = atomicrmw fmin ptr %ptr, bfloat %value acquire, align 4
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fmin_bfloat_aligned_release(ptr %ptr, bfloat %value) {
+; CHECK-LABEL: atomicrmw_fmin_bfloat_aligned_release:
+; CHECK: ldbfminnml h0, h0, [x0]
+ %r = atomicrmw fmin ptr %ptr, bfloat %value release, align 4
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fmin_bfloat_aligned_acq_rel(ptr %ptr, bfloat %value) {
+; CHECK-LABEL: atomicrmw_fmin_bfloat_aligned_acq_rel:
+; CHECK: ldbfminnmal h0, h0, [x0]
+ %r = atomicrmw fmin ptr %ptr, bfloat %value acq_rel, align 4
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fmin_bfloat_aligned_seq_cst(ptr %ptr, bfloat %value) {
+; CHECK-LABEL: atomicrmw_fmin_bfloat_aligned_seq_cst:
+; CHECK: ldbfminnmal h0, h0, [x0]
+ %r = atomicrmw fmin ptr %ptr, bfloat %value seq_cst, align 4
+ ret bfloat %r
+}
+
define dso_local double @atomicrmw_fmin_double_aligned_monotonic(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmin_double_aligned_monotonic:
-; CHECK: ldfmin d0, d0, [x0]
+; CHECK: ldfminnm d0, d0, [x0]
%r = atomicrmw fmin ptr %ptr, double %value monotonic, align 8
ret double %r
}
define dso_local double @atomicrmw_fmin_double_aligned_acquire(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmin_double_aligned_acquire:
-; CHECK: ldfmina d0, d0, [x0]
+; CHECK: ldfminnma d0, d0, [x0]
%r = atomicrmw fmin ptr %ptr, double %value acquire, align 8
ret double %r
}
define dso_local double @atomicrmw_fmin_double_aligned_release(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmin_double_aligned_release:
-; CHECK: ldfminl d0, d0, [x0]
+; CHECK: ldfminnml d0, d0, [x0]
%r = atomicrmw fmin ptr %ptr, double %value release, align 8
ret double %r
}
define dso_local double @atomicrmw_fmin_double_aligned_acq_rel(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmin_double_aligned_acq_rel:
-; CHECK: ldfminal d0, d0, [x0]
+; CHECK: ldfminnmal d0, d0, [x0]
%r = atomicrmw fmin ptr %ptr, double %value acq_rel, align 8
ret double %r
}
define dso_local double @atomicrmw_fmin_double_aligned_seq_cst(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmin_double_aligned_seq_cst:
-; CHECK: ldfminal d0, d0, [x0]
+; CHECK: ldfminnmal d0, d0, [x0]
%r = atomicrmw fmin ptr %ptr, double %value seq_cst, align 8
ret double %r
}
@@ -913,6 +1323,76 @@ define dso_local float @atomicrmw_fmin_float_unaligned_seq_cst(ptr %ptr, float %
ret float %r
}
+define dso_local bfloat @atomicrmw_fmin_bfloat_unaligned_monotonic(ptr %ptr, bfloat %value) {
+; -O0-LABEL: atomicrmw_fmin_bfloat_unaligned_monotonic:
+; -O0: add w8, w8, w9
+; -O0: add w8, w8, w9
+; -O0: bl __atomic_compare_exchange
+;
+; -O1-LABEL: atomicrmw_fmin_bfloat_unaligned_monotonic:
+; -O1: add w8, w8, w20
+; -O1: add w8, w9, w8
+; -O1: bl __atomic_compare_exchange
+ %r = atomicrmw fmin ptr %ptr, bfloat %value monotonic, align 1
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fmin_bfloat_unaligned_acquire(ptr %ptr, bfloat %value) {
+; -O0-LABEL: atomicrmw_fmin_bfloat_unaligned_acquire:
+; -O0: add w8, w8, w9
+; -O0: add w8, w8, w9
+; -O0: bl __atomic_compare_exchange
+;
+; -O1-LABEL: atomicrmw_fmin_bfloat_unaligned_acquire:
+; -O1: add w8, w8, w20
+; -O1: add w8, w9, w8
+; -O1: bl __atomic_compare_exchange
+ %r = atomicrmw fmin ptr %ptr, bfloat %value acquire, align 1
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fmin_bfloat_unaligned_release(ptr %ptr, bfloat %value) {
+; -O0-LABEL: atomicrmw_fmin_bfloat_unaligned_release:
+; -O0: add w8, w8, w9
+; -O0: add w8, w8, w9
+; -O0: bl __atomic_compare_exchange
+;
+; -O1-LABEL: atomicrmw_fmin_bfloat_unaligned_release:
+; -O1: add w8, w8, w20
+; -O1: add w8, w9, w8
+; -O1: bl __atomic_compare_exchange
+ %r = atomicrmw fmin ptr %ptr, bfloat %value release, align 1
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fmin_bfloat_unaligned_acq_rel(ptr %ptr, bfloat %value) {
+; -O0-LABEL: atomicrmw_fmin_bfloat_unaligned_acq_rel:
+; -O0: add w8, w8, w9
+; -O0: add w8, w8, w9
+; -O0: bl __atomic_compare_exchange
+;
+; -O1-LABEL: atomicrmw_fmin_bfloat_unaligned_acq_rel:
+; -O1: add w8, w8, w20
+; -O1: add w8, w9, w8
+; -O1: bl __atomic_compare_exchange
+ %r = atomicrmw fmin ptr %ptr, bfloat %value acq_rel, align 1
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fmin_bfloat_unaligned_seq_cst(ptr %ptr, bfloat %value) {
+; -O0-LABEL: atomicrmw_fmin_bfloat_unaligned_seq_cst:
+; -O0: add w8, w8, w9
+; -O0: add w8, w8, w9
+; -O0: bl __atomic_compare_exchange
+;
+; -O1-LABEL: atomicrmw_fmin_bfloat_unaligned_seq_cst:
+; -O1: add w8, w8, w20
+; -O1: add w8, w9, w8
+; -O1: bl __atomic_compare_exchange
+ %r = atomicrmw fmin ptr %ptr, bfloat %value seq_cst, align 1
+ ret bfloat %r
+}
+
define dso_local double @atomicrmw_fmin_double_unaligned_monotonic(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmin_double_unaligned_monotonic:
; CHECK: bl __atomic_compare_exchange
diff --git a/llvm/test/CodeGen/AArch64/Atomics/aarch64_be-atomicrmw-lsfe.ll b/llvm/test/CodeGen/AArch64/Atomics/aarch64_be-atomicrmw-lsfe.ll
index d6ae20f4f18a1a4..8a0a92dee0b2ef0 100644
--- a/llvm/test/CodeGen/AArch64/Atomics/aarch64_be-atomicrmw-lsfe.ll
+++ b/llvm/test/CodeGen/AArch64/Atomics/aarch64_be-atomicrmw-lsfe.ll
@@ -73,6 +73,41 @@ define dso_local float @atomicrmw_fadd_float_aligned_seq_cst(ptr %ptr, float %va
ret float %r
}
+define dso_local bfloat @atomicrmw_fadd_bfloat_aligned_monotonic(ptr %ptr, bfloat %value) {
+; CHECK-LABEL: atomicrmw_fadd_bfloat_aligned_monotonic:
+; CHECK: ldbfadd h0, h0, [x0]
+ %r = atomicrmw fadd ptr %ptr, bfloat %value monotonic, align 4
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fadd_bfloat_aligned_acquire(ptr %ptr, bfloat %value) {
+; CHECK-LABEL: atomicrmw_fadd_bfloat_aligned_acquire:
+; CHECK: ldbfadda h0, h0, [x0]
+ %r = atomicrmw fadd ptr %ptr, bfloat %value acquire, align 4
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fadd_bfloat_aligned_release(ptr %ptr, bfloat %value) {
+; CHECK-LABEL: atomicrmw_fadd_bfloat_aligned_release:
+; CHECK: ldbfaddl h0, h0, [x0]
+ %r = atomicrmw fadd ptr %ptr, bfloat %value release, align 4
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fadd_bfloat_aligned_acq_rel(ptr %ptr, bfloat %value) {
+; CHECK-LABEL: atomicrmw_fadd_bfloat_aligned_acq_rel:
+; CHECK: ldbfaddal h0, h0, [x0]
+ %r = atomicrmw fadd ptr %ptr, bfloat %value acq_rel, align 4
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fadd_bfloat_aligned_seq_cst(ptr %ptr, bfloat %value) {
+; CHECK-LABEL: atomicrmw_fadd_bfloat_aligned_seq_cst:
+; CHECK: ldbfaddal h0, h0, [x0]
+ %r = atomicrmw fadd ptr %ptr, bfloat %value seq_cst, align 4
+ ret bfloat %r
+}
+
define dso_local double @atomicrmw_fadd_double_aligned_monotonic(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fadd_double_aligned_monotonic:
; CHECK: ldfadd d0, d0, [x0]
@@ -178,6 +213,76 @@ define dso_local float @atomicrmw_fadd_float_unaligned_seq_cst(ptr %ptr, float %
ret float %r
}
+define dso_local bfloat @atomicrmw_fadd_bfloat_unaligned_monotonic(ptr %ptr, bfloat %value) {
+; -O0-LABEL: atomicrmw_fadd_bfloat_unaligned_monotonic:
+; -O0: add w8, w8, w9
+; -O0: add w8, w8, w9
+; -O0: bl __atomic_compare_exchange
+;
+; -O1-LABEL: atomicrmw_fadd_bfloat_unaligned_monotonic:
+; -O1: add w8, w8, w20
+; -O1: add w8, w9, w8
+; -O1: bl __atomic_compare_exchange
+ %r = atomicrmw fadd ptr %ptr, bfloat %value monotonic, align 1
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fadd_bfloat_unaligned_acquire(ptr %ptr, bfloat %value) {
+; -O0-LABEL: atomicrmw_fadd_bfloat_unaligned_acquire:
+; -O0: add w8, w8, w9
+; -O0: add w8, w8, w9
+; -O0: bl __atomic_compare_exchange
+;
+; -O1-LABEL: atomicrmw_fadd_bfloat_unaligned_acquire:
+; -O1: add w8, w8, w20
+; -O1: add w8, w9, w8
+; -O1: bl __atomic_compare_exchange
+ %r = atomicrmw fadd ptr %ptr, bfloat %value acquire, align 1
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fadd_bfloat_unaligned_release(ptr %ptr, bfloat %value) {
+; -O0-LABEL: atomicrmw_fadd_bfloat_unaligned_release:
+; -O0: add w8, w8, w9
+; -O0: add w8, w8, w9
+; -O0: bl __atomic_compare_exchange
+;
+; -O1-LABEL: atomicrmw_fadd_bfloat_unaligned_release:
+; -O1: add w8, w8, w20
+; -O1: add w8, w9, w8
+; -O1: bl __atomic_compare_exchange
+ %r = atomicrmw fadd ptr %ptr, bfloat %value release, align 1
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fadd_bfloat_unaligned_acq_rel(ptr %ptr, bfloat %value) {
+; -O0-LABEL: atomicrmw_fadd_bfloat_unaligned_acq_rel:
+; -O0: add w8, w8, w9
+; -O0: add w8, w8, w9
+; -O0: bl __atomic_compare_exchange
+;
+; -O1-LABEL: atomicrmw_fadd_bfloat_unaligned_acq_rel:
+; -O1: add w8, w8, w20
+; -O1: add w8, w9, w8
+; -O1: bl __atomic_compare_exchange
+ %r = atomicrmw fadd ptr %ptr, bfloat %value acq_rel, align 1
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fadd_bfloat_unaligned_seq_cst(ptr %ptr, bfloat %value) {
+; -O0-LABEL: atomicrmw_fadd_bfloat_unaligned_seq_cst:
+; -O0: add w8, w8, w9
+; -O0: add w8, w8, w9
+; -O0: bl __atomic_compare_exchange
+;
+; -O1-LABEL: atomicrmw_fadd_bfloat_unaligned_seq_cst:
+; -O1: add w8, w8, w20
+; -O1: add w8, w9, w8
+; -O1: bl __atomic_compare_exchange
+ %r = atomicrmw fadd ptr %ptr, bfloat %value seq_cst, align 1
+ ret bfloat %r
+}
+
define dso_local double @atomicrmw_fadd_double_unaligned_monotonic(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fadd_double_unaligned_monotonic:
; CHECK: bl __atomic_compare_exchange
@@ -363,6 +468,101 @@ define dso_local float @atomicrmw_fsub_float_aligned_seq_cst(ptr %ptr, float %va
ret float %r
}
+define dso_local bfloat @atomicrmw_fsub_bfloat_aligned_monotonic(ptr %ptr, bfloat %value) {
+; -O0-LABEL: atomicrmw_fsub_bfloat_aligned_monotonic:
+; -O0: add w8, w8, w9
+; -O0: add w8, w8, w9
+; -O0: ldaxrh w9, [x11]
+; -O0: cmp w9, w8, uxth
+; -O0: stlxrh w10, w12, [x11]
+; -O0: subs w8, w9, w8, uxth
+; -O0: subs w8, w8, #1
+;
+; -O1-LABEL: atomicrmw_fsub_bfloat_aligned_monotonic:
+; -O1: ldxrh w9, [x0]
+; -O1: add w9, w9, w8
+; -O1: add w9, w10, w9
+; -O1: stxrh w10, w9, [x0]
+ %r = atomicrmw fsub ptr %ptr, bfloat %value monotonic, align 4
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fsub_bfloat_aligned_acquire(ptr %ptr, bfloat %value) {
+; -O0-LABEL: atomicrmw_fsub_bfloat_aligned_acquire:
+; -O0: add w8, w8, w9
+; -O0: add w8, w8, w9
+; -O0: ldaxrh w9, [x11]
+; -O0: cmp w9, w8, uxth
+; -O0: stlxrh w10, w12, [x11]
+; -O0: subs w8, w9, w8, uxth
+; -O0: subs w8, w8, #1
+;
+; -O1-LABEL: atomicrmw_fsub_bfloat_aligned_acquire:
+; -O1: ldaxrh w9, [x0]
+; -O1: add w9, w9, w8
+; -O1: add w9, w10, w9
+; -O1: stxrh w10, w9, [x0]
+ %r = atomicrmw fsub ptr %ptr, bfloat %value acquire, align 4
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fsub_bfloat_aligned_release(ptr %ptr, bfloat %value) {
+; -O0-LABEL: atomicrmw_fsub_bfloat_aligned_release:
+; -O0: add w8, w8, w9
+; -O0: add w8, w8, w9
+; -O0: ldaxrh w9, [x11]
+; -O0: cmp w9, w8, uxth
+; -O0: stlxrh w10, w12, [x11]
+; -O0: subs w8, w9, w8, uxth
+; -O0: subs w8, w8, #1
+;
+; -O1-LABEL: atomicrmw_fsub_bfloat_aligned_release:
+; -O1: ldxrh w9, [x0]
+; -O1: add w9, w9, w8
+; -O1: add w9, w10, w9
+; -O1: stlxrh w10, w9, [x0]
+ %r = atomicrmw fsub ptr %ptr, bfloat %value release, align 4
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fsub_bfloat_aligned_acq_rel(ptr %ptr, bfloat %value) {
+; -O0-LABEL: atomicrmw_fsub_bfloat_aligned_acq_rel:
+; -O0: add w8, w8, w9
+; -O0: add w8, w8, w9
+; -O0: ldaxrh w9, [x11]
+; -O0: cmp w9, w8, uxth
+; -O0: stlxrh w10, w12, [x11]
+; -O0: subs w8, w9, w8, uxth
+; -O0: subs w8, w8, #1
+;
+; -O1-LABEL: atomicrmw_fsub_bfloat_aligned_acq_rel:
+; -O1: ldaxrh w9, [x0]
+; -O1: add w9, w9, w8
+; -O1: add w9, w10, w9
+; -O1: stlxrh w10, w9, [x0]
+ %r = atomicrmw fsub ptr %ptr, bfloat %value acq_rel, align 4
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fsub_bfloat_aligned_seq_cst(ptr %ptr, bfloat %value) {
+; -O0-LABEL: atomicrmw_fsub_bfloat_aligned_seq_cst:
+; -O0: add w8, w8, w9
+; -O0: add w8, w8, w9
+; -O0: ldaxrh w9, [x11]
+; -O0: cmp w9, w8, uxth
+; -O0: stlxrh w10, w12, [x11]
+; -O0: subs w8, w9, w8, uxth
+; -O0: subs w8, w8, #1
+;
+; -O1-LABEL: atomicrmw_fsub_bfloat_aligned_seq_cst:
+; -O1: ldaxrh w9, [x0]
+; -O1: add w9, w9, w8
+; -O1: add w9, w10, w9
+; -O1: stlxrh w10, w9, [x0]
+ %r = atomicrmw fsub ptr %ptr, bfloat %value seq_cst, align 4
+ ret bfloat %r
+}
+
define dso_local double @atomicrmw_fsub_double_aligned_monotonic(ptr %ptr, double %value) {
; -O0-LABEL: atomicrmw_fsub_double_aligned_monotonic:
; -O0: ldaxr x9, [x11]
@@ -508,6 +708,76 @@ define dso_local float @atomicrmw_fsub_float_unaligned_seq_cst(ptr %ptr, float %
ret float %r
}
+define dso_local bfloat @atomicrmw_fsub_bfloat_unaligned_monotonic(ptr %ptr, bfloat %value) {
+; -O0-LABEL: atomicrmw_fsub_bfloat_unaligned_monotonic:
+; -O0: add w8, w8, w9
+; -O0: add w8, w8, w9
+; -O0: bl __atomic_compare_exchange
+;
+; -O1-LABEL: atomicrmw_fsub_bfloat_unaligned_monotonic:
+; -O1: add w8, w8, w20
+; -O1: add w8, w9, w8
+; -O1: bl __atomic_compare_exchange
+ %r = atomicrmw fsub ptr %ptr, bfloat %value monotonic, align 1
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fsub_bfloat_unaligned_acquire(ptr %ptr, bfloat %value) {
+; -O0-LABEL: atomicrmw_fsub_bfloat_unaligned_acquire:
+; -O0: add w8, w8, w9
+; -O0: add w8, w8, w9
+; -O0: bl __atomic_compare_exchange
+;
+; -O1-LABEL: atomicrmw_fsub_bfloat_unaligned_acquire:
+; -O1: add w8, w8, w20
+; -O1: add w8, w9, w8
+; -O1: bl __atomic_compare_exchange
+ %r = atomicrmw fsub ptr %ptr, bfloat %value acquire, align 1
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fsub_bfloat_unaligned_release(ptr %ptr, bfloat %value) {
+; -O0-LABEL: atomicrmw_fsub_bfloat_unaligned_release:
+; -O0: add w8, w8, w9
+; -O0: add w8, w8, w9
+; -O0: bl __atomic_compare_exchange
+;
+; -O1-LABEL: atomicrmw_fsub_bfloat_unaligned_release:
+; -O1: add w8, w8, w20
+; -O1: add w8, w9, w8
+; -O1: bl __atomic_compare_exchange
+ %r = atomicrmw fsub ptr %ptr, bfloat %value release, align 1
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fsub_bfloat_unaligned_acq_rel(ptr %ptr, bfloat %value) {
+; -O0-LABEL: atomicrmw_fsub_bfloat_unaligned_acq_rel:
+; -O0: add w8, w8, w9
+; -O0: add w8, w8, w9
+; -O0: bl __atomic_compare_exchange
+;
+; -O1-LABEL: atomicrmw_fsub_bfloat_unaligned_acq_rel:
+; -O1: add w8, w8, w20
+; -O1: add w8, w9, w8
+; -O1: bl __atomic_compare_exchange
+ %r = atomicrmw fsub ptr %ptr, bfloat %value acq_rel, align 1
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fsub_bfloat_unaligned_seq_cst(ptr %ptr, bfloat %value) {
+; -O0-LABEL: atomicrmw_fsub_bfloat_unaligned_seq_cst:
+; -O0: add w8, w8, w9
+; -O0: add w8, w8, w9
+; -O0: bl __atomic_compare_exchange
+;
+; -O1-LABEL: atomicrmw_fsub_bfloat_unaligned_seq_cst:
+; -O1: add w8, w8, w20
+; -O1: add w8, w9, w8
+; -O1: bl __atomic_compare_exchange
+ %r = atomicrmw fsub ptr %ptr, bfloat %value seq_cst, align 1
+ ret bfloat %r
+}
+
define dso_local double @atomicrmw_fsub_double_unaligned_monotonic(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fsub_double_unaligned_monotonic:
; CHECK: bl __atomic_compare_exchange
@@ -545,105 +815,140 @@ define dso_local double @atomicrmw_fsub_double_unaligned_seq_cst(ptr %ptr, doubl
define dso_local half @atomicrmw_fmax_half_aligned_monotonic(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fmax_half_aligned_monotonic:
-; CHECK: ldfmax h0, h0, [x0]
+; CHECK: ldfmaxnm h0, h0, [x0]
%r = atomicrmw fmax ptr %ptr, half %value monotonic, align 2
ret half %r
}
define dso_local half @atomicrmw_fmax_half_aligned_acquire(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fmax_half_aligned_acquire:
-; CHECK: ldfmaxa h0, h0, [x0]
+; CHECK: ldfmaxnma h0, h0, [x0]
%r = atomicrmw fmax ptr %ptr, half %value acquire, align 2
ret half %r
}
define dso_local half @atomicrmw_fmax_half_aligned_release(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fmax_half_aligned_release:
-; CHECK: ldfmaxl h0, h0, [x0]
+; CHECK: ldfmaxnml h0, h0, [x0]
%r = atomicrmw fmax ptr %ptr, half %value release, align 2
ret half %r
}
define dso_local half @atomicrmw_fmax_half_aligned_acq_rel(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fmax_half_aligned_acq_rel:
-; CHECK: ldfmaxal h0, h0, [x0]
+; CHECK: ldfmaxnmal h0, h0, [x0]
%r = atomicrmw fmax ptr %ptr, half %value acq_rel, align 2
ret half %r
}
define dso_local half @atomicrmw_fmax_half_aligned_seq_cst(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fmax_half_aligned_seq_cst:
-; CHECK: ldfmaxal h0, h0, [x0]
+; CHECK: ldfmaxnmal h0, h0, [x0]
%r = atomicrmw fmax ptr %ptr, half %value seq_cst, align 2
ret half %r
}
define dso_local float @atomicrmw_fmax_float_aligned_monotonic(ptr %ptr, float %value) {
; CHECK-LABEL: atomicrmw_fmax_float_aligned_monotonic:
-; CHECK: ldfmax s0, s0, [x0]
+; CHECK: ldfmaxnm s0, s0, [x0]
%r = atomicrmw fmax ptr %ptr, float %value monotonic, align 4
ret float %r
}
define dso_local float @atomicrmw_fmax_float_aligned_acquire(ptr %ptr, float %value) {
; CHECK-LABEL: atomicrmw_fmax_float_aligned_acquire:
-; CHECK: ldfmaxa s0, s0, [x0]
+; CHECK: ldfmaxnma s0, s0, [x0]
%r = atomicrmw fmax ptr %ptr, float %value acquire, align 4
ret float %r
}
define dso_local float @atomicrmw_fmax_float_aligned_release(ptr %ptr, float %value) {
; CHECK-LABEL: atomicrmw_fmax_float_aligned_release:
-; CHECK: ldfmaxl s0, s0, [x0]
+; CHECK: ldfmaxnml s0, s0, [x0]
%r = atomicrmw fmax ptr %ptr, float %value release, align 4
ret float %r
}
define dso_local float @atomicrmw_fmax_float_aligned_acq_rel(ptr %ptr, float %value) {
; CHECK-LABEL: atomicrmw_fmax_float_aligned_acq_rel:
-; CHECK: ldfmaxal s0, s0, [x0]
+; CHECK: ldfmaxnmal s0, s0, [x0]
%r = atomicrmw fmax ptr %ptr, float %value acq_rel, align 4
ret float %r
}
define dso_local float @atomicrmw_fmax_float_aligned_seq_cst(ptr %ptr, float %value) {
; CHECK-LABEL: atomicrmw_fmax_float_aligned_seq_cst:
-; CHECK: ldfmaxal s0, s0, [x0]
+; CHECK: ldfmaxnmal s0, s0, [x0]
%r = atomicrmw fmax ptr %ptr, float %value seq_cst, align 4
ret float %r
}
+define dso_local bfloat @atomicrmw_fmax_bfloat_aligned_monotonic(ptr %ptr, bfloat %value) {
+; CHECK-LABEL: atomicrmw_fmax_bfloat_aligned_monotonic:
+; CHECK: ldbfmaxnm h0, h0, [x0]
+ %r = atomicrmw fmax ptr %ptr, bfloat %value monotonic, align 4
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fmax_bfloat_aligned_acquire(ptr %ptr, bfloat %value) {
+; CHECK-LABEL: atomicrmw_fmax_bfloat_aligned_acquire:
+; CHECK: ldbfmaxnma h0, h0, [x0]
+ %r = atomicrmw fmax ptr %ptr, bfloat %value acquire, align 4
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fmax_bfloat_aligned_release(ptr %ptr, bfloat %value) {
+; CHECK-LABEL: atomicrmw_fmax_bfloat_aligned_release:
+; CHECK: ldbfmaxnml h0, h0, [x0]
+ %r = atomicrmw fmax ptr %ptr, bfloat %value release, align 4
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fmax_bfloat_aligned_acq_rel(ptr %ptr, bfloat %value) {
+; CHECK-LABEL: atomicrmw_fmax_bfloat_aligned_acq_rel:
+; CHECK: ldbfmaxnmal h0, h0, [x0]
+ %r = atomicrmw fmax ptr %ptr, bfloat %value acq_rel, align 4
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fmax_bfloat_aligned_seq_cst(ptr %ptr, bfloat %value) {
+; CHECK-LABEL: atomicrmw_fmax_bfloat_aligned_seq_cst:
+; CHECK: ldbfmaxnmal h0, h0, [x0]
+ %r = atomicrmw fmax ptr %ptr, bfloat %value seq_cst, align 4
+ ret bfloat %r
+}
+
define dso_local double @atomicrmw_fmax_double_aligned_monotonic(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmax_double_aligned_monotonic:
-; CHECK: ldfmax d0, d0, [x0]
+; CHECK: ldfmaxnm d0, d0, [x0]
%r = atomicrmw fmax ptr %ptr, double %value monotonic, align 8
ret double %r
}
define dso_local double @atomicrmw_fmax_double_aligned_acquire(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmax_double_aligned_acquire:
-; CHECK: ldfmaxa d0, d0, [x0]
+; CHECK: ldfmaxnma d0, d0, [x0]
%r = atomicrmw fmax ptr %ptr, double %value acquire, align 8
ret double %r
}
define dso_local double @atomicrmw_fmax_double_aligned_release(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmax_double_aligned_release:
-; CHECK: ldfmaxl d0, d0, [x0]
+; CHECK: ldfmaxnml d0, d0, [x0]
%r = atomicrmw fmax ptr %ptr, double %value release, align 8
ret double %r
}
define dso_local double @atomicrmw_fmax_double_aligned_acq_rel(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmax_double_aligned_acq_rel:
-; CHECK: ldfmaxal d0, d0, [x0]
+; CHECK: ldfmaxnmal d0, d0, [x0]
%r = atomicrmw fmax ptr %ptr, double %value acq_rel, align 8
ret double %r
}
define dso_local double @atomicrmw_fmax_double_aligned_seq_cst(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmax_double_aligned_seq_cst:
-; CHECK: ldfmaxal d0, d0, [x0]
+; CHECK: ldfmaxnmal d0, d0, [x0]
%r = atomicrmw fmax ptr %ptr, double %value seq_cst, align 8
ret double %r
}
@@ -718,6 +1023,76 @@ define dso_local float @atomicrmw_fmax_float_unaligned_seq_cst(ptr %ptr, float %
ret float %r
}
+define dso_local bfloat @atomicrmw_fmax_bfloat_unaligned_monotonic(ptr %ptr, bfloat %value) {
+; -O0-LABEL: atomicrmw_fmax_bfloat_unaligned_monotonic:
+; -O0: add w8, w8, w9
+; -O0: add w8, w8, w9
+; -O0: bl __atomic_compare_exchange
+;
+; -O1-LABEL: atomicrmw_fmax_bfloat_unaligned_monotonic:
+; -O1: add w8, w8, w20
+; -O1: add w8, w9, w8
+; -O1: bl __atomic_compare_exchange
+ %r = atomicrmw fmax ptr %ptr, bfloat %value monotonic, align 1
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fmax_bfloat_unaligned_acquire(ptr %ptr, bfloat %value) {
+; -O0-LABEL: atomicrmw_fmax_bfloat_unaligned_acquire:
+; -O0: add w8, w8, w9
+; -O0: add w8, w8, w9
+; -O0: bl __atomic_compare_exchange
+;
+; -O1-LABEL: atomicrmw_fmax_bfloat_unaligned_acquire:
+; -O1: add w8, w8, w20
+; -O1: add w8, w9, w8
+; -O1: bl __atomic_compare_exchange
+ %r = atomicrmw fmax ptr %ptr, bfloat %value acquire, align 1
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fmax_bfloat_unaligned_release(ptr %ptr, bfloat %value) {
+; -O0-LABEL: atomicrmw_fmax_bfloat_unaligned_release:
+; -O0: add w8, w8, w9
+; -O0: add w8, w8, w9
+; -O0: bl __atomic_compare_exchange
+;
+; -O1-LABEL: atomicrmw_fmax_bfloat_unaligned_release:
+; -O1: add w8, w8, w20
+; -O1: add w8, w9, w8
+; -O1: bl __atomic_compare_exchange
+ %r = atomicrmw fmax ptr %ptr, bfloat %value release, align 1
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fmax_bfloat_unaligned_acq_rel(ptr %ptr, bfloat %value) {
+; -O0-LABEL: atomicrmw_fmax_bfloat_unaligned_acq_rel:
+; -O0: add w8, w8, w9
+; -O0: add w8, w8, w9
+; -O0: bl __atomic_compare_exchange
+;
+; -O1-LABEL: atomicrmw_fmax_bfloat_unaligned_acq_rel:
+; -O1: add w8, w8, w20
+; -O1: add w8, w9, w8
+; -O1: bl __atomic_compare_exchange
+ %r = atomicrmw fmax ptr %ptr, bfloat %value acq_rel, align 1
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fmax_bfloat_unaligned_seq_cst(ptr %ptr, bfloat %value) {
+; -O0-LABEL: atomicrmw_fmax_bfloat_unaligned_seq_cst:
+; -O0: add w8, w8, w9
+; -O0: add w8, w8, w9
+; -O0: bl __atomic_compare_exchange
+;
+; -O1-LABEL: atomicrmw_fmax_bfloat_unaligned_seq_cst:
+; -O1: add w8, w8, w20
+; -O1: add w8, w9, w8
+; -O1: bl __atomic_compare_exchange
+ %r = atomicrmw fmax ptr %ptr, bfloat %value seq_cst, align 1
+ ret bfloat %r
+}
+
define dso_local double @atomicrmw_fmax_double_unaligned_monotonic(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmax_double_unaligned_monotonic:
; CHECK: bl __atomic_compare_exchange
@@ -755,105 +1130,140 @@ define dso_local double @atomicrmw_fmax_double_unaligned_seq_cst(ptr %ptr, doubl
define dso_local half @atomicrmw_fmin_half_aligned_monotonic(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fmin_half_aligned_monotonic:
-; CHECK: ldfmin h0, h0, [x0]
+; CHECK: ldfminnm h0, h0, [x0]
%r = atomicrmw fmin ptr %ptr, half %value monotonic, align 2
ret half %r
}
define dso_local half @atomicrmw_fmin_half_aligned_acquire(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fmin_half_aligned_acquire:
-; CHECK: ldfmina h0, h0, [x0]
+; CHECK: ldfminnma h0, h0, [x0]
%r = atomicrmw fmin ptr %ptr, half %value acquire, align 2
ret half %r
}
define dso_local half @atomicrmw_fmin_half_aligned_release(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fmin_half_aligned_release:
-; CHECK: ldfminl h0, h0, [x0]
+; CHECK: ldfminnml h0, h0, [x0]
%r = atomicrmw fmin ptr %ptr, half %value release, align 2
ret half %r
}
define dso_local half @atomicrmw_fmin_half_aligned_acq_rel(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fmin_half_aligned_acq_rel:
-; CHECK: ldfminal h0, h0, [x0]
+; CHECK: ldfminnmal h0, h0, [x0]
%r = atomicrmw fmin ptr %ptr, half %value acq_rel, align 2
ret half %r
}
define dso_local half @atomicrmw_fmin_half_aligned_seq_cst(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fmin_half_aligned_seq_cst:
-; CHECK: ldfminal h0, h0, [x0]
+; CHECK: ldfminnmal h0, h0, [x0]
%r = atomicrmw fmin ptr %ptr, half %value seq_cst, align 2
ret half %r
}
define dso_local float @atomicrmw_fmin_float_aligned_monotonic(ptr %ptr, float %value) {
; CHECK-LABEL: atomicrmw_fmin_float_aligned_monotonic:
-; CHECK: ldfmin s0, s0, [x0]
+; CHECK: ldfminnm s0, s0, [x0]
%r = atomicrmw fmin ptr %ptr, float %value monotonic, align 4
ret float %r
}
define dso_local float @atomicrmw_fmin_float_aligned_acquire(ptr %ptr, float %value) {
; CHECK-LABEL: atomicrmw_fmin_float_aligned_acquire:
-; CHECK: ldfmina s0, s0, [x0]
+; CHECK: ldfminnma s0, s0, [x0]
%r = atomicrmw fmin ptr %ptr, float %value acquire, align 4
ret float %r
}
define dso_local float @atomicrmw_fmin_float_aligned_release(ptr %ptr, float %value) {
; CHECK-LABEL: atomicrmw_fmin_float_aligned_release:
-; CHECK: ldfminl s0, s0, [x0]
+; CHECK: ldfminnml s0, s0, [x0]
%r = atomicrmw fmin ptr %ptr, float %value release, align 4
ret float %r
}
define dso_local float @atomicrmw_fmin_float_aligned_acq_rel(ptr %ptr, float %value) {
; CHECK-LABEL: atomicrmw_fmin_float_aligned_acq_rel:
-; CHECK: ldfminal s0, s0, [x0]
+; CHECK: ldfminnmal s0, s0, [x0]
%r = atomicrmw fmin ptr %ptr, float %value acq_rel, align 4
ret float %r
}
define dso_local float @atomicrmw_fmin_float_aligned_seq_cst(ptr %ptr, float %value) {
; CHECK-LABEL: atomicrmw_fmin_float_aligned_seq_cst:
-; CHECK: ldfminal s0, s0, [x0]
+; CHECK: ldfminnmal s0, s0, [x0]
%r = atomicrmw fmin ptr %ptr, float %value seq_cst, align 4
ret float %r
}
+define dso_local bfloat @atomicrmw_fmin_bfloat_aligned_monotonic(ptr %ptr, bfloat %value) {
+; CHECK-LABEL: atomicrmw_fmin_bfloat_aligned_monotonic:
+; CHECK: ldbfminnm h0, h0, [x0]
+ %r = atomicrmw fmin ptr %ptr, bfloat %value monotonic, align 4
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fmin_bfloat_aligned_acquire(ptr %ptr, bfloat %value) {
+; CHECK-LABEL: atomicrmw_fmin_bfloat_aligned_acquire:
+; CHECK: ldbfminnma h0, h0, [x0]
+ %r = atomicrmw fmin ptr %ptr, bfloat %value acquire, align 4
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fmin_bfloat_aligned_release(ptr %ptr, bfloat %value) {
+; CHECK-LABEL: atomicrmw_fmin_bfloat_aligned_release:
+; CHECK: ldbfminnml h0, h0, [x0]
+ %r = atomicrmw fmin ptr %ptr, bfloat %value release, align 4
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fmin_bfloat_aligned_acq_rel(ptr %ptr, bfloat %value) {
+; CHECK-LABEL: atomicrmw_fmin_bfloat_aligned_acq_rel:
+; CHECK: ldbfminnmal h0, h0, [x0]
+ %r = atomicrmw fmin ptr %ptr, bfloat %value acq_rel, align 4
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fmin_bfloat_aligned_seq_cst(ptr %ptr, bfloat %value) {
+; CHECK-LABEL: atomicrmw_fmin_bfloat_aligned_seq_cst:
+; CHECK: ldbfminnmal h0, h0, [x0]
+ %r = atomicrmw fmin ptr %ptr, bfloat %value seq_cst, align 4
+ ret bfloat %r
+}
+
define dso_local double @atomicrmw_fmin_double_aligned_monotonic(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmin_double_aligned_monotonic:
-; CHECK: ldfmin d0, d0, [x0]
+; CHECK: ldfminnm d0, d0, [x0]
%r = atomicrmw fmin ptr %ptr, double %value monotonic, align 8
ret double %r
}
define dso_local double @atomicrmw_fmin_double_aligned_acquire(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmin_double_aligned_acquire:
-; CHECK: ldfmina d0, d0, [x0]
+; CHECK: ldfminnma d0, d0, [x0]
%r = atomicrmw fmin ptr %ptr, double %value acquire, align 8
ret double %r
}
define dso_local double @atomicrmw_fmin_double_aligned_release(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmin_double_aligned_release:
-; CHECK: ldfminl d0, d0, [x0]
+; CHECK: ldfminnml d0, d0, [x0]
%r = atomicrmw fmin ptr %ptr, double %value release, align 8
ret double %r
}
define dso_local double @atomicrmw_fmin_double_aligned_acq_rel(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmin_double_aligned_acq_rel:
-; CHECK: ldfminal d0, d0, [x0]
+; CHECK: ldfminnmal d0, d0, [x0]
%r = atomicrmw fmin ptr %ptr, double %value acq_rel, align 8
ret double %r
}
define dso_local double @atomicrmw_fmin_double_aligned_seq_cst(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmin_double_aligned_seq_cst:
-; CHECK: ldfminal d0, d0, [x0]
+; CHECK: ldfminnmal d0, d0, [x0]
%r = atomicrmw fmin ptr %ptr, double %value seq_cst, align 8
ret double %r
}
@@ -928,6 +1338,76 @@ define dso_local float @atomicrmw_fmin_float_unaligned_seq_cst(ptr %ptr, float %
ret float %r
}
+define dso_local bfloat @atomicrmw_fmin_bfloat_unaligned_monotonic(ptr %ptr, bfloat %value) {
+; -O0-LABEL: atomicrmw_fmin_bfloat_unaligned_monotonic:
+; -O0: add w8, w8, w9
+; -O0: add w8, w8, w9
+; -O0: bl __atomic_compare_exchange
+;
+; -O1-LABEL: atomicrmw_fmin_bfloat_unaligned_monotonic:
+; -O1: add w8, w8, w20
+; -O1: add w8, w9, w8
+; -O1: bl __atomic_compare_exchange
+ %r = atomicrmw fmin ptr %ptr, bfloat %value monotonic, align 1
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fmin_bfloat_unaligned_acquire(ptr %ptr, bfloat %value) {
+; -O0-LABEL: atomicrmw_fmin_bfloat_unaligned_acquire:
+; -O0: add w8, w8, w9
+; -O0: add w8, w8, w9
+; -O0: bl __atomic_compare_exchange
+;
+; -O1-LABEL: atomicrmw_fmin_bfloat_unaligned_acquire:
+; -O1: add w8, w8, w20
+; -O1: add w8, w9, w8
+; -O1: bl __atomic_compare_exchange
+ %r = atomicrmw fmin ptr %ptr, bfloat %value acquire, align 1
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fmin_bfloat_unaligned_release(ptr %ptr, bfloat %value) {
+; -O0-LABEL: atomicrmw_fmin_bfloat_unaligned_release:
+; -O0: add w8, w8, w9
+; -O0: add w8, w8, w9
+; -O0: bl __atomic_compare_exchange
+;
+; -O1-LABEL: atomicrmw_fmin_bfloat_unaligned_release:
+; -O1: add w8, w8, w20
+; -O1: add w8, w9, w8
+; -O1: bl __atomic_compare_exchange
+ %r = atomicrmw fmin ptr %ptr, bfloat %value release, align 1
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fmin_bfloat_unaligned_acq_rel(ptr %ptr, bfloat %value) {
+; -O0-LABEL: atomicrmw_fmin_bfloat_unaligned_acq_rel:
+; -O0: add w8, w8, w9
+; -O0: add w8, w8, w9
+; -O0: bl __atomic_compare_exchange
+;
+; -O1-LABEL: atomicrmw_fmin_bfloat_unaligned_acq_rel:
+; -O1: add w8, w8, w20
+; -O1: add w8, w9, w8
+; -O1: bl __atomic_compare_exchange
+ %r = atomicrmw fmin ptr %ptr, bfloat %value acq_rel, align 1
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fmin_bfloat_unaligned_seq_cst(ptr %ptr, bfloat %value) {
+; -O0-LABEL: atomicrmw_fmin_bfloat_unaligned_seq_cst:
+; -O0: add w8, w8, w9
+; -O0: add w8, w8, w9
+; -O0: bl __atomic_compare_exchange
+;
+; -O1-LABEL: atomicrmw_fmin_bfloat_unaligned_seq_cst:
+; -O1: add w8, w8, w20
+; -O1: add w8, w9, w8
+; -O1: bl __atomic_compare_exchange
+ %r = atomicrmw fmin ptr %ptr, bfloat %value seq_cst, align 1
+ ret bfloat %r
+}
+
define dso_local double @atomicrmw_fmin_double_unaligned_monotonic(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmin_double_unaligned_monotonic:
; CHECK: bl __atomic_compare_exchange
diff --git a/llvm/test/CodeGen/AArch64/Atomics/generate-tests.py b/llvm/test/CodeGen/AArch64/Atomics/generate-tests.py
index 2f74254e32dcae9..82128d9e5fd34ef 100755
--- a/llvm/test/CodeGen/AArch64/Atomics/generate-tests.py
+++ b/llvm/test/CodeGen/AArch64/Atomics/generate-tests.py
@@ -13,34 +13,37 @@
]
-# Type name size
-class Type(enum.Enum):
- # Value is the size in bytes
- i8 = 1
- i16 = 2
- i32 = 4
- i64 = 8
- i128 = 16
-
- def align(self, aligned: bool) -> int:
- return self.value if aligned else 1
+class byteSizes:
+ def __init__(self):
+ self._data = {}
- def __str__(self) -> str:
- return self.name
+ def __setitem__(self, k, v):
+ self._data[k] = v
+ def __getitem__(self, k):
+ return self._data[k]
-# FP Type name size
-class FPType(enum.Enum):
- # Value is the size in bytes
- half = 2
- float = 4
- double = 8
+ def __iter__(self):
+ return iter(self._data.items())
- def align(self, aligned: bool) -> int:
- return self.value if aligned else 1
- def __str__(self) -> str:
- return self.name
+def align(val, aligned: bool) -> int:
+ return val if aligned else 1
+
+
+# Value is the size in bytes
+Type = byteSizes()
+Type["i8"] = 1
+Type["i16"] = 2
+Type["i32"] = 4
+Type["i64"] = 8
+Type["i128"] = 16
+
+FPType = byteSizes()
+FPType["half"] = 2
+FPType["float"] = 4
+FPType["bfloat"] = 4
+FPType["double"] = 8
# Is this an aligned or unaligned access?
@@ -170,7 +173,8 @@ def mattr(self):
def all_atomicrmw(f, datatype, atomicrmw_ops):
for op in atomicrmw_ops:
for aligned in Aligned:
- for ty in datatype:
+ for ty, val in datatype:
+ alignval = align(val, aligned)
for ordering in ATOMICRMW_ORDERS:
name = f"atomicrmw_{op}_{ty}_{aligned}_{ordering}"
instr = "atomicrmw"
@@ -178,7 +182,7 @@ def all_atomicrmw(f, datatype, atomicrmw_ops):
textwrap.dedent(
f"""
define dso_local {ty} @{name}(ptr %ptr, {ty} %value) {{
- %r = {instr} {op} ptr %ptr, {ty} %value {ordering}, align {ty.align(aligned)}
+ %r = {instr} {op} ptr %ptr, {ty} %value {ordering}, align {alignval}
ret {ty} %r
}}
"""
@@ -188,7 +192,8 @@ def all_atomicrmw(f, datatype, atomicrmw_ops):
def all_load(f):
for aligned in Aligned:
- for ty in Type:
+ for ty, val in Type:
+ alignval = align(val, aligned)
for ordering in ATOMIC_LOAD_ORDERS:
for const in [False, True]:
name = f"load_atomic_{ty}_{aligned}_{ordering}"
@@ -200,7 +205,7 @@ def all_load(f):
textwrap.dedent(
f"""
define dso_local {ty} @{name}({arg}) {{
- %r = {instr} {ty}, ptr %ptr {ordering}, align {ty.align(aligned)}
+ %r = {instr} {ty}, ptr %ptr {ordering}, align {alignval}
ret {ty} %r
}}
"""
@@ -210,7 +215,8 @@ def all_load(f):
def all_store(f):
for aligned in Aligned:
- for ty in Type:
+ for ty, val in Type:
+ alignval = align(val, aligned)
for ordering in ATOMIC_STORE_ORDERS: # FIXME stores
name = f"store_atomic_{ty}_{aligned}_{ordering}"
instr = "store atomic"
@@ -218,7 +224,7 @@ def all_store(f):
textwrap.dedent(
f"""
define dso_local void @{name}({ty} %value, ptr %ptr) {{
- {instr} {ty} %value, ptr %ptr {ordering}, align {ty.align(aligned)}
+ {instr} {ty} %value, ptr %ptr {ordering}, align {alignval}
ret void
}}
"""
@@ -228,7 +234,8 @@ def all_store(f):
def all_cmpxchg(f):
for aligned in Aligned:
- for ty in Type:
+ for ty, val in Type:
+ alignval = align(val, aligned)
for success_ordering in CMPXCHG_SUCCESS_ORDERS:
for failure_ordering in CMPXCHG_FAILURE_ORDERS:
for weak in [False, True]:
@@ -241,7 +248,7 @@ def all_cmpxchg(f):
textwrap.dedent(
f"""
define dso_local {ty} @{name}({ty} %expected, {ty} %new, ptr %ptr) {{
- %pair = {instr} ptr %ptr, {ty} %expected, {ty} %new {success_ordering} {failure_ordering}, align {ty.align(aligned)}
+ %pair = {instr} ptr %ptr, {ty} %expected, {ty} %new {success_ordering} {failure_ordering}, align {alignval}
%r = extractvalue {{ {ty}, i1 }} %pair, 0
ret {ty} %r
}}
>From 5b66fdaf3d580adff8bb9f5917489e248a540f64 Mon Sep 17 00:00:00 2001
From: Jonathan Thackray <jonathan.thackray at arm.com>
Date: Mon, 10 Feb 2025 16:07:33 +0000
Subject: [PATCH 3/3] fixup! moved tests to pre-commit-tests branch, so just
changes to tests
---
.../AArch64/Atomics/aarch64-atomicrmw-lsfe.ll | 1325 ++++++++++++-----
.../Atomics/aarch64_be-atomicrmw-lsfe.ll | 1325 ++++++++++++-----
.../CodeGen/AArch64/Atomics/generate-tests.py | 86 +-
3 files changed, 1990 insertions(+), 746 deletions(-)
diff --git a/llvm/test/CodeGen/AArch64/Atomics/aarch64-atomicrmw-lsfe.ll b/llvm/test/CodeGen/AArch64/Atomics/aarch64-atomicrmw-lsfe.ll
index 666501c937e6520..4ea9e8a83a4dd62 100644
--- a/llvm/test/CodeGen/AArch64/Atomics/aarch64-atomicrmw-lsfe.ll
+++ b/llvm/test/CodeGen/AArch64/Atomics/aarch64-atomicrmw-lsfe.ll
@@ -2,10 +2,15 @@
; The base test file was generated by ./llvm/test/CodeGen/AArch64/Atomics/generate-tests.py
; RUN: llc %s -o - -verify-machineinstrs -mtriple=aarch64 -mattr=+lsfe -O0 | FileCheck %s --check-prefixes=CHECK,-O0
; RUN: llc %s -o - -verify-machineinstrs -mtriple=aarch64 -mattr=+lsfe -O1 | FileCheck %s --check-prefixes=CHECK,-O1
+; RUN: llc %s -o - -verify-machineinstrs -mtriple=aarch64 | FileCheck %s --check-prefixes=CHECK-no-lsfe
define dso_local half @atomicrmw_fadd_half_aligned_monotonic(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fadd_half_aligned_monotonic:
; CHECK: ldfadd h0, h0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_half_aligned_monotonic:
+; CHECK-no-lsfe: ldxrh w8, [x0]
+; CHECK-no-lsfe: stxrh w9, w8, [x0]
%r = atomicrmw fadd ptr %ptr, half %value monotonic, align 2
ret half %r
}
@@ -13,6 +18,10 @@ define dso_local half @atomicrmw_fadd_half_aligned_monotonic(ptr %ptr, half %val
define dso_local half @atomicrmw_fadd_half_aligned_acquire(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fadd_half_aligned_acquire:
; CHECK: ldfadda h0, h0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_half_aligned_acquire:
+; CHECK-no-lsfe: ldaxrh w8, [x0]
+; CHECK-no-lsfe: stxrh w9, w8, [x0]
%r = atomicrmw fadd ptr %ptr, half %value acquire, align 2
ret half %r
}
@@ -20,6 +29,10 @@ define dso_local half @atomicrmw_fadd_half_aligned_acquire(ptr %ptr, half %value
define dso_local half @atomicrmw_fadd_half_aligned_release(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fadd_half_aligned_release:
; CHECK: ldfaddl h0, h0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_half_aligned_release:
+; CHECK-no-lsfe: ldxrh w8, [x0]
+; CHECK-no-lsfe: stlxrh w9, w8, [x0]
%r = atomicrmw fadd ptr %ptr, half %value release, align 2
ret half %r
}
@@ -27,6 +40,10 @@ define dso_local half @atomicrmw_fadd_half_aligned_release(ptr %ptr, half %value
define dso_local half @atomicrmw_fadd_half_aligned_acq_rel(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fadd_half_aligned_acq_rel:
; CHECK: ldfaddal h0, h0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_half_aligned_acq_rel:
+; CHECK-no-lsfe: ldaxrh w8, [x0]
+; CHECK-no-lsfe: stlxrh w9, w8, [x0]
%r = atomicrmw fadd ptr %ptr, half %value acq_rel, align 2
ret half %r
}
@@ -34,13 +51,86 @@ define dso_local half @atomicrmw_fadd_half_aligned_acq_rel(ptr %ptr, half %value
define dso_local half @atomicrmw_fadd_half_aligned_seq_cst(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fadd_half_aligned_seq_cst:
; CHECK: ldfaddal h0, h0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_half_aligned_seq_cst:
+; CHECK-no-lsfe: ldaxrh w8, [x0]
+; CHECK-no-lsfe: stlxrh w9, w8, [x0]
%r = atomicrmw fadd ptr %ptr, half %value seq_cst, align 2
ret half %r
}
+define dso_local bfloat @atomicrmw_fadd_bfloat_aligned_monotonic(ptr %ptr, bfloat %value) {
+; CHECK-LABEL: atomicrmw_fadd_bfloat_aligned_monotonic:
+; CHECK: ldbfadd h0, h0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_bfloat_aligned_monotonic:
+; CHECK-no-lsfe: ldxrh w9, [x0]
+; CHECK-no-lsfe: add w9, w9, w8
+; CHECK-no-lsfe: add w9, w10, w9
+; CHECK-no-lsfe: stxrh w10, w9, [x0]
+ %r = atomicrmw fadd ptr %ptr, bfloat %value monotonic, align 2
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fadd_bfloat_aligned_acquire(ptr %ptr, bfloat %value) {
+; CHECK-LABEL: atomicrmw_fadd_bfloat_aligned_acquire:
+; CHECK: ldbfadda h0, h0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_bfloat_aligned_acquire:
+; CHECK-no-lsfe: ldaxrh w9, [x0]
+; CHECK-no-lsfe: add w9, w9, w8
+; CHECK-no-lsfe: add w9, w10, w9
+; CHECK-no-lsfe: stxrh w10, w9, [x0]
+ %r = atomicrmw fadd ptr %ptr, bfloat %value acquire, align 2
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fadd_bfloat_aligned_release(ptr %ptr, bfloat %value) {
+; CHECK-LABEL: atomicrmw_fadd_bfloat_aligned_release:
+; CHECK: ldbfaddl h0, h0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_bfloat_aligned_release:
+; CHECK-no-lsfe: ldxrh w9, [x0]
+; CHECK-no-lsfe: add w9, w9, w8
+; CHECK-no-lsfe: add w9, w10, w9
+; CHECK-no-lsfe: stlxrh w10, w9, [x0]
+ %r = atomicrmw fadd ptr %ptr, bfloat %value release, align 2
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fadd_bfloat_aligned_acq_rel(ptr %ptr, bfloat %value) {
+; CHECK-LABEL: atomicrmw_fadd_bfloat_aligned_acq_rel:
+; CHECK: ldbfaddal h0, h0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_bfloat_aligned_acq_rel:
+; CHECK-no-lsfe: ldaxrh w9, [x0]
+; CHECK-no-lsfe: add w9, w9, w8
+; CHECK-no-lsfe: add w9, w10, w9
+; CHECK-no-lsfe: stlxrh w10, w9, [x0]
+ %r = atomicrmw fadd ptr %ptr, bfloat %value acq_rel, align 2
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fadd_bfloat_aligned_seq_cst(ptr %ptr, bfloat %value) {
+; CHECK-LABEL: atomicrmw_fadd_bfloat_aligned_seq_cst:
+; CHECK: ldbfaddal h0, h0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_bfloat_aligned_seq_cst:
+; CHECK-no-lsfe: ldaxrh w9, [x0]
+; CHECK-no-lsfe: add w9, w9, w8
+; CHECK-no-lsfe: add w9, w10, w9
+; CHECK-no-lsfe: stlxrh w10, w9, [x0]
+ %r = atomicrmw fadd ptr %ptr, bfloat %value seq_cst, align 2
+ ret bfloat %r
+}
+
define dso_local float @atomicrmw_fadd_float_aligned_monotonic(ptr %ptr, float %value) {
; CHECK-LABEL: atomicrmw_fadd_float_aligned_monotonic:
; CHECK: ldfadd s0, s0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_float_aligned_monotonic:
+; CHECK-no-lsfe: ldxr w8, [x0]
+; CHECK-no-lsfe: stxr w9, w8, [x0]
%r = atomicrmw fadd ptr %ptr, float %value monotonic, align 4
ret float %r
}
@@ -48,6 +138,10 @@ define dso_local float @atomicrmw_fadd_float_aligned_monotonic(ptr %ptr, float %
define dso_local float @atomicrmw_fadd_float_aligned_acquire(ptr %ptr, float %value) {
; CHECK-LABEL: atomicrmw_fadd_float_aligned_acquire:
; CHECK: ldfadda s0, s0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_float_aligned_acquire:
+; CHECK-no-lsfe: ldaxr w8, [x0]
+; CHECK-no-lsfe: stxr w9, w8, [x0]
%r = atomicrmw fadd ptr %ptr, float %value acquire, align 4
ret float %r
}
@@ -55,6 +149,10 @@ define dso_local float @atomicrmw_fadd_float_aligned_acquire(ptr %ptr, float %va
define dso_local float @atomicrmw_fadd_float_aligned_release(ptr %ptr, float %value) {
; CHECK-LABEL: atomicrmw_fadd_float_aligned_release:
; CHECK: ldfaddl s0, s0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_float_aligned_release:
+; CHECK-no-lsfe: ldxr w8, [x0]
+; CHECK-no-lsfe: stlxr w9, w8, [x0]
%r = atomicrmw fadd ptr %ptr, float %value release, align 4
ret float %r
}
@@ -62,6 +160,10 @@ define dso_local float @atomicrmw_fadd_float_aligned_release(ptr %ptr, float %va
define dso_local float @atomicrmw_fadd_float_aligned_acq_rel(ptr %ptr, float %value) {
; CHECK-LABEL: atomicrmw_fadd_float_aligned_acq_rel:
; CHECK: ldfaddal s0, s0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_float_aligned_acq_rel:
+; CHECK-no-lsfe: ldaxr w8, [x0]
+; CHECK-no-lsfe: stlxr w9, w8, [x0]
%r = atomicrmw fadd ptr %ptr, float %value acq_rel, align 4
ret float %r
}
@@ -69,48 +171,21 @@ define dso_local float @atomicrmw_fadd_float_aligned_acq_rel(ptr %ptr, float %va
define dso_local float @atomicrmw_fadd_float_aligned_seq_cst(ptr %ptr, float %value) {
; CHECK-LABEL: atomicrmw_fadd_float_aligned_seq_cst:
; CHECK: ldfaddal s0, s0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_float_aligned_seq_cst:
+; CHECK-no-lsfe: ldaxr w8, [x0]
+; CHECK-no-lsfe: stlxr w9, w8, [x0]
%r = atomicrmw fadd ptr %ptr, float %value seq_cst, align 4
ret float %r
}
-define dso_local bfloat @atomicrmw_fadd_bfloat_aligned_monotonic(ptr %ptr, bfloat %value) {
-; CHECK-LABEL: atomicrmw_fadd_bfloat_aligned_monotonic:
-; CHECK: ldbfadd h0, h0, [x0]
- %r = atomicrmw fadd ptr %ptr, bfloat %value monotonic, align 4
- ret bfloat %r
-}
-
-define dso_local bfloat @atomicrmw_fadd_bfloat_aligned_acquire(ptr %ptr, bfloat %value) {
-; CHECK-LABEL: atomicrmw_fadd_bfloat_aligned_acquire:
-; CHECK: ldbfadda h0, h0, [x0]
- %r = atomicrmw fadd ptr %ptr, bfloat %value acquire, align 4
- ret bfloat %r
-}
-
-define dso_local bfloat @atomicrmw_fadd_bfloat_aligned_release(ptr %ptr, bfloat %value) {
-; CHECK-LABEL: atomicrmw_fadd_bfloat_aligned_release:
-; CHECK: ldbfaddl h0, h0, [x0]
- %r = atomicrmw fadd ptr %ptr, bfloat %value release, align 4
- ret bfloat %r
-}
-
-define dso_local bfloat @atomicrmw_fadd_bfloat_aligned_acq_rel(ptr %ptr, bfloat %value) {
-; CHECK-LABEL: atomicrmw_fadd_bfloat_aligned_acq_rel:
-; CHECK: ldbfaddal h0, h0, [x0]
- %r = atomicrmw fadd ptr %ptr, bfloat %value acq_rel, align 4
- ret bfloat %r
-}
-
-define dso_local bfloat @atomicrmw_fadd_bfloat_aligned_seq_cst(ptr %ptr, bfloat %value) {
-; CHECK-LABEL: atomicrmw_fadd_bfloat_aligned_seq_cst:
-; CHECK: ldbfaddal h0, h0, [x0]
- %r = atomicrmw fadd ptr %ptr, bfloat %value seq_cst, align 4
- ret bfloat %r
-}
-
define dso_local double @atomicrmw_fadd_double_aligned_monotonic(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fadd_double_aligned_monotonic:
; CHECK: ldfadd d0, d0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_double_aligned_monotonic:
+; CHECK-no-lsfe: ldxr x8, [x0]
+; CHECK-no-lsfe: stxr w9, x8, [x0]
%r = atomicrmw fadd ptr %ptr, double %value monotonic, align 8
ret double %r
}
@@ -118,6 +193,10 @@ define dso_local double @atomicrmw_fadd_double_aligned_monotonic(ptr %ptr, doubl
define dso_local double @atomicrmw_fadd_double_aligned_acquire(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fadd_double_aligned_acquire:
; CHECK: ldfadda d0, d0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_double_aligned_acquire:
+; CHECK-no-lsfe: ldaxr x8, [x0]
+; CHECK-no-lsfe: stxr w9, x8, [x0]
%r = atomicrmw fadd ptr %ptr, double %value acquire, align 8
ret double %r
}
@@ -125,6 +204,10 @@ define dso_local double @atomicrmw_fadd_double_aligned_acquire(ptr %ptr, double
define dso_local double @atomicrmw_fadd_double_aligned_release(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fadd_double_aligned_release:
; CHECK: ldfaddl d0, d0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_double_aligned_release:
+; CHECK-no-lsfe: ldxr x8, [x0]
+; CHECK-no-lsfe: stlxr w9, x8, [x0]
%r = atomicrmw fadd ptr %ptr, double %value release, align 8
ret double %r
}
@@ -132,6 +215,10 @@ define dso_local double @atomicrmw_fadd_double_aligned_release(ptr %ptr, double
define dso_local double @atomicrmw_fadd_double_aligned_acq_rel(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fadd_double_aligned_acq_rel:
; CHECK: ldfaddal d0, d0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_double_aligned_acq_rel:
+; CHECK-no-lsfe: ldaxr x8, [x0]
+; CHECK-no-lsfe: stlxr w9, x8, [x0]
%r = atomicrmw fadd ptr %ptr, double %value acq_rel, align 8
ret double %r
}
@@ -139,6 +226,10 @@ define dso_local double @atomicrmw_fadd_double_aligned_acq_rel(ptr %ptr, double
define dso_local double @atomicrmw_fadd_double_aligned_seq_cst(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fadd_double_aligned_seq_cst:
; CHECK: ldfaddal d0, d0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_double_aligned_seq_cst:
+; CHECK-no-lsfe: ldaxr x8, [x0]
+; CHECK-no-lsfe: stlxr w9, x8, [x0]
%r = atomicrmw fadd ptr %ptr, double %value seq_cst, align 8
ret double %r
}
@@ -146,6 +237,9 @@ define dso_local double @atomicrmw_fadd_double_aligned_seq_cst(ptr %ptr, double
define dso_local half @atomicrmw_fadd_half_unaligned_monotonic(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fadd_half_unaligned_monotonic:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_half_unaligned_monotonic:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fadd ptr %ptr, half %value monotonic, align 1
ret half %r
}
@@ -153,6 +247,9 @@ define dso_local half @atomicrmw_fadd_half_unaligned_monotonic(ptr %ptr, half %v
define dso_local half @atomicrmw_fadd_half_unaligned_acquire(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fadd_half_unaligned_acquire:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_half_unaligned_acquire:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fadd ptr %ptr, half %value acquire, align 1
ret half %r
}
@@ -160,6 +257,9 @@ define dso_local half @atomicrmw_fadd_half_unaligned_acquire(ptr %ptr, half %val
define dso_local half @atomicrmw_fadd_half_unaligned_release(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fadd_half_unaligned_release:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_half_unaligned_release:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fadd ptr %ptr, half %value release, align 1
ret half %r
}
@@ -167,6 +267,9 @@ define dso_local half @atomicrmw_fadd_half_unaligned_release(ptr %ptr, half %val
define dso_local half @atomicrmw_fadd_half_unaligned_acq_rel(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fadd_half_unaligned_acq_rel:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_half_unaligned_acq_rel:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fadd ptr %ptr, half %value acq_rel, align 1
ret half %r
}
@@ -174,45 +277,13 @@ define dso_local half @atomicrmw_fadd_half_unaligned_acq_rel(ptr %ptr, half %val
define dso_local half @atomicrmw_fadd_half_unaligned_seq_cst(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fadd_half_unaligned_seq_cst:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_half_unaligned_seq_cst:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fadd ptr %ptr, half %value seq_cst, align 1
ret half %r
}
-define dso_local float @atomicrmw_fadd_float_unaligned_monotonic(ptr %ptr, float %value) {
-; CHECK-LABEL: atomicrmw_fadd_float_unaligned_monotonic:
-; CHECK: bl __atomic_compare_exchange
- %r = atomicrmw fadd ptr %ptr, float %value monotonic, align 1
- ret float %r
-}
-
-define dso_local float @atomicrmw_fadd_float_unaligned_acquire(ptr %ptr, float %value) {
-; CHECK-LABEL: atomicrmw_fadd_float_unaligned_acquire:
-; CHECK: bl __atomic_compare_exchange
- %r = atomicrmw fadd ptr %ptr, float %value acquire, align 1
- ret float %r
-}
-
-define dso_local float @atomicrmw_fadd_float_unaligned_release(ptr %ptr, float %value) {
-; CHECK-LABEL: atomicrmw_fadd_float_unaligned_release:
-; CHECK: bl __atomic_compare_exchange
- %r = atomicrmw fadd ptr %ptr, float %value release, align 1
- ret float %r
-}
-
-define dso_local float @atomicrmw_fadd_float_unaligned_acq_rel(ptr %ptr, float %value) {
-; CHECK-LABEL: atomicrmw_fadd_float_unaligned_acq_rel:
-; CHECK: bl __atomic_compare_exchange
- %r = atomicrmw fadd ptr %ptr, float %value acq_rel, align 1
- ret float %r
-}
-
-define dso_local float @atomicrmw_fadd_float_unaligned_seq_cst(ptr %ptr, float %value) {
-; CHECK-LABEL: atomicrmw_fadd_float_unaligned_seq_cst:
-; CHECK: bl __atomic_compare_exchange
- %r = atomicrmw fadd ptr %ptr, float %value seq_cst, align 1
- ret float %r
-}
-
define dso_local bfloat @atomicrmw_fadd_bfloat_unaligned_monotonic(ptr %ptr, bfloat %value) {
; -O0-LABEL: atomicrmw_fadd_bfloat_unaligned_monotonic:
; -O0: add w8, w8, w9
@@ -223,6 +294,11 @@ define dso_local bfloat @atomicrmw_fadd_bfloat_unaligned_monotonic(ptr %ptr, bfl
; -O1: add w8, w8, w20
; -O1: add w8, w9, w8
; -O1: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_bfloat_unaligned_monotonic:
+; CHECK-no-lsfe: add w8, w8, w20
+; CHECK-no-lsfe: add w8, w9, w8
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fadd ptr %ptr, bfloat %value monotonic, align 1
ret bfloat %r
}
@@ -237,6 +313,11 @@ define dso_local bfloat @atomicrmw_fadd_bfloat_unaligned_acquire(ptr %ptr, bfloa
; -O1: add w8, w8, w20
; -O1: add w8, w9, w8
; -O1: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_bfloat_unaligned_acquire:
+; CHECK-no-lsfe: add w8, w8, w20
+; CHECK-no-lsfe: add w8, w9, w8
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fadd ptr %ptr, bfloat %value acquire, align 1
ret bfloat %r
}
@@ -251,6 +332,11 @@ define dso_local bfloat @atomicrmw_fadd_bfloat_unaligned_release(ptr %ptr, bfloa
; -O1: add w8, w8, w20
; -O1: add w8, w9, w8
; -O1: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_bfloat_unaligned_release:
+; CHECK-no-lsfe: add w8, w8, w20
+; CHECK-no-lsfe: add w8, w9, w8
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fadd ptr %ptr, bfloat %value release, align 1
ret bfloat %r
}
@@ -265,6 +351,11 @@ define dso_local bfloat @atomicrmw_fadd_bfloat_unaligned_acq_rel(ptr %ptr, bfloa
; -O1: add w8, w8, w20
; -O1: add w8, w9, w8
; -O1: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_bfloat_unaligned_acq_rel:
+; CHECK-no-lsfe: add w8, w8, w20
+; CHECK-no-lsfe: add w8, w9, w8
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fadd ptr %ptr, bfloat %value acq_rel, align 1
ret bfloat %r
}
@@ -279,13 +370,71 @@ define dso_local bfloat @atomicrmw_fadd_bfloat_unaligned_seq_cst(ptr %ptr, bfloa
; -O1: add w8, w8, w20
; -O1: add w8, w9, w8
; -O1: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_bfloat_unaligned_seq_cst:
+; CHECK-no-lsfe: add w8, w8, w20
+; CHECK-no-lsfe: add w8, w9, w8
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fadd ptr %ptr, bfloat %value seq_cst, align 1
ret bfloat %r
}
+define dso_local float @atomicrmw_fadd_float_unaligned_monotonic(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fadd_float_unaligned_monotonic:
+; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_float_unaligned_monotonic:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
+ %r = atomicrmw fadd ptr %ptr, float %value monotonic, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fadd_float_unaligned_acquire(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fadd_float_unaligned_acquire:
+; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_float_unaligned_acquire:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
+ %r = atomicrmw fadd ptr %ptr, float %value acquire, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fadd_float_unaligned_release(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fadd_float_unaligned_release:
+; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_float_unaligned_release:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
+ %r = atomicrmw fadd ptr %ptr, float %value release, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fadd_float_unaligned_acq_rel(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fadd_float_unaligned_acq_rel:
+; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_float_unaligned_acq_rel:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
+ %r = atomicrmw fadd ptr %ptr, float %value acq_rel, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fadd_float_unaligned_seq_cst(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fadd_float_unaligned_seq_cst:
+; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_float_unaligned_seq_cst:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
+ %r = atomicrmw fadd ptr %ptr, float %value seq_cst, align 1
+ ret float %r
+}
+
define dso_local double @atomicrmw_fadd_double_unaligned_monotonic(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fadd_double_unaligned_monotonic:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_double_unaligned_monotonic:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fadd ptr %ptr, double %value monotonic, align 1
ret double %r
}
@@ -293,6 +442,9 @@ define dso_local double @atomicrmw_fadd_double_unaligned_monotonic(ptr %ptr, dou
define dso_local double @atomicrmw_fadd_double_unaligned_acquire(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fadd_double_unaligned_acquire:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_double_unaligned_acquire:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fadd ptr %ptr, double %value acquire, align 1
ret double %r
}
@@ -300,6 +452,9 @@ define dso_local double @atomicrmw_fadd_double_unaligned_acquire(ptr %ptr, doubl
define dso_local double @atomicrmw_fadd_double_unaligned_release(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fadd_double_unaligned_release:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_double_unaligned_release:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fadd ptr %ptr, double %value release, align 1
ret double %r
}
@@ -307,6 +462,9 @@ define dso_local double @atomicrmw_fadd_double_unaligned_release(ptr %ptr, doubl
define dso_local double @atomicrmw_fadd_double_unaligned_acq_rel(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fadd_double_unaligned_acq_rel:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_double_unaligned_acq_rel:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fadd ptr %ptr, double %value acq_rel, align 1
ret double %r
}
@@ -314,6 +472,9 @@ define dso_local double @atomicrmw_fadd_double_unaligned_acq_rel(ptr %ptr, doubl
define dso_local double @atomicrmw_fadd_double_unaligned_seq_cst(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fadd_double_unaligned_seq_cst:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_double_unaligned_seq_cst:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fadd ptr %ptr, double %value seq_cst, align 1
ret double %r
}
@@ -328,6 +489,10 @@ define dso_local half @atomicrmw_fsub_half_aligned_monotonic(ptr %ptr, half %val
; -O1-LABEL: atomicrmw_fsub_half_aligned_monotonic:
; -O1: ldxrh w8, [x0]
; -O1: stxrh w9, w8, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_half_aligned_monotonic:
+; CHECK-no-lsfe: ldxrh w8, [x0]
+; CHECK-no-lsfe: stxrh w9, w8, [x0]
%r = atomicrmw fsub ptr %ptr, half %value monotonic, align 2
ret half %r
}
@@ -342,6 +507,10 @@ define dso_local half @atomicrmw_fsub_half_aligned_acquire(ptr %ptr, half %value
; -O1-LABEL: atomicrmw_fsub_half_aligned_acquire:
; -O1: ldaxrh w8, [x0]
; -O1: stxrh w9, w8, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_half_aligned_acquire:
+; CHECK-no-lsfe: ldaxrh w8, [x0]
+; CHECK-no-lsfe: stxrh w9, w8, [x0]
%r = atomicrmw fsub ptr %ptr, half %value acquire, align 2
ret half %r
}
@@ -356,6 +525,10 @@ define dso_local half @atomicrmw_fsub_half_aligned_release(ptr %ptr, half %value
; -O1-LABEL: atomicrmw_fsub_half_aligned_release:
; -O1: ldxrh w8, [x0]
; -O1: stlxrh w9, w8, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_half_aligned_release:
+; CHECK-no-lsfe: ldxrh w8, [x0]
+; CHECK-no-lsfe: stlxrh w9, w8, [x0]
%r = atomicrmw fsub ptr %ptr, half %value release, align 2
ret half %r
}
@@ -370,6 +543,10 @@ define dso_local half @atomicrmw_fsub_half_aligned_acq_rel(ptr %ptr, half %value
; -O1-LABEL: atomicrmw_fsub_half_aligned_acq_rel:
; -O1: ldaxrh w8, [x0]
; -O1: stlxrh w9, w8, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_half_aligned_acq_rel:
+; CHECK-no-lsfe: ldaxrh w8, [x0]
+; CHECK-no-lsfe: stlxrh w9, w8, [x0]
%r = atomicrmw fsub ptr %ptr, half %value acq_rel, align 2
ret half %r
}
@@ -384,80 +561,14 @@ define dso_local half @atomicrmw_fsub_half_aligned_seq_cst(ptr %ptr, half %value
; -O1-LABEL: atomicrmw_fsub_half_aligned_seq_cst:
; -O1: ldaxrh w8, [x0]
; -O1: stlxrh w9, w8, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_half_aligned_seq_cst:
+; CHECK-no-lsfe: ldaxrh w8, [x0]
+; CHECK-no-lsfe: stlxrh w9, w8, [x0]
%r = atomicrmw fsub ptr %ptr, half %value seq_cst, align 2
ret half %r
}
-define dso_local float @atomicrmw_fsub_float_aligned_monotonic(ptr %ptr, float %value) {
-; -O0-LABEL: atomicrmw_fsub_float_aligned_monotonic:
-; -O0: ldaxr w0, [x9]
-; -O0: cmp w0, w10
-; -O0: stlxr w8, w11, [x9]
-; -O0: subs w8, w0, w8
-;
-; -O1-LABEL: atomicrmw_fsub_float_aligned_monotonic:
-; -O1: ldxr w8, [x0]
-; -O1: stxr w9, w8, [x0]
- %r = atomicrmw fsub ptr %ptr, float %value monotonic, align 4
- ret float %r
-}
-
-define dso_local float @atomicrmw_fsub_float_aligned_acquire(ptr %ptr, float %value) {
-; -O0-LABEL: atomicrmw_fsub_float_aligned_acquire:
-; -O0: ldaxr w0, [x9]
-; -O0: cmp w0, w10
-; -O0: stlxr w8, w11, [x9]
-; -O0: subs w8, w0, w8
-;
-; -O1-LABEL: atomicrmw_fsub_float_aligned_acquire:
-; -O1: ldaxr w8, [x0]
-; -O1: stxr w9, w8, [x0]
- %r = atomicrmw fsub ptr %ptr, float %value acquire, align 4
- ret float %r
-}
-
-define dso_local float @atomicrmw_fsub_float_aligned_release(ptr %ptr, float %value) {
-; -O0-LABEL: atomicrmw_fsub_float_aligned_release:
-; -O0: ldaxr w0, [x9]
-; -O0: cmp w0, w10
-; -O0: stlxr w8, w11, [x9]
-; -O0: subs w8, w0, w8
-;
-; -O1-LABEL: atomicrmw_fsub_float_aligned_release:
-; -O1: ldxr w8, [x0]
-; -O1: stlxr w9, w8, [x0]
- %r = atomicrmw fsub ptr %ptr, float %value release, align 4
- ret float %r
-}
-
-define dso_local float @atomicrmw_fsub_float_aligned_acq_rel(ptr %ptr, float %value) {
-; -O0-LABEL: atomicrmw_fsub_float_aligned_acq_rel:
-; -O0: ldaxr w0, [x9]
-; -O0: cmp w0, w10
-; -O0: stlxr w8, w11, [x9]
-; -O0: subs w8, w0, w8
-;
-; -O1-LABEL: atomicrmw_fsub_float_aligned_acq_rel:
-; -O1: ldaxr w8, [x0]
-; -O1: stlxr w9, w8, [x0]
- %r = atomicrmw fsub ptr %ptr, float %value acq_rel, align 4
- ret float %r
-}
-
-define dso_local float @atomicrmw_fsub_float_aligned_seq_cst(ptr %ptr, float %value) {
-; -O0-LABEL: atomicrmw_fsub_float_aligned_seq_cst:
-; -O0: ldaxr w0, [x9]
-; -O0: cmp w0, w10
-; -O0: stlxr w8, w11, [x9]
-; -O0: subs w8, w0, w8
-;
-; -O1-LABEL: atomicrmw_fsub_float_aligned_seq_cst:
-; -O1: ldaxr w8, [x0]
-; -O1: stlxr w9, w8, [x0]
- %r = atomicrmw fsub ptr %ptr, float %value seq_cst, align 4
- ret float %r
-}
-
define dso_local bfloat @atomicrmw_fsub_bfloat_aligned_monotonic(ptr %ptr, bfloat %value) {
; -O0-LABEL: atomicrmw_fsub_bfloat_aligned_monotonic:
; -O0: add w8, w8, w9
@@ -473,7 +584,13 @@ define dso_local bfloat @atomicrmw_fsub_bfloat_aligned_monotonic(ptr %ptr, bfloa
; -O1: add w9, w9, w8
; -O1: add w9, w10, w9
; -O1: stxrh w10, w9, [x0]
- %r = atomicrmw fsub ptr %ptr, bfloat %value monotonic, align 4
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_bfloat_aligned_monotonic:
+; CHECK-no-lsfe: ldxrh w9, [x0]
+; CHECK-no-lsfe: add w9, w9, w8
+; CHECK-no-lsfe: add w9, w10, w9
+; CHECK-no-lsfe: stxrh w10, w9, [x0]
+ %r = atomicrmw fsub ptr %ptr, bfloat %value monotonic, align 2
ret bfloat %r
}
@@ -492,7 +609,13 @@ define dso_local bfloat @atomicrmw_fsub_bfloat_aligned_acquire(ptr %ptr, bfloat
; -O1: add w9, w9, w8
; -O1: add w9, w10, w9
; -O1: stxrh w10, w9, [x0]
- %r = atomicrmw fsub ptr %ptr, bfloat %value acquire, align 4
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_bfloat_aligned_acquire:
+; CHECK-no-lsfe: ldaxrh w9, [x0]
+; CHECK-no-lsfe: add w9, w9, w8
+; CHECK-no-lsfe: add w9, w10, w9
+; CHECK-no-lsfe: stxrh w10, w9, [x0]
+ %r = atomicrmw fsub ptr %ptr, bfloat %value acquire, align 2
ret bfloat %r
}
@@ -511,7 +634,13 @@ define dso_local bfloat @atomicrmw_fsub_bfloat_aligned_release(ptr %ptr, bfloat
; -O1: add w9, w9, w8
; -O1: add w9, w10, w9
; -O1: stlxrh w10, w9, [x0]
- %r = atomicrmw fsub ptr %ptr, bfloat %value release, align 4
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_bfloat_aligned_release:
+; CHECK-no-lsfe: ldxrh w9, [x0]
+; CHECK-no-lsfe: add w9, w9, w8
+; CHECK-no-lsfe: add w9, w10, w9
+; CHECK-no-lsfe: stlxrh w10, w9, [x0]
+ %r = atomicrmw fsub ptr %ptr, bfloat %value release, align 2
ret bfloat %r
}
@@ -530,7 +659,13 @@ define dso_local bfloat @atomicrmw_fsub_bfloat_aligned_acq_rel(ptr %ptr, bfloat
; -O1: add w9, w9, w8
; -O1: add w9, w10, w9
; -O1: stlxrh w10, w9, [x0]
- %r = atomicrmw fsub ptr %ptr, bfloat %value acq_rel, align 4
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_bfloat_aligned_acq_rel:
+; CHECK-no-lsfe: ldaxrh w9, [x0]
+; CHECK-no-lsfe: add w9, w9, w8
+; CHECK-no-lsfe: add w9, w10, w9
+; CHECK-no-lsfe: stlxrh w10, w9, [x0]
+ %r = atomicrmw fsub ptr %ptr, bfloat %value acq_rel, align 2
ret bfloat %r
}
@@ -549,20 +684,120 @@ define dso_local bfloat @atomicrmw_fsub_bfloat_aligned_seq_cst(ptr %ptr, bfloat
; -O1: add w9, w9, w8
; -O1: add w9, w10, w9
; -O1: stlxrh w10, w9, [x0]
- %r = atomicrmw fsub ptr %ptr, bfloat %value seq_cst, align 4
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_bfloat_aligned_seq_cst:
+; CHECK-no-lsfe: ldaxrh w9, [x0]
+; CHECK-no-lsfe: add w9, w9, w8
+; CHECK-no-lsfe: add w9, w10, w9
+; CHECK-no-lsfe: stlxrh w10, w9, [x0]
+ %r = atomicrmw fsub ptr %ptr, bfloat %value seq_cst, align 2
ret bfloat %r
}
-define dso_local double @atomicrmw_fsub_double_aligned_monotonic(ptr %ptr, double %value) {
-; -O0-LABEL: atomicrmw_fsub_double_aligned_monotonic:
-; -O0: ldaxr x0, [x9]
-; -O0: cmp x0, x10
-; -O0: stlxr w8, x11, [x9]
-; -O0: subs x8, x0, x8
+define dso_local float @atomicrmw_fsub_float_aligned_monotonic(ptr %ptr, float %value) {
+; -O0-LABEL: atomicrmw_fsub_float_aligned_monotonic:
+; -O0: ldaxr w0, [x9]
+; -O0: cmp w0, w10
+; -O0: stlxr w8, w11, [x9]
+; -O0: subs w8, w0, w8
+;
+; -O1-LABEL: atomicrmw_fsub_float_aligned_monotonic:
+; -O1: ldxr w8, [x0]
+; -O1: stxr w9, w8, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_float_aligned_monotonic:
+; CHECK-no-lsfe: ldxr w8, [x0]
+; CHECK-no-lsfe: stxr w9, w8, [x0]
+ %r = atomicrmw fsub ptr %ptr, float %value monotonic, align 4
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fsub_float_aligned_acquire(ptr %ptr, float %value) {
+; -O0-LABEL: atomicrmw_fsub_float_aligned_acquire:
+; -O0: ldaxr w0, [x9]
+; -O0: cmp w0, w10
+; -O0: stlxr w8, w11, [x9]
+; -O0: subs w8, w0, w8
+;
+; -O1-LABEL: atomicrmw_fsub_float_aligned_acquire:
+; -O1: ldaxr w8, [x0]
+; -O1: stxr w9, w8, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_float_aligned_acquire:
+; CHECK-no-lsfe: ldaxr w8, [x0]
+; CHECK-no-lsfe: stxr w9, w8, [x0]
+ %r = atomicrmw fsub ptr %ptr, float %value acquire, align 4
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fsub_float_aligned_release(ptr %ptr, float %value) {
+; -O0-LABEL: atomicrmw_fsub_float_aligned_release:
+; -O0: ldaxr w0, [x9]
+; -O0: cmp w0, w10
+; -O0: stlxr w8, w11, [x9]
+; -O0: subs w8, w0, w8
+;
+; -O1-LABEL: atomicrmw_fsub_float_aligned_release:
+; -O1: ldxr w8, [x0]
+; -O1: stlxr w9, w8, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_float_aligned_release:
+; CHECK-no-lsfe: ldxr w8, [x0]
+; CHECK-no-lsfe: stlxr w9, w8, [x0]
+ %r = atomicrmw fsub ptr %ptr, float %value release, align 4
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fsub_float_aligned_acq_rel(ptr %ptr, float %value) {
+; -O0-LABEL: atomicrmw_fsub_float_aligned_acq_rel:
+; -O0: ldaxr w0, [x9]
+; -O0: cmp w0, w10
+; -O0: stlxr w8, w11, [x9]
+; -O0: subs w8, w0, w8
+;
+; -O1-LABEL: atomicrmw_fsub_float_aligned_acq_rel:
+; -O1: ldaxr w8, [x0]
+; -O1: stlxr w9, w8, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_float_aligned_acq_rel:
+; CHECK-no-lsfe: ldaxr w8, [x0]
+; CHECK-no-lsfe: stlxr w9, w8, [x0]
+ %r = atomicrmw fsub ptr %ptr, float %value acq_rel, align 4
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fsub_float_aligned_seq_cst(ptr %ptr, float %value) {
+; -O0-LABEL: atomicrmw_fsub_float_aligned_seq_cst:
+; -O0: ldaxr w0, [x9]
+; -O0: cmp w0, w10
+; -O0: stlxr w8, w11, [x9]
+; -O0: subs w8, w0, w8
+;
+; -O1-LABEL: atomicrmw_fsub_float_aligned_seq_cst:
+; -O1: ldaxr w8, [x0]
+; -O1: stlxr w9, w8, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_float_aligned_seq_cst:
+; CHECK-no-lsfe: ldaxr w8, [x0]
+; CHECK-no-lsfe: stlxr w9, w8, [x0]
+ %r = atomicrmw fsub ptr %ptr, float %value seq_cst, align 4
+ ret float %r
+}
+
+define dso_local double @atomicrmw_fsub_double_aligned_monotonic(ptr %ptr, double %value) {
+; -O0-LABEL: atomicrmw_fsub_double_aligned_monotonic:
+; -O0: ldaxr x0, [x9]
+; -O0: cmp x0, x10
+; -O0: stlxr w8, x11, [x9]
+; -O0: subs x8, x0, x8
;
; -O1-LABEL: atomicrmw_fsub_double_aligned_monotonic:
; -O1: ldxr x8, [x0]
; -O1: stxr w9, x8, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_double_aligned_monotonic:
+; CHECK-no-lsfe: ldxr x8, [x0]
+; CHECK-no-lsfe: stxr w9, x8, [x0]
%r = atomicrmw fsub ptr %ptr, double %value monotonic, align 8
ret double %r
}
@@ -577,6 +812,10 @@ define dso_local double @atomicrmw_fsub_double_aligned_acquire(ptr %ptr, double
; -O1-LABEL: atomicrmw_fsub_double_aligned_acquire:
; -O1: ldaxr x8, [x0]
; -O1: stxr w9, x8, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_double_aligned_acquire:
+; CHECK-no-lsfe: ldaxr x8, [x0]
+; CHECK-no-lsfe: stxr w9, x8, [x0]
%r = atomicrmw fsub ptr %ptr, double %value acquire, align 8
ret double %r
}
@@ -591,6 +830,10 @@ define dso_local double @atomicrmw_fsub_double_aligned_release(ptr %ptr, double
; -O1-LABEL: atomicrmw_fsub_double_aligned_release:
; -O1: ldxr x8, [x0]
; -O1: stlxr w9, x8, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_double_aligned_release:
+; CHECK-no-lsfe: ldxr x8, [x0]
+; CHECK-no-lsfe: stlxr w9, x8, [x0]
%r = atomicrmw fsub ptr %ptr, double %value release, align 8
ret double %r
}
@@ -605,6 +848,10 @@ define dso_local double @atomicrmw_fsub_double_aligned_acq_rel(ptr %ptr, double
; -O1-LABEL: atomicrmw_fsub_double_aligned_acq_rel:
; -O1: ldaxr x8, [x0]
; -O1: stlxr w9, x8, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_double_aligned_acq_rel:
+; CHECK-no-lsfe: ldaxr x8, [x0]
+; CHECK-no-lsfe: stlxr w9, x8, [x0]
%r = atomicrmw fsub ptr %ptr, double %value acq_rel, align 8
ret double %r
}
@@ -619,6 +866,10 @@ define dso_local double @atomicrmw_fsub_double_aligned_seq_cst(ptr %ptr, double
; -O1-LABEL: atomicrmw_fsub_double_aligned_seq_cst:
; -O1: ldaxr x8, [x0]
; -O1: stlxr w9, x8, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_double_aligned_seq_cst:
+; CHECK-no-lsfe: ldaxr x8, [x0]
+; CHECK-no-lsfe: stlxr w9, x8, [x0]
%r = atomicrmw fsub ptr %ptr, double %value seq_cst, align 8
ret double %r
}
@@ -626,6 +877,9 @@ define dso_local double @atomicrmw_fsub_double_aligned_seq_cst(ptr %ptr, double
define dso_local half @atomicrmw_fsub_half_unaligned_monotonic(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fsub_half_unaligned_monotonic:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_half_unaligned_monotonic:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fsub ptr %ptr, half %value monotonic, align 1
ret half %r
}
@@ -633,6 +887,9 @@ define dso_local half @atomicrmw_fsub_half_unaligned_monotonic(ptr %ptr, half %v
define dso_local half @atomicrmw_fsub_half_unaligned_acquire(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fsub_half_unaligned_acquire:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_half_unaligned_acquire:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fsub ptr %ptr, half %value acquire, align 1
ret half %r
}
@@ -640,6 +897,9 @@ define dso_local half @atomicrmw_fsub_half_unaligned_acquire(ptr %ptr, half %val
define dso_local half @atomicrmw_fsub_half_unaligned_release(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fsub_half_unaligned_release:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_half_unaligned_release:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fsub ptr %ptr, half %value release, align 1
ret half %r
}
@@ -647,6 +907,9 @@ define dso_local half @atomicrmw_fsub_half_unaligned_release(ptr %ptr, half %val
define dso_local half @atomicrmw_fsub_half_unaligned_acq_rel(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fsub_half_unaligned_acq_rel:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_half_unaligned_acq_rel:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fsub ptr %ptr, half %value acq_rel, align 1
ret half %r
}
@@ -654,45 +917,13 @@ define dso_local half @atomicrmw_fsub_half_unaligned_acq_rel(ptr %ptr, half %val
define dso_local half @atomicrmw_fsub_half_unaligned_seq_cst(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fsub_half_unaligned_seq_cst:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_half_unaligned_seq_cst:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fsub ptr %ptr, half %value seq_cst, align 1
ret half %r
}
-define dso_local float @atomicrmw_fsub_float_unaligned_monotonic(ptr %ptr, float %value) {
-; CHECK-LABEL: atomicrmw_fsub_float_unaligned_monotonic:
-; CHECK: bl __atomic_compare_exchange
- %r = atomicrmw fsub ptr %ptr, float %value monotonic, align 1
- ret float %r
-}
-
-define dso_local float @atomicrmw_fsub_float_unaligned_acquire(ptr %ptr, float %value) {
-; CHECK-LABEL: atomicrmw_fsub_float_unaligned_acquire:
-; CHECK: bl __atomic_compare_exchange
- %r = atomicrmw fsub ptr %ptr, float %value acquire, align 1
- ret float %r
-}
-
-define dso_local float @atomicrmw_fsub_float_unaligned_release(ptr %ptr, float %value) {
-; CHECK-LABEL: atomicrmw_fsub_float_unaligned_release:
-; CHECK: bl __atomic_compare_exchange
- %r = atomicrmw fsub ptr %ptr, float %value release, align 1
- ret float %r
-}
-
-define dso_local float @atomicrmw_fsub_float_unaligned_acq_rel(ptr %ptr, float %value) {
-; CHECK-LABEL: atomicrmw_fsub_float_unaligned_acq_rel:
-; CHECK: bl __atomic_compare_exchange
- %r = atomicrmw fsub ptr %ptr, float %value acq_rel, align 1
- ret float %r
-}
-
-define dso_local float @atomicrmw_fsub_float_unaligned_seq_cst(ptr %ptr, float %value) {
-; CHECK-LABEL: atomicrmw_fsub_float_unaligned_seq_cst:
-; CHECK: bl __atomic_compare_exchange
- %r = atomicrmw fsub ptr %ptr, float %value seq_cst, align 1
- ret float %r
-}
-
define dso_local bfloat @atomicrmw_fsub_bfloat_unaligned_monotonic(ptr %ptr, bfloat %value) {
; -O0-LABEL: atomicrmw_fsub_bfloat_unaligned_monotonic:
; -O0: add w8, w8, w9
@@ -703,6 +934,11 @@ define dso_local bfloat @atomicrmw_fsub_bfloat_unaligned_monotonic(ptr %ptr, bfl
; -O1: add w8, w8, w20
; -O1: add w8, w9, w8
; -O1: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_bfloat_unaligned_monotonic:
+; CHECK-no-lsfe: add w8, w8, w20
+; CHECK-no-lsfe: add w8, w9, w8
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fsub ptr %ptr, bfloat %value monotonic, align 1
ret bfloat %r
}
@@ -717,6 +953,11 @@ define dso_local bfloat @atomicrmw_fsub_bfloat_unaligned_acquire(ptr %ptr, bfloa
; -O1: add w8, w8, w20
; -O1: add w8, w9, w8
; -O1: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_bfloat_unaligned_acquire:
+; CHECK-no-lsfe: add w8, w8, w20
+; CHECK-no-lsfe: add w8, w9, w8
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fsub ptr %ptr, bfloat %value acquire, align 1
ret bfloat %r
}
@@ -731,6 +972,11 @@ define dso_local bfloat @atomicrmw_fsub_bfloat_unaligned_release(ptr %ptr, bfloa
; -O1: add w8, w8, w20
; -O1: add w8, w9, w8
; -O1: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_bfloat_unaligned_release:
+; CHECK-no-lsfe: add w8, w8, w20
+; CHECK-no-lsfe: add w8, w9, w8
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fsub ptr %ptr, bfloat %value release, align 1
ret bfloat %r
}
@@ -745,6 +991,11 @@ define dso_local bfloat @atomicrmw_fsub_bfloat_unaligned_acq_rel(ptr %ptr, bfloa
; -O1: add w8, w8, w20
; -O1: add w8, w9, w8
; -O1: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_bfloat_unaligned_acq_rel:
+; CHECK-no-lsfe: add w8, w8, w20
+; CHECK-no-lsfe: add w8, w9, w8
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fsub ptr %ptr, bfloat %value acq_rel, align 1
ret bfloat %r
}
@@ -759,13 +1010,71 @@ define dso_local bfloat @atomicrmw_fsub_bfloat_unaligned_seq_cst(ptr %ptr, bfloa
; -O1: add w8, w8, w20
; -O1: add w8, w9, w8
; -O1: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_bfloat_unaligned_seq_cst:
+; CHECK-no-lsfe: add w8, w8, w20
+; CHECK-no-lsfe: add w8, w9, w8
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fsub ptr %ptr, bfloat %value seq_cst, align 1
ret bfloat %r
}
+define dso_local float @atomicrmw_fsub_float_unaligned_monotonic(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fsub_float_unaligned_monotonic:
+; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_float_unaligned_monotonic:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
+ %r = atomicrmw fsub ptr %ptr, float %value monotonic, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fsub_float_unaligned_acquire(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fsub_float_unaligned_acquire:
+; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_float_unaligned_acquire:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
+ %r = atomicrmw fsub ptr %ptr, float %value acquire, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fsub_float_unaligned_release(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fsub_float_unaligned_release:
+; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_float_unaligned_release:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
+ %r = atomicrmw fsub ptr %ptr, float %value release, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fsub_float_unaligned_acq_rel(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fsub_float_unaligned_acq_rel:
+; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_float_unaligned_acq_rel:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
+ %r = atomicrmw fsub ptr %ptr, float %value acq_rel, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fsub_float_unaligned_seq_cst(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fsub_float_unaligned_seq_cst:
+; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_float_unaligned_seq_cst:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
+ %r = atomicrmw fsub ptr %ptr, float %value seq_cst, align 1
+ ret float %r
+}
+
define dso_local double @atomicrmw_fsub_double_unaligned_monotonic(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fsub_double_unaligned_monotonic:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_double_unaligned_monotonic:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fsub ptr %ptr, double %value monotonic, align 1
ret double %r
}
@@ -773,6 +1082,9 @@ define dso_local double @atomicrmw_fsub_double_unaligned_monotonic(ptr %ptr, dou
define dso_local double @atomicrmw_fsub_double_unaligned_acquire(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fsub_double_unaligned_acquire:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_double_unaligned_acquire:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fsub ptr %ptr, double %value acquire, align 1
ret double %r
}
@@ -780,6 +1092,9 @@ define dso_local double @atomicrmw_fsub_double_unaligned_acquire(ptr %ptr, doubl
define dso_local double @atomicrmw_fsub_double_unaligned_release(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fsub_double_unaligned_release:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_double_unaligned_release:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fsub ptr %ptr, double %value release, align 1
ret double %r
}
@@ -787,6 +1102,9 @@ define dso_local double @atomicrmw_fsub_double_unaligned_release(ptr %ptr, doubl
define dso_local double @atomicrmw_fsub_double_unaligned_acq_rel(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fsub_double_unaligned_acq_rel:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_double_unaligned_acq_rel:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fsub ptr %ptr, double %value acq_rel, align 1
ret double %r
}
@@ -794,6 +1112,9 @@ define dso_local double @atomicrmw_fsub_double_unaligned_acq_rel(ptr %ptr, doubl
define dso_local double @atomicrmw_fsub_double_unaligned_seq_cst(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fsub_double_unaligned_seq_cst:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_double_unaligned_seq_cst:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fsub ptr %ptr, double %value seq_cst, align 1
ret double %r
}
@@ -801,6 +1122,10 @@ define dso_local double @atomicrmw_fsub_double_unaligned_seq_cst(ptr %ptr, doubl
define dso_local half @atomicrmw_fmax_half_aligned_monotonic(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fmax_half_aligned_monotonic:
; CHECK: ldfmaxnm h0, h0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_half_aligned_monotonic:
+; CHECK-no-lsfe: ldxrh w8, [x0]
+; CHECK-no-lsfe: stxrh w9, w8, [x0]
%r = atomicrmw fmax ptr %ptr, half %value monotonic, align 2
ret half %r
}
@@ -808,6 +1133,10 @@ define dso_local half @atomicrmw_fmax_half_aligned_monotonic(ptr %ptr, half %val
define dso_local half @atomicrmw_fmax_half_aligned_acquire(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fmax_half_aligned_acquire:
; CHECK: ldfmaxnma h0, h0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_half_aligned_acquire:
+; CHECK-no-lsfe: ldaxrh w8, [x0]
+; CHECK-no-lsfe: stxrh w9, w8, [x0]
%r = atomicrmw fmax ptr %ptr, half %value acquire, align 2
ret half %r
}
@@ -815,6 +1144,10 @@ define dso_local half @atomicrmw_fmax_half_aligned_acquire(ptr %ptr, half %value
define dso_local half @atomicrmw_fmax_half_aligned_release(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fmax_half_aligned_release:
; CHECK: ldfmaxnml h0, h0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_half_aligned_release:
+; CHECK-no-lsfe: ldxrh w8, [x0]
+; CHECK-no-lsfe: stlxrh w9, w8, [x0]
%r = atomicrmw fmax ptr %ptr, half %value release, align 2
ret half %r
}
@@ -822,6 +1155,10 @@ define dso_local half @atomicrmw_fmax_half_aligned_release(ptr %ptr, half %value
define dso_local half @atomicrmw_fmax_half_aligned_acq_rel(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fmax_half_aligned_acq_rel:
; CHECK: ldfmaxnmal h0, h0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_half_aligned_acq_rel:
+; CHECK-no-lsfe: ldaxrh w8, [x0]
+; CHECK-no-lsfe: stlxrh w9, w8, [x0]
%r = atomicrmw fmax ptr %ptr, half %value acq_rel, align 2
ret half %r
}
@@ -829,13 +1166,86 @@ define dso_local half @atomicrmw_fmax_half_aligned_acq_rel(ptr %ptr, half %value
define dso_local half @atomicrmw_fmax_half_aligned_seq_cst(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fmax_half_aligned_seq_cst:
; CHECK: ldfmaxnmal h0, h0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_half_aligned_seq_cst:
+; CHECK-no-lsfe: ldaxrh w8, [x0]
+; CHECK-no-lsfe: stlxrh w9, w8, [x0]
%r = atomicrmw fmax ptr %ptr, half %value seq_cst, align 2
ret half %r
}
+define dso_local bfloat @atomicrmw_fmax_bfloat_aligned_monotonic(ptr %ptr, bfloat %value) {
+; CHECK-LABEL: atomicrmw_fmax_bfloat_aligned_monotonic:
+; CHECK: ldbfmaxnm h0, h0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_bfloat_aligned_monotonic:
+; CHECK-no-lsfe: ldxrh w9, [x0]
+; CHECK-no-lsfe: add w9, w9, w8
+; CHECK-no-lsfe: add w9, w10, w9
+; CHECK-no-lsfe: stxrh w10, w9, [x0]
+ %r = atomicrmw fmax ptr %ptr, bfloat %value monotonic, align 2
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fmax_bfloat_aligned_acquire(ptr %ptr, bfloat %value) {
+; CHECK-LABEL: atomicrmw_fmax_bfloat_aligned_acquire:
+; CHECK: ldbfmaxnma h0, h0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_bfloat_aligned_acquire:
+; CHECK-no-lsfe: ldaxrh w9, [x0]
+; CHECK-no-lsfe: add w9, w9, w8
+; CHECK-no-lsfe: add w9, w10, w9
+; CHECK-no-lsfe: stxrh w10, w9, [x0]
+ %r = atomicrmw fmax ptr %ptr, bfloat %value acquire, align 2
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fmax_bfloat_aligned_release(ptr %ptr, bfloat %value) {
+; CHECK-LABEL: atomicrmw_fmax_bfloat_aligned_release:
+; CHECK: ldbfmaxnml h0, h0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_bfloat_aligned_release:
+; CHECK-no-lsfe: ldxrh w9, [x0]
+; CHECK-no-lsfe: add w9, w9, w8
+; CHECK-no-lsfe: add w9, w10, w9
+; CHECK-no-lsfe: stlxrh w10, w9, [x0]
+ %r = atomicrmw fmax ptr %ptr, bfloat %value release, align 2
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fmax_bfloat_aligned_acq_rel(ptr %ptr, bfloat %value) {
+; CHECK-LABEL: atomicrmw_fmax_bfloat_aligned_acq_rel:
+; CHECK: ldbfmaxnmal h0, h0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_bfloat_aligned_acq_rel:
+; CHECK-no-lsfe: ldaxrh w9, [x0]
+; CHECK-no-lsfe: add w9, w9, w8
+; CHECK-no-lsfe: add w9, w10, w9
+; CHECK-no-lsfe: stlxrh w10, w9, [x0]
+ %r = atomicrmw fmax ptr %ptr, bfloat %value acq_rel, align 2
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fmax_bfloat_aligned_seq_cst(ptr %ptr, bfloat %value) {
+; CHECK-LABEL: atomicrmw_fmax_bfloat_aligned_seq_cst:
+; CHECK: ldbfmaxnmal h0, h0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_bfloat_aligned_seq_cst:
+; CHECK-no-lsfe: ldaxrh w9, [x0]
+; CHECK-no-lsfe: add w9, w9, w8
+; CHECK-no-lsfe: add w9, w10, w9
+; CHECK-no-lsfe: stlxrh w10, w9, [x0]
+ %r = atomicrmw fmax ptr %ptr, bfloat %value seq_cst, align 2
+ ret bfloat %r
+}
+
define dso_local float @atomicrmw_fmax_float_aligned_monotonic(ptr %ptr, float %value) {
; CHECK-LABEL: atomicrmw_fmax_float_aligned_monotonic:
; CHECK: ldfmaxnm s0, s0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_float_aligned_monotonic:
+; CHECK-no-lsfe: ldxr w8, [x0]
+; CHECK-no-lsfe: stxr w9, w8, [x0]
%r = atomicrmw fmax ptr %ptr, float %value monotonic, align 4
ret float %r
}
@@ -843,6 +1253,10 @@ define dso_local float @atomicrmw_fmax_float_aligned_monotonic(ptr %ptr, float %
define dso_local float @atomicrmw_fmax_float_aligned_acquire(ptr %ptr, float %value) {
; CHECK-LABEL: atomicrmw_fmax_float_aligned_acquire:
; CHECK: ldfmaxnma s0, s0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_float_aligned_acquire:
+; CHECK-no-lsfe: ldaxr w8, [x0]
+; CHECK-no-lsfe: stxr w9, w8, [x0]
%r = atomicrmw fmax ptr %ptr, float %value acquire, align 4
ret float %r
}
@@ -850,6 +1264,10 @@ define dso_local float @atomicrmw_fmax_float_aligned_acquire(ptr %ptr, float %va
define dso_local float @atomicrmw_fmax_float_aligned_release(ptr %ptr, float %value) {
; CHECK-LABEL: atomicrmw_fmax_float_aligned_release:
; CHECK: ldfmaxnml s0, s0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_float_aligned_release:
+; CHECK-no-lsfe: ldxr w8, [x0]
+; CHECK-no-lsfe: stlxr w9, w8, [x0]
%r = atomicrmw fmax ptr %ptr, float %value release, align 4
ret float %r
}
@@ -857,6 +1275,10 @@ define dso_local float @atomicrmw_fmax_float_aligned_release(ptr %ptr, float %va
define dso_local float @atomicrmw_fmax_float_aligned_acq_rel(ptr %ptr, float %value) {
; CHECK-LABEL: atomicrmw_fmax_float_aligned_acq_rel:
; CHECK: ldfmaxnmal s0, s0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_float_aligned_acq_rel:
+; CHECK-no-lsfe: ldaxr w8, [x0]
+; CHECK-no-lsfe: stlxr w9, w8, [x0]
%r = atomicrmw fmax ptr %ptr, float %value acq_rel, align 4
ret float %r
}
@@ -864,48 +1286,21 @@ define dso_local float @atomicrmw_fmax_float_aligned_acq_rel(ptr %ptr, float %va
define dso_local float @atomicrmw_fmax_float_aligned_seq_cst(ptr %ptr, float %value) {
; CHECK-LABEL: atomicrmw_fmax_float_aligned_seq_cst:
; CHECK: ldfmaxnmal s0, s0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_float_aligned_seq_cst:
+; CHECK-no-lsfe: ldaxr w8, [x0]
+; CHECK-no-lsfe: stlxr w9, w8, [x0]
%r = atomicrmw fmax ptr %ptr, float %value seq_cst, align 4
ret float %r
}
-define dso_local bfloat @atomicrmw_fmax_bfloat_aligned_monotonic(ptr %ptr, bfloat %value) {
-; CHECK-LABEL: atomicrmw_fmax_bfloat_aligned_monotonic:
-; CHECK: ldbfmaxnm h0, h0, [x0]
- %r = atomicrmw fmax ptr %ptr, bfloat %value monotonic, align 4
- ret bfloat %r
-}
-
-define dso_local bfloat @atomicrmw_fmax_bfloat_aligned_acquire(ptr %ptr, bfloat %value) {
-; CHECK-LABEL: atomicrmw_fmax_bfloat_aligned_acquire:
-; CHECK: ldbfmaxnma h0, h0, [x0]
- %r = atomicrmw fmax ptr %ptr, bfloat %value acquire, align 4
- ret bfloat %r
-}
-
-define dso_local bfloat @atomicrmw_fmax_bfloat_aligned_release(ptr %ptr, bfloat %value) {
-; CHECK-LABEL: atomicrmw_fmax_bfloat_aligned_release:
-; CHECK: ldbfmaxnml h0, h0, [x0]
- %r = atomicrmw fmax ptr %ptr, bfloat %value release, align 4
- ret bfloat %r
-}
-
-define dso_local bfloat @atomicrmw_fmax_bfloat_aligned_acq_rel(ptr %ptr, bfloat %value) {
-; CHECK-LABEL: atomicrmw_fmax_bfloat_aligned_acq_rel:
-; CHECK: ldbfmaxnmal h0, h0, [x0]
- %r = atomicrmw fmax ptr %ptr, bfloat %value acq_rel, align 4
- ret bfloat %r
-}
-
-define dso_local bfloat @atomicrmw_fmax_bfloat_aligned_seq_cst(ptr %ptr, bfloat %value) {
-; CHECK-LABEL: atomicrmw_fmax_bfloat_aligned_seq_cst:
-; CHECK: ldbfmaxnmal h0, h0, [x0]
- %r = atomicrmw fmax ptr %ptr, bfloat %value seq_cst, align 4
- ret bfloat %r
-}
-
define dso_local double @atomicrmw_fmax_double_aligned_monotonic(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmax_double_aligned_monotonic:
; CHECK: ldfmaxnm d0, d0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_double_aligned_monotonic:
+; CHECK-no-lsfe: ldxr x8, [x0]
+; CHECK-no-lsfe: stxr w9, x8, [x0]
%r = atomicrmw fmax ptr %ptr, double %value monotonic, align 8
ret double %r
}
@@ -913,6 +1308,10 @@ define dso_local double @atomicrmw_fmax_double_aligned_monotonic(ptr %ptr, doubl
define dso_local double @atomicrmw_fmax_double_aligned_acquire(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmax_double_aligned_acquire:
; CHECK: ldfmaxnma d0, d0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_double_aligned_acquire:
+; CHECK-no-lsfe: ldaxr x8, [x0]
+; CHECK-no-lsfe: stxr w9, x8, [x0]
%r = atomicrmw fmax ptr %ptr, double %value acquire, align 8
ret double %r
}
@@ -920,6 +1319,10 @@ define dso_local double @atomicrmw_fmax_double_aligned_acquire(ptr %ptr, double
define dso_local double @atomicrmw_fmax_double_aligned_release(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmax_double_aligned_release:
; CHECK: ldfmaxnml d0, d0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_double_aligned_release:
+; CHECK-no-lsfe: ldxr x8, [x0]
+; CHECK-no-lsfe: stlxr w9, x8, [x0]
%r = atomicrmw fmax ptr %ptr, double %value release, align 8
ret double %r
}
@@ -927,6 +1330,10 @@ define dso_local double @atomicrmw_fmax_double_aligned_release(ptr %ptr, double
define dso_local double @atomicrmw_fmax_double_aligned_acq_rel(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmax_double_aligned_acq_rel:
; CHECK: ldfmaxnmal d0, d0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_double_aligned_acq_rel:
+; CHECK-no-lsfe: ldaxr x8, [x0]
+; CHECK-no-lsfe: stlxr w9, x8, [x0]
%r = atomicrmw fmax ptr %ptr, double %value acq_rel, align 8
ret double %r
}
@@ -934,6 +1341,10 @@ define dso_local double @atomicrmw_fmax_double_aligned_acq_rel(ptr %ptr, double
define dso_local double @atomicrmw_fmax_double_aligned_seq_cst(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmax_double_aligned_seq_cst:
; CHECK: ldfmaxnmal d0, d0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_double_aligned_seq_cst:
+; CHECK-no-lsfe: ldaxr x8, [x0]
+; CHECK-no-lsfe: stlxr w9, x8, [x0]
%r = atomicrmw fmax ptr %ptr, double %value seq_cst, align 8
ret double %r
}
@@ -941,71 +1352,51 @@ define dso_local double @atomicrmw_fmax_double_aligned_seq_cst(ptr %ptr, double
define dso_local half @atomicrmw_fmax_half_unaligned_monotonic(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fmax_half_unaligned_monotonic:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_half_unaligned_monotonic:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fmax ptr %ptr, half %value monotonic, align 1
ret half %r
}
-define dso_local half @atomicrmw_fmax_half_unaligned_acquire(ptr %ptr, half %value) {
-; CHECK-LABEL: atomicrmw_fmax_half_unaligned_acquire:
-; CHECK: bl __atomic_compare_exchange
- %r = atomicrmw fmax ptr %ptr, half %value acquire, align 1
- ret half %r
-}
-
-define dso_local half @atomicrmw_fmax_half_unaligned_release(ptr %ptr, half %value) {
-; CHECK-LABEL: atomicrmw_fmax_half_unaligned_release:
-; CHECK: bl __atomic_compare_exchange
- %r = atomicrmw fmax ptr %ptr, half %value release, align 1
- ret half %r
-}
-
-define dso_local half @atomicrmw_fmax_half_unaligned_acq_rel(ptr %ptr, half %value) {
-; CHECK-LABEL: atomicrmw_fmax_half_unaligned_acq_rel:
-; CHECK: bl __atomic_compare_exchange
- %r = atomicrmw fmax ptr %ptr, half %value acq_rel, align 1
- ret half %r
-}
-
-define dso_local half @atomicrmw_fmax_half_unaligned_seq_cst(ptr %ptr, half %value) {
-; CHECK-LABEL: atomicrmw_fmax_half_unaligned_seq_cst:
-; CHECK: bl __atomic_compare_exchange
- %r = atomicrmw fmax ptr %ptr, half %value seq_cst, align 1
- ret half %r
-}
-
-define dso_local float @atomicrmw_fmax_float_unaligned_monotonic(ptr %ptr, float %value) {
-; CHECK-LABEL: atomicrmw_fmax_float_unaligned_monotonic:
-; CHECK: bl __atomic_compare_exchange
- %r = atomicrmw fmax ptr %ptr, float %value monotonic, align 1
- ret float %r
-}
-
-define dso_local float @atomicrmw_fmax_float_unaligned_acquire(ptr %ptr, float %value) {
-; CHECK-LABEL: atomicrmw_fmax_float_unaligned_acquire:
+define dso_local half @atomicrmw_fmax_half_unaligned_acquire(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fmax_half_unaligned_acquire:
; CHECK: bl __atomic_compare_exchange
- %r = atomicrmw fmax ptr %ptr, float %value acquire, align 1
- ret float %r
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_half_unaligned_acquire:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
+ %r = atomicrmw fmax ptr %ptr, half %value acquire, align 1
+ ret half %r
}
-define dso_local float @atomicrmw_fmax_float_unaligned_release(ptr %ptr, float %value) {
-; CHECK-LABEL: atomicrmw_fmax_float_unaligned_release:
+define dso_local half @atomicrmw_fmax_half_unaligned_release(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fmax_half_unaligned_release:
; CHECK: bl __atomic_compare_exchange
- %r = atomicrmw fmax ptr %ptr, float %value release, align 1
- ret float %r
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_half_unaligned_release:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
+ %r = atomicrmw fmax ptr %ptr, half %value release, align 1
+ ret half %r
}
-define dso_local float @atomicrmw_fmax_float_unaligned_acq_rel(ptr %ptr, float %value) {
-; CHECK-LABEL: atomicrmw_fmax_float_unaligned_acq_rel:
+define dso_local half @atomicrmw_fmax_half_unaligned_acq_rel(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fmax_half_unaligned_acq_rel:
; CHECK: bl __atomic_compare_exchange
- %r = atomicrmw fmax ptr %ptr, float %value acq_rel, align 1
- ret float %r
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_half_unaligned_acq_rel:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
+ %r = atomicrmw fmax ptr %ptr, half %value acq_rel, align 1
+ ret half %r
}
-define dso_local float @atomicrmw_fmax_float_unaligned_seq_cst(ptr %ptr, float %value) {
-; CHECK-LABEL: atomicrmw_fmax_float_unaligned_seq_cst:
+define dso_local half @atomicrmw_fmax_half_unaligned_seq_cst(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fmax_half_unaligned_seq_cst:
; CHECK: bl __atomic_compare_exchange
- %r = atomicrmw fmax ptr %ptr, float %value seq_cst, align 1
- ret float %r
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_half_unaligned_seq_cst:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
+ %r = atomicrmw fmax ptr %ptr, half %value seq_cst, align 1
+ ret half %r
}
define dso_local bfloat @atomicrmw_fmax_bfloat_unaligned_monotonic(ptr %ptr, bfloat %value) {
@@ -1018,6 +1409,11 @@ define dso_local bfloat @atomicrmw_fmax_bfloat_unaligned_monotonic(ptr %ptr, bfl
; -O1: add w8, w8, w20
; -O1: add w8, w9, w8
; -O1: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_bfloat_unaligned_monotonic:
+; CHECK-no-lsfe: add w8, w8, w20
+; CHECK-no-lsfe: add w8, w9, w8
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fmax ptr %ptr, bfloat %value monotonic, align 1
ret bfloat %r
}
@@ -1032,6 +1428,11 @@ define dso_local bfloat @atomicrmw_fmax_bfloat_unaligned_acquire(ptr %ptr, bfloa
; -O1: add w8, w8, w20
; -O1: add w8, w9, w8
; -O1: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_bfloat_unaligned_acquire:
+; CHECK-no-lsfe: add w8, w8, w20
+; CHECK-no-lsfe: add w8, w9, w8
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fmax ptr %ptr, bfloat %value acquire, align 1
ret bfloat %r
}
@@ -1046,6 +1447,11 @@ define dso_local bfloat @atomicrmw_fmax_bfloat_unaligned_release(ptr %ptr, bfloa
; -O1: add w8, w8, w20
; -O1: add w8, w9, w8
; -O1: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_bfloat_unaligned_release:
+; CHECK-no-lsfe: add w8, w8, w20
+; CHECK-no-lsfe: add w8, w9, w8
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fmax ptr %ptr, bfloat %value release, align 1
ret bfloat %r
}
@@ -1060,6 +1466,11 @@ define dso_local bfloat @atomicrmw_fmax_bfloat_unaligned_acq_rel(ptr %ptr, bfloa
; -O1: add w8, w8, w20
; -O1: add w8, w9, w8
; -O1: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_bfloat_unaligned_acq_rel:
+; CHECK-no-lsfe: add w8, w8, w20
+; CHECK-no-lsfe: add w8, w9, w8
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fmax ptr %ptr, bfloat %value acq_rel, align 1
ret bfloat %r
}
@@ -1074,13 +1485,71 @@ define dso_local bfloat @atomicrmw_fmax_bfloat_unaligned_seq_cst(ptr %ptr, bfloa
; -O1: add w8, w8, w20
; -O1: add w8, w9, w8
; -O1: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_bfloat_unaligned_seq_cst:
+; CHECK-no-lsfe: add w8, w8, w20
+; CHECK-no-lsfe: add w8, w9, w8
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fmax ptr %ptr, bfloat %value seq_cst, align 1
ret bfloat %r
}
+define dso_local float @atomicrmw_fmax_float_unaligned_monotonic(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fmax_float_unaligned_monotonic:
+; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_float_unaligned_monotonic:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
+ %r = atomicrmw fmax ptr %ptr, float %value monotonic, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fmax_float_unaligned_acquire(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fmax_float_unaligned_acquire:
+; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_float_unaligned_acquire:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
+ %r = atomicrmw fmax ptr %ptr, float %value acquire, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fmax_float_unaligned_release(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fmax_float_unaligned_release:
+; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_float_unaligned_release:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
+ %r = atomicrmw fmax ptr %ptr, float %value release, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fmax_float_unaligned_acq_rel(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fmax_float_unaligned_acq_rel:
+; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_float_unaligned_acq_rel:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
+ %r = atomicrmw fmax ptr %ptr, float %value acq_rel, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fmax_float_unaligned_seq_cst(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fmax_float_unaligned_seq_cst:
+; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_float_unaligned_seq_cst:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
+ %r = atomicrmw fmax ptr %ptr, float %value seq_cst, align 1
+ ret float %r
+}
+
define dso_local double @atomicrmw_fmax_double_unaligned_monotonic(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmax_double_unaligned_monotonic:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_double_unaligned_monotonic:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fmax ptr %ptr, double %value monotonic, align 1
ret double %r
}
@@ -1088,6 +1557,9 @@ define dso_local double @atomicrmw_fmax_double_unaligned_monotonic(ptr %ptr, dou
define dso_local double @atomicrmw_fmax_double_unaligned_acquire(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmax_double_unaligned_acquire:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_double_unaligned_acquire:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fmax ptr %ptr, double %value acquire, align 1
ret double %r
}
@@ -1095,6 +1567,9 @@ define dso_local double @atomicrmw_fmax_double_unaligned_acquire(ptr %ptr, doubl
define dso_local double @atomicrmw_fmax_double_unaligned_release(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmax_double_unaligned_release:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_double_unaligned_release:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fmax ptr %ptr, double %value release, align 1
ret double %r
}
@@ -1102,6 +1577,9 @@ define dso_local double @atomicrmw_fmax_double_unaligned_release(ptr %ptr, doubl
define dso_local double @atomicrmw_fmax_double_unaligned_acq_rel(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmax_double_unaligned_acq_rel:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_double_unaligned_acq_rel:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fmax ptr %ptr, double %value acq_rel, align 1
ret double %r
}
@@ -1109,6 +1587,9 @@ define dso_local double @atomicrmw_fmax_double_unaligned_acq_rel(ptr %ptr, doubl
define dso_local double @atomicrmw_fmax_double_unaligned_seq_cst(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmax_double_unaligned_seq_cst:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_double_unaligned_seq_cst:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fmax ptr %ptr, double %value seq_cst, align 1
ret double %r
}
@@ -1116,6 +1597,10 @@ define dso_local double @atomicrmw_fmax_double_unaligned_seq_cst(ptr %ptr, doubl
define dso_local half @atomicrmw_fmin_half_aligned_monotonic(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fmin_half_aligned_monotonic:
; CHECK: ldfminnm h0, h0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_half_aligned_monotonic:
+; CHECK-no-lsfe: ldxrh w8, [x0]
+; CHECK-no-lsfe: stxrh w9, w8, [x0]
%r = atomicrmw fmin ptr %ptr, half %value monotonic, align 2
ret half %r
}
@@ -1123,6 +1608,10 @@ define dso_local half @atomicrmw_fmin_half_aligned_monotonic(ptr %ptr, half %val
define dso_local half @atomicrmw_fmin_half_aligned_acquire(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fmin_half_aligned_acquire:
; CHECK: ldfminnma h0, h0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_half_aligned_acquire:
+; CHECK-no-lsfe: ldaxrh w8, [x0]
+; CHECK-no-lsfe: stxrh w9, w8, [x0]
%r = atomicrmw fmin ptr %ptr, half %value acquire, align 2
ret half %r
}
@@ -1130,6 +1619,10 @@ define dso_local half @atomicrmw_fmin_half_aligned_acquire(ptr %ptr, half %value
define dso_local half @atomicrmw_fmin_half_aligned_release(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fmin_half_aligned_release:
; CHECK: ldfminnml h0, h0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_half_aligned_release:
+; CHECK-no-lsfe: ldxrh w8, [x0]
+; CHECK-no-lsfe: stlxrh w9, w8, [x0]
%r = atomicrmw fmin ptr %ptr, half %value release, align 2
ret half %r
}
@@ -1137,6 +1630,10 @@ define dso_local half @atomicrmw_fmin_half_aligned_release(ptr %ptr, half %value
define dso_local half @atomicrmw_fmin_half_aligned_acq_rel(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fmin_half_aligned_acq_rel:
; CHECK: ldfminnmal h0, h0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_half_aligned_acq_rel:
+; CHECK-no-lsfe: ldaxrh w8, [x0]
+; CHECK-no-lsfe: stlxrh w9, w8, [x0]
%r = atomicrmw fmin ptr %ptr, half %value acq_rel, align 2
ret half %r
}
@@ -1144,13 +1641,86 @@ define dso_local half @atomicrmw_fmin_half_aligned_acq_rel(ptr %ptr, half %value
define dso_local half @atomicrmw_fmin_half_aligned_seq_cst(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fmin_half_aligned_seq_cst:
; CHECK: ldfminnmal h0, h0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_half_aligned_seq_cst:
+; CHECK-no-lsfe: ldaxrh w8, [x0]
+; CHECK-no-lsfe: stlxrh w9, w8, [x0]
%r = atomicrmw fmin ptr %ptr, half %value seq_cst, align 2
ret half %r
}
+define dso_local bfloat @atomicrmw_fmin_bfloat_aligned_monotonic(ptr %ptr, bfloat %value) {
+; CHECK-LABEL: atomicrmw_fmin_bfloat_aligned_monotonic:
+; CHECK: ldbfminnm h0, h0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_bfloat_aligned_monotonic:
+; CHECK-no-lsfe: ldxrh w9, [x0]
+; CHECK-no-lsfe: add w9, w9, w8
+; CHECK-no-lsfe: add w9, w10, w9
+; CHECK-no-lsfe: stxrh w10, w9, [x0]
+ %r = atomicrmw fmin ptr %ptr, bfloat %value monotonic, align 2
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fmin_bfloat_aligned_acquire(ptr %ptr, bfloat %value) {
+; CHECK-LABEL: atomicrmw_fmin_bfloat_aligned_acquire:
+; CHECK: ldbfminnma h0, h0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_bfloat_aligned_acquire:
+; CHECK-no-lsfe: ldaxrh w9, [x0]
+; CHECK-no-lsfe: add w9, w9, w8
+; CHECK-no-lsfe: add w9, w10, w9
+; CHECK-no-lsfe: stxrh w10, w9, [x0]
+ %r = atomicrmw fmin ptr %ptr, bfloat %value acquire, align 2
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fmin_bfloat_aligned_release(ptr %ptr, bfloat %value) {
+; CHECK-LABEL: atomicrmw_fmin_bfloat_aligned_release:
+; CHECK: ldbfminnml h0, h0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_bfloat_aligned_release:
+; CHECK-no-lsfe: ldxrh w9, [x0]
+; CHECK-no-lsfe: add w9, w9, w8
+; CHECK-no-lsfe: add w9, w10, w9
+; CHECK-no-lsfe: stlxrh w10, w9, [x0]
+ %r = atomicrmw fmin ptr %ptr, bfloat %value release, align 2
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fmin_bfloat_aligned_acq_rel(ptr %ptr, bfloat %value) {
+; CHECK-LABEL: atomicrmw_fmin_bfloat_aligned_acq_rel:
+; CHECK: ldbfminnmal h0, h0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_bfloat_aligned_acq_rel:
+; CHECK-no-lsfe: ldaxrh w9, [x0]
+; CHECK-no-lsfe: add w9, w9, w8
+; CHECK-no-lsfe: add w9, w10, w9
+; CHECK-no-lsfe: stlxrh w10, w9, [x0]
+ %r = atomicrmw fmin ptr %ptr, bfloat %value acq_rel, align 2
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fmin_bfloat_aligned_seq_cst(ptr %ptr, bfloat %value) {
+; CHECK-LABEL: atomicrmw_fmin_bfloat_aligned_seq_cst:
+; CHECK: ldbfminnmal h0, h0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_bfloat_aligned_seq_cst:
+; CHECK-no-lsfe: ldaxrh w9, [x0]
+; CHECK-no-lsfe: add w9, w9, w8
+; CHECK-no-lsfe: add w9, w10, w9
+; CHECK-no-lsfe: stlxrh w10, w9, [x0]
+ %r = atomicrmw fmin ptr %ptr, bfloat %value seq_cst, align 2
+ ret bfloat %r
+}
+
define dso_local float @atomicrmw_fmin_float_aligned_monotonic(ptr %ptr, float %value) {
; CHECK-LABEL: atomicrmw_fmin_float_aligned_monotonic:
; CHECK: ldfminnm s0, s0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_float_aligned_monotonic:
+; CHECK-no-lsfe: ldxr w8, [x0]
+; CHECK-no-lsfe: stxr w9, w8, [x0]
%r = atomicrmw fmin ptr %ptr, float %value monotonic, align 4
ret float %r
}
@@ -1158,6 +1728,10 @@ define dso_local float @atomicrmw_fmin_float_aligned_monotonic(ptr %ptr, float %
define dso_local float @atomicrmw_fmin_float_aligned_acquire(ptr %ptr, float %value) {
; CHECK-LABEL: atomicrmw_fmin_float_aligned_acquire:
; CHECK: ldfminnma s0, s0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_float_aligned_acquire:
+; CHECK-no-lsfe: ldaxr w8, [x0]
+; CHECK-no-lsfe: stxr w9, w8, [x0]
%r = atomicrmw fmin ptr %ptr, float %value acquire, align 4
ret float %r
}
@@ -1165,6 +1739,10 @@ define dso_local float @atomicrmw_fmin_float_aligned_acquire(ptr %ptr, float %va
define dso_local float @atomicrmw_fmin_float_aligned_release(ptr %ptr, float %value) {
; CHECK-LABEL: atomicrmw_fmin_float_aligned_release:
; CHECK: ldfminnml s0, s0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_float_aligned_release:
+; CHECK-no-lsfe: ldxr w8, [x0]
+; CHECK-no-lsfe: stlxr w9, w8, [x0]
%r = atomicrmw fmin ptr %ptr, float %value release, align 4
ret float %r
}
@@ -1172,6 +1750,10 @@ define dso_local float @atomicrmw_fmin_float_aligned_release(ptr %ptr, float %va
define dso_local float @atomicrmw_fmin_float_aligned_acq_rel(ptr %ptr, float %value) {
; CHECK-LABEL: atomicrmw_fmin_float_aligned_acq_rel:
; CHECK: ldfminnmal s0, s0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_float_aligned_acq_rel:
+; CHECK-no-lsfe: ldaxr w8, [x0]
+; CHECK-no-lsfe: stlxr w9, w8, [x0]
%r = atomicrmw fmin ptr %ptr, float %value acq_rel, align 4
ret float %r
}
@@ -1179,48 +1761,21 @@ define dso_local float @atomicrmw_fmin_float_aligned_acq_rel(ptr %ptr, float %va
define dso_local float @atomicrmw_fmin_float_aligned_seq_cst(ptr %ptr, float %value) {
; CHECK-LABEL: atomicrmw_fmin_float_aligned_seq_cst:
; CHECK: ldfminnmal s0, s0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_float_aligned_seq_cst:
+; CHECK-no-lsfe: ldaxr w8, [x0]
+; CHECK-no-lsfe: stlxr w9, w8, [x0]
%r = atomicrmw fmin ptr %ptr, float %value seq_cst, align 4
ret float %r
}
-define dso_local bfloat @atomicrmw_fmin_bfloat_aligned_monotonic(ptr %ptr, bfloat %value) {
-; CHECK-LABEL: atomicrmw_fmin_bfloat_aligned_monotonic:
-; CHECK: ldbfminnm h0, h0, [x0]
- %r = atomicrmw fmin ptr %ptr, bfloat %value monotonic, align 4
- ret bfloat %r
-}
-
-define dso_local bfloat @atomicrmw_fmin_bfloat_aligned_acquire(ptr %ptr, bfloat %value) {
-; CHECK-LABEL: atomicrmw_fmin_bfloat_aligned_acquire:
-; CHECK: ldbfminnma h0, h0, [x0]
- %r = atomicrmw fmin ptr %ptr, bfloat %value acquire, align 4
- ret bfloat %r
-}
-
-define dso_local bfloat @atomicrmw_fmin_bfloat_aligned_release(ptr %ptr, bfloat %value) {
-; CHECK-LABEL: atomicrmw_fmin_bfloat_aligned_release:
-; CHECK: ldbfminnml h0, h0, [x0]
- %r = atomicrmw fmin ptr %ptr, bfloat %value release, align 4
- ret bfloat %r
-}
-
-define dso_local bfloat @atomicrmw_fmin_bfloat_aligned_acq_rel(ptr %ptr, bfloat %value) {
-; CHECK-LABEL: atomicrmw_fmin_bfloat_aligned_acq_rel:
-; CHECK: ldbfminnmal h0, h0, [x0]
- %r = atomicrmw fmin ptr %ptr, bfloat %value acq_rel, align 4
- ret bfloat %r
-}
-
-define dso_local bfloat @atomicrmw_fmin_bfloat_aligned_seq_cst(ptr %ptr, bfloat %value) {
-; CHECK-LABEL: atomicrmw_fmin_bfloat_aligned_seq_cst:
-; CHECK: ldbfminnmal h0, h0, [x0]
- %r = atomicrmw fmin ptr %ptr, bfloat %value seq_cst, align 4
- ret bfloat %r
-}
-
define dso_local double @atomicrmw_fmin_double_aligned_monotonic(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmin_double_aligned_monotonic:
; CHECK: ldfminnm d0, d0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_double_aligned_monotonic:
+; CHECK-no-lsfe: ldxr x8, [x0]
+; CHECK-no-lsfe: stxr w9, x8, [x0]
%r = atomicrmw fmin ptr %ptr, double %value monotonic, align 8
ret double %r
}
@@ -1228,6 +1783,10 @@ define dso_local double @atomicrmw_fmin_double_aligned_monotonic(ptr %ptr, doubl
define dso_local double @atomicrmw_fmin_double_aligned_acquire(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmin_double_aligned_acquire:
; CHECK: ldfminnma d0, d0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_double_aligned_acquire:
+; CHECK-no-lsfe: ldaxr x8, [x0]
+; CHECK-no-lsfe: stxr w9, x8, [x0]
%r = atomicrmw fmin ptr %ptr, double %value acquire, align 8
ret double %r
}
@@ -1235,6 +1794,10 @@ define dso_local double @atomicrmw_fmin_double_aligned_acquire(ptr %ptr, double
define dso_local double @atomicrmw_fmin_double_aligned_release(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmin_double_aligned_release:
; CHECK: ldfminnml d0, d0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_double_aligned_release:
+; CHECK-no-lsfe: ldxr x8, [x0]
+; CHECK-no-lsfe: stlxr w9, x8, [x0]
%r = atomicrmw fmin ptr %ptr, double %value release, align 8
ret double %r
}
@@ -1242,6 +1805,10 @@ define dso_local double @atomicrmw_fmin_double_aligned_release(ptr %ptr, double
define dso_local double @atomicrmw_fmin_double_aligned_acq_rel(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmin_double_aligned_acq_rel:
; CHECK: ldfminnmal d0, d0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_double_aligned_acq_rel:
+; CHECK-no-lsfe: ldaxr x8, [x0]
+; CHECK-no-lsfe: stlxr w9, x8, [x0]
%r = atomicrmw fmin ptr %ptr, double %value acq_rel, align 8
ret double %r
}
@@ -1249,6 +1816,10 @@ define dso_local double @atomicrmw_fmin_double_aligned_acq_rel(ptr %ptr, double
define dso_local double @atomicrmw_fmin_double_aligned_seq_cst(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmin_double_aligned_seq_cst:
; CHECK: ldfminnmal d0, d0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_double_aligned_seq_cst:
+; CHECK-no-lsfe: ldaxr x8, [x0]
+; CHECK-no-lsfe: stlxr w9, x8, [x0]
%r = atomicrmw fmin ptr %ptr, double %value seq_cst, align 8
ret double %r
}
@@ -1256,6 +1827,9 @@ define dso_local double @atomicrmw_fmin_double_aligned_seq_cst(ptr %ptr, double
define dso_local half @atomicrmw_fmin_half_unaligned_monotonic(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fmin_half_unaligned_monotonic:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_half_unaligned_monotonic:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fmin ptr %ptr, half %value monotonic, align 1
ret half %r
}
@@ -1263,6 +1837,9 @@ define dso_local half @atomicrmw_fmin_half_unaligned_monotonic(ptr %ptr, half %v
define dso_local half @atomicrmw_fmin_half_unaligned_acquire(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fmin_half_unaligned_acquire:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_half_unaligned_acquire:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fmin ptr %ptr, half %value acquire, align 1
ret half %r
}
@@ -1270,6 +1847,9 @@ define dso_local half @atomicrmw_fmin_half_unaligned_acquire(ptr %ptr, half %val
define dso_local half @atomicrmw_fmin_half_unaligned_release(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fmin_half_unaligned_release:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_half_unaligned_release:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fmin ptr %ptr, half %value release, align 1
ret half %r
}
@@ -1277,6 +1857,9 @@ define dso_local half @atomicrmw_fmin_half_unaligned_release(ptr %ptr, half %val
define dso_local half @atomicrmw_fmin_half_unaligned_acq_rel(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fmin_half_unaligned_acq_rel:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_half_unaligned_acq_rel:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fmin ptr %ptr, half %value acq_rel, align 1
ret half %r
}
@@ -1284,45 +1867,13 @@ define dso_local half @atomicrmw_fmin_half_unaligned_acq_rel(ptr %ptr, half %val
define dso_local half @atomicrmw_fmin_half_unaligned_seq_cst(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fmin_half_unaligned_seq_cst:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_half_unaligned_seq_cst:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fmin ptr %ptr, half %value seq_cst, align 1
ret half %r
}
-define dso_local float @atomicrmw_fmin_float_unaligned_monotonic(ptr %ptr, float %value) {
-; CHECK-LABEL: atomicrmw_fmin_float_unaligned_monotonic:
-; CHECK: bl __atomic_compare_exchange
- %r = atomicrmw fmin ptr %ptr, float %value monotonic, align 1
- ret float %r
-}
-
-define dso_local float @atomicrmw_fmin_float_unaligned_acquire(ptr %ptr, float %value) {
-; CHECK-LABEL: atomicrmw_fmin_float_unaligned_acquire:
-; CHECK: bl __atomic_compare_exchange
- %r = atomicrmw fmin ptr %ptr, float %value acquire, align 1
- ret float %r
-}
-
-define dso_local float @atomicrmw_fmin_float_unaligned_release(ptr %ptr, float %value) {
-; CHECK-LABEL: atomicrmw_fmin_float_unaligned_release:
-; CHECK: bl __atomic_compare_exchange
- %r = atomicrmw fmin ptr %ptr, float %value release, align 1
- ret float %r
-}
-
-define dso_local float @atomicrmw_fmin_float_unaligned_acq_rel(ptr %ptr, float %value) {
-; CHECK-LABEL: atomicrmw_fmin_float_unaligned_acq_rel:
-; CHECK: bl __atomic_compare_exchange
- %r = atomicrmw fmin ptr %ptr, float %value acq_rel, align 1
- ret float %r
-}
-
-define dso_local float @atomicrmw_fmin_float_unaligned_seq_cst(ptr %ptr, float %value) {
-; CHECK-LABEL: atomicrmw_fmin_float_unaligned_seq_cst:
-; CHECK: bl __atomic_compare_exchange
- %r = atomicrmw fmin ptr %ptr, float %value seq_cst, align 1
- ret float %r
-}
-
define dso_local bfloat @atomicrmw_fmin_bfloat_unaligned_monotonic(ptr %ptr, bfloat %value) {
; -O0-LABEL: atomicrmw_fmin_bfloat_unaligned_monotonic:
; -O0: add w8, w8, w9
@@ -1333,6 +1884,11 @@ define dso_local bfloat @atomicrmw_fmin_bfloat_unaligned_monotonic(ptr %ptr, bfl
; -O1: add w8, w8, w20
; -O1: add w8, w9, w8
; -O1: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_bfloat_unaligned_monotonic:
+; CHECK-no-lsfe: add w8, w8, w20
+; CHECK-no-lsfe: add w8, w9, w8
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fmin ptr %ptr, bfloat %value monotonic, align 1
ret bfloat %r
}
@@ -1347,6 +1903,11 @@ define dso_local bfloat @atomicrmw_fmin_bfloat_unaligned_acquire(ptr %ptr, bfloa
; -O1: add w8, w8, w20
; -O1: add w8, w9, w8
; -O1: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_bfloat_unaligned_acquire:
+; CHECK-no-lsfe: add w8, w8, w20
+; CHECK-no-lsfe: add w8, w9, w8
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fmin ptr %ptr, bfloat %value acquire, align 1
ret bfloat %r
}
@@ -1361,6 +1922,11 @@ define dso_local bfloat @atomicrmw_fmin_bfloat_unaligned_release(ptr %ptr, bfloa
; -O1: add w8, w8, w20
; -O1: add w8, w9, w8
; -O1: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_bfloat_unaligned_release:
+; CHECK-no-lsfe: add w8, w8, w20
+; CHECK-no-lsfe: add w8, w9, w8
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fmin ptr %ptr, bfloat %value release, align 1
ret bfloat %r
}
@@ -1375,6 +1941,11 @@ define dso_local bfloat @atomicrmw_fmin_bfloat_unaligned_acq_rel(ptr %ptr, bfloa
; -O1: add w8, w8, w20
; -O1: add w8, w9, w8
; -O1: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_bfloat_unaligned_acq_rel:
+; CHECK-no-lsfe: add w8, w8, w20
+; CHECK-no-lsfe: add w8, w9, w8
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fmin ptr %ptr, bfloat %value acq_rel, align 1
ret bfloat %r
}
@@ -1389,13 +1960,71 @@ define dso_local bfloat @atomicrmw_fmin_bfloat_unaligned_seq_cst(ptr %ptr, bfloa
; -O1: add w8, w8, w20
; -O1: add w8, w9, w8
; -O1: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_bfloat_unaligned_seq_cst:
+; CHECK-no-lsfe: add w8, w8, w20
+; CHECK-no-lsfe: add w8, w9, w8
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fmin ptr %ptr, bfloat %value seq_cst, align 1
ret bfloat %r
}
+define dso_local float @atomicrmw_fmin_float_unaligned_monotonic(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fmin_float_unaligned_monotonic:
+; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_float_unaligned_monotonic:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
+ %r = atomicrmw fmin ptr %ptr, float %value monotonic, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fmin_float_unaligned_acquire(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fmin_float_unaligned_acquire:
+; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_float_unaligned_acquire:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
+ %r = atomicrmw fmin ptr %ptr, float %value acquire, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fmin_float_unaligned_release(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fmin_float_unaligned_release:
+; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_float_unaligned_release:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
+ %r = atomicrmw fmin ptr %ptr, float %value release, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fmin_float_unaligned_acq_rel(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fmin_float_unaligned_acq_rel:
+; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_float_unaligned_acq_rel:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
+ %r = atomicrmw fmin ptr %ptr, float %value acq_rel, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fmin_float_unaligned_seq_cst(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fmin_float_unaligned_seq_cst:
+; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_float_unaligned_seq_cst:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
+ %r = atomicrmw fmin ptr %ptr, float %value seq_cst, align 1
+ ret float %r
+}
+
define dso_local double @atomicrmw_fmin_double_unaligned_monotonic(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmin_double_unaligned_monotonic:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_double_unaligned_monotonic:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fmin ptr %ptr, double %value monotonic, align 1
ret double %r
}
@@ -1403,6 +2032,9 @@ define dso_local double @atomicrmw_fmin_double_unaligned_monotonic(ptr %ptr, dou
define dso_local double @atomicrmw_fmin_double_unaligned_acquire(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmin_double_unaligned_acquire:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_double_unaligned_acquire:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fmin ptr %ptr, double %value acquire, align 1
ret double %r
}
@@ -1410,6 +2042,9 @@ define dso_local double @atomicrmw_fmin_double_unaligned_acquire(ptr %ptr, doubl
define dso_local double @atomicrmw_fmin_double_unaligned_release(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmin_double_unaligned_release:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_double_unaligned_release:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fmin ptr %ptr, double %value release, align 1
ret double %r
}
@@ -1417,6 +2052,9 @@ define dso_local double @atomicrmw_fmin_double_unaligned_release(ptr %ptr, doubl
define dso_local double @atomicrmw_fmin_double_unaligned_acq_rel(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmin_double_unaligned_acq_rel:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_double_unaligned_acq_rel:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fmin ptr %ptr, double %value acq_rel, align 1
ret double %r
}
@@ -1424,6 +2062,9 @@ define dso_local double @atomicrmw_fmin_double_unaligned_acq_rel(ptr %ptr, doubl
define dso_local double @atomicrmw_fmin_double_unaligned_seq_cst(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmin_double_unaligned_seq_cst:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_double_unaligned_seq_cst:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fmin ptr %ptr, double %value seq_cst, align 1
ret double %r
}
diff --git a/llvm/test/CodeGen/AArch64/Atomics/aarch64_be-atomicrmw-lsfe.ll b/llvm/test/CodeGen/AArch64/Atomics/aarch64_be-atomicrmw-lsfe.ll
index 8a0a92dee0b2ef0..d4bacc257625693 100644
--- a/llvm/test/CodeGen/AArch64/Atomics/aarch64_be-atomicrmw-lsfe.ll
+++ b/llvm/test/CodeGen/AArch64/Atomics/aarch64_be-atomicrmw-lsfe.ll
@@ -2,10 +2,15 @@
; The base test file was generated by ./llvm/test/CodeGen/AArch64/Atomics/generate-tests.py
; RUN: llc %s -o - -verify-machineinstrs -mtriple=aarch64_be -mattr=+lsfe -O0 | FileCheck %s --check-prefixes=CHECK,-O0
; RUN: llc %s -o - -verify-machineinstrs -mtriple=aarch64_be -mattr=+lsfe -O1 | FileCheck %s --check-prefixes=CHECK,-O1
+; RUN: llc %s -o - -verify-machineinstrs -mtriple=aarch64_be | FileCheck %s --check-prefixes=CHECK-no-lsfe
define dso_local half @atomicrmw_fadd_half_aligned_monotonic(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fadd_half_aligned_monotonic:
; CHECK: ldfadd h0, h0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_half_aligned_monotonic:
+; CHECK-no-lsfe: ldxrh w8, [x0]
+; CHECK-no-lsfe: stxrh w9, w8, [x0]
%r = atomicrmw fadd ptr %ptr, half %value monotonic, align 2
ret half %r
}
@@ -13,6 +18,10 @@ define dso_local half @atomicrmw_fadd_half_aligned_monotonic(ptr %ptr, half %val
define dso_local half @atomicrmw_fadd_half_aligned_acquire(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fadd_half_aligned_acquire:
; CHECK: ldfadda h0, h0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_half_aligned_acquire:
+; CHECK-no-lsfe: ldaxrh w8, [x0]
+; CHECK-no-lsfe: stxrh w9, w8, [x0]
%r = atomicrmw fadd ptr %ptr, half %value acquire, align 2
ret half %r
}
@@ -20,6 +29,10 @@ define dso_local half @atomicrmw_fadd_half_aligned_acquire(ptr %ptr, half %value
define dso_local half @atomicrmw_fadd_half_aligned_release(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fadd_half_aligned_release:
; CHECK: ldfaddl h0, h0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_half_aligned_release:
+; CHECK-no-lsfe: ldxrh w8, [x0]
+; CHECK-no-lsfe: stlxrh w9, w8, [x0]
%r = atomicrmw fadd ptr %ptr, half %value release, align 2
ret half %r
}
@@ -27,6 +40,10 @@ define dso_local half @atomicrmw_fadd_half_aligned_release(ptr %ptr, half %value
define dso_local half @atomicrmw_fadd_half_aligned_acq_rel(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fadd_half_aligned_acq_rel:
; CHECK: ldfaddal h0, h0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_half_aligned_acq_rel:
+; CHECK-no-lsfe: ldaxrh w8, [x0]
+; CHECK-no-lsfe: stlxrh w9, w8, [x0]
%r = atomicrmw fadd ptr %ptr, half %value acq_rel, align 2
ret half %r
}
@@ -34,13 +51,86 @@ define dso_local half @atomicrmw_fadd_half_aligned_acq_rel(ptr %ptr, half %value
define dso_local half @atomicrmw_fadd_half_aligned_seq_cst(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fadd_half_aligned_seq_cst:
; CHECK: ldfaddal h0, h0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_half_aligned_seq_cst:
+; CHECK-no-lsfe: ldaxrh w8, [x0]
+; CHECK-no-lsfe: stlxrh w9, w8, [x0]
%r = atomicrmw fadd ptr %ptr, half %value seq_cst, align 2
ret half %r
}
+define dso_local bfloat @atomicrmw_fadd_bfloat_aligned_monotonic(ptr %ptr, bfloat %value) {
+; CHECK-LABEL: atomicrmw_fadd_bfloat_aligned_monotonic:
+; CHECK: ldbfadd h0, h0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_bfloat_aligned_monotonic:
+; CHECK-no-lsfe: ldxrh w9, [x0]
+; CHECK-no-lsfe: add w9, w9, w8
+; CHECK-no-lsfe: add w9, w10, w9
+; CHECK-no-lsfe: stxrh w10, w9, [x0]
+ %r = atomicrmw fadd ptr %ptr, bfloat %value monotonic, align 2
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fadd_bfloat_aligned_acquire(ptr %ptr, bfloat %value) {
+; CHECK-LABEL: atomicrmw_fadd_bfloat_aligned_acquire:
+; CHECK: ldbfadda h0, h0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_bfloat_aligned_acquire:
+; CHECK-no-lsfe: ldaxrh w9, [x0]
+; CHECK-no-lsfe: add w9, w9, w8
+; CHECK-no-lsfe: add w9, w10, w9
+; CHECK-no-lsfe: stxrh w10, w9, [x0]
+ %r = atomicrmw fadd ptr %ptr, bfloat %value acquire, align 2
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fadd_bfloat_aligned_release(ptr %ptr, bfloat %value) {
+; CHECK-LABEL: atomicrmw_fadd_bfloat_aligned_release:
+; CHECK: ldbfaddl h0, h0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_bfloat_aligned_release:
+; CHECK-no-lsfe: ldxrh w9, [x0]
+; CHECK-no-lsfe: add w9, w9, w8
+; CHECK-no-lsfe: add w9, w10, w9
+; CHECK-no-lsfe: stlxrh w10, w9, [x0]
+ %r = atomicrmw fadd ptr %ptr, bfloat %value release, align 2
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fadd_bfloat_aligned_acq_rel(ptr %ptr, bfloat %value) {
+; CHECK-LABEL: atomicrmw_fadd_bfloat_aligned_acq_rel:
+; CHECK: ldbfaddal h0, h0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_bfloat_aligned_acq_rel:
+; CHECK-no-lsfe: ldaxrh w9, [x0]
+; CHECK-no-lsfe: add w9, w9, w8
+; CHECK-no-lsfe: add w9, w10, w9
+; CHECK-no-lsfe: stlxrh w10, w9, [x0]
+ %r = atomicrmw fadd ptr %ptr, bfloat %value acq_rel, align 2
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fadd_bfloat_aligned_seq_cst(ptr %ptr, bfloat %value) {
+; CHECK-LABEL: atomicrmw_fadd_bfloat_aligned_seq_cst:
+; CHECK: ldbfaddal h0, h0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_bfloat_aligned_seq_cst:
+; CHECK-no-lsfe: ldaxrh w9, [x0]
+; CHECK-no-lsfe: add w9, w9, w8
+; CHECK-no-lsfe: add w9, w10, w9
+; CHECK-no-lsfe: stlxrh w10, w9, [x0]
+ %r = atomicrmw fadd ptr %ptr, bfloat %value seq_cst, align 2
+ ret bfloat %r
+}
+
define dso_local float @atomicrmw_fadd_float_aligned_monotonic(ptr %ptr, float %value) {
; CHECK-LABEL: atomicrmw_fadd_float_aligned_monotonic:
; CHECK: ldfadd s0, s0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_float_aligned_monotonic:
+; CHECK-no-lsfe: ldxr w8, [x0]
+; CHECK-no-lsfe: stxr w9, w8, [x0]
%r = atomicrmw fadd ptr %ptr, float %value monotonic, align 4
ret float %r
}
@@ -48,6 +138,10 @@ define dso_local float @atomicrmw_fadd_float_aligned_monotonic(ptr %ptr, float %
define dso_local float @atomicrmw_fadd_float_aligned_acquire(ptr %ptr, float %value) {
; CHECK-LABEL: atomicrmw_fadd_float_aligned_acquire:
; CHECK: ldfadda s0, s0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_float_aligned_acquire:
+; CHECK-no-lsfe: ldaxr w8, [x0]
+; CHECK-no-lsfe: stxr w9, w8, [x0]
%r = atomicrmw fadd ptr %ptr, float %value acquire, align 4
ret float %r
}
@@ -55,6 +149,10 @@ define dso_local float @atomicrmw_fadd_float_aligned_acquire(ptr %ptr, float %va
define dso_local float @atomicrmw_fadd_float_aligned_release(ptr %ptr, float %value) {
; CHECK-LABEL: atomicrmw_fadd_float_aligned_release:
; CHECK: ldfaddl s0, s0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_float_aligned_release:
+; CHECK-no-lsfe: ldxr w8, [x0]
+; CHECK-no-lsfe: stlxr w9, w8, [x0]
%r = atomicrmw fadd ptr %ptr, float %value release, align 4
ret float %r
}
@@ -62,6 +160,10 @@ define dso_local float @atomicrmw_fadd_float_aligned_release(ptr %ptr, float %va
define dso_local float @atomicrmw_fadd_float_aligned_acq_rel(ptr %ptr, float %value) {
; CHECK-LABEL: atomicrmw_fadd_float_aligned_acq_rel:
; CHECK: ldfaddal s0, s0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_float_aligned_acq_rel:
+; CHECK-no-lsfe: ldaxr w8, [x0]
+; CHECK-no-lsfe: stlxr w9, w8, [x0]
%r = atomicrmw fadd ptr %ptr, float %value acq_rel, align 4
ret float %r
}
@@ -69,48 +171,21 @@ define dso_local float @atomicrmw_fadd_float_aligned_acq_rel(ptr %ptr, float %va
define dso_local float @atomicrmw_fadd_float_aligned_seq_cst(ptr %ptr, float %value) {
; CHECK-LABEL: atomicrmw_fadd_float_aligned_seq_cst:
; CHECK: ldfaddal s0, s0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_float_aligned_seq_cst:
+; CHECK-no-lsfe: ldaxr w8, [x0]
+; CHECK-no-lsfe: stlxr w9, w8, [x0]
%r = atomicrmw fadd ptr %ptr, float %value seq_cst, align 4
ret float %r
}
-define dso_local bfloat @atomicrmw_fadd_bfloat_aligned_monotonic(ptr %ptr, bfloat %value) {
-; CHECK-LABEL: atomicrmw_fadd_bfloat_aligned_monotonic:
-; CHECK: ldbfadd h0, h0, [x0]
- %r = atomicrmw fadd ptr %ptr, bfloat %value monotonic, align 4
- ret bfloat %r
-}
-
-define dso_local bfloat @atomicrmw_fadd_bfloat_aligned_acquire(ptr %ptr, bfloat %value) {
-; CHECK-LABEL: atomicrmw_fadd_bfloat_aligned_acquire:
-; CHECK: ldbfadda h0, h0, [x0]
- %r = atomicrmw fadd ptr %ptr, bfloat %value acquire, align 4
- ret bfloat %r
-}
-
-define dso_local bfloat @atomicrmw_fadd_bfloat_aligned_release(ptr %ptr, bfloat %value) {
-; CHECK-LABEL: atomicrmw_fadd_bfloat_aligned_release:
-; CHECK: ldbfaddl h0, h0, [x0]
- %r = atomicrmw fadd ptr %ptr, bfloat %value release, align 4
- ret bfloat %r
-}
-
-define dso_local bfloat @atomicrmw_fadd_bfloat_aligned_acq_rel(ptr %ptr, bfloat %value) {
-; CHECK-LABEL: atomicrmw_fadd_bfloat_aligned_acq_rel:
-; CHECK: ldbfaddal h0, h0, [x0]
- %r = atomicrmw fadd ptr %ptr, bfloat %value acq_rel, align 4
- ret bfloat %r
-}
-
-define dso_local bfloat @atomicrmw_fadd_bfloat_aligned_seq_cst(ptr %ptr, bfloat %value) {
-; CHECK-LABEL: atomicrmw_fadd_bfloat_aligned_seq_cst:
-; CHECK: ldbfaddal h0, h0, [x0]
- %r = atomicrmw fadd ptr %ptr, bfloat %value seq_cst, align 4
- ret bfloat %r
-}
-
define dso_local double @atomicrmw_fadd_double_aligned_monotonic(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fadd_double_aligned_monotonic:
; CHECK: ldfadd d0, d0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_double_aligned_monotonic:
+; CHECK-no-lsfe: ldxr x8, [x0]
+; CHECK-no-lsfe: stxr w9, x8, [x0]
%r = atomicrmw fadd ptr %ptr, double %value monotonic, align 8
ret double %r
}
@@ -118,6 +193,10 @@ define dso_local double @atomicrmw_fadd_double_aligned_monotonic(ptr %ptr, doubl
define dso_local double @atomicrmw_fadd_double_aligned_acquire(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fadd_double_aligned_acquire:
; CHECK: ldfadda d0, d0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_double_aligned_acquire:
+; CHECK-no-lsfe: ldaxr x8, [x0]
+; CHECK-no-lsfe: stxr w9, x8, [x0]
%r = atomicrmw fadd ptr %ptr, double %value acquire, align 8
ret double %r
}
@@ -125,6 +204,10 @@ define dso_local double @atomicrmw_fadd_double_aligned_acquire(ptr %ptr, double
define dso_local double @atomicrmw_fadd_double_aligned_release(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fadd_double_aligned_release:
; CHECK: ldfaddl d0, d0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_double_aligned_release:
+; CHECK-no-lsfe: ldxr x8, [x0]
+; CHECK-no-lsfe: stlxr w9, x8, [x0]
%r = atomicrmw fadd ptr %ptr, double %value release, align 8
ret double %r
}
@@ -132,6 +215,10 @@ define dso_local double @atomicrmw_fadd_double_aligned_release(ptr %ptr, double
define dso_local double @atomicrmw_fadd_double_aligned_acq_rel(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fadd_double_aligned_acq_rel:
; CHECK: ldfaddal d0, d0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_double_aligned_acq_rel:
+; CHECK-no-lsfe: ldaxr x8, [x0]
+; CHECK-no-lsfe: stlxr w9, x8, [x0]
%r = atomicrmw fadd ptr %ptr, double %value acq_rel, align 8
ret double %r
}
@@ -139,6 +226,10 @@ define dso_local double @atomicrmw_fadd_double_aligned_acq_rel(ptr %ptr, double
define dso_local double @atomicrmw_fadd_double_aligned_seq_cst(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fadd_double_aligned_seq_cst:
; CHECK: ldfaddal d0, d0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_double_aligned_seq_cst:
+; CHECK-no-lsfe: ldaxr x8, [x0]
+; CHECK-no-lsfe: stlxr w9, x8, [x0]
%r = atomicrmw fadd ptr %ptr, double %value seq_cst, align 8
ret double %r
}
@@ -146,6 +237,9 @@ define dso_local double @atomicrmw_fadd_double_aligned_seq_cst(ptr %ptr, double
define dso_local half @atomicrmw_fadd_half_unaligned_monotonic(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fadd_half_unaligned_monotonic:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_half_unaligned_monotonic:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fadd ptr %ptr, half %value monotonic, align 1
ret half %r
}
@@ -153,6 +247,9 @@ define dso_local half @atomicrmw_fadd_half_unaligned_monotonic(ptr %ptr, half %v
define dso_local half @atomicrmw_fadd_half_unaligned_acquire(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fadd_half_unaligned_acquire:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_half_unaligned_acquire:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fadd ptr %ptr, half %value acquire, align 1
ret half %r
}
@@ -160,6 +257,9 @@ define dso_local half @atomicrmw_fadd_half_unaligned_acquire(ptr %ptr, half %val
define dso_local half @atomicrmw_fadd_half_unaligned_release(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fadd_half_unaligned_release:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_half_unaligned_release:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fadd ptr %ptr, half %value release, align 1
ret half %r
}
@@ -167,6 +267,9 @@ define dso_local half @atomicrmw_fadd_half_unaligned_release(ptr %ptr, half %val
define dso_local half @atomicrmw_fadd_half_unaligned_acq_rel(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fadd_half_unaligned_acq_rel:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_half_unaligned_acq_rel:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fadd ptr %ptr, half %value acq_rel, align 1
ret half %r
}
@@ -174,45 +277,13 @@ define dso_local half @atomicrmw_fadd_half_unaligned_acq_rel(ptr %ptr, half %val
define dso_local half @atomicrmw_fadd_half_unaligned_seq_cst(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fadd_half_unaligned_seq_cst:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_half_unaligned_seq_cst:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fadd ptr %ptr, half %value seq_cst, align 1
ret half %r
}
-define dso_local float @atomicrmw_fadd_float_unaligned_monotonic(ptr %ptr, float %value) {
-; CHECK-LABEL: atomicrmw_fadd_float_unaligned_monotonic:
-; CHECK: bl __atomic_compare_exchange
- %r = atomicrmw fadd ptr %ptr, float %value monotonic, align 1
- ret float %r
-}
-
-define dso_local float @atomicrmw_fadd_float_unaligned_acquire(ptr %ptr, float %value) {
-; CHECK-LABEL: atomicrmw_fadd_float_unaligned_acquire:
-; CHECK: bl __atomic_compare_exchange
- %r = atomicrmw fadd ptr %ptr, float %value acquire, align 1
- ret float %r
-}
-
-define dso_local float @atomicrmw_fadd_float_unaligned_release(ptr %ptr, float %value) {
-; CHECK-LABEL: atomicrmw_fadd_float_unaligned_release:
-; CHECK: bl __atomic_compare_exchange
- %r = atomicrmw fadd ptr %ptr, float %value release, align 1
- ret float %r
-}
-
-define dso_local float @atomicrmw_fadd_float_unaligned_acq_rel(ptr %ptr, float %value) {
-; CHECK-LABEL: atomicrmw_fadd_float_unaligned_acq_rel:
-; CHECK: bl __atomic_compare_exchange
- %r = atomicrmw fadd ptr %ptr, float %value acq_rel, align 1
- ret float %r
-}
-
-define dso_local float @atomicrmw_fadd_float_unaligned_seq_cst(ptr %ptr, float %value) {
-; CHECK-LABEL: atomicrmw_fadd_float_unaligned_seq_cst:
-; CHECK: bl __atomic_compare_exchange
- %r = atomicrmw fadd ptr %ptr, float %value seq_cst, align 1
- ret float %r
-}
-
define dso_local bfloat @atomicrmw_fadd_bfloat_unaligned_monotonic(ptr %ptr, bfloat %value) {
; -O0-LABEL: atomicrmw_fadd_bfloat_unaligned_monotonic:
; -O0: add w8, w8, w9
@@ -223,6 +294,11 @@ define dso_local bfloat @atomicrmw_fadd_bfloat_unaligned_monotonic(ptr %ptr, bfl
; -O1: add w8, w8, w20
; -O1: add w8, w9, w8
; -O1: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_bfloat_unaligned_monotonic:
+; CHECK-no-lsfe: add w8, w8, w20
+; CHECK-no-lsfe: add w8, w9, w8
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fadd ptr %ptr, bfloat %value monotonic, align 1
ret bfloat %r
}
@@ -237,6 +313,11 @@ define dso_local bfloat @atomicrmw_fadd_bfloat_unaligned_acquire(ptr %ptr, bfloa
; -O1: add w8, w8, w20
; -O1: add w8, w9, w8
; -O1: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_bfloat_unaligned_acquire:
+; CHECK-no-lsfe: add w8, w8, w20
+; CHECK-no-lsfe: add w8, w9, w8
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fadd ptr %ptr, bfloat %value acquire, align 1
ret bfloat %r
}
@@ -251,6 +332,11 @@ define dso_local bfloat @atomicrmw_fadd_bfloat_unaligned_release(ptr %ptr, bfloa
; -O1: add w8, w8, w20
; -O1: add w8, w9, w8
; -O1: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_bfloat_unaligned_release:
+; CHECK-no-lsfe: add w8, w8, w20
+; CHECK-no-lsfe: add w8, w9, w8
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fadd ptr %ptr, bfloat %value release, align 1
ret bfloat %r
}
@@ -265,6 +351,11 @@ define dso_local bfloat @atomicrmw_fadd_bfloat_unaligned_acq_rel(ptr %ptr, bfloa
; -O1: add w8, w8, w20
; -O1: add w8, w9, w8
; -O1: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_bfloat_unaligned_acq_rel:
+; CHECK-no-lsfe: add w8, w8, w20
+; CHECK-no-lsfe: add w8, w9, w8
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fadd ptr %ptr, bfloat %value acq_rel, align 1
ret bfloat %r
}
@@ -279,13 +370,71 @@ define dso_local bfloat @atomicrmw_fadd_bfloat_unaligned_seq_cst(ptr %ptr, bfloa
; -O1: add w8, w8, w20
; -O1: add w8, w9, w8
; -O1: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_bfloat_unaligned_seq_cst:
+; CHECK-no-lsfe: add w8, w8, w20
+; CHECK-no-lsfe: add w8, w9, w8
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fadd ptr %ptr, bfloat %value seq_cst, align 1
ret bfloat %r
}
+define dso_local float @atomicrmw_fadd_float_unaligned_monotonic(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fadd_float_unaligned_monotonic:
+; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_float_unaligned_monotonic:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
+ %r = atomicrmw fadd ptr %ptr, float %value monotonic, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fadd_float_unaligned_acquire(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fadd_float_unaligned_acquire:
+; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_float_unaligned_acquire:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
+ %r = atomicrmw fadd ptr %ptr, float %value acquire, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fadd_float_unaligned_release(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fadd_float_unaligned_release:
+; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_float_unaligned_release:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
+ %r = atomicrmw fadd ptr %ptr, float %value release, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fadd_float_unaligned_acq_rel(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fadd_float_unaligned_acq_rel:
+; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_float_unaligned_acq_rel:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
+ %r = atomicrmw fadd ptr %ptr, float %value acq_rel, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fadd_float_unaligned_seq_cst(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fadd_float_unaligned_seq_cst:
+; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_float_unaligned_seq_cst:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
+ %r = atomicrmw fadd ptr %ptr, float %value seq_cst, align 1
+ ret float %r
+}
+
define dso_local double @atomicrmw_fadd_double_unaligned_monotonic(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fadd_double_unaligned_monotonic:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_double_unaligned_monotonic:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fadd ptr %ptr, double %value monotonic, align 1
ret double %r
}
@@ -293,6 +442,9 @@ define dso_local double @atomicrmw_fadd_double_unaligned_monotonic(ptr %ptr, dou
define dso_local double @atomicrmw_fadd_double_unaligned_acquire(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fadd_double_unaligned_acquire:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_double_unaligned_acquire:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fadd ptr %ptr, double %value acquire, align 1
ret double %r
}
@@ -300,6 +452,9 @@ define dso_local double @atomicrmw_fadd_double_unaligned_acquire(ptr %ptr, doubl
define dso_local double @atomicrmw_fadd_double_unaligned_release(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fadd_double_unaligned_release:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_double_unaligned_release:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fadd ptr %ptr, double %value release, align 1
ret double %r
}
@@ -307,6 +462,9 @@ define dso_local double @atomicrmw_fadd_double_unaligned_release(ptr %ptr, doubl
define dso_local double @atomicrmw_fadd_double_unaligned_acq_rel(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fadd_double_unaligned_acq_rel:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_double_unaligned_acq_rel:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fadd ptr %ptr, double %value acq_rel, align 1
ret double %r
}
@@ -314,6 +472,9 @@ define dso_local double @atomicrmw_fadd_double_unaligned_acq_rel(ptr %ptr, doubl
define dso_local double @atomicrmw_fadd_double_unaligned_seq_cst(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fadd_double_unaligned_seq_cst:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fadd_double_unaligned_seq_cst:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fadd ptr %ptr, double %value seq_cst, align 1
ret double %r
}
@@ -329,6 +490,10 @@ define dso_local half @atomicrmw_fsub_half_aligned_monotonic(ptr %ptr, half %val
; -O1-LABEL: atomicrmw_fsub_half_aligned_monotonic:
; -O1: ldxrh w8, [x0]
; -O1: stxrh w9, w8, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_half_aligned_monotonic:
+; CHECK-no-lsfe: ldxrh w8, [x0]
+; CHECK-no-lsfe: stxrh w9, w8, [x0]
%r = atomicrmw fsub ptr %ptr, half %value monotonic, align 2
ret half %r
}
@@ -344,6 +509,10 @@ define dso_local half @atomicrmw_fsub_half_aligned_acquire(ptr %ptr, half %value
; -O1-LABEL: atomicrmw_fsub_half_aligned_acquire:
; -O1: ldaxrh w8, [x0]
; -O1: stxrh w9, w8, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_half_aligned_acquire:
+; CHECK-no-lsfe: ldaxrh w8, [x0]
+; CHECK-no-lsfe: stxrh w9, w8, [x0]
%r = atomicrmw fsub ptr %ptr, half %value acquire, align 2
ret half %r
}
@@ -359,6 +528,10 @@ define dso_local half @atomicrmw_fsub_half_aligned_release(ptr %ptr, half %value
; -O1-LABEL: atomicrmw_fsub_half_aligned_release:
; -O1: ldxrh w8, [x0]
; -O1: stlxrh w9, w8, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_half_aligned_release:
+; CHECK-no-lsfe: ldxrh w8, [x0]
+; CHECK-no-lsfe: stlxrh w9, w8, [x0]
%r = atomicrmw fsub ptr %ptr, half %value release, align 2
ret half %r
}
@@ -374,6 +547,10 @@ define dso_local half @atomicrmw_fsub_half_aligned_acq_rel(ptr %ptr, half %value
; -O1-LABEL: atomicrmw_fsub_half_aligned_acq_rel:
; -O1: ldaxrh w8, [x0]
; -O1: stlxrh w9, w8, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_half_aligned_acq_rel:
+; CHECK-no-lsfe: ldaxrh w8, [x0]
+; CHECK-no-lsfe: stlxrh w9, w8, [x0]
%r = atomicrmw fsub ptr %ptr, half %value acq_rel, align 2
ret half %r
}
@@ -389,85 +566,14 @@ define dso_local half @atomicrmw_fsub_half_aligned_seq_cst(ptr %ptr, half %value
; -O1-LABEL: atomicrmw_fsub_half_aligned_seq_cst:
; -O1: ldaxrh w8, [x0]
; -O1: stlxrh w9, w8, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_half_aligned_seq_cst:
+; CHECK-no-lsfe: ldaxrh w8, [x0]
+; CHECK-no-lsfe: stlxrh w9, w8, [x0]
%r = atomicrmw fsub ptr %ptr, half %value seq_cst, align 2
ret half %r
}
-define dso_local float @atomicrmw_fsub_float_aligned_monotonic(ptr %ptr, float %value) {
-; -O0-LABEL: atomicrmw_fsub_float_aligned_monotonic:
-; -O0: ldaxr w9, [x11]
-; -O0: cmp w9, w8
-; -O0: stlxr w10, w12, [x11]
-; -O0: subs w8, w9, w8
-; -O0: subs w8, w8, #1
-;
-; -O1-LABEL: atomicrmw_fsub_float_aligned_monotonic:
-; -O1: ldxr w8, [x0]
-; -O1: stxr w9, w8, [x0]
- %r = atomicrmw fsub ptr %ptr, float %value monotonic, align 4
- ret float %r
-}
-
-define dso_local float @atomicrmw_fsub_float_aligned_acquire(ptr %ptr, float %value) {
-; -O0-LABEL: atomicrmw_fsub_float_aligned_acquire:
-; -O0: ldaxr w9, [x11]
-; -O0: cmp w9, w8
-; -O0: stlxr w10, w12, [x11]
-; -O0: subs w8, w9, w8
-; -O0: subs w8, w8, #1
-;
-; -O1-LABEL: atomicrmw_fsub_float_aligned_acquire:
-; -O1: ldaxr w8, [x0]
-; -O1: stxr w9, w8, [x0]
- %r = atomicrmw fsub ptr %ptr, float %value acquire, align 4
- ret float %r
-}
-
-define dso_local float @atomicrmw_fsub_float_aligned_release(ptr %ptr, float %value) {
-; -O0-LABEL: atomicrmw_fsub_float_aligned_release:
-; -O0: ldaxr w9, [x11]
-; -O0: cmp w9, w8
-; -O0: stlxr w10, w12, [x11]
-; -O0: subs w8, w9, w8
-; -O0: subs w8, w8, #1
-;
-; -O1-LABEL: atomicrmw_fsub_float_aligned_release:
-; -O1: ldxr w8, [x0]
-; -O1: stlxr w9, w8, [x0]
- %r = atomicrmw fsub ptr %ptr, float %value release, align 4
- ret float %r
-}
-
-define dso_local float @atomicrmw_fsub_float_aligned_acq_rel(ptr %ptr, float %value) {
-; -O0-LABEL: atomicrmw_fsub_float_aligned_acq_rel:
-; -O0: ldaxr w9, [x11]
-; -O0: cmp w9, w8
-; -O0: stlxr w10, w12, [x11]
-; -O0: subs w8, w9, w8
-; -O0: subs w8, w8, #1
-;
-; -O1-LABEL: atomicrmw_fsub_float_aligned_acq_rel:
-; -O1: ldaxr w8, [x0]
-; -O1: stlxr w9, w8, [x0]
- %r = atomicrmw fsub ptr %ptr, float %value acq_rel, align 4
- ret float %r
-}
-
-define dso_local float @atomicrmw_fsub_float_aligned_seq_cst(ptr %ptr, float %value) {
-; -O0-LABEL: atomicrmw_fsub_float_aligned_seq_cst:
-; -O0: ldaxr w9, [x11]
-; -O0: cmp w9, w8
-; -O0: stlxr w10, w12, [x11]
-; -O0: subs w8, w9, w8
-; -O0: subs w8, w8, #1
-;
-; -O1-LABEL: atomicrmw_fsub_float_aligned_seq_cst:
-; -O1: ldaxr w8, [x0]
-; -O1: stlxr w9, w8, [x0]
- %r = atomicrmw fsub ptr %ptr, float %value seq_cst, align 4
- ret float %r
-}
-
define dso_local bfloat @atomicrmw_fsub_bfloat_aligned_monotonic(ptr %ptr, bfloat %value) {
; -O0-LABEL: atomicrmw_fsub_bfloat_aligned_monotonic:
; -O0: add w8, w8, w9
@@ -483,7 +589,13 @@ define dso_local bfloat @atomicrmw_fsub_bfloat_aligned_monotonic(ptr %ptr, bfloa
; -O1: add w9, w9, w8
; -O1: add w9, w10, w9
; -O1: stxrh w10, w9, [x0]
- %r = atomicrmw fsub ptr %ptr, bfloat %value monotonic, align 4
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_bfloat_aligned_monotonic:
+; CHECK-no-lsfe: ldxrh w9, [x0]
+; CHECK-no-lsfe: add w9, w9, w8
+; CHECK-no-lsfe: add w9, w10, w9
+; CHECK-no-lsfe: stxrh w10, w9, [x0]
+ %r = atomicrmw fsub ptr %ptr, bfloat %value monotonic, align 2
ret bfloat %r
}
@@ -502,7 +614,13 @@ define dso_local bfloat @atomicrmw_fsub_bfloat_aligned_acquire(ptr %ptr, bfloat
; -O1: add w9, w9, w8
; -O1: add w9, w10, w9
; -O1: stxrh w10, w9, [x0]
- %r = atomicrmw fsub ptr %ptr, bfloat %value acquire, align 4
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_bfloat_aligned_acquire:
+; CHECK-no-lsfe: ldaxrh w9, [x0]
+; CHECK-no-lsfe: add w9, w9, w8
+; CHECK-no-lsfe: add w9, w10, w9
+; CHECK-no-lsfe: stxrh w10, w9, [x0]
+ %r = atomicrmw fsub ptr %ptr, bfloat %value acquire, align 2
ret bfloat %r
}
@@ -521,7 +639,13 @@ define dso_local bfloat @atomicrmw_fsub_bfloat_aligned_release(ptr %ptr, bfloat
; -O1: add w9, w9, w8
; -O1: add w9, w10, w9
; -O1: stlxrh w10, w9, [x0]
- %r = atomicrmw fsub ptr %ptr, bfloat %value release, align 4
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_bfloat_aligned_release:
+; CHECK-no-lsfe: ldxrh w9, [x0]
+; CHECK-no-lsfe: add w9, w9, w8
+; CHECK-no-lsfe: add w9, w10, w9
+; CHECK-no-lsfe: stlxrh w10, w9, [x0]
+ %r = atomicrmw fsub ptr %ptr, bfloat %value release, align 2
ret bfloat %r
}
@@ -540,7 +664,13 @@ define dso_local bfloat @atomicrmw_fsub_bfloat_aligned_acq_rel(ptr %ptr, bfloat
; -O1: add w9, w9, w8
; -O1: add w9, w10, w9
; -O1: stlxrh w10, w9, [x0]
- %r = atomicrmw fsub ptr %ptr, bfloat %value acq_rel, align 4
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_bfloat_aligned_acq_rel:
+; CHECK-no-lsfe: ldaxrh w9, [x0]
+; CHECK-no-lsfe: add w9, w9, w8
+; CHECK-no-lsfe: add w9, w10, w9
+; CHECK-no-lsfe: stlxrh w10, w9, [x0]
+ %r = atomicrmw fsub ptr %ptr, bfloat %value acq_rel, align 2
ret bfloat %r
}
@@ -559,11 +689,112 @@ define dso_local bfloat @atomicrmw_fsub_bfloat_aligned_seq_cst(ptr %ptr, bfloat
; -O1: add w9, w9, w8
; -O1: add w9, w10, w9
; -O1: stlxrh w10, w9, [x0]
- %r = atomicrmw fsub ptr %ptr, bfloat %value seq_cst, align 4
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_bfloat_aligned_seq_cst:
+; CHECK-no-lsfe: ldaxrh w9, [x0]
+; CHECK-no-lsfe: add w9, w9, w8
+; CHECK-no-lsfe: add w9, w10, w9
+; CHECK-no-lsfe: stlxrh w10, w9, [x0]
+ %r = atomicrmw fsub ptr %ptr, bfloat %value seq_cst, align 2
ret bfloat %r
}
-define dso_local double @atomicrmw_fsub_double_aligned_monotonic(ptr %ptr, double %value) {
+define dso_local float @atomicrmw_fsub_float_aligned_monotonic(ptr %ptr, float %value) {
+; -O0-LABEL: atomicrmw_fsub_float_aligned_monotonic:
+; -O0: ldaxr w9, [x11]
+; -O0: cmp w9, w8
+; -O0: stlxr w10, w12, [x11]
+; -O0: subs w8, w9, w8
+; -O0: subs w8, w8, #1
+;
+; -O1-LABEL: atomicrmw_fsub_float_aligned_monotonic:
+; -O1: ldxr w8, [x0]
+; -O1: stxr w9, w8, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_float_aligned_monotonic:
+; CHECK-no-lsfe: ldxr w8, [x0]
+; CHECK-no-lsfe: stxr w9, w8, [x0]
+ %r = atomicrmw fsub ptr %ptr, float %value monotonic, align 4
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fsub_float_aligned_acquire(ptr %ptr, float %value) {
+; -O0-LABEL: atomicrmw_fsub_float_aligned_acquire:
+; -O0: ldaxr w9, [x11]
+; -O0: cmp w9, w8
+; -O0: stlxr w10, w12, [x11]
+; -O0: subs w8, w9, w8
+; -O0: subs w8, w8, #1
+;
+; -O1-LABEL: atomicrmw_fsub_float_aligned_acquire:
+; -O1: ldaxr w8, [x0]
+; -O1: stxr w9, w8, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_float_aligned_acquire:
+; CHECK-no-lsfe: ldaxr w8, [x0]
+; CHECK-no-lsfe: stxr w9, w8, [x0]
+ %r = atomicrmw fsub ptr %ptr, float %value acquire, align 4
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fsub_float_aligned_release(ptr %ptr, float %value) {
+; -O0-LABEL: atomicrmw_fsub_float_aligned_release:
+; -O0: ldaxr w9, [x11]
+; -O0: cmp w9, w8
+; -O0: stlxr w10, w12, [x11]
+; -O0: subs w8, w9, w8
+; -O0: subs w8, w8, #1
+;
+; -O1-LABEL: atomicrmw_fsub_float_aligned_release:
+; -O1: ldxr w8, [x0]
+; -O1: stlxr w9, w8, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_float_aligned_release:
+; CHECK-no-lsfe: ldxr w8, [x0]
+; CHECK-no-lsfe: stlxr w9, w8, [x0]
+ %r = atomicrmw fsub ptr %ptr, float %value release, align 4
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fsub_float_aligned_acq_rel(ptr %ptr, float %value) {
+; -O0-LABEL: atomicrmw_fsub_float_aligned_acq_rel:
+; -O0: ldaxr w9, [x11]
+; -O0: cmp w9, w8
+; -O0: stlxr w10, w12, [x11]
+; -O0: subs w8, w9, w8
+; -O0: subs w8, w8, #1
+;
+; -O1-LABEL: atomicrmw_fsub_float_aligned_acq_rel:
+; -O1: ldaxr w8, [x0]
+; -O1: stlxr w9, w8, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_float_aligned_acq_rel:
+; CHECK-no-lsfe: ldaxr w8, [x0]
+; CHECK-no-lsfe: stlxr w9, w8, [x0]
+ %r = atomicrmw fsub ptr %ptr, float %value acq_rel, align 4
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fsub_float_aligned_seq_cst(ptr %ptr, float %value) {
+; -O0-LABEL: atomicrmw_fsub_float_aligned_seq_cst:
+; -O0: ldaxr w9, [x11]
+; -O0: cmp w9, w8
+; -O0: stlxr w10, w12, [x11]
+; -O0: subs w8, w9, w8
+; -O0: subs w8, w8, #1
+;
+; -O1-LABEL: atomicrmw_fsub_float_aligned_seq_cst:
+; -O1: ldaxr w8, [x0]
+; -O1: stlxr w9, w8, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_float_aligned_seq_cst:
+; CHECK-no-lsfe: ldaxr w8, [x0]
+; CHECK-no-lsfe: stlxr w9, w8, [x0]
+ %r = atomicrmw fsub ptr %ptr, float %value seq_cst, align 4
+ ret float %r
+}
+
+define dso_local double @atomicrmw_fsub_double_aligned_monotonic(ptr %ptr, double %value) {
; -O0-LABEL: atomicrmw_fsub_double_aligned_monotonic:
; -O0: ldaxr x9, [x11]
; -O0: cmp x9, x8
@@ -574,6 +805,10 @@ define dso_local double @atomicrmw_fsub_double_aligned_monotonic(ptr %ptr, doubl
; -O1-LABEL: atomicrmw_fsub_double_aligned_monotonic:
; -O1: ldxr x8, [x0]
; -O1: stxr w9, x8, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_double_aligned_monotonic:
+; CHECK-no-lsfe: ldxr x8, [x0]
+; CHECK-no-lsfe: stxr w9, x8, [x0]
%r = atomicrmw fsub ptr %ptr, double %value monotonic, align 8
ret double %r
}
@@ -589,6 +824,10 @@ define dso_local double @atomicrmw_fsub_double_aligned_acquire(ptr %ptr, double
; -O1-LABEL: atomicrmw_fsub_double_aligned_acquire:
; -O1: ldaxr x8, [x0]
; -O1: stxr w9, x8, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_double_aligned_acquire:
+; CHECK-no-lsfe: ldaxr x8, [x0]
+; CHECK-no-lsfe: stxr w9, x8, [x0]
%r = atomicrmw fsub ptr %ptr, double %value acquire, align 8
ret double %r
}
@@ -604,6 +843,10 @@ define dso_local double @atomicrmw_fsub_double_aligned_release(ptr %ptr, double
; -O1-LABEL: atomicrmw_fsub_double_aligned_release:
; -O1: ldxr x8, [x0]
; -O1: stlxr w9, x8, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_double_aligned_release:
+; CHECK-no-lsfe: ldxr x8, [x0]
+; CHECK-no-lsfe: stlxr w9, x8, [x0]
%r = atomicrmw fsub ptr %ptr, double %value release, align 8
ret double %r
}
@@ -619,6 +862,10 @@ define dso_local double @atomicrmw_fsub_double_aligned_acq_rel(ptr %ptr, double
; -O1-LABEL: atomicrmw_fsub_double_aligned_acq_rel:
; -O1: ldaxr x8, [x0]
; -O1: stlxr w9, x8, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_double_aligned_acq_rel:
+; CHECK-no-lsfe: ldaxr x8, [x0]
+; CHECK-no-lsfe: stlxr w9, x8, [x0]
%r = atomicrmw fsub ptr %ptr, double %value acq_rel, align 8
ret double %r
}
@@ -634,6 +881,10 @@ define dso_local double @atomicrmw_fsub_double_aligned_seq_cst(ptr %ptr, double
; -O1-LABEL: atomicrmw_fsub_double_aligned_seq_cst:
; -O1: ldaxr x8, [x0]
; -O1: stlxr w9, x8, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_double_aligned_seq_cst:
+; CHECK-no-lsfe: ldaxr x8, [x0]
+; CHECK-no-lsfe: stlxr w9, x8, [x0]
%r = atomicrmw fsub ptr %ptr, double %value seq_cst, align 8
ret double %r
}
@@ -641,6 +892,9 @@ define dso_local double @atomicrmw_fsub_double_aligned_seq_cst(ptr %ptr, double
define dso_local half @atomicrmw_fsub_half_unaligned_monotonic(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fsub_half_unaligned_monotonic:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_half_unaligned_monotonic:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fsub ptr %ptr, half %value monotonic, align 1
ret half %r
}
@@ -648,6 +902,9 @@ define dso_local half @atomicrmw_fsub_half_unaligned_monotonic(ptr %ptr, half %v
define dso_local half @atomicrmw_fsub_half_unaligned_acquire(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fsub_half_unaligned_acquire:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_half_unaligned_acquire:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fsub ptr %ptr, half %value acquire, align 1
ret half %r
}
@@ -655,6 +912,9 @@ define dso_local half @atomicrmw_fsub_half_unaligned_acquire(ptr %ptr, half %val
define dso_local half @atomicrmw_fsub_half_unaligned_release(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fsub_half_unaligned_release:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_half_unaligned_release:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fsub ptr %ptr, half %value release, align 1
ret half %r
}
@@ -662,6 +922,9 @@ define dso_local half @atomicrmw_fsub_half_unaligned_release(ptr %ptr, half %val
define dso_local half @atomicrmw_fsub_half_unaligned_acq_rel(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fsub_half_unaligned_acq_rel:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_half_unaligned_acq_rel:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fsub ptr %ptr, half %value acq_rel, align 1
ret half %r
}
@@ -669,45 +932,13 @@ define dso_local half @atomicrmw_fsub_half_unaligned_acq_rel(ptr %ptr, half %val
define dso_local half @atomicrmw_fsub_half_unaligned_seq_cst(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fsub_half_unaligned_seq_cst:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_half_unaligned_seq_cst:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fsub ptr %ptr, half %value seq_cst, align 1
ret half %r
}
-define dso_local float @atomicrmw_fsub_float_unaligned_monotonic(ptr %ptr, float %value) {
-; CHECK-LABEL: atomicrmw_fsub_float_unaligned_monotonic:
-; CHECK: bl __atomic_compare_exchange
- %r = atomicrmw fsub ptr %ptr, float %value monotonic, align 1
- ret float %r
-}
-
-define dso_local float @atomicrmw_fsub_float_unaligned_acquire(ptr %ptr, float %value) {
-; CHECK-LABEL: atomicrmw_fsub_float_unaligned_acquire:
-; CHECK: bl __atomic_compare_exchange
- %r = atomicrmw fsub ptr %ptr, float %value acquire, align 1
- ret float %r
-}
-
-define dso_local float @atomicrmw_fsub_float_unaligned_release(ptr %ptr, float %value) {
-; CHECK-LABEL: atomicrmw_fsub_float_unaligned_release:
-; CHECK: bl __atomic_compare_exchange
- %r = atomicrmw fsub ptr %ptr, float %value release, align 1
- ret float %r
-}
-
-define dso_local float @atomicrmw_fsub_float_unaligned_acq_rel(ptr %ptr, float %value) {
-; CHECK-LABEL: atomicrmw_fsub_float_unaligned_acq_rel:
-; CHECK: bl __atomic_compare_exchange
- %r = atomicrmw fsub ptr %ptr, float %value acq_rel, align 1
- ret float %r
-}
-
-define dso_local float @atomicrmw_fsub_float_unaligned_seq_cst(ptr %ptr, float %value) {
-; CHECK-LABEL: atomicrmw_fsub_float_unaligned_seq_cst:
-; CHECK: bl __atomic_compare_exchange
- %r = atomicrmw fsub ptr %ptr, float %value seq_cst, align 1
- ret float %r
-}
-
define dso_local bfloat @atomicrmw_fsub_bfloat_unaligned_monotonic(ptr %ptr, bfloat %value) {
; -O0-LABEL: atomicrmw_fsub_bfloat_unaligned_monotonic:
; -O0: add w8, w8, w9
@@ -718,6 +949,11 @@ define dso_local bfloat @atomicrmw_fsub_bfloat_unaligned_monotonic(ptr %ptr, bfl
; -O1: add w8, w8, w20
; -O1: add w8, w9, w8
; -O1: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_bfloat_unaligned_monotonic:
+; CHECK-no-lsfe: add w8, w8, w20
+; CHECK-no-lsfe: add w8, w9, w8
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fsub ptr %ptr, bfloat %value monotonic, align 1
ret bfloat %r
}
@@ -732,6 +968,11 @@ define dso_local bfloat @atomicrmw_fsub_bfloat_unaligned_acquire(ptr %ptr, bfloa
; -O1: add w8, w8, w20
; -O1: add w8, w9, w8
; -O1: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_bfloat_unaligned_acquire:
+; CHECK-no-lsfe: add w8, w8, w20
+; CHECK-no-lsfe: add w8, w9, w8
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fsub ptr %ptr, bfloat %value acquire, align 1
ret bfloat %r
}
@@ -746,6 +987,11 @@ define dso_local bfloat @atomicrmw_fsub_bfloat_unaligned_release(ptr %ptr, bfloa
; -O1: add w8, w8, w20
; -O1: add w8, w9, w8
; -O1: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_bfloat_unaligned_release:
+; CHECK-no-lsfe: add w8, w8, w20
+; CHECK-no-lsfe: add w8, w9, w8
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fsub ptr %ptr, bfloat %value release, align 1
ret bfloat %r
}
@@ -760,6 +1006,11 @@ define dso_local bfloat @atomicrmw_fsub_bfloat_unaligned_acq_rel(ptr %ptr, bfloa
; -O1: add w8, w8, w20
; -O1: add w8, w9, w8
; -O1: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_bfloat_unaligned_acq_rel:
+; CHECK-no-lsfe: add w8, w8, w20
+; CHECK-no-lsfe: add w8, w9, w8
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fsub ptr %ptr, bfloat %value acq_rel, align 1
ret bfloat %r
}
@@ -774,13 +1025,71 @@ define dso_local bfloat @atomicrmw_fsub_bfloat_unaligned_seq_cst(ptr %ptr, bfloa
; -O1: add w8, w8, w20
; -O1: add w8, w9, w8
; -O1: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_bfloat_unaligned_seq_cst:
+; CHECK-no-lsfe: add w8, w8, w20
+; CHECK-no-lsfe: add w8, w9, w8
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fsub ptr %ptr, bfloat %value seq_cst, align 1
ret bfloat %r
}
+define dso_local float @atomicrmw_fsub_float_unaligned_monotonic(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fsub_float_unaligned_monotonic:
+; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_float_unaligned_monotonic:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
+ %r = atomicrmw fsub ptr %ptr, float %value monotonic, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fsub_float_unaligned_acquire(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fsub_float_unaligned_acquire:
+; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_float_unaligned_acquire:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
+ %r = atomicrmw fsub ptr %ptr, float %value acquire, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fsub_float_unaligned_release(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fsub_float_unaligned_release:
+; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_float_unaligned_release:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
+ %r = atomicrmw fsub ptr %ptr, float %value release, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fsub_float_unaligned_acq_rel(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fsub_float_unaligned_acq_rel:
+; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_float_unaligned_acq_rel:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
+ %r = atomicrmw fsub ptr %ptr, float %value acq_rel, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fsub_float_unaligned_seq_cst(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fsub_float_unaligned_seq_cst:
+; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_float_unaligned_seq_cst:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
+ %r = atomicrmw fsub ptr %ptr, float %value seq_cst, align 1
+ ret float %r
+}
+
define dso_local double @atomicrmw_fsub_double_unaligned_monotonic(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fsub_double_unaligned_monotonic:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_double_unaligned_monotonic:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fsub ptr %ptr, double %value monotonic, align 1
ret double %r
}
@@ -788,6 +1097,9 @@ define dso_local double @atomicrmw_fsub_double_unaligned_monotonic(ptr %ptr, dou
define dso_local double @atomicrmw_fsub_double_unaligned_acquire(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fsub_double_unaligned_acquire:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_double_unaligned_acquire:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fsub ptr %ptr, double %value acquire, align 1
ret double %r
}
@@ -795,6 +1107,9 @@ define dso_local double @atomicrmw_fsub_double_unaligned_acquire(ptr %ptr, doubl
define dso_local double @atomicrmw_fsub_double_unaligned_release(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fsub_double_unaligned_release:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_double_unaligned_release:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fsub ptr %ptr, double %value release, align 1
ret double %r
}
@@ -802,6 +1117,9 @@ define dso_local double @atomicrmw_fsub_double_unaligned_release(ptr %ptr, doubl
define dso_local double @atomicrmw_fsub_double_unaligned_acq_rel(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fsub_double_unaligned_acq_rel:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_double_unaligned_acq_rel:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fsub ptr %ptr, double %value acq_rel, align 1
ret double %r
}
@@ -809,6 +1127,9 @@ define dso_local double @atomicrmw_fsub_double_unaligned_acq_rel(ptr %ptr, doubl
define dso_local double @atomicrmw_fsub_double_unaligned_seq_cst(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fsub_double_unaligned_seq_cst:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fsub_double_unaligned_seq_cst:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fsub ptr %ptr, double %value seq_cst, align 1
ret double %r
}
@@ -816,6 +1137,10 @@ define dso_local double @atomicrmw_fsub_double_unaligned_seq_cst(ptr %ptr, doubl
define dso_local half @atomicrmw_fmax_half_aligned_monotonic(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fmax_half_aligned_monotonic:
; CHECK: ldfmaxnm h0, h0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_half_aligned_monotonic:
+; CHECK-no-lsfe: ldxrh w8, [x0]
+; CHECK-no-lsfe: stxrh w9, w8, [x0]
%r = atomicrmw fmax ptr %ptr, half %value monotonic, align 2
ret half %r
}
@@ -823,6 +1148,10 @@ define dso_local half @atomicrmw_fmax_half_aligned_monotonic(ptr %ptr, half %val
define dso_local half @atomicrmw_fmax_half_aligned_acquire(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fmax_half_aligned_acquire:
; CHECK: ldfmaxnma h0, h0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_half_aligned_acquire:
+; CHECK-no-lsfe: ldaxrh w8, [x0]
+; CHECK-no-lsfe: stxrh w9, w8, [x0]
%r = atomicrmw fmax ptr %ptr, half %value acquire, align 2
ret half %r
}
@@ -830,6 +1159,10 @@ define dso_local half @atomicrmw_fmax_half_aligned_acquire(ptr %ptr, half %value
define dso_local half @atomicrmw_fmax_half_aligned_release(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fmax_half_aligned_release:
; CHECK: ldfmaxnml h0, h0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_half_aligned_release:
+; CHECK-no-lsfe: ldxrh w8, [x0]
+; CHECK-no-lsfe: stlxrh w9, w8, [x0]
%r = atomicrmw fmax ptr %ptr, half %value release, align 2
ret half %r
}
@@ -837,6 +1170,10 @@ define dso_local half @atomicrmw_fmax_half_aligned_release(ptr %ptr, half %value
define dso_local half @atomicrmw_fmax_half_aligned_acq_rel(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fmax_half_aligned_acq_rel:
; CHECK: ldfmaxnmal h0, h0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_half_aligned_acq_rel:
+; CHECK-no-lsfe: ldaxrh w8, [x0]
+; CHECK-no-lsfe: stlxrh w9, w8, [x0]
%r = atomicrmw fmax ptr %ptr, half %value acq_rel, align 2
ret half %r
}
@@ -844,13 +1181,86 @@ define dso_local half @atomicrmw_fmax_half_aligned_acq_rel(ptr %ptr, half %value
define dso_local half @atomicrmw_fmax_half_aligned_seq_cst(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fmax_half_aligned_seq_cst:
; CHECK: ldfmaxnmal h0, h0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_half_aligned_seq_cst:
+; CHECK-no-lsfe: ldaxrh w8, [x0]
+; CHECK-no-lsfe: stlxrh w9, w8, [x0]
%r = atomicrmw fmax ptr %ptr, half %value seq_cst, align 2
ret half %r
}
+define dso_local bfloat @atomicrmw_fmax_bfloat_aligned_monotonic(ptr %ptr, bfloat %value) {
+; CHECK-LABEL: atomicrmw_fmax_bfloat_aligned_monotonic:
+; CHECK: ldbfmaxnm h0, h0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_bfloat_aligned_monotonic:
+; CHECK-no-lsfe: ldxrh w9, [x0]
+; CHECK-no-lsfe: add w9, w9, w8
+; CHECK-no-lsfe: add w9, w10, w9
+; CHECK-no-lsfe: stxrh w10, w9, [x0]
+ %r = atomicrmw fmax ptr %ptr, bfloat %value monotonic, align 2
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fmax_bfloat_aligned_acquire(ptr %ptr, bfloat %value) {
+; CHECK-LABEL: atomicrmw_fmax_bfloat_aligned_acquire:
+; CHECK: ldbfmaxnma h0, h0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_bfloat_aligned_acquire:
+; CHECK-no-lsfe: ldaxrh w9, [x0]
+; CHECK-no-lsfe: add w9, w9, w8
+; CHECK-no-lsfe: add w9, w10, w9
+; CHECK-no-lsfe: stxrh w10, w9, [x0]
+ %r = atomicrmw fmax ptr %ptr, bfloat %value acquire, align 2
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fmax_bfloat_aligned_release(ptr %ptr, bfloat %value) {
+; CHECK-LABEL: atomicrmw_fmax_bfloat_aligned_release:
+; CHECK: ldbfmaxnml h0, h0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_bfloat_aligned_release:
+; CHECK-no-lsfe: ldxrh w9, [x0]
+; CHECK-no-lsfe: add w9, w9, w8
+; CHECK-no-lsfe: add w9, w10, w9
+; CHECK-no-lsfe: stlxrh w10, w9, [x0]
+ %r = atomicrmw fmax ptr %ptr, bfloat %value release, align 2
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fmax_bfloat_aligned_acq_rel(ptr %ptr, bfloat %value) {
+; CHECK-LABEL: atomicrmw_fmax_bfloat_aligned_acq_rel:
+; CHECK: ldbfmaxnmal h0, h0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_bfloat_aligned_acq_rel:
+; CHECK-no-lsfe: ldaxrh w9, [x0]
+; CHECK-no-lsfe: add w9, w9, w8
+; CHECK-no-lsfe: add w9, w10, w9
+; CHECK-no-lsfe: stlxrh w10, w9, [x0]
+ %r = atomicrmw fmax ptr %ptr, bfloat %value acq_rel, align 2
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fmax_bfloat_aligned_seq_cst(ptr %ptr, bfloat %value) {
+; CHECK-LABEL: atomicrmw_fmax_bfloat_aligned_seq_cst:
+; CHECK: ldbfmaxnmal h0, h0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_bfloat_aligned_seq_cst:
+; CHECK-no-lsfe: ldaxrh w9, [x0]
+; CHECK-no-lsfe: add w9, w9, w8
+; CHECK-no-lsfe: add w9, w10, w9
+; CHECK-no-lsfe: stlxrh w10, w9, [x0]
+ %r = atomicrmw fmax ptr %ptr, bfloat %value seq_cst, align 2
+ ret bfloat %r
+}
+
define dso_local float @atomicrmw_fmax_float_aligned_monotonic(ptr %ptr, float %value) {
; CHECK-LABEL: atomicrmw_fmax_float_aligned_monotonic:
; CHECK: ldfmaxnm s0, s0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_float_aligned_monotonic:
+; CHECK-no-lsfe: ldxr w8, [x0]
+; CHECK-no-lsfe: stxr w9, w8, [x0]
%r = atomicrmw fmax ptr %ptr, float %value monotonic, align 4
ret float %r
}
@@ -858,6 +1268,10 @@ define dso_local float @atomicrmw_fmax_float_aligned_monotonic(ptr %ptr, float %
define dso_local float @atomicrmw_fmax_float_aligned_acquire(ptr %ptr, float %value) {
; CHECK-LABEL: atomicrmw_fmax_float_aligned_acquire:
; CHECK: ldfmaxnma s0, s0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_float_aligned_acquire:
+; CHECK-no-lsfe: ldaxr w8, [x0]
+; CHECK-no-lsfe: stxr w9, w8, [x0]
%r = atomicrmw fmax ptr %ptr, float %value acquire, align 4
ret float %r
}
@@ -865,6 +1279,10 @@ define dso_local float @atomicrmw_fmax_float_aligned_acquire(ptr %ptr, float %va
define dso_local float @atomicrmw_fmax_float_aligned_release(ptr %ptr, float %value) {
; CHECK-LABEL: atomicrmw_fmax_float_aligned_release:
; CHECK: ldfmaxnml s0, s0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_float_aligned_release:
+; CHECK-no-lsfe: ldxr w8, [x0]
+; CHECK-no-lsfe: stlxr w9, w8, [x0]
%r = atomicrmw fmax ptr %ptr, float %value release, align 4
ret float %r
}
@@ -872,6 +1290,10 @@ define dso_local float @atomicrmw_fmax_float_aligned_release(ptr %ptr, float %va
define dso_local float @atomicrmw_fmax_float_aligned_acq_rel(ptr %ptr, float %value) {
; CHECK-LABEL: atomicrmw_fmax_float_aligned_acq_rel:
; CHECK: ldfmaxnmal s0, s0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_float_aligned_acq_rel:
+; CHECK-no-lsfe: ldaxr w8, [x0]
+; CHECK-no-lsfe: stlxr w9, w8, [x0]
%r = atomicrmw fmax ptr %ptr, float %value acq_rel, align 4
ret float %r
}
@@ -879,48 +1301,21 @@ define dso_local float @atomicrmw_fmax_float_aligned_acq_rel(ptr %ptr, float %va
define dso_local float @atomicrmw_fmax_float_aligned_seq_cst(ptr %ptr, float %value) {
; CHECK-LABEL: atomicrmw_fmax_float_aligned_seq_cst:
; CHECK: ldfmaxnmal s0, s0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_float_aligned_seq_cst:
+; CHECK-no-lsfe: ldaxr w8, [x0]
+; CHECK-no-lsfe: stlxr w9, w8, [x0]
%r = atomicrmw fmax ptr %ptr, float %value seq_cst, align 4
ret float %r
}
-define dso_local bfloat @atomicrmw_fmax_bfloat_aligned_monotonic(ptr %ptr, bfloat %value) {
-; CHECK-LABEL: atomicrmw_fmax_bfloat_aligned_monotonic:
-; CHECK: ldbfmaxnm h0, h0, [x0]
- %r = atomicrmw fmax ptr %ptr, bfloat %value monotonic, align 4
- ret bfloat %r
-}
-
-define dso_local bfloat @atomicrmw_fmax_bfloat_aligned_acquire(ptr %ptr, bfloat %value) {
-; CHECK-LABEL: atomicrmw_fmax_bfloat_aligned_acquire:
-; CHECK: ldbfmaxnma h0, h0, [x0]
- %r = atomicrmw fmax ptr %ptr, bfloat %value acquire, align 4
- ret bfloat %r
-}
-
-define dso_local bfloat @atomicrmw_fmax_bfloat_aligned_release(ptr %ptr, bfloat %value) {
-; CHECK-LABEL: atomicrmw_fmax_bfloat_aligned_release:
-; CHECK: ldbfmaxnml h0, h0, [x0]
- %r = atomicrmw fmax ptr %ptr, bfloat %value release, align 4
- ret bfloat %r
-}
-
-define dso_local bfloat @atomicrmw_fmax_bfloat_aligned_acq_rel(ptr %ptr, bfloat %value) {
-; CHECK-LABEL: atomicrmw_fmax_bfloat_aligned_acq_rel:
-; CHECK: ldbfmaxnmal h0, h0, [x0]
- %r = atomicrmw fmax ptr %ptr, bfloat %value acq_rel, align 4
- ret bfloat %r
-}
-
-define dso_local bfloat @atomicrmw_fmax_bfloat_aligned_seq_cst(ptr %ptr, bfloat %value) {
-; CHECK-LABEL: atomicrmw_fmax_bfloat_aligned_seq_cst:
-; CHECK: ldbfmaxnmal h0, h0, [x0]
- %r = atomicrmw fmax ptr %ptr, bfloat %value seq_cst, align 4
- ret bfloat %r
-}
-
define dso_local double @atomicrmw_fmax_double_aligned_monotonic(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmax_double_aligned_monotonic:
; CHECK: ldfmaxnm d0, d0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_double_aligned_monotonic:
+; CHECK-no-lsfe: ldxr x8, [x0]
+; CHECK-no-lsfe: stxr w9, x8, [x0]
%r = atomicrmw fmax ptr %ptr, double %value monotonic, align 8
ret double %r
}
@@ -928,6 +1323,10 @@ define dso_local double @atomicrmw_fmax_double_aligned_monotonic(ptr %ptr, doubl
define dso_local double @atomicrmw_fmax_double_aligned_acquire(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmax_double_aligned_acquire:
; CHECK: ldfmaxnma d0, d0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_double_aligned_acquire:
+; CHECK-no-lsfe: ldaxr x8, [x0]
+; CHECK-no-lsfe: stxr w9, x8, [x0]
%r = atomicrmw fmax ptr %ptr, double %value acquire, align 8
ret double %r
}
@@ -935,6 +1334,10 @@ define dso_local double @atomicrmw_fmax_double_aligned_acquire(ptr %ptr, double
define dso_local double @atomicrmw_fmax_double_aligned_release(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmax_double_aligned_release:
; CHECK: ldfmaxnml d0, d0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_double_aligned_release:
+; CHECK-no-lsfe: ldxr x8, [x0]
+; CHECK-no-lsfe: stlxr w9, x8, [x0]
%r = atomicrmw fmax ptr %ptr, double %value release, align 8
ret double %r
}
@@ -942,6 +1345,10 @@ define dso_local double @atomicrmw_fmax_double_aligned_release(ptr %ptr, double
define dso_local double @atomicrmw_fmax_double_aligned_acq_rel(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmax_double_aligned_acq_rel:
; CHECK: ldfmaxnmal d0, d0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_double_aligned_acq_rel:
+; CHECK-no-lsfe: ldaxr x8, [x0]
+; CHECK-no-lsfe: stlxr w9, x8, [x0]
%r = atomicrmw fmax ptr %ptr, double %value acq_rel, align 8
ret double %r
}
@@ -949,6 +1356,10 @@ define dso_local double @atomicrmw_fmax_double_aligned_acq_rel(ptr %ptr, double
define dso_local double @atomicrmw_fmax_double_aligned_seq_cst(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmax_double_aligned_seq_cst:
; CHECK: ldfmaxnmal d0, d0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_double_aligned_seq_cst:
+; CHECK-no-lsfe: ldaxr x8, [x0]
+; CHECK-no-lsfe: stlxr w9, x8, [x0]
%r = atomicrmw fmax ptr %ptr, double %value seq_cst, align 8
ret double %r
}
@@ -956,71 +1367,51 @@ define dso_local double @atomicrmw_fmax_double_aligned_seq_cst(ptr %ptr, double
define dso_local half @atomicrmw_fmax_half_unaligned_monotonic(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fmax_half_unaligned_monotonic:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_half_unaligned_monotonic:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fmax ptr %ptr, half %value monotonic, align 1
ret half %r
}
-define dso_local half @atomicrmw_fmax_half_unaligned_acquire(ptr %ptr, half %value) {
-; CHECK-LABEL: atomicrmw_fmax_half_unaligned_acquire:
-; CHECK: bl __atomic_compare_exchange
- %r = atomicrmw fmax ptr %ptr, half %value acquire, align 1
- ret half %r
-}
-
-define dso_local half @atomicrmw_fmax_half_unaligned_release(ptr %ptr, half %value) {
-; CHECK-LABEL: atomicrmw_fmax_half_unaligned_release:
-; CHECK: bl __atomic_compare_exchange
- %r = atomicrmw fmax ptr %ptr, half %value release, align 1
- ret half %r
-}
-
-define dso_local half @atomicrmw_fmax_half_unaligned_acq_rel(ptr %ptr, half %value) {
-; CHECK-LABEL: atomicrmw_fmax_half_unaligned_acq_rel:
-; CHECK: bl __atomic_compare_exchange
- %r = atomicrmw fmax ptr %ptr, half %value acq_rel, align 1
- ret half %r
-}
-
-define dso_local half @atomicrmw_fmax_half_unaligned_seq_cst(ptr %ptr, half %value) {
-; CHECK-LABEL: atomicrmw_fmax_half_unaligned_seq_cst:
-; CHECK: bl __atomic_compare_exchange
- %r = atomicrmw fmax ptr %ptr, half %value seq_cst, align 1
- ret half %r
-}
-
-define dso_local float @atomicrmw_fmax_float_unaligned_monotonic(ptr %ptr, float %value) {
-; CHECK-LABEL: atomicrmw_fmax_float_unaligned_monotonic:
-; CHECK: bl __atomic_compare_exchange
- %r = atomicrmw fmax ptr %ptr, float %value monotonic, align 1
- ret float %r
-}
-
-define dso_local float @atomicrmw_fmax_float_unaligned_acquire(ptr %ptr, float %value) {
-; CHECK-LABEL: atomicrmw_fmax_float_unaligned_acquire:
+define dso_local half @atomicrmw_fmax_half_unaligned_acquire(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fmax_half_unaligned_acquire:
; CHECK: bl __atomic_compare_exchange
- %r = atomicrmw fmax ptr %ptr, float %value acquire, align 1
- ret float %r
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_half_unaligned_acquire:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
+ %r = atomicrmw fmax ptr %ptr, half %value acquire, align 1
+ ret half %r
}
-define dso_local float @atomicrmw_fmax_float_unaligned_release(ptr %ptr, float %value) {
-; CHECK-LABEL: atomicrmw_fmax_float_unaligned_release:
+define dso_local half @atomicrmw_fmax_half_unaligned_release(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fmax_half_unaligned_release:
; CHECK: bl __atomic_compare_exchange
- %r = atomicrmw fmax ptr %ptr, float %value release, align 1
- ret float %r
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_half_unaligned_release:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
+ %r = atomicrmw fmax ptr %ptr, half %value release, align 1
+ ret half %r
}
-define dso_local float @atomicrmw_fmax_float_unaligned_acq_rel(ptr %ptr, float %value) {
-; CHECK-LABEL: atomicrmw_fmax_float_unaligned_acq_rel:
+define dso_local half @atomicrmw_fmax_half_unaligned_acq_rel(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fmax_half_unaligned_acq_rel:
; CHECK: bl __atomic_compare_exchange
- %r = atomicrmw fmax ptr %ptr, float %value acq_rel, align 1
- ret float %r
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_half_unaligned_acq_rel:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
+ %r = atomicrmw fmax ptr %ptr, half %value acq_rel, align 1
+ ret half %r
}
-define dso_local float @atomicrmw_fmax_float_unaligned_seq_cst(ptr %ptr, float %value) {
-; CHECK-LABEL: atomicrmw_fmax_float_unaligned_seq_cst:
+define dso_local half @atomicrmw_fmax_half_unaligned_seq_cst(ptr %ptr, half %value) {
+; CHECK-LABEL: atomicrmw_fmax_half_unaligned_seq_cst:
; CHECK: bl __atomic_compare_exchange
- %r = atomicrmw fmax ptr %ptr, float %value seq_cst, align 1
- ret float %r
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_half_unaligned_seq_cst:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
+ %r = atomicrmw fmax ptr %ptr, half %value seq_cst, align 1
+ ret half %r
}
define dso_local bfloat @atomicrmw_fmax_bfloat_unaligned_monotonic(ptr %ptr, bfloat %value) {
@@ -1033,6 +1424,11 @@ define dso_local bfloat @atomicrmw_fmax_bfloat_unaligned_monotonic(ptr %ptr, bfl
; -O1: add w8, w8, w20
; -O1: add w8, w9, w8
; -O1: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_bfloat_unaligned_monotonic:
+; CHECK-no-lsfe: add w8, w8, w20
+; CHECK-no-lsfe: add w8, w9, w8
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fmax ptr %ptr, bfloat %value monotonic, align 1
ret bfloat %r
}
@@ -1047,6 +1443,11 @@ define dso_local bfloat @atomicrmw_fmax_bfloat_unaligned_acquire(ptr %ptr, bfloa
; -O1: add w8, w8, w20
; -O1: add w8, w9, w8
; -O1: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_bfloat_unaligned_acquire:
+; CHECK-no-lsfe: add w8, w8, w20
+; CHECK-no-lsfe: add w8, w9, w8
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fmax ptr %ptr, bfloat %value acquire, align 1
ret bfloat %r
}
@@ -1061,6 +1462,11 @@ define dso_local bfloat @atomicrmw_fmax_bfloat_unaligned_release(ptr %ptr, bfloa
; -O1: add w8, w8, w20
; -O1: add w8, w9, w8
; -O1: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_bfloat_unaligned_release:
+; CHECK-no-lsfe: add w8, w8, w20
+; CHECK-no-lsfe: add w8, w9, w8
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fmax ptr %ptr, bfloat %value release, align 1
ret bfloat %r
}
@@ -1075,6 +1481,11 @@ define dso_local bfloat @atomicrmw_fmax_bfloat_unaligned_acq_rel(ptr %ptr, bfloa
; -O1: add w8, w8, w20
; -O1: add w8, w9, w8
; -O1: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_bfloat_unaligned_acq_rel:
+; CHECK-no-lsfe: add w8, w8, w20
+; CHECK-no-lsfe: add w8, w9, w8
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fmax ptr %ptr, bfloat %value acq_rel, align 1
ret bfloat %r
}
@@ -1089,13 +1500,71 @@ define dso_local bfloat @atomicrmw_fmax_bfloat_unaligned_seq_cst(ptr %ptr, bfloa
; -O1: add w8, w8, w20
; -O1: add w8, w9, w8
; -O1: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_bfloat_unaligned_seq_cst:
+; CHECK-no-lsfe: add w8, w8, w20
+; CHECK-no-lsfe: add w8, w9, w8
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fmax ptr %ptr, bfloat %value seq_cst, align 1
ret bfloat %r
}
+define dso_local float @atomicrmw_fmax_float_unaligned_monotonic(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fmax_float_unaligned_monotonic:
+; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_float_unaligned_monotonic:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
+ %r = atomicrmw fmax ptr %ptr, float %value monotonic, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fmax_float_unaligned_acquire(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fmax_float_unaligned_acquire:
+; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_float_unaligned_acquire:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
+ %r = atomicrmw fmax ptr %ptr, float %value acquire, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fmax_float_unaligned_release(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fmax_float_unaligned_release:
+; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_float_unaligned_release:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
+ %r = atomicrmw fmax ptr %ptr, float %value release, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fmax_float_unaligned_acq_rel(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fmax_float_unaligned_acq_rel:
+; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_float_unaligned_acq_rel:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
+ %r = atomicrmw fmax ptr %ptr, float %value acq_rel, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fmax_float_unaligned_seq_cst(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fmax_float_unaligned_seq_cst:
+; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_float_unaligned_seq_cst:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
+ %r = atomicrmw fmax ptr %ptr, float %value seq_cst, align 1
+ ret float %r
+}
+
define dso_local double @atomicrmw_fmax_double_unaligned_monotonic(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmax_double_unaligned_monotonic:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_double_unaligned_monotonic:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fmax ptr %ptr, double %value monotonic, align 1
ret double %r
}
@@ -1103,6 +1572,9 @@ define dso_local double @atomicrmw_fmax_double_unaligned_monotonic(ptr %ptr, dou
define dso_local double @atomicrmw_fmax_double_unaligned_acquire(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmax_double_unaligned_acquire:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_double_unaligned_acquire:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fmax ptr %ptr, double %value acquire, align 1
ret double %r
}
@@ -1110,6 +1582,9 @@ define dso_local double @atomicrmw_fmax_double_unaligned_acquire(ptr %ptr, doubl
define dso_local double @atomicrmw_fmax_double_unaligned_release(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmax_double_unaligned_release:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_double_unaligned_release:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fmax ptr %ptr, double %value release, align 1
ret double %r
}
@@ -1117,6 +1592,9 @@ define dso_local double @atomicrmw_fmax_double_unaligned_release(ptr %ptr, doubl
define dso_local double @atomicrmw_fmax_double_unaligned_acq_rel(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmax_double_unaligned_acq_rel:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_double_unaligned_acq_rel:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fmax ptr %ptr, double %value acq_rel, align 1
ret double %r
}
@@ -1124,6 +1602,9 @@ define dso_local double @atomicrmw_fmax_double_unaligned_acq_rel(ptr %ptr, doubl
define dso_local double @atomicrmw_fmax_double_unaligned_seq_cst(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmax_double_unaligned_seq_cst:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmax_double_unaligned_seq_cst:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fmax ptr %ptr, double %value seq_cst, align 1
ret double %r
}
@@ -1131,6 +1612,10 @@ define dso_local double @atomicrmw_fmax_double_unaligned_seq_cst(ptr %ptr, doubl
define dso_local half @atomicrmw_fmin_half_aligned_monotonic(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fmin_half_aligned_monotonic:
; CHECK: ldfminnm h0, h0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_half_aligned_monotonic:
+; CHECK-no-lsfe: ldxrh w8, [x0]
+; CHECK-no-lsfe: stxrh w9, w8, [x0]
%r = atomicrmw fmin ptr %ptr, half %value monotonic, align 2
ret half %r
}
@@ -1138,6 +1623,10 @@ define dso_local half @atomicrmw_fmin_half_aligned_monotonic(ptr %ptr, half %val
define dso_local half @atomicrmw_fmin_half_aligned_acquire(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fmin_half_aligned_acquire:
; CHECK: ldfminnma h0, h0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_half_aligned_acquire:
+; CHECK-no-lsfe: ldaxrh w8, [x0]
+; CHECK-no-lsfe: stxrh w9, w8, [x0]
%r = atomicrmw fmin ptr %ptr, half %value acquire, align 2
ret half %r
}
@@ -1145,6 +1634,10 @@ define dso_local half @atomicrmw_fmin_half_aligned_acquire(ptr %ptr, half %value
define dso_local half @atomicrmw_fmin_half_aligned_release(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fmin_half_aligned_release:
; CHECK: ldfminnml h0, h0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_half_aligned_release:
+; CHECK-no-lsfe: ldxrh w8, [x0]
+; CHECK-no-lsfe: stlxrh w9, w8, [x0]
%r = atomicrmw fmin ptr %ptr, half %value release, align 2
ret half %r
}
@@ -1152,6 +1645,10 @@ define dso_local half @atomicrmw_fmin_half_aligned_release(ptr %ptr, half %value
define dso_local half @atomicrmw_fmin_half_aligned_acq_rel(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fmin_half_aligned_acq_rel:
; CHECK: ldfminnmal h0, h0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_half_aligned_acq_rel:
+; CHECK-no-lsfe: ldaxrh w8, [x0]
+; CHECK-no-lsfe: stlxrh w9, w8, [x0]
%r = atomicrmw fmin ptr %ptr, half %value acq_rel, align 2
ret half %r
}
@@ -1159,13 +1656,86 @@ define dso_local half @atomicrmw_fmin_half_aligned_acq_rel(ptr %ptr, half %value
define dso_local half @atomicrmw_fmin_half_aligned_seq_cst(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fmin_half_aligned_seq_cst:
; CHECK: ldfminnmal h0, h0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_half_aligned_seq_cst:
+; CHECK-no-lsfe: ldaxrh w8, [x0]
+; CHECK-no-lsfe: stlxrh w9, w8, [x0]
%r = atomicrmw fmin ptr %ptr, half %value seq_cst, align 2
ret half %r
}
+define dso_local bfloat @atomicrmw_fmin_bfloat_aligned_monotonic(ptr %ptr, bfloat %value) {
+; CHECK-LABEL: atomicrmw_fmin_bfloat_aligned_monotonic:
+; CHECK: ldbfminnm h0, h0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_bfloat_aligned_monotonic:
+; CHECK-no-lsfe: ldxrh w9, [x0]
+; CHECK-no-lsfe: add w9, w9, w8
+; CHECK-no-lsfe: add w9, w10, w9
+; CHECK-no-lsfe: stxrh w10, w9, [x0]
+ %r = atomicrmw fmin ptr %ptr, bfloat %value monotonic, align 2
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fmin_bfloat_aligned_acquire(ptr %ptr, bfloat %value) {
+; CHECK-LABEL: atomicrmw_fmin_bfloat_aligned_acquire:
+; CHECK: ldbfminnma h0, h0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_bfloat_aligned_acquire:
+; CHECK-no-lsfe: ldaxrh w9, [x0]
+; CHECK-no-lsfe: add w9, w9, w8
+; CHECK-no-lsfe: add w9, w10, w9
+; CHECK-no-lsfe: stxrh w10, w9, [x0]
+ %r = atomicrmw fmin ptr %ptr, bfloat %value acquire, align 2
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fmin_bfloat_aligned_release(ptr %ptr, bfloat %value) {
+; CHECK-LABEL: atomicrmw_fmin_bfloat_aligned_release:
+; CHECK: ldbfminnml h0, h0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_bfloat_aligned_release:
+; CHECK-no-lsfe: ldxrh w9, [x0]
+; CHECK-no-lsfe: add w9, w9, w8
+; CHECK-no-lsfe: add w9, w10, w9
+; CHECK-no-lsfe: stlxrh w10, w9, [x0]
+ %r = atomicrmw fmin ptr %ptr, bfloat %value release, align 2
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fmin_bfloat_aligned_acq_rel(ptr %ptr, bfloat %value) {
+; CHECK-LABEL: atomicrmw_fmin_bfloat_aligned_acq_rel:
+; CHECK: ldbfminnmal h0, h0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_bfloat_aligned_acq_rel:
+; CHECK-no-lsfe: ldaxrh w9, [x0]
+; CHECK-no-lsfe: add w9, w9, w8
+; CHECK-no-lsfe: add w9, w10, w9
+; CHECK-no-lsfe: stlxrh w10, w9, [x0]
+ %r = atomicrmw fmin ptr %ptr, bfloat %value acq_rel, align 2
+ ret bfloat %r
+}
+
+define dso_local bfloat @atomicrmw_fmin_bfloat_aligned_seq_cst(ptr %ptr, bfloat %value) {
+; CHECK-LABEL: atomicrmw_fmin_bfloat_aligned_seq_cst:
+; CHECK: ldbfminnmal h0, h0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_bfloat_aligned_seq_cst:
+; CHECK-no-lsfe: ldaxrh w9, [x0]
+; CHECK-no-lsfe: add w9, w9, w8
+; CHECK-no-lsfe: add w9, w10, w9
+; CHECK-no-lsfe: stlxrh w10, w9, [x0]
+ %r = atomicrmw fmin ptr %ptr, bfloat %value seq_cst, align 2
+ ret bfloat %r
+}
+
define dso_local float @atomicrmw_fmin_float_aligned_monotonic(ptr %ptr, float %value) {
; CHECK-LABEL: atomicrmw_fmin_float_aligned_monotonic:
; CHECK: ldfminnm s0, s0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_float_aligned_monotonic:
+; CHECK-no-lsfe: ldxr w8, [x0]
+; CHECK-no-lsfe: stxr w9, w8, [x0]
%r = atomicrmw fmin ptr %ptr, float %value monotonic, align 4
ret float %r
}
@@ -1173,6 +1743,10 @@ define dso_local float @atomicrmw_fmin_float_aligned_monotonic(ptr %ptr, float %
define dso_local float @atomicrmw_fmin_float_aligned_acquire(ptr %ptr, float %value) {
; CHECK-LABEL: atomicrmw_fmin_float_aligned_acquire:
; CHECK: ldfminnma s0, s0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_float_aligned_acquire:
+; CHECK-no-lsfe: ldaxr w8, [x0]
+; CHECK-no-lsfe: stxr w9, w8, [x0]
%r = atomicrmw fmin ptr %ptr, float %value acquire, align 4
ret float %r
}
@@ -1180,6 +1754,10 @@ define dso_local float @atomicrmw_fmin_float_aligned_acquire(ptr %ptr, float %va
define dso_local float @atomicrmw_fmin_float_aligned_release(ptr %ptr, float %value) {
; CHECK-LABEL: atomicrmw_fmin_float_aligned_release:
; CHECK: ldfminnml s0, s0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_float_aligned_release:
+; CHECK-no-lsfe: ldxr w8, [x0]
+; CHECK-no-lsfe: stlxr w9, w8, [x0]
%r = atomicrmw fmin ptr %ptr, float %value release, align 4
ret float %r
}
@@ -1187,6 +1765,10 @@ define dso_local float @atomicrmw_fmin_float_aligned_release(ptr %ptr, float %va
define dso_local float @atomicrmw_fmin_float_aligned_acq_rel(ptr %ptr, float %value) {
; CHECK-LABEL: atomicrmw_fmin_float_aligned_acq_rel:
; CHECK: ldfminnmal s0, s0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_float_aligned_acq_rel:
+; CHECK-no-lsfe: ldaxr w8, [x0]
+; CHECK-no-lsfe: stlxr w9, w8, [x0]
%r = atomicrmw fmin ptr %ptr, float %value acq_rel, align 4
ret float %r
}
@@ -1194,48 +1776,21 @@ define dso_local float @atomicrmw_fmin_float_aligned_acq_rel(ptr %ptr, float %va
define dso_local float @atomicrmw_fmin_float_aligned_seq_cst(ptr %ptr, float %value) {
; CHECK-LABEL: atomicrmw_fmin_float_aligned_seq_cst:
; CHECK: ldfminnmal s0, s0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_float_aligned_seq_cst:
+; CHECK-no-lsfe: ldaxr w8, [x0]
+; CHECK-no-lsfe: stlxr w9, w8, [x0]
%r = atomicrmw fmin ptr %ptr, float %value seq_cst, align 4
ret float %r
}
-define dso_local bfloat @atomicrmw_fmin_bfloat_aligned_monotonic(ptr %ptr, bfloat %value) {
-; CHECK-LABEL: atomicrmw_fmin_bfloat_aligned_monotonic:
-; CHECK: ldbfminnm h0, h0, [x0]
- %r = atomicrmw fmin ptr %ptr, bfloat %value monotonic, align 4
- ret bfloat %r
-}
-
-define dso_local bfloat @atomicrmw_fmin_bfloat_aligned_acquire(ptr %ptr, bfloat %value) {
-; CHECK-LABEL: atomicrmw_fmin_bfloat_aligned_acquire:
-; CHECK: ldbfminnma h0, h0, [x0]
- %r = atomicrmw fmin ptr %ptr, bfloat %value acquire, align 4
- ret bfloat %r
-}
-
-define dso_local bfloat @atomicrmw_fmin_bfloat_aligned_release(ptr %ptr, bfloat %value) {
-; CHECK-LABEL: atomicrmw_fmin_bfloat_aligned_release:
-; CHECK: ldbfminnml h0, h0, [x0]
- %r = atomicrmw fmin ptr %ptr, bfloat %value release, align 4
- ret bfloat %r
-}
-
-define dso_local bfloat @atomicrmw_fmin_bfloat_aligned_acq_rel(ptr %ptr, bfloat %value) {
-; CHECK-LABEL: atomicrmw_fmin_bfloat_aligned_acq_rel:
-; CHECK: ldbfminnmal h0, h0, [x0]
- %r = atomicrmw fmin ptr %ptr, bfloat %value acq_rel, align 4
- ret bfloat %r
-}
-
-define dso_local bfloat @atomicrmw_fmin_bfloat_aligned_seq_cst(ptr %ptr, bfloat %value) {
-; CHECK-LABEL: atomicrmw_fmin_bfloat_aligned_seq_cst:
-; CHECK: ldbfminnmal h0, h0, [x0]
- %r = atomicrmw fmin ptr %ptr, bfloat %value seq_cst, align 4
- ret bfloat %r
-}
-
define dso_local double @atomicrmw_fmin_double_aligned_monotonic(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmin_double_aligned_monotonic:
; CHECK: ldfminnm d0, d0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_double_aligned_monotonic:
+; CHECK-no-lsfe: ldxr x8, [x0]
+; CHECK-no-lsfe: stxr w9, x8, [x0]
%r = atomicrmw fmin ptr %ptr, double %value monotonic, align 8
ret double %r
}
@@ -1243,6 +1798,10 @@ define dso_local double @atomicrmw_fmin_double_aligned_monotonic(ptr %ptr, doubl
define dso_local double @atomicrmw_fmin_double_aligned_acquire(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmin_double_aligned_acquire:
; CHECK: ldfminnma d0, d0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_double_aligned_acquire:
+; CHECK-no-lsfe: ldaxr x8, [x0]
+; CHECK-no-lsfe: stxr w9, x8, [x0]
%r = atomicrmw fmin ptr %ptr, double %value acquire, align 8
ret double %r
}
@@ -1250,6 +1809,10 @@ define dso_local double @atomicrmw_fmin_double_aligned_acquire(ptr %ptr, double
define dso_local double @atomicrmw_fmin_double_aligned_release(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmin_double_aligned_release:
; CHECK: ldfminnml d0, d0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_double_aligned_release:
+; CHECK-no-lsfe: ldxr x8, [x0]
+; CHECK-no-lsfe: stlxr w9, x8, [x0]
%r = atomicrmw fmin ptr %ptr, double %value release, align 8
ret double %r
}
@@ -1257,6 +1820,10 @@ define dso_local double @atomicrmw_fmin_double_aligned_release(ptr %ptr, double
define dso_local double @atomicrmw_fmin_double_aligned_acq_rel(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmin_double_aligned_acq_rel:
; CHECK: ldfminnmal d0, d0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_double_aligned_acq_rel:
+; CHECK-no-lsfe: ldaxr x8, [x0]
+; CHECK-no-lsfe: stlxr w9, x8, [x0]
%r = atomicrmw fmin ptr %ptr, double %value acq_rel, align 8
ret double %r
}
@@ -1264,6 +1831,10 @@ define dso_local double @atomicrmw_fmin_double_aligned_acq_rel(ptr %ptr, double
define dso_local double @atomicrmw_fmin_double_aligned_seq_cst(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmin_double_aligned_seq_cst:
; CHECK: ldfminnmal d0, d0, [x0]
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_double_aligned_seq_cst:
+; CHECK-no-lsfe: ldaxr x8, [x0]
+; CHECK-no-lsfe: stlxr w9, x8, [x0]
%r = atomicrmw fmin ptr %ptr, double %value seq_cst, align 8
ret double %r
}
@@ -1271,6 +1842,9 @@ define dso_local double @atomicrmw_fmin_double_aligned_seq_cst(ptr %ptr, double
define dso_local half @atomicrmw_fmin_half_unaligned_monotonic(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fmin_half_unaligned_monotonic:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_half_unaligned_monotonic:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fmin ptr %ptr, half %value monotonic, align 1
ret half %r
}
@@ -1278,6 +1852,9 @@ define dso_local half @atomicrmw_fmin_half_unaligned_monotonic(ptr %ptr, half %v
define dso_local half @atomicrmw_fmin_half_unaligned_acquire(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fmin_half_unaligned_acquire:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_half_unaligned_acquire:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fmin ptr %ptr, half %value acquire, align 1
ret half %r
}
@@ -1285,6 +1862,9 @@ define dso_local half @atomicrmw_fmin_half_unaligned_acquire(ptr %ptr, half %val
define dso_local half @atomicrmw_fmin_half_unaligned_release(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fmin_half_unaligned_release:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_half_unaligned_release:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fmin ptr %ptr, half %value release, align 1
ret half %r
}
@@ -1292,6 +1872,9 @@ define dso_local half @atomicrmw_fmin_half_unaligned_release(ptr %ptr, half %val
define dso_local half @atomicrmw_fmin_half_unaligned_acq_rel(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fmin_half_unaligned_acq_rel:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_half_unaligned_acq_rel:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fmin ptr %ptr, half %value acq_rel, align 1
ret half %r
}
@@ -1299,45 +1882,13 @@ define dso_local half @atomicrmw_fmin_half_unaligned_acq_rel(ptr %ptr, half %val
define dso_local half @atomicrmw_fmin_half_unaligned_seq_cst(ptr %ptr, half %value) {
; CHECK-LABEL: atomicrmw_fmin_half_unaligned_seq_cst:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_half_unaligned_seq_cst:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fmin ptr %ptr, half %value seq_cst, align 1
ret half %r
}
-define dso_local float @atomicrmw_fmin_float_unaligned_monotonic(ptr %ptr, float %value) {
-; CHECK-LABEL: atomicrmw_fmin_float_unaligned_monotonic:
-; CHECK: bl __atomic_compare_exchange
- %r = atomicrmw fmin ptr %ptr, float %value monotonic, align 1
- ret float %r
-}
-
-define dso_local float @atomicrmw_fmin_float_unaligned_acquire(ptr %ptr, float %value) {
-; CHECK-LABEL: atomicrmw_fmin_float_unaligned_acquire:
-; CHECK: bl __atomic_compare_exchange
- %r = atomicrmw fmin ptr %ptr, float %value acquire, align 1
- ret float %r
-}
-
-define dso_local float @atomicrmw_fmin_float_unaligned_release(ptr %ptr, float %value) {
-; CHECK-LABEL: atomicrmw_fmin_float_unaligned_release:
-; CHECK: bl __atomic_compare_exchange
- %r = atomicrmw fmin ptr %ptr, float %value release, align 1
- ret float %r
-}
-
-define dso_local float @atomicrmw_fmin_float_unaligned_acq_rel(ptr %ptr, float %value) {
-; CHECK-LABEL: atomicrmw_fmin_float_unaligned_acq_rel:
-; CHECK: bl __atomic_compare_exchange
- %r = atomicrmw fmin ptr %ptr, float %value acq_rel, align 1
- ret float %r
-}
-
-define dso_local float @atomicrmw_fmin_float_unaligned_seq_cst(ptr %ptr, float %value) {
-; CHECK-LABEL: atomicrmw_fmin_float_unaligned_seq_cst:
-; CHECK: bl __atomic_compare_exchange
- %r = atomicrmw fmin ptr %ptr, float %value seq_cst, align 1
- ret float %r
-}
-
define dso_local bfloat @atomicrmw_fmin_bfloat_unaligned_monotonic(ptr %ptr, bfloat %value) {
; -O0-LABEL: atomicrmw_fmin_bfloat_unaligned_monotonic:
; -O0: add w8, w8, w9
@@ -1348,6 +1899,11 @@ define dso_local bfloat @atomicrmw_fmin_bfloat_unaligned_monotonic(ptr %ptr, bfl
; -O1: add w8, w8, w20
; -O1: add w8, w9, w8
; -O1: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_bfloat_unaligned_monotonic:
+; CHECK-no-lsfe: add w8, w8, w20
+; CHECK-no-lsfe: add w8, w9, w8
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fmin ptr %ptr, bfloat %value monotonic, align 1
ret bfloat %r
}
@@ -1362,6 +1918,11 @@ define dso_local bfloat @atomicrmw_fmin_bfloat_unaligned_acquire(ptr %ptr, bfloa
; -O1: add w8, w8, w20
; -O1: add w8, w9, w8
; -O1: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_bfloat_unaligned_acquire:
+; CHECK-no-lsfe: add w8, w8, w20
+; CHECK-no-lsfe: add w8, w9, w8
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fmin ptr %ptr, bfloat %value acquire, align 1
ret bfloat %r
}
@@ -1376,6 +1937,11 @@ define dso_local bfloat @atomicrmw_fmin_bfloat_unaligned_release(ptr %ptr, bfloa
; -O1: add w8, w8, w20
; -O1: add w8, w9, w8
; -O1: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_bfloat_unaligned_release:
+; CHECK-no-lsfe: add w8, w8, w20
+; CHECK-no-lsfe: add w8, w9, w8
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fmin ptr %ptr, bfloat %value release, align 1
ret bfloat %r
}
@@ -1390,6 +1956,11 @@ define dso_local bfloat @atomicrmw_fmin_bfloat_unaligned_acq_rel(ptr %ptr, bfloa
; -O1: add w8, w8, w20
; -O1: add w8, w9, w8
; -O1: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_bfloat_unaligned_acq_rel:
+; CHECK-no-lsfe: add w8, w8, w20
+; CHECK-no-lsfe: add w8, w9, w8
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fmin ptr %ptr, bfloat %value acq_rel, align 1
ret bfloat %r
}
@@ -1404,13 +1975,71 @@ define dso_local bfloat @atomicrmw_fmin_bfloat_unaligned_seq_cst(ptr %ptr, bfloa
; -O1: add w8, w8, w20
; -O1: add w8, w9, w8
; -O1: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_bfloat_unaligned_seq_cst:
+; CHECK-no-lsfe: add w8, w8, w20
+; CHECK-no-lsfe: add w8, w9, w8
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fmin ptr %ptr, bfloat %value seq_cst, align 1
ret bfloat %r
}
+define dso_local float @atomicrmw_fmin_float_unaligned_monotonic(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fmin_float_unaligned_monotonic:
+; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_float_unaligned_monotonic:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
+ %r = atomicrmw fmin ptr %ptr, float %value monotonic, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fmin_float_unaligned_acquire(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fmin_float_unaligned_acquire:
+; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_float_unaligned_acquire:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
+ %r = atomicrmw fmin ptr %ptr, float %value acquire, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fmin_float_unaligned_release(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fmin_float_unaligned_release:
+; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_float_unaligned_release:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
+ %r = atomicrmw fmin ptr %ptr, float %value release, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fmin_float_unaligned_acq_rel(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fmin_float_unaligned_acq_rel:
+; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_float_unaligned_acq_rel:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
+ %r = atomicrmw fmin ptr %ptr, float %value acq_rel, align 1
+ ret float %r
+}
+
+define dso_local float @atomicrmw_fmin_float_unaligned_seq_cst(ptr %ptr, float %value) {
+; CHECK-LABEL: atomicrmw_fmin_float_unaligned_seq_cst:
+; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_float_unaligned_seq_cst:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
+ %r = atomicrmw fmin ptr %ptr, float %value seq_cst, align 1
+ ret float %r
+}
+
define dso_local double @atomicrmw_fmin_double_unaligned_monotonic(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmin_double_unaligned_monotonic:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_double_unaligned_monotonic:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fmin ptr %ptr, double %value monotonic, align 1
ret double %r
}
@@ -1418,6 +2047,9 @@ define dso_local double @atomicrmw_fmin_double_unaligned_monotonic(ptr %ptr, dou
define dso_local double @atomicrmw_fmin_double_unaligned_acquire(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmin_double_unaligned_acquire:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_double_unaligned_acquire:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fmin ptr %ptr, double %value acquire, align 1
ret double %r
}
@@ -1425,6 +2057,9 @@ define dso_local double @atomicrmw_fmin_double_unaligned_acquire(ptr %ptr, doubl
define dso_local double @atomicrmw_fmin_double_unaligned_release(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmin_double_unaligned_release:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_double_unaligned_release:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fmin ptr %ptr, double %value release, align 1
ret double %r
}
@@ -1432,6 +2067,9 @@ define dso_local double @atomicrmw_fmin_double_unaligned_release(ptr %ptr, doubl
define dso_local double @atomicrmw_fmin_double_unaligned_acq_rel(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmin_double_unaligned_acq_rel:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_double_unaligned_acq_rel:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fmin ptr %ptr, double %value acq_rel, align 1
ret double %r
}
@@ -1439,6 +2077,9 @@ define dso_local double @atomicrmw_fmin_double_unaligned_acq_rel(ptr %ptr, doubl
define dso_local double @atomicrmw_fmin_double_unaligned_seq_cst(ptr %ptr, double %value) {
; CHECK-LABEL: atomicrmw_fmin_double_unaligned_seq_cst:
; CHECK: bl __atomic_compare_exchange
+;
+; CHECK-no-lsfe-LABEL: atomicrmw_fmin_double_unaligned_seq_cst:
+; CHECK-no-lsfe: bl __atomic_compare_exchange
%r = atomicrmw fmin ptr %ptr, double %value seq_cst, align 1
ret double %r
}
diff --git a/llvm/test/CodeGen/AArch64/Atomics/generate-tests.py b/llvm/test/CodeGen/AArch64/Atomics/generate-tests.py
index 82128d9e5fd34ef..ecda5fd69ca5d93 100755
--- a/llvm/test/CodeGen/AArch64/Atomics/generate-tests.py
+++ b/llvm/test/CodeGen/AArch64/Atomics/generate-tests.py
@@ -13,37 +13,20 @@
]
-class byteSizes:
- def __init__(self):
- self._data = {}
+# Type name size
+class Type(enum.Enum):
+ # Value is the size in bytes
+ i8 = 1
+ i16 = 2
+ i32 = 4
+ i64 = 8
+ i128 = 16
+
+ def align(self, aligned: bool) -> int:
+ return self.value if aligned else 1
- def __setitem__(self, k, v):
- self._data[k] = v
-
- def __getitem__(self, k):
- return self._data[k]
-
- def __iter__(self):
- return iter(self._data.items())
-
-
-def align(val, aligned: bool) -> int:
- return val if aligned else 1
-
-
-# Value is the size in bytes
-Type = byteSizes()
-Type["i8"] = 1
-Type["i16"] = 2
-Type["i32"] = 4
-Type["i64"] = 8
-Type["i128"] = 16
-
-FPType = byteSizes()
-FPType["half"] = 2
-FPType["float"] = 4
-FPType["bfloat"] = 4
-FPType["double"] = 8
+ def __str__(self) -> str:
+ return self.name
# Is this an aligned or unaligned access?
@@ -128,7 +111,6 @@ class Feature(enum.Flag):
v8_1a = enum.auto() # -mattr=+v8.1a, mandatory FEAT_LOR, FEAT_LSE
rcpc = enum.auto() # FEAT_LRCPC
lse2 = enum.auto() # FEAT_LSE2
- lsfe = enum.auto() # FEAT_LSFE
outline_atomics = enum.auto() # -moutline-atomics
rcpc3 = enum.auto() # FEAT_LSE2 + FEAT_LRCPC3
lse2_lse128 = enum.auto() # FEAT_LSE2 + FEAT_LSE128
@@ -143,8 +125,6 @@ def mattr(self):
return "+lse2,+rcpc3"
if self == Feature.lse2_lse128:
return "+lse2,+lse128"
- if self == Feature.lsfe:
- return "+lsfe"
return "+" + self.name
@@ -162,19 +142,11 @@ def mattr(self):
"umin",
]
-FP_ATOMICRMW_OPS = [
- "fadd",
- "fsub",
- "fmax",
- "fmin",
-]
-
-def all_atomicrmw(f, datatype, atomicrmw_ops):
- for op in atomicrmw_ops:
+def all_atomicrmw(f):
+ for op in ATOMICRMW_OPS:
for aligned in Aligned:
- for ty, val in datatype:
- alignval = align(val, aligned)
+ for ty in Type:
for ordering in ATOMICRMW_ORDERS:
name = f"atomicrmw_{op}_{ty}_{aligned}_{ordering}"
instr = "atomicrmw"
@@ -182,7 +154,7 @@ def all_atomicrmw(f, datatype, atomicrmw_ops):
textwrap.dedent(
f"""
define dso_local {ty} @{name}(ptr %ptr, {ty} %value) {{
- %r = {instr} {op} ptr %ptr, {ty} %value {ordering}, align {alignval}
+ %r = {instr} {op} ptr %ptr, {ty} %value {ordering}, align {ty.align(aligned)}
ret {ty} %r
}}
"""
@@ -192,8 +164,7 @@ def all_atomicrmw(f, datatype, atomicrmw_ops):
def all_load(f):
for aligned in Aligned:
- for ty, val in Type:
- alignval = align(val, aligned)
+ for ty in Type:
for ordering in ATOMIC_LOAD_ORDERS:
for const in [False, True]:
name = f"load_atomic_{ty}_{aligned}_{ordering}"
@@ -205,7 +176,7 @@ def all_load(f):
textwrap.dedent(
f"""
define dso_local {ty} @{name}({arg}) {{
- %r = {instr} {ty}, ptr %ptr {ordering}, align {alignval}
+ %r = {instr} {ty}, ptr %ptr {ordering}, align {ty.align(aligned)}
ret {ty} %r
}}
"""
@@ -215,8 +186,7 @@ def all_load(f):
def all_store(f):
for aligned in Aligned:
- for ty, val in Type:
- alignval = align(val, aligned)
+ for ty in Type:
for ordering in ATOMIC_STORE_ORDERS: # FIXME stores
name = f"store_atomic_{ty}_{aligned}_{ordering}"
instr = "store atomic"
@@ -224,7 +194,7 @@ def all_store(f):
textwrap.dedent(
f"""
define dso_local void @{name}({ty} %value, ptr %ptr) {{
- {instr} {ty} %value, ptr %ptr {ordering}, align {alignval}
+ {instr} {ty} %value, ptr %ptr {ordering}, align {ty.align(aligned)}
ret void
}}
"""
@@ -234,8 +204,7 @@ def all_store(f):
def all_cmpxchg(f):
for aligned in Aligned:
- for ty, val in Type:
- alignval = align(val, aligned)
+ for ty in Type:
for success_ordering in CMPXCHG_SUCCESS_ORDERS:
for failure_ordering in CMPXCHG_FAILURE_ORDERS:
for weak in [False, True]:
@@ -248,7 +217,7 @@ def all_cmpxchg(f):
textwrap.dedent(
f"""
define dso_local {ty} @{name}({ty} %expected, {ty} %new, ptr %ptr) {{
- %pair = {instr} ptr %ptr, {ty} %expected, {ty} %new {success_ordering} {failure_ordering}, align {alignval}
+ %pair = {instr} ptr %ptr, {ty} %expected, {ty} %new {success_ordering} {failure_ordering}, align {ty.align(aligned)}
%r = extractvalue {{ {ty}, i1 }} %pair, 0
ret {ty} %r
}}
@@ -317,14 +286,7 @@ def write_lit_tests():
with open(f"{triple}-atomicrmw-{feat.name}.ll", "w") as f:
filter_args = r'--filter-out "\b(sp)\b" --filter "^\s*(ld[^r]|st[^r]|swp|cas|bl|add|and|eor|orn|orr|sub|mvn|sxt|cmp|ccmp|csel|dmb)"'
header(f, triple, [feat], filter_args)
- if feat != Feature.lsfe:
- all_atomicrmw(f, Type, ATOMICRMW_OPS)
- else:
- all_atomicrmw(f, FPType, FP_ATOMICRMW_OPS)
-
- # Floating point atomics only supported for atomicrmw currently
- if feat == Feature.lsfe:
- continue
+ all_atomicrmw(f)
with open(f"{triple}-cmpxchg-{feat.name}.ll", "w") as f:
filter_args = r'--filter-out "\b(sp)\b" --filter "^\s*(ld[^r]|st[^r]|swp|cas|bl|add|and|eor|orn|orr|sub|mvn|sxt|cmp|ccmp|csel|dmb)"'
More information about the llvm-commits
mailing list