diff options
Diffstat (limited to 'llvm/lib/TargetParser/AArch64TargetParser.cpp')
| -rw-r--r-- | llvm/lib/TargetParser/AArch64TargetParser.cpp | 86 |
1 files changed, 62 insertions, 24 deletions
diff --git a/llvm/lib/TargetParser/AArch64TargetParser.cpp b/llvm/lib/TargetParser/AArch64TargetParser.cpp index ca356ec82bf1..7986f07538df 100644 --- a/llvm/lib/TargetParser/AArch64TargetParser.cpp +++ b/llvm/lib/TargetParser/AArch64TargetParser.cpp @@ -23,6 +23,9 @@ using namespace llvm; +#define EMIT_FMV_INFO +#include "llvm/TargetParser/AArch64TargetParserDef.inc" + static unsigned checkArchVersion(llvm::StringRef Arch) { if (Arch.size() >= 2 && Arch[0] == 'v' && std::isdigit(Arch[1])) return (Arch[1] - 48); @@ -30,9 +33,6 @@ static unsigned checkArchVersion(llvm::StringRef Arch) { } const AArch64::ArchInfo *AArch64::getArchForCpu(StringRef CPU) { - if (CPU == "generic") - return &ARMV8A; - // Note: this now takes cpu aliases into account std::optional<CpuInfo> Cpu = parseCpu(CPU); if (!Cpu) @@ -50,8 +50,8 @@ std::optional<AArch64::ArchInfo> AArch64::ArchInfo::findBySubArch(StringRef SubA uint64_t AArch64::getCpuSupportsMask(ArrayRef<StringRef> FeatureStrs) { uint64_t FeaturesMask = 0; for (const StringRef &FeatureStr : FeatureStrs) { - if (auto Ext = parseArchExtension(FeatureStr)) - FeaturesMask |= (1ULL << Ext->CPUFeature); + if (auto Ext = parseFMVExtension(FeatureStr)) + FeaturesMask |= (1ULL << Ext->Bit); } return FeaturesMask; } @@ -79,7 +79,7 @@ StringRef AArch64::getArchExtFeature(StringRef ArchExt) { StringRef ArchExtBase = IsNegated ? ArchExt.drop_front(2) : ArchExt; if (auto AE = parseArchExtension(ArchExtBase)) { - // Note: the returned string can be empty. + assert(!(AE.has_value() && AE->NegFeature.empty())); return IsNegated ? AE->NegFeature : AE->Feature; } @@ -122,6 +122,26 @@ AArch64::parseArchExtension(StringRef ArchExt) { return {}; } +std::optional<AArch64::FMVInfo> AArch64::parseFMVExtension(StringRef FMVExt) { + // FIXME introduce general alias functionality, or remove this exception. + if (FMVExt == "rdma") + FMVExt = "rdm"; + + for (const auto &I : getFMVInfo()) { + if (FMVExt == I.Name) + return I; + } + return {}; +} + +std::optional<AArch64::ExtensionInfo> +AArch64::targetFeatureToExtension(StringRef TargetFeature) { + for (const auto &E : Extensions) + if (TargetFeature == E.Feature) + return E; + return {}; +} + std::optional<AArch64::CpuInfo> AArch64::parseCpu(StringRef Name) { // Resolve aliases first. Name = resolveCPUAlias(Name); @@ -213,21 +233,6 @@ void AArch64::ExtensionSet::disable(ArchExtKind E) { disable(Dep.Later); } -void AArch64::ExtensionSet::toLLVMFeatureList( - std::vector<StringRef> &Features) const { - if (BaseArch && !BaseArch->ArchFeature.empty()) - Features.push_back(BaseArch->ArchFeature); - - for (const auto &E : Extensions) { - if (E.Feature.empty() || !Touched.test(E.ID)) - continue; - if (Enabled.test(E.ID)) - Features.push_back(E.Feature); - else - Features.push_back(E.NegFeature); - } -} - void AArch64::ExtensionSet::addCPUDefaults(const CpuInfo &CPU) { LLVM_DEBUG(llvm::dbgs() << "addCPUDefaults(" << CPU.Name << ")\n"); BaseArch = &CPU.Arch; @@ -247,11 +252,18 @@ void AArch64::ExtensionSet::addArchDefaults(const ArchInfo &Arch) { enable(E.ID); } -bool AArch64::ExtensionSet::parseModifier(StringRef Modifier) { +bool AArch64::ExtensionSet::parseModifier(StringRef Modifier, + const bool AllowNoDashForm) { LLVM_DEBUG(llvm::dbgs() << "parseModifier(" << Modifier << ")\n"); - bool IsNegated = Modifier.starts_with("no"); - StringRef ArchExt = IsNegated ? Modifier.drop_front(2) : Modifier; + size_t NChars = 0; + // The "no-feat" form is allowed in the target attribute but nowhere else. + if (AllowNoDashForm && Modifier.starts_with("no-")) + NChars = 3; + else if (Modifier.starts_with("no")) + NChars = 2; + bool IsNegated = NChars != 0; + StringRef ArchExt = Modifier.drop_front(NChars); if (auto AE = parseArchExtension(ArchExt)) { if (AE->Feature.empty() || AE->NegFeature.empty()) @@ -265,6 +277,32 @@ bool AArch64::ExtensionSet::parseModifier(StringRef Modifier) { return false; } +void AArch64::ExtensionSet::reconstructFromParsedFeatures( + const std::vector<std::string> &Features, + std::vector<std::string> &NonExtensions) { + assert(Touched.none() && "Bitset already initialized"); + for (auto &F : Features) { + bool IsNegated = F[0] == '-'; + if (auto AE = targetFeatureToExtension(F)) { + Touched.set(AE->ID); + if (IsNegated) + Enabled.reset(AE->ID); + else + Enabled.set(AE->ID); + continue; + } + NonExtensions.push_back(F); + } +} + +void AArch64::ExtensionSet::dump() const { + std::vector<StringRef> Features; + toLLVMFeatureList(Features); + for (StringRef F : Features) + llvm::outs() << F << " "; + llvm::outs() << "\n"; +} + const AArch64::ExtensionInfo & AArch64::getExtensionByID(AArch64::ArchExtKind ExtID) { return lookupExtensionByID(ExtID); |
