1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-26 06:22:56 +02:00

[X86][SSE] lowerVectorShuffleWithUNPCK - use equivalent shuffle mask test.

Use isShuffleEquivalent to match UNPCK shuffles - better support for build vector inputs.

llvm-svn: 251207
This commit is contained in:
Simon Pilgrim 2015-10-24 20:48:08 +00:00
parent cb7ae60066
commit 04340b6235

View File

@ -6785,43 +6785,32 @@ static SDValue lowerVectorShuffleWithUNPCK(SDLoc DL, MVT VT, ArrayRef<int> Mask,
SDValue V1, SDValue V2,
SelectionDAG &DAG) {
int NumElts = VT.getVectorNumElements();
bool Unpckl = true;
bool Unpckh = true;
bool UnpcklSwapped = true;
bool UnpckhSwapped = true;
int NumEltsInLane = 128 / VT.getScalarSizeInBits();
SmallVector<int, 8> Unpckl;
SmallVector<int, 8> Unpckh;
for (int i = 0; i < NumElts; ++i) {
unsigned LaneStart = (i / NumEltsInLane) * NumEltsInLane;
int LoPos = (i % NumEltsInLane) / 2 + LaneStart + NumElts * (i % 2);
int HiPos = LoPos + NumEltsInLane / 2;
int LoPosSwapped = (LoPos + NumElts) % (NumElts * 2);
int HiPosSwapped = (HiPos + NumElts) % (NumElts * 2);
if (Mask[i] == -1)
continue;
if (Mask[i] != LoPos)
Unpckl = false;
if (Mask[i] != HiPos)
Unpckh = false;
if (Mask[i] != LoPosSwapped)
UnpcklSwapped = false;
if (Mask[i] != HiPosSwapped)
UnpckhSwapped = false;
if (!Unpckl && !Unpckh && !UnpcklSwapped && !UnpckhSwapped)
return SDValue();
Unpckl.push_back(LoPos);
Unpckh.push_back(HiPos);
}
if (Unpckl)
if (isShuffleEquivalent(V1, V2, Mask, Unpckl))
return DAG.getNode(X86ISD::UNPCKL, DL, VT, V1, V2);
if (Unpckh)
if (isShuffleEquivalent(V1, V2, Mask, Unpckh))
return DAG.getNode(X86ISD::UNPCKH, DL, VT, V1, V2);
if (UnpcklSwapped)
// Commute and try again.
ShuffleVectorSDNode::commuteMask(Unpckl);
if (isShuffleEquivalent(V1, V2, Mask, Unpckl))
return DAG.getNode(X86ISD::UNPCKL, DL, VT, V2, V1);
if (UnpckhSwapped)
ShuffleVectorSDNode::commuteMask(Unpckh);
if (isShuffleEquivalent(V1, V2, Mask, Unpckh))
return DAG.getNode(X86ISD::UNPCKH, DL, VT, V2, V1);
llvm_unreachable("Unexpected result of UNPCK mask analysis");
return SDValue();
}