summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorSimon Pilgrim <llvm-dev@redking.me.uk>2019-02-03 16:10:18 +0000
committerSimon Pilgrim <llvm-dev@redking.me.uk>2019-02-03 16:10:18 +0000
commit18b73a655bb611534165fe40e417fde89684f776 (patch)
tree9bccf875241e47eb87aec84b0c8db23beea8e707 /llvm/lib
parent4a0a64ac1d7420889053e81b67da512765a2e2c8 (diff)
downloadbcm5719-llvm-18b73a655bb611534165fe40e417fde89684f776.tar.gz
bcm5719-llvm-18b73a655bb611534165fe40e417fde89684f776.zip
[X86][AVX] Support shuffle combining for VPMOVZX with smaller vector sources
llvm-svn: 352997
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Target/X86/X86ISelLowering.cpp18
1 files changed, 13 insertions, 5 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index 9ea3c64697e..dbc4947aaf8 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -6775,13 +6775,21 @@ static bool getFauxShuffleMask(SDValue N, SmallVectorImpl<int> &Mask,
}
case ISD::ZERO_EXTEND_VECTOR_INREG:
case ISD::ZERO_EXTEND: {
- // TODO - add support for VPMOVZX with smaller input vector types.
SDValue Src = N.getOperand(0);
MVT SrcVT = Src.getSimpleValueType();
- if (NumSizeInBits != SrcVT.getSizeInBits())
- break;
- DecodeZeroExtendMask(SrcVT.getScalarSizeInBits(), NumBitsPerElt, NumElts,
- Mask);
+ unsigned NumSrcBitsPerElt = SrcVT.getScalarSizeInBits();
+ DecodeZeroExtendMask(NumSrcBitsPerElt, NumBitsPerElt, NumElts, Mask);
+
+ if (NumSizeInBits != SrcVT.getSizeInBits()) {
+ assert((NumSizeInBits % SrcVT.getSizeInBits()) == 0 &&
+ "Illegal zero-extension type");
+ SrcVT = MVT::getVectorVT(SrcVT.getScalarType(),
+ NumSizeInBits / NumSrcBitsPerElt);
+ Src = DAG.getNode(ISD::INSERT_SUBVECTOR, SDLoc(N), SrcVT,
+ DAG.getUNDEF(SrcVT), Src,
+ DAG.getIntPtrConstant(0, SDLoc(N)));
+ }
+
Ops.push_back(Src);
return true;
}
OpenPOWER on IntegriCloud