mirror of
https://github.com/RPCSX/llvm.git
synced 2025-01-03 18:29:08 +00:00
Use X86ISD::MOVSS and MOVSD to represent the movl mask pattern, also fix the handling of those nodes when seeking for scalars inside vector shuffles
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@112570 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
dc90804a40
commit
20a07f422d
@ -3656,11 +3656,13 @@ SDValue getShuffleScalarElt(SDNode *N, int Index, SelectionDAG &DAG) {
|
||||
if (isTargetShuffle(Opcode)) {
|
||||
switch(Opcode) {
|
||||
case X86ISD::MOVSS:
|
||||
case X86ISD::MOVSD:
|
||||
// Only care about the second operand, which can contain
|
||||
// a scalar_to_vector which we are looking for.
|
||||
return getShuffleScalarElt(V.getOperand(1).getNode(),
|
||||
0 /* Index */, DAG);
|
||||
case X86ISD::MOVSD: {
|
||||
// The index 0 always comes from the first element of the second source,
|
||||
// this is why MOVSS and MOVSD are used in the first place. The other
|
||||
// elements come from the other positions of the first source vector.
|
||||
unsigned OpNum = (Index == 0) ? 1 : 0;
|
||||
return getShuffleScalarElt(V.getOperand(OpNum).getNode(), Index, DAG);
|
||||
}
|
||||
default:
|
||||
assert("not implemented for target shuffle node");
|
||||
return SDValue();
|
||||
@ -5098,8 +5100,13 @@ X86TargetLowering::LowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG) const {
|
||||
return V2;
|
||||
if (ISD::isBuildVectorAllZeros(V1.getNode()))
|
||||
return getVZextMovL(VT, VT, V2, DAG, Subtarget, dl);
|
||||
if (!isMMX)
|
||||
return Op;
|
||||
if (!isMMX && !X86::isMOVLPMask(SVOp)) {
|
||||
if (HasSSE2 && (VT == MVT::v2i64 || VT == MVT::v2f64))
|
||||
return getTargetShuffleNode(X86ISD::MOVSD, dl, VT, V1, V2, DAG);
|
||||
|
||||
if (VT == MVT::v4i32 || VT == MVT::v4f32)
|
||||
return getTargetShuffleNode(X86ISD::MOVSS, dl, VT, V1, V2, DAG);
|
||||
}
|
||||
}
|
||||
|
||||
// FIXME: fold these into legal mask.
|
||||
|
Loading…
Reference in New Issue
Block a user