[llvm-branch-commits] [llvm] [AArch64] Support direct RCPC3 FP atomic loads and stores (PR #231492)

Vimal Patel via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Mon Oct 26 07:56:56 PDT 2026


================
@@ -890,33 +890,90 @@ let Predicates = [HasLSFE] in {
 
 // v8.9a/v9.4a FEAT_LRCPC patterns
 let Predicates = [HasRCPC3, HasNEON] in {
+  def : Pat<(bf16 (acquiring_load<atomic_load_nonext_bf16> GPR64sp:$Rn)),
+            (LDAPURhi GPR64sp:$Rn, (i64 0))>;
+  def : Pat<(bf16 (acquiring_load<atomic_load_nonext_bf16>
+                  (am_unscaled16 GPR64sp:$Rn, simm9:$offset))),
+            (LDAPURhi GPR64sp:$Rn, simm9:$offset)>;
+
+  def : Pat<(f16 (acquiring_load<atomic_load_nonext_f16> GPR64sp:$Rn)),
+            (LDAPURhi GPR64sp:$Rn, (i64 0))>;
+  def : Pat<(f16 (acquiring_load<atomic_load_nonext_f16>
+                 (am_unscaled16 GPR64sp:$Rn, simm9:$offset))),
+            (LDAPURhi GPR64sp:$Rn, simm9:$offset)>;
+
+  def : Pat<(f32 (acquiring_load<atomic_load_nonext_f32> GPR64sp:$Rn)),
+            (LDAPURsi GPR64sp:$Rn, (i64 0))>;
+  def : Pat<(f32 (acquiring_load<atomic_load_nonext_f32>
+                 (am_unscaled32 GPR64sp:$Rn, simm9:$offset))),
+            (LDAPURsi GPR64sp:$Rn, simm9:$offset)>;
+
+  def : Pat<(f64 (acquiring_load<atomic_load_nonext_f64> GPR64sp:$Rn)),
+            (LDAPURdi GPR64sp:$Rn, (i64 0))>;
+  def : Pat<(f64 (acquiring_load<atomic_load_nonext_f64>
+                 (am_unscaled64 GPR64sp:$Rn, simm9:$offset))),
+            (LDAPURdi GPR64sp:$Rn, simm9:$offset)>;
+
+  def : Pat<(releasing_store<atomic_store_bf16> GPR64sp:$Rn,
+                  (bf16 FPR16:$val)),
+            (STLURhi FPR16:$val, GPR64sp:$Rn, (i64 0))>;
+  def : Pat<(releasing_store<atomic_store_bf16>
+                 (am_unscaled16 GPR64sp:$Rn, simm9:$offset),
+                 (bf16 FPR16:$val)),
+            (STLURhi FPR16:$val, GPR64sp:$Rn, simm9:$offset)>;
+  def : Pat<(releasing_store<atomic_store_f16> GPR64sp:$Rn,
+                  (f16 FPR16:$val)),
+            (STLURhi FPR16:$val, GPR64sp:$Rn, (i64 0))>;
+  def : Pat<(releasing_store<atomic_store_f16>
+                 (am_unscaled16 GPR64sp:$Rn, simm9:$offset),
+                 (f16 FPR16:$val)),
+            (STLURhi FPR16:$val, GPR64sp:$Rn, simm9:$offset)>;
+  def : Pat<(releasing_store<atomic_store_f32> GPR64sp:$Rn,
+                  (f32 FPR32:$val)),
+            (STLURsi FPR32:$val, GPR64sp:$Rn, (i64 0))>;
+  def : Pat<(releasing_store<atomic_store_f32>
+                 (am_unscaled32 GPR64sp:$Rn, simm9:$offset),
+                 (f32 FPR32:$val)),
+            (STLURsi FPR32:$val, GPR64sp:$Rn, simm9:$offset)>;
+  def : Pat<(releasing_store<atomic_store_f64> GPR64sp:$Rn,
+                  (f64 FPR64:$val)),
+            (STLURdi FPR64:$val, GPR64sp:$Rn, (i64 0))>;
+  def : Pat<(releasing_store<atomic_store_f64>
+                 (am_unscaled64 GPR64sp:$Rn, simm9:$offset),
+                 (f64 FPR64:$val)),
+            (STLURdi FPR64:$val, GPR64sp:$Rn, simm9:$offset)>;
+
   // LDAP1 loads
   def : Pat<(vector_insert (v2i64 VecListOne128:$Rd),
                 (i64 (acquiring_load<atomic_load_nonext_64> GPR64sp:$Rn)), (i64 VectorIndexD:$idx)),
             (LDAP1 VecListOne128:$Rd, VectorIndexD:$idx, GPR64sp:$Rn)>;
   def : Pat<(vector_insert (v2f64 VecListOne128:$Rd),
-                (f64 (bitconvert (i64 (acquiring_load<atomic_load_nonext_64> GPR64sp:$Rn)))), (i64 VectorIndexD:$idx)),
----------------
pvimal816a wrote:

Yeah, this is the same issue as seen in the first PR. I'll fix it. Thanks for catching it.

https://github.com/llvm/llvm-project/pull/231492


More information about the llvm-branch-commits mailing list