mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-20 19:42:54 +02:00
X86: Fix FastISel SSESelect register class
X86FastISel has been using the wrong register class for VBLENDVPS which produces a VR128 and needs an extra copy to the target register. The problem was already hit by the existing test cases when using > llvm-lit -Dllc="llc -verify-machineinstr" llvm-svn: 246461
This commit is contained in:
parent
90f577b8ca
commit
19925a8175
@ -1921,6 +1921,9 @@ bool X86FastISel::X86FastEmitSSESelect(MVT RetVT, const Instruction *I) {
|
||||
unsigned ResultReg;
|
||||
|
||||
if (Subtarget->hasAVX()) {
|
||||
const TargetRegisterClass *FR32 = &X86::FR32RegClass;
|
||||
const TargetRegisterClass *VR128 = &X86::VR128RegClass;
|
||||
|
||||
// If we have AVX, create 1 blendv instead of 3 logic instructions.
|
||||
// Blendv was introduced with SSE 4.1, but the 2 register form implicitly
|
||||
// uses XMM0 as the selection register. That may need just as many
|
||||
@ -1931,10 +1934,13 @@ bool X86FastISel::X86FastEmitSSESelect(MVT RetVT, const Instruction *I) {
|
||||
unsigned BlendOpcode =
|
||||
(RetVT.SimpleTy == MVT::f32) ? X86::VBLENDVPSrr : X86::VBLENDVPDrr;
|
||||
|
||||
unsigned CmpReg = fastEmitInst_rri(CmpOpcode, RC, CmpLHSReg, CmpLHSIsKill,
|
||||
unsigned CmpReg = fastEmitInst_rri(CmpOpcode, FR32, CmpLHSReg, CmpLHSIsKill,
|
||||
CmpRHSReg, CmpRHSIsKill, CC);
|
||||
ResultReg = fastEmitInst_rrr(BlendOpcode, RC, RHSReg, RHSIsKill,
|
||||
LHSReg, LHSIsKill, CmpReg, true);
|
||||
unsigned VBlendReg = fastEmitInst_rrr(BlendOpcode, VR128, RHSReg, RHSIsKill,
|
||||
LHSReg, LHSIsKill, CmpReg, true);
|
||||
ResultReg = createResultReg(RC);
|
||||
BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc,
|
||||
TII.get(TargetOpcode::COPY), ResultReg).addReg(VBlendReg);
|
||||
} else {
|
||||
unsigned CmpReg = fastEmitInst_rri(Opc[0], RC, CmpLHSReg, CmpLHSIsKill,
|
||||
CmpRHSReg, CmpRHSIsKill, CC);
|
||||
|
Loading…
Reference in New Issue
Block a user