Mercurial > hg > CbC > CbC_llvm
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 } |