@@ -544,6 +544,37 @@ SDValue LoongArchTargetLowering::lowerBITREVERSE(SDValue Op,
544544 }
545545}
546546
547+ // Widen element type to get a new mask value (if possible).
548+ // For example:
549+ // shufflevector <4 x i32> %a, <4 x i32> %b,
550+ // <4 x i32> <i32 6, i32 7, i32 2, i32 3>
551+ // is equivalent to:
552+ // shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 3, i32 1>
553+ // can be lowered to:
554+ // VPACKOD_D vr0, vr0, vr1
555+ static SDValue widenShuffleMask (const SDLoc &DL, ArrayRef<int > Mask, MVT VT,
556+ SDValue V1, SDValue V2, SelectionDAG &DAG) {
557+ unsigned EltBits = VT.getScalarSizeInBits ();
558+
559+ if (EltBits > 32 || EltBits == 1 )
560+ return SDValue ();
561+
562+ SmallVector<int , 8 > NewMask;
563+ if (widenShuffleMaskElts (Mask, NewMask)) {
564+ MVT NewEltVT = VT.isFloatingPoint () ? MVT::getFloatingPointVT (EltBits * 2 )
565+ : MVT::getIntegerVT (EltBits * 2 );
566+ MVT NewVT = MVT::getVectorVT (NewEltVT, VT.getVectorNumElements () / 2 );
567+ if (DAG.getTargetLoweringInfo ().isTypeLegal (NewVT)) {
568+ SDValue NewV1 = DAG.getBitcast (NewVT, V1);
569+ SDValue NewV2 = DAG.getBitcast (NewVT, V2);
570+ return DAG.getBitcast (
571+ VT, DAG.getVectorShuffle (NewVT, DL, NewV1, NewV2, NewMask));
572+ }
573+ }
574+
575+ return SDValue ();
576+ }
577+
547578// / Attempts to match a shuffle mask against the VBSLL, VBSRL, VSLLI and VSRLI
548579// / instruction.
549580// The funciton matches elements from one of the input vector shuffled to the
@@ -1366,6 +1397,8 @@ static SDValue lower128BitShuffle(const SDLoc &DL, ArrayRef<int> Mask, MVT VT,
13661397 return Result;
13671398 if ((Result = lowerVECTOR_SHUFFLEAsByteRotate (DL, Mask, VT, V1, V2, DAG)))
13681399 return Result;
1400+ if (SDValue NewShuffle = widenShuffleMask (DL, Mask, VT, V1, V2, DAG))
1401+ return NewShuffle;
13691402 if ((Result = lowerVECTOR_SHUFFLE_VSHUF (DL, Mask, VT, V1, V2, DAG)))
13701403 return Result;
13711404 return SDValue ();
@@ -1804,41 +1837,13 @@ static SDValue lower256BitShuffle(const SDLoc &DL, ArrayRef<int> Mask, MVT VT,
18041837 return Result;
18051838 if ((Result = lowerVECTOR_SHUFFLEAsByteRotate (DL, NewMask, VT, V1, V2, DAG)))
18061839 return Result;
1840+ if (SDValue NewShuffle = widenShuffleMask (DL, NewMask, VT, V1, V2, DAG))
1841+ return NewShuffle;
18071842 if ((Result = lowerVECTOR_SHUFFLE_XVSHUF (DL, NewMask, VT, V1, V2, DAG)))
18081843 return Result;
18091844
18101845 return SDValue ();
18111846}
1812- // Widen element type to get a new mask value (if possible).
1813- // For example:
1814- // shufflevector <4 x i32> %a, <4 x i32> %b,
1815- // <4 x i32> <i32 6, i32 7, i32 2, i32 3>
1816- // is equivalent to:
1817- // shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 3, i32 1>
1818- // can be lowered to:
1819- // VPACKOD_D vr0, vr0, vr1
1820- static SDValue widenShuffleMask (const SDLoc &DL, ArrayRef<int > Mask, MVT VT,
1821- SDValue V1, SDValue V2, SelectionDAG &DAG) {
1822- unsigned EltBits = VT.getScalarSizeInBits ();
1823-
1824- if (EltBits > 32 || EltBits == 1 )
1825- return SDValue ();
1826-
1827- SmallVector<int , 8 > NewMask;
1828- if (widenShuffleMaskElts (Mask, NewMask)) {
1829- MVT NewEltVT = VT.isFloatingPoint () ? MVT::getFloatingPointVT (EltBits * 2 )
1830- : MVT::getIntegerVT (EltBits * 2 );
1831- MVT NewVT = MVT::getVectorVT (NewEltVT, VT.getVectorNumElements () / 2 );
1832- if (DAG.getTargetLoweringInfo ().isTypeLegal (NewVT)) {
1833- SDValue NewV1 = DAG.getBitcast (NewVT, V1);
1834- SDValue NewV2 = DAG.getBitcast (NewVT, V2);
1835- return DAG.getBitcast (
1836- VT, DAG.getVectorShuffle (NewVT, DL, NewV1, NewV2, NewMask));
1837- }
1838- }
1839-
1840- return SDValue ();
1841- }
18421847
18431848SDValue LoongArchTargetLowering::lowerVECTOR_SHUFFLE (SDValue Op,
18441849 SelectionDAG &DAG) const {
@@ -1873,9 +1878,6 @@ SDValue LoongArchTargetLowering::lowerVECTOR_SHUFFLE(SDValue Op,
18731878 return DAG.getVectorShuffle (VT, DL, V1, V2, NewMask);
18741879 }
18751880
1876- if (SDValue NewShuffle = widenShuffleMask (DL, OrigMask, VT, V1, V2, DAG))
1877- return NewShuffle;
1878-
18791881 // Check for illegal shuffle mask element index values.
18801882 int MaskUpperLimit = OrigMask.size () * (V2IsUndef ? 1 : 2 );
18811883 (void )MaskUpperLimit;
0 commit comments