diff options
author | Evan Cheng <evan.cheng@apple.com> | 2008-04-03 08:53:17 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2008-04-03 08:53:17 +0000 |
commit | 0c835a8bd8308a8416b336744150ae989c32bb3c (patch) | |
tree | 5280598de42149f05437f6a67c9b3529f8d78c01 /lib/Target | |
parent | 55a2dd079c25aeff66f518d3192a694641bef60a (diff) | |
download | external_llvm-0c835a8bd8308a8416b336744150ae989c32bb3c.zip external_llvm-0c835a8bd8308a8416b336744150ae989c32bb3c.tar.gz external_llvm-0c835a8bd8308a8416b336744150ae989c32bb3c.tar.bz2 |
Fix x86-64 encoding bug. REX prefix must always follow 0x0F prefix. For example, extractps in 64bit mode: 66 REX 0F 3A 17, not 66 0F 3A REX 17.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@49157 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target')
-rw-r--r-- | lib/Target/X86/X86CodeEmitter.cpp | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/lib/Target/X86/X86CodeEmitter.cpp b/lib/Target/X86/X86CodeEmitter.cpp index e6cd412..15b7745 100644 --- a/lib/Target/X86/X86CodeEmitter.cpp +++ b/lib/Target/X86/X86CodeEmitter.cpp @@ -558,16 +558,10 @@ void Emitter::emitInstruction(const MachineInstr &MI, bool Need0FPrefix = false; switch (Desc->TSFlags & X86II::Op0Mask) { - case X86II::TB: - Need0FPrefix = true; // Two-byte opcode prefix - break; - case X86II::T8: - MCE.emitByte(0x0F); - MCE.emitByte(0x38); - break; - case X86II::TA: - MCE.emitByte(0x0F); - MCE.emitByte(0x3A); + case X86II::TB: // Two-byte opcode prefix + case X86II::T8: // 0F 38 + case X86II::TA: // 0F 3A + Need0FPrefix = true; break; case X86II::REP: break; // already handled. case X86II::XS: // F3 0F @@ -599,6 +593,15 @@ void Emitter::emitInstruction(const MachineInstr &MI, if (Need0FPrefix) MCE.emitByte(0x0F); + switch (Desc->TSFlags & X86II::Op0Mask) { + case X86II::T8: // 0F 38 + MCE.emitByte(0x38); + break; + case X86II::TA: // 0F 3A + MCE.emitByte(0x3A); + break; + } + // If this is a two-address instruction, skip one of the register operands. unsigned NumOps = Desc->getNumOperands(); unsigned CurOp = 0; |