29 ShuffleMask.push_back(0);
30 ShuffleMask.push_back(1);
31 ShuffleMask.push_back(2);
32 ShuffleMask.push_back(3);
35 unsigned ZMask = Imm & 15;
36 unsigned CountD = (Imm >> 4) & 3;
37 unsigned CountS = SrcIsMem ? 0 : (Imm >> 6) & 3;
40 unsigned InVal = 4 + CountS;
42 ShuffleMask[CountD] = InVal;
52 assert((Idx + Len) <= NumElts &&
"Insertion out of range");
54 for (
unsigned i = 0; i != NumElts; ++i)
55 ShuffleMask.push_back(i);
56 for (
unsigned i = 0; i != Len; ++i)
57 ShuffleMask[Idx + i] = NumElts + i;
62 for (
unsigned i = NElts / 2; i != NElts; ++i)
63 ShuffleMask.push_back(NElts + i);
65 for (
unsigned i = NElts / 2; i != NElts; ++i)
66 ShuffleMask.push_back(i);
71 for (
unsigned i = 0; i != NElts / 2; ++i)
72 ShuffleMask.push_back(i);
74 for (
unsigned i = 0; i != NElts / 2; ++i)
75 ShuffleMask.push_back(NElts + i);
79 for (
int i = 0, e = NumElts / 2; i < e; ++i) {
80 ShuffleMask.push_back(2 * i);
81 ShuffleMask.push_back(2 * i);
86 for (
int i = 0, e = NumElts / 2; i < e; ++i) {
87 ShuffleMask.push_back(2 * i + 1);
88 ShuffleMask.push_back(2 * i + 1);
93 const unsigned NumLaneElts = 2;
95 for (
unsigned l = 0; l < NumElts; l += NumLaneElts)
96 for (
unsigned i = 0; i < NumLaneElts; ++i)
97 ShuffleMask.push_back(l);
102 const unsigned NumLaneElts = 16;
104 for (
unsigned l = 0; l < NumElts; l += NumLaneElts)
105 for (
unsigned i = 0; i < NumLaneElts; ++i) {
107 if (i >= Imm) M = i - Imm + l;
108 ShuffleMask.push_back(M);
114 const unsigned NumLaneElts = 16;
116 for (
unsigned l = 0; l < NumElts; l += NumLaneElts)
117 for (
unsigned i = 0; i < NumLaneElts; ++i) {
118 unsigned Base = i + Imm;
121 ShuffleMask.push_back(M);
127 const unsigned NumLaneElts = 16;
129 for (
unsigned l = 0; l != NumElts; l += NumLaneElts) {
130 for (
unsigned i = 0; i != NumLaneElts; ++i) {
131 unsigned Base = i + Imm;
133 if (
Base >= NumLaneElts)
Base += NumElts - NumLaneElts;
134 ShuffleMask.push_back(
Base + l);
143 Imm = Imm & (NumElts - 1);
144 for (
unsigned i = 0; i != NumElts; ++i)
145 ShuffleMask.push_back(i + Imm);
150 unsigned Size = NumElts * ScalarBits;
151 unsigned NumLanes =
Size / 128;
152 if (NumLanes == 0) NumLanes = 1;
153 unsigned NumLaneElts = NumElts / NumLanes;
155 uint32_t SplatImm = (Imm & 0xff) * 0x01010101;
156 for (
unsigned l = 0; l != NumElts; l += NumLaneElts) {
157 for (
unsigned i = 0; i != NumLaneElts; ++i) {
158 ShuffleMask.push_back(SplatImm % NumLaneElts + l);
159 SplatImm /= NumLaneElts;
166 for (
unsigned l = 0; l != NumElts; l += 8) {
167 unsigned NewImm = Imm;
168 for (
unsigned i = 0, e = 4; i != e; ++i) {
169 ShuffleMask.push_back(l + i);
171 for (
unsigned i = 4, e = 8; i != e; ++i) {
172 ShuffleMask.push_back(l + 4 + (NewImm & 3));
180 for (
unsigned l = 0; l != NumElts; l += 8) {
181 unsigned NewImm = Imm;
182 for (
unsigned i = 0, e = 4; i != e; ++i) {
183 ShuffleMask.push_back(l + (NewImm & 3));
186 for (
unsigned i = 4, e = 8; i != e; ++i) {
187 ShuffleMask.push_back(l + i);
193 unsigned NumHalfElts = NumElts / 2;
195 for (
unsigned l = 0; l != NumHalfElts; ++l)
196 ShuffleMask.push_back(l + NumHalfElts);
197 for (
unsigned h = 0; h != NumHalfElts; ++h)
198 ShuffleMask.push_back(h);
203 unsigned NumLaneElts = 128 / ScalarBits;
205 unsigned NewImm = Imm;
206 for (
unsigned l = 0; l != NumElts; l += NumLaneElts) {
208 for (
unsigned s = 0; s != NumElts * 2; s += NumElts) {
209 for (
unsigned i = 0; i != NumLaneElts / 2; ++i) {
210 ShuffleMask.push_back(NewImm % NumLaneElts + s + l);
211 NewImm /= NumLaneElts;
214 if (NumLaneElts == 4) NewImm = Imm;
222 unsigned NumLanes = (NumElts * ScalarBits) / 128;
223 if (NumLanes == 0) NumLanes = 1;
224 unsigned NumLaneElts = NumElts / NumLanes;
226 for (
unsigned l = 0; l != NumElts; l += NumLaneElts) {
227 for (
unsigned i = l + NumLaneElts / 2, e = l + NumLaneElts; i != e; ++i) {
228 ShuffleMask.push_back(i);
229 ShuffleMask.push_back(i + NumElts);
238 unsigned NumLanes = (NumElts * ScalarBits) / 128;
239 if (NumLanes == 0 ) NumLanes = 1;
240 unsigned NumLaneElts = NumElts / NumLanes;
242 for (
unsigned l = 0; l != NumElts; l += NumLaneElts) {
243 for (
unsigned i = l, e = l + NumLaneElts / 2; i != e; ++i) {
244 ShuffleMask.push_back(i);
245 ShuffleMask.push_back(i + NumElts);
252 ShuffleMask.append(NumElts, 0);
257 unsigned Scale = DstNumElts / SrcNumElts;
259 for (
unsigned i = 0; i != Scale; ++i)
260 for (
unsigned j = 0; j != SrcNumElts; ++j)
261 ShuffleMask.push_back(j);
267 unsigned NumElementsInLane = 128 / ScalarSize;
268 unsigned NumLanes = NumElts / NumElementsInLane;
270 for (
unsigned l = 0; l != NumElts; l += NumElementsInLane) {
271 unsigned Index = (Imm % NumLanes) * NumElementsInLane;
274 if (l >= (NumElts / 2))
276 for (
unsigned i = 0; i != NumElementsInLane; ++i)
277 ShuffleMask.push_back(Index + i);
283 unsigned HalfSize = NumElts / 2;
285 for (
unsigned l = 0; l != 2; ++l) {
286 unsigned HalfMask = Imm >> (l * 4);
287 unsigned HalfBegin = (HalfMask & 0x3) * HalfSize;
288 for (
unsigned i = HalfBegin, e = HalfBegin + HalfSize; i != e; ++i)
295 for (
int i = 0, e = RawMask.
size(); i < e; ++i) {
303 int Base = (i / 16) * 16;
309 int Index =
Base + (M & 0xf);
310 ShuffleMask.push_back(Index);
317 for (
unsigned i = 0; i < NumElts; ++i) {
320 unsigned Bit = i % 8;
321 ShuffleMask.push_back(((Imm >> Bit) & 1) ? NumElts + i : i);
327 assert(RawMask.
size() == 16 &&
"Illegal VPPERM shuffle mask size");
342 for (
int i = 0, e = RawMask.
size(); i < e; ++i) {
349 uint64_t PermuteOp = (M >> 5) & 0x7;
350 if (PermuteOp == 4) {
354 if (PermuteOp != 0) {
360 ShuffleMask.push_back((
int)Index);
366 for (
unsigned l = 0; l != NumElts; l += 4)
367 for (
unsigned i = 0; i != 4; ++i)
368 ShuffleMask.push_back(l + ((Imm >> (2 * i)) & 3));
372 unsigned NumDstElts,
bool IsAnyExtend,
374 unsigned Scale = DstScalarBits / SrcScalarBits;
375 assert(SrcScalarBits < DstScalarBits &&
376 "Expected zero extension mask to increase scalar size");
379 for (
unsigned i = 0; i != NumDstElts; i++) {
380 ShuffleMask.push_back(i);
381 ShuffleMask.append(Scale - 1,
Sentinel);
387 ShuffleMask.push_back(0);
395 ShuffleMask.push_back(NumElts);
396 for (
unsigned i = 1; i < NumElts; i++)
402 unsigned HalfElts = NumElts / 2;
410 if (0 != (Len % EltSize) || 0 != (Idx % EltSize))
418 if ((Len + Idx) > 64) {
429 for (
int i = 0; i != Len; ++i)
430 ShuffleMask.push_back(i + Idx);
431 for (
int i = Len; i != (int)HalfElts; ++i)
433 for (
int i = HalfElts; i != (int)NumElts; ++i)
439 unsigned HalfElts = NumElts / 2;
447 if (0 != (Len % EltSize) || 0 != (Idx % EltSize))
455 if ((Len + Idx) > 64) {
467 for (
int i = 0; i != Idx; ++i)
468 ShuffleMask.push_back(i);
469 for (
int i = 0; i != Len; ++i)
470 ShuffleMask.push_back(i + NumElts);
471 for (
int i = Idx + Len; i != (int)HalfElts; ++i)
472 ShuffleMask.push_back(i);
473 for (
int i = HalfElts; i != (int)NumElts; ++i)
480 unsigned VecSize = NumElts * ScalarBits;
481 unsigned NumLanes = VecSize / 128;
482 unsigned NumEltsPerLane = NumElts / NumLanes;
483 assert((VecSize == 128 || VecSize == 256 || VecSize == 512) &&
484 "Unexpected vector size");
485 assert((ScalarBits == 32 || ScalarBits == 64) &&
"Unexpected element size");
487 for (
unsigned i = 0, e = RawMask.
size(); i < e; ++i) {
493 M = (ScalarBits == 64 ? ((M >> 1) & 0x1) : (M & 0x3));
494 unsigned LaneOffset = i & ~(NumEltsPerLane - 1);
495 ShuffleMask.push_back((
int)(LaneOffset + M));
502 unsigned VecSize = NumElts * ScalarBits;
503 unsigned NumLanes = VecSize / 128;
504 unsigned NumEltsPerLane = NumElts / NumLanes;
505 assert((VecSize == 128 || VecSize == 256) &&
"Unexpected vector size");
506 assert((ScalarBits == 32 || ScalarBits == 64) &&
"Unexpected element size");
507 assert((NumElts == RawMask.
size()) &&
"Unexpected mask size");
509 for (
unsigned i = 0, e = RawMask.
size(); i < e; ++i) {
520 unsigned MatchBit = (Selector >> 3) & 0x1;
528 if ((M2Z & 0x2) != 0 && MatchBit != (M2Z & 0x1)) {
533 int Index = i & ~(NumEltsPerLane - 1);
534 if (ScalarBits == 64)
535 Index += (Selector >> 1) & 0x1;
537 Index += Selector & 0x3;
539 int Src = (Selector >> 2) & 0x1;
540 Index += Src * NumElts;
541 ShuffleMask.push_back(Index);
548 for (
int i = 0, e = RawMask.
size(); i != e; ++i) {
555 ShuffleMask.push_back((
int)M);
562 for (
int i = 0, e = RawMask.
size(); i != e; ++i) {
569 ShuffleMask.push_back((
int)M);
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 defines the SmallVector class.
Class for arbitrary precision integers.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
size - Get the array size.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
This is an optimization pass for GlobalISel generic memory operations.
void DecodeZeroExtendMask(unsigned SrcScalarBits, unsigned DstScalarBits, unsigned NumDstElts, bool IsAnyExtend, SmallVectorImpl< int > &ShuffleMask)
Decode a zero extension instruction as a shuffle mask.
void DecodeMOVHLPSMask(unsigned NElts, SmallVectorImpl< int > &ShuffleMask)
Decode a MOVHLPS instruction as a v2f64/v4f32 shuffle mask.
void DecodeZeroMoveLowMask(unsigned NumElts, SmallVectorImpl< int > &ShuffleMask)
Decode a move lower and zero upper instruction as a shuffle mask.
void DecodeInsertElementMask(unsigned NumElts, unsigned Idx, unsigned Len, SmallVectorImpl< int > &ShuffleMask)
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 DecodePSHUFLWMask(unsigned NumElts, unsigned Imm, SmallVectorImpl< int > &ShuffleMask)
Decodes the shuffle masks for pshuflw.
void DecodeVPERMV3Mask(ArrayRef< uint64_t > RawMask, const APInt &UndefElts, SmallVectorImpl< int > &ShuffleMask)
Decode a VPERMT2 W/D/Q/PS/PD mask from a raw array of constants.
void DecodeBLENDMask(unsigned NumElts, unsigned Imm, SmallVectorImpl< int > &ShuffleMask)
Decode a BLEND immediate mask into a shuffle mask.
void decodeVSHUF64x2FamilyMask(unsigned NumElts, unsigned ScalarSize, unsigned Imm, SmallVectorImpl< int > &ShuffleMask)
Decode a shuffle packed values at 128-bit granularity (SHUFF32x4/SHUFF64x2/SHUFI32x4/SHUFI64x2) immed...
void DecodeVPERMMask(unsigned NumElts, unsigned Imm, SmallVectorImpl< int > &ShuffleMask)
Decodes the shuffle masks for VPERMQ/VPERMPD.
void DecodeEXTRQIMask(unsigned NumElts, unsigned EltSize, int Len, int Idx, SmallVectorImpl< int > &ShuffleMask)
Decode a SSE4A EXTRQ instruction as a shuffle mask.
void DecodePSRLDQMask(unsigned NumElts, unsigned Imm, SmallVectorImpl< int > &ShuffleMask)
void DecodeINSERTPSMask(unsigned Imm, SmallVectorImpl< int > &ShuffleMask, bool SrcIsMem)
Decode a 128-bit INSERTPS instruction as a v4f32 shuffle mask.
void DecodeVPERM2X128Mask(unsigned NumElts, unsigned Imm, SmallVectorImpl< int > &ShuffleMask)
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.
void DecodeMOVLHPSMask(unsigned NElts, SmallVectorImpl< int > &ShuffleMask)
Decode a MOVLHPS instruction as a v2f64/v4f32 shuffle mask.
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
void DecodePSWAPMask(unsigned NumElts, SmallVectorImpl< int > &ShuffleMask)
Decodes a PSWAPD 3DNow! instruction.
void DecodeINSERTQIMask(unsigned NumElts, unsigned EltSize, int Len, int Idx, SmallVectorImpl< int > &ShuffleMask)
Decode a SSE4A INSERTQ instruction as a shuffle mask.
void DecodeVPERMVMask(ArrayRef< uint64_t > RawMask, const APInt &UndefElts, SmallVectorImpl< int > &ShuffleMask)
Decode a VPERM W/D/Q/PS/PD mask from a raw array of constants.
void DecodeVALIGNMask(unsigned NumElts, unsigned Imm, SmallVectorImpl< int > &ShuffleMask)
void DecodeScalarMoveMask(unsigned NumElts, bool IsLoad, SmallVectorImpl< int > &ShuffleMask)
Decode a scalar float move instruction as a shuffle mask.
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 DecodePALIGNRMask(unsigned NumElts, unsigned Imm, SmallVectorImpl< int > &ShuffleMask)
void DecodeMOVSLDUPMask(unsigned NumElts, SmallVectorImpl< int > &ShuffleMask)
void DecodeSubVectorBroadcast(unsigned DstNumElts, unsigned SrcNumElts, SmallVectorImpl< int > &ShuffleMask)
Decodes a broadcast of a subvector to a larger vector type.
void DecodeUNPCKLMask(unsigned NumElts, unsigned ScalarBits, SmallVectorImpl< int > &ShuffleMask)
Decodes the shuffle masks for unpcklps/unpcklpd and punpckl*.
void DecodePSLLDQMask(unsigned NumElts, unsigned Imm, SmallVectorImpl< int > &ShuffleMask)
void DecodeUNPCKHMask(unsigned NumElts, unsigned ScalarBits, SmallVectorImpl< int > &ShuffleMask)
Decodes the shuffle masks for unpckhps/unpckhpd and punpckh*.
void DecodePSHUFMask(unsigned NumElts, unsigned ScalarBits, unsigned Imm, SmallVectorImpl< int > &ShuffleMask)
Decodes the shuffle masks for pshufd/pshufw/vpermilpd/vpermilps.
void DecodeMOVDDUPMask(unsigned NumElts, SmallVectorImpl< int > &ShuffleMask)
void DecodeVectorBroadcast(unsigned NumElts, SmallVectorImpl< int > &ShuffleMask)
Decodes a broadcast of the first element of a vector.
void DecodeSHUFPMask(unsigned NumElts, unsigned ScalarBits, unsigned Imm, SmallVectorImpl< int > &ShuffleMask)
Decodes the shuffle masks for shufp*.
void DecodePSHUFHWMask(unsigned NumElts, unsigned Imm, SmallVectorImpl< int > &ShuffleMask)
Decodes the shuffle masks for pshufhw.
void DecodeMOVSHDUPMask(unsigned NumElts, SmallVectorImpl< int > &ShuffleMask)
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.