39 auto *CstTy = dyn_cast<FixedVectorType>(
C->getType());
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);
63 if (!COp || (!isa<UndefValue>(COp) && !isa<ConstantInt>(COp)))
66 if (isa<UndefValue>(COp)) {
72 auto *Elt = cast<ConstantInt>(COp);
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);
83 if (!COp || (!isa<UndefValue>(COp) && !isa<ConstantInt>(COp)))
86 unsigned BitOffset = i * CstEltSizeInBits;
88 if (isa<UndefValue>(COp)) {
89 UndefBits.
setBits(BitOffset, BitOffset + CstEltSizeInBits);
93 MaskBits.
insertBits(cast<ConstantInt>(COp)->getValue(), BitOffset);
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;
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;
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;
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) {
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...
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
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.
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.
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.
bool isIntegerTy() const
True if this is an instance of IntegerType.
TypeSize getPrimitiveSizeInBits() const LLVM_READONLY
Return the basic size of this type if it is a primitive type.
@ 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.
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)
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.
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.