diff --git a/llvm/include/llvm/Support/AArch64TargetParser.def b/llvm/include/llvm/Support/AArch64TargetParser.def
--- a/llvm/include/llvm/Support/AArch64TargetParser.def
+++ b/llvm/include/llvm/Support/AArch64TargetParser.def
@@ -141,9 +141,14 @@
 AARCH64_ARCH_EXT_NAME("brbe",         AArch64::AEK_BRBE,        "+brbe",         "-brbe")
 AARCH64_ARCH_EXT_NAME("pauth",        AArch64::AEK_PAUTH,       "+pauth",        "-pauth")
 AARCH64_ARCH_EXT_NAME("flagm",        AArch64::AEK_FLAGM,       "+flagm",        "-flagm")
-AARCH64_ARCH_EXT_NAME("sme",          AArch64::AEK_SME,         "+sme",          "-sme")
-AARCH64_ARCH_EXT_NAME("sme-f64",      AArch64::AEK_SMEF64,      "+sme-f64",      "-sme-f64")
-AARCH64_ARCH_EXT_NAME("sme-i64",      AArch64::AEK_SMEI64,      "+sme-i64",      "-sme-i64")
+// The NEGFEATURE for SME is slightly more involved, because
+// '+streaming-agnostic-sme' and '+streaming-sve'
+// are an implementation detail and not a user-facing feature, so
+// passing +nosme should also disable the streaming(-agnostic)
+// subsets, which contain most of the instructions.
+AARCH64_ARCH_EXT_NAME("sme",          AArch64::AEK_SME,         "+sme",          "-sme,-streaming-sve,-streaming-agnostic-sme")
+AARCH64_ARCH_EXT_NAME("sme-f64",      AArch64::AEK_SMEF64,      "+sme-f64",      "-sme-f64,-sme,-streaming-sve,-streaming-agnostic-sme")
+AARCH64_ARCH_EXT_NAME("sme-i64",      AArch64::AEK_SMEI64,      "+sme-i64",      "-sme-i64,-sme,-streaming-sve,-streaming-agnostic-sme")
 AARCH64_ARCH_EXT_NAME("hbc",          AArch64::AEK_HBC,         "+hbc",          "-hbc")
 AARCH64_ARCH_EXT_NAME("mops",         AArch64::AEK_MOPS,        "+mops",         "-mops")
 AARCH64_ARCH_EXT_NAME("pmuv3",        AArch64::AEK_PERFMON,     "+perfmon",      "-perfmon")
diff --git a/llvm/lib/Target/AArch64/AArch64.td b/llvm/lib/Target/AArch64/AArch64.td
--- a/llvm/lib/Target/AArch64/AArch64.td
+++ b/llvm/lib/Target/AArch64/AArch64.td
@@ -438,11 +438,22 @@
 def FeatureRME : SubtargetFeature<"rme", "HasRME",
     "true", "Enable Realm Management Extension">;
 
+def FeatureStreamingAgnosticSME
+    : SubtargetFeature<"streaming-agnostic-sme", "HasStreamingAgnosticSME", "true",
+                       "Enable subset of SME instructions that are valid in "
+                       "both streaming SVE mode as well as regular mode">;
+
 def FeatureStreamingSVE : SubtargetFeature<"streaming-sve", "HasStreamingSVE", "true",
-  "Enable instructions that are valid in Streaming SVE execution mode">;
+  "Enable instructions that are valid in Streaming SVE execution mode",
+  [FeatureStreamingAgnosticSME, FeatureFullFP16]>;
+
+// FeatureSMEZA is orthogonal to Streaming mode.
+def FeatureSMEZA : SubtargetFeature<"sme-za", "HasSMEZA", "true",
+  "Enable subset of SME instructions that are only valid when PSTATE.ZA == 1.">;
 
 def FeatureSME : SubtargetFeature<"sme", "HasSME", "true",
-  "Enable Scalable Matrix Extension (SME)", [FeatureStreamingSVE, FeatureBF16]>;
+  "Enable Scalable Matrix Extension (SME)",
+  [FeatureStreamingSVE, FeatureStreamingAgnosticSME, FeatureSMEZA, FeatureBF16]>;
 
 def FeatureSMEF64 : SubtargetFeature<"sme-f64", "HasSMEF64", "true",
   "Enable Scalable Matrix Extension (SME) F64F64 instructions", [FeatureSME]>;
@@ -602,7 +613,13 @@
 }
 
 def SMEUnsupported : AArch64Unsupported {
-  let F = [HasSME, HasSMEF64, HasSMEI64];
+  let F = [
+    HasSME,
+    HasSMEF64,
+    HasSMEI64,
+    HasStreamingSVE,
+    HasStreamingAgnosticSME,
+  ];
 }
 
 include "AArch64SchedA53.td"
diff --git a/llvm/lib/Target/AArch64/AArch64InstrInfo.td b/llvm/lib/Target/AArch64/AArch64InstrInfo.td
--- a/llvm/lib/Target/AArch64/AArch64InstrInfo.td
+++ b/llvm/lib/Target/AArch64/AArch64InstrInfo.td
@@ -144,6 +144,11 @@
                                  AssemblerPredicate<(all_of FeatureSMEI64), "sme-i64">;
 def HasStreamingSVE  : Predicate<"Subtarget->hasStreamingSVE()">,
                                  AssemblerPredicate<(all_of FeatureStreamingSVE), "sme">;
+def HasSMEZA         : Predicate<"Subtarget->hasSMEZA()">,
+                                 AssemblerPredicate<(all_of FeatureSMEZA), "sme">;
+def HasStreamingAgnosticSME
+    : Predicate<"Subtarget->hasStreamingAgnosticSME()">,
+      AssemblerPredicate<(all_of FeatureStreamingAgnosticSME), "sme">;
 // A subset of SVE(2) instructions are legal in Streaming SVE execution mode,
 // they should be enabled if either has been specified.
 def HasSVEorStreamingSVE
diff --git a/llvm/lib/Target/AArch64/AArch64SMEInstrInfo.td b/llvm/lib/Target/AArch64/AArch64SMEInstrInfo.td
--- a/llvm/lib/Target/AArch64/AArch64SMEInstrInfo.td
+++ b/llvm/lib/Target/AArch64/AArch64SMEInstrInfo.td
@@ -14,23 +14,19 @@
 // Add vector elements horizontally or vertically to ZA tile.
 //===----------------------------------------------------------------------===//
 
-let Predicates = [HasSME] in {
-def RDSVLI_XI  : sve_int_read_vl_a<0b0, 0b11111, "rdsvl", /*streaming_sve=*/0b1>;
-def ADDSPL_XXI : sve_int_arith_vl<0b1, "addspl", /*streaming_sve=*/0b1>;
-def ADDSVL_XXI : sve_int_arith_vl<0b0, "addsvl", /*streaming_sve=*/0b1>;
-
+let Predicates = [HasSMEZA, HasStreamingSVE] in {
 def ADDHA_MPPZ_S : sme_add_vector_to_tile_u32<0b0, "addha">;
 def ADDVA_MPPZ_S : sme_add_vector_to_tile_u32<0b1, "addva">;
 }
 
-let Predicates = [HasSMEI64] in {
+let Predicates = [HasSMEI64, HasSMEZA, HasStreamingSVE] in {
 def ADDHA_MPPZ_D : sme_add_vector_to_tile_u64<0b0, "addha">;
 def ADDVA_MPPZ_D : sme_add_vector_to_tile_u64<0b1, "addva">;
 }
 
-let Predicates = [HasSME] in {
+let Predicates = [HasSMEZA, HasStreamingSVE] in {
 //===----------------------------------------------------------------------===//
-// Outer products
+// Outer Product Accumulate
 //===----------------------------------------------------------------------===//
 
 defm BFMOPA_MPPZZ  : sme_bf16_outer_product<0b0, "bfmopa">;
@@ -40,12 +36,12 @@
 def FMOPS_MPPZZ_S : sme_outer_product_fp32<0b1, "fmops">;
 }
 
-let Predicates = [HasSMEF64] in {
+let Predicates = [HasSMEZA, HasSMEF64, HasStreamingSVE] in {
 def FMOPA_MPPZZ_D : sme_outer_product_fp64<0b0, "fmopa">;
 def FMOPS_MPPZZ_D : sme_outer_product_fp64<0b1, "fmops">;
 }
 
-let Predicates = [HasSME] in {
+let Predicates = [HasSMEZA, HasStreamingSVE] in {
 defm FMOPAL_MPPZZ  : sme_f16_outer_product<0b0, "fmopa">;
 defm FMOPSL_MPPZZ  : sme_f16_outer_product<0b1, "fmops">;
 
@@ -59,7 +55,7 @@
 def USMOPS_MPPZZ_S : sme_int_outer_product_i32<0b101, "usmops">;
 }
 
-let Predicates = [HasSMEI64] in {
+let Predicates = [HasSMEZA, HasSMEI64, HasStreamingSVE] in {
 def SMOPA_MPPZZ_D  : sme_int_outer_product_i64<0b000, "smopa">;
 def SMOPS_MPPZZ_D  : sme_int_outer_product_i64<0b001, "smops">;
 def UMOPA_MPPZZ_D  : sme_int_outer_product_i64<0b110, "umopa">;
@@ -70,34 +66,40 @@
 def USMOPS_MPPZZ_D : sme_int_outer_product_i64<0b101, "usmops">;
 }
 
-let Predicates = [HasSME] in {
+let Predicates = [HasSMEZA, HasStreamingSVE] in {
 //===----------------------------------------------------------------------===//
 // Loads and stores
 //===----------------------------------------------------------------------===//
 
 defm LD1_MXIPXX : sme_mem_ld_ss<"ld1">;
 defm ST1_MXIPXX : sme_mem_st_ss<"st1">;
+}
 
+let Predicates = [HasSMEZA, HasStreamingAgnosticSME] in {
 //===----------------------------------------------------------------------===//
 // Spill + fill
 //===----------------------------------------------------------------------===//
-
 defm LDR_ZA : sme_fill<"ldr">;
 defm STR_ZA : sme_spill<"str">;
+}
 
+let Predicates = [HasSMEZA, HasStreamingSVE] in {
 //===----------------------------------------------------------------------===//
 // Move instructions
 //===----------------------------------------------------------------------===//
-
 defm INSERT_MXIPZ  : sme_vector_to_tile<"mova">;
 defm EXTRACT_ZPMXI : sme_tile_to_vector<"mova">;
+}
 
+let Predicates = [HasSMEZA, HasStreamingAgnosticSME] in {
 //===----------------------------------------------------------------------===//
 // Zero instruction
 //===----------------------------------------------------------------------===//
-
 defm ZERO_M : sme_zero<"zero">;
+}
+
 
+let Predicates = [HasStreamingAgnosticSME] in {
 //===----------------------------------------------------------------------===//
 // Mode selection and state access instructions
 //===----------------------------------------------------------------------===//
@@ -144,4 +146,7 @@
 
 defm PSEL_PPPRI : sve2_int_perm_sel_p<"psel">;
 
-} // End let Predicates = [HasSME]
+def RDSVLI_XI  : sve_int_read_vl_a<0b0, 0b11111, "rdsvl", /*streaming_sve=*/0b1>;
+def ADDSPL_XXI : sve_int_arith_vl<0b1, "addspl", /*streaming_sve=*/0b1>;
+def ADDSVL_XXI : sve_int_arith_vl<0b0, "addsvl", /*streaming_sve=*/0b1>;
+} // end let Predicates = [HasStreamingAgnosticSME]
diff --git a/llvm/lib/Target/AArch64/AArch64Subtarget.h b/llvm/lib/Target/AArch64/AArch64Subtarget.h
--- a/llvm/lib/Target/AArch64/AArch64Subtarget.h
+++ b/llvm/lib/Target/AArch64/AArch64Subtarget.h
@@ -209,7 +209,9 @@
   bool HasSME = false;
   bool HasSMEF64 = false;
   bool HasSMEI64 = false;
+  bool HasSMEZA = false;
   bool HasStreamingSVE = false;
+  bool HasStreamingAgnosticSME = false;
 
   // AppleA7 system register.
   bool HasAppleA7SysReg = false;
@@ -530,7 +532,9 @@
   bool hasSME() const { return HasSME; }
   bool hasSMEF64() const { return HasSMEF64; }
   bool hasSMEI64() const { return HasSMEI64; }
+  bool hasSMEZA() const { return HasSMEZA; }
   bool hasStreamingSVE() const { return HasStreamingSVE; }
+  bool hasStreamingAgnosticSME() const { return HasStreamingAgnosticSME; }
 
   bool isLittleEndian() const { return IsLittle; }
 
diff --git a/llvm/lib/Target/AArch64/AArch64SystemOperands.td b/llvm/lib/Target/AArch64/AArch64SystemOperands.td
--- a/llvm/lib/Target/AArch64/AArch64SystemOperands.td
+++ b/llvm/lib/Target/AArch64/AArch64SystemOperands.td
@@ -382,7 +382,7 @@
   code Requires = [{ {} }];
 }
 
-let Requires = [{ {AArch64::FeatureSME} }] in {
+let Requires = [{ {AArch64::FeatureStreamingAgnosticSME} }] in {
 def : SVCR<"SVCRSM",   0b001>;
 def : SVCR<"SVCRZA",   0b010>;
 def : SVCR<"SVCRSMZA", 0b011>;
@@ -781,7 +781,7 @@
 
 // v9-a Scalable Matrix Extension (SME) registers
 //                                 Op0   Op1    CRn     CRm     Op2
-let Requires = [{ {AArch64::FeatureSME} }] in {
+let Requires = [{ {AArch64::FeatureStreamingAgnosticSME} }] in {
 def : ROSysReg<"ID_AA64SMFR0_EL1", 0b11, 0b000, 0b0000, 0b0100, 0b101>;
 }
 
@@ -1700,7 +1700,7 @@
 
 // Scalable Matrix Extension (SME)
 //                                 Op0   Op1    CRn     CRm     Op2
-let Requires = [{ {AArch64::FeatureSME} }] in {
+let Requires = [{ {AArch64::FeatureStreamingAgnosticSME} }] in {
 def : RWSysReg<"SMCR_EL1",         0b11, 0b000, 0b0001, 0b0010, 0b110>;
 def : RWSysReg<"SMCR_EL2",         0b11, 0b100, 0b0001, 0b0010, 0b110>;
 def : RWSysReg<"SMCR_EL3",         0b11, 0b110, 0b0001, 0b0010, 0b110>;
@@ -1714,6 +1714,7 @@
 
 // v8.4a MPAM and SME registers
 //                              Op0   Op1    CRn     CRm     Op2
-let Requires = [{ {AArch64::FeatureMPAM, AArch64::FeatureSME} }] in {
+let Requires =
+    [{ {AArch64::FeatureMPAM, AArch64::FeatureStreamingAgnosticSME} }] in {
 def : RWSysReg<"MPAMSM_EL1",    0b11, 0b000, 0b1010, 0b0101, 0b011>;
-} // HasMPAM, HasSME
+} // HasMPAM, FeatureStreamingAgnosticSME
diff --git a/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp b/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
--- a/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
+++ b/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
@@ -3293,7 +3293,12 @@
     {"pauth", {AArch64::FeaturePAuth}},
     {"flagm", {AArch64::FeatureFlagM}},
     {"rme", {AArch64::FeatureRME}},
-    {"sme", {AArch64::FeatureSME}},
+    {"sme",
+     // Ensure that +nosme also implies +no-streaming-agnostic-sme and
+     // +no-streaming-sve, since those are not user-visible
+     // march flags.
+     {AArch64::FeatureSME, AArch64::FeatureSMEZA, AArch64::FeatureStreamingSVE,
+      AArch64::FeatureStreamingAgnosticSME}},
     {"sme-f64", {AArch64::FeatureSMEF64}},
     {"sme-i64", {AArch64::FeatureSMEI64}},
     {"hbc", {AArch64::FeatureHBC}},
diff --git a/llvm/test/MC/AArch64/SME/addha-u32.s b/llvm/test/MC/AArch64/SME/addha-u32.s
--- a/llvm/test/MC/AArch64/SME/addha-u32.s
+++ b/llvm/test/MC/AArch64/SME/addha-u32.s
@@ -1,3 +1,5 @@
+// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+streaming-sve,+sme-za < %s \
+// RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme < %s \
 // RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \
diff --git a/llvm/test/MC/AArch64/SME/addva-u32.s b/llvm/test/MC/AArch64/SME/addva-u32.s
--- a/llvm/test/MC/AArch64/SME/addva-u32.s
+++ b/llvm/test/MC/AArch64/SME/addva-u32.s
@@ -1,3 +1,5 @@
+// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+streaming-sve,+sme-za < %s \
+// RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme < %s \
 // RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \
diff --git a/llvm/test/MC/AArch64/SME/bfmopa.s b/llvm/test/MC/AArch64/SME/bfmopa.s
--- a/llvm/test/MC/AArch64/SME/bfmopa.s
+++ b/llvm/test/MC/AArch64/SME/bfmopa.s
@@ -1,3 +1,5 @@
+// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+streaming-sve,+sme-za < %s \
+// RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme < %s \
 // RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \
diff --git a/llvm/test/MC/AArch64/SME/bfmops.s b/llvm/test/MC/AArch64/SME/bfmops.s
--- a/llvm/test/MC/AArch64/SME/bfmops.s
+++ b/llvm/test/MC/AArch64/SME/bfmops.s
@@ -1,3 +1,5 @@
+// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+streaming-sve,+sme-za < %s \
+// RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme < %s \
 // RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \
diff --git a/llvm/test/MC/AArch64/SME/feature.s b/llvm/test/MC/AArch64/SME/feature.s
--- a/llvm/test/MC/AArch64/SME/feature.s
+++ b/llvm/test/MC/AArch64/SME/feature.s
@@ -8,4 +8,4 @@
 
 // Verify +sme flags imply +bf16
 bfdot z0.s, z1.h, z2.h
-// CHECK-INST: bfdot z0.s, z1.h, z2.h
+// CHECK: bfdot z0.s, z1.h, z2.h
diff --git a/llvm/test/MC/AArch64/SME/fmopa.s b/llvm/test/MC/AArch64/SME/fmopa.s
--- a/llvm/test/MC/AArch64/SME/fmopa.s
+++ b/llvm/test/MC/AArch64/SME/fmopa.s
@@ -1,3 +1,5 @@
+// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+streaming-sve,+sme-za < %s \
+// RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme < %s \
 // RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \
diff --git a/llvm/test/MC/AArch64/SME/fmops.s b/llvm/test/MC/AArch64/SME/fmops.s
--- a/llvm/test/MC/AArch64/SME/fmops.s
+++ b/llvm/test/MC/AArch64/SME/fmops.s
@@ -1,3 +1,5 @@
+// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+streaming-sve,+sme-za < %s \
+// RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme < %s \
 // RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \
diff --git a/llvm/test/MC/AArch64/SME/ld1b.s b/llvm/test/MC/AArch64/SME/ld1b.s
--- a/llvm/test/MC/AArch64/SME/ld1b.s
+++ b/llvm/test/MC/AArch64/SME/ld1b.s
@@ -1,3 +1,5 @@
+// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+streaming-sve,+sme-za < %s \
+// RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme < %s \
 // RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \
diff --git a/llvm/test/MC/AArch64/SME/ld1d.s b/llvm/test/MC/AArch64/SME/ld1d.s
--- a/llvm/test/MC/AArch64/SME/ld1d.s
+++ b/llvm/test/MC/AArch64/SME/ld1d.s
@@ -1,3 +1,5 @@
+// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+streaming-sve,+sme-za < %s \
+// RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme < %s \
 // RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \
diff --git a/llvm/test/MC/AArch64/SME/ld1h.s b/llvm/test/MC/AArch64/SME/ld1h.s
--- a/llvm/test/MC/AArch64/SME/ld1h.s
+++ b/llvm/test/MC/AArch64/SME/ld1h.s
@@ -1,3 +1,5 @@
+// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+streaming-sve,+sme-za < %s \
+// RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme < %s \
 // RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \
diff --git a/llvm/test/MC/AArch64/SME/ld1q.s b/llvm/test/MC/AArch64/SME/ld1q.s
--- a/llvm/test/MC/AArch64/SME/ld1q.s
+++ b/llvm/test/MC/AArch64/SME/ld1q.s
@@ -1,3 +1,5 @@
+// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+streaming-sve,+sme-za < %s \
+// RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme < %s \
 // RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \
diff --git a/llvm/test/MC/AArch64/SME/ld1w.s b/llvm/test/MC/AArch64/SME/ld1w.s
--- a/llvm/test/MC/AArch64/SME/ld1w.s
+++ b/llvm/test/MC/AArch64/SME/ld1w.s
@@ -1,3 +1,5 @@
+// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+streaming-sve,+sme-za < %s \
+// RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme < %s \
 // RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \
diff --git a/llvm/test/MC/AArch64/SME/ldr.s b/llvm/test/MC/AArch64/SME/ldr.s
--- a/llvm/test/MC/AArch64/SME/ldr.s
+++ b/llvm/test/MC/AArch64/SME/ldr.s
@@ -1,3 +1,5 @@
+// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+streaming-sve,+sme-za < %s \
+// RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme < %s \
 // RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \
diff --git a/llvm/test/MC/AArch64/SME/mova.s b/llvm/test/MC/AArch64/SME/mova.s
--- a/llvm/test/MC/AArch64/SME/mova.s
+++ b/llvm/test/MC/AArch64/SME/mova.s
@@ -1,3 +1,5 @@
+// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+streaming-sve,+sme-za < %s \
+// RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme < %s \
 // RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \
diff --git a/llvm/test/MC/AArch64/SME/psel.s b/llvm/test/MC/AArch64/SME/psel.s
--- a/llvm/test/MC/AArch64/SME/psel.s
+++ b/llvm/test/MC/AArch64/SME/psel.s
@@ -1,3 +1,5 @@
+// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+streaming-agnostic-sme < %s \
+// RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme < %s \
 // RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \
diff --git a/llvm/test/MC/AArch64/SME/revd.s b/llvm/test/MC/AArch64/SME/revd.s
--- a/llvm/test/MC/AArch64/SME/revd.s
+++ b/llvm/test/MC/AArch64/SME/revd.s
@@ -1,3 +1,5 @@
+// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+streaming-agnostic-sme,+streaming-sve,+bf16 < %s \
+// RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme < %s \
 // RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \
diff --git a/llvm/test/MC/AArch64/SME/sclamp.s b/llvm/test/MC/AArch64/SME/sclamp.s
--- a/llvm/test/MC/AArch64/SME/sclamp.s
+++ b/llvm/test/MC/AArch64/SME/sclamp.s
@@ -1,3 +1,5 @@
+// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+streaming-agnostic-sme,+streaming-sve,+bf16 < %s \
+// RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme < %s \
 // RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \
diff --git a/llvm/test/MC/AArch64/SME/smopa-32.s b/llvm/test/MC/AArch64/SME/smopa-32.s
--- a/llvm/test/MC/AArch64/SME/smopa-32.s
+++ b/llvm/test/MC/AArch64/SME/smopa-32.s
@@ -1,3 +1,5 @@
+// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+streaming-sve,+sme-za < %s \
+// RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme < %s \
 // RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \
diff --git a/llvm/test/MC/AArch64/SME/smops-32.s b/llvm/test/MC/AArch64/SME/smops-32.s
--- a/llvm/test/MC/AArch64/SME/smops-32.s
+++ b/llvm/test/MC/AArch64/SME/smops-32.s
@@ -1,3 +1,5 @@
+// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+streaming-sve,+sme-za < %s \
+// RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme < %s \
 // RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \
diff --git a/llvm/test/MC/AArch64/SME/smstart.s b/llvm/test/MC/AArch64/SME/smstart.s
--- a/llvm/test/MC/AArch64/SME/smstart.s
+++ b/llvm/test/MC/AArch64/SME/smstart.s
@@ -1,3 +1,5 @@
+// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+streaming-agnostic-sme < %s \
+// RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme < %s \
 // RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \
diff --git a/llvm/test/MC/AArch64/SME/smstop.s b/llvm/test/MC/AArch64/SME/smstop.s
--- a/llvm/test/MC/AArch64/SME/smstop.s
+++ b/llvm/test/MC/AArch64/SME/smstop.s
@@ -1,3 +1,5 @@
+// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+streaming-agnostic-sme < %s \
+// RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme < %s \
 // RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \
diff --git a/llvm/test/MC/AArch64/SME/st1b.s b/llvm/test/MC/AArch64/SME/st1b.s
--- a/llvm/test/MC/AArch64/SME/st1b.s
+++ b/llvm/test/MC/AArch64/SME/st1b.s
@@ -1,3 +1,5 @@
+// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+streaming-sve,+sme-za < %s \
+// RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme < %s \
 // RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \
diff --git a/llvm/test/MC/AArch64/SME/st1d.s b/llvm/test/MC/AArch64/SME/st1d.s
--- a/llvm/test/MC/AArch64/SME/st1d.s
+++ b/llvm/test/MC/AArch64/SME/st1d.s
@@ -1,3 +1,5 @@
+// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+streaming-sve,+sme-za < %s \
+// RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme < %s \
 // RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \
diff --git a/llvm/test/MC/AArch64/SME/st1h.s b/llvm/test/MC/AArch64/SME/st1h.s
--- a/llvm/test/MC/AArch64/SME/st1h.s
+++ b/llvm/test/MC/AArch64/SME/st1h.s
@@ -1,3 +1,5 @@
+// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+streaming-sve,+sme-za < %s \
+// RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme < %s \
 // RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \
diff --git a/llvm/test/MC/AArch64/SME/st1q.s b/llvm/test/MC/AArch64/SME/st1q.s
--- a/llvm/test/MC/AArch64/SME/st1q.s
+++ b/llvm/test/MC/AArch64/SME/st1q.s
@@ -1,3 +1,5 @@
+// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+streaming-sve,+sme-za < %s \
+// RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme < %s \
 // RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \
diff --git a/llvm/test/MC/AArch64/SME/st1w.s b/llvm/test/MC/AArch64/SME/st1w.s
--- a/llvm/test/MC/AArch64/SME/st1w.s
+++ b/llvm/test/MC/AArch64/SME/st1w.s
@@ -1,3 +1,5 @@
+// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+streaming-sve,+sme-za < %s \
+// RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme < %s \
 // RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \
diff --git a/llvm/test/MC/AArch64/SME/str.s b/llvm/test/MC/AArch64/SME/str.s
--- a/llvm/test/MC/AArch64/SME/str.s
+++ b/llvm/test/MC/AArch64/SME/str.s
@@ -1,3 +1,5 @@
+// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+streaming-sve,+sme-za < %s \
+// RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme < %s \
 // RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \
diff --git a/llvm/test/MC/AArch64/SME/streaming-mode-neon-fp16.s b/llvm/test/MC/AArch64/SME/streaming-mode-neon-fp16.s
--- a/llvm/test/MC/AArch64/SME/streaming-mode-neon-fp16.s
+++ b/llvm/test/MC/AArch64/SME/streaming-mode-neon-fp16.s
@@ -1,13 +1,15 @@
-// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+streaming-sve,+fullfp16 < %s \
+// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+streaming-sve,+bf16 < %s \
+// RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
+// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme < %s \
 // RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: not llvm-mc -triple=aarch64 -show-encoding -mattr=-neon < %s 2>&1 \
 // RUN:        | FileCheck %s --check-prefix=CHECK-ERROR
-// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+streaming-sve,+fullfp16 < %s \
+// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sme < %s \
 // RUN:        | llvm-objdump --mattr=+fullfp16 -d - | FileCheck %s --check-prefix=CHECK-INST
 // Disassemble encoding and check the re-encoding (-show-encoding) matches.
-// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+streaming-sve,+fullfp16 < %s \
+// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme < %s \
 // RUN:        | sed '/.text/d' | sed 's/.*encoding: //g' \
-// RUN:        | llvm-mc -triple=aarch64 -mattr=+streaming-sve,+fullfp16 -disassemble -show-encoding \
+// RUN:        | llvm-mc -triple=aarch64 -mattr=+sme -disassemble -show-encoding \
 // RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 
 // Scalar FP instructions
diff --git a/llvm/test/MC/AArch64/SME/sumopa-32.s b/llvm/test/MC/AArch64/SME/sumopa-32.s
--- a/llvm/test/MC/AArch64/SME/sumopa-32.s
+++ b/llvm/test/MC/AArch64/SME/sumopa-32.s
@@ -1,3 +1,5 @@
+// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+streaming-sve,+sme-za < %s \
+// RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme < %s \
 // RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \
diff --git a/llvm/test/MC/AArch64/SME/sumops-32.s b/llvm/test/MC/AArch64/SME/sumops-32.s
--- a/llvm/test/MC/AArch64/SME/sumops-32.s
+++ b/llvm/test/MC/AArch64/SME/sumops-32.s
@@ -1,3 +1,5 @@
+// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+streaming-sve,+sme-za < %s \
+// RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme < %s \
 // RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \
diff --git a/llvm/test/MC/AArch64/SME/system-regs.s b/llvm/test/MC/AArch64/SME/system-regs.s
--- a/llvm/test/MC/AArch64/SME/system-regs.s
+++ b/llvm/test/MC/AArch64/SME/system-regs.s
@@ -1,3 +1,5 @@
+// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+streaming-agnostic-sme < %s \
+// RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme < %s \
 // RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \
diff --git a/llvm/test/MC/AArch64/SME/uclamp.s b/llvm/test/MC/AArch64/SME/uclamp.s
--- a/llvm/test/MC/AArch64/SME/uclamp.s
+++ b/llvm/test/MC/AArch64/SME/uclamp.s
@@ -1,3 +1,5 @@
+// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+streaming-sve,+bf16 < %s \
+// RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme < %s \
 // RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \
diff --git a/llvm/test/MC/AArch64/SME/umopa-32.s b/llvm/test/MC/AArch64/SME/umopa-32.s
--- a/llvm/test/MC/AArch64/SME/umopa-32.s
+++ b/llvm/test/MC/AArch64/SME/umopa-32.s
@@ -1,3 +1,5 @@
+// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+streaming-sve,+sme-za < %s \
+// RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme < %s \
 // RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \
diff --git a/llvm/test/MC/AArch64/SME/umops-32.s b/llvm/test/MC/AArch64/SME/umops-32.s
--- a/llvm/test/MC/AArch64/SME/umops-32.s
+++ b/llvm/test/MC/AArch64/SME/umops-32.s
@@ -1,3 +1,5 @@
+// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+streaming-sve,+sme-za < %s \
+// RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme < %s \
 // RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \
diff --git a/llvm/test/MC/AArch64/SME/usmopa-32.s b/llvm/test/MC/AArch64/SME/usmopa-32.s
--- a/llvm/test/MC/AArch64/SME/usmopa-32.s
+++ b/llvm/test/MC/AArch64/SME/usmopa-32.s
@@ -1,3 +1,5 @@
+// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+streaming-sve,+sme-za < %s \
+// RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme < %s \
 // RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \
diff --git a/llvm/test/MC/AArch64/SME/usmops-32.s b/llvm/test/MC/AArch64/SME/usmops-32.s
--- a/llvm/test/MC/AArch64/SME/usmops-32.s
+++ b/llvm/test/MC/AArch64/SME/usmops-32.s
@@ -1,4 +1,4 @@
-// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme < %s \
+// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+streaming-sve,+sme-za < %s \
 // RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \
 // RUN:        | FileCheck %s --check-prefix=CHECK-ERROR
diff --git a/llvm/test/MC/AArch64/SME/zero.s b/llvm/test/MC/AArch64/SME/zero.s
--- a/llvm/test/MC/AArch64/SME/zero.s
+++ b/llvm/test/MC/AArch64/SME/zero.s
@@ -1,3 +1,5 @@
+// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+streaming-agnostic-sme,+sme-za < %s \
+// RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme < %s \
 // RUN:        | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
 // RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \
diff --git a/llvm/unittests/Support/TargetParserTest.cpp b/llvm/unittests/Support/TargetParserTest.cpp
--- a/llvm/unittests/Support/TargetParserTest.cpp
+++ b/llvm/unittests/Support/TargetParserTest.cpp
@@ -1532,9 +1532,9 @@
       {"i8mm", "noi8mm", "+i8mm", "-i8mm"},
       {"f32mm", "nof32mm", "+f32mm", "-f32mm"},
       {"f64mm", "nof64mm", "+f64mm", "-f64mm"},
-      {"sme", "nosme", "+sme", "-sme"},
-      {"sme-f64", "nosme-f64", "+sme-f64", "-sme-f64"},
-      {"sme-i64", "nosme-i64", "+sme-i64", "-sme-i64"},
+      {"sme", "nosme", "+sme", "-sme,-streaming-sve,-streaming-agnostic-sme"},
+      {"sme-f64", "nosme-f64", "+sme-f64", "-sme-f64,-sme,-streaming-sve,-streaming-agnostic-sme"},
+      {"sme-i64", "nosme-i64", "+sme-i64", "-sme-i64,-sme,-streaming-sve,-streaming-agnostic-sme"},
       {"hbc", "nohbc", "+hbc", "-hbc"},
       {"mops", "nomops", "+mops", "-mops"},
       {"pmuv3", "nopmuv3", "+perfmon", "-perfmon"},