diff options
Diffstat (limited to 'llvm/lib/Target/X86/MCTargetDesc')
-rw-r--r-- | llvm/lib/Target/X86/MCTargetDesc/X86BaseInfo.h | 19 | ||||
-rw-r--r-- | llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp | 11 |
2 files changed, 15 insertions, 15 deletions
diff --git a/llvm/lib/Target/X86/MCTargetDesc/X86BaseInfo.h b/llvm/lib/Target/X86/MCTargetDesc/X86BaseInfo.h index 94536715682..69e468168e7 100644 --- a/llvm/lib/Target/X86/MCTargetDesc/X86BaseInfo.h +++ b/llvm/lib/Target/X86/MCTargetDesc/X86BaseInfo.h @@ -433,6 +433,14 @@ namespace X86II { // XOPA - Prefix to encode 0xA in VEX.MMMM of XOP instructions. XOPA = 6 << OpMapShift, + /// ThreeDNow - This indicates that the instruction uses the + /// wacky 0x0F 0x0F prefix for 3DNow! instructions. The manual documents + /// this as having a 0x0F prefix with a 0x0F opcode, and each instruction + /// storing a classifier in the imm8 field. To simplify our implementation, + /// we handle this by storeing the classifier in the opcode field and using + /// this flag to indicate that the encoder should do the wacky 3DNow! thing. + ThreeDNow = 7 << OpMapShift, + //===------------------------------------------------------------------===// // REX_W - REX prefixes are instruction prefixes used in 64-bit mode. // They are used to specify GPRs and SSE registers, 64-bit operand size, @@ -562,17 +570,8 @@ namespace X86II { CD8_Scale_Shift = EVEX_BShift + 1, CD8_Scale_Mask = 127ULL << CD8_Scale_Shift, - /// Has3DNow0F0FOpcode - This flag indicates that the instruction uses the - /// wacky 0x0F 0x0F prefix for 3DNow! instructions. The manual documents - /// this as having a 0x0F prefix with a 0x0F opcode, and each instruction - /// storing a classifier in the imm8 field. To simplify our implementation, - /// we handle this by storeing the classifier in the opcode field and using - /// this flag to indicate that the encoder should do the wacky 3DNow! thing. - Has3DNow0F0FOpcodeShift = CD8_Scale_Shift + 7, - Has3DNow0F0FOpcode = 1ULL << Has3DNow0F0FOpcodeShift, - /// Explicitly specified rounding control - EVEX_RCShift = Has3DNow0F0FOpcodeShift + 1, + EVEX_RCShift = CD8_Scale_Shift + 7, EVEX_RC = 1ULL << EVEX_RCShift, // NOTRACK prefix diff --git a/llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp b/llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp index 3ba8b500dfd..4cf8dd9e782 100644 --- a/llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp +++ b/llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp @@ -1163,9 +1163,10 @@ bool X86MCCodeEmitter::emitOpcodePrefix(uint64_t TSFlags, unsigned &CurByte, // 0x0F escape code must be emitted just before the opcode. switch (TSFlags & X86II::OpMapMask) { - case X86II::TB: // Two-byte opcode map - case X86II::T8: // 0F 38 - case X86II::TA: // 0F 3A + case X86II::TB: // Two-byte opcode map + case X86II::T8: // 0F 38 + case X86II::TA: // 0F 3A + case X86II::ThreeDNow: // 0F 0F, second 0F emitted by caller. EmitByte(0x0F, CurByte, OS); break; } @@ -1261,7 +1262,7 @@ encodeInstruction(const MCInst &MI, raw_ostream &OS, uint8_t BaseOpcode = X86II::getBaseOpcodeFor(TSFlags); - if (TSFlags & X86II::Has3DNow0F0FOpcode) + if ((TSFlags & X86II::OpMapMask) == X86II::ThreeDNow) BaseOpcode = 0x0F; // Weird 3DNow! encoding. uint64_t Form = TSFlags & X86II::FormMask; @@ -1555,7 +1556,7 @@ encodeInstruction(const MCInst &MI, raw_ostream &OS, } } - if (TSFlags & X86II::Has3DNow0F0FOpcode) + if ((TSFlags & X86II::OpMapMask) == X86II::ThreeDNow) EmitByte(X86II::getBaseOpcodeFor(TSFlags), CurByte, OS); #ifndef NDEBUG |