diff options
author | Craig Topper <craig.topper@gmail.com> | 2013-03-14 07:40:52 +0000 |
---|---|---|
committer | Craig Topper <craig.topper@gmail.com> | 2013-03-14 07:40:52 +0000 |
commit | 872999737d8bc9487050f7128e37faf27cd5479f (patch) | |
tree | 420a6d42e9a169c035496ff9a84b925d7a487be4 /llvm/lib/Target/X86/X86CodeEmitter.cpp | |
parent | 41a560b8cddcccdbf81afd08629f2af72c7cf9a9 (diff) | |
download | bcm5719-llvm-872999737d8bc9487050f7128e37faf27cd5479f.tar.gz bcm5719-llvm-872999737d8bc9487050f7128e37faf27cd5479f.zip |
Fix a bug in the calculation of the VEX.B bit for FMA4 rr with the VEX.W bit set. The VEX.B was being calculated from the wrong operand. Fixes at least some portion of PR14185.
llvm-svn: 177014
Diffstat (limited to 'llvm/lib/Target/X86/X86CodeEmitter.cpp')
-rw-r--r-- | llvm/lib/Target/X86/X86CodeEmitter.cpp | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/llvm/lib/Target/X86/X86CodeEmitter.cpp b/llvm/lib/Target/X86/X86CodeEmitter.cpp index ece38aa3466..a6bb2a74261 100644 --- a/llvm/lib/Target/X86/X86CodeEmitter.cpp +++ b/llvm/lib/Target/X86/X86CodeEmitter.cpp @@ -816,6 +816,7 @@ void Emitter<CodeEmitter>::emitVEXOpcodePrefix(uint64_t TSFlags, const MCInstrDesc *Desc) const { bool HasVEX_4V = (TSFlags >> X86II::VEXShift) & X86II::VEX_4V; bool HasVEX_4VOp3 = (TSFlags >> X86II::VEXShift) & X86II::VEX_4VOp3; + bool HasMemOp4 = (TSFlags >> X86II::VEXShift) & X86II::MemOp4; // VEX_R: opcode externsion equivalent to REX.R in // 1's complement (inverted) form @@ -1032,6 +1033,10 @@ void Emitter<CodeEmitter>::emitVEXOpcodePrefix(uint64_t TSFlags, if (HasVEX_4V) VEX_4V = getVEXRegisterEncoding(MI, CurOp++); + + if (MemOp4) // Skip second register source (encoded in I8IMM) + CurOp++; + if (X86II::isX86_64ExtendedReg(MI.getOperand(CurOp).getReg())) VEX_B = 0x0; CurOp++; |