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"},