diff options
Diffstat (limited to 'llvm/lib/TargetParser/AArch64TargetParser.cpp')
| -rw-r--r-- | llvm/lib/TargetParser/AArch64TargetParser.cpp | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/llvm/lib/TargetParser/AArch64TargetParser.cpp b/llvm/lib/TargetParser/AArch64TargetParser.cpp index fe5ab0fabefa..50c9a565e7ae 100644 --- a/llvm/lib/TargetParser/AArch64TargetParser.cpp +++ b/llvm/lib/TargetParser/AArch64TargetParser.cpp @@ -61,12 +61,20 @@ unsigned AArch64::getFMVPriority(ArrayRef<StringRef> Features) { return Priority + MaxFMVPriority * NumFeatures; } -uint64_t AArch64::getCpuSupportsMask(ArrayRef<StringRef> FeatureStrs) { +uint64_t AArch64::getCpuSupportsMask(ArrayRef<StringRef> Features) { + // Transitively enable the Arch Extensions which correspond to each feature. + ExtensionSet FeatureBits; + for (const StringRef Feature : Features) + if (std::optional<FMVInfo> Info = parseFMVExtension(Feature)) + if (Info->ID) + FeatureBits.enable(*Info->ID); + + // Construct a bitmask for all the transitively enabled Arch Extensions. uint64_t FeaturesMask = 0; - for (const StringRef &FeatureStr : FeatureStrs) { - if (auto Ext = parseFMVExtension(FeatureStr)) - FeaturesMask |= (1ULL << Ext->Bit); - } + for (const FMVInfo &Info : getFMVInfo()) + if (Info.ID && FeatureBits.Enabled.test(*Info.ID)) + FeaturesMask |= (1ULL << Info.Bit); + return FeaturesMask; } |
