Module: wine Branch: master Commit: 9984a5d661ff45b5e273dedaea9f80f0c1479ee6 URL: https://source.winehq.org/git/wine.git/?a=commit;h=9984a5d661ff45b5e273dedae...
Author: Piotr Caban piotr@codeweavers.com Date: Tue May 18 19:08:37 2021 +0200
msvcrt: Import modf implementation from musl.
Signed-off-by: Piotr Caban piotr@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/msvcrt/math.c | 32 +++++++++++++++++++++++++++++++- dlls/msvcrt/unixlib.c | 9 --------- dlls/msvcrt/unixlib.h | 1 - 3 files changed, 31 insertions(+), 11 deletions(-)
diff --git a/dlls/msvcrt/math.c b/dlls/msvcrt/math.c index de0db9cca50..a860dfc3d2b 100644 --- a/dlls/msvcrt/math.c +++ b/dlls/msvcrt/math.c @@ -2000,10 +2000,40 @@ double CDECL frexp( double x, int *exp )
/********************************************************************* * modf (MSVCRT.@) + * + * Copied from musl: src/math/modf.c */ double CDECL modf( double x, double *iptr ) { - return unix_funcs->modf( x, iptr ); + union {double f; UINT64 i;} u = {x}; + UINT64 mask; + int e = (u.i >> 52 & 0x7ff) - 0x3ff; + + /* no fractional part */ + if (e >= 52) { + *iptr = x; + if (e == 0x400 && u.i << 12 != 0) /* nan */ + return x; + u.i &= 1ULL << 63; + return u.f; + } + + /* no integral part*/ + if (e < 0) { + u.i &= 1ULL << 63; + *iptr = u.f; + return x; + } + + mask = -1ULL >> 12 >> e; + if ((u.i & mask) == 0) { + *iptr = x; + u.i &= 1ULL << 63; + return u.f; + } + u.i &= ~mask; + *iptr = u.f; + return x - u.f; }
/********************************************************************** diff --git a/dlls/msvcrt/unixlib.c b/dlls/msvcrt/unixlib.c index a2bae9c6e5e..2a3d8ed4090 100644 --- a/dlls/msvcrt/unixlib.c +++ b/dlls/msvcrt/unixlib.c @@ -459,14 +459,6 @@ static float CDECL unix_logbf( float x ) return logbf( x ); }
-/********************************************************************* - * modf - */ -static double CDECL unix_modf( double x, double *iptr ) -{ - return modf( x, iptr ); -} - /********************************************************************* * modff */ @@ -674,7 +666,6 @@ static const struct unix_funcs funcs = unix_log2f, unix_logb, unix_logbf, - unix_modf, unix_modff, unix_pow, unix_powf, diff --git a/dlls/msvcrt/unixlib.h b/dlls/msvcrt/unixlib.h index edb9e99d3e4..080c9da9d08 100644 --- a/dlls/msvcrt/unixlib.h +++ b/dlls/msvcrt/unixlib.h @@ -62,7 +62,6 @@ struct unix_funcs float (CDECL *log2f)(float x); double (CDECL *logb)(double x); float (CDECL *logbf)(float x); - double (CDECL *modf)(double x, double *iptr); float (CDECL *modff)(float x, float *iptr); double (CDECL *pow)(double x, double y); float (CDECL *powf)(float x, float y);