From fc28da72f0507ce2f2f44077d90b15f3888297a0 Mon Sep 17 00:00:00 2001 From: Elena Demikhovsky Date: Wed, 3 Jun 2015 12:05:03 +0000 Subject: [PATCH] AVX-512: More code improvements in shuffles, NFC git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@238919 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/X86/X86ISelLowering.cpp | 40 ++++++++++++++---------------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index 0b9162511a6..5c6fbdda25c 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/lib/Target/X86/X86ISelLowering.cpp @@ -6355,6 +6355,21 @@ static SDValue getV4X86ShuffleImm8ForMask(ArrayRef Mask, SDLoc DL, return DAG.getConstant(Imm, DL, MVT::i8); } +/// \brief Get a 8-bit shuffle, 1 bit per lane, immediate for a mask. +/// +/// This helper function produces an 8-bit shuffle immediate corresponding to +/// the ubiquitous shuffle encoding scheme used in x86 instructions for +/// shuffling 8 lanes. +static SDValue get1bitLaneShuffleImm8ForMask(ArrayRef Mask, SDLoc DL, + SelectionDAG &DAG) { + assert(Mask.size() <= 8 && + "Up to 8 elts may be in Imm8 1-bit lane shuffle mask"); + unsigned Imm = 0; + for (unsigned i = 0; i < Mask.size(); ++i) + Imm |= (Mask[i] % 2) << i; + return DAG.getConstant(Imm, DL, MVT::i8); +} + /// \brief Try to emit a blend instruction for a shuffle using bit math. /// /// This is used as a fallback approach when first class blend instructions are @@ -10177,31 +10192,14 @@ static SDValue lowerV8X64VectorShuffle(SDValue Op, SDValue V1, SDValue V2, // PERMILPD instruction - mask 0/1, 0/1, 2/3, 2/3, 4/5, 4/5, 6/7, 6/7 if (isSingleInputShuffleMask(Mask)) { - bool PermilMask = true; - unsigned Immediate = 0; - for (int i = 0; i < 8; ++i) { - if (Mask[i] < 0) - continue; - int Val = (i & 6); - if (Mask[i] < Val || Mask[i] > Val+1) { - PermilMask = false; - break; - } - Immediate |= (Mask[i]%2) << i; - } - if (PermilMask) + if (!is128BitLaneCrossingShuffleMask(VT, Mask)) return DAG.getNode(X86ISD::VPERMILPI, DL, VT, V1, - DAG.getConstant(Immediate, DL, MVT::i8)); + get1bitLaneShuffleImm8ForMask(Mask, DL, DAG)); SmallVector RepeatedMask; - if (is256BitLaneRepeatedShuffleMask(VT, Mask, RepeatedMask)) { - unsigned Immediate = 0; - for (int i = 0; i < 4; ++i) - if (RepeatedMask[i] > 0) - Immediate |= (RepeatedMask[i] & 3) << (i*2); + if (is256BitLaneRepeatedShuffleMask(VT, Mask, RepeatedMask)) return DAG.getNode(X86ISD::VPERMI, DL, VT, V1, - DAG.getConstant(Immediate, DL, MVT::i8)); - } + getV4X86ShuffleImm8ForMask(RepeatedMask, DL, DAG)); } return lowerVectorShuffleWithPERMV(DL, VT, Mask, V1, V2, DAG); } -- 2.34.1