@@ -1152,6 +1152,9 @@ void DAGTypeLegalizer::SplitVectorResult(SDNode *N, unsigned ResNo) {
11521152 case ISD::VP_LOAD:
11531153 SplitVecRes_VP_LOAD (cast<VPLoadSDNode>(N), Lo, Hi);
11541154 break ;
1155+ case ISD::VP_LOAD_FF:
1156+ SplitVecRes_VP_LOAD_FF (cast<VPLoadFFSDNode>(N), Lo, Hi);
1157+ break ;
11551158 case ISD::EXPERIMENTAL_VP_STRIDED_LOAD:
11561159 SplitVecRes_VP_STRIDED_LOAD (cast<VPStridedLoadSDNode>(N), Lo, Hi);
11571160 break ;
@@ -2227,6 +2230,45 @@ void DAGTypeLegalizer::SplitVecRes_VP_LOAD(VPLoadSDNode *LD, SDValue &Lo,
22272230 ReplaceValueWith (SDValue (LD, 1 ), Ch);
22282231}
22292232
2233+ void DAGTypeLegalizer::SplitVecRes_VP_LOAD_FF (VPLoadFFSDNode *LD, SDValue &Lo,
2234+ SDValue &Hi) {
2235+ SDLoc dl (LD);
2236+ auto [LoVT, HiVT] = DAG.GetSplitDestVTs (LD->getValueType (0 ));
2237+
2238+ SDValue Ch = LD->getChain ();
2239+ SDValue Ptr = LD->getBasePtr ();
2240+ Align Alignment = LD->getBaseAlign ();
2241+ SDValue Mask = LD->getMask ();
2242+ SDValue EVL = LD->getVectorLength ();
2243+
2244+ // Split Mask operand
2245+ SDValue MaskLo, MaskHi;
2246+ if (Mask.getOpcode () == ISD::SETCC) {
2247+ SplitVecRes_SETCC (Mask.getNode (), MaskLo, MaskHi);
2248+ } else {
2249+ if (getTypeAction (Mask.getValueType ()) == TargetLowering::TypeSplitVector)
2250+ GetSplitVector (Mask, MaskLo, MaskHi);
2251+ else
2252+ std::tie (MaskLo, MaskHi) = DAG.SplitVector (Mask, dl);
2253+ }
2254+
2255+ // Split EVL operand
2256+ auto [EVLLo, EVLHi] = DAG.SplitEVL (EVL, LD->getValueType (0 ), dl);
2257+
2258+ MachineMemOperand *MMO = DAG.getMachineFunction ().getMachineMemOperand (
2259+ LD->getPointerInfo (), MachineMemOperand::MOLoad,
2260+ LocationSize::beforeOrAfterPointer (), Alignment, LD->getAAInfo (),
2261+ LD->getRanges ());
2262+
2263+ Lo = DAG.getLoadFFVP (LoVT, dl, Ch, Ptr, MaskLo, EVLLo, MMO);
2264+
2265+ // Fill the upper half with poison.
2266+ Hi = DAG.getUNDEF (HiVT);
2267+
2268+ ReplaceValueWith (SDValue (LD, 1 ), Lo.getValue (1 ));
2269+ ReplaceValueWith (SDValue (LD, 2 ), Lo.getValue (2 ));
2270+ }
2271+
22302272void DAGTypeLegalizer::SplitVecRes_VP_STRIDED_LOAD (VPStridedLoadSDNode *SLD,
22312273 SDValue &Lo, SDValue &Hi) {
22322274 assert (SLD->isUnindexed () &&
@@ -4707,6 +4749,9 @@ void DAGTypeLegalizer::WidenVectorResult(SDNode *N, unsigned ResNo) {
47074749 case ISD::VP_LOAD:
47084750 Res = WidenVecRes_VP_LOAD (cast<VPLoadSDNode>(N));
47094751 break ;
4752+ case ISD::VP_LOAD_FF:
4753+ Res = WidenVecRes_VP_LOAD_FF (cast<VPLoadFFSDNode>(N));
4754+ break ;
47104755 case ISD::EXPERIMENTAL_VP_STRIDED_LOAD:
47114756 Res = WidenVecRes_VP_STRIDED_LOAD (cast<VPStridedLoadSDNode>(N));
47124757 break ;
@@ -6163,6 +6208,29 @@ SDValue DAGTypeLegalizer::WidenVecRes_VP_LOAD(VPLoadSDNode *N) {
61636208 return Res;
61646209}
61656210
6211+ SDValue DAGTypeLegalizer::WidenVecRes_VP_LOAD_FF (VPLoadFFSDNode *N) {
6212+ EVT WidenVT = TLI.getTypeToTransformTo (*DAG.getContext (), N->getValueType (0 ));
6213+ SDValue Mask = N->getMask ();
6214+ SDValue EVL = N->getVectorLength ();
6215+ SDLoc dl (N);
6216+
6217+ // The mask should be widened as well
6218+ assert (getTypeAction (Mask.getValueType ()) ==
6219+ TargetLowering::TypeWidenVector &&
6220+ " Unable to widen binary VP op" );
6221+ Mask = GetWidenedVector (Mask);
6222+ assert (Mask.getValueType ().getVectorElementCount () ==
6223+ TLI.getTypeToTransformTo (*DAG.getContext (), Mask.getValueType ())
6224+ .getVectorElementCount () &&
6225+ " Unable to widen vector load" );
6226+
6227+ SDValue Res = DAG.getLoadFFVP (WidenVT, dl, N->getChain (), N->getBasePtr (),
6228+ Mask, EVL, N->getMemOperand ());
6229+ ReplaceValueWith (SDValue (N, 1 ), Res.getValue (1 ));
6230+ ReplaceValueWith (SDValue (N, 2 ), Res.getValue (2 ));
6231+ return Res;
6232+ }
6233+
61666234SDValue DAGTypeLegalizer::WidenVecRes_VP_STRIDED_LOAD (VPStridedLoadSDNode *N) {
61676235 SDLoc DL (N);
61686236
0 commit comments