From e10bd6f46f6ae174cfe9ea4550dc367877f1581e Mon Sep 17 00:00:00 2001 From: Piotr Caban Date: Thu, 29 Apr 2021 17:06:19 +0200 Subject: [PATCH] msvcrt: Import y1 implementation from musl. Signed-off-by: Piotr Caban Signed-off-by: Alexandre Julliard --- 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