diff options
author | Simon Pilgrim <llvm-dev@redking.me.uk> | 2016-10-21 19:18:09 +0000 |
---|---|---|
committer | Simon Pilgrim <llvm-dev@redking.me.uk> | 2016-10-21 19:18:09 +0000 |
commit | 0109bf116fac77764699955ea67e5451280e86f6 (patch) | |
tree | dff194fadbb9ffdffc02e71c3a22d78fe1b559cd /llvm/lib | |
parent | 6e7fa99d3a5bbeebf9eed9c766765b0d6b0d18b9 (diff) | |
download | bcm5719-llvm-0109bf116fac77764699955ea67e5451280e86f6.tar.gz bcm5719-llvm-0109bf116fac77764699955ea67e5451280e86f6.zip |
[X86][AVX512] Added support for combining target shuffles to AVX512 vpermpd/vpermq/vpermps/vpermd/vpermw
llvm-svn: 284858
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 565decb601b..bb1766c5947 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -3861,6 +3861,9 @@ static bool isTargetShuffleVariableMask(unsigned Opcode) { case X86ISD::VPERMILPV: case X86ISD::VPERMIL2: case X86ISD::VPPERM: + case X86ISD::VPERMV: + case X86ISD::VPERMV3: + case X86ISD::VPERMIV3: return true; } } @@ -25529,16 +25532,17 @@ static bool combineX86ShuffleChain(ArrayRef<SDValue> Inputs, SDValue Root, if (is128BitLaneCrossingShuffleMask(MaskVT, Mask)) { // If we have a single input lane-crossing shuffle then lower to VPERMV. + // FIXME: Add AVX512BWVL support for v16i16. if (UnaryShuffle && (Depth >= 3 || HasVariableMask) && !MaskContainsZeros && - Subtarget.hasAVX2() && (MaskVT == MVT::v8f32 || MaskVT == MVT::v8i32)) { + ((Subtarget.hasAVX2() && + (MaskVT == MVT::v8f32 || MaskVT == MVT::v8i32)) || + (Subtarget.hasAVX512() && + (MaskVT == MVT::v8f64 || MaskVT == MVT::v8i64 || + MaskVT == MVT::v16f32 || MaskVT == MVT::v16i32)) || + (Subtarget.hasBWI() && MaskVT == MVT::v32i16))) { 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); + SDValue VPermMask = getConstVector(Mask, VPermMaskVT, DAG, DL, true); DCI.AddToWorklist(VPermMask.getNode()); Res = DAG.getBitcast(MaskVT, V1); DCI.AddToWorklist(Res.getNode()); |