mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-19 11:02:59 +02:00
[X86][AVX2] Begun generalizing lowering to VPERMD/VPERMPS in preparation for AVX512 support.
llvm-svn: 284823
This commit is contained in:
parent
ef32c05524
commit
da9223b586
@ -25528,16 +25528,17 @@ static bool combineX86ShuffleChain(ArrayRef<SDValue> Inputs, SDValue Root,
|
|||||||
any_of(Mask, [](int M) { return M == SM_SentinelZero; });
|
any_of(Mask, [](int M) { return M == SM_SentinelZero; });
|
||||||
|
|
||||||
if (is128BitLaneCrossingShuffleMask(MaskVT, Mask)) {
|
if (is128BitLaneCrossingShuffleMask(MaskVT, Mask)) {
|
||||||
// If we have a single input lane-crossing shuffle with 32-bit scalars then
|
// If we have a single input lane-crossing shuffle then lower to VPERMV.
|
||||||
// lower to VPERMD/VPERMPS.
|
|
||||||
if (UnaryShuffle && (Depth >= 3 || HasVariableMask) && !MaskContainsZeros &&
|
if (UnaryShuffle && (Depth >= 3 || HasVariableMask) && !MaskContainsZeros &&
|
||||||
Subtarget.hasAVX2() && (MaskVT == MVT::v8f32 || MaskVT == MVT::v8i32)) {
|
Subtarget.hasAVX2() && (MaskVT == MVT::v8f32 || MaskVT == MVT::v8i32)) {
|
||||||
SDValue VPermIdx[8];
|
MVT VPermMaskSVT = MVT::getIntegerVT(MaskEltSizeInBits);
|
||||||
for (int i = 0; i < 8; ++i)
|
SmallVector<SDValue, 8> VPermIdx;
|
||||||
VPermIdx[i] = Mask[i] < 0 ? DAG.getUNDEF(MVT::i32)
|
for (int M : Mask)
|
||||||
: DAG.getConstant(Mask[i], DL, MVT::i32);
|
VPermIdx.push_back(M < 0 ? DAG.getUNDEF(VPermMaskSVT)
|
||||||
|
: DAG.getConstant(M, DL, VPermMaskSVT));
|
||||||
|
|
||||||
SDValue VPermMask = DAG.getBuildVector(MVT::v8i32, DL, VPermIdx);
|
MVT VPermMaskVT = MVT::getVectorVT(VPermMaskSVT, NumMaskElts);
|
||||||
|
SDValue VPermMask = DAG.getBuildVector(VPermMaskVT, DL, VPermIdx);
|
||||||
DCI.AddToWorklist(VPermMask.getNode());
|
DCI.AddToWorklist(VPermMask.getNode());
|
||||||
Res = DAG.getBitcast(MaskVT, V1);
|
Res = DAG.getBitcast(MaskVT, V1);
|
||||||
DCI.AddToWorklist(Res.getNode());
|
DCI.AddToWorklist(Res.getNode());
|
||||||
|
Loading…
Reference in New Issue
Block a user