summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorSimon Pilgrim <llvm-dev@redking.me.uk>2016-07-08 19:23:29 +0000
committerSimon Pilgrim <llvm-dev@redking.me.uk>2016-07-08 19:23:29 +0000
commit950419f9485e51a74283f06876dcb5d5dc4f08ef (patch)
tree26cc205552cdd5b193a9e3f19c4c409b6745702f /llvm/lib
parent1b824c9e43a8f9d5d88f501e4df7da3c833f636c (diff)
downloadbcm5719-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.cpp21
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) {
OpenPOWER on IntegriCloud