From: Daniel Lehman dlehman25@gmail.com
--- dlls/msvcr120/msvcr120.spec | 4 ++-- dlls/msvcrt/math.c | 23 +++-------------------- dlls/ntdll/math.c | 5 +++++ dlls/ucrtbase/ucrtbase.spec | 8 ++++---- libs/musl/src/math/rint.c | 6 ++++++ 5 files changed, 20 insertions(+), 26 deletions(-)
diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index 56b26852ce1..4305bc7bada 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec @@ -2334,9 +2334,9 @@ @ cdecl remquol(double double ptr) remquo @ cdecl rename(str str) @ cdecl rewind(ptr) -@ cdecl rint(double) MSVCRT_rint +@ cdecl rint(double) @ cdecl rintf(float) -@ cdecl rintl(double) MSVCRT_rint +@ cdecl rintl(double) rint @ cdecl round(double) @ cdecl roundf(float) @ cdecl roundl(double) round diff --git a/dlls/msvcrt/math.c b/dlls/msvcrt/math.c index 682010e3aa5..512fe503fe0 100644 --- a/dlls/msvcrt/math.c +++ b/dlls/msvcrt/math.c @@ -1621,23 +1621,6 @@ int CDECL _isnan(double num)
#if _MSVCR_VER>=120
-/********************************************************************* - * rint (MSVCR120.@) - */ -double CDECL MSVCRT_rint(double x) -{ - unsigned cw; - double y; - - cw = _controlfp(0, 0); - if ((cw & _MCW_PC) != _PC_53) - _controlfp(_PC_53, _MCW_PC); - y = rint(x); - if ((cw & _MCW_PC) != _PC_53) - _controlfp(cw, _MCW_PC); - return y; -} - /********************************************************************* * _nearbyint (MSVCR120.@) * @@ -1656,7 +1639,7 @@ double CDECL nearbyint(double x) cw |= _EM_INEXACT; _setfp(&cw, _EM_INEXACT, NULL, 0); } - x = MSVCRT_rint(x); + x = rint(x); if (update_cw || update_sw) { sw = 0; @@ -2603,7 +2586,7 @@ __msvcrt_long CDECL lrint(double x) { double d;
- d = MSVCRT_rint(x); + d = rint(x); if ((d < 0 && d != (double)(__msvcrt_long)d) || (d >= 0 && d != (double)(__msvcrt_ulong)d)) { *_errno() = EDOM; @@ -2635,7 +2618,7 @@ __int64 CDECL llrint(double x) { double d;
- d = MSVCRT_rint(x); + d = rint(x); if ((d < 0 && d != (double)(__int64)d) || (d >= 0 && d != (double)(unsigned __int64)d)) { *_errno() = EDOM; diff --git a/dlls/ntdll/math.c b/dlls/ntdll/math.c index 73a5bb8cd33..57455088747 100644 --- a/dlls/ntdll/math.c +++ b/dlls/ntdll/math.c @@ -30,6 +30,11 @@ double math_error( int type, const char *name, double arg1, double arg2, double return retval; }
+unsigned int _controlfp(unsigned int, unsigned int) +{ + return 0; +} + /********************************************************************* * abs (NTDLL.@) */ diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec index 230f5ceb1d7..9f026b351d1 100644 --- a/dlls/ucrtbase/ucrtbase.spec +++ b/dlls/ucrtbase/ucrtbase.spec @@ -1758,9 +1758,9 @@ @ cdecl _o_remquol(double double ptr) remquo @ cdecl _o_rename(str str) rename @ cdecl _o_rewind(ptr) rewind -@ cdecl _o_rint(double) MSVCRT_rint +@ cdecl _o_rint(double) rint @ cdecl _o_rintf(float) rintf -@ cdecl _o_rintl(double) MSVCRT_rint +@ cdecl _o_rintl(double) rint @ cdecl _o_round(double) round @ cdecl _o_roundf(float) roundf @ cdecl _o_roundl(double) round @@ -2472,9 +2472,9 @@ @ cdecl rename(str str) @ cdecl -arch=i386 rewind(ptr) rewind_preserve_stack @ cdecl -arch=!i386 rewind(ptr) -@ cdecl rint(double) MSVCRT_rint +@ cdecl rint(double) @ cdecl rintf(float) -@ cdecl rintl(double) MSVCRT_rint +@ cdecl rintl(double) rint @ cdecl round(double) @ cdecl roundf(float) @ cdecl roundl(double) round diff --git a/libs/musl/src/math/rint.c b/libs/musl/src/math/rint.c index ad35201b266..4d73758dda9 100644 --- a/libs/musl/src/math/rint.c +++ b/libs/musl/src/math/rint.c @@ -15,14 +15,20 @@ double __cdecl rint(double x) union {double f; uint64_t i;} u = {x}; int e = u.i>>52 & 0x7ff; int s = u.i>>63; + unsigned cw; double_t y;
if (e >= 0x3ff+52) return x; + cw = _controlfp(0, 0); + if ((cw & _MCW_PC) != _PC_53) + _controlfp(_PC_53, _MCW_PC); if (s) y = fp_barrier(x - toint) + toint; else y = fp_barrier(x + toint) - toint; + if ((cw & _MCW_PC) != _PC_53) + _controlfp(cw, _MCW_PC); if (y == 0) return s ? -0.0 : 0; return y;