Module: wine Branch: master Commit: ecfbd5971ecfae09b5c50619df1277cf51e66856 URL: https://gitlab.winehq.org/wine/wine/-/commit/ecfbd5971ecfae09b5c50619df1277c...
Author: Alexandre Julliard julliard@winehq.org Date: Fri Apr 7 14:43:44 2023 +0200
msvcrt: Use the atan() implementation from the bundled musl library.
---
dlls/msvcrt/math.c | 93 +++++-------------------------------------------- dlls/msvcrt/msvcrt.spec | 2 +- 2 files changed, 9 insertions(+), 86 deletions(-)
diff --git a/dlls/msvcrt/math.c b/dlls/msvcrt/math.c index 69dfca332af..2a523b589ae 100644 --- a/dlls/msvcrt/math.c +++ b/dlls/msvcrt/math.c @@ -78,11 +78,13 @@ void msvcrt_init_math( void *module ) }
/* Copied from musl: src/internal/libm.h */ +#if !defined(__i386__) || _MSVCR_VER>=120 static inline float fp_barrierf(float x) { volatile float y = x; return y; } +#endif
static inline double fp_barrier(double x) { @@ -489,93 +491,14 @@ double CDECL MSVCRT_asin( double x )
/********************************************************************* * atan (MSVCRT.@) - * - * Copied from musl: src/math/atan.c - */ -double CDECL atan( double x ) -{ - static const double atanhi[] = { - 4.63647609000806093515e-01, - 7.85398163397448278999e-01, - 9.82793723247329054082e-01, - 1.57079632679489655800e+00, - }; - static const double atanlo[] = { - 2.26987774529616870924e-17, - 3.06161699786838301793e-17, - 1.39033110312309984516e-17, - 6.12323399573676603587e-17, - }; - static const double aT[] = { - 3.33333333333329318027e-01, - -1.99999999998764832476e-01, - 1.42857142725034663711e-01, - -1.11111104054623557880e-01, - 9.09088713343650656196e-02, - -7.69187620504482999495e-02, - 6.66107313738753120669e-02, - -5.83357013379057348645e-02, - 4.97687799461593236017e-02, - -3.65315727442169155270e-02, - 1.62858201153657823623e-02, - }; - - double w, s1, s2, z; - unsigned int ix, sign; - int id; - -#if _MSVCR_VER == 0 + */ +#if _MSVCR_VER == 0 /* other versions call atan() directly */ +double CDECL MSVCRT_atan( double x ) +{ if (isnan(x)) return math_error(_DOMAIN, "atan", x, 0, x); -#endif - - ix = *(ULONGLONG*)&x >> 32; - sign = ix >> 31; - ix &= 0x7fffffff; - if (ix >= 0x44100000) { /* if |x| >= 2^66 */ - if (isnan(x)) - return x; - z = atanhi[3] + 7.5231638452626401e-37; - return sign ? -z : z; - } - if (ix < 0x3fdc0000) { /* |x| < 0.4375 */ - if (ix < 0x3e400000) { /* |x| < 2^-27 */ - if (ix < 0x00100000) - /* raise underflow for subnormal x */ - fp_barrierf((float)x); - return x; - } - id = -1; - } else { - x = fabs(x); - if (ix < 0x3ff30000) { /* |x| < 1.1875 */ - if (ix < 0x3fe60000) { /* 7/16 <= |x| < 11/16 */ - id = 0; - x = (2.0 * x - 1.0) / (2.0 + x); - } else { /* 11/16 <= |x| < 19/16 */ - id = 1; - x = (x - 1.0) / (x + 1.0); - } - } else { - if (ix < 0x40038000) { /* |x| < 2.4375 */ - id = 2; - x = (x - 1.5) / (1.0 + 1.5 * x); - } else { /* 2.4375 <= |x| < 2^66 */ - id = 3; - x = -1.0 / x; - } - } - } - /* end of argument reduction */ - z = x * x; - w = z * z; - /* break sum from i=0 to 10 aT[i]z**(i+1) into odd and even poly */ - s1 = z * (aT[0] + w * (aT[2] + w * (aT[4] + w * (aT[6] + w * (aT[8] + w * aT[10]))))); - s2 = w * (aT[1] + w * (aT[3] + w * (aT[5] + w * (aT[7] + w * aT[9])))); - if (id < 0) - return x - x * (s1 + s2); - z = atanhi[id] - (x * (s1 + s2) - atanlo[id] - x); - return sign ? -z : z; + return atan( x ); } +#endif
/********************************************************************* * exp (MSVCRT.@) diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index 2d3e27be81a..c7facd39df1 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -1254,7 +1254,7 @@ @ cdecl asctime(ptr) @ cdecl asctime_s(ptr long ptr) @ cdecl asin(double) MSVCRT_asin -@ cdecl atan(double) +@ cdecl atan(double) MSVCRT_atan @ cdecl atan2(double double) @ cdecl -arch=!i386 asinf(float) @ cdecl -arch=!i386 atanf(float) MSVCRT_atanf