[AArch64] Implement the .arch_extension directive

Differential Revision: https://reviews.llvm.org/D56131

llvm-svn: 350169
This commit is contained in:
Martin Storsjo 2018-12-30 21:06:32 +00:00
parent f88d65f6ce
commit 4ebb5f7268
3 changed files with 59 additions and 0 deletions

View File

@ -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(AsmToken DirectiveID) {
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::parseDirectiveArch(SMLoc L) {
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);
}

View File

@ -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

View File

@ -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