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 1037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#ifndef LLVM_LIB_TARGET_X86_ASMPARSER_X86OPERAND_H 1137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#define LLVM_LIB_TARGET_X86_ASMPARSER_X86OPERAND_H 1236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 1336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "X86AsmParserCommon.h" 1436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/MC/MCExpr.h" 156948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar#include "llvm/MC/MCInst.h" 166948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar#include "llvm/MC/MCRegisterInfo.h" 1736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/MC/MCParser/MCParsedAsmOperand.h" 18c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines#include "llvm/ADT/STLExtras.h" 196948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar#include "MCTargetDesc/X86MCTargetDesc.h" 2036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 2136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesnamespace llvm { 2236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 2336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// X86Operand - Instances of this class represent a parsed X86 machine 2436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// instruction. 2536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesstruct X86Operand : public MCParsedAsmOperand { 2636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines enum KindTy { 2736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Token, 2836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Register, 2936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Immediate, 3036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Memory 3136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } Kind; 3236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 3336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SMLoc StartLoc, EndLoc; 3436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SMLoc OffsetOfLoc; 3536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines StringRef SymName; 3636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void *OpDecl; 3736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool AddressOf; 3836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 3936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines struct TokOp { 4036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const char *Data; 4136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned Length; 4236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines }; 4336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 4436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines struct RegOp { 4536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned RegNo; 4636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines }; 4736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 4836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines struct ImmOp { 4936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCExpr *Val; 5036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines }; 5136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 5236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines struct MemOp { 5336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned SegReg; 5436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCExpr *Disp; 5536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned BaseReg; 5636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned IndexReg; 5736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned Scale; 5836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned Size; 59ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines unsigned ModeSize; 6036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines }; 6136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 6236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines union { 6336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines struct TokOp Tok; 6436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines struct RegOp Reg; 6536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines struct ImmOp Imm; 6636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines struct MemOp Mem; 6736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines }; 6836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 6936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines X86Operand(KindTy K, SMLoc Start, SMLoc End) 7036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines : Kind(K), StartLoc(Start), EndLoc(End) {} 7136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 7236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines StringRef getSymName() override { return SymName; } 7336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void *getOpDecl() override { return OpDecl; } 7436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 7536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// getStartLoc - Get the location of the first token of this operand. 7636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SMLoc getStartLoc() const override { return StartLoc; } 7736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// getEndLoc - Get the location of the last token of this operand. 7836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SMLoc getEndLoc() const override { return EndLoc; } 7936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// getLocRange - Get the range between the first and last token of this 8036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// operand. 8136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SMRange getLocRange() const { return SMRange(StartLoc, EndLoc); } 8236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// getOffsetOfLoc - Get the location of the offset operator. 8336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SMLoc getOffsetOfLoc() const override { return OffsetOfLoc; } 8436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 8536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void print(raw_ostream &OS) const override {} 8636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 8736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines StringRef getToken() const { 8836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert(Kind == Token && "Invalid access!"); 8936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return StringRef(Tok.Data, Tok.Length); 9036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 9136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void setTokenValue(StringRef Value) { 9236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert(Kind == Token && "Invalid access!"); 9336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Tok.Data = Value.data(); 9436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Tok.Length = Value.size(); 9536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 9636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 9736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned getReg() const override { 9836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert(Kind == Register && "Invalid access!"); 9936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Reg.RegNo; 10036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 10136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 10236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCExpr *getImm() const { 10336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert(Kind == Immediate && "Invalid access!"); 10436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Imm.Val; 10536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 10636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 10736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCExpr *getMemDisp() const { 10836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert(Kind == Memory && "Invalid access!"); 10936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Mem.Disp; 11036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 11136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned getMemSegReg() const { 11236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert(Kind == Memory && "Invalid access!"); 11336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Mem.SegReg; 11436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 11536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned getMemBaseReg() const { 11636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert(Kind == Memory && "Invalid access!"); 11736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Mem.BaseReg; 11836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 11936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned getMemIndexReg() const { 12036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert(Kind == Memory && "Invalid access!"); 12136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Mem.IndexReg; 12236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 12336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned getMemScale() const { 12436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert(Kind == Memory && "Invalid access!"); 12536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Mem.Scale; 12636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 127ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines unsigned getMemModeSize() const { 128ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines assert(Kind == Memory && "Invalid access!"); 129ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return Mem.ModeSize; 130ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines } 13136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 13236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isToken() const override {return Kind == Token; } 13336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 13436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isImm() const override { return Kind == Immediate; } 13536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 13636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isImmSExti16i8() const { 13736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (!isImm()) 13836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return false; 13936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 14036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // If this isn't a constant expr, just assume it fits and let relaxation 14136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // handle it. 14236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 14336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (!CE) 14436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return true; 14536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 14636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Otherwise, check the value is in a range that makes sense for this 14736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // extension. 14836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return isImmSExti16i8Value(CE->getValue()); 14936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 15036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isImmSExti32i8() const { 15136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (!isImm()) 15236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return false; 15336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 15436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // If this isn't a constant expr, just assume it fits and let relaxation 15536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // handle it. 15636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 15736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (!CE) 15836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return true; 15936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 16036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Otherwise, check the value is in a range that makes sense for this 16136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // extension. 16236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return isImmSExti32i8Value(CE->getValue()); 16336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 16436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isImmSExti64i8() const { 16536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (!isImm()) 16636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return false; 16736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 16836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // If this isn't a constant expr, just assume it fits and let relaxation 16936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // handle it. 17036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 17136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (!CE) 17236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return true; 17336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 17436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Otherwise, check the value is in a range that makes sense for this 17536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // extension. 17636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return isImmSExti64i8Value(CE->getValue()); 17736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 17836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isImmSExti64i32() const { 17936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (!isImm()) 18036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return false; 18136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 18236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // If this isn't a constant expr, just assume it fits and let relaxation 18336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // handle it. 18436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 18536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (!CE) 18636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return true; 18736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 18836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Otherwise, check the value is in a range that makes sense for this 18936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // extension. 19036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return isImmSExti64i32Value(CE->getValue()); 19136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 19236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 193ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines bool isImmUnsignedi8() const { 194ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines if (!isImm()) return false; 195ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); 196ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines if (!CE) return false; 197ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return isImmUnsignedi8Value(CE->getValue()); 198ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines } 199ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 20036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isOffsetOf() const override { 20136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return OffsetOfLoc.getPointer(); 20236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 20336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 20436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool needAddressOf() const override { 20536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return AddressOf; 20636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 20736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 20836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isMem() const override { return Kind == Memory; } 20937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines bool isMemUnsized() const { 21037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return Kind == Memory && Mem.Size == 0; 21137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 21236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isMem8() const { 21336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Kind == Memory && (!Mem.Size || Mem.Size == 8); 21436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 21536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isMem16() const { 21636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Kind == Memory && (!Mem.Size || Mem.Size == 16); 21736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 21836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isMem32() const { 21936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Kind == Memory && (!Mem.Size || Mem.Size == 32); 22036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 22136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isMem64() const { 22236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Kind == Memory && (!Mem.Size || Mem.Size == 64); 22336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 22436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isMem80() const { 22536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Kind == Memory && (!Mem.Size || Mem.Size == 80); 22636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 22736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isMem128() const { 22836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Kind == Memory && (!Mem.Size || Mem.Size == 128); 22936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 23036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isMem256() const { 23136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Kind == Memory && (!Mem.Size || Mem.Size == 256); 23236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 23336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isMem512() const { 23436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Kind == Memory && (!Mem.Size || Mem.Size == 512); 23536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 236de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar bool isMemIndexReg(unsigned LowR, unsigned HighR) const { 237de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar assert(Kind == Memory && "Invalid access!"); 238de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return Mem.IndexReg >= LowR && Mem.IndexReg <= HighR; 239de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 24036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 241de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar bool isMem64_RC128() const { 242de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return isMem64() && isMemIndexReg(X86::XMM0, X86::XMM15); 243de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 244de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar bool isMem128_RC128() const { 245de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return isMem128() && isMemIndexReg(X86::XMM0, X86::XMM15); 24636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 247de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar bool isMem128_RC256() const { 248de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return isMem128() && isMemIndexReg(X86::YMM0, X86::YMM15); 249f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar } 250de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar bool isMem256_RC128() const { 251de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return isMem256() && isMemIndexReg(X86::XMM0, X86::XMM15); 25236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 253de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar bool isMem256_RC256() const { 254de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return isMem256() && isMemIndexReg(X86::YMM0, X86::YMM15); 255de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 256de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 257de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar bool isMem64_RC128X() const { 258de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return isMem64() && isMemIndexReg(X86::XMM0, X86::XMM31); 259f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar } 260de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar bool isMem128_RC128X() const { 261de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return isMem128() && isMemIndexReg(X86::XMM0, X86::XMM31); 26236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 263de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar bool isMem128_RC256X() const { 264de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return isMem128() && isMemIndexReg(X86::YMM0, X86::YMM31); 265f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar } 266de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar bool isMem256_RC128X() const { 267de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return isMem256() && isMemIndexReg(X86::XMM0, X86::XMM31); 26836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 269de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar bool isMem256_RC256X() const { 270de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return isMem256() && isMemIndexReg(X86::YMM0, X86::YMM31); 271f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar } 272de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar bool isMem512_RC256X() const { 273de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return isMem512() && isMemIndexReg(X86::YMM0, X86::YMM31); 27436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 275de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar bool isMem512_RC512() const { 276de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return isMem512() && isMemIndexReg(X86::ZMM0, X86::ZMM31); 27736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 27836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 27936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isAbsMem() const { 28036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Kind == Memory && !getMemSegReg() && !getMemBaseReg() && 28136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines !getMemIndexReg() && getMemScale() == 1; 28236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 2834c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar bool isAVX512RC() const{ 2844c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar return isImm(); 2854c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar } 28636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 287ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines bool isAbsMem16() const { 288ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return isAbsMem() && Mem.ModeSize == 16; 289ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines } 290ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 29136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isSrcIdx() const { 29236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return !getMemIndexReg() && getMemScale() == 1 && 29336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines (getMemBaseReg() == X86::RSI || getMemBaseReg() == X86::ESI || 29436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines getMemBaseReg() == X86::SI) && isa<MCConstantExpr>(getMemDisp()) && 29536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines cast<MCConstantExpr>(getMemDisp())->getValue() == 0; 29636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 29736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isSrcIdx8() const { 29836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return isMem8() && isSrcIdx(); 29936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 30036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isSrcIdx16() const { 30136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return isMem16() && isSrcIdx(); 30236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 30336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isSrcIdx32() const { 30436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return isMem32() && isSrcIdx(); 30536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 30636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isSrcIdx64() const { 30736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return isMem64() && isSrcIdx(); 30836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 30936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 31036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isDstIdx() const { 31136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return !getMemIndexReg() && getMemScale() == 1 && 31236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines (getMemSegReg() == 0 || getMemSegReg() == X86::ES) && 31336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines (getMemBaseReg() == X86::RDI || getMemBaseReg() == X86::EDI || 31436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines getMemBaseReg() == X86::DI) && isa<MCConstantExpr>(getMemDisp()) && 31536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines cast<MCConstantExpr>(getMemDisp())->getValue() == 0; 31636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 31736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isDstIdx8() const { 31836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return isMem8() && isDstIdx(); 31936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 32036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isDstIdx16() const { 32136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return isMem16() && isDstIdx(); 32236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 32336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isDstIdx32() const { 32436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return isMem32() && isDstIdx(); 32536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 32636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isDstIdx64() const { 32736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return isMem64() && isDstIdx(); 32836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 32936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 330ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines bool isMemOffs() const { 331ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return Kind == Memory && !getMemBaseReg() && !getMemIndexReg() && 332ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines getMemScale() == 1; 333ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines } 334ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 335ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines bool isMemOffs16_8() const { 336ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return isMemOffs() && Mem.ModeSize == 16 && (!Mem.Size || Mem.Size == 8); 337ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines } 338ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines bool isMemOffs16_16() const { 339ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return isMemOffs() && Mem.ModeSize == 16 && (!Mem.Size || Mem.Size == 16); 34036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 341ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines bool isMemOffs16_32() const { 342ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return isMemOffs() && Mem.ModeSize == 16 && (!Mem.Size || Mem.Size == 32); 34336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 344ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines bool isMemOffs32_8() const { 345ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return isMemOffs() && Mem.ModeSize == 32 && (!Mem.Size || Mem.Size == 8); 34636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 347ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines bool isMemOffs32_16() const { 348ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return isMemOffs() && Mem.ModeSize == 32 && (!Mem.Size || Mem.Size == 16); 349ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines } 350ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines bool isMemOffs32_32() const { 351ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return isMemOffs() && Mem.ModeSize == 32 && (!Mem.Size || Mem.Size == 32); 352ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines } 353ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines bool isMemOffs32_64() const { 354ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return isMemOffs() && Mem.ModeSize == 32 && (!Mem.Size || Mem.Size == 64); 355ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines } 356ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines bool isMemOffs64_8() const { 357ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return isMemOffs() && Mem.ModeSize == 64 && (!Mem.Size || Mem.Size == 8); 358ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines } 359ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines bool isMemOffs64_16() const { 360ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return isMemOffs() && Mem.ModeSize == 64 && (!Mem.Size || Mem.Size == 16); 361ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines } 362ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines bool isMemOffs64_32() const { 363ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return isMemOffs() && Mem.ModeSize == 64 && (!Mem.Size || Mem.Size == 32); 364ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines } 365ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines bool isMemOffs64_64() const { 366ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return isMemOffs() && Mem.ModeSize == 64 && (!Mem.Size || Mem.Size == 64); 36736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 36836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 36936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isReg() const override { return Kind == Register; } 37036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 37136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isGR32orGR64() const { 37236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Kind == Register && 37336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines (X86MCRegisterClasses[X86::GR32RegClassID].contains(getReg()) || 37436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines X86MCRegisterClasses[X86::GR64RegClassID].contains(getReg())); 37536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 37636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 37736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void addExpr(MCInst &Inst, const MCExpr *Expr) const { 37836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Add as immediates when possible. 37936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Expr)) 3806948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Inst.addOperand(MCOperand::createImm(CE->getValue())); 38136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines else 3826948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Inst.addOperand(MCOperand::createExpr(Expr)); 38336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 38436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 38536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void addRegOperands(MCInst &Inst, unsigned N) const { 38636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert(N == 1 && "Invalid number of operands!"); 3876948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Inst.addOperand(MCOperand::createReg(getReg())); 38836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 38936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 39036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines static unsigned getGR32FromGR64(unsigned RegNo) { 39136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines switch (RegNo) { 39236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines default: llvm_unreachable("Unexpected register"); 39336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case X86::RAX: return X86::EAX; 39436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case X86::RCX: return X86::ECX; 39536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case X86::RDX: return X86::EDX; 39636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case X86::RBX: return X86::EBX; 39736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case X86::RBP: return X86::EBP; 39836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case X86::RSP: return X86::ESP; 39936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case X86::RSI: return X86::ESI; 40036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case X86::RDI: return X86::EDI; 40136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case X86::R8: return X86::R8D; 40236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case X86::R9: return X86::R9D; 40336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case X86::R10: return X86::R10D; 40436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case X86::R11: return X86::R11D; 40536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case X86::R12: return X86::R12D; 40636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case X86::R13: return X86::R13D; 40736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case X86::R14: return X86::R14D; 40836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case X86::R15: return X86::R15D; 40936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case X86::RIP: return X86::EIP; 41036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 41136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 41236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 41336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void addGR32orGR64Operands(MCInst &Inst, unsigned N) const { 41436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert(N == 1 && "Invalid number of operands!"); 41536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned RegNo = getReg(); 41636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (X86MCRegisterClasses[X86::GR64RegClassID].contains(RegNo)) 41736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines RegNo = getGR32FromGR64(RegNo); 4186948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Inst.addOperand(MCOperand::createReg(RegNo)); 41936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 4204c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar void addAVX512RCOperands(MCInst &Inst, unsigned N) const { 4214c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar assert(N == 1 && "Invalid number of operands!"); 4224c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar addExpr(Inst, getImm()); 4234c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar } 42436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void addImmOperands(MCInst &Inst, unsigned N) const { 42536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert(N == 1 && "Invalid number of operands!"); 42636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines addExpr(Inst, getImm()); 42736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 42836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 42936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void addMemOperands(MCInst &Inst, unsigned N) const { 43036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert((N == 5) && "Invalid number of operands!"); 4316948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Inst.addOperand(MCOperand::createReg(getMemBaseReg())); 4326948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Inst.addOperand(MCOperand::createImm(getMemScale())); 4336948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Inst.addOperand(MCOperand::createReg(getMemIndexReg())); 43436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines addExpr(Inst, getMemDisp()); 4356948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Inst.addOperand(MCOperand::createReg(getMemSegReg())); 43636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 43736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 43836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void addAbsMemOperands(MCInst &Inst, unsigned N) const { 43936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert((N == 1) && "Invalid number of operands!"); 44036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Add as immediates when possible. 44136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getMemDisp())) 4426948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Inst.addOperand(MCOperand::createImm(CE->getValue())); 44336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines else 4446948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Inst.addOperand(MCOperand::createExpr(getMemDisp())); 44536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 44636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 44736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void addSrcIdxOperands(MCInst &Inst, unsigned N) const { 44836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert((N == 2) && "Invalid number of operands!"); 4496948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Inst.addOperand(MCOperand::createReg(getMemBaseReg())); 4506948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Inst.addOperand(MCOperand::createReg(getMemSegReg())); 45136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 45236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void addDstIdxOperands(MCInst &Inst, unsigned N) const { 45336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert((N == 1) && "Invalid number of operands!"); 4546948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Inst.addOperand(MCOperand::createReg(getMemBaseReg())); 45536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 45636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 45736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void addMemOffsOperands(MCInst &Inst, unsigned N) const { 45836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert((N == 2) && "Invalid number of operands!"); 45936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Add as immediates when possible. 46036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getMemDisp())) 4616948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Inst.addOperand(MCOperand::createImm(CE->getValue())); 46236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines else 4636948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Inst.addOperand(MCOperand::createExpr(getMemDisp())); 4646948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Inst.addOperand(MCOperand::createReg(getMemSegReg())); 46536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 46636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 467c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines static std::unique_ptr<X86Operand> CreateToken(StringRef Str, SMLoc Loc) { 46836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SMLoc EndLoc = SMLoc::getFromPointer(Loc.getPointer() + Str.size()); 469c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines auto Res = llvm::make_unique<X86Operand>(Token, Loc, EndLoc); 47036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Res->Tok.Data = Str.data(); 47136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Res->Tok.Length = Str.size(); 47236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Res; 47336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 47436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 475c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines static std::unique_ptr<X86Operand> 476c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines CreateReg(unsigned RegNo, SMLoc StartLoc, SMLoc EndLoc, 477c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines bool AddressOf = false, SMLoc OffsetOfLoc = SMLoc(), 478c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines StringRef SymName = StringRef(), void *OpDecl = nullptr) { 479c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines auto Res = llvm::make_unique<X86Operand>(Register, StartLoc, EndLoc); 48036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Res->Reg.RegNo = RegNo; 48136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Res->AddressOf = AddressOf; 48236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Res->OffsetOfLoc = OffsetOfLoc; 48336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Res->SymName = SymName; 48436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Res->OpDecl = OpDecl; 48536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Res; 48636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 48736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 488c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines static std::unique_ptr<X86Operand> CreateImm(const MCExpr *Val, 489c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines SMLoc StartLoc, SMLoc EndLoc) { 490c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines auto Res = llvm::make_unique<X86Operand>(Immediate, StartLoc, EndLoc); 49136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Res->Imm.Val = Val; 49236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Res; 49336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 49436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 49536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// Create an absolute memory operand. 496c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines static std::unique_ptr<X86Operand> 497ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines CreateMem(unsigned ModeSize, const MCExpr *Disp, SMLoc StartLoc, SMLoc EndLoc, 498ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines unsigned Size = 0, StringRef SymName = StringRef(), 499ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines void *OpDecl = nullptr) { 500c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines auto Res = llvm::make_unique<X86Operand>(Memory, StartLoc, EndLoc); 50136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Res->Mem.SegReg = 0; 50236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Res->Mem.Disp = Disp; 50336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Res->Mem.BaseReg = 0; 50436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Res->Mem.IndexReg = 0; 50536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Res->Mem.Scale = 1; 50636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Res->Mem.Size = Size; 507ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines Res->Mem.ModeSize = ModeSize; 50836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Res->SymName = SymName; 50936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Res->OpDecl = OpDecl; 51036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Res->AddressOf = false; 51136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Res; 51236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 51336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 51436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// Create a generalized memory operand. 515c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines static std::unique_ptr<X86Operand> 516ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines CreateMem(unsigned ModeSize, unsigned SegReg, const MCExpr *Disp, 517ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines unsigned BaseReg, unsigned IndexReg, unsigned Scale, SMLoc StartLoc, 518ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines SMLoc EndLoc, unsigned Size = 0, StringRef SymName = StringRef(), 519c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines void *OpDecl = nullptr) { 52036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // We should never just have a displacement, that should be parsed as an 52136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // absolute memory operand. 52236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert((SegReg || BaseReg || IndexReg) && "Invalid memory operand!"); 52336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 52436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // The scale should always be one of {1,2,4,8}. 52536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert(((Scale == 1 || Scale == 2 || Scale == 4 || Scale == 8)) && 52636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines "Invalid scale!"); 527c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines auto Res = llvm::make_unique<X86Operand>(Memory, StartLoc, EndLoc); 52836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Res->Mem.SegReg = SegReg; 52936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Res->Mem.Disp = Disp; 53036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Res->Mem.BaseReg = BaseReg; 53136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Res->Mem.IndexReg = IndexReg; 53236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Res->Mem.Scale = Scale; 53336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Res->Mem.Size = Size; 534ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines Res->Mem.ModeSize = ModeSize; 53536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Res->SymName = SymName; 53636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Res->OpDecl = OpDecl; 53736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Res->AddressOf = false; 53836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Res; 53936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 54036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}; 54136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 54236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} // End of namespace llvm 54336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 54437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#endif 545