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" 174d0b32cdSDimitry Andric #include "llvm/CodeGen/MachineValueType.h" 184d0b32cdSDimitry Andric #include "llvm/IR/Constants.h" 194d0b32cdSDimitry Andric 204d0b32cdSDimitry Andric //===----------------------------------------------------------------------===// 214d0b32cdSDimitry Andric // Vector Mask Decoding 224d0b32cdSDimitry Andric //===----------------------------------------------------------------------===// 234d0b32cdSDimitry Andric 244d0b32cdSDimitry Andric namespace llvm { 254d0b32cdSDimitry Andric 264d0b32cdSDimitry Andric void DecodePSHUFBMask(const Constant *C, SmallVectorImpl<int> &ShuffleMask) { 274d0b32cdSDimitry Andric Type *MaskTy = C->getType(); 284d0b32cdSDimitry Andric // It is not an error for the PSHUFB mask to not be a vector of i8 because the 294d0b32cdSDimitry Andric // constant pool uniques constants by their bit representation. 304d0b32cdSDimitry Andric // e.g. the following take up the same space in the constant pool: 314d0b32cdSDimitry Andric // i128 -170141183420855150465331762880109871104 324d0b32cdSDimitry Andric // 334d0b32cdSDimitry Andric // <2 x i64> <i64 -9223372034707292160, i64 -9223372034707292160> 344d0b32cdSDimitry Andric // 354d0b32cdSDimitry Andric // <4 x i32> <i32 -2147483648, i32 -2147483648, 364d0b32cdSDimitry Andric // i32 -2147483648, i32 -2147483648> 374d0b32cdSDimitry Andric 384d0b32cdSDimitry Andric #ifndef NDEBUG 394d0b32cdSDimitry Andric unsigned MaskTySize = MaskTy->getPrimitiveSizeInBits(); 404d0b32cdSDimitry Andric assert(MaskTySize == 128 || MaskTySize == 256 || MaskTySize == 512); 414d0b32cdSDimitry Andric #endif 424d0b32cdSDimitry Andric 433ca95b02SDimitry Andric if (!MaskTy->isVectorTy()) 443ca95b02SDimitry Andric return; 453ca95b02SDimitry Andric int NumElts = MaskTy->getVectorNumElements(); 464d0b32cdSDimitry Andric 473ca95b02SDimitry Andric Type *EltTy = MaskTy->getVectorElementType(); 483ca95b02SDimitry Andric if (!EltTy->isIntegerTy()) 493ca95b02SDimitry Andric return; 503ca95b02SDimitry Andric 513ca95b02SDimitry Andric // The shuffle mask requires a byte vector - decode cases with 523ca95b02SDimitry Andric // wider elements as well. 533ca95b02SDimitry Andric unsigned BitWidth = cast<IntegerType>(EltTy)->getBitWidth(); 543ca95b02SDimitry Andric if ((BitWidth % 8) != 0) 553ca95b02SDimitry Andric return; 563ca95b02SDimitry Andric 573ca95b02SDimitry Andric int Scale = BitWidth / 8; 583ca95b02SDimitry Andric int NumBytes = NumElts * Scale; 593ca95b02SDimitry Andric ShuffleMask.reserve(NumBytes); 603ca95b02SDimitry Andric 613ca95b02SDimitry Andric for (int i = 0; i != NumElts; ++i) { 624d0b32cdSDimitry Andric Constant *COp = C->getAggregateElement(i); 634d0b32cdSDimitry Andric if (!COp) { 644d0b32cdSDimitry Andric ShuffleMask.clear(); 654d0b32cdSDimitry Andric return; 664d0b32cdSDimitry Andric } else if (isa<UndefValue>(COp)) { 673ca95b02SDimitry Andric ShuffleMask.append(Scale, SM_SentinelUndef); 684d0b32cdSDimitry Andric continue; 694d0b32cdSDimitry Andric } 703ca95b02SDimitry Andric 713ca95b02SDimitry Andric APInt APElt = cast<ConstantInt>(COp)->getValue(); 723ca95b02SDimitry Andric for (int j = 0; j != Scale; ++j) { 733ca95b02SDimitry Andric // For AVX vectors with 32 bytes the base of the shuffle is the 16-byte 743ca95b02SDimitry Andric // lane of the vector we're inside. 753ca95b02SDimitry Andric int Base = ((i * Scale) + j) & ~0xf; 763ca95b02SDimitry Andric 773ca95b02SDimitry Andric uint64_t Element = APElt.getLoBits(8).getZExtValue(); 783ca95b02SDimitry Andric APElt = APElt.lshr(8); 793ca95b02SDimitry Andric 804d0b32cdSDimitry Andric // If the high bit (7) of the byte is set, the element is zeroed. 814d0b32cdSDimitry Andric if (Element & (1 << 7)) 824d0b32cdSDimitry Andric ShuffleMask.push_back(SM_SentinelZero); 834d0b32cdSDimitry Andric else { 844d0b32cdSDimitry Andric // Only the least significant 4 bits of the byte are used. 854d0b32cdSDimitry Andric int Index = Base + (Element & 0xf); 864d0b32cdSDimitry Andric ShuffleMask.push_back(Index); 874d0b32cdSDimitry Andric } 884d0b32cdSDimitry Andric } 894d0b32cdSDimitry Andric } 903ca95b02SDimitry Andric 913ca95b02SDimitry Andric assert(NumBytes == (int)ShuffleMask.size() && "Unexpected shuffle mask size"); 924d0b32cdSDimitry Andric } 934d0b32cdSDimitry Andric 944d0b32cdSDimitry Andric void DecodeVPERMILPMask(const Constant *C, unsigned ElSize, 954d0b32cdSDimitry Andric SmallVectorImpl<int> &ShuffleMask) { 964d0b32cdSDimitry Andric Type *MaskTy = C->getType(); 974d0b32cdSDimitry Andric // It is not an error for the PSHUFB mask to not be a vector of i8 because the 984d0b32cdSDimitry Andric // constant pool uniques constants by their bit representation. 994d0b32cdSDimitry Andric // e.g. the following take up the same space in the constant pool: 1004d0b32cdSDimitry Andric // i128 -170141183420855150465331762880109871104 1014d0b32cdSDimitry Andric // 1024d0b32cdSDimitry Andric // <2 x i64> <i64 -9223372034707292160, i64 -9223372034707292160> 1034d0b32cdSDimitry Andric // 1044d0b32cdSDimitry Andric // <4 x i32> <i32 -2147483648, i32 -2147483648, 1054d0b32cdSDimitry Andric // i32 -2147483648, i32 -2147483648> 1064d0b32cdSDimitry Andric 1073ca95b02SDimitry Andric if (ElSize != 32 && ElSize != 64) 1083ca95b02SDimitry Andric return; 1094d0b32cdSDimitry Andric 1103ca95b02SDimitry Andric unsigned MaskTySize = MaskTy->getPrimitiveSizeInBits(); 1113ca95b02SDimitry Andric if (MaskTySize != 128 && MaskTySize != 256 && MaskTySize != 512) 1124d0b32cdSDimitry Andric return; 1134d0b32cdSDimitry Andric 1144d0b32cdSDimitry Andric // Only support vector types. 1154d0b32cdSDimitry Andric if (!MaskTy->isVectorTy()) 1164d0b32cdSDimitry Andric return; 1174d0b32cdSDimitry Andric 1184d0b32cdSDimitry Andric // Make sure its an integer type. 1194d0b32cdSDimitry Andric Type *VecEltTy = MaskTy->getVectorElementType(); 1204d0b32cdSDimitry Andric if (!VecEltTy->isIntegerTy()) 1214d0b32cdSDimitry Andric return; 1224d0b32cdSDimitry Andric 1234d0b32cdSDimitry Andric // Support any element type from byte up to element size. 1243ca95b02SDimitry Andric // This is necessary primarily because 64-bit elements get split to 32-bit 1254d0b32cdSDimitry Andric // in the constant pool on 32-bit target. 1264d0b32cdSDimitry Andric unsigned EltTySize = VecEltTy->getIntegerBitWidth(); 1274d0b32cdSDimitry Andric if (EltTySize < 8 || EltTySize > ElSize) 1284d0b32cdSDimitry Andric return; 1294d0b32cdSDimitry Andric 1304d0b32cdSDimitry Andric unsigned NumElements = MaskTySize / ElSize; 1313ca95b02SDimitry Andric assert((NumElements == 2 || NumElements == 4 || NumElements == 8 || 1323ca95b02SDimitry Andric NumElements == 16) && 1334d0b32cdSDimitry Andric "Unexpected number of vector elements."); 1344d0b32cdSDimitry Andric ShuffleMask.reserve(NumElements); 1354d0b32cdSDimitry Andric unsigned NumElementsPerLane = 128 / ElSize; 1364d0b32cdSDimitry Andric unsigned Factor = ElSize / EltTySize; 1374d0b32cdSDimitry Andric 1384d0b32cdSDimitry Andric for (unsigned i = 0; i < NumElements; ++i) { 1394d0b32cdSDimitry Andric Constant *COp = C->getAggregateElement(i * Factor); 1404d0b32cdSDimitry Andric if (!COp) { 1414d0b32cdSDimitry Andric ShuffleMask.clear(); 1424d0b32cdSDimitry Andric return; 1434d0b32cdSDimitry Andric } else if (isa<UndefValue>(COp)) { 1444d0b32cdSDimitry Andric ShuffleMask.push_back(SM_SentinelUndef); 1454d0b32cdSDimitry Andric continue; 1464d0b32cdSDimitry Andric } 1474d0b32cdSDimitry Andric int Index = i & ~(NumElementsPerLane - 1); 1484d0b32cdSDimitry Andric uint64_t Element = cast<ConstantInt>(COp)->getZExtValue(); 1494d0b32cdSDimitry Andric if (ElSize == 64) 1504d0b32cdSDimitry Andric Index += (Element >> 1) & 0x1; 1514d0b32cdSDimitry Andric else 1524d0b32cdSDimitry Andric Index += Element & 0x3; 1534d0b32cdSDimitry Andric ShuffleMask.push_back(Index); 1544d0b32cdSDimitry Andric } 1554d0b32cdSDimitry Andric 1564d0b32cdSDimitry Andric // TODO: Handle funny-looking vectors too. 1574d0b32cdSDimitry Andric } 1584d0b32cdSDimitry Andric 1593ca95b02SDimitry Andric void DecodeVPERMIL2PMask(const Constant *C, unsigned M2Z, unsigned ElSize, 1603ca95b02SDimitry Andric SmallVectorImpl<int> &ShuffleMask) { 1613ca95b02SDimitry Andric Type *MaskTy = C->getType(); 1623ca95b02SDimitry Andric 1633ca95b02SDimitry Andric unsigned MaskTySize = MaskTy->getPrimitiveSizeInBits(); 1643ca95b02SDimitry Andric if (MaskTySize != 128 && MaskTySize != 256) 1653ca95b02SDimitry Andric return; 1663ca95b02SDimitry Andric 1673ca95b02SDimitry Andric // Only support vector types. 1683ca95b02SDimitry Andric if (!MaskTy->isVectorTy()) 1693ca95b02SDimitry Andric return; 1703ca95b02SDimitry Andric 1713ca95b02SDimitry Andric // Make sure its an integer type. 1723ca95b02SDimitry Andric Type *VecEltTy = MaskTy->getVectorElementType(); 1733ca95b02SDimitry Andric if (!VecEltTy->isIntegerTy()) 1743ca95b02SDimitry Andric return; 1753ca95b02SDimitry Andric 1763ca95b02SDimitry Andric // Support any element type from byte up to element size. 1773ca95b02SDimitry Andric // This is necessary primarily because 64-bit elements get split to 32-bit 1783ca95b02SDimitry Andric // in the constant pool on 32-bit target. 1793ca95b02SDimitry Andric unsigned EltTySize = VecEltTy->getIntegerBitWidth(); 1803ca95b02SDimitry Andric if (EltTySize < 8 || EltTySize > ElSize) 1813ca95b02SDimitry Andric return; 1823ca95b02SDimitry Andric 1833ca95b02SDimitry Andric unsigned NumElements = MaskTySize / ElSize; 1843ca95b02SDimitry Andric assert((NumElements == 2 || NumElements == 4 || NumElements == 8) && 1853ca95b02SDimitry Andric "Unexpected number of vector elements."); 1863ca95b02SDimitry Andric ShuffleMask.reserve(NumElements); 1873ca95b02SDimitry Andric unsigned NumElementsPerLane = 128 / ElSize; 1883ca95b02SDimitry Andric unsigned Factor = ElSize / EltTySize; 1893ca95b02SDimitry Andric 1903ca95b02SDimitry Andric for (unsigned i = 0; i < NumElements; ++i) { 1913ca95b02SDimitry Andric Constant *COp = C->getAggregateElement(i * Factor); 1923ca95b02SDimitry Andric if (!COp) { 1933ca95b02SDimitry Andric ShuffleMask.clear(); 1943ca95b02SDimitry Andric return; 1953ca95b02SDimitry Andric } else if (isa<UndefValue>(COp)) { 1963ca95b02SDimitry Andric ShuffleMask.push_back(SM_SentinelUndef); 1973ca95b02SDimitry Andric continue; 1983ca95b02SDimitry Andric } 1993ca95b02SDimitry Andric 2003ca95b02SDimitry Andric // VPERMIL2 Operation. 2013ca95b02SDimitry Andric // Bits[3] - Match Bit. 2023ca95b02SDimitry Andric // Bits[2:1] - (Per Lane) PD Shuffle Mask. 2033ca95b02SDimitry Andric // Bits[2:0] - (Per Lane) PS Shuffle Mask. 2043ca95b02SDimitry Andric uint64_t Selector = cast<ConstantInt>(COp)->getZExtValue(); 2053ca95b02SDimitry Andric unsigned MatchBit = (Selector >> 3) & 0x1; 2063ca95b02SDimitry Andric 2073ca95b02SDimitry Andric // M2Z[0:1] MatchBit 2083ca95b02SDimitry Andric // 0Xb X Source selected by Selector index. 2093ca95b02SDimitry Andric // 10b 0 Source selected by Selector index. 2103ca95b02SDimitry Andric // 10b 1 Zero. 2113ca95b02SDimitry Andric // 11b 0 Zero. 2123ca95b02SDimitry Andric // 11b 1 Source selected by Selector index. 2133ca95b02SDimitry Andric if ((M2Z & 0x2) != 0u && MatchBit != (M2Z & 0x1)) { 2143ca95b02SDimitry Andric ShuffleMask.push_back(SM_SentinelZero); 2153ca95b02SDimitry Andric continue; 2163ca95b02SDimitry Andric } 2173ca95b02SDimitry Andric 2183ca95b02SDimitry Andric int Index = i & ~(NumElementsPerLane - 1); 2193ca95b02SDimitry Andric if (ElSize == 64) 2203ca95b02SDimitry Andric Index += (Selector >> 1) & 0x1; 2213ca95b02SDimitry Andric else 2223ca95b02SDimitry Andric Index += Selector & 0x3; 2233ca95b02SDimitry Andric 2243ca95b02SDimitry Andric int Src = (Selector >> 2) & 0x1; 2253ca95b02SDimitry Andric Index += Src * NumElements; 2263ca95b02SDimitry Andric ShuffleMask.push_back(Index); 2273ca95b02SDimitry Andric } 2283ca95b02SDimitry Andric 2293ca95b02SDimitry Andric // TODO: Handle funny-looking vectors too. 2303ca95b02SDimitry Andric } 2313ca95b02SDimitry Andric 2323ca95b02SDimitry Andric void DecodeVPPERMMask(const Constant *C, SmallVectorImpl<int> &ShuffleMask) { 2333ca95b02SDimitry Andric Type *MaskTy = C->getType(); 2343ca95b02SDimitry Andric assert(MaskTy->getPrimitiveSizeInBits() == 128); 2353ca95b02SDimitry Andric 2363ca95b02SDimitry Andric // Only support vector types. 2373ca95b02SDimitry Andric if (!MaskTy->isVectorTy()) 2383ca95b02SDimitry Andric return; 2393ca95b02SDimitry Andric 2403ca95b02SDimitry Andric // Make sure its an integer type. 2413ca95b02SDimitry Andric Type *VecEltTy = MaskTy->getVectorElementType(); 2423ca95b02SDimitry Andric if (!VecEltTy->isIntegerTy()) 2433ca95b02SDimitry Andric return; 2443ca95b02SDimitry Andric 2453ca95b02SDimitry Andric // The shuffle mask requires a byte vector - decode cases with 2463ca95b02SDimitry Andric // wider elements as well. 2473ca95b02SDimitry Andric unsigned BitWidth = cast<IntegerType>(VecEltTy)->getBitWidth(); 2483ca95b02SDimitry Andric if ((BitWidth % 8) != 0) 2493ca95b02SDimitry Andric return; 2503ca95b02SDimitry Andric 2513ca95b02SDimitry Andric int NumElts = MaskTy->getVectorNumElements(); 2523ca95b02SDimitry Andric int Scale = BitWidth / 8; 2533ca95b02SDimitry Andric int NumBytes = NumElts * Scale; 2543ca95b02SDimitry Andric ShuffleMask.reserve(NumBytes); 2553ca95b02SDimitry Andric 2563ca95b02SDimitry Andric for (int i = 0; i != NumElts; ++i) { 2573ca95b02SDimitry Andric Constant *COp = C->getAggregateElement(i); 2583ca95b02SDimitry Andric if (!COp) { 2593ca95b02SDimitry Andric ShuffleMask.clear(); 2603ca95b02SDimitry Andric return; 2613ca95b02SDimitry Andric } else if (isa<UndefValue>(COp)) { 2623ca95b02SDimitry Andric ShuffleMask.append(Scale, 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. 2783ca95b02SDimitry Andric // 7 - Invert most significant bit of source byte and replicate in all bit positions. 2793ca95b02SDimitry Andric APInt MaskElt = cast<ConstantInt>(COp)->getValue(); 2803ca95b02SDimitry Andric for (int j = 0; j != Scale; ++j) { 2813ca95b02SDimitry Andric APInt Index = MaskElt.getLoBits(5); 2823ca95b02SDimitry Andric APInt PermuteOp = MaskElt.lshr(5).getLoBits(3); 2833ca95b02SDimitry Andric MaskElt = MaskElt.lshr(8); 2843ca95b02SDimitry Andric 2853ca95b02SDimitry Andric if (PermuteOp == 4) { 2863ca95b02SDimitry Andric ShuffleMask.push_back(SM_SentinelZero); 2873ca95b02SDimitry Andric continue; 2883ca95b02SDimitry Andric } 2893ca95b02SDimitry Andric if (PermuteOp != 0) { 2903ca95b02SDimitry Andric ShuffleMask.clear(); 2913ca95b02SDimitry Andric return; 2923ca95b02SDimitry Andric } 2933ca95b02SDimitry Andric ShuffleMask.push_back((int)Index.getZExtValue()); 2943ca95b02SDimitry Andric } 2953ca95b02SDimitry Andric } 2963ca95b02SDimitry Andric 2973ca95b02SDimitry Andric assert(NumBytes == (int)ShuffleMask.size() && "Unexpected shuffle mask size"); 2983ca95b02SDimitry Andric } 2993ca95b02SDimitry Andric 3004d0b32cdSDimitry Andric void DecodeVPERMVMask(const Constant *C, MVT VT, 3014d0b32cdSDimitry Andric SmallVectorImpl<int> &ShuffleMask) { 3024d0b32cdSDimitry Andric Type *MaskTy = C->getType(); 3034d0b32cdSDimitry Andric if (MaskTy->isVectorTy()) { 3044d0b32cdSDimitry Andric unsigned NumElements = MaskTy->getVectorNumElements(); 3054d0b32cdSDimitry Andric if (NumElements == VT.getVectorNumElements()) { 3063ca95b02SDimitry Andric unsigned EltMaskSize = Log2_64(NumElements); 3074d0b32cdSDimitry Andric for (unsigned i = 0; i < NumElements; ++i) { 3084d0b32cdSDimitry Andric Constant *COp = C->getAggregateElement(i); 3094d0b32cdSDimitry Andric if (!COp || (!isa<UndefValue>(COp) && !isa<ConstantInt>(COp))) { 3104d0b32cdSDimitry Andric ShuffleMask.clear(); 3114d0b32cdSDimitry Andric return; 3124d0b32cdSDimitry Andric } 3134d0b32cdSDimitry Andric if (isa<UndefValue>(COp)) 3144d0b32cdSDimitry Andric ShuffleMask.push_back(SM_SentinelUndef); 3154d0b32cdSDimitry Andric else { 3163ca95b02SDimitry Andric APInt Element = cast<ConstantInt>(COp)->getValue(); 3173ca95b02SDimitry Andric Element = Element.getLoBits(EltMaskSize); 3183ca95b02SDimitry Andric ShuffleMask.push_back(Element.getZExtValue()); 3194d0b32cdSDimitry Andric } 3204d0b32cdSDimitry Andric } 3214d0b32cdSDimitry Andric } 3224d0b32cdSDimitry Andric return; 3234d0b32cdSDimitry Andric } 3244d0b32cdSDimitry Andric // Scalar value; just broadcast it 3254d0b32cdSDimitry Andric if (!isa<ConstantInt>(C)) 3264d0b32cdSDimitry Andric return; 3274d0b32cdSDimitry Andric uint64_t Element = cast<ConstantInt>(C)->getZExtValue(); 3284d0b32cdSDimitry Andric int NumElements = VT.getVectorNumElements(); 3294d0b32cdSDimitry Andric Element &= (1 << NumElements) - 1; 3304d0b32cdSDimitry Andric for (int i = 0; i < NumElements; ++i) 3314d0b32cdSDimitry Andric ShuffleMask.push_back(Element); 3324d0b32cdSDimitry Andric } 3334d0b32cdSDimitry Andric 3344d0b32cdSDimitry Andric void DecodeVPERMV3Mask(const Constant *C, MVT VT, 3354d0b32cdSDimitry Andric SmallVectorImpl<int> &ShuffleMask) { 3364d0b32cdSDimitry Andric Type *MaskTy = C->getType(); 3374d0b32cdSDimitry Andric unsigned NumElements = MaskTy->getVectorNumElements(); 3384d0b32cdSDimitry Andric if (NumElements == VT.getVectorNumElements()) { 3393ca95b02SDimitry Andric unsigned EltMaskSize = Log2_64(NumElements * 2); 3404d0b32cdSDimitry Andric for (unsigned i = 0; i < NumElements; ++i) { 3414d0b32cdSDimitry Andric Constant *COp = C->getAggregateElement(i); 3424d0b32cdSDimitry Andric if (!COp) { 3434d0b32cdSDimitry Andric ShuffleMask.clear(); 3444d0b32cdSDimitry Andric return; 3454d0b32cdSDimitry Andric } 3464d0b32cdSDimitry Andric if (isa<UndefValue>(COp)) 3474d0b32cdSDimitry Andric ShuffleMask.push_back(SM_SentinelUndef); 3484d0b32cdSDimitry Andric else { 3493ca95b02SDimitry Andric APInt Element = cast<ConstantInt>(COp)->getValue(); 3503ca95b02SDimitry Andric Element = Element.getLoBits(EltMaskSize); 3513ca95b02SDimitry Andric ShuffleMask.push_back(Element.getZExtValue()); 3524d0b32cdSDimitry Andric } 3534d0b32cdSDimitry Andric } 3544d0b32cdSDimitry Andric } 3554d0b32cdSDimitry Andric } 3564d0b32cdSDimitry Andric } // llvm namespace 357