summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Support/ARMTargetParser.cpp
diff options
context:
space:
mode:
authorAlexandros Lamprineas <alexandros.lamprineas@arm.com>2019-07-14 20:31:15 +0000
committerAlexandros Lamprineas <alexandros.lamprineas@arm.com>2019-07-14 20:31:15 +0000
commit951bb68ce262545bdb0bff536256e0514daf0046 (patch)
tree0cc9943a61daac686e1bb794c3f1e150a936051d /llvm/lib/Support/ARMTargetParser.cpp
parent9428d95ce7f84844a076fe13219db96a78e3bd44 (diff)
downloadbcm5719-llvm-951bb68ce262545bdb0bff536256e0514daf0046.tar.gz
bcm5719-llvm-951bb68ce262545bdb0bff536256e0514daf0046.zip
[TargetParser][ARM] Account dependencies when processing target features
Teaches ARM::appendArchExtFeatures to account dependencies when processing target features: i.e. when you say -march=armv8.1-m.main+mve.fp+nofp it means mve.fp should get discarded too. (Split from D63936) Differential Revision: https://reviews.llvm.org/D64048 llvm-svn: 366031
Diffstat (limited to 'llvm/lib/Support/ARMTargetParser.cpp')
-rw-r--r--llvm/lib/Support/ARMTargetParser.cpp26
1 files changed, 20 insertions, 6 deletions
diff --git a/llvm/lib/Support/ARMTargetParser.cpp b/llvm/lib/Support/ARMTargetParser.cpp
index 27d1e5527be..be948cfc95d 100644
--- a/llvm/lib/Support/ARMTargetParser.cpp
+++ b/llvm/lib/Support/ARMTargetParser.cpp
@@ -490,16 +490,30 @@ static unsigned findDoublePrecisionFPU(unsigned InputFPUKind) {
return ARM::FK_INVALID;
}
+static unsigned getAEKID(StringRef ArchExtName) {
+ for (const auto AE : ARM::ARCHExtNames)
+ if (AE.getName() == ArchExtName)
+ return AE.ID;
+ return ARM::AEK_INVALID;
+}
+
bool ARM::appendArchExtFeatures(
StringRef CPU, ARM::ArchKind AK, StringRef ArchExt,
std::vector<StringRef> &Features) {
- StringRef StandardFeature = getArchExtFeature(ArchExt);
- if (!StandardFeature.empty()) {
- Features.push_back(StandardFeature);
- return true;
- }
+ size_t StartingNumFeatures = Features.size();
const bool Negated = stripNegationPrefix(ArchExt);
+ unsigned ID = getAEKID(ArchExt);
+
+ if (ID == AEK_INVALID)
+ return false;
+
+ for (const auto AE : ARCHExtNames) {
+ if (Negated && (AE.ID & ID) == ID && AE.NegFeature)
+ Features.push_back(AE.NegFeature);
+ else if (AE.ID == ID && AE.Feature)
+ Features.push_back(AE.Feature);
+ }
if (CPU == "")
CPU = "generic";
@@ -519,7 +533,7 @@ bool ARM::appendArchExtFeatures(
}
return ARM::getFPUFeatures(FPUKind, Features);
}
- return false;
+ return StartingNumFeatures != Features.size();
}
StringRef ARM::getHWDivName(unsigned HWDivKind) {
OpenPOWER on IntegriCloud