@@ -91,7 +91,6 @@ enum CPUFeatures {
9191// feature name (though the canonical reference for those is AArch64.td)
9292// clang-format off
9393enum ArchExtKind : uint64_t {
94- AEK_INVALID = 0 ,
9594 AEK_NONE = 1 ,
9695 AEK_CRC = 1 << 1 , // FEAT_CRC32
9796 AEK_CRYPTO = 1 << 2 ,
@@ -252,7 +251,6 @@ inline constexpr ExtensionInfo Extensions[] = {
252251 {" wfxt" , AArch64::AEK_NONE, {}, {}, FEAT_WFXT, " +wfxt" , 550 },
253252 // Special cases
254253 {" none" , AArch64::AEK_NONE, {}, {}, FEAT_MAX, " " , ExtensionInfo::MaxFMVPriority},
255- {" invalid" , AArch64::AEK_INVALID, {}, {}, FEAT_MAX, " " , 0 },
256254};
257255// clang-format on
258256
@@ -280,12 +278,12 @@ struct ArchInfo {
280278 // v v v v v
281279 // v8.9a > v8.8a > v8.7a > v8.6a > v8.5a > v8.4a > ... > v8a;
282280 //
283- // v8r and INVALID have no relation to anything. This is used to
284- // determine which features to enable for a given architecture. See
281+ // v8r has no relation to anything. This is used to determine which
282+ // features to enable for a given architecture. See
285283 // AArch64TargetInfo::setFeatureEnabled.
286284 bool implies (const ArchInfo &Other) const {
287285 if (this ->Profile != Other.Profile )
288- return false ; // ARMV8R and INVALID
286+ return false ; // ARMV8R
289287 if (this ->Version .getMajor () == Other.Version .getMajor ()) {
290288 return this ->Version > Other.Version ;
291289 }
@@ -300,11 +298,10 @@ struct ArchInfo {
300298 StringRef getSubArch () const { return ArchFeature.substr (1 ); }
301299
302300 // Search for ArchInfo by SubArch name
303- static const ArchInfo & findBySubArch (StringRef SubArch);
301+ static std::optional< ArchInfo> findBySubArch (StringRef SubArch);
304302};
305303
306304// clang-format off
307- inline constexpr ArchInfo INVALID = { VersionTuple{0 , 0 }, AProfile, " invalid" , " +" , (AArch64::AEK_NONE)};
308305inline constexpr ArchInfo ARMV8A = { VersionTuple{8 , 0 }, AProfile, " armv8-a" , " +v8a" , (AArch64::AEK_FP | AArch64::AEK_SIMD), };
309306inline constexpr ArchInfo ARMV8_1A = { VersionTuple{8 , 1 }, AProfile, " armv8.1-a" , " +v8.1a" , (ARMV8A.DefaultExts | AArch64::AEK_CRC | AArch64::AEK_LSE | AArch64::AEK_RDM)};
310307inline constexpr ArchInfo ARMV8_2A = { VersionTuple{8 , 2 }, AProfile, " armv8.2-a" , " +v8.2a" , (ARMV8_1A.DefaultExts | AArch64::AEK_RAS)};
@@ -325,10 +322,10 @@ inline constexpr ArchInfo ARMV8R = { VersionTuple{8, 0}, RProfile, "armv8-r",
325322// clang-format on
326323
327324// The set of all architectures
328- static constexpr std::array<const ArchInfo *, 17 > ArchInfos = {
329- &INVALID, & ARMV8A, &ARMV8_1A, &ARMV8_2A, &ARMV8_3A, &ARMV8_4A,
330- &ARMV8_5A, & ARMV8_6A, &ARMV8_7A, &ARMV8_8A, &ARMV8_9A, &ARMV9A,
331- &ARMV9_1A, & ARMV9_2A, &ARMV9_3A, &ARMV9_4A, &ARMV8R,
325+ static constexpr std::array<const ArchInfo *, 16 > ArchInfos = {
326+ &ARMV8A, &ARMV8_1A, &ARMV8_2A, &ARMV8_3A, &ARMV8_4A, &ARMV8_5A ,
327+ &ARMV8_6A, &ARMV8_7A, &ARMV8_8A, &ARMV8_9A, &ARMV9A, &ARMV9_1A ,
328+ &ARMV9_2A, &ARMV9_3A, &ARMV9_4A, &ARMV8R,
332329};
333330
334331// Details of a specific CPU.
@@ -337,6 +334,10 @@ struct CpuInfo {
337334 const ArchInfo &Arch;
338335 uint64_t DefaultExtensions; // Default extensions for this CPU. These will be
339336 // ORd with the architecture defaults.
337+
338+ uint64_t getImpliedExtensions () const {
339+ return DefaultExtensions | Arch.DefaultExts ;
340+ }
340341};
341342
342343inline constexpr CpuInfo CpuInfos[] = {
@@ -495,8 +496,6 @@ inline constexpr CpuInfo CpuInfos[] = {
495496 (AArch64::AEK_FP16 | AArch64::AEK_RAND | AArch64::AEK_SM4 |
496497 AArch64::AEK_SHA3 | AArch64::AEK_SHA2 | AArch64::AEK_AES |
497498 AArch64::AEK_MTE | AArch64::AEK_SB | AArch64::AEK_SSBS)},
498- // Invalid CPU
499- {" invalid" , INVALID, (AArch64::AEK_INVALID)},
500499};
501500
502501// An alias for a CPU.
@@ -514,15 +513,13 @@ StringRef getArchExtFeature(StringRef ArchExt);
514513StringRef resolveCPUAlias (StringRef CPU);
515514
516515// Information by Name
517- uint64_t getDefaultExtensions (StringRef CPU, const ArchInfo &AI);
518- void getFeatureOption (StringRef Name, std::string &Feature);
519- const ArchInfo &getArchForCpu (StringRef CPU);
516+ std::optional<ArchInfo> getArchForCpu (StringRef CPU);
520517
521518// Parser
522- const ArchInfo & parseArch (StringRef Arch);
523- ArchExtKind parseArchExt (StringRef ArchExt );
519+ std::optional< ArchInfo> parseArch (StringRef Arch);
520+ std::optional<ExtensionInfo> parseArchExtension (StringRef Extension );
524521// Given the name of a CPU or alias, return the correponding CpuInfo.
525- const CpuInfo & parseCpu (StringRef Name);
522+ std::optional< CpuInfo> parseCpu (StringRef Name);
526523// Used by target parser tests
527524void fillValidCPUArchList (SmallVectorImpl<StringRef> &Values);
528525
0 commit comments