Path: blob/main/contrib/llvm-project/llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp
35294 views
//===-- X86MCCodeEmitter.cpp - Convert X86 code to machine code -----------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7//8// This file implements the X86MCCodeEmitter class.9//10//===----------------------------------------------------------------------===//1112#include "MCTargetDesc/X86BaseInfo.h"13#include "MCTargetDesc/X86FixupKinds.h"14#include "MCTargetDesc/X86MCTargetDesc.h"15#include "llvm/ADT/SmallVector.h"16#include "llvm/MC/MCCodeEmitter.h"17#include "llvm/MC/MCContext.h"18#include "llvm/MC/MCExpr.h"19#include "llvm/MC/MCFixup.h"20#include "llvm/MC/MCInst.h"21#include "llvm/MC/MCInstrDesc.h"22#include "llvm/MC/MCInstrInfo.h"23#include "llvm/MC/MCRegisterInfo.h"24#include "llvm/MC/MCSubtargetInfo.h"25#include "llvm/MC/MCSymbol.h"26#include "llvm/Support/Casting.h"27#include "llvm/Support/ErrorHandling.h"28#include <cassert>29#include <cstdint>30#include <cstdlib>3132using namespace llvm;3334#define DEBUG_TYPE "mccodeemitter"3536namespace {3738enum PrefixKind { None, REX, REX2, XOP, VEX2, VEX3, EVEX };3940static void emitByte(uint8_t C, SmallVectorImpl<char> &CB) { CB.push_back(C); }4142class X86OpcodePrefixHelper {43// REX (1 byte)44// +-----+ +------+45// | 40H | | WRXB |46// +-----+ +------+4748// REX2 (2 bytes)49// +-----+ +-------------------+50// | D5H | | M | R'X'B' | WRXB |51// +-----+ +-------------------+5253// XOP (3-byte)54// +-----+ +--------------+ +-------------------+55// | 8Fh | | RXB | m-mmmm | | W | vvvv | L | pp |56// +-----+ +--------------+ +-------------------+5758// VEX2 (2 bytes)59// +-----+ +-------------------+60// | C5h | | R | vvvv | L | pp |61// +-----+ +-------------------+6263// VEX3 (3 bytes)64// +-----+ +--------------+ +-------------------+65// | C4h | | RXB | m-mmmm | | W | vvvv | L | pp |66// +-----+ +--------------+ +-------------------+6768// VEX_R: opcode externsion equivalent to REX.R in69// 1's complement (inverted) form70//71// 1: Same as REX_R=0 (must be 1 in 32-bit mode)72// 0: Same as REX_R=1 (64 bit mode only)7374// VEX_X: equivalent to REX.X, only used when a75// register is used for index in SIB Byte.76//77// 1: Same as REX.X=0 (must be 1 in 32-bit mode)78// 0: Same as REX.X=1 (64-bit mode only)7980// VEX_B:81// 1: Same as REX_B=0 (ignored in 32-bit mode)82// 0: Same as REX_B=1 (64 bit mode only)8384// VEX_W: opcode specific (use like REX.W, or used for85// opcode extension, or ignored, depending on the opcode byte)8687// VEX_5M (VEX m-mmmmm field):88//89// 0b00000: Reserved for future use90// 0b00001: implied 0F leading opcode91// 0b00010: implied 0F 38 leading opcode bytes92// 0b00011: implied 0F 3A leading opcode bytes93// 0b00100: Reserved for future use94// 0b00101: VEX MAP595// 0b00110: VEX MAP696// 0b00111: VEX MAP797// 0b00111-0b11111: Reserved for future use98// 0b01000: XOP map select - 08h instructions with imm byte99// 0b01001: XOP map select - 09h instructions with no imm byte100// 0b01010: XOP map select - 0Ah instructions with imm dword101102// VEX_4V (VEX vvvv field): a register specifier103// (in 1's complement form) or 1111 if unused.104105// VEX_PP: opcode extension providing equivalent106// functionality of a SIMD prefix107// 0b00: None108// 0b01: 66109// 0b10: F3110// 0b11: F2111112// EVEX (4 bytes)113// +-----+ +---------------+ +--------------------+ +------------------------+114// | 62h | | RXBR' | B'mmm | | W | vvvv | X' | pp | | z | L'L | b | v' | aaa |115// +-----+ +---------------+ +--------------------+ +------------------------+116117// EVEX_L2/VEX_L (Vector Length):118// L2 L119// 0 0: scalar or 128-bit vector120// 0 1: 256-bit vector121// 1 0: 512-bit vector122123// 32-Register Support in 64-bit Mode Using EVEX with Embedded REX/REX2 Bits:124//125// +----------+---------+--------+-----------+---------+--------------+126// | | 4 | 3 | [2:0] | Type | Common Usage |127// +----------+---------+--------+-----------+---------+--------------+128// | REG | EVEX_R' | EVEX_R | modrm.reg | GPR, VR | Dest or Src |129// | VVVV | EVEX_v' | EVEX.vvvv | GPR, VR | Dest or Src |130// | RM (VR) | EVEX_X | EVEX_B | modrm.r/m | VR | Dest or Src |131// | RM (GPR) | EVEX_B' | EVEX_B | modrm.r/m | GPR | Dest or Src |132// | BASE | EVEX_B' | EVEX_B | modrm.r/m | GPR | MA |133// | INDEX | EVEX_X' | EVEX_X | sib.index | GPR | MA |134// | VIDX | EVEX_v' | EVEX_X | sib.index | VR | VSIB MA |135// +----------+---------+--------+-----------+---------+--------------+136//137// * GPR - General-purpose register138// * VR - Vector register139// * VIDX - Vector index140// * VSIB - Vector SIB141// * MA - Memory addressing142143private:144unsigned W : 1;145unsigned R : 1;146unsigned X : 1;147unsigned B : 1;148unsigned M : 1;149unsigned R2 : 1;150unsigned X2 : 1;151unsigned B2 : 1;152unsigned VEX_4V : 4;153unsigned VEX_L : 1;154unsigned VEX_PP : 2;155unsigned VEX_5M : 5;156unsigned EVEX_z : 1;157unsigned EVEX_L2 : 1;158unsigned EVEX_b : 1;159unsigned EVEX_V2 : 1;160unsigned EVEX_aaa : 3;161PrefixKind Kind = None;162const MCRegisterInfo &MRI;163164unsigned getRegEncoding(const MCInst &MI, unsigned OpNum) const {165return MRI.getEncodingValue(MI.getOperand(OpNum).getReg());166}167168void setR(unsigned Encoding) { R = Encoding >> 3 & 1; }169void setR2(unsigned Encoding) {170R2 = Encoding >> 4 & 1;171assert((!R2 || (Kind <= REX2 || Kind == EVEX)) && "invalid setting");172}173void setX(unsigned Encoding) { X = Encoding >> 3 & 1; }174void setX2(unsigned Encoding) {175assert((Kind <= REX2 || Kind == EVEX) && "invalid setting");176X2 = Encoding >> 4 & 1;177}178void setB(unsigned Encoding) { B = Encoding >> 3 & 1; }179void setB2(unsigned Encoding) {180assert((Kind <= REX2 || Kind == EVEX) && "invalid setting");181B2 = Encoding >> 4 & 1;182}183void set4V(unsigned Encoding) { VEX_4V = Encoding & 0xf; }184void setV2(unsigned Encoding) { EVEX_V2 = Encoding >> 4 & 1; }185186public:187void setW(bool V) { W = V; }188void setR(const MCInst &MI, unsigned OpNum) {189setR(getRegEncoding(MI, OpNum));190}191void setX(const MCInst &MI, unsigned OpNum, unsigned Shift = 3) {192unsigned Reg = MI.getOperand(OpNum).getReg();193// X is used to extend vector register only when shift is not 3.194if (Shift != 3 && X86II::isApxExtendedReg(Reg))195return;196unsigned Encoding = MRI.getEncodingValue(Reg);197X = Encoding >> Shift & 1;198}199void setB(const MCInst &MI, unsigned OpNum) {200B = getRegEncoding(MI, OpNum) >> 3 & 1;201}202void set4V(const MCInst &MI, unsigned OpNum, bool IsImm = false) {203// OF, SF, ZF and CF reuse VEX_4V bits but are not reversed204if (IsImm)205set4V(~(MI.getOperand(OpNum).getImm()));206else207set4V(getRegEncoding(MI, OpNum));208}209void setL(bool V) { VEX_L = V; }210void setPP(unsigned V) { VEX_PP = V; }211void set5M(unsigned V) { VEX_5M = V; }212void setR2(const MCInst &MI, unsigned OpNum) {213setR2(getRegEncoding(MI, OpNum));214}215void setRR2(const MCInst &MI, unsigned OpNum) {216unsigned Encoding = getRegEncoding(MI, OpNum);217setR(Encoding);218setR2(Encoding);219}220void setM(bool V) { M = V; }221void setXX2(const MCInst &MI, unsigned OpNum) {222unsigned Reg = MI.getOperand(OpNum).getReg();223unsigned Encoding = MRI.getEncodingValue(Reg);224setX(Encoding);225// Index can be a vector register while X2 is used to extend GPR only.226if (Kind <= REX2 || X86II::isApxExtendedReg(Reg))227setX2(Encoding);228}229void setBB2(const MCInst &MI, unsigned OpNum) {230unsigned Reg = MI.getOperand(OpNum).getReg();231unsigned Encoding = MRI.getEncodingValue(Reg);232setB(Encoding);233// Base can be a vector register while B2 is used to extend GPR only234if (Kind <= REX2 || X86II::isApxExtendedReg(Reg))235setB2(Encoding);236}237void setZ(bool V) { EVEX_z = V; }238void setL2(bool V) { EVEX_L2 = V; }239void setEVEX_b(bool V) { EVEX_b = V; }240void setV2(const MCInst &MI, unsigned OpNum, bool HasVEX_4V) {241// Only needed with VSIB which don't use VVVV.242if (HasVEX_4V)243return;244unsigned Reg = MI.getOperand(OpNum).getReg();245if (X86II::isApxExtendedReg(Reg))246return;247setV2(MRI.getEncodingValue(Reg));248}249void set4VV2(const MCInst &MI, unsigned OpNum) {250unsigned Encoding = getRegEncoding(MI, OpNum);251set4V(Encoding);252setV2(Encoding);253}254void setAAA(const MCInst &MI, unsigned OpNum) {255EVEX_aaa = getRegEncoding(MI, OpNum);256}257void setNF(bool V) { EVEX_aaa |= V << 2; }258void setSC(const MCInst &MI, unsigned OpNum) {259unsigned Encoding = MI.getOperand(OpNum).getImm();260EVEX_V2 = ~(Encoding >> 3) & 0x1;261EVEX_aaa = Encoding & 0x7;262}263264X86OpcodePrefixHelper(const MCRegisterInfo &MRI)265: W(0), R(0), X(0), B(0), M(0), R2(0), X2(0), B2(0), VEX_4V(0), VEX_L(0),266VEX_PP(0), VEX_5M(0), EVEX_z(0), EVEX_L2(0), EVEX_b(0), EVEX_V2(0),267EVEX_aaa(0), MRI(MRI) {}268269void setLowerBound(PrefixKind K) { Kind = K; }270271PrefixKind determineOptimalKind() {272switch (Kind) {273case None:274// Not M bit here by intention b/c275// 1. No guarantee that REX2 is supported by arch w/o explict EGPR276// 2. REX2 is longer than 0FH277Kind = (R2 | X2 | B2) ? REX2 : (W | R | X | B) ? REX : None;278break;279case REX:280Kind = (R2 | X2 | B2) ? REX2 : REX;281break;282case REX2:283case XOP:284case VEX3:285case EVEX:286break;287case VEX2:288Kind = (W | X | B | (VEX_5M != 1)) ? VEX3 : VEX2;289break;290}291return Kind;292}293294void emit(SmallVectorImpl<char> &CB) const {295uint8_t FirstPayload =296((~R) & 0x1) << 7 | ((~X) & 0x1) << 6 | ((~B) & 0x1) << 5;297uint8_t LastPayload = ((~VEX_4V) & 0xf) << 3 | VEX_L << 2 | VEX_PP;298switch (Kind) {299case None:300return;301case REX:302emitByte(0x40 | W << 3 | R << 2 | X << 1 | B, CB);303return;304case REX2:305emitByte(0xD5, CB);306emitByte(M << 7 | R2 << 6 | X2 << 5 | B2 << 4 | W << 3 | R << 2 | X << 1 |307B,308CB);309return;310case VEX2:311emitByte(0xC5, CB);312emitByte(((~R) & 1) << 7 | LastPayload, CB);313return;314case VEX3:315case XOP:316emitByte(Kind == VEX3 ? 0xC4 : 0x8F, CB);317emitByte(FirstPayload | VEX_5M, CB);318emitByte(W << 7 | LastPayload, CB);319return;320case EVEX:321assert(VEX_5M && !(VEX_5M & 0x8) && "invalid mmm fields for EVEX!");322emitByte(0x62, CB);323emitByte(FirstPayload | ((~R2) & 0x1) << 4 | B2 << 3 | VEX_5M, CB);324emitByte(W << 7 | ((~VEX_4V) & 0xf) << 3 | ((~X2) & 0x1) << 2 | VEX_PP,325CB);326emitByte(EVEX_z << 7 | EVEX_L2 << 6 | VEX_L << 5 | EVEX_b << 4 |327((~EVEX_V2) & 0x1) << 3 | EVEX_aaa,328CB);329return;330}331}332};333334class X86MCCodeEmitter : public MCCodeEmitter {335const MCInstrInfo &MCII;336MCContext &Ctx;337338public:339X86MCCodeEmitter(const MCInstrInfo &mcii, MCContext &ctx)340: MCII(mcii), Ctx(ctx) {}341X86MCCodeEmitter(const X86MCCodeEmitter &) = delete;342X86MCCodeEmitter &operator=(const X86MCCodeEmitter &) = delete;343~X86MCCodeEmitter() override = default;344345void emitPrefix(const MCInst &MI, SmallVectorImpl<char> &CB,346const MCSubtargetInfo &STI) const;347348void encodeInstruction(const MCInst &MI, SmallVectorImpl<char> &CB,349SmallVectorImpl<MCFixup> &Fixups,350const MCSubtargetInfo &STI) const override;351352private:353unsigned getX86RegNum(const MCOperand &MO) const;354355unsigned getX86RegEncoding(const MCInst &MI, unsigned OpNum) const;356357void emitImmediate(const MCOperand &Disp, SMLoc Loc, unsigned ImmSize,358MCFixupKind FixupKind, uint64_t StartByte,359SmallVectorImpl<char> &CB,360SmallVectorImpl<MCFixup> &Fixups, int ImmOffset = 0) const;361362void emitRegModRMByte(const MCOperand &ModRMReg, unsigned RegOpcodeFld,363SmallVectorImpl<char> &CB) const;364365void emitSIBByte(unsigned SS, unsigned Index, unsigned Base,366SmallVectorImpl<char> &CB) const;367368void emitMemModRMByte(const MCInst &MI, unsigned Op, unsigned RegOpcodeField,369uint64_t TSFlags, PrefixKind Kind, uint64_t StartByte,370SmallVectorImpl<char> &CB,371SmallVectorImpl<MCFixup> &Fixups,372const MCSubtargetInfo &STI,373bool ForceSIB = false) const;374375PrefixKind emitPrefixImpl(unsigned &CurOp, const MCInst &MI,376const MCSubtargetInfo &STI,377SmallVectorImpl<char> &CB) const;378379PrefixKind emitVEXOpcodePrefix(int MemOperand, const MCInst &MI,380const MCSubtargetInfo &STI,381SmallVectorImpl<char> &CB) const;382383void emitSegmentOverridePrefix(unsigned SegOperand, const MCInst &MI,384SmallVectorImpl<char> &CB) const;385386PrefixKind emitOpcodePrefix(int MemOperand, const MCInst &MI,387const MCSubtargetInfo &STI,388SmallVectorImpl<char> &CB) const;389390PrefixKind emitREXPrefix(int MemOperand, const MCInst &MI,391const MCSubtargetInfo &STI,392SmallVectorImpl<char> &CB) const;393};394395} // end anonymous namespace396397static uint8_t modRMByte(unsigned Mod, unsigned RegOpcode, unsigned RM) {398assert(Mod < 4 && RegOpcode < 8 && RM < 8 && "ModRM Fields out of range!");399return RM | (RegOpcode << 3) | (Mod << 6);400}401402static void emitConstant(uint64_t Val, unsigned Size,403SmallVectorImpl<char> &CB) {404// Output the constant in little endian byte order.405for (unsigned i = 0; i != Size; ++i) {406emitByte(Val & 255, CB);407Val >>= 8;408}409}410411/// Determine if this immediate can fit in a disp8 or a compressed disp8 for412/// EVEX instructions. \p will be set to the value to pass to the ImmOffset413/// parameter of emitImmediate.414static bool isDispOrCDisp8(uint64_t TSFlags, int Value, int &ImmOffset) {415bool HasEVEX = (TSFlags & X86II::EncodingMask) == X86II::EVEX;416417unsigned CD8_Scale =418(TSFlags & X86II::CD8_Scale_Mask) >> X86II::CD8_Scale_Shift;419CD8_Scale = CD8_Scale ? 1U << (CD8_Scale - 1) : 0U;420if (!HasEVEX || !CD8_Scale)421return isInt<8>(Value);422423assert(isPowerOf2_32(CD8_Scale) && "Unexpected CD8 scale!");424if (Value & (CD8_Scale - 1)) // Unaligned offset425return false;426427int CDisp8 = Value / static_cast<int>(CD8_Scale);428if (!isInt<8>(CDisp8))429return false;430431// ImmOffset will be added to Value in emitImmediate leaving just CDisp8.432ImmOffset = CDisp8 - Value;433return true;434}435436/// \returns the appropriate fixup kind to use for an immediate in an437/// instruction with the specified TSFlags.438static MCFixupKind getImmFixupKind(uint64_t TSFlags) {439unsigned Size = X86II::getSizeOfImm(TSFlags);440bool isPCRel = X86II::isImmPCRel(TSFlags);441442if (X86II::isImmSigned(TSFlags)) {443switch (Size) {444default:445llvm_unreachable("Unsupported signed fixup size!");446case 4:447return MCFixupKind(X86::reloc_signed_4byte);448}449}450return MCFixup::getKindForSize(Size, isPCRel);451}452453enum GlobalOffsetTableExprKind { GOT_None, GOT_Normal, GOT_SymDiff };454455/// Check if this expression starts with _GLOBAL_OFFSET_TABLE_ and if it is456/// of the form _GLOBAL_OFFSET_TABLE_-symbol. This is needed to support PIC on457/// ELF i386 as _GLOBAL_OFFSET_TABLE_ is magical. We check only simple case that458/// are know to be used: _GLOBAL_OFFSET_TABLE_ by itself or at the start of a459/// binary expression.460static GlobalOffsetTableExprKind461startsWithGlobalOffsetTable(const MCExpr *Expr) {462const MCExpr *RHS = nullptr;463if (Expr->getKind() == MCExpr::Binary) {464const MCBinaryExpr *BE = static_cast<const MCBinaryExpr *>(Expr);465Expr = BE->getLHS();466RHS = BE->getRHS();467}468469if (Expr->getKind() != MCExpr::SymbolRef)470return GOT_None;471472const MCSymbolRefExpr *Ref = static_cast<const MCSymbolRefExpr *>(Expr);473const MCSymbol &S = Ref->getSymbol();474if (S.getName() != "_GLOBAL_OFFSET_TABLE_")475return GOT_None;476if (RHS && RHS->getKind() == MCExpr::SymbolRef)477return GOT_SymDiff;478return GOT_Normal;479}480481static bool hasSecRelSymbolRef(const MCExpr *Expr) {482if (Expr->getKind() == MCExpr::SymbolRef) {483const MCSymbolRefExpr *Ref = static_cast<const MCSymbolRefExpr *>(Expr);484return Ref->getKind() == MCSymbolRefExpr::VK_SECREL;485}486return false;487}488489static bool isPCRel32Branch(const MCInst &MI, const MCInstrInfo &MCII) {490unsigned Opcode = MI.getOpcode();491const MCInstrDesc &Desc = MCII.get(Opcode);492if ((Opcode != X86::CALL64pcrel32 && Opcode != X86::JMP_4 &&493Opcode != X86::JCC_4) ||494getImmFixupKind(Desc.TSFlags) != FK_PCRel_4)495return false;496497unsigned CurOp = X86II::getOperandBias(Desc);498const MCOperand &Op = MI.getOperand(CurOp);499if (!Op.isExpr())500return false;501502const MCSymbolRefExpr *Ref = dyn_cast<MCSymbolRefExpr>(Op.getExpr());503return Ref && Ref->getKind() == MCSymbolRefExpr::VK_None;504}505506unsigned X86MCCodeEmitter::getX86RegNum(const MCOperand &MO) const {507return Ctx.getRegisterInfo()->getEncodingValue(MO.getReg()) & 0x7;508}509510unsigned X86MCCodeEmitter::getX86RegEncoding(const MCInst &MI,511unsigned OpNum) const {512return Ctx.getRegisterInfo()->getEncodingValue(MI.getOperand(OpNum).getReg());513}514515void X86MCCodeEmitter::emitImmediate(const MCOperand &DispOp, SMLoc Loc,516unsigned Size, MCFixupKind FixupKind,517uint64_t StartByte,518SmallVectorImpl<char> &CB,519SmallVectorImpl<MCFixup> &Fixups,520int ImmOffset) const {521const MCExpr *Expr = nullptr;522if (DispOp.isImm()) {523// If this is a simple integer displacement that doesn't require a524// relocation, emit it now.525if (FixupKind != FK_PCRel_1 && FixupKind != FK_PCRel_2 &&526FixupKind != FK_PCRel_4) {527emitConstant(DispOp.getImm() + ImmOffset, Size, CB);528return;529}530Expr = MCConstantExpr::create(DispOp.getImm(), Ctx);531} else {532Expr = DispOp.getExpr();533}534535// If we have an immoffset, add it to the expression.536if ((FixupKind == FK_Data_4 || FixupKind == FK_Data_8 ||537FixupKind == MCFixupKind(X86::reloc_signed_4byte))) {538GlobalOffsetTableExprKind Kind = startsWithGlobalOffsetTable(Expr);539if (Kind != GOT_None) {540assert(ImmOffset == 0);541542if (Size == 8) {543FixupKind = MCFixupKind(X86::reloc_global_offset_table8);544} else {545assert(Size == 4);546FixupKind = MCFixupKind(X86::reloc_global_offset_table);547}548549if (Kind == GOT_Normal)550ImmOffset = static_cast<int>(CB.size() - StartByte);551} else if (Expr->getKind() == MCExpr::SymbolRef) {552if (hasSecRelSymbolRef(Expr)) {553FixupKind = MCFixupKind(FK_SecRel_4);554}555} else if (Expr->getKind() == MCExpr::Binary) {556const MCBinaryExpr *Bin = static_cast<const MCBinaryExpr *>(Expr);557if (hasSecRelSymbolRef(Bin->getLHS()) ||558hasSecRelSymbolRef(Bin->getRHS())) {559FixupKind = MCFixupKind(FK_SecRel_4);560}561}562}563564// If the fixup is pc-relative, we need to bias the value to be relative to565// the start of the field, not the end of the field.566if (FixupKind == FK_PCRel_4 ||567FixupKind == MCFixupKind(X86::reloc_riprel_4byte) ||568FixupKind == MCFixupKind(X86::reloc_riprel_4byte_movq_load) ||569FixupKind == MCFixupKind(X86::reloc_riprel_4byte_relax) ||570FixupKind == MCFixupKind(X86::reloc_riprel_4byte_relax_rex) ||571FixupKind == MCFixupKind(X86::reloc_branch_4byte_pcrel)) {572ImmOffset -= 4;573// If this is a pc-relative load off _GLOBAL_OFFSET_TABLE_:574// leaq _GLOBAL_OFFSET_TABLE_(%rip), %r15575// this needs to be a GOTPC32 relocation.576if (startsWithGlobalOffsetTable(Expr) != GOT_None)577FixupKind = MCFixupKind(X86::reloc_global_offset_table);578}579if (FixupKind == FK_PCRel_2)580ImmOffset -= 2;581if (FixupKind == FK_PCRel_1)582ImmOffset -= 1;583584if (ImmOffset)585Expr = MCBinaryExpr::createAdd(Expr, MCConstantExpr::create(ImmOffset, Ctx),586Ctx);587588// Emit a symbolic constant as a fixup and 4 zeros.589Fixups.push_back(MCFixup::create(static_cast<uint32_t>(CB.size() - StartByte),590Expr, FixupKind, Loc));591emitConstant(0, Size, CB);592}593594void X86MCCodeEmitter::emitRegModRMByte(const MCOperand &ModRMReg,595unsigned RegOpcodeFld,596SmallVectorImpl<char> &CB) const {597emitByte(modRMByte(3, RegOpcodeFld, getX86RegNum(ModRMReg)), CB);598}599600void X86MCCodeEmitter::emitSIBByte(unsigned SS, unsigned Index, unsigned Base,601SmallVectorImpl<char> &CB) const {602// SIB byte is in the same format as the modRMByte.603emitByte(modRMByte(SS, Index, Base), CB);604}605606void X86MCCodeEmitter::emitMemModRMByte(607const MCInst &MI, unsigned Op, unsigned RegOpcodeField, uint64_t TSFlags,608PrefixKind Kind, uint64_t StartByte, SmallVectorImpl<char> &CB,609SmallVectorImpl<MCFixup> &Fixups, const MCSubtargetInfo &STI,610bool ForceSIB) const {611const MCOperand &Disp = MI.getOperand(Op + X86::AddrDisp);612const MCOperand &Base = MI.getOperand(Op + X86::AddrBaseReg);613const MCOperand &Scale = MI.getOperand(Op + X86::AddrScaleAmt);614const MCOperand &IndexReg = MI.getOperand(Op + X86::AddrIndexReg);615unsigned BaseReg = Base.getReg();616617// Handle %rip relative addressing.618if (BaseReg == X86::RIP ||619BaseReg == X86::EIP) { // [disp32+rIP] in X86-64 mode620assert(STI.hasFeature(X86::Is64Bit) &&621"Rip-relative addressing requires 64-bit mode");622assert(IndexReg.getReg() == 0 && !ForceSIB &&623"Invalid rip-relative address");624emitByte(modRMByte(0, RegOpcodeField, 5), CB);625626unsigned Opcode = MI.getOpcode();627unsigned FixupKind = [&]() {628// Enable relaxed relocation only for a MCSymbolRefExpr. We cannot use a629// relaxed relocation if an offset is present (e.g. x@GOTPCREL+4).630if (!(Disp.isExpr() && isa<MCSymbolRefExpr>(Disp.getExpr())))631return X86::reloc_riprel_4byte;632633// Certain loads for GOT references can be relocated against the symbol634// directly if the symbol ends up in the same linkage unit.635switch (Opcode) {636default:637return X86::reloc_riprel_4byte;638case X86::MOV64rm:639// movq loads is a subset of reloc_riprel_4byte_relax_rex. It is a640// special case because COFF and Mach-O don't support ELF's more641// flexible R_X86_64_REX_GOTPCRELX relaxation.642// TODO: Support new relocation for REX2.643assert(Kind == REX || Kind == REX2);644return X86::reloc_riprel_4byte_movq_load;645case X86::ADC32rm:646case X86::ADD32rm:647case X86::AND32rm:648case X86::CMP32rm:649case X86::MOV32rm:650case X86::OR32rm:651case X86::SBB32rm:652case X86::SUB32rm:653case X86::TEST32mr:654case X86::XOR32rm:655case X86::CALL64m:656case X86::JMP64m:657case X86::TAILJMPm64:658case X86::TEST64mr:659case X86::ADC64rm:660case X86::ADD64rm:661case X86::AND64rm:662case X86::CMP64rm:663case X86::OR64rm:664case X86::SBB64rm:665case X86::SUB64rm:666case X86::XOR64rm:667// We haven't support relocation for REX2 prefix, so temporarily use REX668// relocation.669// TODO: Support new relocation for REX2.670return (Kind == REX || Kind == REX2) ? X86::reloc_riprel_4byte_relax_rex671: X86::reloc_riprel_4byte_relax;672}673}();674675// rip-relative addressing is actually relative to the *next* instruction.676// Since an immediate can follow the mod/rm byte for an instruction, this677// means that we need to bias the displacement field of the instruction with678// the size of the immediate field. If we have this case, add it into the679// expression to emit.680// Note: rip-relative addressing using immediate displacement values should681// not be adjusted, assuming it was the user's intent.682int ImmSize = !Disp.isImm() && X86II::hasImm(TSFlags)683? X86II::getSizeOfImm(TSFlags)684: 0;685686emitImmediate(Disp, MI.getLoc(), 4, MCFixupKind(FixupKind), StartByte, CB,687Fixups, -ImmSize);688return;689}690691unsigned BaseRegNo = BaseReg ? getX86RegNum(Base) : -1U;692693bool IsAdSize16 = STI.hasFeature(X86::Is32Bit) &&694(TSFlags & X86II::AdSizeMask) == X86II::AdSize16;695696// 16-bit addressing forms of the ModR/M byte have a different encoding for697// the R/M field and are far more limited in which registers can be used.698if (IsAdSize16 || X86_MC::is16BitMemOperand(MI, Op, STI)) {699if (BaseReg) {700// For 32-bit addressing, the row and column values in Table 2-2 are701// basically the same. It's AX/CX/DX/BX/SP/BP/SI/DI in that order, with702// some special cases. And getX86RegNum reflects that numbering.703// For 16-bit addressing it's more fun, as shown in the SDM Vol 2A,704// Table 2-1 "16-Bit Addressing Forms with the ModR/M byte". We can only705// use SI/DI/BP/BX, which have "row" values 4-7 in no particular order,706// while values 0-3 indicate the allowed combinations (base+index) of707// those: 0 for BX+SI, 1 for BX+DI, 2 for BP+SI, 3 for BP+DI.708//709// R16Table[] is a lookup from the normal RegNo, to the row values from710// Table 2-1 for 16-bit addressing modes. Where zero means disallowed.711static const unsigned R16Table[] = {0, 0, 0, 7, 0, 6, 4, 5};712unsigned RMfield = R16Table[BaseRegNo];713714assert(RMfield && "invalid 16-bit base register");715716if (IndexReg.getReg()) {717unsigned IndexReg16 = R16Table[getX86RegNum(IndexReg)];718719assert(IndexReg16 && "invalid 16-bit index register");720// We must have one of SI/DI (4,5), and one of BP/BX (6,7).721assert(((IndexReg16 ^ RMfield) & 2) &&722"invalid 16-bit base/index register combination");723assert(Scale.getImm() == 1 &&724"invalid scale for 16-bit memory reference");725726// Allow base/index to appear in either order (although GAS doesn't).727if (IndexReg16 & 2)728RMfield = (RMfield & 1) | ((7 - IndexReg16) << 1);729else730RMfield = (IndexReg16 & 1) | ((7 - RMfield) << 1);731}732733if (Disp.isImm() && isInt<8>(Disp.getImm())) {734if (Disp.getImm() == 0 && RMfield != 6) {735// There is no displacement; just the register.736emitByte(modRMByte(0, RegOpcodeField, RMfield), CB);737return;738}739// Use the [REG]+disp8 form, including for [BP] which cannot be encoded.740emitByte(modRMByte(1, RegOpcodeField, RMfield), CB);741emitImmediate(Disp, MI.getLoc(), 1, FK_Data_1, StartByte, CB, Fixups);742return;743}744// This is the [REG]+disp16 case.745emitByte(modRMByte(2, RegOpcodeField, RMfield), CB);746} else {747assert(IndexReg.getReg() == 0 && "Unexpected index register!");748// There is no BaseReg; this is the plain [disp16] case.749emitByte(modRMByte(0, RegOpcodeField, 6), CB);750}751752// Emit 16-bit displacement for plain disp16 or [REG]+disp16 cases.753emitImmediate(Disp, MI.getLoc(), 2, FK_Data_2, StartByte, CB, Fixups);754return;755}756757// Check for presence of {disp8} or {disp32} pseudo prefixes.758bool UseDisp8 = MI.getFlags() & X86::IP_USE_DISP8;759bool UseDisp32 = MI.getFlags() & X86::IP_USE_DISP32;760761// We only allow no displacement if no pseudo prefix is present.762bool AllowNoDisp = !UseDisp8 && !UseDisp32;763// Disp8 is allowed unless the {disp32} prefix is present.764bool AllowDisp8 = !UseDisp32;765766// Determine whether a SIB byte is needed.767if (!ForceSIB && !X86II::needSIB(BaseReg, IndexReg.getReg(),768STI.hasFeature(X86::Is64Bit))) {769if (BaseReg == 0) { // [disp32] in X86-32 mode770emitByte(modRMByte(0, RegOpcodeField, 5), CB);771emitImmediate(Disp, MI.getLoc(), 4, FK_Data_4, StartByte, CB, Fixups);772return;773}774775// If the base is not EBP/ESP/R12/R13/R20/R21/R28/R29 and there is no776// displacement, use simple indirect register encoding, this handles777// addresses like [EAX]. The encoding for [EBP], [R13], [R20], [R21], [R28]778// or [R29] with no displacement means [disp32] so we handle it by emitting779// a displacement of 0 later.780if (BaseRegNo != N86::EBP) {781if (Disp.isImm() && Disp.getImm() == 0 && AllowNoDisp) {782emitByte(modRMByte(0, RegOpcodeField, BaseRegNo), CB);783return;784}785786// If the displacement is @tlscall, treat it as a zero.787if (Disp.isExpr()) {788auto *Sym = dyn_cast<MCSymbolRefExpr>(Disp.getExpr());789if (Sym && Sym->getKind() == MCSymbolRefExpr::VK_TLSCALL) {790// This is exclusively used by call *a@tlscall(base). The relocation791// (R_386_TLSCALL or R_X86_64_TLSCALL) applies to the beginning.792Fixups.push_back(MCFixup::create(0, Sym, FK_NONE, MI.getLoc()));793emitByte(modRMByte(0, RegOpcodeField, BaseRegNo), CB);794return;795}796}797}798799// Otherwise, if the displacement fits in a byte, encode as [REG+disp8].800// Including a compressed disp8 for EVEX instructions that support it.801// This also handles the 0 displacement for [EBP], [R13], [R21] or [R29]. We802// can't use disp8 if the {disp32} pseudo prefix is present.803if (Disp.isImm() && AllowDisp8) {804int ImmOffset = 0;805if (isDispOrCDisp8(TSFlags, Disp.getImm(), ImmOffset)) {806emitByte(modRMByte(1, RegOpcodeField, BaseRegNo), CB);807emitImmediate(Disp, MI.getLoc(), 1, FK_Data_1, StartByte, CB, Fixups,808ImmOffset);809return;810}811}812813// Otherwise, emit the most general non-SIB encoding: [REG+disp32].814// Displacement may be 0 for [EBP], [R13], [R21], [R29] case if {disp32}815// pseudo prefix prevented using disp8 above.816emitByte(modRMByte(2, RegOpcodeField, BaseRegNo), CB);817unsigned Opcode = MI.getOpcode();818unsigned FixupKind = Opcode == X86::MOV32rm ? X86::reloc_signed_4byte_relax819: X86::reloc_signed_4byte;820emitImmediate(Disp, MI.getLoc(), 4, MCFixupKind(FixupKind), StartByte, CB,821Fixups);822return;823}824825// We need a SIB byte, so start by outputting the ModR/M byte first826assert(IndexReg.getReg() != X86::ESP && IndexReg.getReg() != X86::RSP &&827"Cannot use ESP as index reg!");828829bool ForceDisp32 = false;830bool ForceDisp8 = false;831int ImmOffset = 0;832if (BaseReg == 0) {833// If there is no base register, we emit the special case SIB byte with834// MOD=0, BASE=5, to JUST get the index, scale, and displacement.835BaseRegNo = 5;836emitByte(modRMByte(0, RegOpcodeField, 4), CB);837ForceDisp32 = true;838} else if (Disp.isImm() && Disp.getImm() == 0 && AllowNoDisp &&839// Base reg can't be EBP/RBP/R13/R21/R29 as that would end up with840// '5' as the base field, but that is the magic [*] nomenclature841// that indicates no base when mod=0. For these cases we'll emit a842// 0 displacement instead.843BaseRegNo != N86::EBP) {844// Emit no displacement ModR/M byte845emitByte(modRMByte(0, RegOpcodeField, 4), CB);846} else if (Disp.isImm() && AllowDisp8 &&847isDispOrCDisp8(TSFlags, Disp.getImm(), ImmOffset)) {848// Displacement fits in a byte or matches an EVEX compressed disp8, use849// disp8 encoding. This also handles EBP/R13/R21/R29 base with 0850// displacement unless {disp32} pseudo prefix was used.851emitByte(modRMByte(1, RegOpcodeField, 4), CB);852ForceDisp8 = true;853} else {854// Otherwise, emit the normal disp32 encoding.855emitByte(modRMByte(2, RegOpcodeField, 4), CB);856ForceDisp32 = true;857}858859// Calculate what the SS field value should be...860static const unsigned SSTable[] = {~0U, 0, 1, ~0U, 2, ~0U, ~0U, ~0U, 3};861unsigned SS = SSTable[Scale.getImm()];862863unsigned IndexRegNo = IndexReg.getReg() ? getX86RegNum(IndexReg) : 4;864865emitSIBByte(SS, IndexRegNo, BaseRegNo, CB);866867// Do we need to output a displacement?868if (ForceDisp8)869emitImmediate(Disp, MI.getLoc(), 1, FK_Data_1, StartByte, CB, Fixups,870ImmOffset);871else if (ForceDisp32)872emitImmediate(Disp, MI.getLoc(), 4, MCFixupKind(X86::reloc_signed_4byte),873StartByte, CB, Fixups);874}875876/// Emit all instruction prefixes.877///878/// \returns one of the REX, XOP, VEX2, VEX3, EVEX if any of them is used,879/// otherwise returns None.880PrefixKind X86MCCodeEmitter::emitPrefixImpl(unsigned &CurOp, const MCInst &MI,881const MCSubtargetInfo &STI,882SmallVectorImpl<char> &CB) const {883uint64_t TSFlags = MCII.get(MI.getOpcode()).TSFlags;884// Determine where the memory operand starts, if present.885int MemoryOperand = X86II::getMemoryOperandNo(TSFlags);886// Emit segment override opcode prefix as needed.887if (MemoryOperand != -1) {888MemoryOperand += CurOp;889emitSegmentOverridePrefix(MemoryOperand + X86::AddrSegmentReg, MI, CB);890}891892// Emit the repeat opcode prefix as needed.893unsigned Flags = MI.getFlags();894if (TSFlags & X86II::REP || Flags & X86::IP_HAS_REPEAT)895emitByte(0xF3, CB);896if (Flags & X86::IP_HAS_REPEAT_NE)897emitByte(0xF2, CB);898899// Emit the address size opcode prefix as needed.900if (X86_MC::needsAddressSizeOverride(MI, STI, MemoryOperand, TSFlags) ||901Flags & X86::IP_HAS_AD_SIZE)902emitByte(0x67, CB);903904uint64_t Form = TSFlags & X86II::FormMask;905switch (Form) {906default:907break;908case X86II::RawFrmDstSrc: {909// Emit segment override opcode prefix as needed (not for %ds).910if (MI.getOperand(2).getReg() != X86::DS)911emitSegmentOverridePrefix(2, MI, CB);912CurOp += 3; // Consume operands.913break;914}915case X86II::RawFrmSrc: {916// Emit segment override opcode prefix as needed (not for %ds).917if (MI.getOperand(1).getReg() != X86::DS)918emitSegmentOverridePrefix(1, MI, CB);919CurOp += 2; // Consume operands.920break;921}922case X86II::RawFrmDst: {923++CurOp; // Consume operand.924break;925}926case X86II::RawFrmMemOffs: {927// Emit segment override opcode prefix as needed.928emitSegmentOverridePrefix(1, MI, CB);929break;930}931}932933// REX prefix is optional, but if used must be immediately before the opcode934// Encoding type for this instruction.935return (TSFlags & X86II::EncodingMask)936? emitVEXOpcodePrefix(MemoryOperand, MI, STI, CB)937: emitOpcodePrefix(MemoryOperand, MI, STI, CB);938}939940// AVX instructions are encoded using an encoding scheme that combines941// prefix bytes, opcode extension field, operand encoding fields, and vector942// length encoding capability into a new prefix, referred to as VEX.943944// The majority of the AVX-512 family of instructions (operating on945// 512/256/128-bit vector register operands) are encoded using a new prefix946// (called EVEX).947948// XOP is a revised subset of what was originally intended as SSE5. It was949// changed to be similar but not overlapping with AVX.950951/// Emit XOP, VEX2, VEX3 or EVEX prefix.952/// \returns the used prefix.953PrefixKind954X86MCCodeEmitter::emitVEXOpcodePrefix(int MemOperand, const MCInst &MI,955const MCSubtargetInfo &STI,956SmallVectorImpl<char> &CB) const {957const MCInstrDesc &Desc = MCII.get(MI.getOpcode());958uint64_t TSFlags = Desc.TSFlags;959960assert(!(TSFlags & X86II::LOCK) && "Can't have LOCK VEX.");961962#ifndef NDEBUG963unsigned NumOps = MI.getNumOperands();964for (unsigned I = NumOps ? X86II::getOperandBias(Desc) : 0; I != NumOps;965++I) {966const MCOperand &MO = MI.getOperand(I);967if (!MO.isReg())968continue;969unsigned Reg = MO.getReg();970if (Reg == X86::AH || Reg == X86::BH || Reg == X86::CH || Reg == X86::DH)971report_fatal_error(972"Cannot encode high byte register in VEX/EVEX-prefixed instruction");973}974#endif975976X86OpcodePrefixHelper Prefix(*Ctx.getRegisterInfo());977switch (TSFlags & X86II::EncodingMask) {978default:979break;980case X86II::XOP:981Prefix.setLowerBound(XOP);982break;983case X86II::VEX:984// VEX can be 2 byte or 3 byte, not determined yet if not explicit985Prefix.setLowerBound((MI.getFlags() & X86::IP_USE_VEX3) ? VEX3 : VEX2);986break;987case X86II::EVEX:988Prefix.setLowerBound(EVEX);989break;990}991992Prefix.setW(TSFlags & X86II::REX_W);993Prefix.setNF(TSFlags & X86II::EVEX_NF);994995bool HasEVEX_K = TSFlags & X86II::EVEX_K;996bool HasVEX_4V = TSFlags & X86II::VEX_4V;997bool IsND = X86II::hasNewDataDest(TSFlags); // IsND implies HasVEX_4V998bool HasEVEX_RC = TSFlags & X86II::EVEX_RC;9991000switch (TSFlags & X86II::OpMapMask) {1001default:1002llvm_unreachable("Invalid prefix!");1003case X86II::TB:1004Prefix.set5M(0x1); // 0F1005break;1006case X86II::T8:1007Prefix.set5M(0x2); // 0F 381008break;1009case X86II::TA:1010Prefix.set5M(0x3); // 0F 3A1011break;1012case X86II::XOP8:1013Prefix.set5M(0x8);1014break;1015case X86II::XOP9:1016Prefix.set5M(0x9);1017break;1018case X86II::XOPA:1019Prefix.set5M(0xA);1020break;1021case X86II::T_MAP4:1022Prefix.set5M(0x4);1023break;1024case X86II::T_MAP5:1025Prefix.set5M(0x5);1026break;1027case X86II::T_MAP6:1028Prefix.set5M(0x6);1029break;1030case X86II::T_MAP7:1031Prefix.set5M(0x7);1032break;1033}10341035Prefix.setL(TSFlags & X86II::VEX_L);1036Prefix.setL2(TSFlags & X86II::EVEX_L2);1037if ((TSFlags & X86II::EVEX_L2) && STI.hasFeature(X86::FeatureAVX512) &&1038!STI.hasFeature(X86::FeatureEVEX512))1039report_fatal_error("ZMM registers are not supported without EVEX512");1040switch (TSFlags & X86II::OpPrefixMask) {1041case X86II::PD:1042Prefix.setPP(0x1); // 661043break;1044case X86II::XS:1045Prefix.setPP(0x2); // F31046break;1047case X86II::XD:1048Prefix.setPP(0x3); // F21049break;1050}10511052Prefix.setZ(HasEVEX_K && (TSFlags & X86II::EVEX_Z));1053Prefix.setEVEX_b(TSFlags & X86II::EVEX_B);10541055bool EncodeRC = false;1056uint8_t EVEX_rc = 0;10571058unsigned CurOp = X86II::getOperandBias(Desc);1059bool HasTwoConditionalOps = TSFlags & X86II::TwoConditionalOps;10601061switch (TSFlags & X86II::FormMask) {1062default:1063llvm_unreachable("Unexpected form in emitVEXOpcodePrefix!");1064case X86II::MRMDestMem4VOp3CC: {1065// src1(ModR/M), MemAddr, src2(VEX_4V)1066Prefix.setRR2(MI, CurOp++);1067Prefix.setBB2(MI, MemOperand + X86::AddrBaseReg);1068Prefix.setXX2(MI, MemOperand + X86::AddrIndexReg);1069CurOp += X86::AddrNumOperands;1070Prefix.set4VV2(MI, CurOp++);1071break;1072}1073case X86II::MRM_C0:1074case X86II::RawFrm:1075break;1076case X86II::MRMDestMemCC:1077case X86II::MRMDestMemFSIB:1078case X86II::MRMDestMem: {1079// MRMDestMem instructions forms:1080// MemAddr, src1(ModR/M)1081// MemAddr, src1(VEX_4V), src2(ModR/M)1082// MemAddr, src1(ModR/M), imm81083//1084// NDD:1085// dst(VEX_4V), MemAddr, src1(ModR/M)1086Prefix.setBB2(MI, MemOperand + X86::AddrBaseReg);1087Prefix.setXX2(MI, MemOperand + X86::AddrIndexReg);1088Prefix.setV2(MI, MemOperand + X86::AddrIndexReg, HasVEX_4V);10891090if (IsND)1091Prefix.set4VV2(MI, CurOp++);10921093CurOp += X86::AddrNumOperands;10941095if (HasEVEX_K)1096Prefix.setAAA(MI, CurOp++);10971098if (!IsND && HasVEX_4V)1099Prefix.set4VV2(MI, CurOp++);11001101Prefix.setRR2(MI, CurOp++);1102if (HasTwoConditionalOps) {1103Prefix.set4V(MI, CurOp++, /*IsImm=*/true);1104Prefix.setSC(MI, CurOp++);1105}1106break;1107}1108case X86II::MRMSrcMemCC:1109case X86II::MRMSrcMemFSIB:1110case X86II::MRMSrcMem: {1111// MRMSrcMem instructions forms:1112// src1(ModR/M), MemAddr1113// src1(ModR/M), src2(VEX_4V), MemAddr1114// src1(ModR/M), MemAddr, imm81115// src1(ModR/M), MemAddr, src2(Imm[7:4])1116//1117// FMA4:1118// dst(ModR/M.reg), src1(VEX_4V), src2(ModR/M), src3(Imm[7:4])1119//1120// NDD:1121// dst(VEX_4V), src1(ModR/M), MemAddr1122if (IsND)1123Prefix.set4VV2(MI, CurOp++);11241125Prefix.setRR2(MI, CurOp++);11261127if (HasEVEX_K)1128Prefix.setAAA(MI, CurOp++);11291130if (!IsND && HasVEX_4V)1131Prefix.set4VV2(MI, CurOp++);11321133Prefix.setBB2(MI, MemOperand + X86::AddrBaseReg);1134Prefix.setXX2(MI, MemOperand + X86::AddrIndexReg);1135Prefix.setV2(MI, MemOperand + X86::AddrIndexReg, HasVEX_4V);1136CurOp += X86::AddrNumOperands;1137if (HasTwoConditionalOps) {1138Prefix.set4V(MI, CurOp++, /*IsImm=*/true);1139Prefix.setSC(MI, CurOp++);1140}1141break;1142}1143case X86II::MRMSrcMem4VOp3: {1144// Instruction format for 4VOp3:1145// src1(ModR/M), MemAddr, src3(VEX_4V)1146Prefix.setRR2(MI, CurOp++);1147Prefix.setBB2(MI, MemOperand + X86::AddrBaseReg);1148Prefix.setXX2(MI, MemOperand + X86::AddrIndexReg);1149Prefix.set4VV2(MI, CurOp + X86::AddrNumOperands);1150break;1151}1152case X86II::MRMSrcMemOp4: {1153// dst(ModR/M.reg), src1(VEX_4V), src2(Imm[7:4]), src3(ModR/M),1154Prefix.setR(MI, CurOp++);1155Prefix.set4V(MI, CurOp++);1156Prefix.setBB2(MI, MemOperand + X86::AddrBaseReg);1157Prefix.setXX2(MI, MemOperand + X86::AddrIndexReg);1158break;1159}1160case X86II::MRMXmCC:1161case X86II::MRM0m:1162case X86II::MRM1m:1163case X86II::MRM2m:1164case X86II::MRM3m:1165case X86II::MRM4m:1166case X86II::MRM5m:1167case X86II::MRM6m:1168case X86II::MRM7m: {1169// MRM[0-9]m instructions forms:1170// MemAddr1171// src1(VEX_4V), MemAddr1172if (HasVEX_4V)1173Prefix.set4VV2(MI, CurOp++);11741175if (HasEVEX_K)1176Prefix.setAAA(MI, CurOp++);11771178Prefix.setBB2(MI, MemOperand + X86::AddrBaseReg);1179Prefix.setXX2(MI, MemOperand + X86::AddrIndexReg);1180Prefix.setV2(MI, MemOperand + X86::AddrIndexReg, HasVEX_4V);1181CurOp += X86::AddrNumOperands + 1; // Skip first imm.1182if (HasTwoConditionalOps) {1183Prefix.set4V(MI, CurOp++, /*IsImm=*/true);1184Prefix.setSC(MI, CurOp++);1185}1186break;1187}1188case X86II::MRMSrcRegCC:1189case X86II::MRMSrcReg: {1190// MRMSrcReg instructions forms:1191// dst(ModR/M), src1(VEX_4V), src2(ModR/M), src3(Imm[7:4])1192// dst(ModR/M), src1(ModR/M)1193// dst(ModR/M), src1(ModR/M), imm81194//1195// FMA4:1196// dst(ModR/M.reg), src1(VEX_4V), src2(Imm[7:4]), src3(ModR/M),1197//1198// NDD:1199// dst(VEX_4V), src1(ModR/M.reg), src2(ModR/M)1200if (IsND)1201Prefix.set4VV2(MI, CurOp++);1202Prefix.setRR2(MI, CurOp++);12031204if (HasEVEX_K)1205Prefix.setAAA(MI, CurOp++);12061207if (!IsND && HasVEX_4V)1208Prefix.set4VV2(MI, CurOp++);12091210Prefix.setBB2(MI, CurOp);1211Prefix.setX(MI, CurOp, 4);1212++CurOp;12131214if (HasTwoConditionalOps) {1215Prefix.set4V(MI, CurOp++, /*IsImm=*/true);1216Prefix.setSC(MI, CurOp++);1217}12181219if (TSFlags & X86II::EVEX_B) {1220if (HasEVEX_RC) {1221unsigned NumOps = Desc.getNumOperands();1222unsigned RcOperand = NumOps - 1;1223assert(RcOperand >= CurOp);1224EVEX_rc = MI.getOperand(RcOperand).getImm();1225assert(EVEX_rc <= 3 && "Invalid rounding control!");1226}1227EncodeRC = true;1228}1229break;1230}1231case X86II::MRMSrcReg4VOp3: {1232// Instruction format for 4VOp3:1233// src1(ModR/M), src2(ModR/M), src3(VEX_4V)1234Prefix.setRR2(MI, CurOp++);1235Prefix.setBB2(MI, CurOp++);1236Prefix.set4VV2(MI, CurOp++);1237break;1238}1239case X86II::MRMSrcRegOp4: {1240// dst(ModR/M.reg), src1(VEX_4V), src2(Imm[7:4]), src3(ModR/M),1241Prefix.setR(MI, CurOp++);1242Prefix.set4V(MI, CurOp++);1243// Skip second register source (encoded in Imm[7:4])1244++CurOp;12451246Prefix.setB(MI, CurOp);1247Prefix.setX(MI, CurOp, 4);1248++CurOp;1249break;1250}1251case X86II::MRMDestRegCC:1252case X86II::MRMDestReg: {1253// MRMDestReg instructions forms:1254// dst(ModR/M), src(ModR/M)1255// dst(ModR/M), src(ModR/M), imm81256// dst(ModR/M), src1(VEX_4V), src2(ModR/M)1257//1258// NDD:1259// dst(VEX_4V), src1(ModR/M), src2(ModR/M)1260if (IsND)1261Prefix.set4VV2(MI, CurOp++);1262Prefix.setBB2(MI, CurOp);1263Prefix.setX(MI, CurOp, 4);1264++CurOp;12651266if (HasEVEX_K)1267Prefix.setAAA(MI, CurOp++);12681269if (!IsND && HasVEX_4V)1270Prefix.set4VV2(MI, CurOp++);12711272Prefix.setRR2(MI, CurOp++);1273if (HasTwoConditionalOps) {1274Prefix.set4V(MI, CurOp++, /*IsImm=*/true);1275Prefix.setSC(MI, CurOp++);1276}1277if (TSFlags & X86II::EVEX_B)1278EncodeRC = true;1279break;1280}1281case X86II::MRMr0: {1282// MRMr0 instructions forms:1283// 11:rrr:0001284// dst(ModR/M)1285Prefix.setRR2(MI, CurOp++);1286break;1287}1288case X86II::MRMXrCC:1289case X86II::MRM0r:1290case X86II::MRM1r:1291case X86II::MRM2r:1292case X86II::MRM3r:1293case X86II::MRM4r:1294case X86II::MRM5r:1295case X86II::MRM6r:1296case X86II::MRM7r: {1297// MRM0r-MRM7r instructions forms:1298// dst(VEX_4V), src(ModR/M), imm81299if (HasVEX_4V)1300Prefix.set4VV2(MI, CurOp++);13011302if (HasEVEX_K)1303Prefix.setAAA(MI, CurOp++);13041305Prefix.setBB2(MI, CurOp);1306Prefix.setX(MI, CurOp, 4);1307++CurOp;1308if (HasTwoConditionalOps) {1309Prefix.set4V(MI, ++CurOp, /*IsImm=*/true);1310Prefix.setSC(MI, ++CurOp);1311}1312break;1313}1314}1315if (EncodeRC) {1316Prefix.setL(EVEX_rc & 0x1);1317Prefix.setL2(EVEX_rc & 0x2);1318}1319PrefixKind Kind = Prefix.determineOptimalKind();1320Prefix.emit(CB);1321return Kind;1322}13231324/// Emit REX prefix which specifies1325/// 1) 64-bit instructions,1326/// 2) non-default operand size, and1327/// 3) use of X86-64 extended registers.1328///1329/// \returns the used prefix (REX or None).1330PrefixKind X86MCCodeEmitter::emitREXPrefix(int MemOperand, const MCInst &MI,1331const MCSubtargetInfo &STI,1332SmallVectorImpl<char> &CB) const {1333if (!STI.hasFeature(X86::Is64Bit))1334return None;1335X86OpcodePrefixHelper Prefix(*Ctx.getRegisterInfo());1336const MCInstrDesc &Desc = MCII.get(MI.getOpcode());1337uint64_t TSFlags = Desc.TSFlags;1338Prefix.setW(TSFlags & X86II::REX_W);1339unsigned NumOps = MI.getNumOperands();1340bool UsesHighByteReg = false;1341#ifndef NDEBUG1342bool HasRegOp = false;1343#endif1344unsigned CurOp = NumOps ? X86II::getOperandBias(Desc) : 0;1345for (unsigned i = CurOp; i != NumOps; ++i) {1346const MCOperand &MO = MI.getOperand(i);1347if (MO.isReg()) {1348#ifndef NDEBUG1349HasRegOp = true;1350#endif1351unsigned Reg = MO.getReg();1352if (Reg == X86::AH || Reg == X86::BH || Reg == X86::CH || Reg == X86::DH)1353UsesHighByteReg = true;1354// If it accesses SPL, BPL, SIL, or DIL, then it requires a REX prefix.1355if (X86II::isX86_64NonExtLowByteReg(Reg))1356Prefix.setLowerBound(REX);1357} else if (MO.isExpr() && STI.getTargetTriple().isX32()) {1358// GOTTPOFF and TLSDESC relocations require a REX prefix to allow1359// linker optimizations: even if the instructions we see may not require1360// any prefix, they may be replaced by instructions that do. This is1361// handled as a special case here so that it also works for hand-written1362// assembly without the user needing to write REX, as with GNU as.1363const auto *Ref = dyn_cast<MCSymbolRefExpr>(MO.getExpr());1364if (Ref && (Ref->getKind() == MCSymbolRefExpr::VK_GOTTPOFF ||1365Ref->getKind() == MCSymbolRefExpr::VK_TLSDESC)) {1366Prefix.setLowerBound(REX);1367}1368}1369}1370if (MI.getFlags() & X86::IP_USE_REX)1371Prefix.setLowerBound(REX);1372if ((TSFlags & X86II::ExplicitOpPrefixMask) == X86II::ExplicitREX2Prefix ||1373MI.getFlags() & X86::IP_USE_REX2)1374Prefix.setLowerBound(REX2);1375switch (TSFlags & X86II::FormMask) {1376default:1377assert(!HasRegOp && "Unexpected form in emitREXPrefix!");1378break;1379case X86II::RawFrm:1380case X86II::RawFrmMemOffs:1381case X86II::RawFrmSrc:1382case X86II::RawFrmDst:1383case X86II::RawFrmDstSrc:1384break;1385case X86II::AddRegFrm:1386Prefix.setBB2(MI, CurOp++);1387break;1388case X86II::MRMSrcReg:1389case X86II::MRMSrcRegCC:1390Prefix.setRR2(MI, CurOp++);1391Prefix.setBB2(MI, CurOp++);1392break;1393case X86II::MRMSrcMem:1394case X86II::MRMSrcMemCC:1395Prefix.setRR2(MI, CurOp++);1396Prefix.setBB2(MI, MemOperand + X86::AddrBaseReg);1397Prefix.setXX2(MI, MemOperand + X86::AddrIndexReg);1398CurOp += X86::AddrNumOperands;1399break;1400case X86II::MRMDestReg:1401Prefix.setBB2(MI, CurOp++);1402Prefix.setRR2(MI, CurOp++);1403break;1404case X86II::MRMDestMem:1405Prefix.setBB2(MI, MemOperand + X86::AddrBaseReg);1406Prefix.setXX2(MI, MemOperand + X86::AddrIndexReg);1407CurOp += X86::AddrNumOperands;1408Prefix.setRR2(MI, CurOp++);1409break;1410case X86II::MRMXmCC:1411case X86II::MRMXm:1412case X86II::MRM0m:1413case X86II::MRM1m:1414case X86II::MRM2m:1415case X86II::MRM3m:1416case X86II::MRM4m:1417case X86II::MRM5m:1418case X86II::MRM6m:1419case X86II::MRM7m:1420Prefix.setBB2(MI, MemOperand + X86::AddrBaseReg);1421Prefix.setXX2(MI, MemOperand + X86::AddrIndexReg);1422break;1423case X86II::MRMXrCC:1424case X86II::MRMXr:1425case X86II::MRM0r:1426case X86II::MRM1r:1427case X86II::MRM2r:1428case X86II::MRM3r:1429case X86II::MRM4r:1430case X86II::MRM5r:1431case X86II::MRM6r:1432case X86II::MRM7r:1433Prefix.setBB2(MI, CurOp++);1434break;1435}1436Prefix.setM((TSFlags & X86II::OpMapMask) == X86II::TB);1437PrefixKind Kind = Prefix.determineOptimalKind();1438if (Kind && UsesHighByteReg)1439report_fatal_error(1440"Cannot encode high byte register in REX-prefixed instruction");1441Prefix.emit(CB);1442return Kind;1443}14441445/// Emit segment override opcode prefix as needed.1446void X86MCCodeEmitter::emitSegmentOverridePrefix(1447unsigned SegOperand, const MCInst &MI, SmallVectorImpl<char> &CB) const {1448// Check for explicit segment override on memory operand.1449if (unsigned Reg = MI.getOperand(SegOperand).getReg())1450emitByte(X86::getSegmentOverridePrefixForReg(Reg), CB);1451}14521453/// Emit all instruction prefixes prior to the opcode.1454///1455/// \param MemOperand the operand # of the start of a memory operand if present.1456/// If not present, it is -1.1457///1458/// \returns the used prefix (REX or None).1459PrefixKind X86MCCodeEmitter::emitOpcodePrefix(int MemOperand, const MCInst &MI,1460const MCSubtargetInfo &STI,1461SmallVectorImpl<char> &CB) const {1462const MCInstrDesc &Desc = MCII.get(MI.getOpcode());1463uint64_t TSFlags = Desc.TSFlags;14641465// Emit the operand size opcode prefix as needed.1466if ((TSFlags & X86II::OpSizeMask) ==1467(STI.hasFeature(X86::Is16Bit) ? X86II::OpSize32 : X86II::OpSize16))1468emitByte(0x66, CB);14691470// Emit the LOCK opcode prefix.1471if (TSFlags & X86II::LOCK || MI.getFlags() & X86::IP_HAS_LOCK)1472emitByte(0xF0, CB);14731474// Emit the NOTRACK opcode prefix.1475if (TSFlags & X86II::NOTRACK || MI.getFlags() & X86::IP_HAS_NOTRACK)1476emitByte(0x3E, CB);14771478switch (TSFlags & X86II::OpPrefixMask) {1479case X86II::PD: // 661480emitByte(0x66, CB);1481break;1482case X86II::XS: // F31483emitByte(0xF3, CB);1484break;1485case X86II::XD: // F21486emitByte(0xF2, CB);1487break;1488}14891490// Handle REX prefix.1491assert((STI.hasFeature(X86::Is64Bit) || !(TSFlags & X86II::REX_W)) &&1492"REX.W requires 64bit mode.");1493PrefixKind Kind = emitREXPrefix(MemOperand, MI, STI, CB);14941495// 0x0F escape code must be emitted just before the opcode.1496switch (TSFlags & X86II::OpMapMask) {1497case X86II::TB: // Two-byte opcode map1498// Encoded by M bit in REX21499if (Kind == REX2)1500break;1501[[fallthrough]];1502case X86II::T8: // 0F 381503case X86II::TA: // 0F 3A1504case X86II::ThreeDNow: // 0F 0F, second 0F emitted by caller.1505emitByte(0x0F, CB);1506break;1507}15081509switch (TSFlags & X86II::OpMapMask) {1510case X86II::T8: // 0F 381511emitByte(0x38, CB);1512break;1513case X86II::TA: // 0F 3A1514emitByte(0x3A, CB);1515break;1516}15171518return Kind;1519}15201521void X86MCCodeEmitter::emitPrefix(const MCInst &MI, SmallVectorImpl<char> &CB,1522const MCSubtargetInfo &STI) const {1523unsigned Opcode = MI.getOpcode();1524const MCInstrDesc &Desc = MCII.get(Opcode);1525uint64_t TSFlags = Desc.TSFlags;15261527// Pseudo instructions don't get encoded.1528if (X86II::isPseudo(TSFlags))1529return;15301531unsigned CurOp = X86II::getOperandBias(Desc);15321533emitPrefixImpl(CurOp, MI, STI, CB);1534}15351536void X86_MC::emitPrefix(MCCodeEmitter &MCE, const MCInst &MI,1537SmallVectorImpl<char> &CB, const MCSubtargetInfo &STI) {1538static_cast<X86MCCodeEmitter &>(MCE).emitPrefix(MI, CB, STI);1539}15401541void X86MCCodeEmitter::encodeInstruction(const MCInst &MI,1542SmallVectorImpl<char> &CB,1543SmallVectorImpl<MCFixup> &Fixups,1544const MCSubtargetInfo &STI) const {1545unsigned Opcode = MI.getOpcode();1546const MCInstrDesc &Desc = MCII.get(Opcode);1547uint64_t TSFlags = Desc.TSFlags;15481549// Pseudo instructions don't get encoded.1550if (X86II::isPseudo(TSFlags))1551return;15521553unsigned NumOps = Desc.getNumOperands();1554unsigned CurOp = X86II::getOperandBias(Desc);15551556uint64_t StartByte = CB.size();15571558PrefixKind Kind = emitPrefixImpl(CurOp, MI, STI, CB);15591560// It uses the VEX.VVVV field?1561bool HasVEX_4V = TSFlags & X86II::VEX_4V;1562bool HasVEX_I8Reg = (TSFlags & X86II::ImmMask) == X86II::Imm8Reg;15631564// It uses the EVEX.aaa field?1565bool HasEVEX_K = TSFlags & X86II::EVEX_K;1566bool HasEVEX_RC = TSFlags & X86II::EVEX_RC;15671568// Used if a register is encoded in 7:4 of immediate.1569unsigned I8RegNum = 0;15701571uint8_t BaseOpcode = X86II::getBaseOpcodeFor(TSFlags);15721573if ((TSFlags & X86II::OpMapMask) == X86II::ThreeDNow)1574BaseOpcode = 0x0F; // Weird 3DNow! encoding.15751576unsigned OpcodeOffset = 0;15771578bool IsND = X86II::hasNewDataDest(TSFlags);1579bool HasTwoConditionalOps = TSFlags & X86II::TwoConditionalOps;15801581uint64_t Form = TSFlags & X86II::FormMask;1582switch (Form) {1583default:1584errs() << "FORM: " << Form << "\n";1585llvm_unreachable("Unknown FormMask value in X86MCCodeEmitter!");1586case X86II::Pseudo:1587llvm_unreachable("Pseudo instruction shouldn't be emitted");1588case X86II::RawFrmDstSrc:1589case X86II::RawFrmSrc:1590case X86II::RawFrmDst:1591case X86II::PrefixByte:1592emitByte(BaseOpcode, CB);1593break;1594case X86II::AddCCFrm: {1595// This will be added to the opcode in the fallthrough.1596OpcodeOffset = MI.getOperand(NumOps - 1).getImm();1597assert(OpcodeOffset < 16 && "Unexpected opcode offset!");1598--NumOps; // Drop the operand from the end.1599[[fallthrough]];1600case X86II::RawFrm:1601emitByte(BaseOpcode + OpcodeOffset, CB);16021603if (!STI.hasFeature(X86::Is64Bit) || !isPCRel32Branch(MI, MCII))1604break;16051606const MCOperand &Op = MI.getOperand(CurOp++);1607emitImmediate(Op, MI.getLoc(), X86II::getSizeOfImm(TSFlags),1608MCFixupKind(X86::reloc_branch_4byte_pcrel), StartByte, CB,1609Fixups);1610break;1611}1612case X86II::RawFrmMemOffs:1613emitByte(BaseOpcode, CB);1614emitImmediate(MI.getOperand(CurOp++), MI.getLoc(),1615X86II::getSizeOfImm(TSFlags), getImmFixupKind(TSFlags),1616StartByte, CB, Fixups);1617++CurOp; // skip segment operand1618break;1619case X86II::RawFrmImm8:1620emitByte(BaseOpcode, CB);1621emitImmediate(MI.getOperand(CurOp++), MI.getLoc(),1622X86II::getSizeOfImm(TSFlags), getImmFixupKind(TSFlags),1623StartByte, CB, Fixups);1624emitImmediate(MI.getOperand(CurOp++), MI.getLoc(), 1, FK_Data_1, StartByte,1625CB, Fixups);1626break;1627case X86II::RawFrmImm16:1628emitByte(BaseOpcode, CB);1629emitImmediate(MI.getOperand(CurOp++), MI.getLoc(),1630X86II::getSizeOfImm(TSFlags), getImmFixupKind(TSFlags),1631StartByte, CB, Fixups);1632emitImmediate(MI.getOperand(CurOp++), MI.getLoc(), 2, FK_Data_2, StartByte,1633CB, Fixups);1634break;16351636case X86II::AddRegFrm:1637emitByte(BaseOpcode + getX86RegNum(MI.getOperand(CurOp++)), CB);1638break;16391640case X86II::MRMDestReg: {1641emitByte(BaseOpcode, CB);1642unsigned SrcRegNum = CurOp + 1;16431644if (HasEVEX_K) // Skip writemask1645++SrcRegNum;16461647if (HasVEX_4V) // Skip 1st src (which is encoded in VEX_VVVV)1648++SrcRegNum;1649if (IsND) // Skip the NDD operand encoded in EVEX_VVVV1650++CurOp;16511652emitRegModRMByte(MI.getOperand(CurOp),1653getX86RegNum(MI.getOperand(SrcRegNum)), CB);1654CurOp = SrcRegNum + 1;1655break;1656}1657case X86II::MRMDestRegCC: {1658unsigned FirstOp = CurOp++;1659unsigned SecondOp = CurOp++;1660unsigned CC = MI.getOperand(CurOp++).getImm();1661emitByte(BaseOpcode + CC, CB);1662emitRegModRMByte(MI.getOperand(FirstOp),1663getX86RegNum(MI.getOperand(SecondOp)), CB);1664break;1665}1666case X86II::MRMDestMem4VOp3CC: {1667unsigned CC = MI.getOperand(8).getImm();1668emitByte(BaseOpcode + CC, CB);1669unsigned SrcRegNum = CurOp + X86::AddrNumOperands;1670emitMemModRMByte(MI, CurOp + 1, getX86RegNum(MI.getOperand(0)), TSFlags,1671Kind, StartByte, CB, Fixups, STI, false);1672CurOp = SrcRegNum + 3; // skip reg, VEX_V4 and CC1673break;1674}1675case X86II::MRMDestMemFSIB:1676case X86II::MRMDestMem: {1677emitByte(BaseOpcode, CB);1678unsigned SrcRegNum = CurOp + X86::AddrNumOperands;16791680if (HasEVEX_K) // Skip writemask1681++SrcRegNum;16821683if (HasVEX_4V) // Skip 1st src (which is encoded in VEX_VVVV)1684++SrcRegNum;16851686if (IsND) // Skip new data destination1687++CurOp;16881689bool ForceSIB = (Form == X86II::MRMDestMemFSIB);1690emitMemModRMByte(MI, CurOp, getX86RegNum(MI.getOperand(SrcRegNum)), TSFlags,1691Kind, StartByte, CB, Fixups, STI, ForceSIB);1692CurOp = SrcRegNum + 1;1693break;1694}1695case X86II::MRMDestMemCC: {1696unsigned MemOp = CurOp;1697CurOp = MemOp + X86::AddrNumOperands;1698unsigned RegOp = CurOp++;1699unsigned CC = MI.getOperand(CurOp++).getImm();1700emitByte(BaseOpcode + CC, CB);1701emitMemModRMByte(MI, MemOp, getX86RegNum(MI.getOperand(RegOp)), TSFlags,1702Kind, StartByte, CB, Fixups, STI);1703break;1704}1705case X86II::MRMSrcReg: {1706emitByte(BaseOpcode, CB);1707unsigned SrcRegNum = CurOp + 1;17081709if (HasEVEX_K) // Skip writemask1710++SrcRegNum;17111712if (HasVEX_4V) // Skip 1st src (which is encoded in VEX_VVVV)1713++SrcRegNum;17141715if (IsND) // Skip new data destination1716++CurOp;17171718emitRegModRMByte(MI.getOperand(SrcRegNum),1719getX86RegNum(MI.getOperand(CurOp)), CB);1720CurOp = SrcRegNum + 1;1721if (HasVEX_I8Reg)1722I8RegNum = getX86RegEncoding(MI, CurOp++);1723// do not count the rounding control operand1724if (HasEVEX_RC)1725--NumOps;1726break;1727}1728case X86II::MRMSrcReg4VOp3: {1729emitByte(BaseOpcode, CB);1730unsigned SrcRegNum = CurOp + 1;17311732emitRegModRMByte(MI.getOperand(SrcRegNum),1733getX86RegNum(MI.getOperand(CurOp)), CB);1734CurOp = SrcRegNum + 1;1735++CurOp; // Encoded in VEX.VVVV1736break;1737}1738case X86II::MRMSrcRegOp4: {1739emitByte(BaseOpcode, CB);1740unsigned SrcRegNum = CurOp + 1;17411742// Skip 1st src (which is encoded in VEX_VVVV)1743++SrcRegNum;17441745// Capture 2nd src (which is encoded in Imm[7:4])1746assert(HasVEX_I8Reg && "MRMSrcRegOp4 should imply VEX_I8Reg");1747I8RegNum = getX86RegEncoding(MI, SrcRegNum++);17481749emitRegModRMByte(MI.getOperand(SrcRegNum),1750getX86RegNum(MI.getOperand(CurOp)), CB);1751CurOp = SrcRegNum + 1;1752break;1753}1754case X86II::MRMSrcRegCC: {1755if (IsND) // Skip new data destination1756++CurOp;1757unsigned FirstOp = CurOp++;1758unsigned SecondOp = CurOp++;17591760unsigned CC = MI.getOperand(CurOp++).getImm();1761emitByte(BaseOpcode + CC, CB);17621763emitRegModRMByte(MI.getOperand(SecondOp),1764getX86RegNum(MI.getOperand(FirstOp)), CB);1765break;1766}1767case X86II::MRMSrcMemFSIB:1768case X86II::MRMSrcMem: {1769unsigned FirstMemOp = CurOp + 1;17701771if (IsND) // Skip new data destination1772CurOp++;17731774if (HasEVEX_K) // Skip writemask1775++FirstMemOp;17761777if (HasVEX_4V)1778++FirstMemOp; // Skip the register source (which is encoded in VEX_VVVV).17791780emitByte(BaseOpcode, CB);17811782bool ForceSIB = (Form == X86II::MRMSrcMemFSIB);1783emitMemModRMByte(MI, FirstMemOp, getX86RegNum(MI.getOperand(CurOp)),1784TSFlags, Kind, StartByte, CB, Fixups, STI, ForceSIB);1785CurOp = FirstMemOp + X86::AddrNumOperands;1786if (HasVEX_I8Reg)1787I8RegNum = getX86RegEncoding(MI, CurOp++);1788break;1789}1790case X86II::MRMSrcMem4VOp3: {1791unsigned FirstMemOp = CurOp + 1;17921793emitByte(BaseOpcode, CB);17941795emitMemModRMByte(MI, FirstMemOp, getX86RegNum(MI.getOperand(CurOp)),1796TSFlags, Kind, StartByte, CB, Fixups, STI);1797CurOp = FirstMemOp + X86::AddrNumOperands;1798++CurOp; // Encoded in VEX.VVVV.1799break;1800}1801case X86II::MRMSrcMemOp4: {1802unsigned FirstMemOp = CurOp + 1;18031804++FirstMemOp; // Skip the register source (which is encoded in VEX_VVVV).18051806// Capture second register source (encoded in Imm[7:4])1807assert(HasVEX_I8Reg && "MRMSrcRegOp4 should imply VEX_I8Reg");1808I8RegNum = getX86RegEncoding(MI, FirstMemOp++);18091810emitByte(BaseOpcode, CB);18111812emitMemModRMByte(MI, FirstMemOp, getX86RegNum(MI.getOperand(CurOp)),1813TSFlags, Kind, StartByte, CB, Fixups, STI);1814CurOp = FirstMemOp + X86::AddrNumOperands;1815break;1816}1817case X86II::MRMSrcMemCC: {1818if (IsND) // Skip new data destination1819++CurOp;1820unsigned RegOp = CurOp++;1821unsigned FirstMemOp = CurOp;1822CurOp = FirstMemOp + X86::AddrNumOperands;18231824unsigned CC = MI.getOperand(CurOp++).getImm();1825emitByte(BaseOpcode + CC, CB);18261827emitMemModRMByte(MI, FirstMemOp, getX86RegNum(MI.getOperand(RegOp)),1828TSFlags, Kind, StartByte, CB, Fixups, STI);1829break;1830}18311832case X86II::MRMXrCC: {1833unsigned RegOp = CurOp++;18341835unsigned CC = MI.getOperand(CurOp++).getImm();1836emitByte(BaseOpcode + CC, CB);1837emitRegModRMByte(MI.getOperand(RegOp), 0, CB);1838break;1839}18401841case X86II::MRMXr:1842case X86II::MRM0r:1843case X86II::MRM1r:1844case X86II::MRM2r:1845case X86II::MRM3r:1846case X86II::MRM4r:1847case X86II::MRM5r:1848case X86II::MRM6r:1849case X86II::MRM7r:1850if (HasVEX_4V) // Skip the register dst (which is encoded in VEX_VVVV).1851++CurOp;1852if (HasEVEX_K) // Skip writemask1853++CurOp;1854emitByte(BaseOpcode, CB);1855emitRegModRMByte(MI.getOperand(CurOp++),1856(Form == X86II::MRMXr) ? 0 : Form - X86II::MRM0r, CB);1857break;1858case X86II::MRMr0:1859emitByte(BaseOpcode, CB);1860emitByte(modRMByte(3, getX86RegNum(MI.getOperand(CurOp++)), 0), CB);1861break;18621863case X86II::MRMXmCC: {1864unsigned FirstMemOp = CurOp;1865CurOp = FirstMemOp + X86::AddrNumOperands;18661867unsigned CC = MI.getOperand(CurOp++).getImm();1868emitByte(BaseOpcode + CC, CB);18691870emitMemModRMByte(MI, FirstMemOp, 0, TSFlags, Kind, StartByte, CB, Fixups,1871STI);1872break;1873}18741875case X86II::MRMXm:1876case X86II::MRM0m:1877case X86II::MRM1m:1878case X86II::MRM2m:1879case X86II::MRM3m:1880case X86II::MRM4m:1881case X86II::MRM5m:1882case X86II::MRM6m:1883case X86II::MRM7m:1884if (HasVEX_4V) // Skip the register dst (which is encoded in VEX_VVVV).1885++CurOp;1886if (HasEVEX_K) // Skip writemask1887++CurOp;1888emitByte(BaseOpcode, CB);1889emitMemModRMByte(MI, CurOp,1890(Form == X86II::MRMXm) ? 0 : Form - X86II::MRM0m, TSFlags,1891Kind, StartByte, CB, Fixups, STI);1892CurOp += X86::AddrNumOperands;1893break;18941895case X86II::MRM0X:1896case X86II::MRM1X:1897case X86II::MRM2X:1898case X86II::MRM3X:1899case X86II::MRM4X:1900case X86II::MRM5X:1901case X86II::MRM6X:1902case X86II::MRM7X:1903emitByte(BaseOpcode, CB);1904emitByte(0xC0 + ((Form - X86II::MRM0X) << 3), CB);1905break;19061907case X86II::MRM_C0:1908case X86II::MRM_C1:1909case X86II::MRM_C2:1910case X86II::MRM_C3:1911case X86II::MRM_C4:1912case X86II::MRM_C5:1913case X86II::MRM_C6:1914case X86II::MRM_C7:1915case X86II::MRM_C8:1916case X86II::MRM_C9:1917case X86II::MRM_CA:1918case X86II::MRM_CB:1919case X86II::MRM_CC:1920case X86II::MRM_CD:1921case X86II::MRM_CE:1922case X86II::MRM_CF:1923case X86II::MRM_D0:1924case X86II::MRM_D1:1925case X86II::MRM_D2:1926case X86II::MRM_D3:1927case X86II::MRM_D4:1928case X86II::MRM_D5:1929case X86II::MRM_D6:1930case X86II::MRM_D7:1931case X86II::MRM_D8:1932case X86II::MRM_D9:1933case X86II::MRM_DA:1934case X86II::MRM_DB:1935case X86II::MRM_DC:1936case X86II::MRM_DD:1937case X86II::MRM_DE:1938case X86II::MRM_DF:1939case X86II::MRM_E0:1940case X86II::MRM_E1:1941case X86II::MRM_E2:1942case X86II::MRM_E3:1943case X86II::MRM_E4:1944case X86II::MRM_E5:1945case X86II::MRM_E6:1946case X86II::MRM_E7:1947case X86II::MRM_E8:1948case X86II::MRM_E9:1949case X86II::MRM_EA:1950case X86II::MRM_EB:1951case X86II::MRM_EC:1952case X86II::MRM_ED:1953case X86II::MRM_EE:1954case X86II::MRM_EF:1955case X86II::MRM_F0:1956case X86II::MRM_F1:1957case X86II::MRM_F2:1958case X86II::MRM_F3:1959case X86II::MRM_F4:1960case X86II::MRM_F5:1961case X86II::MRM_F6:1962case X86II::MRM_F7:1963case X86II::MRM_F8:1964case X86II::MRM_F9:1965case X86II::MRM_FA:1966case X86II::MRM_FB:1967case X86II::MRM_FC:1968case X86II::MRM_FD:1969case X86II::MRM_FE:1970case X86II::MRM_FF:1971emitByte(BaseOpcode, CB);1972emitByte(0xC0 + Form - X86II::MRM_C0, CB);1973break;1974}19751976if (HasVEX_I8Reg) {1977// The last source register of a 4 operand instruction in AVX is encoded1978// in bits[7:4] of a immediate byte.1979assert(I8RegNum < 16 && "Register encoding out of range");1980I8RegNum <<= 4;1981if (CurOp != NumOps) {1982unsigned Val = MI.getOperand(CurOp++).getImm();1983assert(Val < 16 && "Immediate operand value out of range");1984I8RegNum |= Val;1985}1986emitImmediate(MCOperand::createImm(I8RegNum), MI.getLoc(), 1, FK_Data_1,1987StartByte, CB, Fixups);1988} else {1989// If there is a remaining operand, it must be a trailing immediate. Emit it1990// according to the right size for the instruction. Some instructions1991// (SSE4a extrq and insertq) have two trailing immediates.19921993// Skip two trainling conditional operands encoded in EVEX prefix1994unsigned RemaningOps = NumOps - CurOp - 2 * HasTwoConditionalOps;1995while (RemaningOps) {1996emitImmediate(MI.getOperand(CurOp++), MI.getLoc(),1997X86II::getSizeOfImm(TSFlags), getImmFixupKind(TSFlags),1998StartByte, CB, Fixups);1999--RemaningOps;2000}2001CurOp += 2 * HasTwoConditionalOps;2002}20032004if ((TSFlags & X86II::OpMapMask) == X86II::ThreeDNow)2005emitByte(X86II::getBaseOpcodeFor(TSFlags), CB);20062007if (CB.size() - StartByte > 15)2008Ctx.reportError(MI.getLoc(), "instruction length exceeds the limit of 15");2009#ifndef NDEBUG2010// FIXME: Verify.2011if (/*!Desc.isVariadic() &&*/ CurOp != NumOps) {2012errs() << "Cannot encode all operands of: ";2013MI.dump();2014errs() << '\n';2015abort();2016}2017#endif2018}20192020MCCodeEmitter *llvm::createX86MCCodeEmitter(const MCInstrInfo &MCII,2021MCContext &Ctx) {2022return new X86MCCodeEmitter(MCII, Ctx);2023}202420252026