[llvm] r272241 - AArch64: support the `.arch` directive in the IAS
Saleem Abdulrasool via llvm-commits
llvm-commits at lists.llvm.org
Wed Jun 8 19:56:41 PDT 2016
Author: compnerd
Date: Wed Jun 8 21:56:40 2016
New Revision: 272241
URL: http://llvm.org/viewvc/llvm-project?rev=272241&view=rev
Log:
AArch64: support the `.arch` directive in the IAS
Add support to the AArch64 IAS for the `.arch` directive. This allows the
assembly input to use architectural functionality in part of a file. This is
used in existing code like BoringSSL.
Resolves PR26016!
Added:
llvm/trunk/test/MC/AArch64/directive-arch.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=272241&r1=272240&r2=272241&view=diff
==============================================================================
--- llvm/trunk/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp (original)
+++ llvm/trunk/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp Wed Jun 8 21:56:40 2016
@@ -30,6 +30,7 @@
#include "llvm/MC/MCSymbol.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/SourceMgr.h"
+#include "llvm/Support/TargetParser.h"
#include "llvm/Support/TargetRegistry.h"
#include "llvm/Support/raw_ostream.h"
#include <cstdio>
@@ -69,6 +70,7 @@ private:
bool Error(SMLoc L, const Twine &Msg) { return getParser().Error(L, Msg); }
bool showMatchError(SMLoc Loc, unsigned ErrCode);
+ bool parseDirectiveArch(SMLoc L);
bool parseDirectiveCPU(SMLoc L);
bool parseDirectiveWord(unsigned Size, SMLoc L);
bool parseDirectiveInst(SMLoc L);
@@ -4195,6 +4197,8 @@ bool AArch64AsmParser::ParseDirective(As
StringRef IDVal = DirectiveID.getIdentifier();
SMLoc Loc = DirectiveID.getLoc();
+ if (IDVal == ".arch")
+ return parseDirectiveArch(Loc);
if (IDVal == ".cpu")
return parseDirectiveCPU(Loc);
if (IDVal == ".hword")
@@ -4235,6 +4239,30 @@ static const struct {
{ "profile", {} },
};
+/// parseDirectiveArch
+/// ::= .arch token
+bool AArch64AsmParser::parseDirectiveArch(SMLoc L) {
+ SMLoc ArchLoc = getLoc();
+
+ StringRef Arch, ExtensionString;
+ std::tie(Arch, ExtensionString) =
+ getParser().parseStringToEndOfStatement().trim().split('+');
+
+ unsigned ID = AArch64::parseArch(Arch);
+ if (ID == ARM::AK_INVALID) {
+ Error(ArchLoc, "unknown arch name");
+ return false;
+ }
+
+ MCSubtargetInfo &STI = copySTI();
+ STI.setDefaultFeatures("", "");
+ if (!ExtensionString.empty())
+ STI.setDefaultFeatures("", ("+" + ExtensionString).str());
+ setAvailableFeatures(ComputeAvailableFeatures(STI.getFeatureBits()));
+
+ return false;
+}
+
/// parseDirectiveCPU
/// ::= .cpu id
bool AArch64AsmParser::parseDirectiveCPU(SMLoc L) {
Added: llvm/trunk/test/MC/AArch64/directive-arch.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/AArch64/directive-arch.s?rev=272241&view=auto
==============================================================================
--- llvm/trunk/test/MC/AArch64/directive-arch.s (added)
+++ llvm/trunk/test/MC/AArch64/directive-arch.s Wed Jun 8 21:56:40 2016
@@ -0,0 +1,47 @@
+// RUN: not llvm-mc -triple aarch64-unknown-none-eabi -filetype asm -o - %s 2>&1 | Filecheck %s
+
+ .arch axp64
+# CHECK: error: unknown arch name
+# CHECK: .arch axp64
+# CHECK: ^
+
+ .arch armv8
+
+ fminnm d0, d0, d1
+
+# CHECK: error: instruction requires: fp-armv8
+# CHECK: fminnm d0, d0, d1
+# CHECK: ^
+
+ .arch armv8+fp
+
+# CHECK: '+fp' is not a recognized feature for this target (ignoring feature)
+
+ fminnm d0, d0, d1
+
+# CHECK: error: instruction requires: fp-armv8
+# CHECK: fminnm d0, d0, d1
+# CHECK: ^
+
+ .arch armv8+neon
+
+ fminnm d0, d0, d1
+
+ .arch armv8
+
+ fminnm d0, d0, d1
+
+# CHECK: error: instruction requires: fp-armv8
+# CHECK: fminnm d0, d0, d1
+# CHECK: ^
+
+ .arch armv8-a+crypto
+
+ aesd v0.16b, v2.16b
+
+ .arch armv8.1-a+ras
+ esb
+
+# CHECK: fminnm d0, d0, d1
+# CHECK: aesd v0.16b, v2.16b
+# CHECK: esb
More information about the llvm-commits
mailing list