@@ -772,6 +772,8 @@ bool DAGTypeLegalizer::SoftenFloatOperand(SDNode *N, unsigned OpNo) {
772772 case ISD::FP_ROUND: Res = SoftenFloatOp_FP_ROUND (N); break ;
773773 case ISD::FP_TO_SINT:
774774 case ISD::FP_TO_UINT: Res = SoftenFloatOp_FP_TO_XINT (N); break ;
775+ case ISD::LROUND: Res = SoftenFloatOp_LROUND (N); break ;
776+ case ISD::LLROUND: Res = SoftenFloatOp_LLROUND (N); break ;
775777 case ISD::SELECT: Res = SoftenFloatOp_SELECT (N); break ;
776778 case ISD::SELECT_CC: Res = SoftenFloatOp_SELECT_CC (N); break ;
777779 case ISD::SETCC: Res = SoftenFloatOp_SETCC (N); break ;
@@ -1038,6 +1040,33 @@ SDValue DAGTypeLegalizer::SoftenFloatOp_STORE(SDNode *N, unsigned OpNo) {
10381040 ST->getMemOperand ());
10391041}
10401042
1043+ SDValue DAGTypeLegalizer::SoftenFloatOp_LROUND (SDNode *N) {
1044+ EVT NVT = TLI.getTypeToTransformTo (*DAG.getContext (), N->getValueType (0 ));
1045+
1046+ SDValue Op = GetSoftenedFloat (N->getOperand (0 ));
1047+ EVT RetVT = N->getOperand (0 ).getValueType ().getSimpleVT ().SimpleTy ;
1048+ return TLI.makeLibCall (DAG, GetFPLibCall (RetVT,
1049+ RTLIB::LROUND_F32,
1050+ RTLIB::LROUND_F64,
1051+ RTLIB::LROUND_F80,
1052+ RTLIB::LROUND_F128,
1053+ RTLIB::LROUND_PPCF128),
1054+ NVT, Op, false , SDLoc (N)).first ;
1055+ }
1056+
1057+ SDValue DAGTypeLegalizer::SoftenFloatOp_LLROUND (SDNode *N) {
1058+ EVT NVT = TLI.getTypeToTransformTo (*DAG.getContext (), N->getValueType (0 ));
1059+
1060+ SDValue Op = GetSoftenedFloat (N->getOperand (0 ));
1061+ EVT RetVT = N->getOperand (0 ).getValueType ().getSimpleVT ().SimpleTy ;
1062+ return TLI.makeLibCall (DAG, GetFPLibCall (RetVT,
1063+ RTLIB::LLROUND_F32,
1064+ RTLIB::LLROUND_F64,
1065+ RTLIB::LLROUND_F80,
1066+ RTLIB::LLROUND_F128,
1067+ RTLIB::LLROUND_PPCF128),
1068+ NVT, Op, false , SDLoc (N)).first ;
1069+ }
10411070
10421071// ===----------------------------------------------------------------------===//
10431072// Float Result Expansion
@@ -1571,6 +1600,8 @@ bool DAGTypeLegalizer::ExpandFloatOperand(SDNode *N, unsigned OpNo) {
15711600 case ISD::FP_ROUND: Res = ExpandFloatOp_FP_ROUND (N); break ;
15721601 case ISD::FP_TO_SINT: Res = ExpandFloatOp_FP_TO_SINT (N); break ;
15731602 case ISD::FP_TO_UINT: Res = ExpandFloatOp_FP_TO_UINT (N); break ;
1603+ case ISD::LROUND: Res = ExpandFloatOp_LROUND (N); break ;
1604+ case ISD::LLROUND: Res = ExpandFloatOp_LLROUND (N); break ;
15741605 case ISD::SELECT_CC: Res = ExpandFloatOp_SELECT_CC (N); break ;
15751606 case ISD::SETCC: Res = ExpandFloatOp_SETCC (N); break ;
15761607 case ISD::STORE: Res = ExpandFloatOp_STORE (cast<StoreSDNode>(N),
@@ -1741,6 +1772,30 @@ SDValue DAGTypeLegalizer::ExpandFloatOp_STORE(SDNode *N, unsigned OpNo) {
17411772 ST->getMemoryVT (), ST->getMemOperand ());
17421773}
17431774
1775+ SDValue DAGTypeLegalizer::ExpandFloatOp_LROUND (SDNode *N) {
1776+ EVT RVT = N->getValueType (0 );
1777+ EVT RetVT = N->getOperand (0 ).getValueType ().getSimpleVT ().SimpleTy ;
1778+ return TLI.makeLibCall (DAG, GetFPLibCall (RetVT,
1779+ RTLIB::LROUND_F32,
1780+ RTLIB::LROUND_F64,
1781+ RTLIB::LROUND_F80,
1782+ RTLIB::LROUND_F128,
1783+ RTLIB::LROUND_PPCF128),
1784+ RVT, N->getOperand (0 ), false , SDLoc (N)).first ;
1785+ }
1786+
1787+ SDValue DAGTypeLegalizer::ExpandFloatOp_LLROUND (SDNode *N) {
1788+ EVT RVT = N->getValueType (0 );
1789+ EVT RetVT = N->getOperand (0 ).getValueType ().getSimpleVT ().SimpleTy ;
1790+ return TLI.makeLibCall (DAG, GetFPLibCall (RetVT,
1791+ RTLIB::LLROUND_F32,
1792+ RTLIB::LLROUND_F64,
1793+ RTLIB::LLROUND_F80,
1794+ RTLIB::LLROUND_F128,
1795+ RTLIB::LLROUND_PPCF128),
1796+ RVT, N->getOperand (0 ), false , SDLoc (N)).first ;
1797+ }
1798+
17441799// ===----------------------------------------------------------------------===//
17451800// Float Operand Promotion
17461801// ===----------------------------------------------------------------------===//
0 commit comments