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