diff options
Diffstat (limited to 'llvm/lib/Target/SystemZ/AsmParser/SystemZAsmParser.cpp')
| -rw-r--r-- | llvm/lib/Target/SystemZ/AsmParser/SystemZAsmParser.cpp | 51 |
1 files changed, 41 insertions, 10 deletions
diff --git a/llvm/lib/Target/SystemZ/AsmParser/SystemZAsmParser.cpp b/llvm/lib/Target/SystemZ/AsmParser/SystemZAsmParser.cpp index 0de24245cfcc..40ed417d0817 100644 --- a/llvm/lib/Target/SystemZ/AsmParser/SystemZAsmParser.cpp +++ b/llvm/lib/Target/SystemZ/AsmParser/SystemZAsmParser.cpp @@ -9,6 +9,7 @@ #include "MCTargetDesc/SystemZInstPrinter.h" #include "MCTargetDesc/SystemZMCAsmInfo.h" #include "MCTargetDesc/SystemZMCTargetDesc.h" +#include "SystemZTargetStreamer.h" #include "TargetInfo/SystemZTargetInfo.h" #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/SmallVector.h" @@ -25,10 +26,10 @@ #include "llvm/MC/MCParser/MCTargetAsmParser.h" #include "llvm/MC/MCStreamer.h" #include "llvm/MC/MCSubtargetInfo.h" +#include "llvm/MC/TargetRegistry.h" #include "llvm/Support/Casting.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/SMLoc.h" -#include "llvm/Support/TargetRegistry.h" #include <algorithm> #include <cassert> #include <cstddef> @@ -39,13 +40,15 @@ using namespace llvm; -// Return true if Expr is in the range [MinValue, MaxValue]. -static bool inRange(const MCExpr *Expr, int64_t MinValue, int64_t MaxValue) { +// Return true if Expr is in the range [MinValue, MaxValue]. If AllowSymbol +// is true any MCExpr is accepted (address displacement). +static bool inRange(const MCExpr *Expr, int64_t MinValue, int64_t MaxValue, + bool AllowSymbol = false) { if (auto *CE = dyn_cast<MCConstantExpr>(Expr)) { int64_t Value = CE->getValue(); return Value >= MinValue && Value <= MaxValue; } - return false; + return AllowSymbol; } namespace { @@ -264,10 +267,10 @@ public: return isMem(MemKind) && Mem.RegKind == RegKind; } bool isMemDisp12(MemoryKind MemKind, RegisterKind RegKind) const { - return isMem(MemKind, RegKind) && inRange(Mem.Disp, 0, 0xfff); + return isMem(MemKind, RegKind) && inRange(Mem.Disp, 0, 0xfff, true); } bool isMemDisp20(MemoryKind MemKind, RegisterKind RegKind) const { - return isMem(MemKind, RegKind) && inRange(Mem.Disp, -524288, 524287); + return isMem(MemKind, RegKind) && inRange(Mem.Disp, -524288, 524287, true); } bool isMemDisp12Len4(RegisterKind RegKind) const { return isMemDisp12(BDLMem, RegKind) && inRange(Mem.Length.Imm, 1, 0x10); @@ -405,6 +408,13 @@ private: SMLoc StartLoc, EndLoc; }; + SystemZTargetStreamer &getTargetStreamer() { + assert(getParser().getStreamer().getTargetStreamer() && + "do not have a target streamer"); + MCTargetStreamer &TS = *getParser().getStreamer().getTargetStreamer(); + return static_cast<SystemZTargetStreamer &>(TS); + } + bool parseRegister(Register &Reg, bool RestoreOnFailure = false); bool parseIntegerRegister(Register &Reg, RegisterGroup Group); @@ -420,6 +430,7 @@ private: bool parseAddressRegister(Register &Reg); bool ParseDirectiveInsn(SMLoc L); + bool ParseDirectiveMachine(SMLoc L); OperandMatchResultTy parseAddress(OperandVector &Operands, MemoryKind MemKind, @@ -1210,6 +1221,8 @@ bool SystemZAsmParser::ParseDirective(AsmToken DirectiveID) { if (IDVal == ".insn") return ParseDirectiveInsn(DirectiveID.getLoc()); + if (IDVal == ".machine") + return ParseDirectiveMachine(DirectiveID.getLoc()); return true; } @@ -1322,6 +1335,28 @@ bool SystemZAsmParser::ParseDirectiveInsn(SMLoc L) { return false; } +/// ParseDirectiveMachine +/// ::= .machine [ mcpu ] +bool SystemZAsmParser::ParseDirectiveMachine(SMLoc L) { + MCAsmParser &Parser = getParser(); + if (Parser.getTok().isNot(AsmToken::Identifier) && + Parser.getTok().isNot(AsmToken::String)) + return Error(L, "unexpected token in '.machine' directive"); + + StringRef CPU = Parser.getTok().getIdentifier(); + Parser.Lex(); + if (parseToken(AsmToken::EndOfStatement)) + return addErrorSuffix(" in '.machine' directive"); + + MCSubtargetInfo &STI = copySTI(); + STI.setDefaultFeatures(CPU, /*TuneCPU*/ CPU, ""); + setAvailableFeatures(ComputeAvailableFeatures(STI.getFeatureBits())); + + getTargetStreamer().emitMachine(CPU); + + return false; +} + bool SystemZAsmParser::ParseRegister(unsigned &RegNo, SMLoc &StartLoc, SMLoc &EndLoc, bool RestoreOnFailure) { Register Reg; @@ -1486,10 +1521,6 @@ bool SystemZAsmParser::parseOperand(OperandVector &Operands, return false; } -static std::string SystemZMnemonicSpellCheck(StringRef S, - const FeatureBitset &FBS, - unsigned VariantID = 0); - bool SystemZAsmParser::MatchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode, OperandVector &Operands, MCStreamer &Out, |
