[llvm] r350169 - [AArch64] Implement the .arch_extension directive
Martin Storsjo via llvm-commits
llvm-commits at lists.llvm.org
Sun Dec 30 13:06:32 PST 2018
Author: mstorsjo
Date: Sun Dec 30 13:06:32 2018
New Revision: 350169
URL: http://llvm.org/viewvc/llvm-project?rev=350169&view=rev
Log:
[AArch64] Implement the .arch_extension directive
Differential Revision: https://reviews.llvm.org/D56131
Added:
llvm/trunk/test/MC/AArch64/directive-arch_extension-nosimd.s
llvm/trunk/test/MC/AArch64/directive-arch_extension-simd.s
Modified:
llvm/trunk/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
Modified: llvm/trunk/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp?rev=350169&r1=350168&r2=350169&view=diff
==============================================================================
--- llvm/trunk/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp (original)
+++ llvm/trunk/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp Sun Dec 30 13:06:32 2018
@@ -165,6 +165,7 @@ private:
OperandVector &Operands);
bool parseDirectiveArch(SMLoc L);
+ bool parseDirectiveArchExtension(SMLoc L);
bool parseDirectiveCPU(SMLoc L);
bool parseDirectiveInst(SMLoc L);
@@ -5033,6 +5034,8 @@ bool AArch64AsmParser::ParseDirective(As
parseDirectiveCFINegateRAState();
else if (IDVal == ".cfi_b_key_frame")
parseDirectiveCFIBKeyFrame();
+ else if (IDVal == ".arch_extension")
+ parseDirectiveArchExtension(Loc);
else if (IsMachO) {
if (IDVal == MCLOHDirectiveName())
parseDirectiveLOH(IDVal, Loc);
@@ -5153,6 +5156,50 @@ bool AArch64AsmParser::parseDirectiveArc
return false;
}
+/// parseDirectiveArchExtension
+/// ::= .arch_extension [no]feature
+bool AArch64AsmParser::parseDirectiveArchExtension(SMLoc L) {
+ MCAsmParser &Parser = getParser();
+
+ if (getLexer().isNot(AsmToken::Identifier))
+ return Error(getLexer().getLoc(), "expected architecture extension name");
+
+ const AsmToken &Tok = Parser.getTok();
+ StringRef Name = Tok.getString();
+ SMLoc ExtLoc = Tok.getLoc();
+ Lex();
+
+ if (parseToken(AsmToken::EndOfStatement,
+ "unexpected token in '.arch_extension' directive"))
+ return true;
+
+ bool EnableFeature = true;
+ if (Name.startswith_lower("no")) {
+ EnableFeature = false;
+ Name = Name.substr(2);
+ }
+
+ MCSubtargetInfo &STI = copySTI();
+ FeatureBitset Features = STI.getFeatureBits();
+ for (const auto &Extension : ExtensionMap) {
+ if (Extension.Name != Name)
+ continue;
+
+ if (Extension.Features.none())
+ return Error(ExtLoc, "unsupported architectural extension: " + Name);
+
+ FeatureBitset ToggleFeatures = EnableFeature
+ ? (~Features & Extension.Features)
+ : (Features & Extension.Features);
+ uint64_t Features =
+ ComputeAvailableFeatures(STI.ToggleFeature(ToggleFeatures));
+ setAvailableFeatures(Features);
+ return false;
+ }
+
+ return Error(ExtLoc, "unknown architectural extension: " + Name);
+}
+
static SMLoc incrementLoc(SMLoc L, int Offset) {
return SMLoc::getFromPointer(L.getPointer() + Offset);
}
Added: llvm/trunk/test/MC/AArch64/directive-arch_extension-nosimd.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/AArch64/directive-arch_extension-nosimd.s?rev=350169&view=auto
==============================================================================
--- llvm/trunk/test/MC/AArch64/directive-arch_extension-nosimd.s (added)
+++ llvm/trunk/test/MC/AArch64/directive-arch_extension-nosimd.s Sun Dec 30 13:06:32 2018
@@ -0,0 +1,6 @@
+// RUN: not llvm-mc -triple aarch64 -filetype asm -o - %s 2>&1 | FileCheck %s
+
+ .arch_extension nosimd
+
+ add v0.8b, v0.8b, v0.8b
+// CHECK: error: instruction requires: neon
Added: llvm/trunk/test/MC/AArch64/directive-arch_extension-simd.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/AArch64/directive-arch_extension-simd.s?rev=350169&view=auto
==============================================================================
--- llvm/trunk/test/MC/AArch64/directive-arch_extension-simd.s (added)
+++ llvm/trunk/test/MC/AArch64/directive-arch_extension-simd.s Sun Dec 30 13:06:32 2018
@@ -0,0 +1,6 @@
+// RUN: llvm-mc -triple aarch64 -mattr=-simd -filetype asm -o - %s | FileCheck %s
+
+ .arch_extension simd
+
+ add v0.8b, v0.8b, v0.8b
+// CHECK: add v0.8b, v0.8b, v0.8b
More information about the llvm-commits
mailing list