14 #define DEBUG_TYPE "mccodeemitter"
40 : MCII(mcii), STI(sti), Ctx(ctx) {
43 ~X86MCCodeEmitter() {}
45 bool is64BitMode()
const {
47 return (STI.getFeatureBits() & X86::Mode64Bit) != 0;
50 bool is32BitMode()
const {
52 return (STI.getFeatureBits() & X86::Mode64Bit) == 0;
55 unsigned GetX86RegNum(
const MCOperand &MO)
const {
56 return Ctx.getRegisterInfo()->getEncodingValue(MO.
getReg()) & 0x7;
68 unsigned char getVEXRegisterEncoding(
const MCInst &
MI,
69 unsigned OpNum)
const {
71 unsigned SrcRegNum = GetX86RegNum(MI.
getOperand(OpNum));
77 return (~SrcRegNum) & 0xf;
80 unsigned char getWriteMaskRegisterEncoding(
const MCInst &MI,
81 unsigned OpNum)
const {
83 "Invalid mask register as write-mask!");
84 unsigned MaskRegNum = GetX86RegNum(MI.
getOperand(OpNum));
88 void EmitByte(
unsigned char C,
unsigned &CurByte,
raw_ostream &OS)
const {
93 void EmitConstant(uint64_t Val,
unsigned Size,
unsigned &CurByte,
96 for (
unsigned i = 0; i != Size; ++i) {
97 EmitByte(Val & 255, CurByte, OS);
106 int ImmOffset = 0)
const;
108 inline static unsigned char ModRMByte(
unsigned Mod,
unsigned RegOpcode,
110 assert(Mod < 4 && RegOpcode < 8 && RM < 8 &&
"ModRM Fields out of range!");
111 return RM | (RegOpcode << 3) | (Mod << 6);
114 void EmitRegModRMByte(
const MCOperand &ModRMReg,
unsigned RegOpcodeFld,
116 EmitByte(
ModRMByte(3, RegOpcodeFld, GetX86RegNum(ModRMReg)), CurByte, OS);
119 void EmitSIBByte(
unsigned SS,
unsigned Index,
unsigned Base,
122 EmitByte(
ModRMByte(SS, Index, Base), CurByte, OS);
126 void EmitMemModRMByte(
const MCInst &MI,
unsigned Op,
127 unsigned RegOpcodeField,
128 uint64_t TSFlags,
unsigned &CurByte,
raw_ostream &OS,
134 void EmitVEXOpcodePrefix(uint64_t TSFlags,
unsigned &CurByte,
int MemOperand,
138 void EmitSegmentOverridePrefix(uint64_t TSFlags,
unsigned &CurByte,
139 int MemOperand,
const MCInst &MI,
142 void EmitOpcodePrefix(uint64_t TSFlags,
unsigned &CurByte,
int MemOperand,
154 return new X86MCCodeEmitter(MCII, STI, Ctx);
160 return Value == (
signed char)Value;
167 "Compressed 8-bit displacement is only valid for EVEX inst.");
172 if (CD8V == 0 && CD8E == 0) {
177 unsigned MemObjSize = 1U << CD8E;
180 MemObjSize *= 1U << (CD8V & 0x3);
187 assert(EVEX_LL < 3 &&
"");
189 unsigned NumElems = (1U << (EVEX_LL + 4)) / MemObjSize;
190 NumElems /= 1U << (CD8V & 0x3);
192 MemObjSize *= NumElems;
196 unsigned MemObjMask = MemObjSize - 1;
197 assert((MemObjSize & MemObjMask) == 0 &&
"Invalid memory object size.");
199 if (Value & MemObjMask)
202 bool Ret = (Value == (
signed char)Value);
224 if ((BaseReg.
getReg() != 0 &&
225 X86MCRegisterClasses[X86::GR32RegClassID].contains(BaseReg.
getReg())) ||
226 (IndexReg.
getReg() != 0 &&
227 X86MCRegisterClasses[X86::GR32RegClassID].contains(IndexReg.
getReg())))
239 if ((BaseReg.
getReg() != 0 &&
240 X86MCRegisterClasses[X86::GR64RegClassID].contains(BaseReg.
getReg())) ||
241 (IndexReg.
getReg() != 0 &&
242 X86MCRegisterClasses[X86::GR64RegClassID].contains(IndexReg.
getReg())))
254 if ((BaseReg.
getReg() != 0 &&
255 X86MCRegisterClasses[X86::GR16RegClassID].contains(BaseReg.
getReg())) ||
256 (IndexReg.
getReg() != 0 &&
257 X86MCRegisterClasses[X86::GR16RegClassID].contains(IndexReg.
getReg())))
287 if (S.
getName() !=
"_GLOBAL_OFFSET_TABLE_")
302 void X86MCCodeEmitter::
306 const MCExpr *Expr = NULL;
307 if (DispOp.
isImm()) {
313 EmitConstant(DispOp.
getImm()+ImmOffset, Size, CurByte, OS);
327 assert(ImmOffset == 0);
362 EmitConstant(0, Size, CurByte, OS);
365 void X86MCCodeEmitter::EmitMemModRMByte(
const MCInst &
MI,
unsigned Op,
366 unsigned RegOpcodeField,
367 uint64_t TSFlags,
unsigned &CurByte,
374 unsigned BaseReg = Base.
getReg();
378 if (BaseReg == X86::RIP) {
379 assert(is64BitMode() &&
"Rip-relative addressing requires 64-bit mode");
380 assert(IndexReg.
getReg() == 0 &&
"Invalid rip-relative address");
381 EmitByte(
ModRMByte(0, RegOpcodeField, 5), CurByte, OS);
399 CurByte, OS,
Fixups, -ImmSize);
403 unsigned BaseRegNo = BaseReg ? GetX86RegNum(Base) : -1U;
418 (!is64BitMode() || BaseReg != 0)) {
421 EmitByte(
ModRMByte(0, RegOpcodeField, 5), CurByte, OS);
431 EmitByte(
ModRMByte(0, RegOpcodeField, BaseRegNo), CurByte, OS);
438 EmitByte(
ModRMByte(1, RegOpcodeField, BaseRegNo), CurByte, OS);
446 EmitByte(
ModRMByte(1, RegOpcodeField, BaseRegNo), CurByte, OS);
454 EmitByte(
ModRMByte(2, RegOpcodeField, BaseRegNo), CurByte, OS);
462 IndexReg.
getReg() != X86::RSP &&
"Cannot use ESP as index reg!");
464 bool ForceDisp32 =
false;
465 bool ForceDisp8 =
false;
471 EmitByte(
ModRMByte(0, RegOpcodeField, 4), CurByte, OS);
473 }
else if (!Disp.
isImm()) {
475 EmitByte(
ModRMByte(2, RegOpcodeField, 4), CurByte, OS);
477 }
else if (Disp.
getImm() == 0 &&
482 EmitByte(
ModRMByte(0, RegOpcodeField, 4), CurByte, OS);
485 EmitByte(
ModRMByte(1, RegOpcodeField, 4), CurByte, OS);
489 EmitByte(
ModRMByte(1, RegOpcodeField, 4), CurByte, OS);
491 ImmOffset = CDisp8 - Disp.
getImm();
494 EmitByte(
ModRMByte(2, RegOpcodeField, 4), CurByte, OS);
498 static const unsigned SSTable[] = { ~0U, 0, 1, ~0U, 2, ~0U, ~0U, ~0U, 3 };
499 unsigned SS = SSTable[Scale.
getImm()];
506 IndexRegNo = GetX86RegNum(IndexReg);
509 EmitSIBByte(SS, IndexRegNo, 5, CurByte, OS);
513 IndexRegNo = GetX86RegNum(IndexReg);
516 EmitSIBByte(SS, IndexRegNo, GetX86RegNum(Base), CurByte, OS);
522 else if (ForceDisp32 || Disp.
getImm() != 0)
529 void X86MCCodeEmitter::EmitVEXOpcodePrefix(uint64_t TSFlags,
unsigned &CurByte,
530 int MemOperand,
const MCInst &MI,
545 unsigned char VEX_R = 0x1;
546 unsigned char EVEX_R2 = 0x1;
553 unsigned char VEX_X = 0x1;
560 unsigned char VEX_B = 0x1;
564 unsigned char VEX_W = 0;
579 unsigned char VEX_5M = 0x1;
583 unsigned char VEX_4V = 0xf;
584 unsigned char EVEX_V2 = 0x1;
591 unsigned char VEX_L = 0;
602 unsigned char VEX_PP = 0;
605 unsigned char EVEX_U = 1;
608 unsigned char EVEX_z = 0;
611 unsigned char EVEX_b = 0;
614 unsigned char EVEX_aaa = 0;
678 unsigned NumOps = Desc.getNumOperands();
680 if (NumOps > 1 && Desc.getOperandConstraint(1,
MCOI::TIED_TO) == 0)
682 else if (NumOps > 3 && Desc.getOperandConstraint(2,
MCOI::TIED_TO) == 0 &&
687 else if (NumOps > 3 && Desc.getOperandConstraint(2,
MCOI::TIED_TO) == 0 &&
692 else if (NumOps > 2 && Desc.getOperandConstraint(NumOps - 2,
MCOI::TIED_TO) == 0)
717 EVEX_aaa = getWriteMaskRegisterEncoding(MI, CurOp++);
720 VEX_4V = getVEXRegisterEncoding(MI, CurOp);
752 EVEX_aaa = getWriteMaskRegisterEncoding(MI, CurOp++);
755 VEX_4V = getVEXRegisterEncoding(MI, CurOp);
787 VEX_4V = getVEXRegisterEncoding(MI, CurOp);
794 EVEX_aaa = getWriteMaskRegisterEncoding(MI, CurOp++);
820 EVEX_aaa = getWriteMaskRegisterEncoding(MI, CurOp++);
823 VEX_4V = getVEXRegisterEncoding(MI, CurOp);
838 VEX_4V = getVEXRegisterEncoding(MI, CurOp);
852 EVEX_aaa = getWriteMaskRegisterEncoding(MI, CurOp++);
855 VEX_4V = getVEXRegisterEncoding(MI, CurOp);
873 VEX_4V = getVEXRegisterEncoding(MI, CurOp);
879 EVEX_aaa = getWriteMaskRegisterEncoding(MI, CurOp++);
891 EmitSegmentOverridePrefix(TSFlags, CurByte, MemOperand, MI, OS);
905 unsigned char LastByte = VEX_PP | (VEX_L << 2) | (VEX_4V << 3);
907 if (VEX_B && VEX_X && !VEX_W && !XOP && (VEX_5M == 1)) {
908 EmitByte(0xC5, CurByte, OS);
909 EmitByte(LastByte | (VEX_R << 7), CurByte, OS);
914 EmitByte(XOP ? 0x8F : 0xC4, CurByte, OS);
915 EmitByte(VEX_R << 7 | VEX_X << 6 | VEX_B << 5 | VEX_5M, CurByte, OS);
916 EmitByte(LastByte | (VEX_W << 7), CurByte, OS);
923 assert((VEX_5M & 0x3) == VEX_5M
924 &&
"More than 2 significant bits in VEX.m-mmmm fields for EVEX!");
928 EmitByte(0x62, CurByte, OS);
929 EmitByte((VEX_R << 7) |
933 VEX_5M, CurByte, OS);
934 EmitByte((VEX_W << 7) |
937 VEX_PP, CurByte, OS);
938 EmitByte((EVEX_z << 7) |
943 EVEX_aaa, CurByte, OS);
960 bool isTwoAddr = NumOps > 1 &&
964 unsigned i = isTwoAddr ? 1 : 0;
965 for (; i != NumOps; ++i) {
967 if (!MO.
isReg())
continue;
976 switch (TSFlags & X86II::FormMask) {
982 i = isTwoAddr ? 2 : 1;
983 for (; i != NumOps; ++i) {
994 i = isTwoAddr ? 2 : 1;
995 for (; i != NumOps; ++i) {
1011 i = isTwoAddr ? 1 : 0;
1016 for (; i != e; ++i) {
1030 i = isTwoAddr ? 2 : 1;
1031 for (
unsigned e = NumOps; i != e; ++i) {
1042 void X86MCCodeEmitter::EmitSegmentOverridePrefix(uint64_t TSFlags,
1043 unsigned &CurByte,
int MemOperand,
1050 if (MemOperand != -1) {
1054 case X86::CS: EmitByte(0x2E, CurByte, OS);
break;
1055 case X86::SS: EmitByte(0x36, CurByte, OS);
break;
1056 case X86::DS: EmitByte(0x3E, CurByte, OS);
break;
1057 case X86::ES: EmitByte(0x26, CurByte, OS);
break;
1058 case X86::FS: EmitByte(0x64, CurByte, OS);
break;
1059 case X86::GS: EmitByte(0x65, CurByte, OS);
break;
1064 EmitByte(0x64, CurByte, OS);
1067 EmitByte(0x65, CurByte, OS);
1076 void X86MCCodeEmitter::EmitOpcodePrefix(uint64_t TSFlags,
unsigned &CurByte,
1077 int MemOperand,
const MCInst &MI,
1083 EmitByte(0xF0, CurByte, OS);
1086 EmitSegmentOverridePrefix(TSFlags, CurByte, MemOperand, MI, OS);
1089 if ((TSFlags & X86II::Op0Mask) ==
X86II::REP)
1090 EmitByte(0xF3, CurByte, OS);
1093 bool need_address_override;
1095 need_address_override =
true;
1096 }
else if (MemOperand == -1) {
1097 need_address_override =
false;
1098 }
else if (is64BitMode()) {
1101 }
else if (is32BitMode()) {
1105 need_address_override =
false;
1108 if (need_address_override)
1109 EmitByte(0x67, CurByte, OS);
1112 if (TSFlags & X86II::OpSize)
1113 EmitByte(0x66, CurByte, OS);
1115 bool Need0FPrefix =
false;
1116 switch (TSFlags & X86II::Op0Mask) {
1125 Need0FPrefix =
true;
1128 EmitByte(0xF3, CurByte, OS);
1129 Need0FPrefix =
true;
1132 EmitByte(0xF2, CurByte, OS);
1133 Need0FPrefix =
true;
1136 EmitByte(0xF2, CurByte, OS);
1137 Need0FPrefix =
true;
1140 EmitByte(0xF3, CurByte, OS);
1141 Need0FPrefix =
true;
1144 EmitByte(0xF2, CurByte, OS);
1145 Need0FPrefix =
true;
1147 case X86II::D8: EmitByte(0xD8, CurByte, OS);
break;
1148 case X86II::D9: EmitByte(0xD9, CurByte, OS);
break;
1149 case X86II::DA: EmitByte(0xDA, CurByte, OS);
break;
1150 case X86II::DB: EmitByte(0xDB, CurByte, OS);
break;
1151 case X86II::DC: EmitByte(0xDC, CurByte, OS);
break;
1152 case X86II::DD: EmitByte(0xDD, CurByte, OS);
break;
1153 case X86II::DE: EmitByte(0xDE, CurByte, OS);
break;
1154 case X86II::DF: EmitByte(0xDF, CurByte, OS);
break;
1159 if (is64BitMode()) {
1161 EmitByte(0x40 | REX, CurByte, OS);
1166 EmitByte(0x0F, CurByte, OS);
1169 switch (TSFlags & X86II::Op0Mask) {
1173 EmitByte(0x38, CurByte, OS);
1177 EmitByte(0x3A, CurByte, OS);
1180 EmitByte(0xA6, CurByte, OS);
1183 EmitByte(0xA7, CurByte, OS);
1188 void X86MCCodeEmitter::
1193 uint64_t TSFlags = Desc.
TSFlags;
1203 unsigned CurByte = 0;
1212 const unsigned MemOp4_I8IMMOperand = 2;
1220 if (MemoryOperand != -1) MemoryOperand += CurOp;
1223 EmitOpcodePrefix(TSFlags, CurByte, MemoryOperand, MI, Desc, OS);
1225 EmitVEXOpcodePrefix(TSFlags, CurByte, MemoryOperand, MI, Desc, OS);
1232 unsigned SrcRegNum = 0;
1233 switch (TSFlags & X86II::FormMask) {
1235 llvm_unreachable(
"FIXME: Remove this form when the JIT moves to MCCodeEmitter!");
1241 EmitByte(BaseOpcode, CurByte, OS);
1244 EmitByte(BaseOpcode, CurByte, OS);
1252 EmitByte(BaseOpcode, CurByte, OS);
1261 EmitByte(BaseOpcode + GetX86RegNum(MI.
getOperand(CurOp++)), CurByte, OS);
1265 EmitByte(BaseOpcode, CurByte, OS);
1266 SrcRegNum = CurOp + 1;
1275 GetX86RegNum(MI.
getOperand(SrcRegNum)), CurByte, OS);
1276 CurOp = SrcRegNum + 1;
1280 EmitByte(BaseOpcode, CurByte, OS);
1289 EmitMemModRMByte(MI, CurOp,
1291 TSFlags, CurByte, OS, Fixups);
1292 CurOp = SrcRegNum + 1;
1296 EmitByte(BaseOpcode, CurByte, OS);
1297 SrcRegNum = CurOp + 1;
1309 GetX86RegNum(MI.
getOperand(CurOp)), CurByte, OS);
1312 CurOp = HasMemOp4 ? SrcRegNum : SrcRegNum + 1;
1319 unsigned FirstMemOp = CurOp+1;
1333 EmitByte(BaseOpcode, CurByte, OS);
1335 EmitMemModRMByte(MI, FirstMemOp, GetX86RegNum(MI.
getOperand(CurOp)),
1336 TSFlags, CurByte, OS, Fixups);
1337 CurOp += AddrOperands + 1;
1349 EmitByte(BaseOpcode, CurByte, OS);
1360 EmitByte(BaseOpcode, CurByte, OS);
1361 EmitMemModRMByte(MI, CurOp, (TSFlags & X86II::FormMask)-
X86II::MRM0m,
1362 TSFlags, CurByte, OS, Fixups);
1374 EmitByte(BaseOpcode, CurByte, OS);
1377 switch (TSFlags & X86II::FormMask) {
1405 EmitByte(MRM, CurByte, OS);
1412 while (CurOp != NumOps && NumOps - CurOp <= 2) {
1419 unsigned RegNum = GetX86RegNum(MO) << 4;
1424 if (CurOp != NumOps) {
1427 unsigned Val = MIMM.
getImm();
1428 assert(Val < 16 &&
"Immediate operand value out of range");
1455 if ( CurOp != NumOps) {
1456 errs() <<
"Cannot encode all operands of: ";
static bool HasSecRelSymbolRef(const MCExpr *Expr)
void push_back(const T &Elt)
AddrSegmentReg - The operand # of the segment in the memory operand.
static bool Is64BitMemOperand(const MCInst &MI, unsigned Op)
bool isX86_64NonExtLowByteReg(unsigned reg)
const MCSymbol & getSymbol() const
static const MCConstantExpr * Create(int64_t Value, MCContext &Ctx)
static bool isDisp8(int Value)
static GlobalOffsetTableExprKind StartsWithGlobalOffsetTable(const MCExpr *Expr)
static MCFixupKind getKindForSize(unsigned Size, bool isPCRel)
int getOperandBias(const MCInstrDesc &Desc)
unsigned isImmPCRel(uint64_t TSFlags)
A one-byte pc relative fixup.
MCCodeEmitter * createX86MCCodeEmitter(const MCInstrInfo &MCII, const MCRegisterInfo &MRI, const MCSubtargetInfo &STI, MCContext &Ctx)
#define llvm_unreachable(msg)
A four-byte section relative fixup.
unsigned getReg() const
getReg - Returns the register number.
bool hasImm(uint64_t TSFlags)
static bool isCDisp8(uint64_t TSFlags, int Value, int &CValue)
bool isX86_64ExtendedReg(unsigned RegNo)
const MCExpr * getExpr() const
static MCFixupKind getImmFixupKind(uint64_t TSFlags)
const MCExpr * getLHS() const
getLHS - Get the left-hand side expression of the binary operator.
static bool Is16BitMemOperand(const MCInst &MI, unsigned Op)
MCCodeEmitter - Generic instruction encoding interface.
MCFixupKind
MCFixupKind - Extensible enumeration to represent the type of a fixup.
AddrNumOperands - Total number of operands in a memory reference.
MCBinaryExpr - Binary assembler expressions.
int getOperandConstraint(unsigned OpNum, MCOI::OperandConstraint Constraint) const
Returns the value of the specific constraint if it is set. Returns -1 if it is not set...
static bool Is32BitMemOperand(const MCInst &MI, unsigned Op)
static bool is32ExtendedReg(unsigned RegNo)
A two-byte pc relative fixup.
static unsigned DetermineREXPrefix(const MCInst &MI, uint64_t TSFlags, const MCInstrDesc &Desc)
A four-byte pc relative fixup.
unsigned char getBaseOpcodeFor(uint64_t TSFlags)
#define LLVM_DELETED_FUNCTION
unsigned getOpcode() const
static const MCBinaryExpr * CreateAdd(const MCExpr *LHS, const MCExpr *RHS, MCContext &Ctx)
const MCExpr * getRHS() const
getRHS - Get the right-hand side expression of the binary operator.
StringRef getName() const
getName - Get the symbol name.
VEX - The opcode prefix used by AVX instructions.
static unsigned char ModRMByte(unsigned Mod, unsigned RegOpcode, unsigned RM)
static MCOperand CreateImm(int64_t Val)
unsigned getSizeOfImm(uint64_t TSFlags)
unsigned getNumOperands() const
References to labels and assigned expressions.
VariantKind getKind() const
int getMemoryOperandNo(uint64_t TSFlags, unsigned Opcode)
LLVM Value Representation.
XOP - Opcode prefix used by XOP instructions.
unsigned getNumOperands() const
Return the number of declared MachineOperands for this MachineInstruction. Note that variadic (isVari...
static MCFixup Create(uint32_t Offset, const MCExpr *Value, MCFixupKind Kind, SMLoc Loc=SMLoc())
GlobalOffsetTableExprKind
const MCRegisterInfo & MRI
Represents a location in source code.
const MCOperand & getOperand(unsigned i) const