forked from OSchip/llvm-project
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
This commit is contained in:
parent
41a560b8cd
commit
872999737d
|
@ -446,6 +446,7 @@ void X86MCCodeEmitter::EmitVEXOpcodePrefix(uint64_t TSFlags, unsigned &CurByte,
|
|||
raw_ostream &OS) 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
|
||||
|
@ -650,12 +651,19 @@ void X86MCCodeEmitter::EmitVEXOpcodePrefix(uint64_t TSFlags, unsigned &CurByte,
|
|||
// dst(ModR/M), src1(ModR/M)
|
||||
// dst(ModR/M), src1(ModR/M), imm8
|
||||
//
|
||||
// FMA4:
|
||||
// dst(ModR/M.reg), src1(VEX_4V), src2(ModR/M), src3(VEX_I8IMM)
|
||||
// dst(ModR/M.reg), src1(VEX_4V), src2(VEX_I8IMM), src3(ModR/M),
|
||||
if (X86II::isX86_64ExtendedReg(MI.getOperand(CurOp).getReg()))
|
||||
VEX_R = 0x0;
|
||||
CurOp++;
|
||||
|
||||
if (HasVEX_4V)
|
||||
VEX_4V = getVEXRegisterEncoding(MI, CurOp++);
|
||||
|
||||
if (HasMemOp4) // Skip second register source (encoded in I8IMM)
|
||||
CurOp++;
|
||||
|
||||
if (X86II::isX86_64ExtendedReg(MI.getOperand(CurOp).getReg()))
|
||||
VEX_B = 0x0;
|
||||
CurOp++;
|
||||
|
|
|
@ -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++;
|
||||
|
|
|
@ -25,6 +25,10 @@
|
|||
// CHECK: encoding: [0xc4,0xe3,0xf9,0x6b,0xc2,0x10]
|
||||
vfmaddsd %xmm2, %xmm1, %xmm0, %xmm0
|
||||
|
||||
// CHECK: vfmaddsd %xmm10, %xmm1, %xmm0, %xmm0
|
||||
// CHECK: encoding: [0xc4,0xc3,0xf9,0x6b,0xc2,0x10]
|
||||
vfmaddsd %xmm10, %xmm1, %xmm0, %xmm0
|
||||
|
||||
// CHECK: vfmaddps (%rcx), %xmm1, %xmm0, %xmm0
|
||||
// CHECK: encoding: [0xc4,0xe3,0xf9,0x68,0x01,0x10]
|
||||
vfmaddps (%rcx), %xmm1, %xmm0, %xmm0
|
||||
|
|
Loading…
Reference in New Issue