msvcrt: Import rint implementation from musl.

Signed-off-by: Piotr Caban <piotr@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Piotr Caban 2021-05-10 20:11:34 +02:00 committed by Alexandre Julliard
parent d5fb715536
commit cba9981c47
6 changed files with 32 additions and 20 deletions

1
configure vendored
View File

@ -19652,7 +19652,6 @@ for ac_func in \
remainderf \
remquo \
remquof \
rint \
rintf \
tgamma \
tgammaf \

View File

@ -2692,7 +2692,6 @@ AC_CHECK_FUNCS(\
remainderf \
remquo \
remquof \
rint \
rintf \
tgamma \
tgammaf \

View File

@ -87,6 +87,14 @@ static inline float fp_barrierf(float x)
return y;
}
#if _MSVCR_VER>=120
static inline double fp_barrier(double x)
{
volatile double y = x;
return y;
}
#endif
static inline double CDECL ret_nan( BOOL update_sw )
{
double x = 1.0;
@ -4273,10 +4281,33 @@ float CDECL log2f(float x)
/*********************************************************************
* rint (MSVCR120.@)
*
* Copied from musl: src/math/rint.c
*/
double CDECL rint(double x)
{
return unix_funcs->rint(x);
static const double toint = 1 / DBL_EPSILON;
ULONGLONG llx = *(ULONGLONG*)&x;
int e = llx >> 52 & 0x7ff;
int s = llx >> 63;
unsigned cw;
double 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;
}
/*********************************************************************

View File

@ -729,18 +729,6 @@ static float CDECL unix_remquof(float x, float y, int *quo)
#endif
}
/*********************************************************************
* rint
*/
static double CDECL unix_rint(double x)
{
#ifdef HAVE_RINT
return rint(x);
#else
return x >= 0 ? floor(x + 0.5) : ceil(x - 0.5);
#endif
}
/*********************************************************************
* rintf
*/
@ -934,7 +922,6 @@ static const struct unix_funcs funcs =
unix_remainderf,
unix_remquo,
unix_remquof,
unix_rint,
unix_rintf,
unix_sin,
unix_sinf,

View File

@ -88,7 +88,6 @@ struct unix_funcs
float (CDECL *remainderf)(float x, float y);
double (CDECL *remquo)(double x, double y, int *quo);
float (CDECL *remquof)(float x, float y, int *quo);
double (CDECL *rint)(double x);
float (CDECL *rintf)(float x);
double (CDECL *sin)(double x);
float (CDECL *sinf)(float x);

View File

@ -684,9 +684,6 @@
/* Define to 1 if you have the `res_getservers' function. */
#undef HAVE_RES_GETSERVERS
/* Define to 1 if you have the `rint' function. */
#undef HAVE_RINT
/* Define to 1 if you have the `rintf' function. */
#undef HAVE_RINTF