[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
Wed Feb 12 05:07:28 PST 2025


https://github.com/jthackray updated https://github.com/llvm/llvm-project/pull/125686

>From 21d6ac7efb7c90080412269a40973c88343aa35f 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/4] [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 | 1155 ++--------------
 .../Atomics/aarch64_be-atomicrmw-lsfe.ll      | 1200 ++---------------
 .../CodeGen/AArch64/Atomics/generate-tests.py |   40 +-
 6 files changed, 261 insertions(+), 2192 deletions(-)

diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
index 4263be1098899..5379b78d01879 100644
--- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
+++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
@@ -975,6 +975,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.
@@ -27831,6 +27845,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 5e6db9d007a55..045bebf15a701 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 d13bb908df78e..0b73eaba98112 100644
--- a/llvm/lib/Target/AArch64/AArch64InstrFormats.td
+++ b/llvm/lib/Target/AArch64/AArch64InstrFormats.td
@@ -12483,6 +12483,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
index 992d050cf9ca0..3d6ad81ea674c 100644
--- a/llvm/test/CodeGen/AArch64/Atomics/aarch64-atomicrmw-lsfe.ll
+++ b/llvm/test/CodeGen/AArch64/Atomics/aarch64-atomicrmw-lsfe.ll
@@ -4,306 +4,106 @@
 ; 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) {
-; -O0-LABEL: atomicrmw_fadd_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_fadd_half_aligned_monotonic:
-; -O1:    ldxrh w8, [x0]
-; -O1:    stxrh w9, w8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fadd_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_fadd_half_aligned_acquire:
-; -O1:    ldaxrh w8, [x0]
-; -O1:    stxrh w9, w8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fadd_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_fadd_half_aligned_release:
-; -O1:    ldxrh w8, [x0]
-; -O1:    stlxrh w9, w8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fadd_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_fadd_half_aligned_acq_rel:
-; -O1:    ldaxrh w8, [x0]
-; -O1:    stlxrh w9, w8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fadd_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_fadd_half_aligned_seq_cst:
-; -O1:    ldaxrh w8, [x0]
-; -O1:    stlxrh w9, w8, [x0]
+; 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 bfloat @atomicrmw_fadd_bfloat_aligned_monotonic(ptr %ptr, bfloat %value) {
-; -O0-LABEL: atomicrmw_fadd_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_fadd_bfloat_aligned_monotonic:
-; -O1:    ldxrh w9, [x0]
-; -O1:    add w9, w9, w8
-; -O1:    add w9, w10, w9
-; -O1:    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) {
-; -O0-LABEL: atomicrmw_fadd_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_fadd_bfloat_aligned_acquire:
-; -O1:    ldaxrh w9, [x0]
-; -O1:    add w9, w9, w8
-; -O1:    add w9, w10, w9
-; -O1:    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) {
-; -O0-LABEL: atomicrmw_fadd_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_fadd_bfloat_aligned_release:
-; -O1:    ldxrh w9, [x0]
-; -O1:    add w9, w9, w8
-; -O1:    add w9, w10, w9
-; -O1:    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) {
-; -O0-LABEL: atomicrmw_fadd_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_fadd_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 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) {
-; -O0-LABEL: atomicrmw_fadd_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_fadd_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 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) {
-; -O0-LABEL: atomicrmw_fadd_float_aligned_monotonic:
-; -O0:    ldaxr w0, [x9]
-; -O0:    cmp w0, w10
-; -O0:    stlxr w8, w11, [x9]
-; -O0:    subs w8, w0, w8
-;
-; -O1-LABEL: atomicrmw_fadd_float_aligned_monotonic:
-; -O1:    ldxr w8, [x0]
-; -O1:    stxr w9, w8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fadd_float_aligned_acquire:
-; -O0:    ldaxr w0, [x9]
-; -O0:    cmp w0, w10
-; -O0:    stlxr w8, w11, [x9]
-; -O0:    subs w8, w0, w8
-;
-; -O1-LABEL: atomicrmw_fadd_float_aligned_acquire:
-; -O1:    ldaxr w8, [x0]
-; -O1:    stxr w9, w8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fadd_float_aligned_release:
-; -O0:    ldaxr w0, [x9]
-; -O0:    cmp w0, w10
-; -O0:    stlxr w8, w11, [x9]
-; -O0:    subs w8, w0, w8
-;
-; -O1-LABEL: atomicrmw_fadd_float_aligned_release:
-; -O1:    ldxr w8, [x0]
-; -O1:    stlxr w9, w8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fadd_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_fadd_float_aligned_acq_rel:
-; -O1:    ldaxr w8, [x0]
-; -O1:    stlxr w9, w8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fadd_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_fadd_float_aligned_seq_cst:
-; -O1:    ldaxr w8, [x0]
-; -O1:    stlxr w9, w8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fadd_double_aligned_monotonic:
-; -O0:    ldaxr x0, [x9]
-; -O0:    cmp x0, x10
-; -O0:    stlxr w8, x11, [x9]
-; -O0:    subs x8, x0, x8
-;
-; -O1-LABEL: atomicrmw_fadd_double_aligned_monotonic:
-; -O1:    ldxr x8, [x0]
-; -O1:    stxr w9, x8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fadd_double_aligned_acquire:
-; -O0:    ldaxr x0, [x9]
-; -O0:    cmp x0, x10
-; -O0:    stlxr w8, x11, [x9]
-; -O0:    subs x8, x0, x8
-;
-; -O1-LABEL: atomicrmw_fadd_double_aligned_acquire:
-; -O1:    ldaxr x8, [x0]
-; -O1:    stxr w9, x8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fadd_double_aligned_release:
-; -O0:    ldaxr x0, [x9]
-; -O0:    cmp x0, x10
-; -O0:    stlxr w8, x11, [x9]
-; -O0:    subs x8, x0, x8
-;
-; -O1-LABEL: atomicrmw_fadd_double_aligned_release:
-; -O1:    ldxr x8, [x0]
-; -O1:    stlxr w9, x8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fadd_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_fadd_double_aligned_acq_rel:
-; -O1:    ldaxr x8, [x0]
-; -O1:    stlxr w9, x8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fadd_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_fadd_double_aligned_seq_cst:
-; -O1:    ldaxr x8, [x0]
-; -O1:    stlxr w9, x8, [x0]
+; 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
 }
@@ -343,76 +143,6 @@ define dso_local half @atomicrmw_fadd_half_unaligned_seq_cst(ptr %ptr, half %val
     ret half %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 float @atomicrmw_fadd_float_unaligned_monotonic(ptr %ptr, float %value) {
 ; CHECK-LABEL: atomicrmw_fadd_float_unaligned_monotonic:
 ; CHECK:    bl __atomic_compare_exchange
@@ -553,101 +283,6 @@ define dso_local half @atomicrmw_fsub_half_aligned_seq_cst(ptr %ptr, half %value
     ret half %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 2
-    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 2
-    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 2
-    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 2
-    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 2
-    ret bfloat %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]
@@ -823,76 +458,6 @@ define dso_local half @atomicrmw_fsub_half_unaligned_seq_cst(ptr %ptr, half %val
     ret half %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 float @atomicrmw_fsub_float_unaligned_monotonic(ptr %ptr, float %value) {
 ; CHECK-LABEL: atomicrmw_fsub_float_unaligned_monotonic:
 ; CHECK:    bl __atomic_compare_exchange
@@ -964,306 +529,106 @@ 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) {
-; -O0-LABEL: atomicrmw_fmax_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_fmax_half_aligned_monotonic:
-; -O1:    ldxrh w8, [x0]
-; -O1:    stxrh w9, w8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fmax_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_fmax_half_aligned_acquire:
-; -O1:    ldaxrh w8, [x0]
-; -O1:    stxrh w9, w8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fmax_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_fmax_half_aligned_release:
-; -O1:    ldxrh w8, [x0]
-; -O1:    stlxrh w9, w8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fmax_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_fmax_half_aligned_acq_rel:
-; -O1:    ldaxrh w8, [x0]
-; -O1:    stlxrh w9, w8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fmax_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_fmax_half_aligned_seq_cst:
-; -O1:    ldaxrh w8, [x0]
-; -O1:    stlxrh w9, w8, [x0]
+; 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 bfloat @atomicrmw_fmax_bfloat_aligned_monotonic(ptr %ptr, bfloat %value) {
-; -O0-LABEL: atomicrmw_fmax_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_fmax_bfloat_aligned_monotonic:
-; -O1:    ldxrh w9, [x0]
-; -O1:    add w9, w9, w8
-; -O1:    add w9, w10, w9
-; -O1:    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) {
-; -O0-LABEL: atomicrmw_fmax_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_fmax_bfloat_aligned_acquire:
-; -O1:    ldaxrh w9, [x0]
-; -O1:    add w9, w9, w8
-; -O1:    add w9, w10, w9
-; -O1:    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) {
-; -O0-LABEL: atomicrmw_fmax_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_fmax_bfloat_aligned_release:
-; -O1:    ldxrh w9, [x0]
-; -O1:    add w9, w9, w8
-; -O1:    add w9, w10, w9
-; -O1:    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) {
-; -O0-LABEL: atomicrmw_fmax_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_fmax_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 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) {
-; -O0-LABEL: atomicrmw_fmax_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_fmax_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 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) {
-; -O0-LABEL: atomicrmw_fmax_float_aligned_monotonic:
-; -O0:    ldaxr w0, [x9]
-; -O0:    cmp w0, w10
-; -O0:    stlxr w8, w11, [x9]
-; -O0:    subs w8, w0, w8
-;
-; -O1-LABEL: atomicrmw_fmax_float_aligned_monotonic:
-; -O1:    ldxr w8, [x0]
-; -O1:    stxr w9, w8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fmax_float_aligned_acquire:
-; -O0:    ldaxr w0, [x9]
-; -O0:    cmp w0, w10
-; -O0:    stlxr w8, w11, [x9]
-; -O0:    subs w8, w0, w8
-;
-; -O1-LABEL: atomicrmw_fmax_float_aligned_acquire:
-; -O1:    ldaxr w8, [x0]
-; -O1:    stxr w9, w8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fmax_float_aligned_release:
-; -O0:    ldaxr w0, [x9]
-; -O0:    cmp w0, w10
-; -O0:    stlxr w8, w11, [x9]
-; -O0:    subs w8, w0, w8
-;
-; -O1-LABEL: atomicrmw_fmax_float_aligned_release:
-; -O1:    ldxr w8, [x0]
-; -O1:    stlxr w9, w8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fmax_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_fmax_float_aligned_acq_rel:
-; -O1:    ldaxr w8, [x0]
-; -O1:    stlxr w9, w8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fmax_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_fmax_float_aligned_seq_cst:
-; -O1:    ldaxr w8, [x0]
-; -O1:    stlxr w9, w8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fmax_double_aligned_monotonic:
-; -O0:    ldaxr x0, [x9]
-; -O0:    cmp x0, x10
-; -O0:    stlxr w8, x11, [x9]
-; -O0:    subs x8, x0, x8
-;
-; -O1-LABEL: atomicrmw_fmax_double_aligned_monotonic:
-; -O1:    ldxr x8, [x0]
-; -O1:    stxr w9, x8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fmax_double_aligned_acquire:
-; -O0:    ldaxr x0, [x9]
-; -O0:    cmp x0, x10
-; -O0:    stlxr w8, x11, [x9]
-; -O0:    subs x8, x0, x8
-;
-; -O1-LABEL: atomicrmw_fmax_double_aligned_acquire:
-; -O1:    ldaxr x8, [x0]
-; -O1:    stxr w9, x8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fmax_double_aligned_release:
-; -O0:    ldaxr x0, [x9]
-; -O0:    cmp x0, x10
-; -O0:    stlxr w8, x11, [x9]
-; -O0:    subs x8, x0, x8
-;
-; -O1-LABEL: atomicrmw_fmax_double_aligned_release:
-; -O1:    ldxr x8, [x0]
-; -O1:    stlxr w9, x8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fmax_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_fmax_double_aligned_acq_rel:
-; -O1:    ldaxr x8, [x0]
-; -O1:    stlxr w9, x8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fmax_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_fmax_double_aligned_seq_cst:
-; -O1:    ldaxr x8, [x0]
-; -O1:    stlxr w9, x8, [x0]
+; 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
 }
@@ -1303,76 +668,6 @@ define dso_local half @atomicrmw_fmax_half_unaligned_seq_cst(ptr %ptr, half %val
     ret half %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 float @atomicrmw_fmax_float_unaligned_monotonic(ptr %ptr, float %value) {
 ; CHECK-LABEL: atomicrmw_fmax_float_unaligned_monotonic:
 ; CHECK:    bl __atomic_compare_exchange
@@ -1444,306 +739,106 @@ 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) {
-; -O0-LABEL: atomicrmw_fmin_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_fmin_half_aligned_monotonic:
-; -O1:    ldxrh w8, [x0]
-; -O1:    stxrh w9, w8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fmin_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_fmin_half_aligned_acquire:
-; -O1:    ldaxrh w8, [x0]
-; -O1:    stxrh w9, w8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fmin_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_fmin_half_aligned_release:
-; -O1:    ldxrh w8, [x0]
-; -O1:    stlxrh w9, w8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fmin_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_fmin_half_aligned_acq_rel:
-; -O1:    ldaxrh w8, [x0]
-; -O1:    stlxrh w9, w8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fmin_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_fmin_half_aligned_seq_cst:
-; -O1:    ldaxrh w8, [x0]
-; -O1:    stlxrh w9, w8, [x0]
+; 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 bfloat @atomicrmw_fmin_bfloat_aligned_monotonic(ptr %ptr, bfloat %value) {
-; -O0-LABEL: atomicrmw_fmin_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_fmin_bfloat_aligned_monotonic:
-; -O1:    ldxrh w9, [x0]
-; -O1:    add w9, w9, w8
-; -O1:    add w9, w10, w9
-; -O1:    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) {
-; -O0-LABEL: atomicrmw_fmin_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_fmin_bfloat_aligned_acquire:
-; -O1:    ldaxrh w9, [x0]
-; -O1:    add w9, w9, w8
-; -O1:    add w9, w10, w9
-; -O1:    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) {
-; -O0-LABEL: atomicrmw_fmin_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_fmin_bfloat_aligned_release:
-; -O1:    ldxrh w9, [x0]
-; -O1:    add w9, w9, w8
-; -O1:    add w9, w10, w9
-; -O1:    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) {
-; -O0-LABEL: atomicrmw_fmin_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_fmin_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 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) {
-; -O0-LABEL: atomicrmw_fmin_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_fmin_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 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) {
-; -O0-LABEL: atomicrmw_fmin_float_aligned_monotonic:
-; -O0:    ldaxr w0, [x9]
-; -O0:    cmp w0, w10
-; -O0:    stlxr w8, w11, [x9]
-; -O0:    subs w8, w0, w8
-;
-; -O1-LABEL: atomicrmw_fmin_float_aligned_monotonic:
-; -O1:    ldxr w8, [x0]
-; -O1:    stxr w9, w8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fmin_float_aligned_acquire:
-; -O0:    ldaxr w0, [x9]
-; -O0:    cmp w0, w10
-; -O0:    stlxr w8, w11, [x9]
-; -O0:    subs w8, w0, w8
-;
-; -O1-LABEL: atomicrmw_fmin_float_aligned_acquire:
-; -O1:    ldaxr w8, [x0]
-; -O1:    stxr w9, w8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fmin_float_aligned_release:
-; -O0:    ldaxr w0, [x9]
-; -O0:    cmp w0, w10
-; -O0:    stlxr w8, w11, [x9]
-; -O0:    subs w8, w0, w8
-;
-; -O1-LABEL: atomicrmw_fmin_float_aligned_release:
-; -O1:    ldxr w8, [x0]
-; -O1:    stlxr w9, w8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fmin_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_fmin_float_aligned_acq_rel:
-; -O1:    ldaxr w8, [x0]
-; -O1:    stlxr w9, w8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fmin_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_fmin_float_aligned_seq_cst:
-; -O1:    ldaxr w8, [x0]
-; -O1:    stlxr w9, w8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fmin_double_aligned_monotonic:
-; -O0:    ldaxr x0, [x9]
-; -O0:    cmp x0, x10
-; -O0:    stlxr w8, x11, [x9]
-; -O0:    subs x8, x0, x8
-;
-; -O1-LABEL: atomicrmw_fmin_double_aligned_monotonic:
-; -O1:    ldxr x8, [x0]
-; -O1:    stxr w9, x8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fmin_double_aligned_acquire:
-; -O0:    ldaxr x0, [x9]
-; -O0:    cmp x0, x10
-; -O0:    stlxr w8, x11, [x9]
-; -O0:    subs x8, x0, x8
-;
-; -O1-LABEL: atomicrmw_fmin_double_aligned_acquire:
-; -O1:    ldaxr x8, [x0]
-; -O1:    stxr w9, x8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fmin_double_aligned_release:
-; -O0:    ldaxr x0, [x9]
-; -O0:    cmp x0, x10
-; -O0:    stlxr w8, x11, [x9]
-; -O0:    subs x8, x0, x8
-;
-; -O1-LABEL: atomicrmw_fmin_double_aligned_release:
-; -O1:    ldxr x8, [x0]
-; -O1:    stlxr w9, x8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fmin_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_fmin_double_aligned_acq_rel:
-; -O1:    ldaxr x8, [x0]
-; -O1:    stlxr w9, x8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fmin_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_fmin_double_aligned_seq_cst:
-; -O1:    ldaxr x8, [x0]
-; -O1:    stlxr w9, x8, [x0]
+; 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
 }
@@ -1783,76 +878,6 @@ define dso_local half @atomicrmw_fmin_half_unaligned_seq_cst(ptr %ptr, half %val
     ret half %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 float @atomicrmw_fmin_float_unaligned_monotonic(ptr %ptr, float %value) {
 ; CHECK-LABEL: atomicrmw_fmin_float_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 6c46407177297..d6ae20f4f18a1 100644
--- a/llvm/test/CodeGen/AArch64/Atomics/aarch64_be-atomicrmw-lsfe.ll
+++ b/llvm/test/CodeGen/AArch64/Atomics/aarch64_be-atomicrmw-lsfe.ll
@@ -4,321 +4,106 @@
 ; 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) {
-; -O0-LABEL: atomicrmw_fadd_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_fadd_half_aligned_monotonic:
-; -O1:    ldxrh w8, [x0]
-; -O1:    stxrh w9, w8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fadd_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_fadd_half_aligned_acquire:
-; -O1:    ldaxrh w8, [x0]
-; -O1:    stxrh w9, w8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fadd_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_fadd_half_aligned_release:
-; -O1:    ldxrh w8, [x0]
-; -O1:    stlxrh w9, w8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fadd_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_fadd_half_aligned_acq_rel:
-; -O1:    ldaxrh w8, [x0]
-; -O1:    stlxrh w9, w8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fadd_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_fadd_half_aligned_seq_cst:
-; -O1:    ldaxrh w8, [x0]
-; -O1:    stlxrh w9, w8, [x0]
+; 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 bfloat @atomicrmw_fadd_bfloat_aligned_monotonic(ptr %ptr, bfloat %value) {
-; -O0-LABEL: atomicrmw_fadd_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_fadd_bfloat_aligned_monotonic:
-; -O1:    ldxrh w9, [x0]
-; -O1:    add w9, w9, w8
-; -O1:    add w9, w10, w9
-; -O1:    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) {
-; -O0-LABEL: atomicrmw_fadd_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_fadd_bfloat_aligned_acquire:
-; -O1:    ldaxrh w9, [x0]
-; -O1:    add w9, w9, w8
-; -O1:    add w9, w10, w9
-; -O1:    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) {
-; -O0-LABEL: atomicrmw_fadd_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_fadd_bfloat_aligned_release:
-; -O1:    ldxrh w9, [x0]
-; -O1:    add w9, w9, w8
-; -O1:    add w9, w10, w9
-; -O1:    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) {
-; -O0-LABEL: atomicrmw_fadd_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_fadd_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 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) {
-; -O0-LABEL: atomicrmw_fadd_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_fadd_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 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) {
-; -O0-LABEL: atomicrmw_fadd_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_fadd_float_aligned_monotonic:
-; -O1:    ldxr w8, [x0]
-; -O1:    stxr w9, w8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fadd_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_fadd_float_aligned_acquire:
-; -O1:    ldaxr w8, [x0]
-; -O1:    stxr w9, w8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fadd_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_fadd_float_aligned_release:
-; -O1:    ldxr w8, [x0]
-; -O1:    stlxr w9, w8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fadd_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_fadd_float_aligned_acq_rel:
-; -O1:    ldaxr w8, [x0]
-; -O1:    stlxr w9, w8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fadd_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_fadd_float_aligned_seq_cst:
-; -O1:    ldaxr w8, [x0]
-; -O1:    stlxr w9, w8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fadd_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_fadd_double_aligned_monotonic:
-; -O1:    ldxr x8, [x0]
-; -O1:    stxr w9, x8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fadd_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_fadd_double_aligned_acquire:
-; -O1:    ldaxr x8, [x0]
-; -O1:    stxr w9, x8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fadd_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_fadd_double_aligned_release:
-; -O1:    ldxr x8, [x0]
-; -O1:    stlxr w9, x8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fadd_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_fadd_double_aligned_acq_rel:
-; -O1:    ldaxr x8, [x0]
-; -O1:    stlxr w9, x8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fadd_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_fadd_double_aligned_seq_cst:
-; -O1:    ldaxr x8, [x0]
-; -O1:    stlxr w9, x8, [x0]
+; 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
 }
@@ -358,76 +143,6 @@ define dso_local half @atomicrmw_fadd_half_unaligned_seq_cst(ptr %ptr, half %val
     ret half %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 float @atomicrmw_fadd_float_unaligned_monotonic(ptr %ptr, float %value) {
 ; CHECK-LABEL: atomicrmw_fadd_float_unaligned_monotonic:
 ; CHECK:    bl __atomic_compare_exchange
@@ -573,101 +288,6 @@ define dso_local half @atomicrmw_fsub_half_aligned_seq_cst(ptr %ptr, half %value
     ret half %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 2
-    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 2
-    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 2
-    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 2
-    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 2
-    ret bfloat %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]
@@ -853,76 +473,6 @@ define dso_local half @atomicrmw_fsub_half_unaligned_seq_cst(ptr %ptr, half %val
     ret half %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 float @atomicrmw_fsub_float_unaligned_monotonic(ptr %ptr, float %value) {
 ; CHECK-LABEL: atomicrmw_fsub_float_unaligned_monotonic:
 ; CHECK:    bl __atomic_compare_exchange
@@ -994,321 +544,106 @@ 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) {
-; -O0-LABEL: atomicrmw_fmax_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_fmax_half_aligned_monotonic:
-; -O1:    ldxrh w8, [x0]
-; -O1:    stxrh w9, w8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fmax_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_fmax_half_aligned_acquire:
-; -O1:    ldaxrh w8, [x0]
-; -O1:    stxrh w9, w8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fmax_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_fmax_half_aligned_release:
-; -O1:    ldxrh w8, [x0]
-; -O1:    stlxrh w9, w8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fmax_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_fmax_half_aligned_acq_rel:
-; -O1:    ldaxrh w8, [x0]
-; -O1:    stlxrh w9, w8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fmax_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_fmax_half_aligned_seq_cst:
-; -O1:    ldaxrh w8, [x0]
-; -O1:    stlxrh w9, w8, [x0]
+; 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 bfloat @atomicrmw_fmax_bfloat_aligned_monotonic(ptr %ptr, bfloat %value) {
-; -O0-LABEL: atomicrmw_fmax_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_fmax_bfloat_aligned_monotonic:
-; -O1:    ldxrh w9, [x0]
-; -O1:    add w9, w9, w8
-; -O1:    add w9, w10, w9
-; -O1:    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) {
-; -O0-LABEL: atomicrmw_fmax_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_fmax_bfloat_aligned_acquire:
-; -O1:    ldaxrh w9, [x0]
-; -O1:    add w9, w9, w8
-; -O1:    add w9, w10, w9
-; -O1:    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) {
-; -O0-LABEL: atomicrmw_fmax_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_fmax_bfloat_aligned_release:
-; -O1:    ldxrh w9, [x0]
-; -O1:    add w9, w9, w8
-; -O1:    add w9, w10, w9
-; -O1:    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) {
-; -O0-LABEL: atomicrmw_fmax_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_fmax_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 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) {
-; -O0-LABEL: atomicrmw_fmax_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_fmax_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 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) {
-; -O0-LABEL: atomicrmw_fmax_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_fmax_float_aligned_monotonic:
-; -O1:    ldxr w8, [x0]
-; -O1:    stxr w9, w8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fmax_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_fmax_float_aligned_acquire:
-; -O1:    ldaxr w8, [x0]
-; -O1:    stxr w9, w8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fmax_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_fmax_float_aligned_release:
-; -O1:    ldxr w8, [x0]
-; -O1:    stlxr w9, w8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fmax_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_fmax_float_aligned_acq_rel:
-; -O1:    ldaxr w8, [x0]
-; -O1:    stlxr w9, w8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fmax_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_fmax_float_aligned_seq_cst:
-; -O1:    ldaxr w8, [x0]
-; -O1:    stlxr w9, w8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fmax_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_fmax_double_aligned_monotonic:
-; -O1:    ldxr x8, [x0]
-; -O1:    stxr w9, x8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fmax_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_fmax_double_aligned_acquire:
-; -O1:    ldaxr x8, [x0]
-; -O1:    stxr w9, x8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fmax_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_fmax_double_aligned_release:
-; -O1:    ldxr x8, [x0]
-; -O1:    stlxr w9, x8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fmax_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_fmax_double_aligned_acq_rel:
-; -O1:    ldaxr x8, [x0]
-; -O1:    stlxr w9, x8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fmax_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_fmax_double_aligned_seq_cst:
-; -O1:    ldaxr x8, [x0]
-; -O1:    stlxr w9, x8, [x0]
+; 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
 }
@@ -1348,76 +683,6 @@ define dso_local half @atomicrmw_fmax_half_unaligned_seq_cst(ptr %ptr, half %val
     ret half %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 float @atomicrmw_fmax_float_unaligned_monotonic(ptr %ptr, float %value) {
 ; CHECK-LABEL: atomicrmw_fmax_float_unaligned_monotonic:
 ; CHECK:    bl __atomic_compare_exchange
@@ -1489,321 +754,106 @@ 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) {
-; -O0-LABEL: atomicrmw_fmin_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_fmin_half_aligned_monotonic:
-; -O1:    ldxrh w8, [x0]
-; -O1:    stxrh w9, w8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fmin_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_fmin_half_aligned_acquire:
-; -O1:    ldaxrh w8, [x0]
-; -O1:    stxrh w9, w8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fmin_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_fmin_half_aligned_release:
-; -O1:    ldxrh w8, [x0]
-; -O1:    stlxrh w9, w8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fmin_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_fmin_half_aligned_acq_rel:
-; -O1:    ldaxrh w8, [x0]
-; -O1:    stlxrh w9, w8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fmin_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_fmin_half_aligned_seq_cst:
-; -O1:    ldaxrh w8, [x0]
-; -O1:    stlxrh w9, w8, [x0]
+; 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 bfloat @atomicrmw_fmin_bfloat_aligned_monotonic(ptr %ptr, bfloat %value) {
-; -O0-LABEL: atomicrmw_fmin_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_fmin_bfloat_aligned_monotonic:
-; -O1:    ldxrh w9, [x0]
-; -O1:    add w9, w9, w8
-; -O1:    add w9, w10, w9
-; -O1:    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) {
-; -O0-LABEL: atomicrmw_fmin_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_fmin_bfloat_aligned_acquire:
-; -O1:    ldaxrh w9, [x0]
-; -O1:    add w9, w9, w8
-; -O1:    add w9, w10, w9
-; -O1:    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) {
-; -O0-LABEL: atomicrmw_fmin_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_fmin_bfloat_aligned_release:
-; -O1:    ldxrh w9, [x0]
-; -O1:    add w9, w9, w8
-; -O1:    add w9, w10, w9
-; -O1:    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) {
-; -O0-LABEL: atomicrmw_fmin_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_fmin_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 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) {
-; -O0-LABEL: atomicrmw_fmin_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_fmin_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 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) {
-; -O0-LABEL: atomicrmw_fmin_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_fmin_float_aligned_monotonic:
-; -O1:    ldxr w8, [x0]
-; -O1:    stxr w9, w8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fmin_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_fmin_float_aligned_acquire:
-; -O1:    ldaxr w8, [x0]
-; -O1:    stxr w9, w8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fmin_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_fmin_float_aligned_release:
-; -O1:    ldxr w8, [x0]
-; -O1:    stlxr w9, w8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fmin_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_fmin_float_aligned_acq_rel:
-; -O1:    ldaxr w8, [x0]
-; -O1:    stlxr w9, w8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fmin_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_fmin_float_aligned_seq_cst:
-; -O1:    ldaxr w8, [x0]
-; -O1:    stlxr w9, w8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fmin_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_fmin_double_aligned_monotonic:
-; -O1:    ldxr x8, [x0]
-; -O1:    stxr w9, x8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fmin_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_fmin_double_aligned_acquire:
-; -O1:    ldaxr x8, [x0]
-; -O1:    stxr w9, x8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fmin_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_fmin_double_aligned_release:
-; -O1:    ldxr x8, [x0]
-; -O1:    stlxr w9, x8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fmin_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_fmin_double_aligned_acq_rel:
-; -O1:    ldaxr x8, [x0]
-; -O1:    stlxr w9, x8, [x0]
+; 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) {
-; -O0-LABEL: atomicrmw_fmin_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_fmin_double_aligned_seq_cst:
-; -O1:    ldaxr x8, [x0]
-; -O1:    stlxr w9, x8, [x0]
+; 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
 }
@@ -1843,76 +893,6 @@ define dso_local half @atomicrmw_fmin_half_unaligned_seq_cst(ptr %ptr, half %val
     ret half %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 float @atomicrmw_fmin_float_unaligned_monotonic(ptr %ptr, float %value) {
 ; CHECK-LABEL: atomicrmw_fmin_float_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 f40bbaeb930c0..23f8181a2f575 100755
--- a/llvm/test/CodeGen/AArch64/Atomics/generate-tests.py
+++ b/llvm/test/CodeGen/AArch64/Atomics/generate-tests.py
@@ -41,6 +41,20 @@ def __iter__(self):
 # fmt: on
 
 
+# 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
@@ -123,6 +137,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
@@ -140,6 +155,8 @@ def mattr(self):
             return "+lse2,+rcpc3"
         if self == Feature.lse2_lse128:
             return "+lse2,+lse128"
+        if self == Feature.lsfe:
+            return "+lsfe"
         return "+" + self.name
 
 
@@ -180,24 +197,10 @@ def mattr(self):
 ]
 
 
-def relpath():
-    # __file__ changed to return absolute path in Python 3.9. Print only
-    # up to llvm-project (6 levels higher), to avoid unnecessary diffs and
-    # revealing directory structure of people running this script
-    top = "../" * 6
-    fp = os.path.relpath(__file__, os.path.abspath(os.path.join(__file__, top)))
-    return fp
-
-
-def align(val, aligned: bool) -> int:
-    return val if aligned else 1
-
-
 def all_atomicrmw(f, datatype, atomicrmw_ops):
     for op in atomicrmw_ops:
         for aligned in Aligned:
-            for ty, val in datatype:
-                alignval = align(val, aligned)
+            for ty in datatype:
                 for ordering in ATOMICRMW_ORDERS:
                     name = f"atomicrmw_{op}_{ty}_{aligned}_{ordering}"
                     instr = "atomicrmw"
@@ -340,10 +343,13 @@ def write_lit_tests(feature, datatypes, ops):
             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, datatypes, ops)
+                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 feature.test_scope() == "atomicrmw":
+            if feat == Feature.lsfe:
                 continue
 
             with open(f"{triple}-cmpxchg-{feat.name}.ll", "w") as f:

>From b4c487ac6266e0753d98c165ef53bcff08702009 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/4] 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 |  57 +-
 7 files changed, 1060 insertions(+), 96 deletions(-)

diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
index 5379b78d01879..413e50b129e19 100644
--- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
+++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
@@ -979,14 +979,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 045bebf15a701..2d7a9d6f00bd0 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 0b73eaba98112..cb80e432f5c74 100644
--- a/llvm/lib/Target/AArch64/AArch64InstrFormats.td
+++ b/llvm/lib/Target/AArch64/AArch64InstrFormats.td
@@ -12509,6 +12509,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 658ac7490eb33..b41a56c60b4f1 100644
--- a/llvm/lib/Target/AArch64/AArch64InstrInfo.td
+++ b/llvm/lib/Target/AArch64/AArch64InstrInfo.td
@@ -10546,7 +10546,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 3d6ad81ea674c..666501c937e65 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 d6ae20f4f18a1..8a0a92dee0b2e 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 23f8181a2f575..38da839e9da76 100755
--- a/llvm/test/CodeGen/AArch64/Atomics/generate-tests.py
+++ b/llvm/test/CodeGen/AArch64/Atomics/generate-tests.py
@@ -14,45 +14,37 @@
 ]
 
 
-class ByteSizes:
-    def __init__(self, pairs):
-        if not isinstance(pairs, list):
-            raise ValueError("Must init with a list of key-value pairs")
+class byteSizes:
+    def __init__(self):
+        self._data = {}
 
-        self._data = pairs[:]
-
-    def __iter__(self):
-        return iter(self._data)
+    def __setitem__(self, k, v):
+        self._data[k] = v
 
+    def __getitem__(self, k):
+        return self._data[k]
 
-# fmt: off
-Type = ByteSizes([
-   ("i8",   1),
-   ("i16",  2),
-   ("i32",  4),
-   ("i64",  8),
-   ("i128", 16)])
+    def __iter__(self):
+        return iter(self._data.items())
 
-FPType = ByteSizes([
-   ("half",   2),
-   ("bfloat", 2),
-   ("float",  4),
-   ("double", 8)])
-# fmt: on
 
+def align(val, aligned: bool) -> int:
+    return val if aligned else 1
 
-# 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
+# Value is the size in bytes
+Type = byteSizes()
+Type["i8"] = 1
+Type["i16"] = 2
+Type["i32"] = 4
+Type["i64"] = 8
+Type["i128"] = 16
 
-    def __str__(self) -> str:
-        return self.name
+FPType = byteSizes()
+FPType["half"] = 2
+FPType["float"] = 4
+FPType["bfloat"] = 4
+FPType["double"] = 8
 
 
 # Is this an aligned or unaligned access?
@@ -200,7 +192,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"

>From a26c56045567389a643a7c65a21c00f20826ecd1 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/4] 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 666501c937e65..4ea9e8a83a4dd 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 8a0a92dee0b2e..d4bacc2576256 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 38da839e9da76..09a407f418a53 100755
--- a/llvm/test/CodeGen/AArch64/Atomics/generate-tests.py
+++ b/llvm/test/CodeGen/AArch64/Atomics/generate-tests.py
@@ -14,37 +14,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?
@@ -129,7 +112,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
@@ -147,8 +129,6 @@ def mattr(self):
             return "+lse2,+rcpc3"
         if self == Feature.lse2_lse128:
             return "+lse2,+lse128"
-        if self == Feature.lsfe:
-            return "+lsfe"
         return "+" + self.name
 
 
@@ -181,19 +161,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"
@@ -201,7 +173,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
                         }}
                     """
@@ -211,8 +183,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}"
@@ -224,7 +195,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
                         }}
                     """
@@ -234,8 +205,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"
@@ -243,7 +213,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
                     }}
                 """
@@ -253,8 +223,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]:
@@ -267,7 +236,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
                             }}
@@ -336,14 +305,7 @@ def write_lit_tests(feature, datatypes, ops):
             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)"'

>From e9b5c3ff4447ec5700c8c3dd8ad04d80c2fbd920 Mon Sep 17 00:00:00 2001
From: Jonathan Thackray <jonathan.thackray at arm.com>
Date: Wed, 12 Feb 2025 10:11:59 +0000
Subject: [PATCH 4/4] fixup! Test changes after generate-tests.py modified

---
 .../AArch64/Atomics/aarch64-atomicrmw-lsfe.ll | 641 ------------------
 .../Atomics/aarch64_be-atomicrmw-lsfe.ll      | 641 ------------------
 .../CodeGen/AArch64/Atomics/generate-tests.py |  87 ++-
 3 files changed, 63 insertions(+), 1306 deletions(-)

diff --git a/llvm/test/CodeGen/AArch64/Atomics/aarch64-atomicrmw-lsfe.ll b/llvm/test/CodeGen/AArch64/Atomics/aarch64-atomicrmw-lsfe.ll
index 4ea9e8a83a4dd..fc9a126f79a83 100644
--- a/llvm/test/CodeGen/AArch64/Atomics/aarch64-atomicrmw-lsfe.ll
+++ b/llvm/test/CodeGen/AArch64/Atomics/aarch64-atomicrmw-lsfe.ll
@@ -2,15 +2,10 @@
 ; 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
 }
@@ -18,10 +13,6 @@ 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
 }
@@ -29,10 +20,6 @@ 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
 }
@@ -40,10 +27,6 @@ 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
 }
@@ -51,10 +34,6 @@ 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
 }
@@ -62,12 +41,6 @@ define dso_local half @atomicrmw_fadd_half_aligned_seq_cst(ptr %ptr, half %value
 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
 }
@@ -75,12 +48,6 @@ define dso_local bfloat @atomicrmw_fadd_bfloat_aligned_monotonic(ptr %ptr, bfloa
 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
 }
@@ -88,12 +55,6 @@ define dso_local bfloat @atomicrmw_fadd_bfloat_aligned_acquire(ptr %ptr, bfloat
 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
 }
@@ -101,12 +62,6 @@ define dso_local bfloat @atomicrmw_fadd_bfloat_aligned_release(ptr %ptr, bfloat
 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
 }
@@ -114,12 +69,6 @@ define dso_local bfloat @atomicrmw_fadd_bfloat_aligned_acq_rel(ptr %ptr, bfloat
 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
 }
@@ -127,10 +76,6 @@ define dso_local bfloat @atomicrmw_fadd_bfloat_aligned_seq_cst(ptr %ptr, bfloat
 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
 }
@@ -138,10 +83,6 @@ 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
 }
@@ -149,10 +90,6 @@ 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
 }
@@ -160,10 +97,6 @@ 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
 }
@@ -171,10 +104,6 @@ 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
 }
@@ -182,10 +111,6 @@ define dso_local float @atomicrmw_fadd_float_aligned_seq_cst(ptr %ptr, float %va
 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
 }
@@ -193,10 +118,6 @@ 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
 }
@@ -204,10 +125,6 @@ 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
 }
@@ -215,10 +132,6 @@ 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
 }
@@ -226,10 +139,6 @@ 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
 }
@@ -237,9 +146,6 @@ 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
 }
@@ -247,9 +153,6 @@ 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
 }
@@ -257,9 +160,6 @@ 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
 }
@@ -267,9 +167,6 @@ 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
 }
@@ -277,9 +174,6 @@ 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
 }
@@ -294,11 +188,6 @@ 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
 }
@@ -313,11 +202,6 @@ 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
 }
@@ -332,11 +216,6 @@ 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
 }
@@ -351,11 +230,6 @@ 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
 }
@@ -370,11 +244,6 @@ 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
 }
@@ -382,9 +251,6 @@ define dso_local bfloat @atomicrmw_fadd_bfloat_unaligned_seq_cst(ptr %ptr, bfloa
 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
 }
@@ -392,9 +258,6 @@ define dso_local float @atomicrmw_fadd_float_unaligned_monotonic(ptr %ptr, float
 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
 }
@@ -402,9 +265,6 @@ define dso_local float @atomicrmw_fadd_float_unaligned_acquire(ptr %ptr, float %
 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
 }
@@ -412,9 +272,6 @@ define dso_local float @atomicrmw_fadd_float_unaligned_release(ptr %ptr, float %
 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
 }
@@ -422,9 +279,6 @@ define dso_local float @atomicrmw_fadd_float_unaligned_acq_rel(ptr %ptr, float %
 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
 }
@@ -432,9 +286,6 @@ define dso_local float @atomicrmw_fadd_float_unaligned_seq_cst(ptr %ptr, float %
 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
 }
@@ -442,9 +293,6 @@ 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
 }
@@ -452,9 +300,6 @@ 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
 }
@@ -462,9 +307,6 @@ 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
 }
@@ -472,9 +314,6 @@ 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
 }
@@ -489,10 +328,6 @@ 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
 }
@@ -507,10 +342,6 @@ 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
 }
@@ -525,10 +356,6 @@ 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
 }
@@ -543,10 +370,6 @@ 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
 }
@@ -561,10 +384,6 @@ 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
 }
@@ -584,12 +403,6 @@ 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]
-;
-; 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
 }
@@ -609,12 +422,6 @@ 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]
-;
-; 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
 }
@@ -634,12 +441,6 @@ 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]
-;
-; 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
 }
@@ -659,12 +460,6 @@ 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]
-;
-; 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
 }
@@ -684,12 +479,6 @@ 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]
-;
-; 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
 }
@@ -704,10 +493,6 @@ define dso_local float @atomicrmw_fsub_float_aligned_monotonic(ptr %ptr, float %
 ; -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
 }
@@ -722,10 +507,6 @@ define dso_local float @atomicrmw_fsub_float_aligned_acquire(ptr %ptr, float %va
 ; -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
 }
@@ -740,10 +521,6 @@ define dso_local float @atomicrmw_fsub_float_aligned_release(ptr %ptr, float %va
 ; -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
 }
@@ -758,10 +535,6 @@ define dso_local float @atomicrmw_fsub_float_aligned_acq_rel(ptr %ptr, float %va
 ; -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
 }
@@ -776,10 +549,6 @@ define dso_local float @atomicrmw_fsub_float_aligned_seq_cst(ptr %ptr, float %va
 ; -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
 }
@@ -794,10 +563,6 @@ 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
 }
@@ -812,10 +577,6 @@ 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
 }
@@ -830,10 +591,6 @@ 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
 }
@@ -848,10 +605,6 @@ 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
 }
@@ -866,10 +619,6 @@ 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
 }
@@ -877,9 +626,6 @@ 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
 }
@@ -887,9 +633,6 @@ 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
 }
@@ -897,9 +640,6 @@ 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
 }
@@ -907,9 +647,6 @@ 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
 }
@@ -917,9 +654,6 @@ 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
 }
@@ -934,11 +668,6 @@ 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
 }
@@ -953,11 +682,6 @@ 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
 }
@@ -972,11 +696,6 @@ 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
 }
@@ -991,11 +710,6 @@ 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
 }
@@ -1010,11 +724,6 @@ 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
 }
@@ -1022,9 +731,6 @@ define dso_local bfloat @atomicrmw_fsub_bfloat_unaligned_seq_cst(ptr %ptr, bfloa
 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
 }
@@ -1032,9 +738,6 @@ define dso_local float @atomicrmw_fsub_float_unaligned_monotonic(ptr %ptr, float
 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
 }
@@ -1042,9 +745,6 @@ define dso_local float @atomicrmw_fsub_float_unaligned_acquire(ptr %ptr, float %
 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
 }
@@ -1052,9 +752,6 @@ define dso_local float @atomicrmw_fsub_float_unaligned_release(ptr %ptr, float %
 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
 }
@@ -1062,9 +759,6 @@ define dso_local float @atomicrmw_fsub_float_unaligned_acq_rel(ptr %ptr, float %
 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
 }
@@ -1072,9 +766,6 @@ define dso_local float @atomicrmw_fsub_float_unaligned_seq_cst(ptr %ptr, float %
 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
 }
@@ -1082,9 +773,6 @@ 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
 }
@@ -1092,9 +780,6 @@ 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
 }
@@ -1102,9 +787,6 @@ 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
 }
@@ -1112,9 +794,6 @@ 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
 }
@@ -1122,10 +801,6 @@ 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
 }
@@ -1133,10 +808,6 @@ 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
 }
@@ -1144,10 +815,6 @@ 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
 }
@@ -1155,10 +822,6 @@ 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
 }
@@ -1166,10 +829,6 @@ 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
 }
@@ -1177,12 +836,6 @@ define dso_local half @atomicrmw_fmax_half_aligned_seq_cst(ptr %ptr, half %value
 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
 }
@@ -1190,12 +843,6 @@ define dso_local bfloat @atomicrmw_fmax_bfloat_aligned_monotonic(ptr %ptr, bfloa
 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
 }
@@ -1203,12 +850,6 @@ define dso_local bfloat @atomicrmw_fmax_bfloat_aligned_acquire(ptr %ptr, bfloat
 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
 }
@@ -1216,12 +857,6 @@ define dso_local bfloat @atomicrmw_fmax_bfloat_aligned_release(ptr %ptr, bfloat
 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
 }
@@ -1229,12 +864,6 @@ define dso_local bfloat @atomicrmw_fmax_bfloat_aligned_acq_rel(ptr %ptr, bfloat
 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
 }
@@ -1242,10 +871,6 @@ define dso_local bfloat @atomicrmw_fmax_bfloat_aligned_seq_cst(ptr %ptr, bfloat
 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
 }
@@ -1253,10 +878,6 @@ 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
 }
@@ -1264,10 +885,6 @@ 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
 }
@@ -1275,10 +892,6 @@ 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
 }
@@ -1286,10 +899,6 @@ 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
 }
@@ -1297,10 +906,6 @@ define dso_local float @atomicrmw_fmax_float_aligned_seq_cst(ptr %ptr, float %va
 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
 }
@@ -1308,10 +913,6 @@ 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
 }
@@ -1319,10 +920,6 @@ 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
 }
@@ -1330,10 +927,6 @@ 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
 }
@@ -1341,10 +934,6 @@ 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
 }
@@ -1352,9 +941,6 @@ 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
 }
@@ -1362,9 +948,6 @@ define dso_local half @atomicrmw_fmax_half_unaligned_monotonic(ptr %ptr, half %v
 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
-;
-; 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
 }
@@ -1372,9 +955,6 @@ define dso_local half @atomicrmw_fmax_half_unaligned_acquire(ptr %ptr, half %val
 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
-;
-; 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
 }
@@ -1382,9 +962,6 @@ define dso_local half @atomicrmw_fmax_half_unaligned_release(ptr %ptr, half %val
 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
-;
-; 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
 }
@@ -1392,9 +969,6 @@ define dso_local half @atomicrmw_fmax_half_unaligned_acq_rel(ptr %ptr, half %val
 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
-;
-; 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
 }
@@ -1409,11 +983,6 @@ 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
 }
@@ -1428,11 +997,6 @@ 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
 }
@@ -1447,11 +1011,6 @@ 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
 }
@@ -1466,11 +1025,6 @@ 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
 }
@@ -1485,11 +1039,6 @@ 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
 }
@@ -1497,9 +1046,6 @@ define dso_local bfloat @atomicrmw_fmax_bfloat_unaligned_seq_cst(ptr %ptr, bfloa
 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
 }
@@ -1507,9 +1053,6 @@ define dso_local float @atomicrmw_fmax_float_unaligned_monotonic(ptr %ptr, float
 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
 }
@@ -1517,9 +1060,6 @@ define dso_local float @atomicrmw_fmax_float_unaligned_acquire(ptr %ptr, float %
 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
 }
@@ -1527,9 +1067,6 @@ define dso_local float @atomicrmw_fmax_float_unaligned_release(ptr %ptr, float %
 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
 }
@@ -1537,9 +1074,6 @@ define dso_local float @atomicrmw_fmax_float_unaligned_acq_rel(ptr %ptr, float %
 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
 }
@@ -1547,9 +1081,6 @@ define dso_local float @atomicrmw_fmax_float_unaligned_seq_cst(ptr %ptr, float %
 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
 }
@@ -1557,9 +1088,6 @@ 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
 }
@@ -1567,9 +1095,6 @@ 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
 }
@@ -1577,9 +1102,6 @@ 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
 }
@@ -1587,9 +1109,6 @@ 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
 }
@@ -1597,10 +1116,6 @@ 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
 }
@@ -1608,10 +1123,6 @@ 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
 }
@@ -1619,10 +1130,6 @@ 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
 }
@@ -1630,10 +1137,6 @@ 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
 }
@@ -1641,10 +1144,6 @@ 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
 }
@@ -1652,12 +1151,6 @@ define dso_local half @atomicrmw_fmin_half_aligned_seq_cst(ptr %ptr, half %value
 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
 }
@@ -1665,12 +1158,6 @@ define dso_local bfloat @atomicrmw_fmin_bfloat_aligned_monotonic(ptr %ptr, bfloa
 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
 }
@@ -1678,12 +1165,6 @@ define dso_local bfloat @atomicrmw_fmin_bfloat_aligned_acquire(ptr %ptr, bfloat
 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
 }
@@ -1691,12 +1172,6 @@ define dso_local bfloat @atomicrmw_fmin_bfloat_aligned_release(ptr %ptr, bfloat
 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
 }
@@ -1704,12 +1179,6 @@ define dso_local bfloat @atomicrmw_fmin_bfloat_aligned_acq_rel(ptr %ptr, bfloat
 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
 }
@@ -1717,10 +1186,6 @@ define dso_local bfloat @atomicrmw_fmin_bfloat_aligned_seq_cst(ptr %ptr, bfloat
 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
 }
@@ -1728,10 +1193,6 @@ 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
 }
@@ -1739,10 +1200,6 @@ 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
 }
@@ -1750,10 +1207,6 @@ 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
 }
@@ -1761,10 +1214,6 @@ 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
 }
@@ -1772,10 +1221,6 @@ define dso_local float @atomicrmw_fmin_float_aligned_seq_cst(ptr %ptr, float %va
 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
 }
@@ -1783,10 +1228,6 @@ 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
 }
@@ -1794,10 +1235,6 @@ 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
 }
@@ -1805,10 +1242,6 @@ 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
 }
@@ -1816,10 +1249,6 @@ 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
 }
@@ -1827,9 +1256,6 @@ 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
 }
@@ -1837,9 +1263,6 @@ 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
 }
@@ -1847,9 +1270,6 @@ 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
 }
@@ -1857,9 +1277,6 @@ 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
 }
@@ -1867,9 +1284,6 @@ 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
 }
@@ -1884,11 +1298,6 @@ 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
 }
@@ -1903,11 +1312,6 @@ 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
 }
@@ -1922,11 +1326,6 @@ 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
 }
@@ -1941,11 +1340,6 @@ 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
 }
@@ -1960,11 +1354,6 @@ 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
 }
@@ -1972,9 +1361,6 @@ define dso_local bfloat @atomicrmw_fmin_bfloat_unaligned_seq_cst(ptr %ptr, bfloa
 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
 }
@@ -1982,9 +1368,6 @@ define dso_local float @atomicrmw_fmin_float_unaligned_monotonic(ptr %ptr, float
 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
 }
@@ -1992,9 +1375,6 @@ define dso_local float @atomicrmw_fmin_float_unaligned_acquire(ptr %ptr, float %
 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
 }
@@ -2002,9 +1382,6 @@ define dso_local float @atomicrmw_fmin_float_unaligned_release(ptr %ptr, float %
 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
 }
@@ -2012,9 +1389,6 @@ define dso_local float @atomicrmw_fmin_float_unaligned_acq_rel(ptr %ptr, float %
 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
 }
@@ -2022,9 +1396,6 @@ define dso_local float @atomicrmw_fmin_float_unaligned_seq_cst(ptr %ptr, float %
 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
 }
@@ -2032,9 +1403,6 @@ 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
 }
@@ -2042,9 +1410,6 @@ 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
 }
@@ -2052,9 +1417,6 @@ 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
 }
@@ -2062,9 +1424,6 @@ 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 d4bacc2576256..a22cc5806d86d 100644
--- a/llvm/test/CodeGen/AArch64/Atomics/aarch64_be-atomicrmw-lsfe.ll
+++ b/llvm/test/CodeGen/AArch64/Atomics/aarch64_be-atomicrmw-lsfe.ll
@@ -2,15 +2,10 @@
 ; 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
 }
@@ -18,10 +13,6 @@ 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
 }
@@ -29,10 +20,6 @@ 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
 }
@@ -40,10 +27,6 @@ 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
 }
@@ -51,10 +34,6 @@ 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
 }
@@ -62,12 +41,6 @@ define dso_local half @atomicrmw_fadd_half_aligned_seq_cst(ptr %ptr, half %value
 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
 }
@@ -75,12 +48,6 @@ define dso_local bfloat @atomicrmw_fadd_bfloat_aligned_monotonic(ptr %ptr, bfloa
 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
 }
@@ -88,12 +55,6 @@ define dso_local bfloat @atomicrmw_fadd_bfloat_aligned_acquire(ptr %ptr, bfloat
 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
 }
@@ -101,12 +62,6 @@ define dso_local bfloat @atomicrmw_fadd_bfloat_aligned_release(ptr %ptr, bfloat
 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
 }
@@ -114,12 +69,6 @@ define dso_local bfloat @atomicrmw_fadd_bfloat_aligned_acq_rel(ptr %ptr, bfloat
 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
 }
@@ -127,10 +76,6 @@ define dso_local bfloat @atomicrmw_fadd_bfloat_aligned_seq_cst(ptr %ptr, bfloat
 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
 }
@@ -138,10 +83,6 @@ 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
 }
@@ -149,10 +90,6 @@ 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
 }
@@ -160,10 +97,6 @@ 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
 }
@@ -171,10 +104,6 @@ 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
 }
@@ -182,10 +111,6 @@ define dso_local float @atomicrmw_fadd_float_aligned_seq_cst(ptr %ptr, float %va
 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
 }
@@ -193,10 +118,6 @@ 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
 }
@@ -204,10 +125,6 @@ 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
 }
@@ -215,10 +132,6 @@ 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
 }
@@ -226,10 +139,6 @@ 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
 }
@@ -237,9 +146,6 @@ 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
 }
@@ -247,9 +153,6 @@ 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
 }
@@ -257,9 +160,6 @@ 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
 }
@@ -267,9 +167,6 @@ 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
 }
@@ -277,9 +174,6 @@ 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
 }
@@ -294,11 +188,6 @@ 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
 }
@@ -313,11 +202,6 @@ 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
 }
@@ -332,11 +216,6 @@ 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
 }
@@ -351,11 +230,6 @@ 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
 }
@@ -370,11 +244,6 @@ 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
 }
@@ -382,9 +251,6 @@ define dso_local bfloat @atomicrmw_fadd_bfloat_unaligned_seq_cst(ptr %ptr, bfloa
 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
 }
@@ -392,9 +258,6 @@ define dso_local float @atomicrmw_fadd_float_unaligned_monotonic(ptr %ptr, float
 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
 }
@@ -402,9 +265,6 @@ define dso_local float @atomicrmw_fadd_float_unaligned_acquire(ptr %ptr, float %
 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
 }
@@ -412,9 +272,6 @@ define dso_local float @atomicrmw_fadd_float_unaligned_release(ptr %ptr, float %
 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
 }
@@ -422,9 +279,6 @@ define dso_local float @atomicrmw_fadd_float_unaligned_acq_rel(ptr %ptr, float %
 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
 }
@@ -432,9 +286,6 @@ define dso_local float @atomicrmw_fadd_float_unaligned_seq_cst(ptr %ptr, float %
 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
 }
@@ -442,9 +293,6 @@ 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
 }
@@ -452,9 +300,6 @@ 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
 }
@@ -462,9 +307,6 @@ 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
 }
@@ -472,9 +314,6 @@ 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
 }
@@ -490,10 +329,6 @@ 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
 }
@@ -509,10 +344,6 @@ 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
 }
@@ -528,10 +359,6 @@ 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
 }
@@ -547,10 +374,6 @@ 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
 }
@@ -566,10 +389,6 @@ 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
 }
@@ -589,12 +408,6 @@ 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]
-;
-; 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
 }
@@ -614,12 +427,6 @@ 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]
-;
-; 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
 }
@@ -639,12 +446,6 @@ 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]
-;
-; 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
 }
@@ -664,12 +465,6 @@ 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]
-;
-; 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
 }
@@ -689,12 +484,6 @@ 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]
-;
-; 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
 }
@@ -710,10 +499,6 @@ define dso_local float @atomicrmw_fsub_float_aligned_monotonic(ptr %ptr, float %
 ; -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
 }
@@ -729,10 +514,6 @@ define dso_local float @atomicrmw_fsub_float_aligned_acquire(ptr %ptr, float %va
 ; -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
 }
@@ -748,10 +529,6 @@ define dso_local float @atomicrmw_fsub_float_aligned_release(ptr %ptr, float %va
 ; -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
 }
@@ -767,10 +544,6 @@ define dso_local float @atomicrmw_fsub_float_aligned_acq_rel(ptr %ptr, float %va
 ; -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
 }
@@ -786,10 +559,6 @@ define dso_local float @atomicrmw_fsub_float_aligned_seq_cst(ptr %ptr, float %va
 ; -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
 }
@@ -805,10 +574,6 @@ 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
 }
@@ -824,10 +589,6 @@ 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
 }
@@ -843,10 +604,6 @@ 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
 }
@@ -862,10 +619,6 @@ 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
 }
@@ -881,10 +634,6 @@ 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
 }
@@ -892,9 +641,6 @@ 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
 }
@@ -902,9 +648,6 @@ 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
 }
@@ -912,9 +655,6 @@ 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
 }
@@ -922,9 +662,6 @@ 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
 }
@@ -932,9 +669,6 @@ 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
 }
@@ -949,11 +683,6 @@ 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
 }
@@ -968,11 +697,6 @@ 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
 }
@@ -987,11 +711,6 @@ 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
 }
@@ -1006,11 +725,6 @@ 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
 }
@@ -1025,11 +739,6 @@ 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
 }
@@ -1037,9 +746,6 @@ define dso_local bfloat @atomicrmw_fsub_bfloat_unaligned_seq_cst(ptr %ptr, bfloa
 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
 }
@@ -1047,9 +753,6 @@ define dso_local float @atomicrmw_fsub_float_unaligned_monotonic(ptr %ptr, float
 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
 }
@@ -1057,9 +760,6 @@ define dso_local float @atomicrmw_fsub_float_unaligned_acquire(ptr %ptr, float %
 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
 }
@@ -1067,9 +767,6 @@ define dso_local float @atomicrmw_fsub_float_unaligned_release(ptr %ptr, float %
 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
 }
@@ -1077,9 +774,6 @@ define dso_local float @atomicrmw_fsub_float_unaligned_acq_rel(ptr %ptr, float %
 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
 }
@@ -1087,9 +781,6 @@ define dso_local float @atomicrmw_fsub_float_unaligned_seq_cst(ptr %ptr, float %
 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
 }
@@ -1097,9 +788,6 @@ 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
 }
@@ -1107,9 +795,6 @@ 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
 }
@@ -1117,9 +802,6 @@ 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
 }
@@ -1127,9 +809,6 @@ 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
 }
@@ -1137,10 +816,6 @@ 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
 }
@@ -1148,10 +823,6 @@ 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
 }
@@ -1159,10 +830,6 @@ 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
 }
@@ -1170,10 +837,6 @@ 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
 }
@@ -1181,10 +844,6 @@ 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
 }
@@ -1192,12 +851,6 @@ define dso_local half @atomicrmw_fmax_half_aligned_seq_cst(ptr %ptr, half %value
 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
 }
@@ -1205,12 +858,6 @@ define dso_local bfloat @atomicrmw_fmax_bfloat_aligned_monotonic(ptr %ptr, bfloa
 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
 }
@@ -1218,12 +865,6 @@ define dso_local bfloat @atomicrmw_fmax_bfloat_aligned_acquire(ptr %ptr, bfloat
 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
 }
@@ -1231,12 +872,6 @@ define dso_local bfloat @atomicrmw_fmax_bfloat_aligned_release(ptr %ptr, bfloat
 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
 }
@@ -1244,12 +879,6 @@ define dso_local bfloat @atomicrmw_fmax_bfloat_aligned_acq_rel(ptr %ptr, bfloat
 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
 }
@@ -1257,10 +886,6 @@ define dso_local bfloat @atomicrmw_fmax_bfloat_aligned_seq_cst(ptr %ptr, bfloat
 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
 }
@@ -1268,10 +893,6 @@ 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
 }
@@ -1279,10 +900,6 @@ 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
 }
@@ -1290,10 +907,6 @@ 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
 }
@@ -1301,10 +914,6 @@ 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
 }
@@ -1312,10 +921,6 @@ define dso_local float @atomicrmw_fmax_float_aligned_seq_cst(ptr %ptr, float %va
 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
 }
@@ -1323,10 +928,6 @@ 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
 }
@@ -1334,10 +935,6 @@ 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
 }
@@ -1345,10 +942,6 @@ 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
 }
@@ -1356,10 +949,6 @@ 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
 }
@@ -1367,9 +956,6 @@ 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
 }
@@ -1377,9 +963,6 @@ define dso_local half @atomicrmw_fmax_half_unaligned_monotonic(ptr %ptr, half %v
 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
-;
-; 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
 }
@@ -1387,9 +970,6 @@ define dso_local half @atomicrmw_fmax_half_unaligned_acquire(ptr %ptr, half %val
 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
-;
-; 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
 }
@@ -1397,9 +977,6 @@ define dso_local half @atomicrmw_fmax_half_unaligned_release(ptr %ptr, half %val
 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
-;
-; 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
 }
@@ -1407,9 +984,6 @@ define dso_local half @atomicrmw_fmax_half_unaligned_acq_rel(ptr %ptr, half %val
 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
-;
-; 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
 }
@@ -1424,11 +998,6 @@ 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
 }
@@ -1443,11 +1012,6 @@ 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
 }
@@ -1462,11 +1026,6 @@ 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
 }
@@ -1481,11 +1040,6 @@ 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
 }
@@ -1500,11 +1054,6 @@ 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
 }
@@ -1512,9 +1061,6 @@ define dso_local bfloat @atomicrmw_fmax_bfloat_unaligned_seq_cst(ptr %ptr, bfloa
 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
 }
@@ -1522,9 +1068,6 @@ define dso_local float @atomicrmw_fmax_float_unaligned_monotonic(ptr %ptr, float
 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
 }
@@ -1532,9 +1075,6 @@ define dso_local float @atomicrmw_fmax_float_unaligned_acquire(ptr %ptr, float %
 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
 }
@@ -1542,9 +1082,6 @@ define dso_local float @atomicrmw_fmax_float_unaligned_release(ptr %ptr, float %
 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
 }
@@ -1552,9 +1089,6 @@ define dso_local float @atomicrmw_fmax_float_unaligned_acq_rel(ptr %ptr, float %
 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
 }
@@ -1562,9 +1096,6 @@ define dso_local float @atomicrmw_fmax_float_unaligned_seq_cst(ptr %ptr, float %
 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
 }
@@ -1572,9 +1103,6 @@ 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
 }
@@ -1582,9 +1110,6 @@ 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
 }
@@ -1592,9 +1117,6 @@ 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
 }
@@ -1602,9 +1124,6 @@ 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
 }
@@ -1612,10 +1131,6 @@ 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
 }
@@ -1623,10 +1138,6 @@ 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
 }
@@ -1634,10 +1145,6 @@ 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
 }
@@ -1645,10 +1152,6 @@ 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
 }
@@ -1656,10 +1159,6 @@ 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
 }
@@ -1667,12 +1166,6 @@ define dso_local half @atomicrmw_fmin_half_aligned_seq_cst(ptr %ptr, half %value
 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
 }
@@ -1680,12 +1173,6 @@ define dso_local bfloat @atomicrmw_fmin_bfloat_aligned_monotonic(ptr %ptr, bfloa
 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
 }
@@ -1693,12 +1180,6 @@ define dso_local bfloat @atomicrmw_fmin_bfloat_aligned_acquire(ptr %ptr, bfloat
 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
 }
@@ -1706,12 +1187,6 @@ define dso_local bfloat @atomicrmw_fmin_bfloat_aligned_release(ptr %ptr, bfloat
 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
 }
@@ -1719,12 +1194,6 @@ define dso_local bfloat @atomicrmw_fmin_bfloat_aligned_acq_rel(ptr %ptr, bfloat
 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
 }
@@ -1732,10 +1201,6 @@ define dso_local bfloat @atomicrmw_fmin_bfloat_aligned_seq_cst(ptr %ptr, bfloat
 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
 }
@@ -1743,10 +1208,6 @@ 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
 }
@@ -1754,10 +1215,6 @@ 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
 }
@@ -1765,10 +1222,6 @@ 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
 }
@@ -1776,10 +1229,6 @@ 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
 }
@@ -1787,10 +1236,6 @@ define dso_local float @atomicrmw_fmin_float_aligned_seq_cst(ptr %ptr, float %va
 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
 }
@@ -1798,10 +1243,6 @@ 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
 }
@@ -1809,10 +1250,6 @@ 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
 }
@@ -1820,10 +1257,6 @@ 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
 }
@@ -1831,10 +1264,6 @@ 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
 }
@@ -1842,9 +1271,6 @@ 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
 }
@@ -1852,9 +1278,6 @@ 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
 }
@@ -1862,9 +1285,6 @@ 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
 }
@@ -1872,9 +1292,6 @@ 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
 }
@@ -1882,9 +1299,6 @@ 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
 }
@@ -1899,11 +1313,6 @@ 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
 }
@@ -1918,11 +1327,6 @@ 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
 }
@@ -1937,11 +1341,6 @@ 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
 }
@@ -1956,11 +1355,6 @@ 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
 }
@@ -1975,11 +1369,6 @@ 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
 }
@@ -1987,9 +1376,6 @@ define dso_local bfloat @atomicrmw_fmin_bfloat_unaligned_seq_cst(ptr %ptr, bfloa
 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
 }
@@ -1997,9 +1383,6 @@ define dso_local float @atomicrmw_fmin_float_unaligned_monotonic(ptr %ptr, float
 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
 }
@@ -2007,9 +1390,6 @@ define dso_local float @atomicrmw_fmin_float_unaligned_acquire(ptr %ptr, float %
 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
 }
@@ -2017,9 +1397,6 @@ define dso_local float @atomicrmw_fmin_float_unaligned_release(ptr %ptr, float %
 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
 }
@@ -2027,9 +1404,6 @@ define dso_local float @atomicrmw_fmin_float_unaligned_acq_rel(ptr %ptr, float %
 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
 }
@@ -2037,9 +1411,6 @@ define dso_local float @atomicrmw_fmin_float_unaligned_seq_cst(ptr %ptr, float %
 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
 }
@@ -2047,9 +1418,6 @@ 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
 }
@@ -2057,9 +1425,6 @@ 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
 }
@@ -2067,9 +1432,6 @@ 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
 }
@@ -2077,9 +1439,6 @@ 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 09a407f418a53..f40bbaeb930c0 100755
--- a/llvm/test/CodeGen/AArch64/Atomics/generate-tests.py
+++ b/llvm/test/CodeGen/AArch64/Atomics/generate-tests.py
@@ -14,20 +14,31 @@
 ]
 
 
-# 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, pairs):
+        if not isinstance(pairs, list):
+            raise ValueError("Must init with a list of key-value pairs")
+
+        self._data = pairs[:]
+
+    def __iter__(self):
+        return iter(self._data)
 
-    def __str__(self) -> str:
-        return self.name
+
+# fmt: off
+Type = ByteSizes([
+   ("i8",   1),
+   ("i16",  2),
+   ("i32",  4),
+   ("i64",  8),
+   ("i128", 16)])
+
+FPType = ByteSizes([
+   ("half",   2),
+   ("bfloat", 2),
+   ("float",  4),
+   ("double", 8)])
+# fmt: on
 
 
 # Is this an aligned or unaligned access?
@@ -161,11 +172,32 @@ def mattr(self):
     "umin",
 ]
 
+FP_ATOMICRMW_OPS = [
+    "fadd",
+    "fsub",
+    "fmax",
+    "fmin",
+]
 
-def all_atomicrmw(f):
-    for op in ATOMICRMW_OPS:
+
+def relpath():
+    # __file__ changed to return absolute path in Python 3.9. Print only
+    # up to llvm-project (6 levels higher), to avoid unnecessary diffs and
+    # revealing directory structure of people running this script
+    top = "../" * 6
+    fp = os.path.relpath(__file__, os.path.abspath(os.path.join(__file__, top)))
+    return fp
+
+
+def align(val, aligned: bool) -> int:
+    return val if aligned else 1
+
+
+def all_atomicrmw(f, datatype, atomicrmw_ops):
+    for op in atomicrmw_ops:
         for aligned in Aligned:
-            for ty in Type:
+            for ty, val in datatype:
+                alignval = align(val, aligned)
                 for ordering in ATOMICRMW_ORDERS:
                     name = f"atomicrmw_{op}_{ty}_{aligned}_{ordering}"
                     instr = "atomicrmw"
@@ -173,7 +205,7 @@ def all_atomicrmw(f):
                         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
                         }}
                     """
@@ -183,7 +215,8 @@ def all_atomicrmw(f):
 
 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}"
@@ -195,7 +228,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
                         }}
                     """
@@ -205,7 +238,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"
@@ -213,7 +247,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
                     }}
                 """
@@ -223,7 +257,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]:
@@ -236,7 +271,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
                             }}
@@ -305,7 +340,11 @@ def write_lit_tests(feature, datatypes, ops):
             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)
+                all_atomicrmw(f, datatypes, ops)
+
+            # Floating point atomics only supported for atomicrmw currently
+            if feature.test_scope() == "atomicrmw":
+                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)"'



More information about the llvm-commits mailing list