summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorSimon Pilgrim <llvm-dev@redking.me.uk>2016-10-21 13:00:47 +0000
committerSimon Pilgrim <llvm-dev@redking.me.uk>2016-10-21 13:00:47 +0000
commitc98d99a6003ccf41e72f751adbe31b0c4ec9562b (patch)
treeb986b9e1f626b54f0d00ee03c1846dfd89586fec /llvm/lib
parentf3e9ddbf77ba01e1a67735b57c86d10aa8568b9f (diff)
downloadbcm5719-llvm-c98d99a6003ccf41e72f751adbe31b0c4ec9562b.tar.gz
bcm5719-llvm-c98d99a6003ccf41e72f751adbe31b0c4ec9562b.zip
[X86][AVX2] Begun generalizing lowering to VPERMD/VPERMPS in preparation for AVX512 support.
llvm-svn: 284823
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Target/X86/X86ISelLowering.cpp17
1 files changed, 9 insertions, 8 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index 8fbdbdd3123..7cdbb6d8a83 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -25528,16 +25528,17 @@ static bool combineX86ShuffleChain(ArrayRef<SDValue> Inputs, SDValue Root,
any_of(Mask, [](int M) { return M == SM_SentinelZero; });
if (is128BitLaneCrossingShuffleMask(MaskVT, Mask)) {
- // If we have a single input lane-crossing shuffle with 32-bit scalars then
- // lower to VPERMD/VPERMPS.
+ // If we have a single input lane-crossing shuffle then lower to VPERMV.
if (UnaryShuffle && (Depth >= 3 || HasVariableMask) && !MaskContainsZeros &&
Subtarget.hasAVX2() && (MaskVT == MVT::v8f32 || MaskVT == MVT::v8i32)) {
- SDValue VPermIdx[8];
- for (int i = 0; i < 8; ++i)
- VPermIdx[i] = Mask[i] < 0 ? DAG.getUNDEF(MVT::i32)
- : DAG.getConstant(Mask[i], DL, MVT::i32);
-
- SDValue VPermMask = DAG.getBuildVector(MVT::v8i32, DL, VPermIdx);
+ MVT VPermMaskSVT = MVT::getIntegerVT(MaskEltSizeInBits);
+ SmallVector<SDValue, 8> VPermIdx;
+ for (int M : Mask)
+ VPermIdx.push_back(M < 0 ? DAG.getUNDEF(VPermMaskSVT)
+ : DAG.getConstant(M, DL, VPermMaskSVT));
+
+ MVT VPermMaskVT = MVT::getVectorVT(VPermMaskSVT, NumMaskElts);
+ SDValue VPermMask = DAG.getBuildVector(VPermMaskVT, DL, VPermIdx);
DCI.AddToWorklist(VPermMask.getNode());
Res = DAG.getBitcast(MaskVT, V1);
DCI.AddToWorklist(Res.getNode());
OpenPOWER on IntegriCloud