Module: wine Branch: master Commit: e5d667de2f2c070e71db4e15cea764f238df6fe2 URL: https://source.winehq.org/git/wine.git/?a=commit;h=e5d667de2f2c070e71db4e15c...
Author: Piotr Caban piotr@codeweavers.com Date: Mon May 17 15:37:55 2021 +0200
msvcrt: Import cbrt implementation from musl.
Signed-off-by: Piotr Caban piotr@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
configure | 1 - configure.ac | 1 - dlls/msvcrt/math.c | 42 +++++++++++++++++++++++++++++++++++++++++- dlls/msvcrt/unixlib.c | 13 ------------- dlls/msvcrt/unixlib.h | 1 - include/config.h.in | 3 --- 6 files changed, 41 insertions(+), 20 deletions(-)
diff --git a/configure b/configure index 3cbe4bed79e..69b97958832 100755 --- a/configure +++ b/configure @@ -19622,7 +19622,6 @@ for ac_func in \ asinhf \ atanh \ atanhf \ - cbrt \ erf \ erfc \ erfcf \ diff --git a/configure.ac b/configure.ac index 845b076a8ba..7fde36f7616 100644 --- a/configure.ac +++ b/configure.ac @@ -2662,7 +2662,6 @@ AC_CHECK_FUNCS(\ asinhf \ atanh \ atanhf \ - cbrt \ erf \ erfc \ erfcf \ diff --git a/dlls/msvcrt/math.c b/dlls/msvcrt/math.c index db59f5a0787..3c4abd5630c 100644 --- a/dlls/msvcrt/math.c +++ b/dlls/msvcrt/math.c @@ -4497,10 +4497,50 @@ short CDECL _dclass(double x)
/********************************************************************* * cbrt (MSVCR120.@) + * + * Copied from musl: src/math/cbrt.c */ double CDECL cbrt(double x) { - return unix_funcs->cbrt( x ); + static const UINT32 B1 = 715094163, B2 = 696219795; + static const double P0 = 1.87595182427177009643, + P1 = -1.88497979543377169875, + P2 = 1.621429720105354466140, + P3 = -0.758397934778766047437, + P4 = 0.145996192886612446982; + + union {double f; UINT64 i;} u = {x}; + double r,s,t,w; + UINT32 hx = u.i >> 32 & 0x7fffffff; + + if (hx >= 0x7ff00000) /* cbrt(NaN,INF) is itself */ + return x + x; + + if (hx < 0x00100000) { /* zero or subnormal? */ + u.f = x * 0x1p54; + hx = u.i>>32 & 0x7fffffff; + if (hx == 0) + return x; + hx = hx / 3 + B2; + } else + hx = hx / 3 + B1; + u.i &= 1ULL << 63; + u.i |= (UINT64)hx << 32; + t = u.f; + + r = (t * t) * (t / x); + t = t * ((P0 + r * (P1 + r * P2)) + ((r * r) * r) * (P3 + r * P4)); + + u.f = t; + u.i = (u.i + 0x80000000) & 0xffffffffc0000000ULL; + t = u.f; + + s = t * t; + r = x / s; + w = t + t; + r = (r - t) / (w + r); + t = t + t * r; + return t; }
/********************************************************************* diff --git a/dlls/msvcrt/unixlib.c b/dlls/msvcrt/unixlib.c index 56c70742133..1c4f1254a53 100644 --- a/dlls/msvcrt/unixlib.c +++ b/dlls/msvcrt/unixlib.c @@ -121,18 +121,6 @@ static float CDECL unix_atanhf(float x) #endif }
-/********************************************************************* - * cbrt - */ -static double CDECL unix_cbrt(double x) -{ -#ifdef HAVE_CBRT - return cbrt(x); -#else - return x < 0 ? -pow(-x, 1.0 / 3.0) : pow(x, 1.0 / 3.0); -#endif -} - /********************************************************************* * ceil */ @@ -725,7 +713,6 @@ static const struct unix_funcs funcs = unix_asinhf, unix_atanh, unix_atanhf, - unix_cbrt, unix_ceil, unix_ceilf, unix_cos, diff --git a/dlls/msvcrt/unixlib.h b/dlls/msvcrt/unixlib.h index c3b2b500c6d..ec380e106d4 100644 --- a/dlls/msvcrt/unixlib.h +++ b/dlls/msvcrt/unixlib.h @@ -29,7 +29,6 @@ struct unix_funcs float (CDECL *asinhf)(float x); double (CDECL *atanh)(double x); float (CDECL *atanhf)(float x); - double (CDECL *cbrt)(double x); double (CDECL *ceil)(double x); float (CDECL *ceilf)(float x); double (CDECL *cos)(double x); diff --git a/include/config.h.in b/include/config.h.in index 34103b765fc..ce83ecacd8e 100644 --- a/include/config.h.in +++ b/include/config.h.in @@ -67,9 +67,6 @@ /* Define to 1 if you have the <Carbon/Carbon.h> header file. */ #undef HAVE_CARBON_CARBON_H
-/* Define to 1 if you have the `cbrt' function. */ -#undef HAVE_CBRT - /* Define to 1 if you have the `clock_gettime' function. */ #undef HAVE_CLOCK_GETTIME