136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===-- X86Operand.h - Parsed X86 machine instruction --------------------===// 236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// 336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// The LLVM Compiler Infrastructure 436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// 536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// This file is distributed under the University of Illinois Open Source 636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// License. See LICENSE.TXT for details. 736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// 836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===----------------------------------------------------------------------===// 936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 1036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#ifndef X86_OPERAND_H 1136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#define X86_OPERAND_H 1236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 1336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "X86AsmParserCommon.h" 1436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/MC/MCExpr.h" 1536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/MC/MCParser/MCParsedAsmOperand.h" 16cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "llvm/ADT/STLExtras.h" 1736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 1836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesnamespace llvm { 1936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 2036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// X86Operand - Instances of this class represent a parsed X86 machine 2136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// instruction. 2236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesstruct X86Operand : public MCParsedAsmOperand { 2336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines enum KindTy { 2436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Token, 2536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Register, 2636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Immediate, 2736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Memory 2836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } Kind; 2936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 3036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SMLoc StartLoc, EndLoc; 3136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SMLoc OffsetOfLoc; 3236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines StringRef SymName; 3336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void *OpDecl; 3436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool AddressOf; 3536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 3636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines struct TokOp { 3736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const char *Data; 3836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned Length; 3936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines }; 4036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 4136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines struct RegOp { 4236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned RegNo; 4336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines }; 4436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 4536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines struct ImmOp { 4636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCExpr *Val; 4736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines }; 4836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 4936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines struct MemOp { 5036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned SegReg; 5136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCExpr *Disp; 5236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned BaseReg; 5336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned IndexReg; 5436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned Scale; 5536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned Size; 5636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines }; 5736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 5836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines union { 5936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines struct TokOp Tok; 6036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines struct RegOp Reg; 6136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines struct ImmOp Imm; 6236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines struct MemOp Mem; 6336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines }; 6436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 6536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines X86Operand(KindTy K, SMLoc Start, SMLoc End) 6636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines : Kind(K), StartLoc(Start), EndLoc(End) {} 6736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 6836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines StringRef getSymName() override { return SymName; } 6936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void *getOpDecl() override { return OpDecl; } 7036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 7136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// getStartLoc - Get the location of the first token of this operand. 7236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SMLoc getStartLoc() const override { return StartLoc; } 7336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// getEndLoc - Get the location of the last token of this operand. 7436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SMLoc getEndLoc() const override { return EndLoc; } 7536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// getLocRange - Get the range between the first and last token of this 7636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// operand. 7736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SMRange getLocRange() const { return SMRange(StartLoc, EndLoc); } 7836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// getOffsetOfLoc - Get the location of the offset operator. 7936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SMLoc getOffsetOfLoc() const override { return OffsetOfLoc; } 8036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 8136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void print(raw_ostream &OS) const override {} 8236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 8336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines StringRef getToken() const { 8436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert(Kind == Token && "Invalid access!"); 8536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return StringRef(Tok.Data, Tok.Length); 8636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 8736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void setTokenValue(StringRef Value) { 8836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert(Kind == Token && "Invalid access!"); 8936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Tok.Data = Value.data(); 9036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Tok.Length = Value.size(); 9136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 9236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 9336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned getReg() const override { 9436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert(Kind == Register && "Invalid access!"); 9536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Reg.RegNo; 9636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 9736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 9836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCExpr *getImm() const { 9936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert(Kind == Immediate && "Invalid access!"); 10036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Imm.Val; 10136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 10236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 10336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCExpr *getMemDisp() const { 10436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert(Kind == Memory && "Invalid access!"); 10536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Mem.Disp; 10636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 10736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned getMemSegReg() const { 10836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert(Kind == Memory && "Invalid access!"); 10936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Mem.SegReg; 11036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 11136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned getMemBaseReg() const { 11236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert(Kind == Memory && "Invalid access!"); 11336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Mem.BaseReg; 11436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 11536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned getMemIndexReg() const { 11636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert(Kind == Memory && "Invalid access!"); 11736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Mem.IndexReg; 11836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 11936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned getMemScale() const { 12036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert(Kind == Memory && "Invalid access!"); 12136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Mem.Scale; 12236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 12336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 12436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isToken() const override {return Kind == Token; } 12536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 12636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isImm() const override { return Kind == Immediate; } 12736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 12836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isImmSExti16i8() const { 12936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (!isImm()) 13036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return false; 13136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 13236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // If this isn't a constant expr, just assume it fits and let relaxation 13336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // handle it. 13436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 13536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (!CE) 13636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return true; 13736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 13836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Otherwise, check the value is in a range that makes sense for this 13936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // extension. 14036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return isImmSExti16i8Value(CE->getValue()); 14136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 14236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isImmSExti32i8() const { 14336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (!isImm()) 14436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return false; 14536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 14636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // If this isn't a constant expr, just assume it fits and let relaxation 14736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // handle it. 14836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 14936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (!CE) 15036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return true; 15136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 15236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Otherwise, check the value is in a range that makes sense for this 15336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // extension. 15436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return isImmSExti32i8Value(CE->getValue()); 15536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 15636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isImmZExtu32u8() const { 15736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (!isImm()) 15836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return false; 15936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 16036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // If this isn't a constant expr, just assume it fits and let relaxation 16136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // handle it. 16236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 16336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (!CE) 16436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return true; 16536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 16636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Otherwise, check the value is in a range that makes sense for this 16736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // extension. 16836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return isImmZExtu32u8Value(CE->getValue()); 16936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 17036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isImmSExti64i8() const { 17136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (!isImm()) 17236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return false; 17336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 17436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // If this isn't a constant expr, just assume it fits and let relaxation 17536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // handle it. 17636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 17736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (!CE) 17836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return true; 17936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 18036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Otherwise, check the value is in a range that makes sense for this 18136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // extension. 18236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return isImmSExti64i8Value(CE->getValue()); 18336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 18436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isImmSExti64i32() const { 18536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (!isImm()) 18636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return false; 18736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 18836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // If this isn't a constant expr, just assume it fits and let relaxation 18936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // handle it. 19036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 19136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (!CE) 19236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return true; 19336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 19436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Otherwise, check the value is in a range that makes sense for this 19536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // extension. 19636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return isImmSExti64i32Value(CE->getValue()); 19736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 19836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 19936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isOffsetOf() const override { 20036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return OffsetOfLoc.getPointer(); 20136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 20236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 20336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool needAddressOf() const override { 20436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return AddressOf; 20536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 20636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 20736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isMem() const override { return Kind == Memory; } 20836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isMem8() const { 20936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Kind == Memory && (!Mem.Size || Mem.Size == 8); 21036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 21136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isMem16() const { 21236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Kind == Memory && (!Mem.Size || Mem.Size == 16); 21336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 21436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isMem32() const { 21536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Kind == Memory && (!Mem.Size || Mem.Size == 32); 21636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 21736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isMem64() const { 21836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Kind == Memory && (!Mem.Size || Mem.Size == 64); 21936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 22036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isMem80() const { 22136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Kind == Memory && (!Mem.Size || Mem.Size == 80); 22236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 22336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isMem128() const { 22436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Kind == Memory && (!Mem.Size || Mem.Size == 128); 22536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 22636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isMem256() const { 22736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Kind == Memory && (!Mem.Size || Mem.Size == 256); 22836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 22936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isMem512() const { 23036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Kind == Memory && (!Mem.Size || Mem.Size == 512); 23136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 23236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 23336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isMemVX32() const { 23436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Kind == Memory && (!Mem.Size || Mem.Size == 32) && 23536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines getMemIndexReg() >= X86::XMM0 && getMemIndexReg() <= X86::XMM15; 23636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 23736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isMemVY32() const { 23836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Kind == Memory && (!Mem.Size || Mem.Size == 32) && 23936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines getMemIndexReg() >= X86::YMM0 && getMemIndexReg() <= X86::YMM15; 24036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 24136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isMemVX64() const { 24236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Kind == Memory && (!Mem.Size || Mem.Size == 64) && 24336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines getMemIndexReg() >= X86::XMM0 && getMemIndexReg() <= X86::XMM15; 24436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 24536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isMemVY64() const { 24636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Kind == Memory && (!Mem.Size || Mem.Size == 64) && 24736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines getMemIndexReg() >= X86::YMM0 && getMemIndexReg() <= X86::YMM15; 24836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 24936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isMemVZ32() const { 25036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Kind == Memory && (!Mem.Size || Mem.Size == 32) && 25136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines getMemIndexReg() >= X86::ZMM0 && getMemIndexReg() <= X86::ZMM31; 25236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 25336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isMemVZ64() const { 25436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Kind == Memory && (!Mem.Size || Mem.Size == 64) && 25536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines getMemIndexReg() >= X86::ZMM0 && getMemIndexReg() <= X86::ZMM31; 25636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 25736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 25836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isAbsMem() const { 25936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Kind == Memory && !getMemSegReg() && !getMemBaseReg() && 26036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines !getMemIndexReg() && getMemScale() == 1; 26136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 26236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 26336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isSrcIdx() const { 26436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return !getMemIndexReg() && getMemScale() == 1 && 26536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines (getMemBaseReg() == X86::RSI || getMemBaseReg() == X86::ESI || 26636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines getMemBaseReg() == X86::SI) && isa<MCConstantExpr>(getMemDisp()) && 26736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines cast<MCConstantExpr>(getMemDisp())->getValue() == 0; 26836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 26936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isSrcIdx8() const { 27036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return isMem8() && isSrcIdx(); 27136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 27236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isSrcIdx16() const { 27336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return isMem16() && isSrcIdx(); 27436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 27536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isSrcIdx32() const { 27636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return isMem32() && isSrcIdx(); 27736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 27836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isSrcIdx64() const { 27936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return isMem64() && isSrcIdx(); 28036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 28136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 28236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isDstIdx() const { 28336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return !getMemIndexReg() && getMemScale() == 1 && 28436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines (getMemSegReg() == 0 || getMemSegReg() == X86::ES) && 28536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines (getMemBaseReg() == X86::RDI || getMemBaseReg() == X86::EDI || 28636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines getMemBaseReg() == X86::DI) && isa<MCConstantExpr>(getMemDisp()) && 28736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines cast<MCConstantExpr>(getMemDisp())->getValue() == 0; 28836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 28936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isDstIdx8() const { 29036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return isMem8() && isDstIdx(); 29136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 29236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isDstIdx16() const { 29336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return isMem16() && isDstIdx(); 29436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 29536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isDstIdx32() const { 29636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return isMem32() && isDstIdx(); 29736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 29836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isDstIdx64() const { 29936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return isMem64() && isDstIdx(); 30036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 30136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 30236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isMemOffs8() const { 30336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Kind == Memory && !getMemBaseReg() && 30436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines !getMemIndexReg() && getMemScale() == 1 && (!Mem.Size || Mem.Size == 8); 30536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 30636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isMemOffs16() const { 30736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Kind == Memory && !getMemBaseReg() && 30836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines !getMemIndexReg() && getMemScale() == 1 && (!Mem.Size || Mem.Size == 16); 30936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 31036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isMemOffs32() const { 31136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Kind == Memory && !getMemBaseReg() && 31236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines !getMemIndexReg() && getMemScale() == 1 && (!Mem.Size || Mem.Size == 32); 31336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 31436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isMemOffs64() const { 31536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Kind == Memory && !getMemBaseReg() && 31636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines !getMemIndexReg() && getMemScale() == 1 && (!Mem.Size || Mem.Size == 64); 31736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 31836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 31936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isReg() const override { return Kind == Register; } 32036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 32136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isGR32orGR64() const { 32236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Kind == Register && 32336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines (X86MCRegisterClasses[X86::GR32RegClassID].contains(getReg()) || 32436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines X86MCRegisterClasses[X86::GR64RegClassID].contains(getReg())); 32536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 32636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 32736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void addExpr(MCInst &Inst, const MCExpr *Expr) const { 32836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Add as immediates when possible. 32936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Expr)) 33036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Inst.addOperand(MCOperand::CreateImm(CE->getValue())); 33136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines else 33236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Inst.addOperand(MCOperand::CreateExpr(Expr)); 33336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 33436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 33536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void addRegOperands(MCInst &Inst, unsigned N) const { 33636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert(N == 1 && "Invalid number of operands!"); 33736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Inst.addOperand(MCOperand::CreateReg(getReg())); 33836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 33936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 34036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines static unsigned getGR32FromGR64(unsigned RegNo) { 34136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines switch (RegNo) { 34236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines default: llvm_unreachable("Unexpected register"); 34336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case X86::RAX: return X86::EAX; 34436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case X86::RCX: return X86::ECX; 34536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case X86::RDX: return X86::EDX; 34636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case X86::RBX: return X86::EBX; 34736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case X86::RBP: return X86::EBP; 34836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case X86::RSP: return X86::ESP; 34936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case X86::RSI: return X86::ESI; 35036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case X86::RDI: return X86::EDI; 35136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case X86::R8: return X86::R8D; 35236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case X86::R9: return X86::R9D; 35336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case X86::R10: return X86::R10D; 35436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case X86::R11: return X86::R11D; 35536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case X86::R12: return X86::R12D; 35636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case X86::R13: return X86::R13D; 35736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case X86::R14: return X86::R14D; 35836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case X86::R15: return X86::R15D; 35936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case X86::RIP: return X86::EIP; 36036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 36136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 36236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 36336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void addGR32orGR64Operands(MCInst &Inst, unsigned N) const { 36436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert(N == 1 && "Invalid number of operands!"); 36536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned RegNo = getReg(); 36636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (X86MCRegisterClasses[X86::GR64RegClassID].contains(RegNo)) 36736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines RegNo = getGR32FromGR64(RegNo); 36836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Inst.addOperand(MCOperand::CreateReg(RegNo)); 36936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 37036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 37136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void addImmOperands(MCInst &Inst, unsigned N) const { 37236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert(N == 1 && "Invalid number of operands!"); 37336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines addExpr(Inst, getImm()); 37436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 37536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 37636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void addMemOperands(MCInst &Inst, unsigned N) const { 37736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert((N == 5) && "Invalid number of operands!"); 37836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Inst.addOperand(MCOperand::CreateReg(getMemBaseReg())); 37936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Inst.addOperand(MCOperand::CreateImm(getMemScale())); 38036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Inst.addOperand(MCOperand::CreateReg(getMemIndexReg())); 38136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines addExpr(Inst, getMemDisp()); 38236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Inst.addOperand(MCOperand::CreateReg(getMemSegReg())); 38336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 38436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 38536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void addAbsMemOperands(MCInst &Inst, unsigned N) const { 38636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert((N == 1) && "Invalid number of operands!"); 38736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Add as immediates when possible. 38836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getMemDisp())) 38936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Inst.addOperand(MCOperand::CreateImm(CE->getValue())); 39036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines else 39136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Inst.addOperand(MCOperand::CreateExpr(getMemDisp())); 39236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 39336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 39436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void addSrcIdxOperands(MCInst &Inst, unsigned N) const { 39536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert((N == 2) && "Invalid number of operands!"); 39636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Inst.addOperand(MCOperand::CreateReg(getMemBaseReg())); 39736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Inst.addOperand(MCOperand::CreateReg(getMemSegReg())); 39836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 39936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void addDstIdxOperands(MCInst &Inst, unsigned N) const { 40036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert((N == 1) && "Invalid number of operands!"); 40136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Inst.addOperand(MCOperand::CreateReg(getMemBaseReg())); 40236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 40336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 40436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void addMemOffsOperands(MCInst &Inst, unsigned N) const { 40536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert((N == 2) && "Invalid number of operands!"); 40636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Add as immediates when possible. 40736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getMemDisp())) 40836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Inst.addOperand(MCOperand::CreateImm(CE->getValue())); 40936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines else 41036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Inst.addOperand(MCOperand::CreateExpr(getMemDisp())); 41136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Inst.addOperand(MCOperand::CreateReg(getMemSegReg())); 41236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 41336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 414cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines static std::unique_ptr<X86Operand> CreateToken(StringRef Str, SMLoc Loc) { 41536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SMLoc EndLoc = SMLoc::getFromPointer(Loc.getPointer() + Str.size()); 416cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines auto Res = llvm::make_unique<X86Operand>(Token, Loc, EndLoc); 41736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Res->Tok.Data = Str.data(); 41836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Res->Tok.Length = Str.size(); 41936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Res; 42036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 42136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 422cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines static std::unique_ptr<X86Operand> 423cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines CreateReg(unsigned RegNo, SMLoc StartLoc, SMLoc EndLoc, 424cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines bool AddressOf = false, SMLoc OffsetOfLoc = SMLoc(), 425cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines StringRef SymName = StringRef(), void *OpDecl = nullptr) { 426cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines auto Res = llvm::make_unique<X86Operand>(Register, StartLoc, EndLoc); 42736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Res->Reg.RegNo = RegNo; 42836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Res->AddressOf = AddressOf; 42936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Res->OffsetOfLoc = OffsetOfLoc; 43036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Res->SymName = SymName; 43136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Res->OpDecl = OpDecl; 43236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Res; 43336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 43436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 435cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines static std::unique_ptr<X86Operand> CreateImm(const MCExpr *Val, 436cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines SMLoc StartLoc, SMLoc EndLoc) { 437cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines auto Res = llvm::make_unique<X86Operand>(Immediate, StartLoc, EndLoc); 43836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Res->Imm.Val = Val; 43936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Res; 44036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 44136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 44236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// Create an absolute memory operand. 443cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines static std::unique_ptr<X86Operand> 444cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines CreateMem(const MCExpr *Disp, SMLoc StartLoc, SMLoc EndLoc, unsigned Size = 0, 445cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines StringRef SymName = StringRef(), void *OpDecl = nullptr) { 446cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines auto Res = llvm::make_unique<X86Operand>(Memory, StartLoc, EndLoc); 44736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Res->Mem.SegReg = 0; 44836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Res->Mem.Disp = Disp; 44936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Res->Mem.BaseReg = 0; 45036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Res->Mem.IndexReg = 0; 45136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Res->Mem.Scale = 1; 45236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Res->Mem.Size = Size; 45336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Res->SymName = SymName; 45436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Res->OpDecl = OpDecl; 45536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Res->AddressOf = false; 45636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Res; 45736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 45836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 45936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// Create a generalized memory operand. 460cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines static std::unique_ptr<X86Operand> 461cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines CreateMem(unsigned SegReg, const MCExpr *Disp, unsigned BaseReg, 462cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines unsigned IndexReg, unsigned Scale, SMLoc StartLoc, SMLoc EndLoc, 463cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines unsigned Size = 0, StringRef SymName = StringRef(), 464cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines void *OpDecl = nullptr) { 46536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // We should never just have a displacement, that should be parsed as an 46636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // absolute memory operand. 46736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert((SegReg || BaseReg || IndexReg) && "Invalid memory operand!"); 46836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 46936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // The scale should always be one of {1,2,4,8}. 47036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert(((Scale == 1 || Scale == 2 || Scale == 4 || Scale == 8)) && 47136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines "Invalid scale!"); 472cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines auto Res = llvm::make_unique<X86Operand>(Memory, StartLoc, EndLoc); 47336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Res->Mem.SegReg = SegReg; 47436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Res->Mem.Disp = Disp; 47536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Res->Mem.BaseReg = BaseReg; 47636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Res->Mem.IndexReg = IndexReg; 47736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Res->Mem.Scale = Scale; 47836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Res->Mem.Size = Size; 47936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Res->SymName = SymName; 48036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Res->OpDecl = OpDecl; 48136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Res->AddressOf = false; 48236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Res; 48336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 48436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}; 48536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 48636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} // End of namespace llvm 48736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 48836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#endif // X86_OPERAND 489