comparison lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp @ 120:1172e4bd9c6f

update 4.0.0
author mir3636
date Fri, 25 Nov 2016 19:14:25 +0900
parents 7d135dc70f03
children 803732b1fca8
comparison
equal deleted inserted replaced
101:34baf5011add 120:1172e4bd9c6f
74 74
75 unsigned GetX86RegNum(const MCOperand &MO) const { 75 unsigned GetX86RegNum(const MCOperand &MO) const {
76 return Ctx.getRegisterInfo()->getEncodingValue(MO.getReg()) & 0x7; 76 return Ctx.getRegisterInfo()->getEncodingValue(MO.getReg()) & 0x7;
77 } 77 }
78 78
79 // On regular x86, both XMM0-XMM7 and XMM8-XMM15 are encoded in the range 79 unsigned getX86RegEncoding(const MCInst &MI, unsigned OpNum) const {
80 // 0-7 and the difference between the 2 groups is given by the REX prefix. 80 return Ctx.getRegisterInfo()->getEncodingValue(
81 // In the VEX prefix, registers are seen sequencially from 0-15 and encoded 81 MI.getOperand(OpNum).getReg());
82 // in 1's complement form, example: 82 }
83 // 83
84 // ModRM field => XMM9 => 1 84 // Does this register require a bit to be set in REX prefix.
85 // VEX.VVVV => XMM9 => ~9 85 bool isREXExtendedReg(const MCInst &MI, unsigned OpNum) const {
86 // 86 return (getX86RegEncoding(MI, OpNum) >> 3) & 1;
87 // See table 4-35 of Intel AVX Programming Reference for details. 87 }
88 unsigned char getVEXRegisterEncoding(const MCInst &MI, 88
89 unsigned OpNum) const { 89 void EmitByte(uint8_t C, unsigned &CurByte, raw_ostream &OS) const {
90 unsigned SrcReg = MI.getOperand(OpNum).getReg();
91 unsigned SrcRegNum = GetX86RegNum(MI.getOperand(OpNum));
92 if (X86II::isX86_64ExtendedReg(SrcReg))
93 SrcRegNum |= 8;
94
95 // The registers represented through VEX_VVVV should
96 // be encoded in 1's complement form.
97 return (~SrcRegNum) & 0xf;
98 }
99
100 unsigned char getWriteMaskRegisterEncoding(const MCInst &MI,
101 unsigned OpNum) const {
102 assert(X86::K0 != MI.getOperand(OpNum).getReg() &&
103 "Invalid mask register as write-mask!");
104 unsigned MaskRegNum = GetX86RegNum(MI.getOperand(OpNum));
105 return MaskRegNum;
106 }
107
108 void EmitByte(unsigned char C, unsigned &CurByte, raw_ostream &OS) const {
109 OS << (char)C; 90 OS << (char)C;
110 ++CurByte; 91 ++CurByte;
111 } 92 }
112 93
113 void EmitConstant(uint64_t Val, unsigned Size, unsigned &CurByte, 94 void EmitConstant(uint64_t Val, unsigned Size, unsigned &CurByte,
123 unsigned ImmSize, MCFixupKind FixupKind, 104 unsigned ImmSize, MCFixupKind FixupKind,
124 unsigned &CurByte, raw_ostream &OS, 105 unsigned &CurByte, raw_ostream &OS,
125 SmallVectorImpl<MCFixup> &Fixups, 106 SmallVectorImpl<MCFixup> &Fixups,
126 int ImmOffset = 0) const; 107 int ImmOffset = 0) const;
127 108
128 inline static unsigned char ModRMByte(unsigned Mod, unsigned RegOpcode, 109 inline static uint8_t ModRMByte(unsigned Mod, unsigned RegOpcode,
129 unsigned RM) { 110 unsigned RM) {
130 assert(Mod < 4 && RegOpcode < 8 && RM < 8 && "ModRM Fields out of range!"); 111 assert(Mod < 4 && RegOpcode < 8 && RM < 8 && "ModRM Fields out of range!");
131 return RM | (RegOpcode << 3) | (Mod << 6); 112 return RM | (RegOpcode << 3) | (Mod << 6);
132 } 113 }
133 114
134 void EmitRegModRMByte(const MCOperand &ModRMReg, unsigned RegOpcodeFld, 115 void EmitRegModRMByte(const MCOperand &ModRMReg, unsigned RegOpcodeFld,
140 unsigned &CurByte, raw_ostream &OS) const { 121 unsigned &CurByte, raw_ostream &OS) const {
141 // SIB byte is in the same format as the ModRMByte. 122 // SIB byte is in the same format as the ModRMByte.
142 EmitByte(ModRMByte(SS, Index, Base), CurByte, OS); 123 EmitByte(ModRMByte(SS, Index, Base), CurByte, OS);
143 } 124 }
144 125
145 126 void emitMemModRMByte(const MCInst &MI, unsigned Op, unsigned RegOpcodeField,
146 void EmitMemModRMByte(const MCInst &MI, unsigned Op, 127 uint64_t TSFlags, bool Rex, unsigned &CurByte,
147 unsigned RegOpcodeField, 128 raw_ostream &OS, SmallVectorImpl<MCFixup> &Fixups,
148 uint64_t TSFlags, unsigned &CurByte, raw_ostream &OS,
149 SmallVectorImpl<MCFixup> &Fixups,
150 const MCSubtargetInfo &STI) const; 129 const MCSubtargetInfo &STI) const;
151 130
152 void encodeInstruction(const MCInst &MI, raw_ostream &OS, 131 void encodeInstruction(const MCInst &MI, raw_ostream &OS,
153 SmallVectorImpl<MCFixup> &Fixups, 132 SmallVectorImpl<MCFixup> &Fixups,
154 const MCSubtargetInfo &STI) const override; 133 const MCSubtargetInfo &STI) const override;
158 raw_ostream &OS) const; 137 raw_ostream &OS) const;
159 138
160 void EmitSegmentOverridePrefix(unsigned &CurByte, unsigned SegOperand, 139 void EmitSegmentOverridePrefix(unsigned &CurByte, unsigned SegOperand,
161 const MCInst &MI, raw_ostream &OS) const; 140 const MCInst &MI, raw_ostream &OS) const;
162 141
163 void EmitOpcodePrefix(uint64_t TSFlags, unsigned &CurByte, int MemOperand, 142 bool emitOpcodePrefix(uint64_t TSFlags, unsigned &CurByte, int MemOperand,
164 const MCInst &MI, const MCInstrDesc &Desc, 143 const MCInst &MI, const MCInstrDesc &Desc,
165 const MCSubtargetInfo &STI, 144 const MCSubtargetInfo &STI, raw_ostream &OS) const;
166 raw_ostream &OS) const; 145
146 uint8_t DetermineREXPrefix(const MCInst &MI, uint64_t TSFlags,
147 int MemOperand, const MCInstrDesc &Desc) const;
167 }; 148 };
168 149
169 } // end anonymous namespace 150 } // end anonymous namespace
170 151
171 MCCodeEmitter *llvm::createX86MCCodeEmitter(const MCInstrInfo &MCII, 152 MCCodeEmitter *llvm::createX86MCCodeEmitter(const MCInstrInfo &MCII,
175 } 156 }
176 157
177 /// isDisp8 - Return true if this signed displacement fits in a 8-bit 158 /// isDisp8 - Return true if this signed displacement fits in a 8-bit
178 /// sign-extended field. 159 /// sign-extended field.
179 static bool isDisp8(int Value) { 160 static bool isDisp8(int Value) {
180 return Value == (signed char)Value; 161 return Value == (int8_t)Value;
181 } 162 }
182 163
183 /// isCDisp8 - Return true if this signed displacement fits in a 8-bit 164 /// isCDisp8 - Return true if this signed displacement fits in a 8-bit
184 /// compressed dispacement field. 165 /// compressed dispacement field.
185 static bool isCDisp8(uint64_t TSFlags, int Value, int& CValue) { 166 static bool isCDisp8(uint64_t TSFlags, int Value, int& CValue) {
196 unsigned Mask = CD8_Scale - 1; 177 unsigned Mask = CD8_Scale - 1;
197 assert((CD8_Scale & Mask) == 0 && "Invalid memory object size."); 178 assert((CD8_Scale & Mask) == 0 && "Invalid memory object size.");
198 if (Value & Mask) // Unaligned offset 179 if (Value & Mask) // Unaligned offset
199 return false; 180 return false;
200 Value /= (int)CD8_Scale; 181 Value /= (int)CD8_Scale;
201 bool Ret = (Value == (signed char)Value); 182 bool Ret = (Value == (int8_t)Value);
202 183
203 if (Ret) 184 if (Ret)
204 CValue = Value; 185 CValue = Value;
205 return Ret; 186 return Ret;
206 } 187 }
229 if ((BaseReg.getReg() != 0 && 210 if ((BaseReg.getReg() != 0 &&
230 X86MCRegisterClasses[X86::GR32RegClassID].contains(BaseReg.getReg())) || 211 X86MCRegisterClasses[X86::GR32RegClassID].contains(BaseReg.getReg())) ||
231 (IndexReg.getReg() != 0 && 212 (IndexReg.getReg() != 0 &&
232 X86MCRegisterClasses[X86::GR32RegClassID].contains(IndexReg.getReg()))) 213 X86MCRegisterClasses[X86::GR32RegClassID].contains(IndexReg.getReg())))
233 return true; 214 return true;
215 if (BaseReg.getReg() == X86::EIP) {
216 assert(IndexReg.getReg() == 0 && "Invalid eip-based address.");
217 return true;
218 }
234 return false; 219 return false;
235 } 220 }
236 221
237 /// Is64BitMemOperand - Return true if the specified instruction has 222 /// Is64BitMemOperand - Return true if the specified instruction has
238 /// a 64-bit memory operand. Op specifies the operand # of the memoperand. 223 /// a 64-bit memory operand. Op specifies the operand # of the memoperand.
341 326
342 // If the fixup is pc-relative, we need to bias the value to be relative to 327 // If the fixup is pc-relative, we need to bias the value to be relative to
343 // the start of the field, not the end of the field. 328 // the start of the field, not the end of the field.
344 if (FixupKind == FK_PCRel_4 || 329 if (FixupKind == FK_PCRel_4 ||
345 FixupKind == MCFixupKind(X86::reloc_riprel_4byte) || 330 FixupKind == MCFixupKind(X86::reloc_riprel_4byte) ||
346 FixupKind == MCFixupKind(X86::reloc_riprel_4byte_movq_load)) 331 FixupKind == MCFixupKind(X86::reloc_riprel_4byte_movq_load) ||
332 FixupKind == MCFixupKind(X86::reloc_riprel_4byte_relax) ||
333 FixupKind == MCFixupKind(X86::reloc_riprel_4byte_relax_rex))
347 ImmOffset -= 4; 334 ImmOffset -= 4;
348 if (FixupKind == FK_PCRel_2) 335 if (FixupKind == FK_PCRel_2)
349 ImmOffset -= 2; 336 ImmOffset -= 2;
350 if (FixupKind == FK_PCRel_1) 337 if (FixupKind == FK_PCRel_1)
351 ImmOffset -= 1; 338 ImmOffset -= 1;
357 // Emit a symbolic constant as a fixup and 4 zeros. 344 // Emit a symbolic constant as a fixup and 4 zeros.
358 Fixups.push_back(MCFixup::create(CurByte, Expr, FixupKind, Loc)); 345 Fixups.push_back(MCFixup::create(CurByte, Expr, FixupKind, Loc));
359 EmitConstant(0, Size, CurByte, OS); 346 EmitConstant(0, Size, CurByte, OS);
360 } 347 }
361 348
362 void X86MCCodeEmitter::EmitMemModRMByte(const MCInst &MI, unsigned Op, 349 void X86MCCodeEmitter::emitMemModRMByte(const MCInst &MI, unsigned Op,
363 unsigned RegOpcodeField, 350 unsigned RegOpcodeField,
364 uint64_t TSFlags, unsigned &CurByte, 351 uint64_t TSFlags, bool Rex,
365 raw_ostream &OS, 352 unsigned &CurByte, raw_ostream &OS,
366 SmallVectorImpl<MCFixup> &Fixups, 353 SmallVectorImpl<MCFixup> &Fixups,
367 const MCSubtargetInfo &STI) const{ 354 const MCSubtargetInfo &STI) const {
368 const MCOperand &Disp = MI.getOperand(Op+X86::AddrDisp); 355 const MCOperand &Disp = MI.getOperand(Op+X86::AddrDisp);
369 const MCOperand &Base = MI.getOperand(Op+X86::AddrBaseReg); 356 const MCOperand &Base = MI.getOperand(Op+X86::AddrBaseReg);
370 const MCOperand &Scale = MI.getOperand(Op+X86::AddrScaleAmt); 357 const MCOperand &Scale = MI.getOperand(Op+X86::AddrScaleAmt);
371 const MCOperand &IndexReg = MI.getOperand(Op+X86::AddrIndexReg); 358 const MCOperand &IndexReg = MI.getOperand(Op+X86::AddrIndexReg);
372 unsigned BaseReg = Base.getReg(); 359 unsigned BaseReg = Base.getReg();
373 bool HasEVEX = (TSFlags & X86II::EncodingMask) == X86II::EVEX; 360 bool HasEVEX = (TSFlags & X86II::EncodingMask) == X86II::EVEX;
374 361
375 // Handle %rip relative addressing. 362 // Handle %rip relative addressing.
376 if (BaseReg == X86::RIP) { // [disp32+RIP] in X86-64 mode 363 if (BaseReg == X86::RIP ||
364 BaseReg == X86::EIP) { // [disp32+rIP] in X86-64 mode
377 assert(is64BitMode(STI) && "Rip-relative addressing requires 64-bit mode"); 365 assert(is64BitMode(STI) && "Rip-relative addressing requires 64-bit mode");
378 assert(IndexReg.getReg() == 0 && "Invalid rip-relative address"); 366 assert(IndexReg.getReg() == 0 && "Invalid rip-relative address");
379 EmitByte(ModRMByte(0, RegOpcodeField, 5), CurByte, OS); 367 EmitByte(ModRMByte(0, RegOpcodeField, 5), CurByte, OS);
380 368
381 unsigned FixupKind = X86::reloc_riprel_4byte; 369 unsigned Opcode = MI.getOpcode();
382
383 // movq loads are handled with a special relocation form which allows the 370 // movq loads are handled with a special relocation form which allows the
384 // linker to eliminate some loads for GOT references which end up in the 371 // linker to eliminate some loads for GOT references which end up in the
385 // same linkage unit. 372 // same linkage unit.
386 if (MI.getOpcode() == X86::MOV64rm) 373 unsigned FixupKind = [=]() {
387 FixupKind = X86::reloc_riprel_4byte_movq_load; 374 switch (Opcode) {
375 default:
376 return X86::reloc_riprel_4byte;
377 case X86::MOV64rm:
378 assert(Rex);
379 return X86::reloc_riprel_4byte_movq_load;
380 case X86::CALL64m:
381 case X86::JMP64m:
382 case X86::TEST64rm:
383 case X86::ADC64rm:
384 case X86::ADD64rm:
385 case X86::AND64rm:
386 case X86::CMP64rm:
387 case X86::OR64rm:
388 case X86::SBB64rm:
389 case X86::SUB64rm:
390 case X86::XOR64rm:
391 return Rex ? X86::reloc_riprel_4byte_relax_rex
392 : X86::reloc_riprel_4byte_relax;
393 }
394 }();
388 395
389 // rip-relative addressing is actually relative to the *next* instruction. 396 // rip-relative addressing is actually relative to the *next* instruction.
390 // Since an immediate can follow the mod/rm byte for an instruction, this 397 // Since an immediate can follow the mod/rm byte for an instruction, this
391 // means that we need to bias the immediate field of the instruction with 398 // means that we need to bias the immediate field of the instruction with
392 // the size of the immediate field. If we have this case, add it into the 399 // the size of the immediate field. If we have this case, add it into the
508 } 515 }
509 } 516 }
510 517
511 // Otherwise, emit the most general non-SIB encoding: [REG+disp32] 518 // Otherwise, emit the most general non-SIB encoding: [REG+disp32]
512 EmitByte(ModRMByte(2, RegOpcodeField, BaseRegNo), CurByte, OS); 519 EmitByte(ModRMByte(2, RegOpcodeField, BaseRegNo), CurByte, OS);
513 EmitImmediate(Disp, MI.getLoc(), 4, MCFixupKind(X86::reloc_signed_4byte), 520 unsigned Opcode = MI.getOpcode();
514 CurByte, OS, Fixups); 521 unsigned FixupKind = Opcode == X86::MOV32rm ? X86::reloc_signed_4byte_relax
522 : X86::reloc_signed_4byte;
523 EmitImmediate(Disp, MI.getLoc(), 4, MCFixupKind(FixupKind), CurByte, OS,
524 Fixups);
515 return; 525 return;
516 } 526 }
517 527
518 // We need a SIB byte, so start by outputting the ModR/M byte first 528 // We need a SIB byte, so start by outputting the ModR/M byte first
519 assert(IndexReg.getReg() != X86::ESP && 529 assert(IndexReg.getReg() != X86::ESP &&
591 assert(!(TSFlags & X86II::LOCK) && "Can't have LOCK VEX."); 601 assert(!(TSFlags & X86II::LOCK) && "Can't have LOCK VEX.");
592 602
593 uint64_t Encoding = TSFlags & X86II::EncodingMask; 603 uint64_t Encoding = TSFlags & X86II::EncodingMask;
594 bool HasEVEX_K = TSFlags & X86II::EVEX_K; 604 bool HasEVEX_K = TSFlags & X86II::EVEX_K;
595 bool HasVEX_4V = TSFlags & X86II::VEX_4V; 605 bool HasVEX_4V = TSFlags & X86II::VEX_4V;
596 bool HasVEX_4VOp3 = TSFlags & X86II::VEX_4VOp3;
597 bool HasMemOp4 = TSFlags & X86II::MemOp4;
598 bool HasEVEX_RC = TSFlags & X86II::EVEX_RC; 606 bool HasEVEX_RC = TSFlags & X86II::EVEX_RC;
599 607
600 // VEX_R: opcode externsion equivalent to REX.R in 608 // VEX_R: opcode externsion equivalent to REX.R in
601 // 1's complement (inverted) form 609 // 1's complement (inverted) form
602 // 610 //
603 // 1: Same as REX_R=0 (must be 1 in 32-bit mode) 611 // 1: Same as REX_R=0 (must be 1 in 32-bit mode)
604 // 0: Same as REX_R=1 (64 bit mode only) 612 // 0: Same as REX_R=1 (64 bit mode only)
605 // 613 //
606 unsigned char VEX_R = 0x1; 614 uint8_t VEX_R = 0x1;
607 unsigned char EVEX_R2 = 0x1; 615 uint8_t EVEX_R2 = 0x1;
608 616
609 // VEX_X: equivalent to REX.X, only used when a 617 // VEX_X: equivalent to REX.X, only used when a
610 // register is used for index in SIB Byte. 618 // register is used for index in SIB Byte.
611 // 619 //
612 // 1: Same as REX.X=0 (must be 1 in 32-bit mode) 620 // 1: Same as REX.X=0 (must be 1 in 32-bit mode)
613 // 0: Same as REX.X=1 (64-bit mode only) 621 // 0: Same as REX.X=1 (64-bit mode only)
614 unsigned char VEX_X = 0x1; 622 uint8_t VEX_X = 0x1;
615 623
616 // VEX_B: 624 // VEX_B:
617 // 625 //
618 // 1: Same as REX_B=0 (ignored in 32-bit mode) 626 // 1: Same as REX_B=0 (ignored in 32-bit mode)
619 // 0: Same as REX_B=1 (64 bit mode only) 627 // 0: Same as REX_B=1 (64 bit mode only)
620 // 628 //
621 unsigned char VEX_B = 0x1; 629 uint8_t VEX_B = 0x1;
622 630
623 // VEX_W: opcode specific (use like REX.W, or used for 631 // VEX_W: opcode specific (use like REX.W, or used for
624 // opcode extension, or ignored, depending on the opcode byte) 632 // opcode extension, or ignored, depending on the opcode byte)
625 unsigned char VEX_W = 0; 633 uint8_t VEX_W = (TSFlags & X86II::VEX_W) ? 1 : 0;
626 634
627 // VEX_5M (VEX m-mmmmm field): 635 // VEX_5M (VEX m-mmmmm field):
628 // 636 //
629 // 0b00000: Reserved for future use 637 // 0b00000: Reserved for future use
630 // 0b00001: implied 0F leading opcode 638 // 0b00001: implied 0F leading opcode
632 // 0b00011: implied 0F 3A leading opcode bytes 640 // 0b00011: implied 0F 3A leading opcode bytes
633 // 0b00100-0b11111: Reserved for future use 641 // 0b00100-0b11111: Reserved for future use
634 // 0b01000: XOP map select - 08h instructions with imm byte 642 // 0b01000: XOP map select - 08h instructions with imm byte
635 // 0b01001: XOP map select - 09h instructions with no imm byte 643 // 0b01001: XOP map select - 09h instructions with no imm byte
636 // 0b01010: XOP map select - 0Ah instructions with imm dword 644 // 0b01010: XOP map select - 0Ah instructions with imm dword
637 unsigned char VEX_5M = 0; 645 uint8_t VEX_5M;
646 switch (TSFlags & X86II::OpMapMask) {
647 default: llvm_unreachable("Invalid prefix!");
648 case X86II::TB: VEX_5M = 0x1; break; // 0F
649 case X86II::T8: VEX_5M = 0x2; break; // 0F 38
650 case X86II::TA: VEX_5M = 0x3; break; // 0F 3A
651 case X86II::XOP8: VEX_5M = 0x8; break;
652 case X86II::XOP9: VEX_5M = 0x9; break;
653 case X86II::XOPA: VEX_5M = 0xA; break;
654 }
638 655
639 // VEX_4V (VEX vvvv field): a register specifier 656 // VEX_4V (VEX vvvv field): a register specifier
640 // (in 1's complement form) or 1111 if unused. 657 // (in 1's complement form) or 1111 if unused.
641 unsigned char VEX_4V = 0xf; 658 uint8_t VEX_4V = 0xf;
642 unsigned char EVEX_V2 = 0x1; 659 uint8_t EVEX_V2 = 0x1;
643 660
644 // VEX_L (Vector Length): 661 // EVEX_L2/VEX_L (Vector Length):
645 // 662 //
646 // 0: scalar or 128-bit vector 663 // L2 L
647 // 1: 256-bit vector 664 // 0 0: scalar or 128-bit vector
665 // 0 1: 256-bit vector
666 // 1 0: 512-bit vector
648 // 667 //
649 unsigned char VEX_L = 0; 668 uint8_t VEX_L = (TSFlags & X86II::VEX_L) ? 1 : 0;
650 unsigned char EVEX_L2 = 0; 669 uint8_t EVEX_L2 = (TSFlags & X86II::EVEX_L2) ? 1 : 0;
651 670
652 // VEX_PP: opcode extension providing equivalent 671 // VEX_PP: opcode extension providing equivalent
653 // functionality of a SIMD prefix 672 // functionality of a SIMD prefix
654 // 673 //
655 // 0b00: None 674 // 0b00: None
656 // 0b01: 66 675 // 0b01: 66
657 // 0b10: F3 676 // 0b10: F3
658 // 0b11: F2 677 // 0b11: F2
659 // 678 //
660 unsigned char VEX_PP = 0; 679 uint8_t VEX_PP;
661
662 // EVEX_U
663 unsigned char EVEX_U = 1; // Always '1' so far
664
665 // EVEX_z
666 unsigned char EVEX_z = 0;
667
668 // EVEX_b
669 unsigned char EVEX_b = 0;
670
671 // EVEX_rc
672 unsigned char EVEX_rc = 0;
673
674 // EVEX_aaa
675 unsigned char EVEX_aaa = 0;
676
677 bool EncodeRC = false;
678
679 if (TSFlags & X86II::VEX_W)
680 VEX_W = 1;
681
682 if (TSFlags & X86II::VEX_L)
683 VEX_L = 1;
684 if (TSFlags & X86II::EVEX_L2)
685 EVEX_L2 = 1;
686
687 if (HasEVEX_K && (TSFlags & X86II::EVEX_Z))
688 EVEX_z = 1;
689
690 if ((TSFlags & X86II::EVEX_B))
691 EVEX_b = 1;
692
693 switch (TSFlags & X86II::OpPrefixMask) { 680 switch (TSFlags & X86II::OpPrefixMask) {
694 default: break; // VEX_PP already correct 681 default: llvm_unreachable("Invalid op prefix!");
682 case X86II::PS: VEX_PP = 0x0; break; // none
695 case X86II::PD: VEX_PP = 0x1; break; // 66 683 case X86II::PD: VEX_PP = 0x1; break; // 66
696 case X86II::XS: VEX_PP = 0x2; break; // F3 684 case X86II::XS: VEX_PP = 0x2; break; // F3
697 case X86II::XD: VEX_PP = 0x3; break; // F2 685 case X86II::XD: VEX_PP = 0x3; break; // F2
698 } 686 }
699 687
700 switch (TSFlags & X86II::OpMapMask) { 688 // EVEX_U
701 default: llvm_unreachable("Invalid prefix!"); 689 uint8_t EVEX_U = 1; // Always '1' so far
702 case X86II::TB: VEX_5M = 0x1; break; // 0F 690
703 case X86II::T8: VEX_5M = 0x2; break; // 0F 38 691 // EVEX_z
704 case X86II::TA: VEX_5M = 0x3; break; // 0F 3A 692 uint8_t EVEX_z = (HasEVEX_K && (TSFlags & X86II::EVEX_Z)) ? 1 : 0;
705 case X86II::XOP8: VEX_5M = 0x8; break; 693
706 case X86II::XOP9: VEX_5M = 0x9; break; 694 // EVEX_b
707 case X86II::XOPA: VEX_5M = 0xA; break; 695 uint8_t EVEX_b = (TSFlags & X86II::EVEX_B) ? 1 : 0;
708 } 696
697 // EVEX_rc
698 uint8_t EVEX_rc = 0;
699
700 // EVEX_aaa
701 uint8_t EVEX_aaa = 0;
702
703 bool EncodeRC = false;
709 704
710 // Classify VEX_B, VEX_4V, VEX_R, VEX_X 705 // Classify VEX_B, VEX_4V, VEX_R, VEX_X
711 unsigned NumOps = Desc.getNumOperands(); 706 unsigned NumOps = Desc.getNumOperands();
712 unsigned CurOp = X86II::getOperandBias(Desc); 707 unsigned CurOp = X86II::getOperandBias(Desc);
713 708
719 // MRMDestMem instructions forms: 714 // MRMDestMem instructions forms:
720 // MemAddr, src1(ModR/M) 715 // MemAddr, src1(ModR/M)
721 // MemAddr, src1(VEX_4V), src2(ModR/M) 716 // MemAddr, src1(VEX_4V), src2(ModR/M)
722 // MemAddr, src1(ModR/M), imm8 717 // MemAddr, src1(ModR/M), imm8
723 // 718 //
724 if (X86II::isX86_64ExtendedReg(MI.getOperand(MemOperand + 719 unsigned BaseRegEnc = getX86RegEncoding(MI, MemOperand + X86::AddrBaseReg);
725 X86::AddrBaseReg).getReg())) 720 VEX_B = ~(BaseRegEnc >> 3) & 1;
726 VEX_B = 0x0; 721 unsigned IndexRegEnc = getX86RegEncoding(MI, MemOperand+X86::AddrIndexReg);
727 if (X86II::isX86_64ExtendedReg(MI.getOperand(MemOperand + 722 VEX_X = ~(IndexRegEnc >> 3) & 1;
728 X86::AddrIndexReg).getReg())) 723 if (!HasVEX_4V) // Only needed with VSIB which don't use VVVV.
729 VEX_X = 0x0; 724 EVEX_V2 = ~(IndexRegEnc >> 4) & 1;
730 if (X86II::is32ExtendedReg(MI.getOperand(MemOperand +
731 X86::AddrIndexReg).getReg()))
732 EVEX_V2 = 0x0;
733 725
734 CurOp += X86::AddrNumOperands; 726 CurOp += X86::AddrNumOperands;
735 727
736 if (HasEVEX_K) 728 if (HasEVEX_K)
737 EVEX_aaa = getWriteMaskRegisterEncoding(MI, CurOp++); 729 EVEX_aaa = getX86RegEncoding(MI, CurOp++);
738 730
739 if (HasVEX_4V) { 731 if (HasVEX_4V) {
740 VEX_4V = getVEXRegisterEncoding(MI, CurOp); 732 unsigned VRegEnc = getX86RegEncoding(MI, CurOp++);
741 if (X86II::is32ExtendedReg(MI.getOperand(CurOp).getReg())) 733 VEX_4V = ~VRegEnc & 0xf;
742 EVEX_V2 = 0x0; 734 EVEX_V2 = ~(VRegEnc >> 4) & 1;
743 CurOp++; 735 }
744 } 736
745 737 unsigned RegEnc = getX86RegEncoding(MI, CurOp++);
746 const MCOperand &MO = MI.getOperand(CurOp); 738 VEX_R = ~(RegEnc >> 3) & 1;
747 if (MO.isReg()) { 739 EVEX_R2 = ~(RegEnc >> 4) & 1;
748 if (X86II::isX86_64ExtendedReg(MO.getReg())) 740 break;
749 VEX_R = 0x0; 741 }
750 if (X86II::is32ExtendedReg(MO.getReg())) 742 case X86II::MRMSrcMem: {
751 EVEX_R2 = 0x0;
752 }
753 break;
754 }
755 case X86II::MRMSrcMem:
756 // MRMSrcMem instructions forms: 743 // MRMSrcMem instructions forms:
757 // src1(ModR/M), MemAddr 744 // src1(ModR/M), MemAddr
758 // src1(ModR/M), src2(VEX_4V), MemAddr 745 // src1(ModR/M), src2(VEX_4V), MemAddr
759 // src1(ModR/M), MemAddr, imm8 746 // src1(ModR/M), MemAddr, imm8
760 // src1(ModR/M), MemAddr, src2(VEX_I8IMM) 747 // src1(ModR/M), MemAddr, src2(Imm[7:4])
761 // 748 //
762 // FMA4: 749 // FMA4:
763 // dst(ModR/M.reg), src1(VEX_4V), src2(ModR/M), src3(VEX_I8IMM) 750 // dst(ModR/M.reg), src1(VEX_4V), src2(ModR/M), src3(Imm[7:4])
764 // dst(ModR/M.reg), src1(VEX_4V), src2(VEX_I8IMM), src3(ModR/M), 751 unsigned RegEnc = getX86RegEncoding(MI, CurOp++);
765 if (X86II::isX86_64ExtendedReg(MI.getOperand(CurOp).getReg())) 752 VEX_R = ~(RegEnc >> 3) & 1;
766 VEX_R = 0x0; 753 EVEX_R2 = ~(RegEnc >> 4) & 1;
767 if (X86II::is32ExtendedReg(MI.getOperand(CurOp).getReg()))
768 EVEX_R2 = 0x0;
769 CurOp++;
770 754
771 if (HasEVEX_K) 755 if (HasEVEX_K)
772 EVEX_aaa = getWriteMaskRegisterEncoding(MI, CurOp++); 756 EVEX_aaa = getX86RegEncoding(MI, CurOp++);
773 757
774 if (HasVEX_4V) { 758 if (HasVEX_4V) {
775 VEX_4V = getVEXRegisterEncoding(MI, CurOp); 759 unsigned VRegEnc = getX86RegEncoding(MI, CurOp++);
776 if (X86II::is32ExtendedReg(MI.getOperand(CurOp).getReg())) 760 VEX_4V = ~VRegEnc & 0xf;
777 EVEX_V2 = 0x0; 761 EVEX_V2 = ~(VRegEnc >> 4) & 1;
778 CurOp++; 762 }
779 } 763
780 764 unsigned BaseRegEnc = getX86RegEncoding(MI, MemOperand + X86::AddrBaseReg);
781 if (X86II::isX86_64ExtendedReg( 765 VEX_B = ~(BaseRegEnc >> 3) & 1;
782 MI.getOperand(MemOperand+X86::AddrBaseReg).getReg())) 766 unsigned IndexRegEnc = getX86RegEncoding(MI, MemOperand+X86::AddrIndexReg);
783 VEX_B = 0x0; 767 VEX_X = ~(IndexRegEnc >> 3) & 1;
784 if (X86II::isX86_64ExtendedReg( 768 if (!HasVEX_4V) // Only needed with VSIB which don't use VVVV.
785 MI.getOperand(MemOperand+X86::AddrIndexReg).getReg())) 769 EVEX_V2 = ~(IndexRegEnc >> 4) & 1;
786 VEX_X = 0x0; 770
787 if (X86II::is32ExtendedReg(MI.getOperand(MemOperand + 771 break;
788 X86::AddrIndexReg).getReg())) 772 }
789 EVEX_V2 = 0x0; 773 case X86II::MRMSrcMem4VOp3: {
790 774 // Instruction format for 4VOp3:
791 if (HasVEX_4VOp3) 775 // src1(ModR/M), MemAddr, src3(VEX_4V)
792 // Instruction format for 4VOp3: 776 unsigned RegEnc = getX86RegEncoding(MI, CurOp++);
793 // src1(ModR/M), MemAddr, src3(VEX_4V) 777 VEX_R = ~(RegEnc >> 3) & 1;
794 // CurOp points to start of the MemoryOperand, 778
795 // it skips TIED_TO operands if exist, then increments past src1. 779 unsigned BaseRegEnc = getX86RegEncoding(MI, MemOperand + X86::AddrBaseReg);
796 // CurOp + X86::AddrNumOperands will point to src3. 780 VEX_B = ~(BaseRegEnc >> 3) & 1;
797 VEX_4V = getVEXRegisterEncoding(MI, CurOp+X86::AddrNumOperands); 781 unsigned IndexRegEnc = getX86RegEncoding(MI, MemOperand+X86::AddrIndexReg);
798 break; 782 VEX_X = ~(IndexRegEnc >> 3) & 1;
783
784 VEX_4V = ~getX86RegEncoding(MI, CurOp + X86::AddrNumOperands) & 0xf;
785 break;
786 }
787 case X86II::MRMSrcMemOp4: {
788 // dst(ModR/M.reg), src1(VEX_4V), src2(Imm[7:4]), src3(ModR/M),
789 unsigned RegEnc = getX86RegEncoding(MI, CurOp++);
790 VEX_R = ~(RegEnc >> 3) & 1;
791
792 unsigned VRegEnc = getX86RegEncoding(MI, CurOp++);
793 VEX_4V = ~VRegEnc & 0xf;
794
795 unsigned BaseRegEnc = getX86RegEncoding(MI, MemOperand + X86::AddrBaseReg);
796 VEX_B = ~(BaseRegEnc >> 3) & 1;
797 unsigned IndexRegEnc = getX86RegEncoding(MI, MemOperand+X86::AddrIndexReg);
798 VEX_X = ~(IndexRegEnc >> 3) & 1;
799 break;
800 }
799 case X86II::MRM0m: case X86II::MRM1m: 801 case X86II::MRM0m: case X86II::MRM1m:
800 case X86II::MRM2m: case X86II::MRM3m: 802 case X86II::MRM2m: case X86II::MRM3m:
801 case X86II::MRM4m: case X86II::MRM5m: 803 case X86II::MRM4m: case X86II::MRM5m:
802 case X86II::MRM6m: case X86II::MRM7m: { 804 case X86II::MRM6m: case X86II::MRM7m: {
803 // MRM[0-9]m instructions forms: 805 // MRM[0-9]m instructions forms:
804 // MemAddr 806 // MemAddr
805 // src1(VEX_4V), MemAddr 807 // src1(VEX_4V), MemAddr
806 if (HasVEX_4V) { 808 if (HasVEX_4V) {
807 VEX_4V = getVEXRegisterEncoding(MI, CurOp); 809 unsigned VRegEnc = getX86RegEncoding(MI, CurOp++);
808 if (X86II::is32ExtendedReg(MI.getOperand(CurOp).getReg())) 810 VEX_4V = ~VRegEnc & 0xf;
809 EVEX_V2 = 0x0; 811 EVEX_V2 = ~(VRegEnc >> 4) & 1;
810 CurOp++;
811 } 812 }
812 813
813 if (HasEVEX_K) 814 if (HasEVEX_K)
814 EVEX_aaa = getWriteMaskRegisterEncoding(MI, CurOp++); 815 EVEX_aaa = getX86RegEncoding(MI, CurOp++);
815 816
816 if (X86II::isX86_64ExtendedReg( 817 unsigned BaseRegEnc = getX86RegEncoding(MI, MemOperand + X86::AddrBaseReg);
817 MI.getOperand(MemOperand+X86::AddrBaseReg).getReg())) 818 VEX_B = ~(BaseRegEnc >> 3) & 1;
818 VEX_B = 0x0; 819 unsigned IndexRegEnc = getX86RegEncoding(MI, MemOperand+X86::AddrIndexReg);
819 if (X86II::isX86_64ExtendedReg( 820 VEX_X = ~(IndexRegEnc >> 3) & 1;
820 MI.getOperand(MemOperand+X86::AddrIndexReg).getReg())) 821 break;
821 VEX_X = 0x0; 822 }
822 break; 823 case X86II::MRMSrcReg: {
823 }
824 case X86II::MRMSrcReg:
825 // MRMSrcReg instructions forms: 824 // MRMSrcReg instructions forms:
826 // dst(ModR/M), src1(VEX_4V), src2(ModR/M), src3(VEX_I8IMM) 825 // dst(ModR/M), src1(VEX_4V), src2(ModR/M), src3(Imm[7:4])
827 // dst(ModR/M), src1(ModR/M) 826 // dst(ModR/M), src1(ModR/M)
828 // dst(ModR/M), src1(ModR/M), imm8 827 // dst(ModR/M), src1(ModR/M), imm8
829 // 828 //
830 // FMA4: 829 // FMA4:
831 // dst(ModR/M.reg), src1(VEX_4V), src2(ModR/M), src3(VEX_I8IMM) 830 // dst(ModR/M.reg), src1(VEX_4V), src2(Imm[7:4]), src3(ModR/M),
832 // dst(ModR/M.reg), src1(VEX_4V), src2(VEX_I8IMM), src3(ModR/M), 831 unsigned RegEnc = getX86RegEncoding(MI, CurOp++);
833 if (X86II::isX86_64ExtendedReg(MI.getOperand(CurOp).getReg())) 832 VEX_R = ~(RegEnc >> 3) & 1;
834 VEX_R = 0x0; 833 EVEX_R2 = ~(RegEnc >> 4) & 1;
835 if (X86II::is32ExtendedReg(MI.getOperand(CurOp).getReg()))
836 EVEX_R2 = 0x0;
837 CurOp++;
838 834
839 if (HasEVEX_K) 835 if (HasEVEX_K)
840 EVEX_aaa = getWriteMaskRegisterEncoding(MI, CurOp++); 836 EVEX_aaa = getX86RegEncoding(MI, CurOp++);
841 837
842 if (HasVEX_4V) { 838 if (HasVEX_4V) {
843 VEX_4V = getVEXRegisterEncoding(MI, CurOp); 839 unsigned VRegEnc = getX86RegEncoding(MI, CurOp++);
844 if (X86II::is32ExtendedReg(MI.getOperand(CurOp).getReg())) 840 VEX_4V = ~VRegEnc & 0xf;
845 EVEX_V2 = 0x0; 841 EVEX_V2 = ~(VRegEnc >> 4) & 1;
846 CurOp++; 842 }
847 } 843
848 844 RegEnc = getX86RegEncoding(MI, CurOp++);
849 if (HasMemOp4) // Skip second register source (encoded in I8IMM) 845 VEX_B = ~(RegEnc >> 3) & 1;
850 CurOp++; 846 VEX_X = ~(RegEnc >> 4) & 1;
851 847
852 if (X86II::isX86_64ExtendedReg(MI.getOperand(CurOp).getReg()))
853 VEX_B = 0x0;
854 if (X86II::is32ExtendedReg(MI.getOperand(CurOp).getReg()))
855 VEX_X = 0x0;
856 CurOp++;
857 if (HasVEX_4VOp3)
858 VEX_4V = getVEXRegisterEncoding(MI, CurOp++);
859 if (EVEX_b) { 848 if (EVEX_b) {
860 if (HasEVEX_RC) { 849 if (HasEVEX_RC) {
861 unsigned RcOperand = NumOps-1; 850 unsigned RcOperand = NumOps-1;
862 assert(RcOperand >= CurOp); 851 assert(RcOperand >= CurOp);
863 EVEX_rc = MI.getOperand(RcOperand).getImm() & 0x3; 852 EVEX_rc = MI.getOperand(RcOperand).getImm() & 0x3;
864 } 853 }
865 EncodeRC = true; 854 EncodeRC = true;
866 } 855 }
867 break; 856 break;
868 case X86II::MRMDestReg: 857 }
858 case X86II::MRMSrcReg4VOp3: {
859 // Instruction format for 4VOp3:
860 // src1(ModR/M), src2(ModR/M), src3(VEX_4V)
861 unsigned RegEnc = getX86RegEncoding(MI, CurOp++);
862 VEX_R = ~(RegEnc >> 3) & 1;
863
864 RegEnc = getX86RegEncoding(MI, CurOp++);
865 VEX_B = ~(RegEnc >> 3) & 1;
866
867 VEX_4V = ~getX86RegEncoding(MI, CurOp++) & 0xf;
868 break;
869 }
870 case X86II::MRMSrcRegOp4: {
871 // dst(ModR/M.reg), src1(VEX_4V), src2(Imm[7:4]), src3(ModR/M),
872 unsigned RegEnc = getX86RegEncoding(MI, CurOp++);
873 VEX_R = ~(RegEnc >> 3) & 1;
874
875 unsigned VRegEnc = getX86RegEncoding(MI, CurOp++);
876 VEX_4V = ~VRegEnc & 0xf;
877
878 // Skip second register source (encoded in Imm[7:4])
879 ++CurOp;
880
881 RegEnc = getX86RegEncoding(MI, CurOp++);
882 VEX_B = ~(RegEnc >> 3) & 1;
883 VEX_X = ~(RegEnc >> 4) & 1;
884 break;
885 }
886 case X86II::MRMDestReg: {
869 // MRMDestReg instructions forms: 887 // MRMDestReg instructions forms:
870 // dst(ModR/M), src(ModR/M) 888 // dst(ModR/M), src(ModR/M)
871 // dst(ModR/M), src(ModR/M), imm8 889 // dst(ModR/M), src(ModR/M), imm8
872 // dst(ModR/M), src1(VEX_4V), src2(ModR/M) 890 // dst(ModR/M), src1(VEX_4V), src2(ModR/M)
873 if (X86II::isX86_64ExtendedReg(MI.getOperand(CurOp).getReg())) 891 unsigned RegEnc = getX86RegEncoding(MI, CurOp++);
874 VEX_B = 0x0; 892 VEX_B = ~(RegEnc >> 3) & 1;
875 if (X86II::is32ExtendedReg(MI.getOperand(CurOp).getReg())) 893 VEX_X = ~(RegEnc >> 4) & 1;
876 VEX_X = 0x0;
877 CurOp++;
878 894
879 if (HasEVEX_K) 895 if (HasEVEX_K)
880 EVEX_aaa = getWriteMaskRegisterEncoding(MI, CurOp++); 896 EVEX_aaa = getX86RegEncoding(MI, CurOp++);
881 897
882 if (HasVEX_4V) { 898 if (HasVEX_4V) {
883 VEX_4V = getVEXRegisterEncoding(MI, CurOp); 899 unsigned VRegEnc = getX86RegEncoding(MI, CurOp++);
884 if (X86II::is32ExtendedReg(MI.getOperand(CurOp).getReg())) 900 VEX_4V = ~VRegEnc & 0xf;
885 EVEX_V2 = 0x0; 901 EVEX_V2 = ~(VRegEnc >> 4) & 1;
886 CurOp++; 902 }
887 } 903
888 904 RegEnc = getX86RegEncoding(MI, CurOp++);
889 if (X86II::isX86_64ExtendedReg(MI.getOperand(CurOp).getReg())) 905 VEX_R = ~(RegEnc >> 3) & 1;
890 VEX_R = 0x0; 906 EVEX_R2 = ~(RegEnc >> 4) & 1;
891 if (X86II::is32ExtendedReg(MI.getOperand(CurOp).getReg()))
892 EVEX_R2 = 0x0;
893 if (EVEX_b) 907 if (EVEX_b)
894 EncodeRC = true; 908 EncodeRC = true;
895 break; 909 break;
910 }
896 case X86II::MRM0r: case X86II::MRM1r: 911 case X86II::MRM0r: case X86II::MRM1r:
897 case X86II::MRM2r: case X86II::MRM3r: 912 case X86II::MRM2r: case X86II::MRM3r:
898 case X86II::MRM4r: case X86II::MRM5r: 913 case X86II::MRM4r: case X86II::MRM5r:
899 case X86II::MRM6r: case X86II::MRM7r: 914 case X86II::MRM6r: case X86II::MRM7r: {
900 // MRM0r-MRM7r instructions forms: 915 // MRM0r-MRM7r instructions forms:
901 // dst(VEX_4V), src(ModR/M), imm8 916 // dst(VEX_4V), src(ModR/M), imm8
902 if (HasVEX_4V) { 917 if (HasVEX_4V) {
903 VEX_4V = getVEXRegisterEncoding(MI, CurOp); 918 unsigned VRegEnc = getX86RegEncoding(MI, CurOp++);
904 if (X86II::is32ExtendedReg(MI.getOperand(CurOp).getReg())) 919 VEX_4V = ~VRegEnc & 0xf;
905 EVEX_V2 = 0x0; 920 EVEX_V2 = ~(VRegEnc >> 4) & 1;
906 CurOp++;
907 } 921 }
908 if (HasEVEX_K) 922 if (HasEVEX_K)
909 EVEX_aaa = getWriteMaskRegisterEncoding(MI, CurOp++); 923 EVEX_aaa = getX86RegEncoding(MI, CurOp++);
910 924
911 if (X86II::isX86_64ExtendedReg(MI.getOperand(CurOp).getReg())) 925 unsigned RegEnc = getX86RegEncoding(MI, CurOp++);
912 VEX_B = 0x0; 926 VEX_B = ~(RegEnc >> 3) & 1;
913 if (X86II::is32ExtendedReg(MI.getOperand(CurOp).getReg())) 927 VEX_X = ~(RegEnc >> 4) & 1;
914 VEX_X = 0x0; 928 break;
915 break; 929 }
916 } 930 }
917 931
918 if (Encoding == X86II::VEX || Encoding == X86II::XOP) { 932 if (Encoding == X86II::VEX || Encoding == X86II::XOP) {
919 // VEX opcode prefix can have 2 or 3 bytes 933 // VEX opcode prefix can have 2 or 3 bytes
920 // 934 //
929 // 943 //
930 // XOP uses a similar prefix: 944 // XOP uses a similar prefix:
931 // +-----+ +--------------+ +-------------------+ 945 // +-----+ +--------------+ +-------------------+
932 // | 8Fh | | RXB | m-mmmm | | W | vvvv | L | pp | 946 // | 8Fh | | RXB | m-mmmm | | W | vvvv | L | pp |
933 // +-----+ +--------------+ +-------------------+ 947 // +-----+ +--------------+ +-------------------+
934 unsigned char LastByte = VEX_PP | (VEX_L << 2) | (VEX_4V << 3); 948 uint8_t LastByte = VEX_PP | (VEX_L << 2) | (VEX_4V << 3);
935 949
936 // Can we use the 2 byte VEX prefix? 950 // Can we use the 2 byte VEX prefix?
937 if (Encoding == X86II::VEX && VEX_B && VEX_X && !VEX_W && (VEX_5M == 1)) { 951 if (Encoding == X86II::VEX && VEX_B && VEX_X && !VEX_W && (VEX_5M == 1)) {
938 EmitByte(0xC5, CurByte, OS); 952 EmitByte(0xC5, CurByte, OS);
939 EmitByte(LastByte | (VEX_R << 7), CurByte, OS); 953 EmitByte(LastByte | (VEX_R << 7), CurByte, OS);
952 // | 62h | | RXBR' | 00mm | | W | vvvv | U | pp | | z | L'L | b | v' | aaa | 966 // | 62h | | RXBR' | 00mm | | W | vvvv | U | pp | | z | L'L | b | v' | aaa |
953 // +-----+ +--------------+ +-------------------+ +------------------------+ 967 // +-----+ +--------------+ +-------------------+ +------------------------+
954 assert((VEX_5M & 0x3) == VEX_5M 968 assert((VEX_5M & 0x3) == VEX_5M
955 && "More than 2 significant bits in VEX.m-mmmm fields for EVEX!"); 969 && "More than 2 significant bits in VEX.m-mmmm fields for EVEX!");
956 970
957 VEX_5M &= 0x3;
958
959 EmitByte(0x62, CurByte, OS); 971 EmitByte(0x62, CurByte, OS);
960 EmitByte((VEX_R << 7) | 972 EmitByte((VEX_R << 7) |
961 (VEX_X << 6) | 973 (VEX_X << 6) |
962 (VEX_B << 5) | 974 (VEX_B << 5) |
963 (EVEX_R2 << 4) | 975 (EVEX_R2 << 4) |
966 (VEX_4V << 3) | 978 (VEX_4V << 3) |
967 (EVEX_U << 2) | 979 (EVEX_U << 2) |
968 VEX_PP, CurByte, OS); 980 VEX_PP, CurByte, OS);
969 if (EncodeRC) 981 if (EncodeRC)
970 EmitByte((EVEX_z << 7) | 982 EmitByte((EVEX_z << 7) |
971 (EVEX_rc << 5) | 983 (EVEX_rc << 5) |
972 (EVEX_b << 4) | 984 (EVEX_b << 4) |
973 (EVEX_V2 << 3) | 985 (EVEX_V2 << 3) |
974 EVEX_aaa, CurByte, OS); 986 EVEX_aaa, CurByte, OS);
975 else 987 else
976 EmitByte((EVEX_z << 7) | 988 EmitByte((EVEX_z << 7) |
977 (EVEX_L2 << 6) | 989 (EVEX_L2 << 6) |
978 (VEX_L << 5) | 990 (VEX_L << 5) |
979 (EVEX_b << 4) | 991 (EVEX_b << 4) |
980 (EVEX_V2 << 3) | 992 (EVEX_V2 << 3) |
981 EVEX_aaa, CurByte, OS); 993 EVEX_aaa, CurByte, OS);
982 } 994 }
983 } 995 }
984 996
985 /// DetermineREXPrefix - Determine if the MCInst has to be encoded with a X86-64 997 /// DetermineREXPrefix - Determine if the MCInst has to be encoded with a X86-64
986 /// REX prefix which specifies 1) 64-bit instructions, 2) non-default operand 998 /// REX prefix which specifies 1) 64-bit instructions, 2) non-default operand
987 /// size, and 3) use of X86-64 extended registers. 999 /// size, and 3) use of X86-64 extended registers.
988 static unsigned DetermineREXPrefix(const MCInst &MI, uint64_t TSFlags, 1000 uint8_t X86MCCodeEmitter::DetermineREXPrefix(const MCInst &MI, uint64_t TSFlags,
989 const MCInstrDesc &Desc) { 1001 int MemOperand,
990 unsigned REX = 0; 1002 const MCInstrDesc &Desc) const {
1003 uint8_t REX = 0;
991 bool UsesHighByteReg = false; 1004 bool UsesHighByteReg = false;
992 1005
993 if (TSFlags & X86II::REX_W) 1006 if (TSFlags & X86II::REX_W)
994 REX |= 1 << 3; // set REX.W 1007 REX |= 1 << 3; // set REX.W
995 1008
996 if (MI.getNumOperands() == 0) return REX; 1009 if (MI.getNumOperands() == 0) return REX;
997 1010
998 unsigned NumOps = MI.getNumOperands(); 1011 unsigned NumOps = MI.getNumOperands();
999 // FIXME: MCInst should explicitize the two-addrness. 1012 unsigned CurOp = X86II::getOperandBias(Desc);
1000 bool isTwoAddr = NumOps > 1 &&
1001 Desc.getOperandConstraint(1, MCOI::TIED_TO) != -1;
1002 1013
1003 // If it accesses SPL, BPL, SIL, or DIL, then it requires a 0x40 REX prefix. 1014 // If it accesses SPL, BPL, SIL, or DIL, then it requires a 0x40 REX prefix.
1004 unsigned i = isTwoAddr ? 1 : 0; 1015 for (unsigned i = CurOp; i != NumOps; ++i) {
1005 for (; i != NumOps; ++i) {
1006 const MCOperand &MO = MI.getOperand(i); 1016 const MCOperand &MO = MI.getOperand(i);
1007 if (!MO.isReg()) continue; 1017 if (!MO.isReg()) continue;
1008 unsigned Reg = MO.getReg(); 1018 unsigned Reg = MO.getReg();
1009 if (Reg == X86::AH || Reg == X86::BH || Reg == X86::CH || Reg == X86::DH) 1019 if (Reg == X86::AH || Reg == X86::BH || Reg == X86::CH || Reg == X86::DH)
1010 UsesHighByteReg = true; 1020 UsesHighByteReg = true;
1011 if (!X86II::isX86_64NonExtLowByteReg(Reg)) continue; 1021 if (X86II::isX86_64NonExtLowByteReg(Reg))
1012 // FIXME: The caller of DetermineREXPrefix slaps this prefix onto anything 1022 // FIXME: The caller of DetermineREXPrefix slaps this prefix onto anything
1013 // that returns non-zero. 1023 // that returns non-zero.
1014 REX |= 0x40; // REX fixed encoding prefix 1024 REX |= 0x40; // REX fixed encoding prefix
1015 break;
1016 } 1025 }
1017 1026
1018 switch (TSFlags & X86II::FormMask) { 1027 switch (TSFlags & X86II::FormMask) {
1028 case X86II::AddRegFrm:
1029 REX |= isREXExtendedReg(MI, CurOp++) << 0; // REX.B
1030 break;
1019 case X86II::MRMSrcReg: 1031 case X86II::MRMSrcReg:
1020 if (MI.getOperand(0).isReg() && 1032 REX |= isREXExtendedReg(MI, CurOp++) << 2; // REX.R
1021 X86II::isX86_64ExtendedReg(MI.getOperand(0).getReg())) 1033 REX |= isREXExtendedReg(MI, CurOp++) << 0; // REX.B
1022 REX |= 1 << 2; // set REX.R
1023 i = isTwoAddr ? 2 : 1;
1024 for (; i != NumOps; ++i) {
1025 const MCOperand &MO = MI.getOperand(i);
1026 if (MO.isReg() && X86II::isX86_64ExtendedReg(MO.getReg()))
1027 REX |= 1 << 0; // set REX.B
1028 }
1029 break; 1034 break;
1030 case X86II::MRMSrcMem: { 1035 case X86II::MRMSrcMem: {
1031 if (MI.getOperand(0).isReg() && 1036 REX |= isREXExtendedReg(MI, CurOp++) << 2; // REX.R
1032 X86II::isX86_64ExtendedReg(MI.getOperand(0).getReg())) 1037 REX |= isREXExtendedReg(MI, MemOperand+X86::AddrBaseReg) << 0; // REX.B
1033 REX |= 1 << 2; // set REX.R 1038 REX |= isREXExtendedReg(MI, MemOperand+X86::AddrIndexReg) << 1; // REX.X
1034 unsigned Bit = 0; 1039 CurOp += X86::AddrNumOperands;
1035 i = isTwoAddr ? 2 : 1; 1040 break;
1036 for (; i != NumOps; ++i) { 1041 }
1037 const MCOperand &MO = MI.getOperand(i); 1042 case X86II::MRMDestReg:
1038 if (MO.isReg()) { 1043 REX |= isREXExtendedReg(MI, CurOp++) << 0; // REX.B
1039 if (X86II::isX86_64ExtendedReg(MO.getReg())) 1044 REX |= isREXExtendedReg(MI, CurOp++) << 2; // REX.R
1040 REX |= 1 << Bit; // set REX.B (Bit=0) and REX.X (Bit=1) 1045 break;
1041 Bit++; 1046 case X86II::MRMDestMem:
1042 } 1047 REX |= isREXExtendedReg(MI, MemOperand+X86::AddrBaseReg) << 0; // REX.B
1043 } 1048 REX |= isREXExtendedReg(MI, MemOperand+X86::AddrIndexReg) << 1; // REX.X
1044 break; 1049 CurOp += X86::AddrNumOperands;
1045 } 1050 REX |= isREXExtendedReg(MI, CurOp++) << 2; // REX.R
1051 break;
1046 case X86II::MRMXm: 1052 case X86II::MRMXm:
1047 case X86II::MRM0m: case X86II::MRM1m: 1053 case X86II::MRM0m: case X86II::MRM1m:
1048 case X86II::MRM2m: case X86II::MRM3m: 1054 case X86II::MRM2m: case X86II::MRM3m:
1049 case X86II::MRM4m: case X86II::MRM5m: 1055 case X86II::MRM4m: case X86II::MRM5m:
1050 case X86II::MRM6m: case X86II::MRM7m: 1056 case X86II::MRM6m: case X86II::MRM7m:
1051 case X86II::MRMDestMem: { 1057 REX |= isREXExtendedReg(MI, MemOperand+X86::AddrBaseReg) << 0; // REX.B
1052 unsigned e = (isTwoAddr ? X86::AddrNumOperands+1 : X86::AddrNumOperands); 1058 REX |= isREXExtendedReg(MI, MemOperand+X86::AddrIndexReg) << 1; // REX.X
1053 i = isTwoAddr ? 1 : 0; 1059 break;
1054 if (NumOps > e && MI.getOperand(e).isReg() && 1060 case X86II::MRMXr:
1055 X86II::isX86_64ExtendedReg(MI.getOperand(e).getReg())) 1061 case X86II::MRM0r: case X86II::MRM1r:
1056 REX |= 1 << 2; // set REX.R 1062 case X86II::MRM2r: case X86II::MRM3r:
1057 unsigned Bit = 0; 1063 case X86II::MRM4r: case X86II::MRM5r:
1058 for (; i != e; ++i) { 1064 case X86II::MRM6r: case X86II::MRM7r:
1059 const MCOperand &MO = MI.getOperand(i); 1065 REX |= isREXExtendedReg(MI, CurOp++) << 0; // REX.B
1060 if (MO.isReg()) {
1061 if (X86II::isX86_64ExtendedReg(MO.getReg()))
1062 REX |= 1 << Bit; // REX.B (Bit=0) and REX.X (Bit=1)
1063 Bit++;
1064 }
1065 }
1066 break;
1067 }
1068 default:
1069 if (MI.getOperand(0).isReg() &&
1070 X86II::isX86_64ExtendedReg(MI.getOperand(0).getReg()))
1071 REX |= 1 << 0; // set REX.B
1072 i = isTwoAddr ? 2 : 1;
1073 for (unsigned e = NumOps; i != e; ++i) {
1074 const MCOperand &MO = MI.getOperand(i);
1075 if (MO.isReg() && X86II::isX86_64ExtendedReg(MO.getReg()))
1076 REX |= 1 << 2; // set REX.R
1077 }
1078 break; 1066 break;
1079 } 1067 }
1080 if (REX && UsesHighByteReg) 1068 if (REX && UsesHighByteReg)
1081 report_fatal_error("Cannot encode high byte register in REX-prefixed instruction"); 1069 report_fatal_error("Cannot encode high byte register in REX-prefixed instruction");
1082 1070
1099 case X86::FS: EmitByte(0x64, CurByte, OS); break; 1087 case X86::FS: EmitByte(0x64, CurByte, OS); break;
1100 case X86::GS: EmitByte(0x65, CurByte, OS); break; 1088 case X86::GS: EmitByte(0x65, CurByte, OS); break;
1101 } 1089 }
1102 } 1090 }
1103 1091
1104 /// EmitOpcodePrefix - Emit all instruction prefixes prior to the opcode. 1092 /// Emit all instruction prefixes prior to the opcode.
1105 /// 1093 ///
1106 /// MemOperand is the operand # of the start of a memory operand if present. If 1094 /// MemOperand is the operand # of the start of a memory operand if present. If
1107 /// Not present, it is -1. 1095 /// Not present, it is -1.
1108 void X86MCCodeEmitter::EmitOpcodePrefix(uint64_t TSFlags, unsigned &CurByte, 1096 ///
1097 /// Returns true if a REX prefix was used.
1098 bool X86MCCodeEmitter::emitOpcodePrefix(uint64_t TSFlags, unsigned &CurByte,
1109 int MemOperand, const MCInst &MI, 1099 int MemOperand, const MCInst &MI,
1110 const MCInstrDesc &Desc, 1100 const MCInstrDesc &Desc,
1111 const MCSubtargetInfo &STI, 1101 const MCSubtargetInfo &STI,
1112 raw_ostream &OS) const { 1102 raw_ostream &OS) const {
1113 1103 bool Ret = false;
1114 // Emit the operand size opcode prefix as needed. 1104 // Emit the operand size opcode prefix as needed.
1115 if ((TSFlags & X86II::OpSizeMask) == (is16BitMode(STI) ? X86II::OpSize32 1105 if ((TSFlags & X86II::OpSizeMask) == (is16BitMode(STI) ? X86II::OpSize32
1116 : X86II::OpSize16)) 1106 : X86II::OpSize16))
1117 EmitByte(0x66, CurByte, OS); 1107 EmitByte(0x66, CurByte, OS);
1118 1108
1133 } 1123 }
1134 1124
1135 // Handle REX prefix. 1125 // Handle REX prefix.
1136 // FIXME: Can this come before F2 etc to simplify emission? 1126 // FIXME: Can this come before F2 etc to simplify emission?
1137 if (is64BitMode(STI)) { 1127 if (is64BitMode(STI)) {
1138 if (unsigned REX = DetermineREXPrefix(MI, TSFlags, Desc)) 1128 if (uint8_t REX = DetermineREXPrefix(MI, TSFlags, MemOperand, Desc)) {
1139 EmitByte(0x40 | REX, CurByte, OS); 1129 EmitByte(0x40 | REX, CurByte, OS);
1130 Ret = true;
1131 }
1140 } 1132 }
1141 1133
1142 // 0x0F escape code must be emitted just before the opcode. 1134 // 0x0F escape code must be emitted just before the opcode.
1143 switch (TSFlags & X86II::OpMapMask) { 1135 switch (TSFlags & X86II::OpMapMask) {
1144 case X86II::TB: // Two-byte opcode map 1136 case X86II::TB: // Two-byte opcode map
1154 break; 1146 break;
1155 case X86II::TA: // 0F 3A 1147 case X86II::TA: // 0F 3A
1156 EmitByte(0x3A, CurByte, OS); 1148 EmitByte(0x3A, CurByte, OS);
1157 break; 1149 break;
1158 } 1150 }
1151 return Ret;
1159 } 1152 }
1160 1153
1161 void X86MCCodeEmitter:: 1154 void X86MCCodeEmitter::
1162 encodeInstruction(const MCInst &MI, raw_ostream &OS, 1155 encodeInstruction(const MCInst &MI, raw_ostream &OS,
1163 SmallVectorImpl<MCFixup> &Fixups, 1156 SmallVectorImpl<MCFixup> &Fixups,
1179 // Encoding type for this instruction. 1172 // Encoding type for this instruction.
1180 uint64_t Encoding = TSFlags & X86II::EncodingMask; 1173 uint64_t Encoding = TSFlags & X86II::EncodingMask;
1181 1174
1182 // It uses the VEX.VVVV field? 1175 // It uses the VEX.VVVV field?
1183 bool HasVEX_4V = TSFlags & X86II::VEX_4V; 1176 bool HasVEX_4V = TSFlags & X86II::VEX_4V;
1184 bool HasVEX_4VOp3 = TSFlags & X86II::VEX_4VOp3; 1177 bool HasVEX_I8Reg = (TSFlags & X86II::ImmMask) == X86II::Imm8Reg;
1185 bool HasMemOp4 = TSFlags & X86II::MemOp4;
1186 const unsigned MemOp4_I8IMMOperand = 2;
1187 1178
1188 // It uses the EVEX.aaa field? 1179 // It uses the EVEX.aaa field?
1189 bool HasEVEX_K = TSFlags & X86II::EVEX_K; 1180 bool HasEVEX_K = TSFlags & X86II::EVEX_K;
1190 bool HasEVEX_RC = TSFlags & X86II::EVEX_RC; 1181 bool HasEVEX_RC = TSFlags & X86II::EVEX_RC;
1191 1182
1183 // Used if a register is encoded in 7:4 of immediate.
1184 unsigned I8RegNum = 0;
1185
1192 // Determine where the memory operand starts, if present. 1186 // Determine where the memory operand starts, if present.
1193 int MemoryOperand = X86II::getMemoryOperandNo(TSFlags, Opcode); 1187 int MemoryOperand = X86II::getMemoryOperandNo(TSFlags);
1194 if (MemoryOperand != -1) MemoryOperand += CurOp; 1188 if (MemoryOperand != -1) MemoryOperand += CurOp;
1195 1189
1196 // Emit segment override opcode prefix as needed. 1190 // Emit segment override opcode prefix as needed.
1197 if (MemoryOperand >= 0) 1191 if (MemoryOperand >= 0)
1198 EmitSegmentOverridePrefix(CurByte, MemoryOperand+X86::AddrSegmentReg, 1192 EmitSegmentOverridePrefix(CurByte, MemoryOperand+X86::AddrSegmentReg,
1224 } 1218 }
1225 1219
1226 if (need_address_override) 1220 if (need_address_override)
1227 EmitByte(0x67, CurByte, OS); 1221 EmitByte(0x67, CurByte, OS);
1228 1222
1223 bool Rex = false;
1229 if (Encoding == 0) 1224 if (Encoding == 0)
1230 EmitOpcodePrefix(TSFlags, CurByte, MemoryOperand, MI, Desc, STI, OS); 1225 Rex = emitOpcodePrefix(TSFlags, CurByte, MemoryOperand, MI, Desc, STI, OS);
1231 else 1226 else
1232 EmitVEXOpcodePrefix(TSFlags, CurByte, MemoryOperand, MI, Desc, OS); 1227 EmitVEXOpcodePrefix(TSFlags, CurByte, MemoryOperand, MI, Desc, OS);
1233 1228
1234 unsigned char BaseOpcode = X86II::getBaseOpcodeFor(TSFlags); 1229 uint8_t BaseOpcode = X86II::getBaseOpcodeFor(TSFlags);
1235 1230
1236 if (TSFlags & X86II::Has3DNow0F0FOpcode) 1231 if (TSFlags & X86II::Has3DNow0F0FOpcode)
1237 BaseOpcode = 0x0F; // Weird 3DNow! encoding. 1232 BaseOpcode = 0x0F; // Weird 3DNow! encoding.
1238 1233
1239 unsigned SrcRegNum = 0; 1234 uint64_t Form = TSFlags & X86II::FormMask;
1240 switch (TSFlags & X86II::FormMask) { 1235 switch (Form) {
1241 default: errs() << "FORM: " << (TSFlags & X86II::FormMask) << "\n"; 1236 default: errs() << "FORM: " << Form << "\n";
1242 llvm_unreachable("Unknown FormMask value in X86MCCodeEmitter!"); 1237 llvm_unreachable("Unknown FormMask value in X86MCCodeEmitter!");
1243 case X86II::Pseudo: 1238 case X86II::Pseudo:
1244 llvm_unreachable("Pseudo instruction shouldn't be emitted"); 1239 llvm_unreachable("Pseudo instruction shouldn't be emitted");
1245 case X86II::RawFrmDstSrc: { 1240 case X86II::RawFrmDstSrc: {
1246 unsigned siReg = MI.getOperand(1).getReg(); 1241 unsigned siReg = MI.getOperand(1).getReg();
1313 1308
1314 case X86II::AddRegFrm: 1309 case X86II::AddRegFrm:
1315 EmitByte(BaseOpcode + GetX86RegNum(MI.getOperand(CurOp++)), CurByte, OS); 1310 EmitByte(BaseOpcode + GetX86RegNum(MI.getOperand(CurOp++)), CurByte, OS);
1316 break; 1311 break;
1317 1312
1318 case X86II::MRMDestReg: 1313 case X86II::MRMDestReg: {
1319 EmitByte(BaseOpcode, CurByte, OS); 1314 EmitByte(BaseOpcode, CurByte, OS);
1320 SrcRegNum = CurOp + 1; 1315 unsigned SrcRegNum = CurOp + 1;
1321 1316
1322 if (HasEVEX_K) // Skip writemask 1317 if (HasEVEX_K) // Skip writemask
1323 SrcRegNum++; 1318 ++SrcRegNum;
1324 1319
1325 if (HasVEX_4V) // Skip 1st src (which is encoded in VEX_VVVV) 1320 if (HasVEX_4V) // Skip 1st src (which is encoded in VEX_VVVV)
1326 ++SrcRegNum; 1321 ++SrcRegNum;
1327 1322
1328 EmitRegModRMByte(MI.getOperand(CurOp), 1323 EmitRegModRMByte(MI.getOperand(CurOp),
1329 GetX86RegNum(MI.getOperand(SrcRegNum)), CurByte, OS); 1324 GetX86RegNum(MI.getOperand(SrcRegNum)), CurByte, OS);
1330 CurOp = SrcRegNum + 1; 1325 CurOp = SrcRegNum + 1;
1331 break; 1326 break;
1332 1327 }
1333 case X86II::MRMDestMem: 1328 case X86II::MRMDestMem: {
1334 EmitByte(BaseOpcode, CurByte, OS); 1329 EmitByte(BaseOpcode, CurByte, OS);
1335 SrcRegNum = CurOp + X86::AddrNumOperands; 1330 unsigned SrcRegNum = CurOp + X86::AddrNumOperands;
1336 1331
1337 if (HasEVEX_K) // Skip writemask 1332 if (HasEVEX_K) // Skip writemask
1338 SrcRegNum++; 1333 ++SrcRegNum;
1339 1334
1340 if (HasVEX_4V) // Skip 1st src (which is encoded in VEX_VVVV) 1335 if (HasVEX_4V) // Skip 1st src (which is encoded in VEX_VVVV)
1341 ++SrcRegNum; 1336 ++SrcRegNum;
1342 1337
1343 EmitMemModRMByte(MI, CurOp, 1338 emitMemModRMByte(MI, CurOp, GetX86RegNum(MI.getOperand(SrcRegNum)), TSFlags,
1344 GetX86RegNum(MI.getOperand(SrcRegNum)), 1339 Rex, CurByte, OS, Fixups, STI);
1345 TSFlags, CurByte, OS, Fixups, STI);
1346 CurOp = SrcRegNum + 1; 1340 CurOp = SrcRegNum + 1;
1347 break; 1341 break;
1348 1342 }
1349 case X86II::MRMSrcReg: 1343 case X86II::MRMSrcReg: {
1350 EmitByte(BaseOpcode, CurByte, OS); 1344 EmitByte(BaseOpcode, CurByte, OS);
1351 SrcRegNum = CurOp + 1; 1345 unsigned SrcRegNum = CurOp + 1;
1352 1346
1353 if (HasEVEX_K) // Skip writemask 1347 if (HasEVEX_K) // Skip writemask
1354 SrcRegNum++; 1348 ++SrcRegNum;
1355 1349
1356 if (HasVEX_4V) // Skip 1st src (which is encoded in VEX_VVVV) 1350 if (HasVEX_4V) // Skip 1st src (which is encoded in VEX_VVVV)
1357 ++SrcRegNum; 1351 ++SrcRegNum;
1358 1352
1359 if (HasMemOp4) // Skip 2nd src (which is encoded in I8IMM)
1360 ++SrcRegNum;
1361
1362 EmitRegModRMByte(MI.getOperand(SrcRegNum), 1353 EmitRegModRMByte(MI.getOperand(SrcRegNum),
1363 GetX86RegNum(MI.getOperand(CurOp)), CurByte, OS); 1354 GetX86RegNum(MI.getOperand(CurOp)), CurByte, OS);
1364 1355 CurOp = SrcRegNum + 1;
1365 // 2 operands skipped with HasMemOp4, compensate accordingly 1356 if (HasVEX_I8Reg)
1366 CurOp = HasMemOp4 ? SrcRegNum : SrcRegNum + 1; 1357 I8RegNum = getX86RegEncoding(MI, CurOp++);
1367 if (HasVEX_4VOp3)
1368 ++CurOp;
1369 // do not count the rounding control operand 1358 // do not count the rounding control operand
1370 if (HasEVEX_RC) 1359 if (HasEVEX_RC)
1371 NumOps--; 1360 --NumOps;
1372 break; 1361 break;
1373 1362 }
1363 case X86II::MRMSrcReg4VOp3: {
1364 EmitByte(BaseOpcode, CurByte, OS);
1365 unsigned SrcRegNum = CurOp + 1;
1366
1367 EmitRegModRMByte(MI.getOperand(SrcRegNum),
1368 GetX86RegNum(MI.getOperand(CurOp)), CurByte, OS);
1369 CurOp = SrcRegNum + 1;
1370 ++CurOp; // Encoded in VEX.VVVV
1371 break;
1372 }
1373 case X86II::MRMSrcRegOp4: {
1374 EmitByte(BaseOpcode, CurByte, OS);
1375 unsigned SrcRegNum = CurOp + 1;
1376
1377 // Skip 1st src (which is encoded in VEX_VVVV)
1378 ++SrcRegNum;
1379
1380 // Capture 2nd src (which is encoded in Imm[7:4])
1381 assert(HasVEX_I8Reg && "MRMSrcRegOp4 should imply VEX_I8Reg");
1382 I8RegNum = getX86RegEncoding(MI, SrcRegNum++);
1383
1384 EmitRegModRMByte(MI.getOperand(SrcRegNum),
1385 GetX86RegNum(MI.getOperand(CurOp)), CurByte, OS);
1386 CurOp = SrcRegNum + 1;
1387 break;
1388 }
1374 case X86II::MRMSrcMem: { 1389 case X86II::MRMSrcMem: {
1375 int AddrOperands = X86::AddrNumOperands;
1376 unsigned FirstMemOp = CurOp+1; 1390 unsigned FirstMemOp = CurOp+1;
1377 1391
1378 if (HasEVEX_K) { // Skip writemask 1392 if (HasEVEX_K) // Skip writemask
1379 ++AddrOperands;
1380 ++FirstMemOp; 1393 ++FirstMemOp;
1381 } 1394
1382 1395 if (HasVEX_4V)
1383 if (HasVEX_4V) {
1384 ++AddrOperands;
1385 ++FirstMemOp; // Skip the register source (which is encoded in VEX_VVVV). 1396 ++FirstMemOp; // Skip the register source (which is encoded in VEX_VVVV).
1386 } 1397
1387 if (HasMemOp4) // Skip second register source (encoded in I8IMM) 1398 EmitByte(BaseOpcode, CurByte, OS);
1388 ++FirstMemOp; 1399
1389 1400 emitMemModRMByte(MI, FirstMemOp, GetX86RegNum(MI.getOperand(CurOp)),
1390 EmitByte(BaseOpcode, CurByte, OS); 1401 TSFlags, Rex, CurByte, OS, Fixups, STI);
1391 1402 CurOp = FirstMemOp + X86::AddrNumOperands;
1392 EmitMemModRMByte(MI, FirstMemOp, GetX86RegNum(MI.getOperand(CurOp)), 1403 if (HasVEX_I8Reg)
1393 TSFlags, CurByte, OS, Fixups, STI); 1404 I8RegNum = getX86RegEncoding(MI, CurOp++);
1394 CurOp += AddrOperands + 1; 1405 break;
1395 if (HasVEX_4VOp3) 1406 }
1396 ++CurOp; 1407 case X86II::MRMSrcMem4VOp3: {
1408 unsigned FirstMemOp = CurOp+1;
1409
1410 EmitByte(BaseOpcode, CurByte, OS);
1411
1412 emitMemModRMByte(MI, FirstMemOp, GetX86RegNum(MI.getOperand(CurOp)),
1413 TSFlags, Rex, CurByte, OS, Fixups, STI);
1414 CurOp = FirstMemOp + X86::AddrNumOperands;
1415 ++CurOp; // Encoded in VEX.VVVV.
1416 break;
1417 }
1418 case X86II::MRMSrcMemOp4: {
1419 unsigned FirstMemOp = CurOp+1;
1420
1421 ++FirstMemOp; // Skip the register source (which is encoded in VEX_VVVV).
1422
1423 // Capture second register source (encoded in Imm[7:4])
1424 assert(HasVEX_I8Reg && "MRMSrcRegOp4 should imply VEX_I8Reg");
1425 I8RegNum = getX86RegEncoding(MI, FirstMemOp++);
1426
1427 EmitByte(BaseOpcode, CurByte, OS);
1428
1429 emitMemModRMByte(MI, FirstMemOp, GetX86RegNum(MI.getOperand(CurOp)),
1430 TSFlags, Rex, CurByte, OS, Fixups, STI);
1431 CurOp = FirstMemOp + X86::AddrNumOperands;
1397 break; 1432 break;
1398 } 1433 }
1399 1434
1400 case X86II::MRMXr: 1435 case X86II::MRMXr:
1401 case X86II::MRM0r: case X86II::MRM1r: 1436 case X86II::MRM0r: case X86II::MRM1r:
1405 if (HasVEX_4V) // Skip the register dst (which is encoded in VEX_VVVV). 1440 if (HasVEX_4V) // Skip the register dst (which is encoded in VEX_VVVV).
1406 ++CurOp; 1441 ++CurOp;
1407 if (HasEVEX_K) // Skip writemask 1442 if (HasEVEX_K) // Skip writemask
1408 ++CurOp; 1443 ++CurOp;
1409 EmitByte(BaseOpcode, CurByte, OS); 1444 EmitByte(BaseOpcode, CurByte, OS);
1410 uint64_t Form = TSFlags & X86II::FormMask;
1411 EmitRegModRMByte(MI.getOperand(CurOp++), 1445 EmitRegModRMByte(MI.getOperand(CurOp++),
1412 (Form == X86II::MRMXr) ? 0 : Form-X86II::MRM0r, 1446 (Form == X86II::MRMXr) ? 0 : Form-X86II::MRM0r,
1413 CurByte, OS); 1447 CurByte, OS);
1414 break; 1448 break;
1415 } 1449 }
1422 if (HasVEX_4V) // Skip the register dst (which is encoded in VEX_VVVV). 1456 if (HasVEX_4V) // Skip the register dst (which is encoded in VEX_VVVV).
1423 ++CurOp; 1457 ++CurOp;
1424 if (HasEVEX_K) // Skip writemask 1458 if (HasEVEX_K) // Skip writemask
1425 ++CurOp; 1459 ++CurOp;
1426 EmitByte(BaseOpcode, CurByte, OS); 1460 EmitByte(BaseOpcode, CurByte, OS);
1427 uint64_t Form = TSFlags & X86II::FormMask; 1461 emitMemModRMByte(MI, CurOp,
1428 EmitMemModRMByte(MI, CurOp, (Form == X86II::MRMXm) ? 0 : Form-X86II::MRM0m, 1462 (Form == X86II::MRMXm) ? 0 : Form - X86II::MRM0m, TSFlags,
1429 TSFlags, CurByte, OS, Fixups, STI); 1463 Rex, CurByte, OS, Fixups, STI);
1430 CurOp += X86::AddrNumOperands; 1464 CurOp += X86::AddrNumOperands;
1431 break; 1465 break;
1432 } 1466 }
1433 case X86II::MRM_C0: case X86II::MRM_C1: case X86II::MRM_C2: 1467 case X86II::MRM_C0: case X86II::MRM_C1: case X86II::MRM_C2:
1434 case X86II::MRM_C3: case X86II::MRM_C4: case X86II::MRM_C5: 1468 case X86II::MRM_C3: case X86II::MRM_C4: case X86II::MRM_C5:
1451 case X86II::MRM_F6: case X86II::MRM_F7: case X86II::MRM_F8: 1485 case X86II::MRM_F6: case X86II::MRM_F7: case X86II::MRM_F8:
1452 case X86II::MRM_F9: case X86II::MRM_FA: case X86II::MRM_FB: 1486 case X86II::MRM_F9: case X86II::MRM_FA: case X86II::MRM_FB:
1453 case X86II::MRM_FC: case X86II::MRM_FD: case X86II::MRM_FE: 1487 case X86II::MRM_FC: case X86II::MRM_FD: case X86II::MRM_FE:
1454 case X86II::MRM_FF: 1488 case X86II::MRM_FF:
1455 EmitByte(BaseOpcode, CurByte, OS); 1489 EmitByte(BaseOpcode, CurByte, OS);
1456
1457 uint64_t Form = TSFlags & X86II::FormMask;
1458 EmitByte(0xC0 + Form - X86II::MRM_C0, CurByte, OS); 1490 EmitByte(0xC0 + Form - X86II::MRM_C0, CurByte, OS);
1459 break; 1491 break;
1460 } 1492 }
1461 1493
1462 // If there is a remaining operand, it must be a trailing immediate. Emit it 1494 if (HasVEX_I8Reg) {
1463 // according to the right size for the instruction. Some instructions
1464 // (SSE4a extrq and insertq) have two trailing immediates.
1465 while (CurOp != NumOps && NumOps - CurOp <= 2) {
1466 // The last source register of a 4 operand instruction in AVX is encoded 1495 // The last source register of a 4 operand instruction in AVX is encoded
1467 // in bits[7:4] of a immediate byte. 1496 // in bits[7:4] of a immediate byte.
1468 if (TSFlags & X86II::VEX_I8IMM) { 1497 assert(I8RegNum < 16 && "Register encoding out of range");
1469 const MCOperand &MO = MI.getOperand(HasMemOp4 ? MemOp4_I8IMMOperand 1498 I8RegNum <<= 4;
1470 : CurOp); 1499 if (CurOp != NumOps) {
1471 ++CurOp; 1500 unsigned Val = MI.getOperand(CurOp++).getImm();
1472 unsigned RegNum = GetX86RegNum(MO) << 4; 1501 assert(Val < 16 && "Immediate operand value out of range");
1473 if (X86II::isX86_64ExtendedReg(MO.getReg())) 1502 I8RegNum |= Val;
1474 RegNum |= 1 << 7; 1503 }
1475 // If there is an additional 5th operand it must be an immediate, which 1504 EmitImmediate(MCOperand::createImm(I8RegNum), MI.getLoc(), 1, FK_Data_1,
1476 // is encoded in bits[3:0] 1505 CurByte, OS, Fixups);
1477 if (CurOp != NumOps) { 1506 } else {
1478 const MCOperand &MIMM = MI.getOperand(CurOp++); 1507 // If there is a remaining operand, it must be a trailing immediate. Emit it
1479 if (MIMM.isImm()) { 1508 // according to the right size for the instruction. Some instructions
1480 unsigned Val = MIMM.getImm(); 1509 // (SSE4a extrq and insertq) have two trailing immediates.
1481 assert(Val < 16 && "Immediate operand value out of range"); 1510 while (CurOp != NumOps && NumOps - CurOp <= 2) {
1482 RegNum |= Val;
1483 }
1484 }
1485 EmitImmediate(MCOperand::createImm(RegNum), MI.getLoc(), 1, FK_Data_1,
1486 CurByte, OS, Fixups);
1487 } else {
1488 EmitImmediate(MI.getOperand(CurOp++), MI.getLoc(), 1511 EmitImmediate(MI.getOperand(CurOp++), MI.getLoc(),
1489 X86II::getSizeOfImm(TSFlags), getImmFixupKind(TSFlags), 1512 X86II::getSizeOfImm(TSFlags), getImmFixupKind(TSFlags),
1490 CurByte, OS, Fixups); 1513 CurByte, OS, Fixups);
1491 } 1514 }
1492 } 1515 }