diff options
author | Simon Pilgrim <llvm-dev@redking.me.uk> | 2016-07-08 19:23:29 +0000 |
---|---|---|
committer | Simon Pilgrim <llvm-dev@redking.me.uk> | 2016-07-08 19:23:29 +0000 |
commit | 950419f9485e51a74283f06876dcb5d5dc4f08ef (patch) | |
tree | 26cc205552cdd5b193a9e3f19c4c409b6745702f /llvm/lib | |
parent | 1b824c9e43a8f9d5d88f501e4df7da3c833f636c (diff) | |
download | bcm5719-llvm-950419f9485e51a74283f06876dcb5d5dc4f08ef.tar.gz bcm5719-llvm-950419f9485e51a74283f06876dcb5d5dc4f08ef.zip |
[X86][AVX2] Add support for target shuffle combining to VPERMPD/VPERMQ
llvm-svn: 274908
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index c025b44c3b1..65d246d7d24 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -24857,9 +24857,26 @@ static bool matchPermuteVectorShuffle(MVT SrcVT, ArrayRef<int> Mask, if (SrcVT.is256BitVector() && !Subtarget.hasAVX2()) FloatDomain = true; - // TODO - support LaneCrossing for AVX2 PERMQ/PERMPD - if (is128BitLaneCrossingShuffleMask(MaskEltVT, Mask)) + // Check for lane crossing permutes. + if (is128BitLaneCrossingShuffleMask(MaskEltVT, Mask)) { + // PERMPD/PERMQ permutes within a 256-bit vector (AVX2+). + if (Subtarget.hasAVX2() && SrcVT.is256BitVector() && Mask.size() == 4) { + Shuffle = X86ISD::VPERMI; + ShuffleVT = (FloatDomain ? MVT::v4f64 : MVT::v4i64); + PermuteImm = getV4X86ShuffleImm(Mask); + return true; + } + if (Subtarget.hasAVX512() && SrcVT.is512BitVector() && Mask.size() == 8) { + SmallVector<int, 4> RepeatedMask; + if (is256BitLaneRepeatedShuffleMask(MVT::v8f64, Mask, RepeatedMask)) { + Shuffle = X86ISD::VPERMI; + ShuffleVT = (FloatDomain ? MVT::v8f64 : MVT::v8i64); + PermuteImm = getV4X86ShuffleImm(RepeatedMask); + return true; + } + } return false; + } // VPERMILPD can permute with a non-repeating shuffle. if (FloatDomain && MaskScalarSizeInBits == 64) { |