Index: lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp =================================================================== --- lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp +++ lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp @@ -2182,6 +2182,13 @@ EVT VT = N->getValueType(0); SDLoc dl(N); + if (TLI.getOperationAction(ISD::SDIVREM, VT) == TargetLoweringBase::Custom) { + SDValue RES = DAG.getNode(ISD::SDIVREM, dl, DAG.getVTList(VT, VT), + N->getOperand(0), N->getOperand(1)); + SplitInteger(RES, Lo, Hi); + return; + } + RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL; if (VT == MVT::i16) LC = RTLIB::SDIV_I16; @@ -2361,6 +2368,13 @@ EVT VT = N->getValueType(0); SDLoc dl(N); + if (TLI.getOperationAction(ISD::SDIVREM, VT) == TargetLoweringBase::Custom) { + SDValue RES = DAG.getNode(ISD::SDIVREM, dl, DAG.getVTList(VT, VT), + N->getOperand(0), N->getOperand(1)); + SplitInteger(RES.getValue(1), Lo, Hi); + return; + } + RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL; if (VT == MVT::i16) LC = RTLIB::SREM_I16; @@ -2501,6 +2515,13 @@ EVT VT = N->getValueType(0); SDLoc dl(N); + if (TLI.getOperationAction(ISD::UDIVREM, VT) == TargetLoweringBase::Custom) { + SDValue RES = DAG.getNode(ISD::UDIVREM, dl, DAG.getVTList(VT, VT), + N->getOperand(0), N->getOperand(1)); + SplitInteger(RES, Lo, Hi); + return; + } + RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL; if (VT == MVT::i16) LC = RTLIB::UDIV_I16; @@ -2521,6 +2542,14 @@ EVT VT = N->getValueType(0); SDLoc dl(N); + if (TLI.getOperationAction(ISD::UDIVREM, VT) == TargetLoweringBase::Custom) { + SDValue RES = DAG.getNode(ISD::UDIVREM, dl, DAG.getVTList(VT, VT), + N->getOperand(0), N->getOperand(1)); + SplitInteger(RES.getValue(1), Lo, Hi); + return; + } + + RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL; if (VT == MVT::i16) LC = RTLIB::UREM_I16;