@@ -792,90 +792,104 @@ def FeatureTLBIW : Extension<"tlbiw", "TLBIW",
792792//===----------------------------------------------------------------------===//
793793// Architectures.
794794//
795- def HasV8_0aOps : SubtargetFeature<"v8a", "HasV8_0aOps", "true",
796- "Support ARM v8.0a instructions", [FeatureEL2VMSA, FeatureEL3]>;
797-
798- def HasV8_1aOps : SubtargetFeature<"v8.1a", "HasV8_1aOps", "true",
799- "Support ARM v8.1a instructions", [HasV8_0aOps, FeatureCRC, FeatureLSE,
800- FeatureRDM, FeaturePAN, FeatureLOR, FeatureVH]>;
801-
802- def HasV8_2aOps : SubtargetFeature<"v8.2a", "HasV8_2aOps", "true",
803- "Support ARM v8.2a instructions", [HasV8_1aOps, FeaturePsUAO,
804- FeaturePAN_RWV, FeatureRAS, FeatureCCPP]>;
805-
806- def HasV8_3aOps : SubtargetFeature<"v8.3a", "HasV8_3aOps", "true",
807- "Support ARM v8.3a instructions", [HasV8_2aOps, FeatureRCPC, FeaturePAuth,
808- FeatureJS, FeatureCCIDX, FeatureComplxNum]>;
809-
810- def HasV8_4aOps : SubtargetFeature<"v8.4a", "HasV8_4aOps", "true",
811- "Support ARM v8.4a instructions", [HasV8_3aOps, FeatureDotProd,
812- FeatureNV, FeatureMPAM, FeatureDIT,
813- FeatureTRACEV8_4, FeatureAM, FeatureSEL2, FeatureTLB_RMI,
814- FeatureFlagM, FeatureRCPC_IMMO, FeatureLSE2]>;
795+ class Architecture64<
796+ int major, int minor, string profile,
797+ string target_feature_name,
798+ list<SubtargetFeature> implied_features,
799+ list<Extension> default_extensions
800+ > : SubtargetFeature<target_feature_name,
801+ "HasV" # major # "_" # minor # profile # "Ops", "true",
802+ "Support ARM " # target_feature_name # " architecture",
803+ implied_features
804+ > {
805+ int Major = major;
806+ int Minor = minor;
807+ string Profile = profile;
808+
809+ // Extensions enabled by default. Not the same as implied SubtargetFeatures.
810+ list<Extension> DefaultExts = default_extensions;
811+ }
815812
816- def HasV8_5aOps : SubtargetFeature<
817- "v8.5a", "HasV8_5aOps", "true", "Support ARM v8.5a instructions",
813+ def HasV8_0aOps : Architecture64<8, 0, "a", "v8a",
814+ [FeatureEL2VMSA, FeatureEL3],
815+ [FeatureFPARMv8, FeatureNEON]>;
816+ def HasV8_1aOps : Architecture64<8, 1, "a", "v8.1a",
817+ [HasV8_0aOps, FeatureCRC, FeatureLSE, FeatureRDM, FeaturePAN, FeatureLOR,
818+ FeatureVH],
819+ !listconcat(HasV8_0aOps.DefaultExts, [FeatureCRC, FeatureLSE, FeatureRDM])>;
820+ def HasV8_2aOps : Architecture64<8, 2, "a", "v8.2a",
821+ [HasV8_1aOps, FeaturePsUAO, FeaturePAN_RWV, FeatureRAS, FeatureCCPP],
822+ !listconcat(HasV8_1aOps.DefaultExts, [FeatureRAS])>;
823+ def HasV8_3aOps : Architecture64<8, 3, "a", "v8.3a",
824+ [HasV8_2aOps, FeatureRCPC, FeaturePAuth, FeatureJS, FeatureCCIDX,
825+ FeatureComplxNum],
826+ !listconcat(HasV8_2aOps.DefaultExts, [FeatureComplxNum, FeatureJS,
827+ FeaturePAuth, FeatureRCPC])>;
828+ def HasV8_4aOps : Architecture64<8, 4, "a", "v8.4a",
829+ [HasV8_3aOps, FeatureDotProd, FeatureNV, FeatureMPAM, FeatureDIT,
830+ FeatureTRACEV8_4, FeatureAM, FeatureSEL2, FeatureTLB_RMI, FeatureFlagM,
831+ FeatureRCPC_IMMO, FeatureLSE2],
832+ !listconcat(HasV8_3aOps.DefaultExts, [FeatureDotProd])>;
833+ def HasV8_5aOps : Architecture64<8, 5, "a", "v8.5a",
818834 [HasV8_4aOps, FeatureAltFPCmp, FeatureFRInt3264, FeatureSpecRestrict,
819- FeatureSSBS, FeatureSB, FeaturePredRes, FeatureCacheDeepPersist,
820- FeatureBranchTargetId]>;
821-
822- def HasV8_6aOps : SubtargetFeature<
823- "v8.6a", "HasV8_6aOps", "true", "Support ARM v8.6a instructions",
835+ FeatureSSBS, FeatureSB, FeaturePredRes, FeatureCacheDeepPersist,
836+ FeatureBranchTargetId],
837+ !listconcat(HasV8_4aOps.DefaultExts, [])>;
838+ def HasV8_6aOps : Architecture64<8, 6, "a", "v8.6a",
824839 [HasV8_5aOps, FeatureAMVS, FeatureBF16, FeatureFineGrainedTraps,
825- FeatureEnhancedCounterVirtualization, FeatureMatMulInt8]>;
826-
827- def HasV8_7aOps : SubtargetFeature<
828- "v8.7a", "HasV8_7aOps", "true", "Support ARM v8.7a instructions",
829- [HasV8_6aOps, FeatureXS, FeatureWFxT, FeatureHCX]>;
830-
831- def HasV8_8aOps : SubtargetFeature<
832- "v8.8a", "HasV8_8aOps", "true", "Support ARM v8.8a instructions",
833- [HasV8_7aOps, FeatureHBC, FeatureMOPS, FeatureNMI]>;
834-
835- def HasV8_9aOps : SubtargetFeature<
836- "v8.9a", "HasV8_9aOps", "true", "Support ARM v8.9a instructions",
840+ FeatureEnhancedCounterVirtualization, FeatureMatMulInt8],
841+ !listconcat(HasV8_5aOps.DefaultExts, [FeatureBF16, FeatureMatMulInt8])>;
842+ def HasV8_7aOps : Architecture64<8, 7, "a", "v8.7a",
843+ [HasV8_6aOps, FeatureXS, FeatureWFxT, FeatureHCX],
844+ !listconcat(HasV8_6aOps.DefaultExts, [])>;
845+ def HasV8_8aOps : Architecture64<8, 8, "a", "v8.8a",
846+ [HasV8_7aOps, FeatureHBC, FeatureMOPS, FeatureNMI],
847+ !listconcat(HasV8_7aOps.DefaultExts, [FeatureMOPS, FeatureHBC])>;
848+ def HasV8_9aOps : Architecture64<8, 9, "a", "v8.9a",
837849 [HasV8_8aOps, FeatureCLRBHB, FeaturePRFM_SLC, FeatureSPECRES2,
838- FeatureCSSC, FeatureRASv2, FeatureCHK]>;
839-
840- def HasV9_0aOps : SubtargetFeature<
841- "v9a", "HasV9_0aOps", "true", "Support ARM v9a instructions",
842- [HasV8_5aOps, FeatureMEC, FeatureSVE2]>;
843-
844- def HasV9_1aOps : SubtargetFeature<
845- "v9.1a", "HasV9_1aOps", "true", "Support ARM v9.1a instructions",
846- [HasV8_6aOps, HasV9_0aOps]>;
847-
848- def HasV9_2aOps : SubtargetFeature<
849- "v9.2a", "HasV9_2aOps", "true", "Support ARM v9.2a instructions",
850- [HasV8_7aOps, HasV9_1aOps]>;
851-
852- def HasV9_3aOps : SubtargetFeature<
853- "v9.3a", "HasV9_3aOps", "true", "Support ARM v9.3a instructions",
854- [HasV8_8aOps, HasV9_2aOps]>;
855-
856- def HasV9_4aOps : SubtargetFeature<
857- "v9.4a", "HasV9_4aOps", "true", "Support ARM v9.4a instructions",
858- [HasV8_9aOps, HasV9_3aOps]>;
859-
860- def HasV9_5aOps : SubtargetFeature<
861- "v9.5a", "HasV9_5aOps", "true", "Support ARM v9.5a instructions",
862- [HasV9_4aOps, FeatureCPA]>;
863-
864- def HasV8_0rOps : SubtargetFeature<
865- "v8r", "HasV8_0rOps", "true", "Support ARM v8r instructions",
866- [//v8.1
867- FeatureCRC, FeaturePAN, FeatureLSE, FeatureCONTEXTIDREL2,
868- //v8.2
869- FeatureRAS, FeaturePsUAO, FeatureCCPP, FeaturePAN_RWV,
870- //v8.3
871- FeatureCCIDX, FeaturePAuth, FeatureRCPC,
872- //v8.4
873- FeatureTRACEV8_4, FeatureTLB_RMI, FeatureFlagM, FeatureDIT, FeatureSEL2,
874- FeatureRCPC_IMMO,
875- // Not mandatory in v8.0-R, but included here on the grounds that it
876- // only enables names of system registers
877- FeatureSpecRestrict
878- ]>;
850+ FeatureCSSC, FeatureRASv2, FeatureCHK],
851+ !listconcat(HasV8_8aOps.DefaultExts, [FeatureSPECRES2, FeatureCSSC,
852+ FeatureRASv2])>;
853+ def HasV9_0aOps : Architecture64<9, 0, "a", "v9a",
854+ [HasV8_5aOps, FeatureMEC, FeatureSVE2],
855+ !listconcat(HasV8_5aOps.DefaultExts, [FeatureFullFP16, FeatureSVE,
856+ FeatureSVE2])>;
857+ def HasV9_1aOps : Architecture64<9, 1, "a", "v9.1a",
858+ [HasV8_6aOps, HasV9_0aOps],
859+ !listconcat(HasV9_0aOps.DefaultExts, [FeatureBF16, FeatureMatMulInt8])>;
860+ def HasV9_2aOps : Architecture64<9, 2, "a", "v9.2a",
861+ [HasV8_7aOps, HasV9_1aOps],
862+ !listconcat(HasV9_1aOps.DefaultExts, [])>;
863+ def HasV9_3aOps : Architecture64<9, 3, "a", "v9.3a",
864+ [HasV8_8aOps, HasV9_2aOps],
865+ !listconcat(HasV9_2aOps.DefaultExts, [FeatureMOPS, FeatureHBC])>;
866+ def HasV9_4aOps : Architecture64<9, 4, "a", "v9.4a",
867+ [HasV8_9aOps, HasV9_3aOps],
868+ !listconcat(HasV9_3aOps.DefaultExts, [FeatureSPECRES2, FeatureCSSC,
869+ FeatureRASv2])>;
870+ def HasV9_5aOps : Architecture64<9, 5, "a", "v9.5a",
871+ [HasV9_4aOps, FeatureCPA],
872+ !listconcat(HasV9_4aOps.DefaultExts, [FeatureCPA])>;
873+ def HasV8_0rOps : Architecture64<8, 0, "r", "v8r",
874+ [ //v8.1
875+ FeatureCRC, FeaturePAN, FeatureLSE, FeatureCONTEXTIDREL2,
876+ //v8.2
877+ FeatureRAS, FeaturePsUAO, FeatureCCPP, FeaturePAN_RWV,
878+ //v8.3
879+ FeatureCCIDX, FeaturePAuth, FeatureRCPC,
880+ //v8.4
881+ FeatureTRACEV8_4, FeatureTLB_RMI, FeatureFlagM, FeatureDIT, FeatureSEL2,
882+ FeatureRCPC_IMMO,
883+ // Not mandatory in v8.0-R, but included here on the grounds that it
884+ // only enables names of system registers
885+ FeatureSpecRestrict
886+ ],
887+ // For v8-R, we do not enable crypto and align with GCC that enables a more
888+ // minimal set of optional architecture extensions.
889+ !listconcat(
890+ !listremove(HasV8_5aOps.DefaultExts, [FeatureLSE]),
891+ [FeatureSSBS, FeatureFullFP16, FeatureFP16FML, FeatureSB]
892+ )>;
879893
880894//===----------------------------------------------------------------------===//
881895// Access to privileged registers
0 commit comments