@@ -914,6 +914,66 @@ void AArch64TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
914914
915915bool AArch64TargetInfo::handleTargetFeatures (std::vector<std::string> &Features,
916916 DiagnosticsEngine &Diags) {
917+ // The first round, address the ARM version initially.
918+ for (const auto &Feature : Features) {
919+ // All predecessor archs are added but select the latest one for ArchKind.
920+ if (Feature == " +v8a" && ArchInfo->Version < llvm::AArch64::ARMV8A.Version )
921+ ArchInfo = &llvm::AArch64::ARMV8A;
922+ if (Feature == " +v8.1a" &&
923+ ArchInfo->Version < llvm::AArch64::ARMV8_1A.Version )
924+ ArchInfo = &llvm::AArch64::ARMV8_1A;
925+ if (Feature == " +v8.2a" &&
926+ ArchInfo->Version < llvm::AArch64::ARMV8_2A.Version )
927+ ArchInfo = &llvm::AArch64::ARMV8_2A;
928+ if (Feature == " +v8.3a" &&
929+ ArchInfo->Version < llvm::AArch64::ARMV8_3A.Version )
930+ ArchInfo = &llvm::AArch64::ARMV8_3A;
931+ if (Feature == " +v8.4a" &&
932+ ArchInfo->Version < llvm::AArch64::ARMV8_4A.Version )
933+ ArchInfo = &llvm::AArch64::ARMV8_4A;
934+ if (Feature == " +v8.5a" &&
935+ ArchInfo->Version < llvm::AArch64::ARMV8_5A.Version )
936+ ArchInfo = &llvm::AArch64::ARMV8_5A;
937+ if (Feature == " +v8.6a" &&
938+ ArchInfo->Version < llvm::AArch64::ARMV8_6A.Version )
939+ ArchInfo = &llvm::AArch64::ARMV8_6A;
940+ if (Feature == " +v8.7a" &&
941+ ArchInfo->Version < llvm::AArch64::ARMV8_7A.Version )
942+ ArchInfo = &llvm::AArch64::ARMV8_7A;
943+ if (Feature == " +v8.8a" &&
944+ ArchInfo->Version < llvm::AArch64::ARMV8_8A.Version )
945+ ArchInfo = &llvm::AArch64::ARMV8_8A;
946+ if (Feature == " +v8.9a" &&
947+ ArchInfo->Version < llvm::AArch64::ARMV8_9A.Version )
948+ ArchInfo = &llvm::AArch64::ARMV8_9A;
949+ if (Feature == " +v9a" && ArchInfo->Version < llvm::AArch64::ARMV9A.Version )
950+ ArchInfo = &llvm::AArch64::ARMV9A;
951+ if (Feature == " +v9.1a" &&
952+ ArchInfo->Version < llvm::AArch64::ARMV9_1A.Version )
953+ ArchInfo = &llvm::AArch64::ARMV9_1A;
954+ if (Feature == " +v9.2a" &&
955+ ArchInfo->Version < llvm::AArch64::ARMV9_2A.Version )
956+ ArchInfo = &llvm::AArch64::ARMV9_2A;
957+ if (Feature == " +v9.3a" &&
958+ ArchInfo->Version < llvm::AArch64::ARMV9_3A.Version )
959+ ArchInfo = &llvm::AArch64::ARMV9_3A;
960+ if (Feature == " +v9.4a" &&
961+ ArchInfo->Version < llvm::AArch64::ARMV9_4A.Version )
962+ ArchInfo = &llvm::AArch64::ARMV9_4A;
963+ if (Feature == " +v9.5a" &&
964+ ArchInfo->Version < llvm::AArch64::ARMV9_5A.Version )
965+ ArchInfo = &llvm::AArch64::ARMV9_5A;
966+ if (Feature == " +v9.6a" &&
967+ ArchInfo->Version < llvm::AArch64::ARMV9_6A.Version )
968+ ArchInfo = &llvm::AArch64::ARMV9_6A;
969+ if (Feature == " +v8r" )
970+ ArchInfo = &llvm::AArch64::ARMV8R;
971+ }
972+
973+ setDataLayout ();
974+ setArchFeatures ();
975+
976+ // The second round, address each feature.
917977 for (const auto &Feature : Features) {
918978 if (Feature == " -fp-armv8" )
919979 HasNoFP = true ;
@@ -944,13 +1004,17 @@ bool AArch64TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
9441004 HasFullFP16 = true ;
9451005 HasSVE2 = true ;
9461006 }
1007+ if (Feature == " -sve2" )
1008+ HasSVE2 = false ;
9471009 if (Feature == " +sve2p1" ) {
9481010 FPU |= NeonMode;
9491011 FPU |= SveMode;
9501012 HasFullFP16 = true ;
9511013 HasSVE2 = true ;
9521014 HasSVE2p1 = true ;
9531015 }
1016+ if (Feature == " -sve2p1" )
1017+ HasSVE2p1 = false ;
9541018 if (Feature == " +sve-aes" ) {
9551019 FPU |= NeonMode;
9561020 HasFullFP16 = true ;
@@ -994,19 +1058,25 @@ bool AArch64TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
9941058 HasBFloat16 = true ;
9951059 HasFullFP16 = true ;
9961060 }
1061+ if (Feature == " -sme" )
1062+ HasSME = false ;
9971063 if (Feature == " +sme2" ) {
9981064 HasSME = true ;
9991065 HasSME2 = true ;
10001066 HasBFloat16 = true ;
10011067 HasFullFP16 = true ;
10021068 }
1069+ if (Feature == " -sme2" )
1070+ HasSME2 = false ;
10031071 if (Feature == " +sme2p1" ) {
10041072 HasSME = true ;
10051073 HasSME2 = true ;
10061074 HasSME2p1 = true ;
10071075 HasBFloat16 = true ;
10081076 HasFullFP16 = true ;
10091077 }
1078+ if (Feature == " -sme2p1" )
1079+ HasSME2p1 = false ;
10101080 if (Feature == " +sme-f64f64" ) {
10111081 HasSME = true ;
10121082 HasSMEF64F64 = true ;
@@ -1043,20 +1113,34 @@ bool AArch64TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
10431113 }
10441114 if (Feature == " +sb" )
10451115 HasSB = true ;
1116+ if (Feature == " -sb" )
1117+ HasSB = false ;
10461118 if (Feature == " +predres" )
10471119 HasPredRes = true ;
1120+ if (Feature == " -predres" )
1121+ HasPredRes = false ;
10481122 if (Feature == " +ssbs" )
10491123 HasSSBS = true ;
1124+ if (Feature == " -ssbs" )
1125+ HasSSBS = false ;
10501126 if (Feature == " +bti" )
10511127 HasBTI = true ;
1128+ if (Feature == " -bti" )
1129+ HasBTI = false ;
10521130 if (Feature == " +wfxt" )
10531131 HasWFxT = true ;
1132+ if (Feature == " -wfxt" )
1133+ HasWFxT = false ;
10541134 if (Feature == " -fmv" )
10551135 HasFMV = false ;
10561136 if (Feature == " +crc" )
10571137 HasCRC = true ;
1138+ if (Feature == " -crc" )
1139+ HasCRC = false ;
10581140 if (Feature == " +rcpc" )
10591141 HasRCPC = true ;
1142+ if (Feature == " -rcpc" )
1143+ HasRCPC = false ;
10601144 if (Feature == " +aes" ) {
10611145 FPU |= NeonMode;
10621146 HasAES = true ;
@@ -1074,83 +1158,45 @@ bool AArch64TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
10741158 FPU |= NeonMode;
10751159 HasRDM = true ;
10761160 }
1161+ if (Feature == " -rdm" )
1162+ HasRDM = false ;
10771163 if (Feature == " +dit" )
10781164 HasDIT = true ;
1165+ if (Feature == " -dit" )
1166+ HasDIT = false ;
10791167 if (Feature == " +cccp" )
10801168 HasCCPP = true ;
1169+ if (Feature == " -cccp" )
1170+ HasCCPP = false ;
10811171 if (Feature == " +ccdp" ) {
10821172 HasCCPP = true ;
10831173 HasCCDP = true ;
10841174 }
1175+ if (Feature == " -ccdp" )
1176+ HasCCDP = false ;
10851177 if (Feature == " +fptoint" )
10861178 HasFRInt3264 = true ;
1179+ if (Feature == " -fptoint" )
1180+ HasFRInt3264 = false ;
10871181 if (Feature == " +sm4" ) {
10881182 FPU |= NeonMode;
10891183 HasSM4 = true ;
10901184 }
10911185 if (Feature == " +strict-align" )
10921186 HasUnalignedAccess = false ;
10931187
1094- // All predecessor archs are added but select the latest one for ArchKind.
1095- if (Feature == " +v8a" && ArchInfo->Version < llvm::AArch64::ARMV8A.Version )
1096- ArchInfo = &llvm::AArch64::ARMV8A;
1097- if (Feature == " +v8.1a" &&
1098- ArchInfo->Version < llvm::AArch64::ARMV8_1A.Version )
1099- ArchInfo = &llvm::AArch64::ARMV8_1A;
1100- if (Feature == " +v8.2a" &&
1101- ArchInfo->Version < llvm::AArch64::ARMV8_2A.Version )
1102- ArchInfo = &llvm::AArch64::ARMV8_2A;
1103- if (Feature == " +v8.3a" &&
1104- ArchInfo->Version < llvm::AArch64::ARMV8_3A.Version )
1105- ArchInfo = &llvm::AArch64::ARMV8_3A;
1106- if (Feature == " +v8.4a" &&
1107- ArchInfo->Version < llvm::AArch64::ARMV8_4A.Version )
1108- ArchInfo = &llvm::AArch64::ARMV8_4A;
1109- if (Feature == " +v8.5a" &&
1110- ArchInfo->Version < llvm::AArch64::ARMV8_5A.Version )
1111- ArchInfo = &llvm::AArch64::ARMV8_5A;
1112- if (Feature == " +v8.6a" &&
1113- ArchInfo->Version < llvm::AArch64::ARMV8_6A.Version )
1114- ArchInfo = &llvm::AArch64::ARMV8_6A;
1115- if (Feature == " +v8.7a" &&
1116- ArchInfo->Version < llvm::AArch64::ARMV8_7A.Version )
1117- ArchInfo = &llvm::AArch64::ARMV8_7A;
1118- if (Feature == " +v8.8a" &&
1119- ArchInfo->Version < llvm::AArch64::ARMV8_8A.Version )
1120- ArchInfo = &llvm::AArch64::ARMV8_8A;
1121- if (Feature == " +v8.9a" &&
1122- ArchInfo->Version < llvm::AArch64::ARMV8_9A.Version )
1123- ArchInfo = &llvm::AArch64::ARMV8_9A;
1124- if (Feature == " +v9a" && ArchInfo->Version < llvm::AArch64::ARMV9A.Version )
1125- ArchInfo = &llvm::AArch64::ARMV9A;
1126- if (Feature == " +v9.1a" &&
1127- ArchInfo->Version < llvm::AArch64::ARMV9_1A.Version )
1128- ArchInfo = &llvm::AArch64::ARMV9_1A;
1129- if (Feature == " +v9.2a" &&
1130- ArchInfo->Version < llvm::AArch64::ARMV9_2A.Version )
1131- ArchInfo = &llvm::AArch64::ARMV9_2A;
1132- if (Feature == " +v9.3a" &&
1133- ArchInfo->Version < llvm::AArch64::ARMV9_3A.Version )
1134- ArchInfo = &llvm::AArch64::ARMV9_3A;
1135- if (Feature == " +v9.4a" &&
1136- ArchInfo->Version < llvm::AArch64::ARMV9_4A.Version )
1137- ArchInfo = &llvm::AArch64::ARMV9_4A;
1138- if (Feature == " +v9.5a" &&
1139- ArchInfo->Version < llvm::AArch64::ARMV9_5A.Version )
1140- ArchInfo = &llvm::AArch64::ARMV9_5A;
1141- if (Feature == " +v9.6a" &&
1142- ArchInfo->Version < llvm::AArch64::ARMV9_6A.Version )
1143- ArchInfo = &llvm::AArch64::ARMV9_6A;
1144- if (Feature == " +v8r" )
1145- ArchInfo = &llvm::AArch64::ARMV8R;
11461188 if (Feature == " +fullfp16" ) {
11471189 FPU |= NeonMode;
11481190 HasFullFP16 = true ;
11491191 }
1192+ if (Feature == " -fullfp16" )
1193+ HasFullFP16 = false ;
11501194 if (Feature == " +dotprod" ) {
11511195 FPU |= NeonMode;
11521196 HasDotProd = true ;
11531197 }
1198+ if (Feature == " -dotprod" )
1199+ HasDotProd = false ;
11541200 if (Feature == " +fp16fml" ) {
11551201 FPU |= NeonMode;
11561202 HasFullFP16 = true ;
@@ -1164,20 +1210,30 @@ bool AArch64TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
11641210 HasPAuth = true ;
11651211 if (Feature == " +i8mm" )
11661212 HasMatMul = true ;
1213+ if (Feature == " -i8mm" )
1214+ HasMatMul = false ;
11671215 if (Feature == " +bf16" )
11681216 HasBFloat16 = true ;
1217+ if (Feature == " -bf16" )
1218+ HasBFloat16 = false ;
11691219 if (Feature == " +lse" )
11701220 HasLSE = true ;
1221+ if (Feature == " -lse" )
1222+ HasLSE = false ;
11711223 if (Feature == " +ls64" )
11721224 HasLS64 = true ;
11731225 if (Feature == " +rand" )
11741226 HasRandGen = true ;
11751227 if (Feature == " +flagm" )
11761228 HasFlagM = true ;
1229+ if (Feature == " -flagm" )
1230+ HasFlagM = false ;
11771231 if (Feature == " +altnzcv" ) {
11781232 HasFlagM = true ;
11791233 HasAlternativeNZCV = true ;
11801234 }
1235+ if (Feature == " -altnzcv" )
1236+ HasAlternativeNZCV = false ;
11811237 if (Feature == " +mops" )
11821238 HasMOPS = true ;
11831239 if (Feature == " +d128" )
@@ -1192,17 +1248,6 @@ bool AArch64TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
11921248 }
11931249 }
11941250
1195- // Check features that are manually disabled by command line options.
1196- // This needs to be checked after architecture-related features are handled,
1197- // making sure they are properly disabled when required.
1198- for (const auto &Feature : Features) {
1199- if (Feature == " -d128" )
1200- HasD128 = false ;
1201- }
1202-
1203- setDataLayout ();
1204- setArchFeatures ();
1205-
12061251 if (HasNoFP) {
12071252 FPU &= ~FPUMode;
12081253 FPU &= ~NeonMode;
0 commit comments