Piotr Caban : msvcrt: Import y1 implementation from musl.

Alexandre Julliard julliard at winehq.org
Thu Apr 29 16:38:32 CDT 2021


Module: wine
Branch: master
Commit: e10bd6f46f6ae174cfe9ea4550dc367877f1581e
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=e10bd6f46f6ae174cfe9ea4550dc367877f1581e

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Thu Apr 29 17:06:19 2021 +0200

msvcrt: Import y1 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    | 46 ++++++++++++++++++++++++++++++++++++----------
 dlls/msvcrt/unixlib.c | 14 --------------
 dlls/msvcrt/unixlib.h |  1 -
 include/config.h.in   |  3 ---
 6 files changed, 36 insertions(+), 30 deletions(-)

diff --git a/configure b/configure
index cdc0342b066..3c12aa85227 100755
--- a/configure
+++ b/configure
@@ -19662,7 +19662,6 @@ for ac_func in \
 	tgammaf \
 	trunc \
 	truncf \
-	y1 \
 	yn
 
 do :
diff --git a/configure.ac b/configure.ac
index 03915d384f2..65661d89263 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2705,7 +2705,6 @@ AC_CHECK_FUNCS(\
 	tgammaf \
 	trunc \
 	truncf \
-	y1 \
 	yn
 )
 LIBS="$ac_save_LIBS"
diff --git a/dlls/msvcrt/math.c b/dlls/msvcrt/math.c
index 0ebe7b91cb7..aa5f4b1af7b 100644
--- a/dlls/msvcrt/math.c
+++ b/dlls/msvcrt/math.c
@@ -2971,18 +2971,44 @@ double CDECL _y0(double x)
 /*********************************************************************
  *		_y1 (MSVCRT.@)
  */
-double CDECL _y1(double num)
+double CDECL _y1(double x)
 {
-  double retval;
+    static const double tpi = 6.36619772367581382433e-01,
+        u00 =  -1.96057090646238940668e-01,
+        u01 = 5.04438716639811282616e-02,
+        u02 = -1.91256895875763547298e-03,
+        u03 = 2.35252600561610495928e-05,
+        u04 = -9.19099158039878874504e-08,
+        v00 = 1.99167318236649903973e-02,
+        v01 = 2.02552581025135171496e-04,
+        v02 = 1.35608801097516229404e-06,
+        v03 = 6.22741452364621501295e-09,
+        v04 = 1.66559246207992079114e-11;
 
-  if (!isfinite(num)) *_errno() = EDOM;
-  retval = unix_funcs->y1( num );
-  if (_fpclass(retval) == _FPCLASS_NINF)
-  {
-    *_errno() = EDOM;
-    retval = NAN;
-  }
-  return retval;
+    double z, u, v;
+    unsigned int ix, lx;
+
+    ix = *(ULONGLONG*)&x >> 32;
+    lx = *(ULONGLONG*)&x;
+
+    /* y1(nan)=nan, y1(<0)=nan, y1(0)=-inf, y1(inf)=0 */
+    if ((ix << 1 | lx) == 0)
+        return math_error(_OVERFLOW, "_y1", x, 0, -INFINITY);
+    if (isnan(x))
+        return x;
+    if (ix >> 31)
+        return math_error(_DOMAIN, "_y1", x, 0, 0 / (x - x));
+    if (ix >= 0x7ff00000)
+        return 1 / x;
+
+    if (ix >= 0x40000000)  /* x >= 2 */
+        return j1_y1_approx(ix, x, TRUE, 0);
+    if (ix < 0x3c900000)  /* x < 2**-54 */
+        return -tpi / x;
+    z = x * x;
+    u = u00 + z * (u01 + z * (u02 + z * (u03 + z * u04)));
+    v = 1 + z * (v00 + z * (v01 + z * (v02 + z * (v03 + z * v04))));
+    return x * (u / v) + tpi * (j1(x) * log(x) - 1 / x);
 }
 
 /*********************************************************************
diff --git a/dlls/msvcrt/unixlib.c b/dlls/msvcrt/unixlib.c
index 6b33eed223a..597d0ed7f64 100644
--- a/dlls/msvcrt/unixlib.c
+++ b/dlls/msvcrt/unixlib.c
@@ -952,19 +952,6 @@ static float CDECL unix_tgammaf(float x)
 #endif
 }
 
-/*********************************************************************
- *      y1
- */
-static double CDECL unix_y1(double num)
-{
-#ifdef HAVE_Y1
-    return y1(num);
-#else
-    FIXME("not implemented\n");
-    return 0;
-#endif
-}
-
 /*********************************************************************
  *      yn
  */
@@ -1066,7 +1053,6 @@ static const struct unix_funcs funcs =
     unix_tgammaf,
     unix_trunc,
     unix_truncf,
-    unix_y1,
     unix_yn
 };
 
diff --git a/dlls/msvcrt/unixlib.h b/dlls/msvcrt/unixlib.h
index d7b1827e08e..21caa036498 100644
--- a/dlls/msvcrt/unixlib.h
+++ b/dlls/msvcrt/unixlib.h
@@ -109,7 +109,6 @@ struct unix_funcs
     float           (CDECL *tgammaf)(float x);
     double          (CDECL *trunc)(double x);
     float           (CDECL *truncf)(float x);
-    double          (CDECL *y1)(double num);
     double          (CDECL *yn)(int order, double num);
 };
 
diff --git a/include/config.h.in b/include/config.h.in
index 8985cf6b474..266d8cec8d9 100644
--- a/include/config.h.in
+++ b/include/config.h.in
@@ -1169,9 +1169,6 @@
 /* Define if Xrandr has the XRRGetProviderResources function */
 #undef HAVE_XRRGETPROVIDERRESOURCES
 
-/* Define to 1 if you have the `y1' function. */
-#undef HAVE_Y1
-
 /* Define to 1 if you have the `yn' function. */
 #undef HAVE_YN
 




More information about the wine-cvs mailing list