summaryrefslogtreecommitdiff
path: root/lib/Target/X86/AsmParser/X86Operand.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Target/X86/AsmParser/X86Operand.h')
-rw-r--r--lib/Target/X86/AsmParser/X86Operand.h88
1 files changed, 60 insertions, 28 deletions
diff --git a/lib/Target/X86/AsmParser/X86Operand.h b/lib/Target/X86/AsmParser/X86Operand.h
index 43a0561e769b..4d4aae0a1c6a 100644
--- a/lib/Target/X86/AsmParser/X86Operand.h
+++ b/lib/Target/X86/AsmParser/X86Operand.h
@@ -10,6 +10,7 @@
#ifndef LLVM_LIB_TARGET_X86_ASMPARSER_X86OPERAND_H
#define LLVM_LIB_TARGET_X86_ASMPARSER_X86OPERAND_H
+#include "InstPrinter/X86IntelInstPrinter.h"
#include "MCTargetDesc/X86MCTargetDesc.h"
#include "X86AsmParserCommon.h"
#include "llvm/ADT/STLExtras.h"
@@ -28,8 +29,8 @@ namespace llvm {
/// X86Operand - Instances of this class represent a parsed X86 machine
/// instruction.
-struct X86Operand : public MCParsedAsmOperand {
- enum KindTy { Token, Register, Immediate, Memory, Prefix } Kind;
+struct X86Operand final : public MCParsedAsmOperand {
+ enum KindTy { Token, Register, Immediate, Memory, Prefix, DXRegister } Kind;
SMLoc StartLoc, EndLoc;
SMLoc OffsetOfLoc;
@@ -77,7 +78,7 @@ struct X86Operand : public MCParsedAsmOperand {
};
X86Operand(KindTy K, SMLoc Start, SMLoc End)
- : Kind(K), StartLoc(Start), EndLoc(End) {}
+ : Kind(K), StartLoc(Start), EndLoc(End) {}
StringRef getSymName() override { return SymName; }
void *getOpDecl() override { return OpDecl; }
@@ -95,7 +96,55 @@ struct X86Operand : public MCParsedAsmOperand {
/// getOffsetOfLoc - Get the location of the offset operator.
SMLoc getOffsetOfLoc() const override { return OffsetOfLoc; }
- void print(raw_ostream &OS) const override {}
+ void print(raw_ostream &OS) const override {
+
+ auto PrintImmValue = [&](const MCExpr *Val, const char *VName) {
+ if (Val->getKind() == MCExpr::Constant) {
+ if (auto Imm = cast<MCConstantExpr>(Val)->getValue())
+ OS << VName << Imm;
+ } else if (Val->getKind() == MCExpr::SymbolRef) {
+ if (auto *SRE = dyn_cast<MCSymbolRefExpr>(Val)) {
+ const MCSymbol &Sym = SRE->getSymbol();
+ if (auto SymName = Sym.getName().data())
+ OS << VName << SymName;
+ }
+ }
+ };
+
+ switch (Kind) {
+ case Token:
+ OS << Tok.Data;
+ break;
+ case Register:
+ OS << "Reg:" << X86IntelInstPrinter::getRegisterName(Reg.RegNo);
+ break;
+ case DXRegister:
+ OS << "DXReg";
+ break;
+ case Immediate:
+ PrintImmValue(Imm.Val, "Imm:");
+ break;
+ case Prefix:
+ OS << "Prefix:" << Pref.Prefixes;
+ break;
+ case Memory:
+ OS << "Memory: ModeSize=" << Mem.ModeSize;
+ if (Mem.Size)
+ OS << ",Size=" << Mem.Size;
+ if (Mem.BaseReg)
+ OS << ",BaseReg=" << X86IntelInstPrinter::getRegisterName(Mem.BaseReg);
+ if (Mem.IndexReg)
+ OS << ",IndexReg="
+ << X86IntelInstPrinter::getRegisterName(Mem.IndexReg);
+ if (Mem.Scale)
+ OS << ",Scale=" << Mem.Scale;
+ if (Mem.Disp)
+ PrintImmValue(Mem.Disp, ",Disp=");
+ if (Mem.SegReg)
+ OS << ",SegReg=" << X86IntelInstPrinter::getRegisterName(Mem.SegReg);
+ break;
+ }
+ }
StringRef getToken() const {
assert(Kind == Token && "Invalid access!");
@@ -395,6 +444,7 @@ struct X86Operand : public MCParsedAsmOperand {
bool isPrefix() const { return Kind == Prefix; }
bool isReg() const override { return Kind == Register; }
+ bool isDXReg() const { return Kind == DXRegister; }
bool isGR32orGR64() const {
return Kind == Register &&
@@ -415,34 +465,11 @@ struct X86Operand : public MCParsedAsmOperand {
Inst.addOperand(MCOperand::createReg(getReg()));
}
- static unsigned getGR32FromGR64(unsigned RegNo) {
- switch (RegNo) {
- default: llvm_unreachable("Unexpected register");
- case X86::RAX: return X86::EAX;
- case X86::RCX: return X86::ECX;
- case X86::RDX: return X86::EDX;
- case X86::RBX: return X86::EBX;
- case X86::RBP: return X86::EBP;
- case X86::RSP: return X86::ESP;
- case X86::RSI: return X86::ESI;
- case X86::RDI: return X86::EDI;
- case X86::R8: return X86::R8D;
- case X86::R9: return X86::R9D;
- case X86::R10: return X86::R10D;
- case X86::R11: return X86::R11D;
- case X86::R12: return X86::R12D;
- case X86::R13: return X86::R13D;
- case X86::R14: return X86::R14D;
- case X86::R15: return X86::R15D;
- case X86::RIP: return X86::EIP;
- }
- }
-
void addGR32orGR64Operands(MCInst &Inst, unsigned N) const {
assert(N == 1 && "Invalid number of operands!");
unsigned RegNo = getReg();
if (X86MCRegisterClasses[X86::GR64RegClassID].contains(RegNo))
- RegNo = getGR32FromGR64(RegNo);
+ RegNo = getX86SubSuperRegister(RegNo, 32);
Inst.addOperand(MCOperand::createReg(RegNo));
}
@@ -517,6 +544,11 @@ struct X86Operand : public MCParsedAsmOperand {
}
static std::unique_ptr<X86Operand>
+ CreateDXReg(SMLoc StartLoc, SMLoc EndLoc) {
+ return llvm::make_unique<X86Operand>(DXRegister, StartLoc, EndLoc);
+ }
+
+ static std::unique_ptr<X86Operand>
CreatePrefix(unsigned Prefixes, SMLoc StartLoc, SMLoc EndLoc) {
auto Res = llvm::make_unique<X86Operand>(Prefix, StartLoc, EndLoc);
Res->Pref.Prefixes = Prefixes;