Skip to content

Commit e88038f

Browse files
author
Elena Demikhovsky
committed
AVX-512: Lowering for 512-bit vector shuffles.
Vector types: <8 x 64>, <16 x 32>, <32 x 16> float and integer. Differential Revision: http://reviews.llvm.org/D10683 llvm-svn: 246981
1 parent a89dc57 commit e88038f

File tree

7 files changed

+691
-574
lines changed

7 files changed

+691
-574
lines changed

llvm/lib/Target/X86/Utils/X86ShuffleDecode.cpp

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -503,4 +503,74 @@ void DecodeINSERTQIMask(int Len, int Idx,
503503
ShuffleMask.push_back(SM_SentinelUndef);
504504
}
505505

506+
void DecodeVPERMVMask(ArrayRef<uint64_t> RawMask,
507+
SmallVectorImpl<int> &ShuffleMask) {
508+
for (int i = 0, e = RawMask.size(); i < e; ++i) {
509+
uint64_t M = RawMask[i];
510+
ShuffleMask.push_back((int)M);
511+
}
512+
}
513+
514+
void DecodeVPERMV3Mask(ArrayRef<uint64_t> RawMask,
515+
SmallVectorImpl<int> &ShuffleMask) {
516+
for (int i = 0, e = RawMask.size(); i < e; ++i) {
517+
uint64_t M = RawMask[i];
518+
ShuffleMask.push_back((int)M);
519+
}
520+
}
521+
522+
void DecodeVPERMVMask(const Constant *C, MVT VT,
523+
SmallVectorImpl<int> &ShuffleMask) {
524+
Type *MaskTy = C->getType();
525+
if (MaskTy->isVectorTy()) {
526+
unsigned NumElements = MaskTy->getVectorNumElements();
527+
if (NumElements == VT.getVectorNumElements()) {
528+
for (unsigned i = 0; i < NumElements; ++i) {
529+
Constant *COp = C->getAggregateElement(i);
530+
if (!COp || (!isa<UndefValue>(COp) && !isa<ConstantInt>(COp))) {
531+
ShuffleMask.clear();
532+
return;
533+
}
534+
if (isa<UndefValue>(COp))
535+
ShuffleMask.push_back(SM_SentinelUndef);
536+
else {
537+
uint64_t Element = cast<ConstantInt>(COp)->getZExtValue();
538+
Element &= (1 << NumElements) - 1;
539+
ShuffleMask.push_back(Element);
540+
}
541+
}
542+
}
543+
return;
544+
}
545+
// Scalar value; just broadcast it
546+
if (!isa<ConstantInt>(C))
547+
return;
548+
uint64_t Element = cast<ConstantInt>(C)->getZExtValue();
549+
int NumElements = VT.getVectorNumElements();
550+
Element &= (1 << NumElements) - 1;
551+
for (int i = 0; i < NumElements; ++i)
552+
ShuffleMask.push_back(Element);
553+
}
554+
555+
void DecodeVPERMV3Mask(const Constant *C, MVT VT,
556+
SmallVectorImpl<int> &ShuffleMask) {
557+
Type *MaskTy = C->getType();
558+
unsigned NumElements = MaskTy->getVectorNumElements();
559+
if (NumElements == VT.getVectorNumElements()) {
560+
for (unsigned i = 0; i < NumElements; ++i) {
561+
Constant *COp = C->getAggregateElement(i);
562+
if (!COp) {
563+
ShuffleMask.clear();
564+
return;
565+
}
566+
if (isa<UndefValue>(COp))
567+
ShuffleMask.push_back(SM_SentinelUndef);
568+
else {
569+
uint64_t Element = cast<ConstantInt>(COp)->getZExtValue();
570+
Element &= (1 << NumElements*2) - 1;
571+
ShuffleMask.push_back(Element);
572+
}
573+
}
574+
}
575+
}
506576
} // llvm namespace

llvm/lib/Target/X86/Utils/X86ShuffleDecode.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,22 @@ void DecodeEXTRQIMask(int Len, int Idx,
108108
/// \brief Decode a SSE4A INSERTQ instruction as a v16i8 shuffle mask.
109109
void DecodeINSERTQIMask(int Len, int Idx,
110110
SmallVectorImpl<int> &ShuffleMask);
111+
112+
/// \brief Decode a VPERM W/D/Q/PS/PD mask from an IR-level vector constant.
113+
void DecodeVPERMVMask(const Constant *C, MVT VT,
114+
SmallVectorImpl<int> &ShuffleMask);
115+
116+
/// \brief Decode a VPERM W/D/Q/PS/PD mask from a raw array of constants.
117+
void DecodeVPERMVMask(ArrayRef<uint64_t> RawMask,
118+
SmallVectorImpl<int> &ShuffleMask);
119+
120+
/// \brief Decode a VPERMT2 W/D/Q/PS/PD mask from an IR-level vector constant.
121+
void DecodeVPERMV3Mask(const Constant *C, MVT VT,
122+
SmallVectorImpl<int> &ShuffleMask);
123+
124+
/// \brief Decode a VPERMT2 W/D/Q/PS/PD mask from a raw array of constants.
125+
void DecodeVPERMV3Mask(ArrayRef<uint64_t> RawMask,
126+
SmallVectorImpl<int> &ShuffleMask);
111127
} // llvm namespace
112128

113129
#endif

0 commit comments

Comments
 (0)