@@ -1226,6 +1226,9 @@ void DAGTypeLegalizer::SplitVectorResult(SDNode *N, unsigned ResNo) {
12261226 SplitVecRes_STEP_VECTOR (N, Lo, Hi);
12271227 break ;
12281228 case ISD::SIGN_EXTEND_INREG: SplitVecRes_InregOp (N, Lo, Hi); break ;
1229+ case ISD::ATOMIC_LOAD:
1230+ SplitVecRes_ATOMIC_LOAD (cast<AtomicSDNode>(N), Lo, Hi);
1231+ break ;
12291232 case ISD::LOAD:
12301233 SplitVecRes_LOAD (cast<LoadSDNode>(N), Lo, Hi);
12311234 break ;
@@ -2202,6 +2205,40 @@ void DAGTypeLegalizer::SplitVecRes_VP_SPLAT(SDNode *N, SDValue &Lo,
22022205 Hi = DAG.getNode (N->getOpcode (), dl, HiVT, N->getOperand (0 ), MaskHi, EVLHi);
22032206}
22042207
2208+ void DAGTypeLegalizer::SplitVecRes_ATOMIC_LOAD (AtomicSDNode *LD, SDValue &Lo,
2209+ SDValue &Hi) {
2210+ assert (LD->getExtensionType () == ISD::NON_EXTLOAD &&
2211+ " Extended load during type legalization!" );
2212+ SDLoc dl (LD);
2213+ EVT VT = LD->getValueType (0 );
2214+ EVT LoVT, HiVT;
2215+ std::tie (LoVT, HiVT) = DAG.GetSplitDestVTs (VT);
2216+
2217+ SDValue Ch = LD->getChain ();
2218+ SDValue Ptr = LD->getBasePtr ();
2219+
2220+ EVT IntVT = EVT::getIntegerVT (*DAG.getContext (), VT.getSizeInBits ());
2221+ EVT MemIntVT =
2222+ EVT::getIntegerVT (*DAG.getContext (), LD->getMemoryVT ().getSizeInBits ());
2223+ SDValue ALD = DAG.getAtomicLoad (ISD::NON_EXTLOAD, dl, MemIntVT, IntVT, Ch,
2224+ Ptr, LD->getMemOperand ());
2225+
2226+ EVT LoIntVT = EVT::getIntegerVT (*DAG.getContext (), LoVT.getSizeInBits ());
2227+ EVT HiIntVT = EVT::getIntegerVT (*DAG.getContext (), HiVT.getSizeInBits ());
2228+ SDValue ExtractLo = DAG.getNode (ISD::TRUNCATE, dl, LoIntVT, ALD);
2229+ SDValue ExtractHi =
2230+ DAG.getNode (ISD::SRL, dl, IntVT, ALD,
2231+ DAG.getIntPtrConstant (VT.getSizeInBits () / 2 , dl));
2232+ ExtractHi = DAG.getNode (ISD::TRUNCATE, dl, HiIntVT, ExtractHi);
2233+
2234+ Lo = DAG.getBitcast (LoVT, ExtractLo);
2235+ Hi = DAG.getBitcast (HiVT, ExtractHi);
2236+
2237+ // Legalize the chain result - switch anything that used the old chain to
2238+ // use the new one.
2239+ ReplaceValueWith (SDValue (LD, 1 ), ALD.getValue (1 ));
2240+ }
2241+
22052242void DAGTypeLegalizer::SplitVecRes_LOAD (LoadSDNode *LD, SDValue &Lo,
22062243 SDValue &Hi) {
22072244 assert (ISD::isUNINDEXEDLoad (LD) && " Indexed load during type legalization!" );
0 commit comments