1 //===-- X86MCCodeEmitter.cpp - Convert X86 code to machine code -----------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file implements the X86MCCodeEmitter class.
10 //
11 //===----------------------------------------------------------------------===//
12
13 #include "MCTargetDesc/X86BaseInfo.h"
14 #include "MCTargetDesc/X86FixupKinds.h"
15 #include "MCTargetDesc/X86MCTargetDesc.h"
16 #include "llvm/ADT/SmallVector.h"
17 #include "llvm/MC/MCCodeEmitter.h"
18 #include "llvm/MC/MCContext.h"
19 #include "llvm/MC/MCExpr.h"
20 #include "llvm/MC/MCFixup.h"
21 #include "llvm/MC/MCInst.h"
22 #include "llvm/MC/MCInstrDesc.h"
23 #include "llvm/MC/MCInstrInfo.h"
24 #include "llvm/MC/MCRegisterInfo.h"
25 #include "llvm/MC/MCSubtargetInfo.h"
26 #include "llvm/MC/MCSymbol.h"
27 #include "llvm/Support/Casting.h"
28 #include "llvm/Support/ErrorHandling.h"
29 #include "llvm/Support/raw_ostream.h"
30 #include <cassert>
31 #include <cstdint>
32 #include <cstdlib>
33
34 using namespace llvm;
35
36 #define DEBUG_TYPE "mccodeemitter"
37
38 namespace {
39
40 class X86MCCodeEmitter : public MCCodeEmitter {
41 const MCInstrInfo &MCII;
42 MCContext &Ctx;
43
44 public:
X86MCCodeEmitter(const MCInstrInfo & mcii,MCContext & ctx)45 X86MCCodeEmitter(const MCInstrInfo &mcii, MCContext &ctx)
46 : MCII(mcii), Ctx(ctx) {}
47 X86MCCodeEmitter(const X86MCCodeEmitter &) = delete;
48 X86MCCodeEmitter &operator=(const X86MCCodeEmitter &) = delete;
49 ~X86MCCodeEmitter() override = default;
50
51 void emitPrefix(const MCInst &MI, raw_ostream &OS,
52 const MCSubtargetInfo &STI) const override;
53
54 void encodeInstruction(const MCInst &MI, raw_ostream &OS,
55 SmallVectorImpl<MCFixup> &Fixups,
56 const MCSubtargetInfo &STI) const override;
57
58 private:
59 unsigned getX86RegNum(const MCOperand &MO) const;
60
61 unsigned getX86RegEncoding(const MCInst &MI, unsigned OpNum) const;
62
63 /// \param MI a single low-level machine instruction.
64 /// \param OpNum the operand #.
65 /// \returns true if the OpNumth operand of MI require a bit to be set in
66 /// REX prefix.
67 bool isREXExtendedReg(const MCInst &MI, unsigned OpNum) const;
68
69 void emitImmediate(const MCOperand &Disp, SMLoc Loc, unsigned ImmSize,
70 MCFixupKind FixupKind, uint64_t StartByte, raw_ostream &OS,
71 SmallVectorImpl<MCFixup> &Fixups, int ImmOffset = 0) const;
72
73 void emitRegModRMByte(const MCOperand &ModRMReg, unsigned RegOpcodeFld,
74 raw_ostream &OS) const;
75
76 void emitSIBByte(unsigned SS, unsigned Index, unsigned Base,
77 raw_ostream &OS) const;
78
79 void emitMemModRMByte(const MCInst &MI, unsigned Op, unsigned RegOpcodeField,
80 uint64_t TSFlags, bool HasREX, uint64_t StartByte,
81 raw_ostream &OS, SmallVectorImpl<MCFixup> &Fixups,
82 const MCSubtargetInfo &STI,
83 bool ForceSIB = false) const;
84
85 bool emitPrefixImpl(unsigned &CurOp, const MCInst &MI,
86 const MCSubtargetInfo &STI, raw_ostream &OS) const;
87
88 void emitVEXOpcodePrefix(int MemOperand, const MCInst &MI,
89 raw_ostream &OS) const;
90
91 void emitSegmentOverridePrefix(unsigned SegOperand, const MCInst &MI,
92 raw_ostream &OS) const;
93
94 bool emitOpcodePrefix(int MemOperand, const MCInst &MI,
95 const MCSubtargetInfo &STI, raw_ostream &OS) const;
96
97 bool emitREXPrefix(int MemOperand, const MCInst &MI,
98 const MCSubtargetInfo &STI, raw_ostream &OS) const;
99 };
100
101 } // end anonymous namespace
102
modRMByte(unsigned Mod,unsigned RegOpcode,unsigned RM)103 static uint8_t modRMByte(unsigned Mod, unsigned RegOpcode, unsigned RM) {
104 assert(Mod < 4 && RegOpcode < 8 && RM < 8 && "ModRM Fields out of range!");
105 return RM | (RegOpcode << 3) | (Mod << 6);
106 }
107
emitByte(uint8_t C,raw_ostream & OS)108 static void emitByte(uint8_t C, raw_ostream &OS) { OS << static_cast<char>(C); }
109
emitConstant(uint64_t Val,unsigned Size,raw_ostream & OS)110 static void emitConstant(uint64_t Val, unsigned Size, raw_ostream &OS) {
111 // Output the constant in little endian byte order.
112 for (unsigned i = 0; i != Size; ++i) {
113 emitByte(Val & 255, OS);
114 Val >>= 8;
115 }
116 }
117
118 /// Determine if this immediate can fit in a disp8 or a compressed disp8 for
119 /// EVEX instructions. \p will be set to the value to pass to the ImmOffset
120 /// parameter of emitImmediate.
isDispOrCDisp8(uint64_t TSFlags,int Value,int & ImmOffset)121 static bool isDispOrCDisp8(uint64_t TSFlags, int Value, int &ImmOffset) {
122 bool HasEVEX = (TSFlags & X86II::EncodingMask) == X86II::EVEX;
123
124 int CD8_Scale =
125 (TSFlags & X86II::CD8_Scale_Mask) >> X86II::CD8_Scale_Shift;
126 if (!HasEVEX || CD8_Scale == 0)
127 return isInt<8>(Value);
128
129 assert(isPowerOf2_32(CD8_Scale) && "Unexpected CD8 scale!");
130 if (Value & (CD8_Scale - 1)) // Unaligned offset
131 return false;
132
133 int CDisp8 = Value / CD8_Scale;
134 if (!isInt<8>(CDisp8))
135 return false;
136
137 // ImmOffset will be added to Value in emitImmediate leaving just CDisp8.
138 ImmOffset = CDisp8 - Value;
139 return true;
140 }
141
142 /// \returns the appropriate fixup kind to use for an immediate in an
143 /// instruction with the specified TSFlags.
getImmFixupKind(uint64_t TSFlags)144 static MCFixupKind getImmFixupKind(uint64_t TSFlags) {
145 unsigned Size = X86II::getSizeOfImm(TSFlags);
146 bool isPCRel = X86II::isImmPCRel(TSFlags);
147
148 if (X86II::isImmSigned(TSFlags)) {
149 switch (Size) {
150 default:
151 llvm_unreachable("Unsupported signed fixup size!");
152 case 4:
153 return MCFixupKind(X86::reloc_signed_4byte);
154 }
155 }
156 return MCFixup::getKindForSize(Size, isPCRel);
157 }
158
159 enum GlobalOffsetTableExprKind { GOT_None, GOT_Normal, GOT_SymDiff };
160
161 /// Check if this expression starts with _GLOBAL_OFFSET_TABLE_ and if it is
162 /// of the form _GLOBAL_OFFSET_TABLE_-symbol. This is needed to support PIC on
163 /// ELF i386 as _GLOBAL_OFFSET_TABLE_ is magical. We check only simple case that
164 /// are know to be used: _GLOBAL_OFFSET_TABLE_ by itself or at the start of a
165 /// binary expression.
166 static GlobalOffsetTableExprKind
startsWithGlobalOffsetTable(const MCExpr * Expr)167 startsWithGlobalOffsetTable(const MCExpr *Expr) {
168 const MCExpr *RHS = nullptr;
169 if (Expr->getKind() == MCExpr::Binary) {
170 const MCBinaryExpr *BE = static_cast<const MCBinaryExpr *>(Expr);
171 Expr = BE->getLHS();
172 RHS = BE->getRHS();
173 }
174
175 if (Expr->getKind() != MCExpr::SymbolRef)
176 return GOT_None;
177
178 const MCSymbolRefExpr *Ref = static_cast<const MCSymbolRefExpr *>(Expr);
179 const MCSymbol &S = Ref->getSymbol();
180 if (S.getName() != "_GLOBAL_OFFSET_TABLE_")
181 return GOT_None;
182 if (RHS && RHS->getKind() == MCExpr::SymbolRef)
183 return GOT_SymDiff;
184 return GOT_Normal;
185 }
186
hasSecRelSymbolRef(const MCExpr * Expr)187 static bool hasSecRelSymbolRef(const MCExpr *Expr) {
188 if (Expr->getKind() == MCExpr::SymbolRef) {
189 const MCSymbolRefExpr *Ref = static_cast<const MCSymbolRefExpr *>(Expr);
190 return Ref->getKind() == MCSymbolRefExpr::VK_SECREL;
191 }
192 return false;
193 }
194
isPCRel32Branch(const MCInst & MI,const MCInstrInfo & MCII)195 static bool isPCRel32Branch(const MCInst &MI, const MCInstrInfo &MCII) {
196 unsigned Opcode = MI.getOpcode();
197 const MCInstrDesc &Desc = MCII.get(Opcode);
198 if ((Opcode != X86::CALL64pcrel32 && Opcode != X86::JMP_4 &&
199 Opcode != X86::JCC_4) ||
200 getImmFixupKind(Desc.TSFlags) != FK_PCRel_4)
201 return false;
202
203 unsigned CurOp = X86II::getOperandBias(Desc);
204 const MCOperand &Op = MI.getOperand(CurOp);
205 if (!Op.isExpr())
206 return false;
207
208 const MCSymbolRefExpr *Ref = dyn_cast<MCSymbolRefExpr>(Op.getExpr());
209 return Ref && Ref->getKind() == MCSymbolRefExpr::VK_None;
210 }
211
getX86RegNum(const MCOperand & MO) const212 unsigned X86MCCodeEmitter::getX86RegNum(const MCOperand &MO) const {
213 return Ctx.getRegisterInfo()->getEncodingValue(MO.getReg()) & 0x7;
214 }
215
getX86RegEncoding(const MCInst & MI,unsigned OpNum) const216 unsigned X86MCCodeEmitter::getX86RegEncoding(const MCInst &MI,
217 unsigned OpNum) const {
218 return Ctx.getRegisterInfo()->getEncodingValue(MI.getOperand(OpNum).getReg());
219 }
220
221 /// \param MI a single low-level machine instruction.
222 /// \param OpNum the operand #.
223 /// \returns true if the OpNumth operand of MI require a bit to be set in
224 /// REX prefix.
isREXExtendedReg(const MCInst & MI,unsigned OpNum) const225 bool X86MCCodeEmitter::isREXExtendedReg(const MCInst &MI,
226 unsigned OpNum) const {
227 return (getX86RegEncoding(MI, OpNum) >> 3) & 1;
228 }
229
emitImmediate(const MCOperand & DispOp,SMLoc Loc,unsigned Size,MCFixupKind FixupKind,uint64_t StartByte,raw_ostream & OS,SmallVectorImpl<MCFixup> & Fixups,int ImmOffset) const230 void X86MCCodeEmitter::emitImmediate(const MCOperand &DispOp, SMLoc Loc,
231 unsigned Size, MCFixupKind FixupKind,
232 uint64_t StartByte, raw_ostream &OS,
233 SmallVectorImpl<MCFixup> &Fixups,
234 int ImmOffset) const {
235 const MCExpr *Expr = nullptr;
236 if (DispOp.isImm()) {
237 // If this is a simple integer displacement that doesn't require a
238 // relocation, emit it now.
239 if (FixupKind != FK_PCRel_1 && FixupKind != FK_PCRel_2 &&
240 FixupKind != FK_PCRel_4) {
241 emitConstant(DispOp.getImm() + ImmOffset, Size, OS);
242 return;
243 }
244 Expr = MCConstantExpr::create(DispOp.getImm(), Ctx);
245 } else {
246 Expr = DispOp.getExpr();
247 }
248
249 // If we have an immoffset, add it to the expression.
250 if ((FixupKind == FK_Data_4 || FixupKind == FK_Data_8 ||
251 FixupKind == MCFixupKind(X86::reloc_signed_4byte))) {
252 GlobalOffsetTableExprKind Kind = startsWithGlobalOffsetTable(Expr);
253 if (Kind != GOT_None) {
254 assert(ImmOffset == 0);
255
256 if (Size == 8) {
257 FixupKind = MCFixupKind(X86::reloc_global_offset_table8);
258 } else {
259 assert(Size == 4);
260 FixupKind = MCFixupKind(X86::reloc_global_offset_table);
261 }
262
263 if (Kind == GOT_Normal)
264 ImmOffset = static_cast<int>(OS.tell() - StartByte);
265 } else if (Expr->getKind() == MCExpr::SymbolRef) {
266 if (hasSecRelSymbolRef(Expr)) {
267 FixupKind = MCFixupKind(FK_SecRel_4);
268 }
269 } else if (Expr->getKind() == MCExpr::Binary) {
270 const MCBinaryExpr *Bin = static_cast<const MCBinaryExpr *>(Expr);
271 if (hasSecRelSymbolRef(Bin->getLHS()) ||
272 hasSecRelSymbolRef(Bin->getRHS())) {
273 FixupKind = MCFixupKind(FK_SecRel_4);
274 }
275 }
276 }
277
278 // If the fixup is pc-relative, we need to bias the value to be relative to
279 // the start of the field, not the end of the field.
280 if (FixupKind == FK_PCRel_4 ||
281 FixupKind == MCFixupKind(X86::reloc_riprel_4byte) ||
282 FixupKind == MCFixupKind(X86::reloc_riprel_4byte_movq_load) ||
283 FixupKind == MCFixupKind(X86::reloc_riprel_4byte_relax) ||
284 FixupKind == MCFixupKind(X86::reloc_riprel_4byte_relax_rex) ||
285 FixupKind == MCFixupKind(X86::reloc_branch_4byte_pcrel)) {
286 ImmOffset -= 4;
287 // If this is a pc-relative load off _GLOBAL_OFFSET_TABLE_:
288 // leaq _GLOBAL_OFFSET_TABLE_(%rip), %r15
289 // this needs to be a GOTPC32 relocation.
290 if (startsWithGlobalOffsetTable(Expr) != GOT_None)
291 FixupKind = MCFixupKind(X86::reloc_global_offset_table);
292 }
293 if (FixupKind == FK_PCRel_2)
294 ImmOffset -= 2;
295 if (FixupKind == FK_PCRel_1)
296 ImmOffset -= 1;
297
298 if (ImmOffset)
299 Expr = MCBinaryExpr::createAdd(Expr, MCConstantExpr::create(ImmOffset, Ctx),
300 Ctx);
301
302 // Emit a symbolic constant as a fixup and 4 zeros.
303 Fixups.push_back(MCFixup::create(static_cast<uint32_t>(OS.tell() - StartByte),
304 Expr, FixupKind, Loc));
305 emitConstant(0, Size, OS);
306 }
307
emitRegModRMByte(const MCOperand & ModRMReg,unsigned RegOpcodeFld,raw_ostream & OS) const308 void X86MCCodeEmitter::emitRegModRMByte(const MCOperand &ModRMReg,
309 unsigned RegOpcodeFld,
310 raw_ostream &OS) const {
311 emitByte(modRMByte(3, RegOpcodeFld, getX86RegNum(ModRMReg)), OS);
312 }
313
emitSIBByte(unsigned SS,unsigned Index,unsigned Base,raw_ostream & OS) const314 void X86MCCodeEmitter::emitSIBByte(unsigned SS, unsigned Index, unsigned Base,
315 raw_ostream &OS) const {
316 // SIB byte is in the same format as the modRMByte.
317 emitByte(modRMByte(SS, Index, Base), OS);
318 }
319
emitMemModRMByte(const MCInst & MI,unsigned Op,unsigned RegOpcodeField,uint64_t TSFlags,bool HasREX,uint64_t StartByte,raw_ostream & OS,SmallVectorImpl<MCFixup> & Fixups,const MCSubtargetInfo & STI,bool ForceSIB) const320 void X86MCCodeEmitter::emitMemModRMByte(const MCInst &MI, unsigned Op,
321 unsigned RegOpcodeField,
322 uint64_t TSFlags, bool HasREX,
323 uint64_t StartByte, raw_ostream &OS,
324 SmallVectorImpl<MCFixup> &Fixups,
325 const MCSubtargetInfo &STI,
326 bool ForceSIB) const {
327 const MCOperand &Disp = MI.getOperand(Op + X86::AddrDisp);
328 const MCOperand &Base = MI.getOperand(Op + X86::AddrBaseReg);
329 const MCOperand &Scale = MI.getOperand(Op + X86::AddrScaleAmt);
330 const MCOperand &IndexReg = MI.getOperand(Op + X86::AddrIndexReg);
331 unsigned BaseReg = Base.getReg();
332
333 // Handle %rip relative addressing.
334 if (BaseReg == X86::RIP ||
335 BaseReg == X86::EIP) { // [disp32+rIP] in X86-64 mode
336 assert(STI.hasFeature(X86::Is64Bit) &&
337 "Rip-relative addressing requires 64-bit mode");
338 assert(IndexReg.getReg() == 0 && !ForceSIB &&
339 "Invalid rip-relative address");
340 emitByte(modRMByte(0, RegOpcodeField, 5), OS);
341
342 unsigned Opcode = MI.getOpcode();
343 unsigned FixupKind = [&]() {
344 // Enable relaxed relocation only for a MCSymbolRefExpr. We cannot use a
345 // relaxed relocation if an offset is present (e.g. x@GOTPCREL+4).
346 if (!(Disp.isExpr() && isa<MCSymbolRefExpr>(Disp.getExpr())))
347 return X86::reloc_riprel_4byte;
348
349 // Certain loads for GOT references can be relocated against the symbol
350 // directly if the symbol ends up in the same linkage unit.
351 switch (Opcode) {
352 default:
353 return X86::reloc_riprel_4byte;
354 case X86::MOV64rm:
355 // movq loads is a subset of reloc_riprel_4byte_relax_rex. It is a
356 // special case because COFF and Mach-O don't support ELF's more
357 // flexible R_X86_64_REX_GOTPCRELX relaxation.
358 assert(HasREX);
359 return X86::reloc_riprel_4byte_movq_load;
360 case X86::ADC32rm:
361 case X86::ADD32rm:
362 case X86::AND32rm:
363 case X86::CMP32rm:
364 case X86::MOV32rm:
365 case X86::OR32rm:
366 case X86::SBB32rm:
367 case X86::SUB32rm:
368 case X86::TEST32mr:
369 case X86::XOR32rm:
370 case X86::CALL64m:
371 case X86::JMP64m:
372 case X86::TAILJMPm64:
373 case X86::TEST64mr:
374 case X86::ADC64rm:
375 case X86::ADD64rm:
376 case X86::AND64rm:
377 case X86::CMP64rm:
378 case X86::OR64rm:
379 case X86::SBB64rm:
380 case X86::SUB64rm:
381 case X86::XOR64rm:
382 return HasREX ? X86::reloc_riprel_4byte_relax_rex
383 : X86::reloc_riprel_4byte_relax;
384 }
385 }();
386
387 // rip-relative addressing is actually relative to the *next* instruction.
388 // Since an immediate can follow the mod/rm byte for an instruction, this
389 // means that we need to bias the displacement field of the instruction with
390 // the size of the immediate field. If we have this case, add it into the
391 // expression to emit.
392 // Note: rip-relative addressing using immediate displacement values should
393 // not be adjusted, assuming it was the user's intent.
394 int ImmSize = !Disp.isImm() && X86II::hasImm(TSFlags)
395 ? X86II::getSizeOfImm(TSFlags)
396 : 0;
397
398 emitImmediate(Disp, MI.getLoc(), 4, MCFixupKind(FixupKind), StartByte, OS,
399 Fixups, -ImmSize);
400 return;
401 }
402
403 unsigned BaseRegNo = BaseReg ? getX86RegNum(Base) : -1U;
404
405 // 16-bit addressing forms of the ModR/M byte have a different encoding for
406 // the R/M field and are far more limited in which registers can be used.
407 if (X86_MC::is16BitMemOperand(MI, Op, STI)) {
408 if (BaseReg) {
409 // For 32-bit addressing, the row and column values in Table 2-2 are
410 // basically the same. It's AX/CX/DX/BX/SP/BP/SI/DI in that order, with
411 // some special cases. And getX86RegNum reflects that numbering.
412 // For 16-bit addressing it's more fun, as shown in the SDM Vol 2A,
413 // Table 2-1 "16-Bit Addressing Forms with the ModR/M byte". We can only
414 // use SI/DI/BP/BX, which have "row" values 4-7 in no particular order,
415 // while values 0-3 indicate the allowed combinations (base+index) of
416 // those: 0 for BX+SI, 1 for BX+DI, 2 for BP+SI, 3 for BP+DI.
417 //
418 // R16Table[] is a lookup from the normal RegNo, to the row values from
419 // Table 2-1 for 16-bit addressing modes. Where zero means disallowed.
420 static const unsigned R16Table[] = {0, 0, 0, 7, 0, 6, 4, 5};
421 unsigned RMfield = R16Table[BaseRegNo];
422
423 assert(RMfield && "invalid 16-bit base register");
424
425 if (IndexReg.getReg()) {
426 unsigned IndexReg16 = R16Table[getX86RegNum(IndexReg)];
427
428 assert(IndexReg16 && "invalid 16-bit index register");
429 // We must have one of SI/DI (4,5), and one of BP/BX (6,7).
430 assert(((IndexReg16 ^ RMfield) & 2) &&
431 "invalid 16-bit base/index register combination");
432 assert(Scale.getImm() == 1 &&
433 "invalid scale for 16-bit memory reference");
434
435 // Allow base/index to appear in either order (although GAS doesn't).
436 if (IndexReg16 & 2)
437 RMfield = (RMfield & 1) | ((7 - IndexReg16) << 1);
438 else
439 RMfield = (IndexReg16 & 1) | ((7 - RMfield) << 1);
440 }
441
442 if (Disp.isImm() && isInt<8>(Disp.getImm())) {
443 if (Disp.getImm() == 0 && RMfield != 6) {
444 // There is no displacement; just the register.
445 emitByte(modRMByte(0, RegOpcodeField, RMfield), OS);
446 return;
447 }
448 // Use the [REG]+disp8 form, including for [BP] which cannot be encoded.
449 emitByte(modRMByte(1, RegOpcodeField, RMfield), OS);
450 emitImmediate(Disp, MI.getLoc(), 1, FK_Data_1, StartByte, OS, Fixups);
451 return;
452 }
453 // This is the [REG]+disp16 case.
454 emitByte(modRMByte(2, RegOpcodeField, RMfield), OS);
455 } else {
456 assert(IndexReg.getReg() == 0 && "Unexpected index register!");
457 // There is no BaseReg; this is the plain [disp16] case.
458 emitByte(modRMByte(0, RegOpcodeField, 6), OS);
459 }
460
461 // Emit 16-bit displacement for plain disp16 or [REG]+disp16 cases.
462 emitImmediate(Disp, MI.getLoc(), 2, FK_Data_2, StartByte, OS, Fixups);
463 return;
464 }
465
466 // Check for presence of {disp8} or {disp32} pseudo prefixes.
467 bool UseDisp8 = MI.getFlags() & X86::IP_USE_DISP8;
468 bool UseDisp32 = MI.getFlags() & X86::IP_USE_DISP32;
469
470 // We only allow no displacement if no pseudo prefix is present.
471 bool AllowNoDisp = !UseDisp8 && !UseDisp32;
472 // Disp8 is allowed unless the {disp32} prefix is present.
473 bool AllowDisp8 = !UseDisp32;
474
475 // Determine whether a SIB byte is needed.
476 if (// The SIB byte must be used if there is an index register or the
477 // encoding requires a SIB byte.
478 !ForceSIB && IndexReg.getReg() == 0 &&
479 // The SIB byte must be used if the base is ESP/RSP/R12, all of which
480 // encode to an R/M value of 4, which indicates that a SIB byte is
481 // present.
482 BaseRegNo != N86::ESP &&
483 // If there is no base register and we're in 64-bit mode, we need a SIB
484 // byte to emit an addr that is just 'disp32' (the non-RIP relative form).
485 (!STI.hasFeature(X86::Is64Bit) || BaseReg != 0)) {
486
487 if (BaseReg == 0) { // [disp32] in X86-32 mode
488 emitByte(modRMByte(0, RegOpcodeField, 5), OS);
489 emitImmediate(Disp, MI.getLoc(), 4, FK_Data_4, StartByte, OS, Fixups);
490 return;
491 }
492
493 // If the base is not EBP/ESP/R12/R13 and there is no displacement, use
494 // simple indirect register encoding, this handles addresses like [EAX].
495 // The encoding for [EBP] or[R13] with no displacement means [disp32] so we
496 // handle it by emitting a displacement of 0 later.
497 if (BaseRegNo != N86::EBP) {
498 if (Disp.isImm() && Disp.getImm() == 0 && AllowNoDisp) {
499 emitByte(modRMByte(0, RegOpcodeField, BaseRegNo), OS);
500 return;
501 }
502
503 // If the displacement is @tlscall, treat it as a zero.
504 if (Disp.isExpr()) {
505 auto *Sym = dyn_cast<MCSymbolRefExpr>(Disp.getExpr());
506 if (Sym && Sym->getKind() == MCSymbolRefExpr::VK_TLSCALL) {
507 // This is exclusively used by call *a@tlscall(base). The relocation
508 // (R_386_TLSCALL or R_X86_64_TLSCALL) applies to the beginning.
509 Fixups.push_back(MCFixup::create(0, Sym, FK_NONE, MI.getLoc()));
510 emitByte(modRMByte(0, RegOpcodeField, BaseRegNo), OS);
511 return;
512 }
513 }
514 }
515
516 // Otherwise, if the displacement fits in a byte, encode as [REG+disp8].
517 // Including a compressed disp8 for EVEX instructions that support it.
518 // This also handles the 0 displacement for [EBP] or [R13]. We can't use
519 // disp8 if the {disp32} pseudo prefix is present.
520 if (Disp.isImm() && AllowDisp8) {
521 int ImmOffset = 0;
522 if (isDispOrCDisp8(TSFlags, Disp.getImm(), ImmOffset)) {
523 emitByte(modRMByte(1, RegOpcodeField, BaseRegNo), OS);
524 emitImmediate(Disp, MI.getLoc(), 1, FK_Data_1, StartByte, OS, Fixups,
525 ImmOffset);
526 return;
527 }
528 }
529
530 // Otherwise, emit the most general non-SIB encoding: [REG+disp32].
531 // Displacement may be 0 for [EBP] or [R13] case if {disp32} pseudo prefix
532 // prevented using disp8 above.
533 emitByte(modRMByte(2, RegOpcodeField, BaseRegNo), OS);
534 unsigned Opcode = MI.getOpcode();
535 unsigned FixupKind = Opcode == X86::MOV32rm ? X86::reloc_signed_4byte_relax
536 : X86::reloc_signed_4byte;
537 emitImmediate(Disp, MI.getLoc(), 4, MCFixupKind(FixupKind), StartByte, OS,
538 Fixups);
539 return;
540 }
541
542 // We need a SIB byte, so start by outputting the ModR/M byte first
543 assert(IndexReg.getReg() != X86::ESP && IndexReg.getReg() != X86::RSP &&
544 "Cannot use ESP as index reg!");
545
546 bool ForceDisp32 = false;
547 bool ForceDisp8 = false;
548 int ImmOffset = 0;
549 if (BaseReg == 0) {
550 // If there is no base register, we emit the special case SIB byte with
551 // MOD=0, BASE=5, to JUST get the index, scale, and displacement.
552 BaseRegNo = 5;
553 emitByte(modRMByte(0, RegOpcodeField, 4), OS);
554 ForceDisp32 = true;
555 } else if (Disp.isImm() && Disp.getImm() == 0 && AllowNoDisp &&
556 // Base reg can't be EBP/RBP/R13 as that would end up with '5' as
557 // the base field, but that is the magic [*] nomenclature that
558 // indicates no base when mod=0. For these cases we'll emit a 0
559 // displacement instead.
560 BaseRegNo != N86::EBP) {
561 // Emit no displacement ModR/M byte
562 emitByte(modRMByte(0, RegOpcodeField, 4), OS);
563 } else if (Disp.isImm() && AllowDisp8 &&
564 isDispOrCDisp8(TSFlags, Disp.getImm(), ImmOffset)) {
565 // Displacement fits in a byte or matches an EVEX compressed disp8, use
566 // disp8 encoding. This also handles EBP/R13 base with 0 displacement unless
567 // {disp32} pseudo prefix was used.
568 emitByte(modRMByte(1, RegOpcodeField, 4), OS);
569 ForceDisp8 = true;
570 } else {
571 // Otherwise, emit the normal disp32 encoding.
572 emitByte(modRMByte(2, RegOpcodeField, 4), OS);
573 ForceDisp32 = true;
574 }
575
576 // Calculate what the SS field value should be...
577 static const unsigned SSTable[] = {~0U, 0, 1, ~0U, 2, ~0U, ~0U, ~0U, 3};
578 unsigned SS = SSTable[Scale.getImm()];
579
580 unsigned IndexRegNo = IndexReg.getReg() ? getX86RegNum(IndexReg) : 4;
581
582 emitSIBByte(SS, IndexRegNo, BaseRegNo, OS);
583
584 // Do we need to output a displacement?
585 if (ForceDisp8)
586 emitImmediate(Disp, MI.getLoc(), 1, FK_Data_1, StartByte, OS, Fixups,
587 ImmOffset);
588 else if (ForceDisp32)
589 emitImmediate(Disp, MI.getLoc(), 4, MCFixupKind(X86::reloc_signed_4byte),
590 StartByte, OS, Fixups);
591 }
592
593 /// Emit all instruction prefixes.
594 ///
595 /// \returns true if REX prefix is used, otherwise returns false.
emitPrefixImpl(unsigned & CurOp,const MCInst & MI,const MCSubtargetInfo & STI,raw_ostream & OS) const596 bool X86MCCodeEmitter::emitPrefixImpl(unsigned &CurOp, const MCInst &MI,
597 const MCSubtargetInfo &STI,
598 raw_ostream &OS) const {
599 uint64_t TSFlags = MCII.get(MI.getOpcode()).TSFlags;
600 // Determine where the memory operand starts, if present.
601 int MemoryOperand = X86II::getMemoryOperandNo(TSFlags);
602 // Emit segment override opcode prefix as needed.
603 if (MemoryOperand != -1) {
604 MemoryOperand += CurOp;
605 emitSegmentOverridePrefix(MemoryOperand + X86::AddrSegmentReg, MI, OS);
606 }
607
608 // Emit the repeat opcode prefix as needed.
609 unsigned Flags = MI.getFlags();
610 if (TSFlags & X86II::REP || Flags & X86::IP_HAS_REPEAT)
611 emitByte(0xF3, OS);
612 if (Flags & X86::IP_HAS_REPEAT_NE)
613 emitByte(0xF2, OS);
614
615 // Emit the address size opcode prefix as needed.
616 if (X86_MC::needsAddressSizeOverride(MI, STI, MemoryOperand, TSFlags) ||
617 Flags & X86::IP_HAS_AD_SIZE)
618 emitByte(0x67, OS);
619
620 uint64_t Form = TSFlags & X86II::FormMask;
621 switch (Form) {
622 default:
623 break;
624 case X86II::RawFrmDstSrc: {
625 // Emit segment override opcode prefix as needed (not for %ds).
626 if (MI.getOperand(2).getReg() != X86::DS)
627 emitSegmentOverridePrefix(2, MI, OS);
628 CurOp += 3; // Consume operands.
629 break;
630 }
631 case X86II::RawFrmSrc: {
632 // Emit segment override opcode prefix as needed (not for %ds).
633 if (MI.getOperand(1).getReg() != X86::DS)
634 emitSegmentOverridePrefix(1, MI, OS);
635 CurOp += 2; // Consume operands.
636 break;
637 }
638 case X86II::RawFrmDst: {
639 ++CurOp; // Consume operand.
640 break;
641 }
642 case X86II::RawFrmMemOffs: {
643 // Emit segment override opcode prefix as needed.
644 emitSegmentOverridePrefix(1, MI, OS);
645 break;
646 }
647 }
648
649 // REX prefix is optional, but if used must be immediately before the opcode
650 // Encoding type for this instruction.
651 uint64_t Encoding = TSFlags & X86II::EncodingMask;
652 bool HasREX = false;
653 if (Encoding)
654 emitVEXOpcodePrefix(MemoryOperand, MI, OS);
655 else
656 HasREX = emitOpcodePrefix(MemoryOperand, MI, STI, OS);
657
658 return HasREX;
659 }
660
661 /// AVX instructions are encoded using a opcode prefix called VEX.
emitVEXOpcodePrefix(int MemOperand,const MCInst & MI,raw_ostream & OS) const662 void X86MCCodeEmitter::emitVEXOpcodePrefix(int MemOperand, const MCInst &MI,
663 raw_ostream &OS) const {
664 const MCInstrDesc &Desc = MCII.get(MI.getOpcode());
665 uint64_t TSFlags = Desc.TSFlags;
666
667 assert(!(TSFlags & X86II::LOCK) && "Can't have LOCK VEX.");
668
669 uint64_t Encoding = TSFlags & X86II::EncodingMask;
670 bool HasEVEX_K = TSFlags & X86II::EVEX_K;
671 bool HasVEX_4V = TSFlags & X86II::VEX_4V;
672 bool HasEVEX_RC = TSFlags & X86II::EVEX_RC;
673
674 // VEX_R: opcode externsion equivalent to REX.R in
675 // 1's complement (inverted) form
676 //
677 // 1: Same as REX_R=0 (must be 1 in 32-bit mode)
678 // 0: Same as REX_R=1 (64 bit mode only)
679 //
680 uint8_t VEX_R = 0x1;
681 uint8_t EVEX_R2 = 0x1;
682
683 // VEX_X: equivalent to REX.X, only used when a
684 // register is used for index in SIB Byte.
685 //
686 // 1: Same as REX.X=0 (must be 1 in 32-bit mode)
687 // 0: Same as REX.X=1 (64-bit mode only)
688 uint8_t VEX_X = 0x1;
689
690 // VEX_B:
691 //
692 // 1: Same as REX_B=0 (ignored in 32-bit mode)
693 // 0: Same as REX_B=1 (64 bit mode only)
694 //
695 uint8_t VEX_B = 0x1;
696
697 // VEX_W: opcode specific (use like REX.W, or used for
698 // opcode extension, or ignored, depending on the opcode byte)
699 uint8_t VEX_W = (TSFlags & X86II::VEX_W) ? 1 : 0;
700
701 // VEX_5M (VEX m-mmmmm field):
702 //
703 // 0b00000: Reserved for future use
704 // 0b00001: implied 0F leading opcode
705 // 0b00010: implied 0F 38 leading opcode bytes
706 // 0b00011: implied 0F 3A leading opcode bytes
707 // 0b00100: Reserved for future use
708 // 0b00101: VEX MAP5
709 // 0b00110: VEX MAP6
710 // 0b00111-0b11111: Reserved for future use
711 // 0b01000: XOP map select - 08h instructions with imm byte
712 // 0b01001: XOP map select - 09h instructions with no imm byte
713 // 0b01010: XOP map select - 0Ah instructions with imm dword
714 uint8_t VEX_5M;
715 switch (TSFlags & X86II::OpMapMask) {
716 default:
717 llvm_unreachable("Invalid prefix!");
718 case X86II::TB:
719 VEX_5M = 0x1;
720 break; // 0F
721 case X86II::T8:
722 VEX_5M = 0x2;
723 break; // 0F 38
724 case X86II::TA:
725 VEX_5M = 0x3;
726 break; // 0F 3A
727 case X86II::XOP8:
728 VEX_5M = 0x8;
729 break;
730 case X86II::XOP9:
731 VEX_5M = 0x9;
732 break;
733 case X86II::XOPA:
734 VEX_5M = 0xA;
735 break;
736 case X86II::T_MAP5:
737 VEX_5M = 0x5;
738 break;
739 case X86II::T_MAP6:
740 VEX_5M = 0x6;
741 break;
742 }
743
744 // VEX_4V (VEX vvvv field): a register specifier
745 // (in 1's complement form) or 1111 if unused.
746 uint8_t VEX_4V = 0xf;
747 uint8_t EVEX_V2 = 0x1;
748
749 // EVEX_L2/VEX_L (Vector Length):
750 //
751 // L2 L
752 // 0 0: scalar or 128-bit vector
753 // 0 1: 256-bit vector
754 // 1 0: 512-bit vector
755 //
756 uint8_t VEX_L = (TSFlags & X86II::VEX_L) ? 1 : 0;
757 uint8_t EVEX_L2 = (TSFlags & X86II::EVEX_L2) ? 1 : 0;
758
759 // VEX_PP: opcode extension providing equivalent
760 // functionality of a SIMD prefix
761 //
762 // 0b00: None
763 // 0b01: 66
764 // 0b10: F3
765 // 0b11: F2
766 //
767 uint8_t VEX_PP = 0;
768 switch (TSFlags & X86II::OpPrefixMask) {
769 case X86II::PD:
770 VEX_PP = 0x1;
771 break; // 66
772 case X86II::XS:
773 VEX_PP = 0x2;
774 break; // F3
775 case X86II::XD:
776 VEX_PP = 0x3;
777 break; // F2
778 }
779
780 // EVEX_U
781 uint8_t EVEX_U = 1; // Always '1' so far
782
783 // EVEX_z
784 uint8_t EVEX_z = (HasEVEX_K && (TSFlags & X86II::EVEX_Z)) ? 1 : 0;
785
786 // EVEX_b
787 uint8_t EVEX_b = (TSFlags & X86II::EVEX_B) ? 1 : 0;
788
789 // EVEX_rc
790 uint8_t EVEX_rc = 0;
791
792 // EVEX_aaa
793 uint8_t EVEX_aaa = 0;
794
795 bool EncodeRC = false;
796
797 // Classify VEX_B, VEX_4V, VEX_R, VEX_X
798 unsigned NumOps = Desc.getNumOperands();
799 unsigned CurOp = X86II::getOperandBias(Desc);
800
801 switch (TSFlags & X86II::FormMask) {
802 default:
803 llvm_unreachable("Unexpected form in emitVEXOpcodePrefix!");
804 case X86II::MRM_C0:
805 case X86II::RawFrm:
806 case X86II::PrefixByte:
807 break;
808 case X86II::MRMDestMemFSIB:
809 case X86II::MRMDestMem: {
810 // MRMDestMem instructions forms:
811 // MemAddr, src1(ModR/M)
812 // MemAddr, src1(VEX_4V), src2(ModR/M)
813 // MemAddr, src1(ModR/M), imm8
814 //
815 unsigned BaseRegEnc = getX86RegEncoding(MI, MemOperand + X86::AddrBaseReg);
816 VEX_B = ~(BaseRegEnc >> 3) & 1;
817 unsigned IndexRegEnc =
818 getX86RegEncoding(MI, MemOperand + X86::AddrIndexReg);
819 VEX_X = ~(IndexRegEnc >> 3) & 1;
820 if (!HasVEX_4V) // Only needed with VSIB which don't use VVVV.
821 EVEX_V2 = ~(IndexRegEnc >> 4) & 1;
822
823 CurOp += X86::AddrNumOperands;
824
825 if (HasEVEX_K)
826 EVEX_aaa = getX86RegEncoding(MI, CurOp++);
827
828 if (HasVEX_4V) {
829 unsigned VRegEnc = getX86RegEncoding(MI, CurOp++);
830 VEX_4V = ~VRegEnc & 0xf;
831 EVEX_V2 = ~(VRegEnc >> 4) & 1;
832 }
833
834 unsigned RegEnc = getX86RegEncoding(MI, CurOp++);
835 VEX_R = ~(RegEnc >> 3) & 1;
836 EVEX_R2 = ~(RegEnc >> 4) & 1;
837 break;
838 }
839 case X86II::MRMSrcMemFSIB:
840 case X86II::MRMSrcMem: {
841 // MRMSrcMem instructions forms:
842 // src1(ModR/M), MemAddr
843 // src1(ModR/M), src2(VEX_4V), MemAddr
844 // src1(ModR/M), MemAddr, imm8
845 // src1(ModR/M), MemAddr, src2(Imm[7:4])
846 //
847 // FMA4:
848 // dst(ModR/M.reg), src1(VEX_4V), src2(ModR/M), src3(Imm[7:4])
849 unsigned RegEnc = getX86RegEncoding(MI, CurOp++);
850 VEX_R = ~(RegEnc >> 3) & 1;
851 EVEX_R2 = ~(RegEnc >> 4) & 1;
852
853 if (HasEVEX_K)
854 EVEX_aaa = getX86RegEncoding(MI, CurOp++);
855
856 if (HasVEX_4V) {
857 unsigned VRegEnc = getX86RegEncoding(MI, CurOp++);
858 VEX_4V = ~VRegEnc & 0xf;
859 EVEX_V2 = ~(VRegEnc >> 4) & 1;
860 }
861
862 unsigned BaseRegEnc = getX86RegEncoding(MI, MemOperand + X86::AddrBaseReg);
863 VEX_B = ~(BaseRegEnc >> 3) & 1;
864 unsigned IndexRegEnc =
865 getX86RegEncoding(MI, MemOperand + X86::AddrIndexReg);
866 VEX_X = ~(IndexRegEnc >> 3) & 1;
867 if (!HasVEX_4V) // Only needed with VSIB which don't use VVVV.
868 EVEX_V2 = ~(IndexRegEnc >> 4) & 1;
869
870 break;
871 }
872 case X86II::MRMSrcMem4VOp3: {
873 // Instruction format for 4VOp3:
874 // src1(ModR/M), MemAddr, src3(VEX_4V)
875 unsigned RegEnc = getX86RegEncoding(MI, CurOp++);
876 VEX_R = ~(RegEnc >> 3) & 1;
877
878 unsigned BaseRegEnc = getX86RegEncoding(MI, MemOperand + X86::AddrBaseReg);
879 VEX_B = ~(BaseRegEnc >> 3) & 1;
880 unsigned IndexRegEnc =
881 getX86RegEncoding(MI, MemOperand + X86::AddrIndexReg);
882 VEX_X = ~(IndexRegEnc >> 3) & 1;
883
884 VEX_4V = ~getX86RegEncoding(MI, CurOp + X86::AddrNumOperands) & 0xf;
885 break;
886 }
887 case X86II::MRMSrcMemOp4: {
888 // dst(ModR/M.reg), src1(VEX_4V), src2(Imm[7:4]), src3(ModR/M),
889 unsigned RegEnc = getX86RegEncoding(MI, CurOp++);
890 VEX_R = ~(RegEnc >> 3) & 1;
891
892 unsigned VRegEnc = getX86RegEncoding(MI, CurOp++);
893 VEX_4V = ~VRegEnc & 0xf;
894
895 unsigned BaseRegEnc = getX86RegEncoding(MI, MemOperand + X86::AddrBaseReg);
896 VEX_B = ~(BaseRegEnc >> 3) & 1;
897 unsigned IndexRegEnc =
898 getX86RegEncoding(MI, MemOperand + X86::AddrIndexReg);
899 VEX_X = ~(IndexRegEnc >> 3) & 1;
900 break;
901 }
902 case X86II::MRM0m:
903 case X86II::MRM1m:
904 case X86II::MRM2m:
905 case X86II::MRM3m:
906 case X86II::MRM4m:
907 case X86II::MRM5m:
908 case X86II::MRM6m:
909 case X86II::MRM7m: {
910 // MRM[0-9]m instructions forms:
911 // MemAddr
912 // src1(VEX_4V), MemAddr
913 if (HasVEX_4V) {
914 unsigned VRegEnc = getX86RegEncoding(MI, CurOp++);
915 VEX_4V = ~VRegEnc & 0xf;
916 EVEX_V2 = ~(VRegEnc >> 4) & 1;
917 }
918
919 if (HasEVEX_K)
920 EVEX_aaa = getX86RegEncoding(MI, CurOp++);
921
922 unsigned BaseRegEnc = getX86RegEncoding(MI, MemOperand + X86::AddrBaseReg);
923 VEX_B = ~(BaseRegEnc >> 3) & 1;
924 unsigned IndexRegEnc =
925 getX86RegEncoding(MI, MemOperand + X86::AddrIndexReg);
926 VEX_X = ~(IndexRegEnc >> 3) & 1;
927 if (!HasVEX_4V) // Only needed with VSIB which don't use VVVV.
928 EVEX_V2 = ~(IndexRegEnc >> 4) & 1;
929
930 break;
931 }
932 case X86II::MRMSrcReg: {
933 // MRMSrcReg instructions forms:
934 // dst(ModR/M), src1(VEX_4V), src2(ModR/M), src3(Imm[7:4])
935 // dst(ModR/M), src1(ModR/M)
936 // dst(ModR/M), src1(ModR/M), imm8
937 //
938 // FMA4:
939 // dst(ModR/M.reg), src1(VEX_4V), src2(Imm[7:4]), src3(ModR/M),
940 unsigned RegEnc = getX86RegEncoding(MI, CurOp++);
941 VEX_R = ~(RegEnc >> 3) & 1;
942 EVEX_R2 = ~(RegEnc >> 4) & 1;
943
944 if (HasEVEX_K)
945 EVEX_aaa = getX86RegEncoding(MI, CurOp++);
946
947 if (HasVEX_4V) {
948 unsigned VRegEnc = getX86RegEncoding(MI, CurOp++);
949 VEX_4V = ~VRegEnc & 0xf;
950 EVEX_V2 = ~(VRegEnc >> 4) & 1;
951 }
952
953 RegEnc = getX86RegEncoding(MI, CurOp++);
954 VEX_B = ~(RegEnc >> 3) & 1;
955 VEX_X = ~(RegEnc >> 4) & 1;
956
957 if (EVEX_b) {
958 if (HasEVEX_RC) {
959 unsigned RcOperand = NumOps - 1;
960 assert(RcOperand >= CurOp);
961 EVEX_rc = MI.getOperand(RcOperand).getImm();
962 assert(EVEX_rc <= 3 && "Invalid rounding control!");
963 }
964 EncodeRC = true;
965 }
966 break;
967 }
968 case X86II::MRMSrcReg4VOp3: {
969 // Instruction format for 4VOp3:
970 // src1(ModR/M), src2(ModR/M), src3(VEX_4V)
971 unsigned RegEnc = getX86RegEncoding(MI, CurOp++);
972 VEX_R = ~(RegEnc >> 3) & 1;
973
974 RegEnc = getX86RegEncoding(MI, CurOp++);
975 VEX_B = ~(RegEnc >> 3) & 1;
976
977 VEX_4V = ~getX86RegEncoding(MI, CurOp++) & 0xf;
978 break;
979 }
980 case X86II::MRMSrcRegOp4: {
981 // dst(ModR/M.reg), src1(VEX_4V), src2(Imm[7:4]), src3(ModR/M),
982 unsigned RegEnc = getX86RegEncoding(MI, CurOp++);
983 VEX_R = ~(RegEnc >> 3) & 1;
984
985 unsigned VRegEnc = getX86RegEncoding(MI, CurOp++);
986 VEX_4V = ~VRegEnc & 0xf;
987
988 // Skip second register source (encoded in Imm[7:4])
989 ++CurOp;
990
991 RegEnc = getX86RegEncoding(MI, CurOp++);
992 VEX_B = ~(RegEnc >> 3) & 1;
993 VEX_X = ~(RegEnc >> 4) & 1;
994 break;
995 }
996 case X86II::MRMDestReg: {
997 // MRMDestReg instructions forms:
998 // dst(ModR/M), src(ModR/M)
999 // dst(ModR/M), src(ModR/M), imm8
1000 // dst(ModR/M), src1(VEX_4V), src2(ModR/M)
1001 unsigned RegEnc = getX86RegEncoding(MI, CurOp++);
1002 VEX_B = ~(RegEnc >> 3) & 1;
1003 VEX_X = ~(RegEnc >> 4) & 1;
1004
1005 if (HasEVEX_K)
1006 EVEX_aaa = getX86RegEncoding(MI, CurOp++);
1007
1008 if (HasVEX_4V) {
1009 unsigned VRegEnc = getX86RegEncoding(MI, CurOp++);
1010 VEX_4V = ~VRegEnc & 0xf;
1011 EVEX_V2 = ~(VRegEnc >> 4) & 1;
1012 }
1013
1014 RegEnc = getX86RegEncoding(MI, CurOp++);
1015 VEX_R = ~(RegEnc >> 3) & 1;
1016 EVEX_R2 = ~(RegEnc >> 4) & 1;
1017 if (EVEX_b)
1018 EncodeRC = true;
1019 break;
1020 }
1021 case X86II::MRMr0: {
1022 // MRMr0 instructions forms:
1023 // 11:rrr:000
1024 // dst(ModR/M)
1025 unsigned RegEnc = getX86RegEncoding(MI, CurOp++);
1026 VEX_R = ~(RegEnc >> 3) & 1;
1027 EVEX_R2 = ~(RegEnc >> 4) & 1;
1028 break;
1029 }
1030 case X86II::MRM0r:
1031 case X86II::MRM1r:
1032 case X86II::MRM2r:
1033 case X86II::MRM3r:
1034 case X86II::MRM4r:
1035 case X86II::MRM5r:
1036 case X86II::MRM6r:
1037 case X86II::MRM7r: {
1038 // MRM0r-MRM7r instructions forms:
1039 // dst(VEX_4V), src(ModR/M), imm8
1040 if (HasVEX_4V) {
1041 unsigned VRegEnc = getX86RegEncoding(MI, CurOp++);
1042 VEX_4V = ~VRegEnc & 0xf;
1043 EVEX_V2 = ~(VRegEnc >> 4) & 1;
1044 }
1045 if (HasEVEX_K)
1046 EVEX_aaa = getX86RegEncoding(MI, CurOp++);
1047
1048 unsigned RegEnc = getX86RegEncoding(MI, CurOp++);
1049 VEX_B = ~(RegEnc >> 3) & 1;
1050 VEX_X = ~(RegEnc >> 4) & 1;
1051 break;
1052 }
1053 }
1054
1055 if (Encoding == X86II::VEX || Encoding == X86II::XOP) {
1056 // VEX opcode prefix can have 2 or 3 bytes
1057 //
1058 // 3 bytes:
1059 // +-----+ +--------------+ +-------------------+
1060 // | C4h | | RXB | m-mmmm | | W | vvvv | L | pp |
1061 // +-----+ +--------------+ +-------------------+
1062 // 2 bytes:
1063 // +-----+ +-------------------+
1064 // | C5h | | R | vvvv | L | pp |
1065 // +-----+ +-------------------+
1066 //
1067 // XOP uses a similar prefix:
1068 // +-----+ +--------------+ +-------------------+
1069 // | 8Fh | | RXB | m-mmmm | | W | vvvv | L | pp |
1070 // +-----+ +--------------+ +-------------------+
1071 uint8_t LastByte = VEX_PP | (VEX_L << 2) | (VEX_4V << 3);
1072
1073 // Can we use the 2 byte VEX prefix?
1074 if (!(MI.getFlags() & X86::IP_USE_VEX3) && Encoding == X86II::VEX &&
1075 VEX_B && VEX_X && !VEX_W && (VEX_5M == 1)) {
1076 emitByte(0xC5, OS);
1077 emitByte(LastByte | (VEX_R << 7), OS);
1078 return;
1079 }
1080
1081 // 3 byte VEX prefix
1082 emitByte(Encoding == X86II::XOP ? 0x8F : 0xC4, OS);
1083 emitByte(VEX_R << 7 | VEX_X << 6 | VEX_B << 5 | VEX_5M, OS);
1084 emitByte(LastByte | (VEX_W << 7), OS);
1085 } else {
1086 assert(Encoding == X86II::EVEX && "unknown encoding!");
1087 // EVEX opcode prefix can have 4 bytes
1088 //
1089 // +-----+ +--------------+ +-------------------+ +------------------------+
1090 // | 62h | | RXBR' | 0mmm | | W | vvvv | U | pp | | z | L'L | b | v' | aaa |
1091 // +-----+ +--------------+ +-------------------+ +------------------------+
1092 assert((VEX_5M & 0x7) == VEX_5M &&
1093 "More than 3 significant bits in VEX.m-mmmm fields for EVEX!");
1094
1095 emitByte(0x62, OS);
1096 emitByte((VEX_R << 7) | (VEX_X << 6) | (VEX_B << 5) | (EVEX_R2 << 4) |
1097 VEX_5M,
1098 OS);
1099 emitByte((VEX_W << 7) | (VEX_4V << 3) | (EVEX_U << 2) | VEX_PP, OS);
1100 if (EncodeRC)
1101 emitByte((EVEX_z << 7) | (EVEX_rc << 5) | (EVEX_b << 4) | (EVEX_V2 << 3) |
1102 EVEX_aaa,
1103 OS);
1104 else
1105 emitByte((EVEX_z << 7) | (EVEX_L2 << 6) | (VEX_L << 5) | (EVEX_b << 4) |
1106 (EVEX_V2 << 3) | EVEX_aaa,
1107 OS);
1108 }
1109 }
1110
1111 /// Emit REX prefix which specifies
1112 /// 1) 64-bit instructions,
1113 /// 2) non-default operand size, and
1114 /// 3) use of X86-64 extended registers.
1115 ///
1116 /// \returns true if REX prefix is used, otherwise returns false.
emitREXPrefix(int MemOperand,const MCInst & MI,const MCSubtargetInfo & STI,raw_ostream & OS) const1117 bool X86MCCodeEmitter::emitREXPrefix(int MemOperand, const MCInst &MI,
1118 const MCSubtargetInfo &STI,
1119 raw_ostream &OS) const {
1120 uint8_t REX = [&, MemOperand]() {
1121 uint8_t REX = 0;
1122 bool UsesHighByteReg = false;
1123
1124 const MCInstrDesc &Desc = MCII.get(MI.getOpcode());
1125 uint64_t TSFlags = Desc.TSFlags;
1126
1127 if (TSFlags & X86II::REX_W)
1128 REX |= 1 << 3; // set REX.W
1129
1130 if (MI.getNumOperands() == 0)
1131 return REX;
1132
1133 unsigned NumOps = MI.getNumOperands();
1134 unsigned CurOp = X86II::getOperandBias(Desc);
1135
1136 // If it accesses SPL, BPL, SIL, or DIL, then it requires a 0x40 REX prefix.
1137 for (unsigned i = CurOp; i != NumOps; ++i) {
1138 const MCOperand &MO = MI.getOperand(i);
1139 if (MO.isReg()) {
1140 unsigned Reg = MO.getReg();
1141 if (Reg == X86::AH || Reg == X86::BH || Reg == X86::CH ||
1142 Reg == X86::DH)
1143 UsesHighByteReg = true;
1144 if (X86II::isX86_64NonExtLowByteReg(Reg))
1145 // FIXME: The caller of determineREXPrefix slaps this prefix onto
1146 // anything that returns non-zero.
1147 REX |= 0x40; // REX fixed encoding prefix
1148 } else if (MO.isExpr() && STI.getTargetTriple().isX32()) {
1149 // GOTTPOFF and TLSDESC relocations require a REX prefix to allow
1150 // linker optimizations: even if the instructions we see may not require
1151 // any prefix, they may be replaced by instructions that do. This is
1152 // handled as a special case here so that it also works for hand-written
1153 // assembly without the user needing to write REX, as with GNU as.
1154 const auto *Ref = dyn_cast<MCSymbolRefExpr>(MO.getExpr());
1155 if (Ref && (Ref->getKind() == MCSymbolRefExpr::VK_GOTTPOFF ||
1156 Ref->getKind() == MCSymbolRefExpr::VK_TLSDESC)) {
1157 REX |= 0x40; // REX fixed encoding prefix
1158 }
1159 }
1160 }
1161
1162 switch (TSFlags & X86II::FormMask) {
1163 case X86II::AddRegFrm:
1164 REX |= isREXExtendedReg(MI, CurOp++) << 0; // REX.B
1165 break;
1166 case X86II::MRMSrcReg:
1167 case X86II::MRMSrcRegCC:
1168 REX |= isREXExtendedReg(MI, CurOp++) << 2; // REX.R
1169 REX |= isREXExtendedReg(MI, CurOp++) << 0; // REX.B
1170 break;
1171 case X86II::MRMSrcMem:
1172 case X86II::MRMSrcMemCC:
1173 REX |= isREXExtendedReg(MI, CurOp++) << 2; // REX.R
1174 REX |= isREXExtendedReg(MI, MemOperand + X86::AddrBaseReg) << 0; // REX.B
1175 REX |= isREXExtendedReg(MI, MemOperand + X86::AddrIndexReg) << 1; // REX.X
1176 CurOp += X86::AddrNumOperands;
1177 break;
1178 case X86II::MRMDestReg:
1179 REX |= isREXExtendedReg(MI, CurOp++) << 0; // REX.B
1180 REX |= isREXExtendedReg(MI, CurOp++) << 2; // REX.R
1181 break;
1182 case X86II::MRMDestMem:
1183 REX |= isREXExtendedReg(MI, MemOperand + X86::AddrBaseReg) << 0; // REX.B
1184 REX |= isREXExtendedReg(MI, MemOperand + X86::AddrIndexReg) << 1; // REX.X
1185 CurOp += X86::AddrNumOperands;
1186 REX |= isREXExtendedReg(MI, CurOp++) << 2; // REX.R
1187 break;
1188 case X86II::MRMXmCC:
1189 case X86II::MRMXm:
1190 case X86II::MRM0m:
1191 case X86II::MRM1m:
1192 case X86II::MRM2m:
1193 case X86II::MRM3m:
1194 case X86II::MRM4m:
1195 case X86II::MRM5m:
1196 case X86II::MRM6m:
1197 case X86II::MRM7m:
1198 REX |= isREXExtendedReg(MI, MemOperand + X86::AddrBaseReg) << 0; // REX.B
1199 REX |= isREXExtendedReg(MI, MemOperand + X86::AddrIndexReg) << 1; // REX.X
1200 break;
1201 case X86II::MRMXrCC:
1202 case X86II::MRMXr:
1203 case X86II::MRM0r:
1204 case X86II::MRM1r:
1205 case X86II::MRM2r:
1206 case X86II::MRM3r:
1207 case X86II::MRM4r:
1208 case X86II::MRM5r:
1209 case X86II::MRM6r:
1210 case X86II::MRM7r:
1211 REX |= isREXExtendedReg(MI, CurOp++) << 0; // REX.B
1212 break;
1213 case X86II::MRMr0:
1214 REX |= isREXExtendedReg(MI, CurOp++) << 2; // REX.R
1215 break;
1216 case X86II::MRMDestMemFSIB:
1217 llvm_unreachable("FSIB format never need REX prefix!");
1218 }
1219 if (REX && UsesHighByteReg)
1220 report_fatal_error(
1221 "Cannot encode high byte register in REX-prefixed instruction");
1222 return REX;
1223 }();
1224
1225 if (!REX)
1226 return false;
1227
1228 emitByte(0x40 | REX, OS);
1229 return true;
1230 }
1231
1232 /// Emit segment override opcode prefix as needed.
emitSegmentOverridePrefix(unsigned SegOperand,const MCInst & MI,raw_ostream & OS) const1233 void X86MCCodeEmitter::emitSegmentOverridePrefix(unsigned SegOperand,
1234 const MCInst &MI,
1235 raw_ostream &OS) const {
1236 // Check for explicit segment override on memory operand.
1237 if (unsigned Reg = MI.getOperand(SegOperand).getReg())
1238 emitByte(X86::getSegmentOverridePrefixForReg(Reg), OS);
1239 }
1240
1241 /// Emit all instruction prefixes prior to the opcode.
1242 ///
1243 /// \param MemOperand the operand # of the start of a memory operand if present.
1244 /// If not present, it is -1.
1245 ///
1246 /// \returns true if REX prefix is used, otherwise returns false.
emitOpcodePrefix(int MemOperand,const MCInst & MI,const MCSubtargetInfo & STI,raw_ostream & OS) const1247 bool X86MCCodeEmitter::emitOpcodePrefix(int MemOperand, const MCInst &MI,
1248 const MCSubtargetInfo &STI,
1249 raw_ostream &OS) const {
1250 const MCInstrDesc &Desc = MCII.get(MI.getOpcode());
1251 uint64_t TSFlags = Desc.TSFlags;
1252
1253 // Emit the operand size opcode prefix as needed.
1254 if ((TSFlags & X86II::OpSizeMask) ==
1255 (STI.hasFeature(X86::Is16Bit) ? X86II::OpSize32 : X86II::OpSize16))
1256 emitByte(0x66, OS);
1257
1258 // Emit the LOCK opcode prefix.
1259 if (TSFlags & X86II::LOCK || MI.getFlags() & X86::IP_HAS_LOCK)
1260 emitByte(0xF0, OS);
1261
1262 // Emit the NOTRACK opcode prefix.
1263 if (TSFlags & X86II::NOTRACK || MI.getFlags() & X86::IP_HAS_NOTRACK)
1264 emitByte(0x3E, OS);
1265
1266 switch (TSFlags & X86II::OpPrefixMask) {
1267 case X86II::PD: // 66
1268 emitByte(0x66, OS);
1269 break;
1270 case X86II::XS: // F3
1271 emitByte(0xF3, OS);
1272 break;
1273 case X86II::XD: // F2
1274 emitByte(0xF2, OS);
1275 break;
1276 }
1277
1278 // Handle REX prefix.
1279 assert((STI.hasFeature(X86::Is64Bit) || !(TSFlags & X86II::REX_W)) &&
1280 "REX.W requires 64bit mode.");
1281 bool HasREX = STI.hasFeature(X86::Is64Bit)
1282 ? emitREXPrefix(MemOperand, MI, STI, OS)
1283 : false;
1284
1285 // 0x0F escape code must be emitted just before the opcode.
1286 switch (TSFlags & X86II::OpMapMask) {
1287 case X86II::TB: // Two-byte opcode map
1288 case X86II::T8: // 0F 38
1289 case X86II::TA: // 0F 3A
1290 case X86II::ThreeDNow: // 0F 0F, second 0F emitted by caller.
1291 emitByte(0x0F, OS);
1292 break;
1293 }
1294
1295 switch (TSFlags & X86II::OpMapMask) {
1296 case X86II::T8: // 0F 38
1297 emitByte(0x38, OS);
1298 break;
1299 case X86II::TA: // 0F 3A
1300 emitByte(0x3A, OS);
1301 break;
1302 }
1303
1304 return HasREX;
1305 }
1306
emitPrefix(const MCInst & MI,raw_ostream & OS,const MCSubtargetInfo & STI) const1307 void X86MCCodeEmitter::emitPrefix(const MCInst &MI, raw_ostream &OS,
1308 const MCSubtargetInfo &STI) const {
1309 unsigned Opcode = MI.getOpcode();
1310 const MCInstrDesc &Desc = MCII.get(Opcode);
1311 uint64_t TSFlags = Desc.TSFlags;
1312
1313 // Pseudo instructions don't get encoded.
1314 if (X86II::isPseudo(TSFlags))
1315 return;
1316
1317 unsigned CurOp = X86II::getOperandBias(Desc);
1318
1319 emitPrefixImpl(CurOp, MI, STI, OS);
1320 }
1321
encodeInstruction(const MCInst & MI,raw_ostream & OS,SmallVectorImpl<MCFixup> & Fixups,const MCSubtargetInfo & STI) const1322 void X86MCCodeEmitter::encodeInstruction(const MCInst &MI, raw_ostream &OS,
1323 SmallVectorImpl<MCFixup> &Fixups,
1324 const MCSubtargetInfo &STI) const {
1325 unsigned Opcode = MI.getOpcode();
1326 const MCInstrDesc &Desc = MCII.get(Opcode);
1327 uint64_t TSFlags = Desc.TSFlags;
1328
1329 // Pseudo instructions don't get encoded.
1330 if (X86II::isPseudo(TSFlags))
1331 return;
1332
1333 unsigned NumOps = Desc.getNumOperands();
1334 unsigned CurOp = X86II::getOperandBias(Desc);
1335
1336 uint64_t StartByte = OS.tell();
1337
1338 bool HasREX = emitPrefixImpl(CurOp, MI, STI, OS);
1339
1340 // It uses the VEX.VVVV field?
1341 bool HasVEX_4V = TSFlags & X86II::VEX_4V;
1342 bool HasVEX_I8Reg = (TSFlags & X86II::ImmMask) == X86II::Imm8Reg;
1343
1344 // It uses the EVEX.aaa field?
1345 bool HasEVEX_K = TSFlags & X86II::EVEX_K;
1346 bool HasEVEX_RC = TSFlags & X86II::EVEX_RC;
1347
1348 // Used if a register is encoded in 7:4 of immediate.
1349 unsigned I8RegNum = 0;
1350
1351 uint8_t BaseOpcode = X86II::getBaseOpcodeFor(TSFlags);
1352
1353 if ((TSFlags & X86II::OpMapMask) == X86II::ThreeDNow)
1354 BaseOpcode = 0x0F; // Weird 3DNow! encoding.
1355
1356 unsigned OpcodeOffset = 0;
1357
1358 uint64_t Form = TSFlags & X86II::FormMask;
1359 switch (Form) {
1360 default:
1361 errs() << "FORM: " << Form << "\n";
1362 llvm_unreachable("Unknown FormMask value in X86MCCodeEmitter!");
1363 case X86II::Pseudo:
1364 llvm_unreachable("Pseudo instruction shouldn't be emitted");
1365 case X86II::RawFrmDstSrc:
1366 case X86II::RawFrmSrc:
1367 case X86II::RawFrmDst:
1368 case X86II::PrefixByte:
1369 emitByte(BaseOpcode, OS);
1370 break;
1371 case X86II::AddCCFrm: {
1372 // This will be added to the opcode in the fallthrough.
1373 OpcodeOffset = MI.getOperand(NumOps - 1).getImm();
1374 assert(OpcodeOffset < 16 && "Unexpected opcode offset!");
1375 --NumOps; // Drop the operand from the end.
1376 LLVM_FALLTHROUGH;
1377 case X86II::RawFrm:
1378 emitByte(BaseOpcode + OpcodeOffset, OS);
1379
1380 if (!STI.hasFeature(X86::Is64Bit) || !isPCRel32Branch(MI, MCII))
1381 break;
1382
1383 const MCOperand &Op = MI.getOperand(CurOp++);
1384 emitImmediate(Op, MI.getLoc(), X86II::getSizeOfImm(TSFlags),
1385 MCFixupKind(X86::reloc_branch_4byte_pcrel), StartByte, OS,
1386 Fixups);
1387 break;
1388 }
1389 case X86II::RawFrmMemOffs:
1390 emitByte(BaseOpcode, OS);
1391 emitImmediate(MI.getOperand(CurOp++), MI.getLoc(),
1392 X86II::getSizeOfImm(TSFlags), getImmFixupKind(TSFlags),
1393 StartByte, OS, Fixups);
1394 ++CurOp; // skip segment operand
1395 break;
1396 case X86II::RawFrmImm8:
1397 emitByte(BaseOpcode, OS);
1398 emitImmediate(MI.getOperand(CurOp++), MI.getLoc(),
1399 X86II::getSizeOfImm(TSFlags), getImmFixupKind(TSFlags),
1400 StartByte, OS, Fixups);
1401 emitImmediate(MI.getOperand(CurOp++), MI.getLoc(), 1, FK_Data_1, StartByte,
1402 OS, Fixups);
1403 break;
1404 case X86II::RawFrmImm16:
1405 emitByte(BaseOpcode, OS);
1406 emitImmediate(MI.getOperand(CurOp++), MI.getLoc(),
1407 X86II::getSizeOfImm(TSFlags), getImmFixupKind(TSFlags),
1408 StartByte, OS, Fixups);
1409 emitImmediate(MI.getOperand(CurOp++), MI.getLoc(), 2, FK_Data_2, StartByte,
1410 OS, Fixups);
1411 break;
1412
1413 case X86II::AddRegFrm:
1414 emitByte(BaseOpcode + getX86RegNum(MI.getOperand(CurOp++)), OS);
1415 break;
1416
1417 case X86II::MRMDestReg: {
1418 emitByte(BaseOpcode, OS);
1419 unsigned SrcRegNum = CurOp + 1;
1420
1421 if (HasEVEX_K) // Skip writemask
1422 ++SrcRegNum;
1423
1424 if (HasVEX_4V) // Skip 1st src (which is encoded in VEX_VVVV)
1425 ++SrcRegNum;
1426
1427 emitRegModRMByte(MI.getOperand(CurOp),
1428 getX86RegNum(MI.getOperand(SrcRegNum)), OS);
1429 CurOp = SrcRegNum + 1;
1430 break;
1431 }
1432 case X86II::MRMDestMemFSIB:
1433 case X86II::MRMDestMem: {
1434 emitByte(BaseOpcode, OS);
1435 unsigned SrcRegNum = CurOp + X86::AddrNumOperands;
1436
1437 if (HasEVEX_K) // Skip writemask
1438 ++SrcRegNum;
1439
1440 if (HasVEX_4V) // Skip 1st src (which is encoded in VEX_VVVV)
1441 ++SrcRegNum;
1442
1443 bool ForceSIB = (Form == X86II::MRMDestMemFSIB);
1444 emitMemModRMByte(MI, CurOp, getX86RegNum(MI.getOperand(SrcRegNum)), TSFlags,
1445 HasREX, StartByte, OS, Fixups, STI, ForceSIB);
1446 CurOp = SrcRegNum + 1;
1447 break;
1448 }
1449 case X86II::MRMSrcReg: {
1450 emitByte(BaseOpcode, OS);
1451 unsigned SrcRegNum = CurOp + 1;
1452
1453 if (HasEVEX_K) // Skip writemask
1454 ++SrcRegNum;
1455
1456 if (HasVEX_4V) // Skip 1st src (which is encoded in VEX_VVVV)
1457 ++SrcRegNum;
1458
1459 emitRegModRMByte(MI.getOperand(SrcRegNum),
1460 getX86RegNum(MI.getOperand(CurOp)), OS);
1461 CurOp = SrcRegNum + 1;
1462 if (HasVEX_I8Reg)
1463 I8RegNum = getX86RegEncoding(MI, CurOp++);
1464 // do not count the rounding control operand
1465 if (HasEVEX_RC)
1466 --NumOps;
1467 break;
1468 }
1469 case X86II::MRMSrcReg4VOp3: {
1470 emitByte(BaseOpcode, OS);
1471 unsigned SrcRegNum = CurOp + 1;
1472
1473 emitRegModRMByte(MI.getOperand(SrcRegNum),
1474 getX86RegNum(MI.getOperand(CurOp)), OS);
1475 CurOp = SrcRegNum + 1;
1476 ++CurOp; // Encoded in VEX.VVVV
1477 break;
1478 }
1479 case X86II::MRMSrcRegOp4: {
1480 emitByte(BaseOpcode, OS);
1481 unsigned SrcRegNum = CurOp + 1;
1482
1483 // Skip 1st src (which is encoded in VEX_VVVV)
1484 ++SrcRegNum;
1485
1486 // Capture 2nd src (which is encoded in Imm[7:4])
1487 assert(HasVEX_I8Reg && "MRMSrcRegOp4 should imply VEX_I8Reg");
1488 I8RegNum = getX86RegEncoding(MI, SrcRegNum++);
1489
1490 emitRegModRMByte(MI.getOperand(SrcRegNum),
1491 getX86RegNum(MI.getOperand(CurOp)), OS);
1492 CurOp = SrcRegNum + 1;
1493 break;
1494 }
1495 case X86II::MRMSrcRegCC: {
1496 unsigned FirstOp = CurOp++;
1497 unsigned SecondOp = CurOp++;
1498
1499 unsigned CC = MI.getOperand(CurOp++).getImm();
1500 emitByte(BaseOpcode + CC, OS);
1501
1502 emitRegModRMByte(MI.getOperand(SecondOp),
1503 getX86RegNum(MI.getOperand(FirstOp)), OS);
1504 break;
1505 }
1506 case X86II::MRMSrcMemFSIB:
1507 case X86II::MRMSrcMem: {
1508 unsigned FirstMemOp = CurOp + 1;
1509
1510 if (HasEVEX_K) // Skip writemask
1511 ++FirstMemOp;
1512
1513 if (HasVEX_4V)
1514 ++FirstMemOp; // Skip the register source (which is encoded in VEX_VVVV).
1515
1516 emitByte(BaseOpcode, OS);
1517
1518 bool ForceSIB = (Form == X86II::MRMSrcMemFSIB);
1519 emitMemModRMByte(MI, FirstMemOp, getX86RegNum(MI.getOperand(CurOp)),
1520 TSFlags, HasREX, StartByte, OS, Fixups, STI, ForceSIB);
1521 CurOp = FirstMemOp + X86::AddrNumOperands;
1522 if (HasVEX_I8Reg)
1523 I8RegNum = getX86RegEncoding(MI, CurOp++);
1524 break;
1525 }
1526 case X86II::MRMSrcMem4VOp3: {
1527 unsigned FirstMemOp = CurOp + 1;
1528
1529 emitByte(BaseOpcode, OS);
1530
1531 emitMemModRMByte(MI, FirstMemOp, getX86RegNum(MI.getOperand(CurOp)),
1532 TSFlags, HasREX, StartByte, OS, Fixups, STI);
1533 CurOp = FirstMemOp + X86::AddrNumOperands;
1534 ++CurOp; // Encoded in VEX.VVVV.
1535 break;
1536 }
1537 case X86II::MRMSrcMemOp4: {
1538 unsigned FirstMemOp = CurOp + 1;
1539
1540 ++FirstMemOp; // Skip the register source (which is encoded in VEX_VVVV).
1541
1542 // Capture second register source (encoded in Imm[7:4])
1543 assert(HasVEX_I8Reg && "MRMSrcRegOp4 should imply VEX_I8Reg");
1544 I8RegNum = getX86RegEncoding(MI, FirstMemOp++);
1545
1546 emitByte(BaseOpcode, OS);
1547
1548 emitMemModRMByte(MI, FirstMemOp, getX86RegNum(MI.getOperand(CurOp)),
1549 TSFlags, HasREX, StartByte, OS, Fixups, STI);
1550 CurOp = FirstMemOp + X86::AddrNumOperands;
1551 break;
1552 }
1553 case X86II::MRMSrcMemCC: {
1554 unsigned RegOp = CurOp++;
1555 unsigned FirstMemOp = CurOp;
1556 CurOp = FirstMemOp + X86::AddrNumOperands;
1557
1558 unsigned CC = MI.getOperand(CurOp++).getImm();
1559 emitByte(BaseOpcode + CC, OS);
1560
1561 emitMemModRMByte(MI, FirstMemOp, getX86RegNum(MI.getOperand(RegOp)),
1562 TSFlags, HasREX, StartByte, OS, Fixups, STI);
1563 break;
1564 }
1565
1566 case X86II::MRMXrCC: {
1567 unsigned RegOp = CurOp++;
1568
1569 unsigned CC = MI.getOperand(CurOp++).getImm();
1570 emitByte(BaseOpcode + CC, OS);
1571 emitRegModRMByte(MI.getOperand(RegOp), 0, OS);
1572 break;
1573 }
1574
1575 case X86II::MRMXr:
1576 case X86II::MRM0r:
1577 case X86II::MRM1r:
1578 case X86II::MRM2r:
1579 case X86II::MRM3r:
1580 case X86II::MRM4r:
1581 case X86II::MRM5r:
1582 case X86II::MRM6r:
1583 case X86II::MRM7r:
1584 if (HasVEX_4V) // Skip the register dst (which is encoded in VEX_VVVV).
1585 ++CurOp;
1586 if (HasEVEX_K) // Skip writemask
1587 ++CurOp;
1588 emitByte(BaseOpcode, OS);
1589 emitRegModRMByte(MI.getOperand(CurOp++),
1590 (Form == X86II::MRMXr) ? 0 : Form - X86II::MRM0r, OS);
1591 break;
1592 case X86II::MRMr0:
1593 emitByte(BaseOpcode, OS);
1594 emitByte(modRMByte(3, getX86RegNum(MI.getOperand(CurOp++)),0), OS);
1595 break;
1596
1597 case X86II::MRMXmCC: {
1598 unsigned FirstMemOp = CurOp;
1599 CurOp = FirstMemOp + X86::AddrNumOperands;
1600
1601 unsigned CC = MI.getOperand(CurOp++).getImm();
1602 emitByte(BaseOpcode + CC, OS);
1603
1604 emitMemModRMByte(MI, FirstMemOp, 0, TSFlags, HasREX, StartByte, OS, Fixups,
1605 STI);
1606 break;
1607 }
1608
1609 case X86II::MRMXm:
1610 case X86II::MRM0m:
1611 case X86II::MRM1m:
1612 case X86II::MRM2m:
1613 case X86II::MRM3m:
1614 case X86II::MRM4m:
1615 case X86II::MRM5m:
1616 case X86II::MRM6m:
1617 case X86II::MRM7m:
1618 if (HasVEX_4V) // Skip the register dst (which is encoded in VEX_VVVV).
1619 ++CurOp;
1620 if (HasEVEX_K) // Skip writemask
1621 ++CurOp;
1622 emitByte(BaseOpcode, OS);
1623 emitMemModRMByte(MI, CurOp,
1624 (Form == X86II::MRMXm) ? 0 : Form - X86II::MRM0m, TSFlags,
1625 HasREX, StartByte, OS, Fixups, STI);
1626 CurOp += X86::AddrNumOperands;
1627 break;
1628
1629 case X86II::MRM0X:
1630 case X86II::MRM1X:
1631 case X86II::MRM2X:
1632 case X86II::MRM3X:
1633 case X86II::MRM4X:
1634 case X86II::MRM5X:
1635 case X86II::MRM6X:
1636 case X86II::MRM7X:
1637 emitByte(BaseOpcode, OS);
1638 emitByte(0xC0 + ((Form - X86II::MRM0X) << 3), OS);
1639 break;
1640
1641 case X86II::MRM_C0:
1642 case X86II::MRM_C1:
1643 case X86II::MRM_C2:
1644 case X86II::MRM_C3:
1645 case X86II::MRM_C4:
1646 case X86II::MRM_C5:
1647 case X86II::MRM_C6:
1648 case X86II::MRM_C7:
1649 case X86II::MRM_C8:
1650 case X86II::MRM_C9:
1651 case X86II::MRM_CA:
1652 case X86II::MRM_CB:
1653 case X86II::MRM_CC:
1654 case X86II::MRM_CD:
1655 case X86II::MRM_CE:
1656 case X86II::MRM_CF:
1657 case X86II::MRM_D0:
1658 case X86II::MRM_D1:
1659 case X86II::MRM_D2:
1660 case X86II::MRM_D3:
1661 case X86II::MRM_D4:
1662 case X86II::MRM_D5:
1663 case X86II::MRM_D6:
1664 case X86II::MRM_D7:
1665 case X86II::MRM_D8:
1666 case X86II::MRM_D9:
1667 case X86II::MRM_DA:
1668 case X86II::MRM_DB:
1669 case X86II::MRM_DC:
1670 case X86II::MRM_DD:
1671 case X86II::MRM_DE:
1672 case X86II::MRM_DF:
1673 case X86II::MRM_E0:
1674 case X86II::MRM_E1:
1675 case X86II::MRM_E2:
1676 case X86II::MRM_E3:
1677 case X86II::MRM_E4:
1678 case X86II::MRM_E5:
1679 case X86II::MRM_E6:
1680 case X86II::MRM_E7:
1681 case X86II::MRM_E8:
1682 case X86II::MRM_E9:
1683 case X86II::MRM_EA:
1684 case X86II::MRM_EB:
1685 case X86II::MRM_EC:
1686 case X86II::MRM_ED:
1687 case X86II::MRM_EE:
1688 case X86II::MRM_EF:
1689 case X86II::MRM_F0:
1690 case X86II::MRM_F1:
1691 case X86II::MRM_F2:
1692 case X86II::MRM_F3:
1693 case X86II::MRM_F4:
1694 case X86II::MRM_F5:
1695 case X86II::MRM_F6:
1696 case X86II::MRM_F7:
1697 case X86II::MRM_F8:
1698 case X86II::MRM_F9:
1699 case X86II::MRM_FA:
1700 case X86II::MRM_FB:
1701 case X86II::MRM_FC:
1702 case X86II::MRM_FD:
1703 case X86II::MRM_FE:
1704 case X86II::MRM_FF:
1705 emitByte(BaseOpcode, OS);
1706 emitByte(0xC0 + Form - X86II::MRM_C0, OS);
1707 break;
1708 }
1709
1710 if (HasVEX_I8Reg) {
1711 // The last source register of a 4 operand instruction in AVX is encoded
1712 // in bits[7:4] of a immediate byte.
1713 assert(I8RegNum < 16 && "Register encoding out of range");
1714 I8RegNum <<= 4;
1715 if (CurOp != NumOps) {
1716 unsigned Val = MI.getOperand(CurOp++).getImm();
1717 assert(Val < 16 && "Immediate operand value out of range");
1718 I8RegNum |= Val;
1719 }
1720 emitImmediate(MCOperand::createImm(I8RegNum), MI.getLoc(), 1, FK_Data_1,
1721 StartByte, OS, Fixups);
1722 } else {
1723 // If there is a remaining operand, it must be a trailing immediate. Emit it
1724 // according to the right size for the instruction. Some instructions
1725 // (SSE4a extrq and insertq) have two trailing immediates.
1726 while (CurOp != NumOps && NumOps - CurOp <= 2) {
1727 emitImmediate(MI.getOperand(CurOp++), MI.getLoc(),
1728 X86II::getSizeOfImm(TSFlags), getImmFixupKind(TSFlags),
1729 StartByte, OS, Fixups);
1730 }
1731 }
1732
1733 if ((TSFlags & X86II::OpMapMask) == X86II::ThreeDNow)
1734 emitByte(X86II::getBaseOpcodeFor(TSFlags), OS);
1735
1736 assert(OS.tell() - StartByte <= 15 &&
1737 "The size of instruction must be no longer than 15.");
1738 #ifndef NDEBUG
1739 // FIXME: Verify.
1740 if (/*!Desc.isVariadic() &&*/ CurOp != NumOps) {
1741 errs() << "Cannot encode all operands of: ";
1742 MI.dump();
1743 errs() << '\n';
1744 abort();
1745 }
1746 #endif
1747 }
1748
createX86MCCodeEmitter(const MCInstrInfo & MCII,MCContext & Ctx)1749 MCCodeEmitter *llvm::createX86MCCodeEmitter(const MCInstrInfo &MCII,
1750 MCContext &Ctx) {
1751 return new X86MCCodeEmitter(MCII, Ctx);
1752 }
1753