summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/AArch64/AsmParser
diff options
context:
space:
mode:
authorOliver Stannard <oliver.stannard@arm.com>2018-09-26 13:52:27 +0000
committerOliver Stannard <oliver.stannard@arm.com>2018-09-26 13:52:27 +0000
commit89b1604935b9ed48daafca69a3655886fe86618c (patch)
treea98e0424a7f27473576d3ebd2b28f74ecab6ed6b /llvm/lib/Target/AArch64/AsmParser
parent28d4f858243e404a08a905d6e764b74a6824d2d1 (diff)
downloadbcm5719-llvm-89b1604935b9ed48daafca69a3655886fe86618c.tar.gz
bcm5719-llvm-89b1604935b9ed48daafca69a3655886fe86618c.zip
[AArch64][AsmParser] Show name of missing feature for system instructions
Parsing of the system instructions (IC, DC, AT and TLBI) uses this function to show the required architecture when the operand is valid, but the architecture is not enabled. Armv8.5A adds a few different system instructions as part of optional features, so we need to extend it to show individual features, not just base architectures. This is NFC for now, but will be used by three different features added in v8.5A, and will be tested by them. Patch by David Spickett! Differential revision: https://reviews.llvm.org/D52478 llvm-svn: 343109
Diffstat (limited to 'llvm/lib/Target/AArch64/AsmParser')
-rw-r--r--llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp59
1 files changed, 35 insertions, 24 deletions
diff --git a/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp b/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
index f9867b9cb33..8b5db516bad 100644
--- a/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
+++ b/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
@@ -2741,6 +2741,29 @@ AArch64AsmParser::tryParseOptionalShiftExtend(OperandVector &Operands) {
return MatchOperand_Success;
}
+static const struct Extension {
+ const char *Name;
+ const FeatureBitset Features;
+} ExtensionMap[] = {
+ { "crc", {AArch64::FeatureCRC} },
+ { "sm4", {AArch64::FeatureSM4} },
+ { "sha3", {AArch64::FeatureSHA3} },
+ { "sha2", {AArch64::FeatureSHA2} },
+ { "aes", {AArch64::FeatureAES} },
+ { "crypto", {AArch64::FeatureCrypto} },
+ { "fp", {AArch64::FeatureFPARMv8} },
+ { "simd", {AArch64::FeatureNEON} },
+ { "ras", {AArch64::FeatureRAS} },
+ { "lse", {AArch64::FeatureLSE} },
+
+ // FIXME: Unsupported extensions
+ { "pan", {} },
+ { "lor", {} },
+ { "rdma", {} },
+ { "profile", {} },
+};
+
+
static void setRequiredFeatureString(FeatureBitset FBS, std::string &Str) {
if (FBS[AArch64::HasV8_1aOps])
Str += "ARMv8.1a";
@@ -2750,8 +2773,18 @@ static void setRequiredFeatureString(FeatureBitset FBS, std::string &Str) {
Str += "ARMv8.3a";
else if (FBS[AArch64::HasV8_4aOps])
Str += "ARMv8.4a";
- else
- Str += "(unknown)";
+ else if (FBS[AArch64::HasV8_5aOps])
+ Str += "ARMv8.5a";
+ else {
+ auto ext = std::find_if(std::begin(ExtensionMap),
+ std::end(ExtensionMap),
+ [&](const Extension& e)
+ // Use & in case multiple features are enabled
+ { return (FBS & e.Features) != FeatureBitset(); }
+ );
+
+ Str += ext != std::end(ExtensionMap) ? ext->Name : "(unknown)";
+ }
}
void AArch64AsmParser::createSysAlias(uint16_t Encoding, OperandVector &Operands,
@@ -4902,28 +4935,6 @@ bool AArch64AsmParser::ParseDirective(AsmToken DirectiveID) {
return false;
}
-static const struct {
- const char *Name;
- const FeatureBitset Features;
-} ExtensionMap[] = {
- { "crc", {AArch64::FeatureCRC} },
- { "sm4", {AArch64::FeatureSM4} },
- { "sha3", {AArch64::FeatureSHA3} },
- { "sha2", {AArch64::FeatureSHA2} },
- { "aes", {AArch64::FeatureAES} },
- { "crypto", {AArch64::FeatureCrypto} },
- { "fp", {AArch64::FeatureFPARMv8} },
- { "simd", {AArch64::FeatureNEON} },
- { "ras", {AArch64::FeatureRAS} },
- { "lse", {AArch64::FeatureLSE} },
-
- // FIXME: Unsupported extensions
- { "pan", {} },
- { "lor", {} },
- { "rdma", {} },
- { "profile", {} },
-};
-
static void ExpandCryptoAEK(AArch64::ArchKind ArchKind,
SmallVector<StringRef, 4> &RequestedExtensions) {
const bool NoCrypto =
OpenPOWER on IntegriCloud