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