@@ -503,4 +503,74 @@ void DecodeINSERTQIMask(int Len, int Idx,
503
503
ShuffleMask.push_back (SM_SentinelUndef);
504
504
}
505
505
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
+ }
506
576
} // llvm namespace
0 commit comments