@@ -792,90 +792,104 @@ def FeatureTLBIW : Extension<"tlbiw", "TLBIW",
792
792
//===----------------------------------------------------------------------===//
793
793
// Architectures.
794
794
//
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
+ }
815
812
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",
818
834
[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",
824
839
[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",
837
849
[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
+ )>;
879
893
880
894
//===----------------------------------------------------------------------===//
881
895
// Access to privileged registers
0 commit comments