LLVM API Documentation

X86MCCodeEmitter.cpp
Go to the documentation of this file.
00001 //===-- X86MCCodeEmitter.cpp - Convert X86 code to machine code -----------===//
00002 //
00003 //                     The LLVM Compiler Infrastructure
00004 //
00005 // This file is distributed under the University of Illinois Open Source
00006 // License. See LICENSE.TXT for details.
00007 //
00008 //===----------------------------------------------------------------------===//
00009 //
00010 // This file implements the X86MCCodeEmitter class.
00011 //
00012 //===----------------------------------------------------------------------===//
00013 
00014 #define DEBUG_TYPE "mccodeemitter"
00015 #include "MCTargetDesc/X86MCTargetDesc.h"
00016 #include "MCTargetDesc/X86BaseInfo.h"
00017 #include "MCTargetDesc/X86FixupKinds.h"
00018 #include "llvm/MC/MCCodeEmitter.h"
00019 #include "llvm/MC/MCContext.h"
00020 #include "llvm/MC/MCExpr.h"
00021 #include "llvm/MC/MCInst.h"
00022 #include "llvm/MC/MCInstrInfo.h"
00023 #include "llvm/MC/MCRegisterInfo.h"
00024 #include "llvm/MC/MCSubtargetInfo.h"
00025 #include "llvm/MC/MCSymbol.h"
00026 #include "llvm/Support/raw_ostream.h"
00027 
00028 using namespace llvm;
00029 
00030 namespace {
00031 class X86MCCodeEmitter : public MCCodeEmitter {
00032   X86MCCodeEmitter(const X86MCCodeEmitter &) LLVM_DELETED_FUNCTION;
00033   void operator=(const X86MCCodeEmitter &) LLVM_DELETED_FUNCTION;
00034   const MCInstrInfo &MCII;
00035   const MCSubtargetInfo &STI;
00036   MCContext &Ctx;
00037 public:
00038   X86MCCodeEmitter(const MCInstrInfo &mcii, const MCSubtargetInfo &sti,
00039                    MCContext &ctx)
00040     : MCII(mcii), STI(sti), Ctx(ctx) {
00041   }
00042 
00043   ~X86MCCodeEmitter() {}
00044 
00045   bool is64BitMode() const {
00046     // FIXME: Can tablegen auto-generate this?
00047     return (STI.getFeatureBits() & X86::Mode64Bit) != 0;
00048   }
00049 
00050   bool is32BitMode() const {
00051     // FIXME: Can tablegen auto-generate this?
00052     return (STI.getFeatureBits() & X86::Mode64Bit) == 0;
00053   }
00054 
00055   unsigned GetX86RegNum(const MCOperand &MO) const {
00056     return Ctx.getRegisterInfo()->getEncodingValue(MO.getReg()) & 0x7;
00057   }
00058 
00059   // On regular x86, both XMM0-XMM7 and XMM8-XMM15 are encoded in the range
00060   // 0-7 and the difference between the 2 groups is given by the REX prefix.
00061   // In the VEX prefix, registers are seen sequencially from 0-15 and encoded
00062   // in 1's complement form, example:
00063   //
00064   //  ModRM field => XMM9 => 1
00065   //  VEX.VVVV    => XMM9 => ~9
00066   //
00067   // See table 4-35 of Intel AVX Programming Reference for details.
00068   unsigned char getVEXRegisterEncoding(const MCInst &MI,
00069                                        unsigned OpNum) const {
00070     unsigned SrcReg = MI.getOperand(OpNum).getReg();
00071     unsigned SrcRegNum = GetX86RegNum(MI.getOperand(OpNum));
00072     if (X86II::isX86_64ExtendedReg(SrcReg))
00073       SrcRegNum |= 8;
00074 
00075     // The registers represented through VEX_VVVV should
00076     // be encoded in 1's complement form.
00077     return (~SrcRegNum) & 0xf;
00078   }
00079 
00080   void EmitByte(unsigned char C, unsigned &CurByte, raw_ostream &OS) const {
00081     OS << (char)C;
00082     ++CurByte;
00083   }
00084 
00085   void EmitConstant(uint64_t Val, unsigned Size, unsigned &CurByte,
00086                     raw_ostream &OS) const {
00087     // Output the constant in little endian byte order.
00088     for (unsigned i = 0; i != Size; ++i) {
00089       EmitByte(Val & 255, CurByte, OS);
00090       Val >>= 8;
00091     }
00092   }
00093 
00094   void EmitImmediate(const MCOperand &Disp, SMLoc Loc,
00095                      unsigned ImmSize, MCFixupKind FixupKind,
00096                      unsigned &CurByte, raw_ostream &OS,
00097                      SmallVectorImpl<MCFixup> &Fixups,
00098                      int ImmOffset = 0) const;
00099 
00100   inline static unsigned char ModRMByte(unsigned Mod, unsigned RegOpcode,
00101                                         unsigned RM) {
00102     assert(Mod < 4 && RegOpcode < 8 && RM < 8 && "ModRM Fields out of range!");
00103     return RM | (RegOpcode << 3) | (Mod << 6);
00104   }
00105 
00106   void EmitRegModRMByte(const MCOperand &ModRMReg, unsigned RegOpcodeFld,
00107                         unsigned &CurByte, raw_ostream &OS) const {
00108     EmitByte(ModRMByte(3, RegOpcodeFld, GetX86RegNum(ModRMReg)), CurByte, OS);
00109   }
00110 
00111   void EmitSIBByte(unsigned SS, unsigned Index, unsigned Base,
00112                    unsigned &CurByte, raw_ostream &OS) const {
00113     // SIB byte is in the same format as the ModRMByte.
00114     EmitByte(ModRMByte(SS, Index, Base), CurByte, OS);
00115   }
00116 
00117 
00118   void EmitMemModRMByte(const MCInst &MI, unsigned Op,
00119                         unsigned RegOpcodeField,
00120                         uint64_t TSFlags, unsigned &CurByte, raw_ostream &OS,
00121                         SmallVectorImpl<MCFixup> &Fixups) const;
00122 
00123   void EncodeInstruction(const MCInst &MI, raw_ostream &OS,
00124                          SmallVectorImpl<MCFixup> &Fixups) const;
00125 
00126   void EmitVEXOpcodePrefix(uint64_t TSFlags, unsigned &CurByte, int MemOperand,
00127                            const MCInst &MI, const MCInstrDesc &Desc,
00128                            raw_ostream &OS) const;
00129 
00130   void EmitSegmentOverridePrefix(uint64_t TSFlags, unsigned &CurByte,
00131                                  int MemOperand, const MCInst &MI,
00132                                  raw_ostream &OS) const;
00133 
00134   void EmitOpcodePrefix(uint64_t TSFlags, unsigned &CurByte, int MemOperand,
00135                         const MCInst &MI, const MCInstrDesc &Desc,
00136                         raw_ostream &OS) const;
00137 };
00138 
00139 } // end anonymous namespace
00140 
00141 
00142 MCCodeEmitter *llvm::createX86MCCodeEmitter(const MCInstrInfo &MCII,
00143                                             const MCRegisterInfo &MRI,
00144                                             const MCSubtargetInfo &STI,
00145                                             MCContext &Ctx) {
00146   return new X86MCCodeEmitter(MCII, STI, Ctx);
00147 }
00148 
00149 /// isDisp8 - Return true if this signed displacement fits in a 8-bit
00150 /// sign-extended field.
00151 static bool isDisp8(int Value) {
00152   return Value == (signed char)Value;
00153 }
00154 
00155 /// getImmFixupKind - Return the appropriate fixup kind to use for an immediate
00156 /// in an instruction with the specified TSFlags.
00157 static MCFixupKind getImmFixupKind(uint64_t TSFlags) {
00158   unsigned Size = X86II::getSizeOfImm(TSFlags);
00159   bool isPCRel = X86II::isImmPCRel(TSFlags);
00160 
00161   return MCFixup::getKindForSize(Size, isPCRel);
00162 }
00163 
00164 /// Is32BitMemOperand - Return true if the specified instruction has
00165 /// a 32-bit memory operand. Op specifies the operand # of the memoperand.
00166 static bool Is32BitMemOperand(const MCInst &MI, unsigned Op) {
00167   const MCOperand &BaseReg  = MI.getOperand(Op+X86::AddrBaseReg);
00168   const MCOperand &IndexReg = MI.getOperand(Op+X86::AddrIndexReg);
00169 
00170   if ((BaseReg.getReg() != 0 &&
00171        X86MCRegisterClasses[X86::GR32RegClassID].contains(BaseReg.getReg())) ||
00172       (IndexReg.getReg() != 0 &&
00173        X86MCRegisterClasses[X86::GR32RegClassID].contains(IndexReg.getReg())))
00174     return true;
00175   return false;
00176 }
00177 
00178 /// Is64BitMemOperand - Return true if the specified instruction has
00179 /// a 64-bit memory operand. Op specifies the operand # of the memoperand.
00180 #ifndef NDEBUG
00181 static bool Is64BitMemOperand(const MCInst &MI, unsigned Op) {
00182   const MCOperand &BaseReg  = MI.getOperand(Op+X86::AddrBaseReg);
00183   const MCOperand &IndexReg = MI.getOperand(Op+X86::AddrIndexReg);
00184 
00185   if ((BaseReg.getReg() != 0 &&
00186        X86MCRegisterClasses[X86::GR64RegClassID].contains(BaseReg.getReg())) ||
00187       (IndexReg.getReg() != 0 &&
00188        X86MCRegisterClasses[X86::GR64RegClassID].contains(IndexReg.getReg())))
00189     return true;
00190   return false;
00191 }
00192 #endif
00193 
00194 /// Is16BitMemOperand - Return true if the specified instruction has
00195 /// a 16-bit memory operand. Op specifies the operand # of the memoperand.
00196 static bool Is16BitMemOperand(const MCInst &MI, unsigned Op) {
00197   const MCOperand &BaseReg  = MI.getOperand(Op+X86::AddrBaseReg);
00198   const MCOperand &IndexReg = MI.getOperand(Op+X86::AddrIndexReg);
00199 
00200   if ((BaseReg.getReg() != 0 &&
00201        X86MCRegisterClasses[X86::GR16RegClassID].contains(BaseReg.getReg())) ||
00202       (IndexReg.getReg() != 0 &&
00203        X86MCRegisterClasses[X86::GR16RegClassID].contains(IndexReg.getReg())))
00204     return true;
00205   return false;
00206 }
00207 
00208 /// StartsWithGlobalOffsetTable - Check if this expression starts with
00209 ///  _GLOBAL_OFFSET_TABLE_ and if it is of the form
00210 ///  _GLOBAL_OFFSET_TABLE_-symbol. This is needed to support PIC on ELF
00211 /// i386 as _GLOBAL_OFFSET_TABLE_ is magical. We check only simple case that
00212 /// are know to be used: _GLOBAL_OFFSET_TABLE_ by itself or at the start
00213 /// of a binary expression.
00214 enum GlobalOffsetTableExprKind {
00215   GOT_None,
00216   GOT_Normal,
00217   GOT_SymDiff
00218 };
00219 static GlobalOffsetTableExprKind
00220 StartsWithGlobalOffsetTable(const MCExpr *Expr) {
00221   const MCExpr *RHS = 0;
00222   if (Expr->getKind() == MCExpr::Binary) {
00223     const MCBinaryExpr *BE = static_cast<const MCBinaryExpr *>(Expr);
00224     Expr = BE->getLHS();
00225     RHS = BE->getRHS();
00226   }
00227 
00228   if (Expr->getKind() != MCExpr::SymbolRef)
00229     return GOT_None;
00230 
00231   const MCSymbolRefExpr *Ref = static_cast<const MCSymbolRefExpr*>(Expr);
00232   const MCSymbol &S = Ref->getSymbol();
00233   if (S.getName() != "_GLOBAL_OFFSET_TABLE_")
00234     return GOT_None;
00235   if (RHS && RHS->getKind() == MCExpr::SymbolRef)
00236     return GOT_SymDiff;
00237   return GOT_Normal;
00238 }
00239 
00240 static bool HasSecRelSymbolRef(const MCExpr *Expr) {
00241   if (Expr->getKind() == MCExpr::SymbolRef) {
00242     const MCSymbolRefExpr *Ref = static_cast<const MCSymbolRefExpr*>(Expr);
00243     return Ref->getKind() == MCSymbolRefExpr::VK_SECREL;
00244   }
00245   return false;
00246 }
00247 
00248 void X86MCCodeEmitter::
00249 EmitImmediate(const MCOperand &DispOp, SMLoc Loc, unsigned Size,
00250               MCFixupKind FixupKind, unsigned &CurByte, raw_ostream &OS,
00251               SmallVectorImpl<MCFixup> &Fixups, int ImmOffset) const {
00252   const MCExpr *Expr = NULL;
00253   if (DispOp.isImm()) {
00254     // If this is a simple integer displacement that doesn't require a
00255     // relocation, emit it now.
00256     if (FixupKind != FK_PCRel_1 &&
00257         FixupKind != FK_PCRel_2 &&
00258         FixupKind != FK_PCRel_4) {
00259       EmitConstant(DispOp.getImm()+ImmOffset, Size, CurByte, OS);
00260       return;
00261     }
00262     Expr = MCConstantExpr::Create(DispOp.getImm(), Ctx);
00263   } else {
00264     Expr = DispOp.getExpr();
00265   }
00266 
00267   // If we have an immoffset, add it to the expression.
00268   if ((FixupKind == FK_Data_4 ||
00269        FixupKind == FK_Data_8 ||
00270        FixupKind == MCFixupKind(X86::reloc_signed_4byte))) {
00271     GlobalOffsetTableExprKind Kind = StartsWithGlobalOffsetTable(Expr);
00272     if (Kind != GOT_None) {
00273       assert(ImmOffset == 0);
00274 
00275       FixupKind = MCFixupKind(X86::reloc_global_offset_table);
00276       if (Kind == GOT_Normal)
00277         ImmOffset = CurByte;
00278     } else if (Expr->getKind() == MCExpr::SymbolRef) {
00279       if (HasSecRelSymbolRef(Expr)) {
00280         FixupKind = MCFixupKind(FK_SecRel_4);
00281       }
00282     } else if (Expr->getKind() == MCExpr::Binary) {
00283       const MCBinaryExpr *Bin = static_cast<const MCBinaryExpr*>(Expr);
00284       if (HasSecRelSymbolRef(Bin->getLHS())
00285           || HasSecRelSymbolRef(Bin->getRHS())) {
00286         FixupKind = MCFixupKind(FK_SecRel_4);
00287       }
00288     }
00289   }
00290 
00291   // If the fixup is pc-relative, we need to bias the value to be relative to
00292   // the start of the field, not the end of the field.
00293   if (FixupKind == FK_PCRel_4 ||
00294       FixupKind == MCFixupKind(X86::reloc_riprel_4byte) ||
00295       FixupKind == MCFixupKind(X86::reloc_riprel_4byte_movq_load))
00296     ImmOffset -= 4;
00297   if (FixupKind == FK_PCRel_2)
00298     ImmOffset -= 2;
00299   if (FixupKind == FK_PCRel_1)
00300     ImmOffset -= 1;
00301 
00302   if (ImmOffset)
00303     Expr = MCBinaryExpr::CreateAdd(Expr, MCConstantExpr::Create(ImmOffset, Ctx),
00304                                    Ctx);
00305 
00306   // Emit a symbolic constant as a fixup and 4 zeros.
00307   Fixups.push_back(MCFixup::Create(CurByte, Expr, FixupKind, Loc));
00308   EmitConstant(0, Size, CurByte, OS);
00309 }
00310 
00311 void X86MCCodeEmitter::EmitMemModRMByte(const MCInst &MI, unsigned Op,
00312                                         unsigned RegOpcodeField,
00313                                         uint64_t TSFlags, unsigned &CurByte,
00314                                         raw_ostream &OS,
00315                                         SmallVectorImpl<MCFixup> &Fixups) const{
00316   const MCOperand &Disp     = MI.getOperand(Op+X86::AddrDisp);
00317   const MCOperand &Base     = MI.getOperand(Op+X86::AddrBaseReg);
00318   const MCOperand &Scale    = MI.getOperand(Op+X86::AddrScaleAmt);
00319   const MCOperand &IndexReg = MI.getOperand(Op+X86::AddrIndexReg);
00320   unsigned BaseReg = Base.getReg();
00321 
00322   // Handle %rip relative addressing.
00323   if (BaseReg == X86::RIP) {    // [disp32+RIP] in X86-64 mode
00324     assert(is64BitMode() && "Rip-relative addressing requires 64-bit mode");
00325     assert(IndexReg.getReg() == 0 && "Invalid rip-relative address");
00326     EmitByte(ModRMByte(0, RegOpcodeField, 5), CurByte, OS);
00327 
00328     unsigned FixupKind = X86::reloc_riprel_4byte;
00329 
00330     // movq loads are handled with a special relocation form which allows the
00331     // linker to eliminate some loads for GOT references which end up in the
00332     // same linkage unit.
00333     if (MI.getOpcode() == X86::MOV64rm)
00334       FixupKind = X86::reloc_riprel_4byte_movq_load;
00335 
00336     // rip-relative addressing is actually relative to the *next* instruction.
00337     // Since an immediate can follow the mod/rm byte for an instruction, this
00338     // means that we need to bias the immediate field of the instruction with
00339     // the size of the immediate field.  If we have this case, add it into the
00340     // expression to emit.
00341     int ImmSize = X86II::hasImm(TSFlags) ? X86II::getSizeOfImm(TSFlags) : 0;
00342 
00343     EmitImmediate(Disp, MI.getLoc(), 4, MCFixupKind(FixupKind),
00344                   CurByte, OS, Fixups, -ImmSize);
00345     return;
00346   }
00347 
00348   unsigned BaseRegNo = BaseReg ? GetX86RegNum(Base) : -1U;
00349 
00350   // Determine whether a SIB byte is needed.
00351   // If no BaseReg, issue a RIP relative instruction only if the MCE can
00352   // resolve addresses on-the-fly, otherwise use SIB (Intel Manual 2A, table
00353   // 2-7) and absolute references.
00354 
00355   if (// The SIB byte must be used if there is an index register.
00356       IndexReg.getReg() == 0 &&
00357       // The SIB byte must be used if the base is ESP/RSP/R12, all of which
00358       // encode to an R/M value of 4, which indicates that a SIB byte is
00359       // present.
00360       BaseRegNo != N86::ESP &&
00361       // If there is no base register and we're in 64-bit mode, we need a SIB
00362       // byte to emit an addr that is just 'disp32' (the non-RIP relative form).
00363       (!is64BitMode() || BaseReg != 0)) {
00364 
00365     if (BaseReg == 0) {          // [disp32]     in X86-32 mode
00366       EmitByte(ModRMByte(0, RegOpcodeField, 5), CurByte, OS);
00367       EmitImmediate(Disp, MI.getLoc(), 4, FK_Data_4, CurByte, OS, Fixups);
00368       return;
00369     }
00370 
00371     // If the base is not EBP/ESP and there is no displacement, use simple
00372     // indirect register encoding, this handles addresses like [EAX].  The
00373     // encoding for [EBP] with no displacement means [disp32] so we handle it
00374     // by emitting a displacement of 0 below.
00375     if (Disp.isImm() && Disp.getImm() == 0 && BaseRegNo != N86::EBP) {
00376       EmitByte(ModRMByte(0, RegOpcodeField, BaseRegNo), CurByte, OS);
00377       return;
00378     }
00379 
00380     // Otherwise, if the displacement fits in a byte, encode as [REG+disp8].
00381     if (Disp.isImm() && isDisp8(Disp.getImm())) {
00382       EmitByte(ModRMByte(1, RegOpcodeField, BaseRegNo), CurByte, OS);
00383       EmitImmediate(Disp, MI.getLoc(), 1, FK_Data_1, CurByte, OS, Fixups);
00384       return;
00385     }
00386 
00387     // Otherwise, emit the most general non-SIB encoding: [REG+disp32]
00388     EmitByte(ModRMByte(2, RegOpcodeField, BaseRegNo), CurByte, OS);
00389     EmitImmediate(Disp, MI.getLoc(), 4, MCFixupKind(X86::reloc_signed_4byte), CurByte, OS,
00390                   Fixups);
00391     return;
00392   }
00393 
00394   // We need a SIB byte, so start by outputting the ModR/M byte first
00395   assert(IndexReg.getReg() != X86::ESP &&
00396          IndexReg.getReg() != X86::RSP && "Cannot use ESP as index reg!");
00397 
00398   bool ForceDisp32 = false;
00399   bool ForceDisp8  = false;
00400   if (BaseReg == 0) {
00401     // If there is no base register, we emit the special case SIB byte with
00402     // MOD=0, BASE=5, to JUST get the index, scale, and displacement.
00403     EmitByte(ModRMByte(0, RegOpcodeField, 4), CurByte, OS);
00404     ForceDisp32 = true;
00405   } else if (!Disp.isImm()) {
00406     // Emit the normal disp32 encoding.
00407     EmitByte(ModRMByte(2, RegOpcodeField, 4), CurByte, OS);
00408     ForceDisp32 = true;
00409   } else if (Disp.getImm() == 0 &&
00410              // Base reg can't be anything that ends up with '5' as the base
00411              // reg, it is the magic [*] nomenclature that indicates no base.
00412              BaseRegNo != N86::EBP) {
00413     // Emit no displacement ModR/M byte
00414     EmitByte(ModRMByte(0, RegOpcodeField, 4), CurByte, OS);
00415   } else if (isDisp8(Disp.getImm())) {
00416     // Emit the disp8 encoding.
00417     EmitByte(ModRMByte(1, RegOpcodeField, 4), CurByte, OS);
00418     ForceDisp8 = true;           // Make sure to force 8 bit disp if Base=EBP
00419   } else {
00420     // Emit the normal disp32 encoding.
00421     EmitByte(ModRMByte(2, RegOpcodeField, 4), CurByte, OS);
00422   }
00423 
00424   // Calculate what the SS field value should be...
00425   static const unsigned SSTable[] = { ~0U, 0, 1, ~0U, 2, ~0U, ~0U, ~0U, 3 };
00426   unsigned SS = SSTable[Scale.getImm()];
00427 
00428   if (BaseReg == 0) {
00429     // Handle the SIB byte for the case where there is no base, see Intel
00430     // Manual 2A, table 2-7. The displacement has already been output.
00431     unsigned IndexRegNo;
00432     if (IndexReg.getReg())
00433       IndexRegNo = GetX86RegNum(IndexReg);
00434     else // Examples: [ESP+1*<noreg>+4] or [scaled idx]+disp32 (MOD=0,BASE=5)
00435       IndexRegNo = 4;
00436     EmitSIBByte(SS, IndexRegNo, 5, CurByte, OS);
00437   } else {
00438     unsigned IndexRegNo;
00439     if (IndexReg.getReg())
00440       IndexRegNo = GetX86RegNum(IndexReg);
00441     else
00442       IndexRegNo = 4;   // For example [ESP+1*<noreg>+4]
00443     EmitSIBByte(SS, IndexRegNo, GetX86RegNum(Base), CurByte, OS);
00444   }
00445 
00446   // Do we need to output a displacement?
00447   if (ForceDisp8)
00448     EmitImmediate(Disp, MI.getLoc(), 1, FK_Data_1, CurByte, OS, Fixups);
00449   else if (ForceDisp32 || Disp.getImm() != 0)
00450     EmitImmediate(Disp, MI.getLoc(), 4, MCFixupKind(X86::reloc_signed_4byte),
00451                   CurByte, OS, Fixups);
00452 }
00453 
00454 /// EmitVEXOpcodePrefix - AVX instructions are encoded using a opcode prefix
00455 /// called VEX.
00456 void X86MCCodeEmitter::EmitVEXOpcodePrefix(uint64_t TSFlags, unsigned &CurByte,
00457                                            int MemOperand, const MCInst &MI,
00458                                            const MCInstrDesc &Desc,
00459                                            raw_ostream &OS) const {
00460   bool HasVEX_4V = (TSFlags >> X86II::VEXShift) & X86II::VEX_4V;
00461   bool HasVEX_4VOp3 = (TSFlags >> X86II::VEXShift) & X86II::VEX_4VOp3;
00462   bool HasMemOp4 = (TSFlags >> X86II::VEXShift) & X86II::MemOp4;
00463 
00464   // VEX_R: opcode externsion equivalent to REX.R in
00465   // 1's complement (inverted) form
00466   //
00467   //  1: Same as REX_R=0 (must be 1 in 32-bit mode)
00468   //  0: Same as REX_R=1 (64 bit mode only)
00469   //
00470   unsigned char VEX_R = 0x1;
00471 
00472   // VEX_X: equivalent to REX.X, only used when a
00473   // register is used for index in SIB Byte.
00474   //
00475   //  1: Same as REX.X=0 (must be 1 in 32-bit mode)
00476   //  0: Same as REX.X=1 (64-bit mode only)
00477   unsigned char VEX_X = 0x1;
00478 
00479   // VEX_B:
00480   //
00481   //  1: Same as REX_B=0 (ignored in 32-bit mode)
00482   //  0: Same as REX_B=1 (64 bit mode only)
00483   //
00484   unsigned char VEX_B = 0x1;
00485 
00486   // VEX_W: opcode specific (use like REX.W, or used for
00487   // opcode extension, or ignored, depending on the opcode byte)
00488   unsigned char VEX_W = 0;
00489 
00490   // XOP: Use XOP prefix byte 0x8f instead of VEX.
00491   unsigned char XOP = 0;
00492 
00493   // VEX_5M (VEX m-mmmmm field):
00494   //
00495   //  0b00000: Reserved for future use
00496   //  0b00001: implied 0F leading opcode
00497   //  0b00010: implied 0F 38 leading opcode bytes
00498   //  0b00011: implied 0F 3A leading opcode bytes
00499   //  0b00100-0b11111: Reserved for future use
00500   //  0b01000: XOP map select - 08h instructions with imm byte
00501   //  0b10001: XOP map select - 09h instructions with no imm byte
00502   unsigned char VEX_5M = 0x1;
00503 
00504   // VEX_4V (VEX vvvv field): a register specifier
00505   // (in 1's complement form) or 1111 if unused.
00506   unsigned char VEX_4V = 0xf;
00507 
00508   // VEX_L (Vector Length):
00509   //
00510   //  0: scalar or 128-bit vector
00511   //  1: 256-bit vector
00512   //
00513   unsigned char VEX_L = 0;
00514 
00515   // VEX_PP: opcode extension providing equivalent
00516   // functionality of a SIMD prefix
00517   //
00518   //  0b00: None
00519   //  0b01: 66
00520   //  0b10: F3
00521   //  0b11: F2
00522   //
00523   unsigned char VEX_PP = 0;
00524 
00525   // Encode the operand size opcode prefix as needed.
00526   if (TSFlags & X86II::OpSize)
00527     VEX_PP = 0x01;
00528 
00529   if ((TSFlags >> X86II::VEXShift) & X86II::VEX_W)
00530     VEX_W = 1;
00531 
00532   if ((TSFlags >> X86II::VEXShift) & X86II::XOP)
00533     XOP = 1;
00534 
00535   if ((TSFlags >> X86II::VEXShift) & X86II::VEX_L)
00536     VEX_L = 1;
00537 
00538   switch (TSFlags & X86II::Op0Mask) {
00539   default: llvm_unreachable("Invalid prefix!");
00540   case X86II::T8:  // 0F 38
00541     VEX_5M = 0x2;
00542     break;
00543   case X86II::TA:  // 0F 3A
00544     VEX_5M = 0x3;
00545     break;
00546   case X86II::T8XS: // F3 0F 38
00547     VEX_PP = 0x2;
00548     VEX_5M = 0x2;
00549     break;
00550   case X86II::T8XD: // F2 0F 38
00551     VEX_PP = 0x3;
00552     VEX_5M = 0x2;
00553     break;
00554   case X86II::TAXD: // F2 0F 3A
00555     VEX_PP = 0x3;
00556     VEX_5M = 0x3;
00557     break;
00558   case X86II::XS:  // F3 0F
00559     VEX_PP = 0x2;
00560     break;
00561   case X86II::XD:  // F2 0F
00562     VEX_PP = 0x3;
00563     break;
00564   case X86II::XOP8:
00565     VEX_5M = 0x8;
00566     break;
00567   case X86II::XOP9:
00568     VEX_5M = 0x9;
00569     break;
00570   case X86II::A6:  // Bypass: Not used by VEX
00571   case X86II::A7:  // Bypass: Not used by VEX
00572   case X86II::TB:  // Bypass: Not used by VEX
00573   case 0:
00574     break;  // No prefix!
00575   }
00576 
00577 
00578   // Classify VEX_B, VEX_4V, VEX_R, VEX_X
00579   unsigned NumOps = Desc.getNumOperands();
00580   unsigned CurOp = 0;
00581   if (NumOps > 1 && Desc.getOperandConstraint(1, MCOI::TIED_TO) == 0)
00582     ++CurOp;
00583   else if (NumOps > 3 && Desc.getOperandConstraint(2, MCOI::TIED_TO) == 0) {
00584     assert(Desc.getOperandConstraint(NumOps - 1, MCOI::TIED_TO) == 1);
00585     // Special case for GATHER with 2 TIED_TO operands
00586     // Skip the first 2 operands: dst, mask_wb
00587     CurOp += 2;
00588   }
00589 
00590   switch (TSFlags & X86II::FormMask) {
00591   case X86II::MRMInitReg: llvm_unreachable("FIXME: Remove this!");
00592   case X86II::MRMDestMem: {
00593     // MRMDestMem instructions forms:
00594     //  MemAddr, src1(ModR/M)
00595     //  MemAddr, src1(VEX_4V), src2(ModR/M)
00596     //  MemAddr, src1(ModR/M), imm8
00597     //
00598     if (X86II::isX86_64ExtendedReg(MI.getOperand(X86::AddrBaseReg).getReg()))
00599       VEX_B = 0x0;
00600     if (X86II::isX86_64ExtendedReg(MI.getOperand(X86::AddrIndexReg).getReg()))
00601       VEX_X = 0x0;
00602 
00603     CurOp = X86::AddrNumOperands;
00604     if (HasVEX_4V)
00605       VEX_4V = getVEXRegisterEncoding(MI, CurOp++);
00606 
00607     const MCOperand &MO = MI.getOperand(CurOp);
00608     if (MO.isReg() && X86II::isX86_64ExtendedReg(MO.getReg()))
00609       VEX_R = 0x0;
00610     break;
00611   }
00612   case X86II::MRMSrcMem:
00613     // MRMSrcMem instructions forms:
00614     //  src1(ModR/M), MemAddr
00615     //  src1(ModR/M), src2(VEX_4V), MemAddr
00616     //  src1(ModR/M), MemAddr, imm8
00617     //  src1(ModR/M), MemAddr, src2(VEX_I8IMM)
00618     //
00619     //  FMA4:
00620     //  dst(ModR/M.reg), src1(VEX_4V), src2(ModR/M), src3(VEX_I8IMM)
00621     //  dst(ModR/M.reg), src1(VEX_4V), src2(VEX_I8IMM), src3(ModR/M),
00622     if (X86II::isX86_64ExtendedReg(MI.getOperand(CurOp++).getReg()))
00623       VEX_R = 0x0;
00624 
00625     if (HasVEX_4V)
00626       VEX_4V = getVEXRegisterEncoding(MI, CurOp);
00627 
00628     if (X86II::isX86_64ExtendedReg(
00629                MI.getOperand(MemOperand+X86::AddrBaseReg).getReg()))
00630       VEX_B = 0x0;
00631     if (X86II::isX86_64ExtendedReg(
00632                MI.getOperand(MemOperand+X86::AddrIndexReg).getReg()))
00633       VEX_X = 0x0;
00634 
00635     if (HasVEX_4VOp3)
00636       // Instruction format for 4VOp3:
00637       //   src1(ModR/M), MemAddr, src3(VEX_4V)
00638       // CurOp points to start of the MemoryOperand,
00639       //   it skips TIED_TO operands if exist, then increments past src1.
00640       // CurOp + X86::AddrNumOperands will point to src3.
00641       VEX_4V = getVEXRegisterEncoding(MI, CurOp+X86::AddrNumOperands);
00642     break;
00643   case X86II::MRM0m: case X86II::MRM1m:
00644   case X86II::MRM2m: case X86II::MRM3m:
00645   case X86II::MRM4m: case X86II::MRM5m:
00646   case X86II::MRM6m: case X86II::MRM7m: {
00647     // MRM[0-9]m instructions forms:
00648     //  MemAddr
00649     //  src1(VEX_4V), MemAddr
00650     if (HasVEX_4V)
00651       VEX_4V = getVEXRegisterEncoding(MI, 0);
00652 
00653     if (X86II::isX86_64ExtendedReg(
00654                MI.getOperand(MemOperand+X86::AddrBaseReg).getReg()))
00655       VEX_B = 0x0;
00656     if (X86II::isX86_64ExtendedReg(
00657                MI.getOperand(MemOperand+X86::AddrIndexReg).getReg()))
00658       VEX_X = 0x0;
00659     break;
00660   }
00661   case X86II::MRMSrcReg:
00662     // MRMSrcReg instructions forms:
00663     //  dst(ModR/M), src1(VEX_4V), src2(ModR/M), src3(VEX_I8IMM)
00664     //  dst(ModR/M), src1(ModR/M)
00665     //  dst(ModR/M), src1(ModR/M), imm8
00666     //
00667     //  FMA4:
00668     //  dst(ModR/M.reg), src1(VEX_4V), src2(ModR/M), src3(VEX_I8IMM)
00669     //  dst(ModR/M.reg), src1(VEX_4V), src2(VEX_I8IMM), src3(ModR/M),
00670     if (X86II::isX86_64ExtendedReg(MI.getOperand(CurOp).getReg()))
00671       VEX_R = 0x0;
00672     CurOp++;
00673 
00674     if (HasVEX_4V)
00675       VEX_4V = getVEXRegisterEncoding(MI, CurOp++);
00676 
00677     if (HasMemOp4) // Skip second register source (encoded in I8IMM)
00678       CurOp++;
00679 
00680     if (X86II::isX86_64ExtendedReg(MI.getOperand(CurOp).getReg()))
00681       VEX_B = 0x0;
00682     CurOp++;
00683     if (HasVEX_4VOp3)
00684       VEX_4V = getVEXRegisterEncoding(MI, CurOp);
00685     break;
00686   case X86II::MRMDestReg:
00687     // MRMDestReg instructions forms:
00688     //  dst(ModR/M), src(ModR/M)
00689     //  dst(ModR/M), src(ModR/M), imm8
00690     //  dst(ModR/M), src1(VEX_4V), src2(ModR/M)
00691     if (X86II::isX86_64ExtendedReg(MI.getOperand(CurOp).getReg()))
00692       VEX_B = 0x0;
00693     CurOp++;
00694 
00695     if (HasVEX_4V)
00696       VEX_4V = getVEXRegisterEncoding(MI, CurOp++);
00697 
00698     if (X86II::isX86_64ExtendedReg(MI.getOperand(CurOp).getReg()))
00699       VEX_R = 0x0;
00700     break;
00701   case X86II::MRM0r: case X86II::MRM1r:
00702   case X86II::MRM2r: case X86II::MRM3r:
00703   case X86II::MRM4r: case X86II::MRM5r:
00704   case X86II::MRM6r: case X86II::MRM7r:
00705     // MRM0r-MRM7r instructions forms:
00706     //  dst(VEX_4V), src(ModR/M), imm8
00707     VEX_4V = getVEXRegisterEncoding(MI, 0);
00708     if (X86II::isX86_64ExtendedReg(MI.getOperand(1).getReg()))
00709       VEX_B = 0x0;
00710     break;
00711   default: // RawFrm
00712     break;
00713   }
00714 
00715   // Emit segment override opcode prefix as needed.
00716   EmitSegmentOverridePrefix(TSFlags, CurByte, MemOperand, MI, OS);
00717 
00718   // VEX opcode prefix can have 2 or 3 bytes
00719   //
00720   //  3 bytes:
00721   //    +-----+ +--------------+ +-------------------+
00722   //    | C4h | | RXB | m-mmmm | | W | vvvv | L | pp |
00723   //    +-----+ +--------------+ +-------------------+
00724   //  2 bytes:
00725   //    +-----+ +-------------------+
00726   //    | C5h | | R | vvvv | L | pp |
00727   //    +-----+ +-------------------+
00728   //
00729   unsigned char LastByte = VEX_PP | (VEX_L << 2) | (VEX_4V << 3);
00730 
00731   if (VEX_B && VEX_X && !VEX_W && !XOP && (VEX_5M == 1)) { // 2 byte VEX prefix
00732     EmitByte(0xC5, CurByte, OS);
00733     EmitByte(LastByte | (VEX_R << 7), CurByte, OS);
00734     return;
00735   }
00736 
00737   // 3 byte VEX prefix
00738   EmitByte(XOP ? 0x8F : 0xC4, CurByte, OS);
00739   EmitByte(VEX_R << 7 | VEX_X << 6 | VEX_B << 5 | VEX_5M, CurByte, OS);
00740   EmitByte(LastByte | (VEX_W << 7), CurByte, OS);
00741 }
00742 
00743 /// DetermineREXPrefix - Determine if the MCInst has to be encoded with a X86-64
00744 /// REX prefix which specifies 1) 64-bit instructions, 2) non-default operand
00745 /// size, and 3) use of X86-64 extended registers.
00746 static unsigned DetermineREXPrefix(const MCInst &MI, uint64_t TSFlags,
00747                                    const MCInstrDesc &Desc) {
00748   unsigned REX = 0;
00749   if (TSFlags & X86II::REX_W)
00750     REX |= 1 << 3; // set REX.W
00751 
00752   if (MI.getNumOperands() == 0) return REX;
00753 
00754   unsigned NumOps = MI.getNumOperands();
00755   // FIXME: MCInst should explicitize the two-addrness.
00756   bool isTwoAddr = NumOps > 1 &&
00757                       Desc.getOperandConstraint(1, MCOI::TIED_TO) != -1;
00758 
00759   // If it accesses SPL, BPL, SIL, or DIL, then it requires a 0x40 REX prefix.
00760   unsigned i = isTwoAddr ? 1 : 0;
00761   for (; i != NumOps; ++i) {
00762     const MCOperand &MO = MI.getOperand(i);
00763     if (!MO.isReg()) continue;
00764     unsigned Reg = MO.getReg();
00765     if (!X86II::isX86_64NonExtLowByteReg(Reg)) continue;
00766     // FIXME: The caller of DetermineREXPrefix slaps this prefix onto anything
00767     // that returns non-zero.
00768     REX |= 0x40; // REX fixed encoding prefix
00769     break;
00770   }
00771 
00772   switch (TSFlags & X86II::FormMask) {
00773   case X86II::MRMInitReg: llvm_unreachable("FIXME: Remove this!");
00774   case X86II::MRMSrcReg:
00775     if (MI.getOperand(0).isReg() &&
00776         X86II::isX86_64ExtendedReg(MI.getOperand(0).getReg()))
00777       REX |= 1 << 2; // set REX.R
00778     i = isTwoAddr ? 2 : 1;
00779     for (; i != NumOps; ++i) {
00780       const MCOperand &MO = MI.getOperand(i);
00781       if (MO.isReg() && X86II::isX86_64ExtendedReg(MO.getReg()))
00782         REX |= 1 << 0; // set REX.B
00783     }
00784     break;
00785   case X86II::MRMSrcMem: {
00786     if (MI.getOperand(0).isReg() &&
00787         X86II::isX86_64ExtendedReg(MI.getOperand(0).getReg()))
00788       REX |= 1 << 2; // set REX.R
00789     unsigned Bit = 0;
00790     i = isTwoAddr ? 2 : 1;
00791     for (; i != NumOps; ++i) {
00792       const MCOperand &MO = MI.getOperand(i);
00793       if (MO.isReg()) {
00794         if (X86II::isX86_64ExtendedReg(MO.getReg()))
00795           REX |= 1 << Bit; // set REX.B (Bit=0) and REX.X (Bit=1)
00796         Bit++;
00797       }
00798     }
00799     break;
00800   }
00801   case X86II::MRM0m: case X86II::MRM1m:
00802   case X86II::MRM2m: case X86II::MRM3m:
00803   case X86II::MRM4m: case X86II::MRM5m:
00804   case X86II::MRM6m: case X86II::MRM7m:
00805   case X86II::MRMDestMem: {
00806     unsigned e = (isTwoAddr ? X86::AddrNumOperands+1 : X86::AddrNumOperands);
00807     i = isTwoAddr ? 1 : 0;
00808     if (NumOps > e && MI.getOperand(e).isReg() &&
00809         X86II::isX86_64ExtendedReg(MI.getOperand(e).getReg()))
00810       REX |= 1 << 2; // set REX.R
00811     unsigned Bit = 0;
00812     for (; i != e; ++i) {
00813       const MCOperand &MO = MI.getOperand(i);
00814       if (MO.isReg()) {
00815         if (X86II::isX86_64ExtendedReg(MO.getReg()))
00816           REX |= 1 << Bit; // REX.B (Bit=0) and REX.X (Bit=1)
00817         Bit++;
00818       }
00819     }
00820     break;
00821   }
00822   default:
00823     if (MI.getOperand(0).isReg() &&
00824         X86II::isX86_64ExtendedReg(MI.getOperand(0).getReg()))
00825       REX |= 1 << 0; // set REX.B
00826     i = isTwoAddr ? 2 : 1;
00827     for (unsigned e = NumOps; i != e; ++i) {
00828       const MCOperand &MO = MI.getOperand(i);
00829       if (MO.isReg() && X86II::isX86_64ExtendedReg(MO.getReg()))
00830         REX |= 1 << 2; // set REX.R
00831     }
00832     break;
00833   }
00834   return REX;
00835 }
00836 
00837 /// EmitSegmentOverridePrefix - Emit segment override opcode prefix as needed
00838 void X86MCCodeEmitter::EmitSegmentOverridePrefix(uint64_t TSFlags,
00839                                         unsigned &CurByte, int MemOperand,
00840                                         const MCInst &MI,
00841                                         raw_ostream &OS) const {
00842   switch (TSFlags & X86II::SegOvrMask) {
00843   default: llvm_unreachable("Invalid segment!");
00844   case 0:
00845     // No segment override, check for explicit one on memory operand.
00846     if (MemOperand != -1) {   // If the instruction has a memory operand.
00847       switch (MI.getOperand(MemOperand+X86::AddrSegmentReg).getReg()) {
00848       default: llvm_unreachable("Unknown segment register!");
00849       case 0: break;
00850       case X86::CS: EmitByte(0x2E, CurByte, OS); break;
00851       case X86::SS: EmitByte(0x36, CurByte, OS); break;
00852       case X86::DS: EmitByte(0x3E, CurByte, OS); break;
00853       case X86::ES: EmitByte(0x26, CurByte, OS); break;
00854       case X86::FS: EmitByte(0x64, CurByte, OS); break;
00855       case X86::GS: EmitByte(0x65, CurByte, OS); break;
00856       }
00857     }
00858     break;
00859   case X86II::FS:
00860     EmitByte(0x64, CurByte, OS);
00861     break;
00862   case X86II::GS:
00863     EmitByte(0x65, CurByte, OS);
00864     break;
00865   }
00866 }
00867 
00868 /// EmitOpcodePrefix - Emit all instruction prefixes prior to the opcode.
00869 ///
00870 /// MemOperand is the operand # of the start of a memory operand if present.  If
00871 /// Not present, it is -1.
00872 void X86MCCodeEmitter::EmitOpcodePrefix(uint64_t TSFlags, unsigned &CurByte,
00873                                         int MemOperand, const MCInst &MI,
00874                                         const MCInstrDesc &Desc,
00875                                         raw_ostream &OS) const {
00876 
00877   // Emit the lock opcode prefix as needed.
00878   if (TSFlags & X86II::LOCK)
00879     EmitByte(0xF0, CurByte, OS);
00880 
00881   // Emit segment override opcode prefix as needed.
00882   EmitSegmentOverridePrefix(TSFlags, CurByte, MemOperand, MI, OS);
00883 
00884   // Emit the repeat opcode prefix as needed.
00885   if ((TSFlags & X86II::Op0Mask) == X86II::REP)
00886     EmitByte(0xF3, CurByte, OS);
00887 
00888   // Emit the address size opcode prefix as needed.
00889   bool need_address_override;
00890   if (TSFlags & X86II::AdSize) {
00891     need_address_override = true;
00892   } else if (MemOperand == -1) {
00893     need_address_override = false;
00894   } else if (is64BitMode()) {
00895     assert(!Is16BitMemOperand(MI, MemOperand));
00896     need_address_override = Is32BitMemOperand(MI, MemOperand);
00897   } else if (is32BitMode()) {
00898     assert(!Is64BitMemOperand(MI, MemOperand));
00899     need_address_override = Is16BitMemOperand(MI, MemOperand);
00900   } else {
00901     need_address_override = false;
00902   }
00903 
00904   if (need_address_override)
00905     EmitByte(0x67, CurByte, OS);
00906 
00907   // Emit the operand size opcode prefix as needed.
00908   if (TSFlags & X86II::OpSize)
00909     EmitByte(0x66, CurByte, OS);
00910 
00911   bool Need0FPrefix = false;
00912   switch (TSFlags & X86II::Op0Mask) {
00913   default: llvm_unreachable("Invalid prefix!");
00914   case 0: break;  // No prefix!
00915   case X86II::REP: break; // already handled.
00916   case X86II::TB:  // Two-byte opcode prefix
00917   case X86II::T8:  // 0F 38
00918   case X86II::TA:  // 0F 3A
00919   case X86II::A6:  // 0F A6
00920   case X86II::A7:  // 0F A7
00921     Need0FPrefix = true;
00922     break;
00923   case X86II::T8XS: // F3 0F 38
00924     EmitByte(0xF3, CurByte, OS);
00925     Need0FPrefix = true;
00926     break;
00927   case X86II::T8XD: // F2 0F 38
00928     EmitByte(0xF2, CurByte, OS);
00929     Need0FPrefix = true;
00930     break;
00931   case X86II::TAXD: // F2 0F 3A
00932     EmitByte(0xF2, CurByte, OS);
00933     Need0FPrefix = true;
00934     break;
00935   case X86II::XS:   // F3 0F
00936     EmitByte(0xF3, CurByte, OS);
00937     Need0FPrefix = true;
00938     break;
00939   case X86II::XD:   // F2 0F
00940     EmitByte(0xF2, CurByte, OS);
00941     Need0FPrefix = true;
00942     break;
00943   case X86II::D8: EmitByte(0xD8, CurByte, OS); break;
00944   case X86II::D9: EmitByte(0xD9, CurByte, OS); break;
00945   case X86II::DA: EmitByte(0xDA, CurByte, OS); break;
00946   case X86II::DB: EmitByte(0xDB, CurByte, OS); break;
00947   case X86II::DC: EmitByte(0xDC, CurByte, OS); break;
00948   case X86II::DD: EmitByte(0xDD, CurByte, OS); break;
00949   case X86II::DE: EmitByte(0xDE, CurByte, OS); break;
00950   case X86II::DF: EmitByte(0xDF, CurByte, OS); break;
00951   }
00952 
00953   // Handle REX prefix.
00954   // FIXME: Can this come before F2 etc to simplify emission?
00955   if (is64BitMode()) {
00956     if (unsigned REX = DetermineREXPrefix(MI, TSFlags, Desc))
00957       EmitByte(0x40 | REX, CurByte, OS);
00958   }
00959 
00960   // 0x0F escape code must be emitted just before the opcode.
00961   if (Need0FPrefix)
00962     EmitByte(0x0F, CurByte, OS);
00963 
00964   // FIXME: Pull this up into previous switch if REX can be moved earlier.
00965   switch (TSFlags & X86II::Op0Mask) {
00966   case X86II::T8XS:  // F3 0F 38
00967   case X86II::T8XD:  // F2 0F 38
00968   case X86II::T8:    // 0F 38
00969     EmitByte(0x38, CurByte, OS);
00970     break;
00971   case X86II::TAXD:  // F2 0F 3A
00972   case X86II::TA:    // 0F 3A
00973     EmitByte(0x3A, CurByte, OS);
00974     break;
00975   case X86II::A6:    // 0F A6
00976     EmitByte(0xA6, CurByte, OS);
00977     break;
00978   case X86II::A7:    // 0F A7
00979     EmitByte(0xA7, CurByte, OS);
00980     break;
00981   }
00982 }
00983 
00984 void X86MCCodeEmitter::
00985 EncodeInstruction(const MCInst &MI, raw_ostream &OS,
00986                   SmallVectorImpl<MCFixup> &Fixups) const {
00987   unsigned Opcode = MI.getOpcode();
00988   const MCInstrDesc &Desc = MCII.get(Opcode);
00989   uint64_t TSFlags = Desc.TSFlags;
00990 
00991   // Pseudo instructions don't get encoded.
00992   if ((TSFlags & X86II::FormMask) == X86II::Pseudo)
00993     return;
00994 
00995   unsigned NumOps = Desc.getNumOperands();
00996   unsigned CurOp = X86II::getOperandBias(Desc);
00997 
00998   // Keep track of the current byte being emitted.
00999   unsigned CurByte = 0;
01000 
01001   // Is this instruction encoded using the AVX VEX prefix?
01002   bool HasVEXPrefix = (TSFlags >> X86II::VEXShift) & X86II::VEX;
01003 
01004   // It uses the VEX.VVVV field?
01005   bool HasVEX_4V = (TSFlags >> X86II::VEXShift) & X86II::VEX_4V;
01006   bool HasVEX_4VOp3 = (TSFlags >> X86II::VEXShift) & X86II::VEX_4VOp3;
01007   bool HasMemOp4 = (TSFlags >> X86II::VEXShift) & X86II::MemOp4;
01008   const unsigned MemOp4_I8IMMOperand = 2;
01009 
01010   // Determine where the memory operand starts, if present.
01011   int MemoryOperand = X86II::getMemoryOperandNo(TSFlags, Opcode);
01012   if (MemoryOperand != -1) MemoryOperand += CurOp;
01013 
01014   if (!HasVEXPrefix)
01015     EmitOpcodePrefix(TSFlags, CurByte, MemoryOperand, MI, Desc, OS);
01016   else
01017     EmitVEXOpcodePrefix(TSFlags, CurByte, MemoryOperand, MI, Desc, OS);
01018 
01019   unsigned char BaseOpcode = X86II::getBaseOpcodeFor(TSFlags);
01020 
01021   if ((TSFlags >> X86II::VEXShift) & X86II::Has3DNow0F0FOpcode)
01022     BaseOpcode = 0x0F;   // Weird 3DNow! encoding.
01023 
01024   unsigned SrcRegNum = 0;
01025   switch (TSFlags & X86II::FormMask) {
01026   case X86II::MRMInitReg:
01027     llvm_unreachable("FIXME: Remove this form when the JIT moves to MCCodeEmitter!");
01028   default: errs() << "FORM: " << (TSFlags & X86II::FormMask) << "\n";
01029     llvm_unreachable("Unknown FormMask value in X86MCCodeEmitter!");
01030   case X86II::Pseudo:
01031     llvm_unreachable("Pseudo instruction shouldn't be emitted");
01032   case X86II::RawFrm:
01033     EmitByte(BaseOpcode, CurByte, OS);
01034     break;
01035   case X86II::RawFrmImm8:
01036     EmitByte(BaseOpcode, CurByte, OS);
01037     EmitImmediate(MI.getOperand(CurOp++), MI.getLoc(),
01038                   X86II::getSizeOfImm(TSFlags), getImmFixupKind(TSFlags),
01039                   CurByte, OS, Fixups);
01040     EmitImmediate(MI.getOperand(CurOp++), MI.getLoc(), 1, FK_Data_1, CurByte,
01041                   OS, Fixups);
01042     break;
01043   case X86II::RawFrmImm16:
01044     EmitByte(BaseOpcode, CurByte, OS);
01045     EmitImmediate(MI.getOperand(CurOp++), MI.getLoc(),
01046                   X86II::getSizeOfImm(TSFlags), getImmFixupKind(TSFlags),
01047                   CurByte, OS, Fixups);
01048     EmitImmediate(MI.getOperand(CurOp++), MI.getLoc(), 2, FK_Data_2, CurByte,
01049                   OS, Fixups);
01050     break;
01051 
01052   case X86II::AddRegFrm:
01053     EmitByte(BaseOpcode + GetX86RegNum(MI.getOperand(CurOp++)), CurByte, OS);
01054     break;
01055 
01056   case X86II::MRMDestReg:
01057     EmitByte(BaseOpcode, CurByte, OS);
01058     SrcRegNum = CurOp + 1;
01059 
01060     if (HasVEX_4V) // Skip 1st src (which is encoded in VEX_VVVV)
01061       ++SrcRegNum;
01062 
01063     EmitRegModRMByte(MI.getOperand(CurOp),
01064                      GetX86RegNum(MI.getOperand(SrcRegNum)), CurByte, OS);
01065     CurOp = SrcRegNum + 1;
01066     break;
01067 
01068   case X86II::MRMDestMem:
01069     EmitByte(BaseOpcode, CurByte, OS);
01070     SrcRegNum = CurOp + X86::AddrNumOperands;
01071 
01072     if (HasVEX_4V) // Skip 1st src (which is encoded in VEX_VVVV)
01073       ++SrcRegNum;
01074 
01075     EmitMemModRMByte(MI, CurOp,
01076                      GetX86RegNum(MI.getOperand(SrcRegNum)),
01077                      TSFlags, CurByte, OS, Fixups);
01078     CurOp = SrcRegNum + 1;
01079     break;
01080 
01081   case X86II::MRMSrcReg:
01082     EmitByte(BaseOpcode, CurByte, OS);
01083     SrcRegNum = CurOp + 1;
01084 
01085     if (HasVEX_4V) // Skip 1st src (which is encoded in VEX_VVVV)
01086       ++SrcRegNum;
01087 
01088     if (HasMemOp4) // Skip 2nd src (which is encoded in I8IMM)
01089       ++SrcRegNum;
01090 
01091     EmitRegModRMByte(MI.getOperand(SrcRegNum),
01092                      GetX86RegNum(MI.getOperand(CurOp)), CurByte, OS);
01093 
01094     // 2 operands skipped with HasMemOp4, compensate accordingly
01095     CurOp = HasMemOp4 ? SrcRegNum : SrcRegNum + 1;
01096     if (HasVEX_4VOp3)
01097       ++CurOp;
01098     break;
01099 
01100   case X86II::MRMSrcMem: {
01101     int AddrOperands = X86::AddrNumOperands;
01102     unsigned FirstMemOp = CurOp+1;
01103     if (HasVEX_4V) {
01104       ++AddrOperands;
01105       ++FirstMemOp;  // Skip the register source (which is encoded in VEX_VVVV).
01106     }
01107     if (HasMemOp4) // Skip second register source (encoded in I8IMM)
01108       ++FirstMemOp;
01109 
01110     EmitByte(BaseOpcode, CurByte, OS);
01111 
01112     EmitMemModRMByte(MI, FirstMemOp, GetX86RegNum(MI.getOperand(CurOp)),
01113                      TSFlags, CurByte, OS, Fixups);
01114     CurOp += AddrOperands + 1;
01115     if (HasVEX_4VOp3)
01116       ++CurOp;
01117     break;
01118   }
01119 
01120   case X86II::MRM0r: case X86II::MRM1r:
01121   case X86II::MRM2r: case X86II::MRM3r:
01122   case X86II::MRM4r: case X86II::MRM5r:
01123   case X86II::MRM6r: case X86II::MRM7r:
01124     if (HasVEX_4V) // Skip the register dst (which is encoded in VEX_VVVV).
01125       ++CurOp;
01126     EmitByte(BaseOpcode, CurByte, OS);
01127     EmitRegModRMByte(MI.getOperand(CurOp++),
01128                      (TSFlags & X86II::FormMask)-X86II::MRM0r,
01129                      CurByte, OS);
01130     break;
01131   case X86II::MRM0m: case X86II::MRM1m:
01132   case X86II::MRM2m: case X86II::MRM3m:
01133   case X86II::MRM4m: case X86II::MRM5m:
01134   case X86II::MRM6m: case X86II::MRM7m:
01135     if (HasVEX_4V) // Skip the register dst (which is encoded in VEX_VVVV).
01136       ++CurOp;
01137     EmitByte(BaseOpcode, CurByte, OS);
01138     EmitMemModRMByte(MI, CurOp, (TSFlags & X86II::FormMask)-X86II::MRM0m,
01139                      TSFlags, CurByte, OS, Fixups);
01140     CurOp += X86::AddrNumOperands;
01141     break;
01142   case X86II::MRM_C1: case X86II::MRM_C2: case X86II::MRM_C3:
01143   case X86II::MRM_C4: case X86II::MRM_C8: case X86II::MRM_C9:
01144   case X86II::MRM_CA: case X86II::MRM_CB: case X86II::MRM_D0:
01145   case X86II::MRM_D1: case X86II::MRM_D4: case X86II::MRM_D5:
01146   case X86II::MRM_D6: case X86II::MRM_D8: case X86II::MRM_D9:
01147   case X86II::MRM_DA: case X86II::MRM_DB: case X86II::MRM_DC:
01148   case X86II::MRM_DD: case X86II::MRM_DE: case X86II::MRM_DF:
01149   case X86II::MRM_E8: case X86II::MRM_F0: case X86II::MRM_F8:
01150   case X86II::MRM_F9:
01151     EmitByte(BaseOpcode, CurByte, OS);
01152 
01153     unsigned char MRM;
01154     switch (TSFlags & X86II::FormMask) {
01155     default: llvm_unreachable("Invalid Form");
01156     case X86II::MRM_C1: MRM = 0xC1; break;
01157     case X86II::MRM_C2: MRM = 0xC2; break;
01158     case X86II::MRM_C3: MRM = 0xC3; break;
01159     case X86II::MRM_C4: MRM = 0xC4; break;
01160     case X86II::MRM_C8: MRM = 0xC8; break;
01161     case X86II::MRM_C9: MRM = 0xC9; break;
01162     case X86II::MRM_CA: MRM = 0xCA; break;
01163     case X86II::MRM_CB: MRM = 0xCB; break;
01164     case X86II::MRM_D0: MRM = 0xD0; break;
01165     case X86II::MRM_D1: MRM = 0xD1; break;
01166     case X86II::MRM_D4: MRM = 0xD4; break;
01167     case X86II::MRM_D5: MRM = 0xD5; break;
01168     case X86II::MRM_D6: MRM = 0xD6; break;
01169     case X86II::MRM_D8: MRM = 0xD8; break;
01170     case X86II::MRM_D9: MRM = 0xD9; break;
01171     case X86II::MRM_DA: MRM = 0xDA; break;
01172     case X86II::MRM_DB: MRM = 0xDB; break;
01173     case X86II::MRM_DC: MRM = 0xDC; break;
01174     case X86II::MRM_DD: MRM = 0xDD; break;
01175     case X86II::MRM_DE: MRM = 0xDE; break;
01176     case X86II::MRM_DF: MRM = 0xDF; break;
01177     case X86II::MRM_E8: MRM = 0xE8; break;
01178     case X86II::MRM_F0: MRM = 0xF0; break;
01179     case X86II::MRM_F8: MRM = 0xF8; break;
01180     case X86II::MRM_F9: MRM = 0xF9; break;
01181     }
01182     EmitByte(MRM, CurByte, OS);
01183     break;
01184   }
01185 
01186   // If there is a remaining operand, it must be a trailing immediate.  Emit it
01187   // according to the right size for the instruction. Some instructions
01188   // (SSE4a extrq and insertq) have two trailing immediates.
01189   while (CurOp != NumOps && NumOps - CurOp <= 2) {
01190     // The last source register of a 4 operand instruction in AVX is encoded
01191     // in bits[7:4] of a immediate byte.
01192     if ((TSFlags >> X86II::VEXShift) & X86II::VEX_I8IMM) {
01193       const MCOperand &MO = MI.getOperand(HasMemOp4 ? MemOp4_I8IMMOperand
01194                                                     : CurOp);
01195       ++CurOp;
01196       unsigned RegNum = GetX86RegNum(MO) << 4;
01197       if (X86II::isX86_64ExtendedReg(MO.getReg()))
01198         RegNum |= 1 << 7;
01199       // If there is an additional 5th operand it must be an immediate, which
01200       // is encoded in bits[3:0]
01201       if (CurOp != NumOps) {
01202         const MCOperand &MIMM = MI.getOperand(CurOp++);
01203         if (MIMM.isImm()) {
01204           unsigned Val = MIMM.getImm();
01205           assert(Val < 16 && "Immediate operand value out of range");
01206           RegNum |= Val;
01207         }
01208       }
01209       EmitImmediate(MCOperand::CreateImm(RegNum), MI.getLoc(), 1, FK_Data_1,
01210                     CurByte, OS, Fixups);
01211     } else {
01212       unsigned FixupKind;
01213       // FIXME: Is there a better way to know that we need a signed relocation?
01214       if (MI.getOpcode() == X86::ADD64ri32 ||
01215           MI.getOpcode() == X86::MOV64ri32 ||
01216           MI.getOpcode() == X86::MOV64mi32 ||
01217           MI.getOpcode() == X86::PUSH64i32)
01218         FixupKind = X86::reloc_signed_4byte;
01219       else
01220         FixupKind = getImmFixupKind(TSFlags);
01221       EmitImmediate(MI.getOperand(CurOp++), MI.getLoc(),
01222                     X86II::getSizeOfImm(TSFlags), MCFixupKind(FixupKind),
01223                     CurByte, OS, Fixups);
01224     }
01225   }
01226 
01227   if ((TSFlags >> X86II::VEXShift) & X86II::Has3DNow0F0FOpcode)
01228     EmitByte(X86II::getBaseOpcodeFor(TSFlags), CurByte, OS);
01229 
01230 #ifndef NDEBUG
01231   // FIXME: Verify.
01232   if (/*!Desc.isVariadic() &&*/ CurOp != NumOps) {
01233     errs() << "Cannot encode all operands of: ";
01234     MI.dump();
01235     errs() << '\n';
01236     abort();
01237   }
01238 #endif
01239 }