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