From 29c07324c19bbdaf5255b230cca5e0db5c5796c4 Mon Sep 17 00:00:00 2001 From: Piotr Caban Date: Mon, 17 May 2021 15:38:15 +0200 Subject: [PATCH] msvcrt: Import floor implementation from musl. The implementation is based on floorf. Signed-off-by: Piotr Caban Signed-off-by: Alexandre Julliard --- dlls/msvcrt/math.c | 23 ++++++++++++++++++++++- dlls/msvcrt/unixlib.c | 9 --------- dlls/msvcrt/unixlib.h | 1 - 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/dlls/msvcrt/math.c b/dlls/msvcrt/math.c index d85b43c7d7f..5682b00bb66 100644 --- a/dlls/msvcrt/math.c +++ b/dlls/msvcrt/math.c @@ -1811,10 +1811,31 @@ double CDECL ceil( double x ) /********************************************************************* * floor (MSVCRT.@) + * + * Based on musl: src/math/floorf.c */ double CDECL floor( double x ) { - return unix_funcs->floor(x); + union {double f; UINT64 i;} u = {x}; + int e = (int)(u.i >> 52 & 0x7ff) - 0x3ff; + UINT64 m; + + if (e >= 52) + return x; + if (e >= 0) { + m = 0x000fffffffffffffULL >> e; + if ((u.i & m) == 0) + return x; + if (u.i >> 63) + u.i += m; + u.i &= ~m; + } else { + if (u.i >> 63 == 0) + return 0; + else if (u.i << 1) + return -1; + } + return u.f; } /********************************************************************* diff --git a/dlls/msvcrt/unixlib.c b/dlls/msvcrt/unixlib.c index 9cdcd14e986..83a1e5386c1 100644 --- a/dlls/msvcrt/unixlib.c +++ b/dlls/msvcrt/unixlib.c @@ -274,14 +274,6 @@ static float CDECL unix_expm1f(float x) } /********************************************************************* - * floor - */ -static double CDECL unix_floor( double x ) -{ - return floor( x ); -} - -/********************************************************************* * fma */ static double CDECL unix_fma( double x, double y, double z ) @@ -703,7 +695,6 @@ static const struct unix_funcs funcs = unix_exp2f, unix_expm1, unix_expm1f, - unix_floor, unix_fma, unix_fmaf, unix_fmod, diff --git a/dlls/msvcrt/unixlib.h b/dlls/msvcrt/unixlib.h index 47af0e464cd..a86e2d34852 100644 --- a/dlls/msvcrt/unixlib.h +++ b/dlls/msvcrt/unixlib.h @@ -43,7 +43,6 @@ struct unix_funcs float (CDECL *exp2f)(float x); double (CDECL *expm1)(double x); float (CDECL *expm1f)(float x); - double (CDECL *floor)(double x); double (CDECL *fma)(double x, double y, double z); float (CDECL *fmaf)(float x, float y, float z); double (CDECL *fmod)(double x, double y); -- 2.11.4.GIT