14d0b32cdSDimitry Andric //===-- X86ShuffleDecodeConstantPool.cpp - X86 shuffle decode -------------===// 24d0b32cdSDimitry Andric // 34d0b32cdSDimitry Andric // The LLVM Compiler Infrastructure 44d0b32cdSDimitry Andric // 54d0b32cdSDimitry Andric // This file is distributed under the University of Illinois Open Source 64d0b32cdSDimitry Andric // License. See LICENSE.TXT for details. 74d0b32cdSDimitry Andric // 84d0b32cdSDimitry Andric //===----------------------------------------------------------------------===// 94d0b32cdSDimitry Andric // 104d0b32cdSDimitry Andric // Define several functions to decode x86 specific shuffle semantics using 114d0b32cdSDimitry Andric // constants from the constant pool. 124d0b32cdSDimitry Andric // 134d0b32cdSDimitry Andric //===----------------------------------------------------------------------===// 144d0b32cdSDimitry Andric 154d0b32cdSDimitry Andric #include "X86ShuffleDecodeConstantPool.h" 164d0b32cdSDimitry Andric #include "Utils/X86ShuffleDecode.h" 177a7e6055SDimitry Andric #include "llvm/ADT/APInt.h" 184d0b32cdSDimitry Andric #include "llvm/CodeGen/MachineValueType.h" 194d0b32cdSDimitry Andric #include "llvm/IR/Constants.h" 204d0b32cdSDimitry Andric 214d0b32cdSDimitry Andric //===----------------------------------------------------------------------===// 224d0b32cdSDimitry Andric // Vector Mask Decoding 234d0b32cdSDimitry Andric //===----------------------------------------------------------------------===// 244d0b32cdSDimitry Andric 254d0b32cdSDimitry Andric namespace llvm { 264d0b32cdSDimitry Andric 27d88c1a5aSDimitry Andric static bool extractConstantMask(const Constant *C, unsigned MaskEltSizeInBits, 287a7e6055SDimitry Andric APInt &UndefElts, 29d88c1a5aSDimitry Andric SmallVectorImpl<uint64_t> &RawMask) { 30d88c1a5aSDimitry Andric // It is not an error for shuffle masks to not be a vector of 31d88c1a5aSDimitry Andric // MaskEltSizeInBits because the constant pool uniques constants by their 32d88c1a5aSDimitry Andric // bit representation. 334d0b32cdSDimitry Andric // e.g. the following take up the same space in the constant pool: 344d0b32cdSDimitry Andric // i128 -170141183420855150465331762880109871104 354d0b32cdSDimitry Andric // 364d0b32cdSDimitry Andric // <2 x i64> <i64 -9223372034707292160, i64 -9223372034707292160> 374d0b32cdSDimitry Andric // 384d0b32cdSDimitry Andric // <4 x i32> <i32 -2147483648, i32 -2147483648, 394d0b32cdSDimitry Andric // i32 -2147483648, i32 -2147483648> 40d88c1a5aSDimitry Andric Type *CstTy = C->getType(); 41d88c1a5aSDimitry Andric if (!CstTy->isVectorTy()) 42d88c1a5aSDimitry Andric return false; 434d0b32cdSDimitry Andric 44d88c1a5aSDimitry Andric Type *CstEltTy = CstTy->getVectorElementType(); 45d88c1a5aSDimitry Andric if (!CstEltTy->isIntegerTy()) 46d88c1a5aSDimitry Andric return false; 474d0b32cdSDimitry Andric 48d88c1a5aSDimitry Andric unsigned CstSizeInBits = CstTy->getPrimitiveSizeInBits(); 49d88c1a5aSDimitry Andric unsigned CstEltSizeInBits = CstTy->getScalarSizeInBits(); 50d88c1a5aSDimitry Andric unsigned NumCstElts = CstTy->getVectorNumElements(); 514d0b32cdSDimitry Andric 527a7e6055SDimitry Andric assert((CstSizeInBits % MaskEltSizeInBits) == 0 && 537a7e6055SDimitry Andric "Unaligned shuffle mask size"); 547a7e6055SDimitry Andric 557a7e6055SDimitry Andric unsigned NumMaskElts = CstSizeInBits / MaskEltSizeInBits; 567a7e6055SDimitry Andric UndefElts = APInt(NumMaskElts, 0); 577a7e6055SDimitry Andric RawMask.resize(NumMaskElts, 0); 587a7e6055SDimitry Andric 597a7e6055SDimitry Andric // Fast path - if the constants match the mask size then copy direct. 607a7e6055SDimitry Andric if (MaskEltSizeInBits == CstEltSizeInBits) { 617a7e6055SDimitry Andric assert(NumCstElts == NumMaskElts && "Unaligned shuffle mask size"); 627a7e6055SDimitry Andric for (unsigned i = 0; i != NumMaskElts; ++i) { 637a7e6055SDimitry Andric Constant *COp = C->getAggregateElement(i); 647a7e6055SDimitry Andric if (!COp || (!isa<UndefValue>(COp) && !isa<ConstantInt>(COp))) 657a7e6055SDimitry Andric return false; 667a7e6055SDimitry Andric 677a7e6055SDimitry Andric if (isa<UndefValue>(COp)) { 687a7e6055SDimitry Andric UndefElts.setBit(i); 697a7e6055SDimitry Andric RawMask[i] = 0; 707a7e6055SDimitry Andric continue; 717a7e6055SDimitry Andric } 727a7e6055SDimitry Andric 737a7e6055SDimitry Andric auto *Elt = cast<ConstantInt>(COp); 747a7e6055SDimitry Andric RawMask[i] = Elt->getValue().getZExtValue(); 757a7e6055SDimitry Andric } 767a7e6055SDimitry Andric return true; 777a7e6055SDimitry Andric } 787a7e6055SDimitry Andric 79d88c1a5aSDimitry Andric // Extract all the undef/constant element data and pack into single bitsets. 80d88c1a5aSDimitry Andric APInt UndefBits(CstSizeInBits, 0); 81d88c1a5aSDimitry Andric APInt MaskBits(CstSizeInBits, 0); 82d88c1a5aSDimitry Andric for (unsigned i = 0; i != NumCstElts; ++i) { 834d0b32cdSDimitry Andric Constant *COp = C->getAggregateElement(i); 84d88c1a5aSDimitry Andric if (!COp || (!isa<UndefValue>(COp) && !isa<ConstantInt>(COp))) 85d88c1a5aSDimitry Andric return false; 86d88c1a5aSDimitry Andric 877a7e6055SDimitry Andric unsigned BitOffset = i * CstEltSizeInBits; 887a7e6055SDimitry Andric 89d88c1a5aSDimitry Andric if (isa<UndefValue>(COp)) { 907a7e6055SDimitry Andric UndefBits.setBits(BitOffset, BitOffset + CstEltSizeInBits); 914d0b32cdSDimitry Andric continue; 924d0b32cdSDimitry Andric } 933ca95b02SDimitry Andric 947a7e6055SDimitry Andric MaskBits.insertBits(cast<ConstantInt>(COp)->getValue(), BitOffset); 95d88c1a5aSDimitry Andric } 963ca95b02SDimitry Andric 97d88c1a5aSDimitry Andric // Now extract the undef/constant bit data into the raw shuffle masks. 98d88c1a5aSDimitry Andric for (unsigned i = 0; i != NumMaskElts; ++i) { 997a7e6055SDimitry Andric unsigned BitOffset = i * MaskEltSizeInBits; 1007a7e6055SDimitry Andric APInt EltUndef = UndefBits.extractBits(MaskEltSizeInBits, BitOffset); 101d88c1a5aSDimitry Andric 102d88c1a5aSDimitry Andric // Only treat the element as UNDEF if all bits are UNDEF, otherwise 103d88c1a5aSDimitry Andric // treat it as zero. 104d88c1a5aSDimitry Andric if (EltUndef.isAllOnesValue()) { 1057a7e6055SDimitry Andric UndefElts.setBit(i); 106d88c1a5aSDimitry Andric RawMask[i] = 0; 107d88c1a5aSDimitry Andric continue; 108d88c1a5aSDimitry Andric } 109d88c1a5aSDimitry Andric 1107a7e6055SDimitry Andric APInt EltBits = MaskBits.extractBits(MaskEltSizeInBits, BitOffset); 111d88c1a5aSDimitry Andric RawMask[i] = EltBits.getZExtValue(); 112d88c1a5aSDimitry Andric } 113d88c1a5aSDimitry Andric 114d88c1a5aSDimitry Andric return true; 115d88c1a5aSDimitry Andric } 116d88c1a5aSDimitry Andric 117d88c1a5aSDimitry Andric void DecodePSHUFBMask(const Constant *C, SmallVectorImpl<int> &ShuffleMask) { 118d88c1a5aSDimitry Andric Type *MaskTy = C->getType(); 119d88c1a5aSDimitry Andric unsigned MaskTySize = MaskTy->getPrimitiveSizeInBits(); 120d88c1a5aSDimitry Andric (void)MaskTySize; 121d88c1a5aSDimitry Andric assert((MaskTySize == 128 || MaskTySize == 256 || MaskTySize == 512) && 122d88c1a5aSDimitry Andric "Unexpected vector size."); 123d88c1a5aSDimitry Andric 124d88c1a5aSDimitry Andric // The shuffle mask requires a byte vector. 1257a7e6055SDimitry Andric APInt UndefElts; 1267a7e6055SDimitry Andric SmallVector<uint64_t, 64> RawMask; 127d88c1a5aSDimitry Andric if (!extractConstantMask(C, 8, UndefElts, RawMask)) 128d88c1a5aSDimitry Andric return; 129d88c1a5aSDimitry Andric 130d88c1a5aSDimitry Andric unsigned NumElts = RawMask.size(); 131d88c1a5aSDimitry Andric assert((NumElts == 16 || NumElts == 32 || NumElts == 64) && 132d88c1a5aSDimitry Andric "Unexpected number of vector elements."); 133d88c1a5aSDimitry Andric 134d88c1a5aSDimitry Andric for (unsigned i = 0; i != NumElts; ++i) { 135d88c1a5aSDimitry Andric if (UndefElts[i]) { 136d88c1a5aSDimitry Andric ShuffleMask.push_back(SM_SentinelUndef); 137d88c1a5aSDimitry Andric continue; 138d88c1a5aSDimitry Andric } 139d88c1a5aSDimitry Andric 140d88c1a5aSDimitry Andric uint64_t Element = RawMask[i]; 1414d0b32cdSDimitry Andric // If the high bit (7) of the byte is set, the element is zeroed. 1424d0b32cdSDimitry Andric if (Element & (1 << 7)) 1434d0b32cdSDimitry Andric ShuffleMask.push_back(SM_SentinelZero); 1444d0b32cdSDimitry Andric else { 145d88c1a5aSDimitry Andric // For AVX vectors with 32 bytes the base of the shuffle is the 16-byte 146d88c1a5aSDimitry Andric // lane of the vector we're inside. 147d88c1a5aSDimitry Andric unsigned Base = i & ~0xf; 148d88c1a5aSDimitry Andric 1494d0b32cdSDimitry Andric // Only the least significant 4 bits of the byte are used. 1504d0b32cdSDimitry Andric int Index = Base + (Element & 0xf); 1514d0b32cdSDimitry Andric ShuffleMask.push_back(Index); 1524d0b32cdSDimitry Andric } 1534d0b32cdSDimitry Andric } 1544d0b32cdSDimitry Andric } 1553ca95b02SDimitry Andric 1564d0b32cdSDimitry Andric void DecodeVPERMILPMask(const Constant *C, unsigned ElSize, 1574d0b32cdSDimitry Andric SmallVectorImpl<int> &ShuffleMask) { 1584d0b32cdSDimitry Andric Type *MaskTy = C->getType(); 1593ca95b02SDimitry Andric unsigned MaskTySize = MaskTy->getPrimitiveSizeInBits(); 160d88c1a5aSDimitry Andric (void)MaskTySize; 161d88c1a5aSDimitry Andric assert((MaskTySize == 128 || MaskTySize == 256 || MaskTySize == 512) && 162d88c1a5aSDimitry Andric "Unexpected vector size."); 163d88c1a5aSDimitry Andric assert((ElSize == 32 || ElSize == 64) && "Unexpected vector element size."); 164d88c1a5aSDimitry Andric 165d88c1a5aSDimitry Andric // The shuffle mask requires elements the same size as the target. 1667a7e6055SDimitry Andric APInt UndefElts; 1677a7e6055SDimitry Andric SmallVector<uint64_t, 16> RawMask; 168d88c1a5aSDimitry Andric if (!extractConstantMask(C, ElSize, UndefElts, RawMask)) 1694d0b32cdSDimitry Andric return; 1704d0b32cdSDimitry Andric 171d88c1a5aSDimitry Andric unsigned NumElts = RawMask.size(); 172d88c1a5aSDimitry Andric unsigned NumEltsPerLane = 128 / ElSize; 173d88c1a5aSDimitry Andric assert((NumElts == 2 || NumElts == 4 || NumElts == 8 || NumElts == 16) && 1744d0b32cdSDimitry Andric "Unexpected number of vector elements."); 1754d0b32cdSDimitry Andric 176d88c1a5aSDimitry Andric for (unsigned i = 0; i != NumElts; ++i) { 177d88c1a5aSDimitry Andric if (UndefElts[i]) { 1784d0b32cdSDimitry Andric ShuffleMask.push_back(SM_SentinelUndef); 1794d0b32cdSDimitry Andric continue; 1804d0b32cdSDimitry Andric } 181d88c1a5aSDimitry Andric 182d88c1a5aSDimitry Andric int Index = i & ~(NumEltsPerLane - 1); 183d88c1a5aSDimitry Andric uint64_t Element = RawMask[i]; 1844d0b32cdSDimitry Andric if (ElSize == 64) 1854d0b32cdSDimitry Andric Index += (Element >> 1) & 0x1; 1864d0b32cdSDimitry Andric else 1874d0b32cdSDimitry Andric Index += Element & 0x3; 188d88c1a5aSDimitry Andric 1894d0b32cdSDimitry Andric ShuffleMask.push_back(Index); 1904d0b32cdSDimitry Andric } 1914d0b32cdSDimitry Andric } 1924d0b32cdSDimitry Andric 1933ca95b02SDimitry Andric void DecodeVPERMIL2PMask(const Constant *C, unsigned M2Z, unsigned ElSize, 1943ca95b02SDimitry Andric SmallVectorImpl<int> &ShuffleMask) { 1953ca95b02SDimitry Andric Type *MaskTy = C->getType(); 1963ca95b02SDimitry Andric unsigned MaskTySize = MaskTy->getPrimitiveSizeInBits(); 197d88c1a5aSDimitry Andric (void)MaskTySize; 198d88c1a5aSDimitry Andric assert((MaskTySize == 128 || MaskTySize == 256) && "Unexpected vector size."); 199d88c1a5aSDimitry Andric 200d88c1a5aSDimitry Andric // The shuffle mask requires elements the same size as the target. 2017a7e6055SDimitry Andric APInt UndefElts; 202d88c1a5aSDimitry Andric SmallVector<uint64_t, 8> RawMask; 203d88c1a5aSDimitry Andric if (!extractConstantMask(C, ElSize, UndefElts, RawMask)) 2043ca95b02SDimitry Andric return; 2053ca95b02SDimitry Andric 206d88c1a5aSDimitry Andric unsigned NumElts = RawMask.size(); 207d88c1a5aSDimitry Andric unsigned NumEltsPerLane = 128 / ElSize; 208d88c1a5aSDimitry Andric assert((NumElts == 2 || NumElts == 4 || NumElts == 8) && 2093ca95b02SDimitry Andric "Unexpected number of vector elements."); 2103ca95b02SDimitry Andric 211d88c1a5aSDimitry Andric for (unsigned i = 0; i != NumElts; ++i) { 212d88c1a5aSDimitry Andric if (UndefElts[i]) { 2133ca95b02SDimitry Andric ShuffleMask.push_back(SM_SentinelUndef); 2143ca95b02SDimitry Andric continue; 2153ca95b02SDimitry Andric } 2163ca95b02SDimitry Andric 2173ca95b02SDimitry Andric // VPERMIL2 Operation. 2183ca95b02SDimitry Andric // Bits[3] - Match Bit. 2193ca95b02SDimitry Andric // Bits[2:1] - (Per Lane) PD Shuffle Mask. 2203ca95b02SDimitry Andric // Bits[2:0] - (Per Lane) PS Shuffle Mask. 221d88c1a5aSDimitry Andric uint64_t Selector = RawMask[i]; 2223ca95b02SDimitry Andric unsigned MatchBit = (Selector >> 3) & 0x1; 2233ca95b02SDimitry Andric 2243ca95b02SDimitry Andric // M2Z[0:1] MatchBit 2253ca95b02SDimitry Andric // 0Xb X Source selected by Selector index. 2263ca95b02SDimitry Andric // 10b 0 Source selected by Selector index. 2273ca95b02SDimitry Andric // 10b 1 Zero. 2283ca95b02SDimitry Andric // 11b 0 Zero. 2293ca95b02SDimitry Andric // 11b 1 Source selected by Selector index. 2303ca95b02SDimitry Andric if ((M2Z & 0x2) != 0u && MatchBit != (M2Z & 0x1)) { 2313ca95b02SDimitry Andric ShuffleMask.push_back(SM_SentinelZero); 2323ca95b02SDimitry Andric continue; 2333ca95b02SDimitry Andric } 2343ca95b02SDimitry Andric 235d88c1a5aSDimitry Andric int Index = i & ~(NumEltsPerLane - 1); 2363ca95b02SDimitry Andric if (ElSize == 64) 2373ca95b02SDimitry Andric Index += (Selector >> 1) & 0x1; 2383ca95b02SDimitry Andric else 2393ca95b02SDimitry Andric Index += Selector & 0x3; 2403ca95b02SDimitry Andric 2413ca95b02SDimitry Andric int Src = (Selector >> 2) & 0x1; 242d88c1a5aSDimitry Andric Index += Src * NumElts; 2433ca95b02SDimitry Andric ShuffleMask.push_back(Index); 2443ca95b02SDimitry Andric } 2453ca95b02SDimitry Andric } 2463ca95b02SDimitry Andric 2473ca95b02SDimitry Andric void DecodeVPPERMMask(const Constant *C, SmallVectorImpl<int> &ShuffleMask) { 248d88c1a5aSDimitry Andric assert(C->getType()->getPrimitiveSizeInBits() == 128 && 249d88c1a5aSDimitry Andric "Unexpected vector size."); 2503ca95b02SDimitry Andric 251d88c1a5aSDimitry Andric // The shuffle mask requires a byte vector. 2527a7e6055SDimitry Andric APInt UndefElts; 2537a7e6055SDimitry Andric SmallVector<uint64_t, 16> RawMask; 254d88c1a5aSDimitry Andric if (!extractConstantMask(C, 8, UndefElts, RawMask)) 2553ca95b02SDimitry Andric return; 2563ca95b02SDimitry Andric 257d88c1a5aSDimitry Andric unsigned NumElts = RawMask.size(); 258d88c1a5aSDimitry Andric assert(NumElts == 16 && "Unexpected number of vector elements."); 2593ca95b02SDimitry Andric 260d88c1a5aSDimitry Andric for (unsigned i = 0; i != NumElts; ++i) { 261d88c1a5aSDimitry Andric if (UndefElts[i]) { 262d88c1a5aSDimitry Andric ShuffleMask.push_back(SM_SentinelUndef); 2633ca95b02SDimitry Andric continue; 2643ca95b02SDimitry Andric } 2653ca95b02SDimitry Andric 2663ca95b02SDimitry Andric // VPPERM Operation 2673ca95b02SDimitry Andric // Bits[4:0] - Byte Index (0 - 31) 2683ca95b02SDimitry Andric // Bits[7:5] - Permute Operation 2693ca95b02SDimitry Andric // 2703ca95b02SDimitry Andric // Permute Operation: 2713ca95b02SDimitry Andric // 0 - Source byte (no logical operation). 2723ca95b02SDimitry Andric // 1 - Invert source byte. 2733ca95b02SDimitry Andric // 2 - Bit reverse of source byte. 2743ca95b02SDimitry Andric // 3 - Bit reverse of inverted source byte. 2753ca95b02SDimitry Andric // 4 - 00h (zero - fill). 2763ca95b02SDimitry Andric // 5 - FFh (ones - fill). 2773ca95b02SDimitry Andric // 6 - Most significant bit of source byte replicated in all bit positions. 278d88c1a5aSDimitry Andric // 7 - Invert most significant bit of source byte and replicate in all bit 279d88c1a5aSDimitry Andric // positions. 280d88c1a5aSDimitry Andric uint64_t Element = RawMask[i]; 281d88c1a5aSDimitry Andric uint64_t Index = Element & 0x1F; 282d88c1a5aSDimitry Andric uint64_t PermuteOp = (Element >> 5) & 0x7; 2833ca95b02SDimitry Andric 2843ca95b02SDimitry Andric if (PermuteOp == 4) { 2853ca95b02SDimitry Andric ShuffleMask.push_back(SM_SentinelZero); 2863ca95b02SDimitry Andric continue; 2873ca95b02SDimitry Andric } 2883ca95b02SDimitry Andric if (PermuteOp != 0) { 2893ca95b02SDimitry Andric ShuffleMask.clear(); 2903ca95b02SDimitry Andric return; 2913ca95b02SDimitry Andric } 292d88c1a5aSDimitry Andric ShuffleMask.push_back((int)Index); 2933ca95b02SDimitry Andric } 2943ca95b02SDimitry Andric } 2953ca95b02SDimitry Andric 296d88c1a5aSDimitry Andric void DecodeVPERMVMask(const Constant *C, unsigned ElSize, 2974d0b32cdSDimitry Andric SmallVectorImpl<int> &ShuffleMask) { 2984d0b32cdSDimitry Andric Type *MaskTy = C->getType(); 299d88c1a5aSDimitry Andric unsigned MaskTySize = MaskTy->getPrimitiveSizeInBits(); 300d88c1a5aSDimitry Andric (void)MaskTySize; 301d88c1a5aSDimitry Andric assert((MaskTySize == 128 || MaskTySize == 256 || MaskTySize == 512) && 302d88c1a5aSDimitry Andric "Unexpected vector size."); 303d88c1a5aSDimitry Andric assert((ElSize == 8 || ElSize == 16 || ElSize == 32 || ElSize == 64) && 304d88c1a5aSDimitry Andric "Unexpected vector element size."); 305d88c1a5aSDimitry Andric 306d88c1a5aSDimitry Andric // The shuffle mask requires elements the same size as the target. 3077a7e6055SDimitry Andric APInt UndefElts; 3087a7e6055SDimitry Andric SmallVector<uint64_t, 64> RawMask; 309d88c1a5aSDimitry Andric if (!extractConstantMask(C, ElSize, UndefElts, RawMask)) 3104d0b32cdSDimitry Andric return; 311d88c1a5aSDimitry Andric 312d88c1a5aSDimitry Andric unsigned NumElts = RawMask.size(); 313d88c1a5aSDimitry Andric 314d88c1a5aSDimitry Andric for (unsigned i = 0; i != NumElts; ++i) { 315d88c1a5aSDimitry Andric if (UndefElts[i]) { 3164d0b32cdSDimitry Andric ShuffleMask.push_back(SM_SentinelUndef); 317d88c1a5aSDimitry Andric continue; 3184d0b32cdSDimitry Andric } 319d88c1a5aSDimitry Andric int Index = RawMask[i] & (NumElts - 1); 320d88c1a5aSDimitry Andric ShuffleMask.push_back(Index); 3214d0b32cdSDimitry Andric } 3224d0b32cdSDimitry Andric } 3234d0b32cdSDimitry Andric 324d88c1a5aSDimitry Andric void DecodeVPERMV3Mask(const Constant *C, unsigned ElSize, 3254d0b32cdSDimitry Andric SmallVectorImpl<int> &ShuffleMask) { 3264d0b32cdSDimitry Andric Type *MaskTy = C->getType(); 327d88c1a5aSDimitry Andric unsigned MaskTySize = MaskTy->getPrimitiveSizeInBits(); 328d88c1a5aSDimitry Andric (void)MaskTySize; 329d88c1a5aSDimitry Andric assert((MaskTySize == 128 || MaskTySize == 256 || MaskTySize == 512) && 330d88c1a5aSDimitry Andric "Unexpected vector size."); 331d88c1a5aSDimitry Andric assert((ElSize == 8 || ElSize == 16 || ElSize == 32 || ElSize == 64) && 332d88c1a5aSDimitry Andric "Unexpected vector element size."); 333d88c1a5aSDimitry Andric 334d88c1a5aSDimitry Andric // The shuffle mask requires elements the same size as the target. 3357a7e6055SDimitry Andric APInt UndefElts; 3367a7e6055SDimitry Andric SmallVector<uint64_t, 64> RawMask; 337d88c1a5aSDimitry Andric if (!extractConstantMask(C, ElSize, UndefElts, RawMask)) 3384d0b32cdSDimitry Andric return; 339d88c1a5aSDimitry Andric 340d88c1a5aSDimitry Andric unsigned NumElts = RawMask.size(); 341d88c1a5aSDimitry Andric 342d88c1a5aSDimitry Andric for (unsigned i = 0; i != NumElts; ++i) { 343d88c1a5aSDimitry Andric if (UndefElts[i]) { 3444d0b32cdSDimitry Andric ShuffleMask.push_back(SM_SentinelUndef); 345d88c1a5aSDimitry Andric continue; 3464d0b32cdSDimitry Andric } 347d88c1a5aSDimitry Andric int Index = RawMask[i] & (NumElts*2 - 1); 348d88c1a5aSDimitry Andric ShuffleMask.push_back(Index); 3494d0b32cdSDimitry Andric } 3504d0b32cdSDimitry Andric } 3514d0b32cdSDimitry Andric } // llvm namespace 352