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