43 Type *CstEltTy = CstTy->getElementType();
48 unsigned CstEltSizeInBits = CstTy->getScalarSizeInBits();
49 unsigned NumCstElts = CstTy->getNumElements();
51 assert((CstSizeInBits % MaskEltSizeInBits) == 0 &&
52 "Unaligned shuffle mask size");
54 unsigned NumMaskElts = CstSizeInBits / MaskEltSizeInBits;
55 UndefElts =
APInt(NumMaskElts, 0);
56 RawMask.
resize(NumMaskElts, 0);
59 if (MaskEltSizeInBits == CstEltSizeInBits) {
60 assert(NumCstElts == NumMaskElts &&
"Unaligned shuffle mask size");
61 for (
unsigned i = 0; i != NumMaskElts; ++i) {
62 Constant *COp =
C->getAggregateElement(i);
73 RawMask[i] = Elt->getValue().getZExtValue();
79 APInt UndefBits(CstSizeInBits, 0);
80 APInt MaskBits(CstSizeInBits, 0);
81 for (
unsigned i = 0; i != NumCstElts; ++i) {
82 Constant *COp =
C->getAggregateElement(i);
86 unsigned BitOffset = i * CstEltSizeInBits;
89 UndefBits.
setBits(BitOffset, BitOffset + CstEltSizeInBits);
97 for (
unsigned i = 0; i != NumMaskElts; ++i) {
98 unsigned BitOffset = i * MaskEltSizeInBits;
118 assert((Width == 128 || Width == 256 || Width == 512) &&
119 C->getType()->getPrimitiveSizeInBits() >= Width &&
120 "Unexpected vector size.");
128 unsigned NumElts = Width / 8;
129 assert((NumElts == 16 || NumElts == 32 || NumElts == 64) &&
130 "Unexpected number of vector elements.");
132 for (
unsigned i = 0; i != NumElts; ++i) {
140 if (Element & (1 << 7))
145 unsigned Base = i & ~0xf;
148 int Index =
Base + (Element & 0xf);
149 ShuffleMask.push_back(Index);
156 assert((Width == 128 || Width == 256 || Width == 512) &&
157 C->getType()->getPrimitiveSizeInBits() >= Width &&
158 "Unexpected vector size.");
159 assert((ElSize == 32 || ElSize == 64) &&
"Unexpected vector element size.");
167 unsigned NumElts = Width / ElSize;
168 unsigned NumEltsPerLane = 128 / ElSize;
169 assert((NumElts == 2 || NumElts == 4 || NumElts == 8 || NumElts == 16) &&
170 "Unexpected number of vector elements.");
172 for (
unsigned i = 0; i != NumElts; ++i) {
178 int Index = i & ~(NumEltsPerLane - 1);
181 Index += (Element >> 1) & 0x1;
183 Index += Element & 0x3;
185 ShuffleMask.push_back(Index);
191 Type *MaskTy =
C->getType();
194 assert((MaskTySize == 128 || MaskTySize == 256) && Width >= MaskTySize &&
195 "Unexpected vector size.");
203 unsigned NumElts = Width / ElSize;
204 unsigned NumEltsPerLane = 128 / ElSize;
205 assert((NumElts == 2 || NumElts == 4 || NumElts == 8) &&
206 "Unexpected number of vector elements.");
208 for (
unsigned i = 0; i != NumElts; ++i) {
219 unsigned MatchBit = (Selector >> 3) & 0x1;
227 if ((M2Z & 0x2) != 0u && MatchBit != (M2Z & 0x1)) {
232 int Index = i & ~(NumEltsPerLane - 1);
234 Index += (Selector >> 1) & 0x1;
236 Index += Selector & 0x3;
238 int Src = (Selector >> 2) & 0x1;
239 Index += Src * NumElts;
240 ShuffleMask.push_back(Index);
246 Type *MaskTy =
C->getType();
249 assert(Width == 128 && Width >= MaskTySize &&
"Unexpected vector size.");
257 unsigned NumElts = Width / 8;
258 assert(NumElts == 16 &&
"Unexpected number of vector elements.");
260 for (
unsigned i = 0; i != NumElts; ++i) {
282 uint64_t PermuteOp = (Element >> 5) & 0x7;
284 if (PermuteOp == 4) {
288 if (PermuteOp != 0) {
292 ShuffleMask.push_back((
int)Index);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file implements a class to represent arbitrary precision integral constant values and operations...
This file contains the declarations for the subclasses of Constant, which represent the different fla...
static constexpr Value * getValue(Ty &ValueOrUse)
This file defines the SmallVector class.
Class for arbitrary precision integers.
uint64_t getZExtValue() const
Get zero extended value.
void setBit(unsigned BitPosition)
Set the given bit to 1 whose position is given as "bitPosition".
bool isAllOnes() const
Determine if all bits are set. This is true for zero-width values.
LLVM_ABI void insertBits(const APInt &SubBits, unsigned bitPosition)
Insert the bits from a smaller APInt starting at bitPosition.
void setBits(unsigned loBit, unsigned hiBit)
Set the bits from loBit (inclusive) to hiBit (exclusive) to 1.
LLVM_ABI APInt extractBits(unsigned numBits, unsigned bitPosition) const
Return an APInt with the extracted bits [bitPosition,bitPosition+numBits).
This is an important base class in LLVM.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
The instances of the Type class are immutable: once they are created, they are never changed.
LLVM_ABI TypeSize getPrimitiveSizeInBits() const LLVM_READONLY
Return the basic size of this type if it is a primitive type.
bool isIntegerTy() const
True if this is an instance of IntegerType.
@ C
The default llvm calling convention, compatible with C.
This is an optimization pass for GlobalISel generic memory operations.
void DecodeVPERMILPMask(unsigned NumElts, unsigned ScalarBits, ArrayRef< uint64_t > RawMask, const APInt &UndefElts, SmallVectorImpl< int > &ShuffleMask)
Decode a VPERMILPD/VPERMILPS variable mask from a raw array of constants.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
void DecodeVPERMIL2PMask(unsigned NumElts, unsigned ScalarBits, unsigned M2Z, ArrayRef< uint64_t > RawMask, const APInt &UndefElts, SmallVectorImpl< int > &ShuffleMask)
Decode a VPERMIL2PD/VPERMIL2PS variable mask from a raw array of constants.
static bool extractConstantMask(const Constant *C, unsigned MaskEltSizeInBits, APInt &UndefElts, SmallVectorImpl< uint64_t > &RawMask)
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
void DecodeVPPERMMask(ArrayRef< uint64_t > RawMask, const APInt &UndefElts, SmallVectorImpl< int > &ShuffleMask)
Decode a VPPERM mask from a raw array of constants such as from BUILD_VECTOR.
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
void DecodePSHUFBMask(ArrayRef< uint64_t > RawMask, const APInt &UndefElts, SmallVectorImpl< int > &ShuffleMask)
Decode a PSHUFB mask from a raw array of constants such as from BUILD_VECTOR.