Piotr Caban : msvcrt: Import cbrt implementation from musl.
Alexandre Julliard
julliard at winehq.org
Mon May 17 15:45:30 CDT 2021
Module: wine
Branch: master
Commit: e5d667de2f2c070e71db4e15cea764f238df6fe2
URL: https://source.winehq.org/git/wine.git/?a=commit;h=e5d667de2f2c070e71db4e15cea764f238df6fe2
Author: Piotr Caban <piotr at codeweavers.com>
Date: Mon May 17 15:37:55 2021 +0200
msvcrt: Import cbrt implementation from musl.
Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at 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
More information about the wine-cvs
mailing list