[llvm] [AArch64] C1-Premium SME definitions (PR #212482)

Nashe Mncube via llvm-commits llvm-commits at lists.llvm.org
Tue Aug 25 02:31:05 PDT 2026


================
@@ -2348,4 +2781,191 @@ def : InstRW<[C1PWrite_2c_1V], (instregex "^(BCAX|EOR3)_ZZZZ$",
 // Crypto SM4 ops
 def : InstRW<[C1PWrite_4c_1V0], (instregex "^SM4E(KEY)?_ZZZ_S$")>;
 
+// SME predicates
+// -----------------------------------------------------------------------------
+
+// Signed/unsigned pair-producing while compare
+def : InstRW<[C1PWrite_2c_1M_StreamingCMEVX0ALU],
+             (instregex "^WHILE(GE|GT|HI|HS|LE|LO|LS|LT)_2PXX")>;
+
+// SVE instructions added by SME but not sent to CME when in Streaming SVE mode
+// -----------------------------------------------------------------------------
+
+// Add/Read multiple of streaming SVE predicate/vector register size to scalar register
+def : InstRW<[C1PWrite_1c_1I], (instrs ADDSPL_XXI, ADDSVL_XXI, RDSVLI_XI)>;
+
+// Predicate counting scalar to count from predicate-as-counter
+def : InstRW<[C1PWrite_2c_1M], (instregex "^CNTP_XCI_[BHSD]$")>;
+
+// Set predicates from predicate-as-counter
+def : InstRW<[C1PWrite_2c_1M], (instregex "^PEXT_PCI_[BHSD]$")>;
+
+// Set pair of predicates from predicate-as-counter
+def : InstRW<[C1PWrite_3c_1M], (instregex "^PEXT_2PCI_[BHSD]$")>;
+
+// Predicate as counter set
+def : InstRW<[C1PWrite_1c_1M], (instregex "^PTRUE_C_[BHSD]$")>;
+
+// Loop control, based on GPR generating predicate as counter
+def : InstRW<[C1PWrite_1c_1M], (instregex "^WHILE(GE|GT|HI|HS|LE|LO|LS|LT)_CXX_[BHSD]$")>;
+
+// SME-added SVE instructions that stay on-core when Streaming SVE mode is modelled
+def : InstRW<[C1PWrite_4c_1V_StreamingCMEMML0], (instregex "^BFMLSLB_Z", "^BFMLSLT_Z")>;
+def : InstRW<[C1PWrite_2c_1V_StreamingCMEVXALU_5c], (instregex "^FCLAMP_ZZZ")>;
+def : InstRW<[C1PWrite_4c_1V_StreamingCMEVXALU], (instregex "^FDOT_(ZZZ|ZZZI)?(_S|_BtoS|_BtoH|HtoS)$")>;
+def : InstRW<[C1PWrite_2c_2M_StreamingCMEPERM], (instregex "^PSEL_PPPRI")>;
+def : InstRW<[C1PWrite_2c_1V_StreamingCMEPERM], (instregex "^REVD_ZPmZ")>;
+def : InstRW<[C1PWrite_2c_1V_StreamingCMEVXALU], (instregex "^(S|U)CLAMP_ZZZ")>;
+def : InstRW<[C1PWrite_2c_1V_StreamingCMEVXALU_1CMEPERMS],
+             (instregex "^SQCVTUN_Z2Z_StoH")>;
+def : InstRW<[C1PWrite_3c_1V01_StreamingCMEVXALU], (instregex "^SQRSHRUN_Z2ZI_StoH")>;
+
+// SVE instructions added by SME and only available in Streaming SVE mode
+// -----------------------------------------------------------------------------
+
+// Horizontal and vertical ZA reductions.
+def : InstRW<[C1PWrite_4c_1CMEVXALU_4rc],
+             (instregex "^ADDHA_MPPZ_(S(_PSEUDO_S)?|D(_PSEUDO_D)?)$",
+                        "^ADDVA_MPPZ_(S(_PSEUDO_S)?|D(_PSEUDO_D)?)$")>;
+
+// Outer-product ZA updates.
+def : InstRW<[C1PWrite_2c_1CMEMML0_2rc],
+             (instregex "^BMOPA_MPPZZ_S(_PSEUDO)?$", "^BMOPS_MPPZZ_S(_PSEUDO)?$",
+                        "^(SMOPA|UMOPA|SMOPS|UMOPS)_MPPZZ_(S|D|HtoS)(_PSEUDO)?$",
+                        "^(SUMOPA|USMOPA|SUMOPS|USMOPS)_MPPZZ_(S|D)(_PSEUDO)?$")>;
+def : InstRW<[C1PWrite_4c_1CMEMML0_2rc],
+             (instregex "^(F?MOPA|F?MOPS)_MPPZZ_(S|D|H)(_PSEUDO)?$",
+                        "^F?MOP(AL|SL)_MPPZZ(_PSEUDO)?$",
+                        "^(BFMOPA|BFMOPS)_MPPZZ(_H)?(_PSEUDO)?$")>;
+
+// ZA accumulators updated through multi-vector add/subtract operations.
+def : InstRW<[C1PWrite_2c_1CMEMML0_1rc],
+             (instregex "^(ADD|SUB)_VG2_M2(Z|ZZ|Z2Z)_[SD](_PSEUDO)?$")>;
+def : InstRW<[C1PWrite_2c_1CMEMML0_2rc],
+             (instregex "^(ADD|SUB)_VG4_M4(Z|ZZ|Z4Z)_[SD](_PSEUDO)?$")>;
+def : InstRW<[C1PWrite_4c_1CMEMML0_1rc],
+             (instregex "^(FADD|FSUB|BFADD|BFSUB)_VG2_M2Z_[HSD](_PSEUDO)?$")>;
+def : InstRW<[C1PWrite_4c_1CMEMML0_2rc],
+             (instregex "^(FADD|FSUB|BFADD|BFSUB)_VG4_M4Z_[HSD](_PSEUDO)?$")>;
+def : InstRW<[C1PWrite_5c_1CMEVXALU_1rc], (instregex "^ADD_VG2_2ZZ_")>;
+def : InstRW<[C1PWrite_6c_1CMEVXALU_4rc], (instregex "^ADD_VG4_4ZZ_")>;
+
+// Streaming-only clamp, convert and shift families.
+def : InstRW<[C1PWrite_5c_1CMEVXALU_1rc],
+             (instregex "^FCLAMP_VG2_2Z2Z_", "^BFCLAMP_VG2_2ZZZ",
+                        "^(S|U)CLAMP_VG2_2Z2Z_", "^(FMAX|FMIN)_VG2_2(ZZ|Z2Z)_",
+                        "^FA(MAX|MIN)_2Z2Z_", "^SQDMULH_VG2_2ZZ_",
+                        "^(S|U)RSHL_VG2_2ZZ_")>;
+def : InstRW<[C1PWrite_7c_1CMEVXALU_4rc],
+             (instregex "^FCLAMP_VG4_4Z4Z_", "^BFCLAMP_VG4_4ZZZ",
+                        "^(S|U)CLAMP_VG4_4Z4Z_")>;
+def : InstRW<[C1PWrite_4c_1CMEVXALU_2rc],
+             (instregex "^(S|U)(MAX|MIN)_VG2_2(ZZ|Z2Z)_",
+                        "^(FMAXNM|FMINNM)_VG2_2(ZZ|Z2Z)_",
+                        "^SQDMULH_VG2_2Z2Z_", "^(S|U)RSHL_VG2_2Z2Z_",
+                        "^(SQRSHR|UQRSHR)_VG2_Z2ZI_",
+                        "^(FRINT(A|M|N|P))_2Z2Z_")>;
+def : InstRW<[C1PWrite_4c_1CMEVXALU_4rc],
+             (instregex "^(S|U)(MAX|MIN)_VG4_4Z4Z_",
+                        "^(S|U)RSHL_VG4_4Z4Z_")>;
+def : InstRW<[C1PWrite_5c_1CMEVXALU_4rc],
+             (instregex "^(S|U)(MAX|MIN)_VG4_4ZZ_",
+                        "^(FMAX|FMIN|FMAXNM|FMINNM)_VG4_4(ZZ|Z4Z)_",
+        "^(BFMAX|BFMIN|BFMAXNM|BFMINNM)_VG4_4(Z2Z|ZZ)_",
+                        "^SQDMULH_VG4_4(ZZ|Z4Z)_", "^(FRINT(A|M|N|P))_4Z4Z_",
+                        "^FSCALE_4(ZZ|Z4Z)_")>;
+def : InstRW<[C1PWrite_4c_1CMEVXALU_2rc],
+             (instregex "^(BFMAX|BFMIN|BFMAXNM|BFMINNM)_VG2_2(ZZ|Z2Z)_",
+                        "^FSCALE_2(ZZ|Z2Z)_", "^FCVTZS_2Z2Z_StoS$",
+                        "^FCVTZU_2Z2Z_StoS$", "^F[12]CVT_2?ZZ_BtoH$",
+                        "^F[12]CVTL(T_ZZ|_2ZZ)_BtoH$",
+                        "^FCVT_Z2Z_(HtoB|StoH)$", "^FCVT_2ZZ_H_S$",
----------------
nasherm wrote:

Done

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


More information about the llvm-commits mailing list