diff --git a/dlls/crtdll/crtdll.spec b/dlls/crtdll/crtdll.spec index 98d729b9eb1..c9aa44fcf91 100644 --- a/dlls/crtdll/crtdll.spec +++ b/dlls/crtdll/crtdll.spec @@ -468,7 +468,7 @@ @ cdecl sin(double) @ cdecl sinh(double) @ varargs sprintf(ptr str) -@ cdecl sqrt(double) +@ cdecl sqrt(double) MSVCRT_sqrt @ cdecl srand(long) @ varargs sscanf(str str) @ cdecl strcat(str str) diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec index 3c969c9d307..3ebbe6cef16 100644 --- a/dlls/msvcr100/msvcr100.spec +++ b/dlls/msvcr100/msvcr100.spec @@ -1790,7 +1790,7 @@ @ cdecl -arch=!i386 sinhf(float) @ varargs sprintf(ptr str) @ varargs sprintf_s(ptr long str) -@ cdecl sqrt(double) +@ cdecl sqrt(double) MSVCRT_sqrt @ cdecl -arch=!i386 sqrtf(float) MSVCRT_sqrtf @ cdecl srand(long) @ varargs sscanf(str str) diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec index a071b0ead42..1032c9e4c7a 100644 --- a/dlls/msvcr110/msvcr110.spec +++ b/dlls/msvcr110/msvcr110.spec @@ -2148,7 +2148,7 @@ @ cdecl -arch=!i386 sinhf(float) @ varargs sprintf(ptr str) @ varargs sprintf_s(ptr long str) -@ cdecl sqrt(double) +@ cdecl sqrt(double) MSVCRT_sqrt @ cdecl -arch=!i386 sqrtf(float) MSVCRT_sqrtf @ cdecl srand(long) @ varargs sscanf(str str) diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index 3a502f9a8fe..ca11ea4b49d 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec @@ -2359,7 +2359,7 @@ @ cdecl -arch=!i386 sinhf(float) @ varargs sprintf(ptr str) @ varargs sprintf_s(ptr long str) -@ cdecl sqrt(double) +@ cdecl sqrt(double) MSVCRT_sqrt @ cdecl -arch=!i386 sqrtf(float) MSVCRT_sqrtf @ cdecl srand(long) @ varargs sscanf(str str) diff --git a/dlls/msvcr70/msvcr70.spec b/dlls/msvcr70/msvcr70.spec index fe281841198..253df1cdbd8 100644 --- a/dlls/msvcr70/msvcr70.spec +++ b/dlls/msvcr70/msvcr70.spec @@ -816,7 +816,7 @@ @ cdecl sin(double) @ cdecl sinh(double) @ varargs sprintf(ptr str) -@ cdecl sqrt(double) +@ cdecl sqrt(double) MSVCRT_sqrt @ cdecl srand(long) @ varargs sscanf(str str) @ cdecl strcat(str str) diff --git a/dlls/msvcr71/msvcr71.spec b/dlls/msvcr71/msvcr71.spec index ed9de904884..5f3bf499ad4 100644 --- a/dlls/msvcr71/msvcr71.spec +++ b/dlls/msvcr71/msvcr71.spec @@ -811,7 +811,7 @@ @ cdecl sin(double) @ cdecl sinh(double) @ varargs sprintf(ptr str) -@ cdecl sqrt(double) +@ cdecl sqrt(double) MSVCRT_sqrt @ cdecl srand(long) @ varargs sscanf(str str) @ cdecl strcat(str str) diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index 2c3faa2233e..9b040615693 100644 --- a/dlls/msvcr80/msvcr80.spec +++ b/dlls/msvcr80/msvcr80.spec @@ -1471,7 +1471,7 @@ @ cdecl -arch=!i386 sinhf(float) @ varargs sprintf(ptr str) @ varargs sprintf_s(ptr long str) -@ cdecl sqrt(double) +@ cdecl sqrt(double) MSVCRT_sqrt @ cdecl -arch=!i386 sqrtf(float) MSVCRT_sqrtf @ cdecl srand(long) @ varargs sscanf(str str) diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index 11fa5fc1f61..e9043c8c926 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec @@ -1443,7 +1443,7 @@ @ cdecl -arch=!i386 sinhf(float) @ varargs sprintf(ptr str) @ varargs sprintf_s(ptr long str) -@ cdecl sqrt(double) +@ cdecl sqrt(double) MSVCRT_sqrt @ cdecl -arch=!i386 sqrtf(float) MSVCRT_sqrtf @ cdecl srand(long) @ varargs sscanf(str str) diff --git a/dlls/msvcrt/math.c b/dlls/msvcrt/math.c index 9d020e1f20d..7fc9c44dbf5 100644 --- a/dlls/msvcrt/math.c +++ b/dlls/msvcrt/math.c @@ -77,12 +77,14 @@ void msvcrt_init_math( void *module ) #endif } +#if defined(__i386__) || defined(__x86_64__) static inline double ret_nan( BOOL update_sw ) { double x = 1.0; if (!update_sw) return -NAN; return (x - x) / (x - x); } +#endif #define SET_X87_CW(MASK) \ "subl $4, %esp\n\t" \ @@ -408,6 +410,7 @@ double CDECL MSVCRT_exp( double x ) } #endif +#if defined(__x86_64__) || defined(__i386__) static BOOL sqrt_validate( double *x, BOOL update_sw ) { short c = _dclass(*x); @@ -433,7 +436,6 @@ static BOOL sqrt_validate( double *x, BOOL update_sw ) return TRUE; } -#if defined(__x86_64__) || defined(__i386__) double CDECL sse2_sqrt(double); __ASM_GLOBAL_FUNC( sse2_sqrt, "sqrtsd %xmm0, %xmm0\n\t" @@ -452,10 +454,8 @@ __ASM_GLOBAL_FUNC( x87_sqrt, /********************************************************************* * sqrt (MSVCRT.@) - * - * Copied from musl: src/math/sqrt.c */ -double CDECL sqrt( double x ) +double CDECL MSVCRT_sqrt( double x ) { #ifdef __x86_64__ if (!sqrt_validate(&x, TRUE)) @@ -468,104 +468,7 @@ double CDECL sqrt( double x ) return x87_sqrt(x); #else - static const double tiny = 1.0e-300; - - double z; - int sign = 0x80000000; - int ix0,s0,q,m,t,i; - unsigned int r,t1,s1,ix1,q1; - ULONGLONG ix; - - if (!sqrt_validate(&x, TRUE)) - return x; - - ix = *(ULONGLONG*)&x; - ix0 = ix >> 32; - ix1 = ix; - - /* normalize x */ - m = ix0 >> 20; - if (m == 0) { /* subnormal x */ - while (ix0 == 0) { - m -= 21; - ix0 |= (ix1 >> 11); - ix1 <<= 21; - } - for (i=0; (ix0 & 0x00100000) == 0; i++) - ix0 <<= 1; - m -= i - 1; - ix0 |= ix1 >> (32 - i); - ix1 <<= i; - } - m -= 1023; /* unbias exponent */ - ix0 = (ix0 & 0x000fffff) | 0x00100000; - if (m & 1) { /* odd m, double x to make it even */ - ix0 += ix0 + ((ix1 & sign) >> 31); - ix1 += ix1; - } - m >>= 1; /* m = [m/2] */ - - /* generate sqrt(x) bit by bit */ - ix0 += ix0 + ((ix1 & sign) >> 31); - ix1 += ix1; - q = q1 = s0 = s1 = 0; /* [q,q1] = sqrt(x) */ - r = 0x00200000; /* r = moving bit from right to left */ - - while (r != 0) { - t = s0 + r; - if (t <= ix0) { - s0 = t + r; - ix0 -= t; - q += r; - } - ix0 += ix0 + ((ix1 & sign) >> 31); - ix1 += ix1; - r >>= 1; - } - - r = sign; - while (r != 0) { - t1 = s1 + r; - t = s0; - if (t < ix0 || (t == ix0 && t1 <= ix1)) { - s1 = t1 + r; - if ((t1&sign) == sign && (s1 & sign) == 0) - s0++; - ix0 -= t; - if (ix1 < t1) - ix0--; - ix1 -= t1; - q1 += r; - } - ix0 += ix0 + ((ix1 & sign) >> 31); - ix1 += ix1; - r >>= 1; - } - - /* use floating add to find out rounding direction */ - if ((ix0 | ix1) != 0) { - z = 1.0 - tiny; /* raise inexact flag */ - if (z >= 1.0) { - z = 1.0 + tiny; - if (q1 == (unsigned int)0xffffffff) { - q1 = 0; - q++; - } else if (z > 1.0) { - if (q1 == (unsigned int)0xfffffffe) - q++; - q1 += 2; - } else - q1 += q1 & 1; - } - } - ix0 = (q >> 1) + 0x3fe00000; - ix1 = q1 >> 1; - if (q & 1) - ix1 |= sign; - ix = ix0 + ((unsigned int)m << 20); - ix <<= 32; - ix |= ix1; - return *(double*)&ix; + return sqrt( x ); #endif } diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index 7e0d3d62ba4..22da5acfcce 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -1422,7 +1422,7 @@ @ cdecl -arch=!i386 sinhf(float) @ varargs sprintf(ptr str) @ varargs sprintf_s(ptr long str) -@ cdecl sqrt(double) +@ cdecl sqrt(double) MSVCRT_sqrt @ cdecl -arch=!i386 sqrtf(float) MSVCRT_sqrtf @ cdecl srand(long) @ varargs sscanf(str str) diff --git a/dlls/msvcrtd/msvcrtd.spec b/dlls/msvcrtd/msvcrtd.spec index e1f9e0a6cf3..2ab89d244cc 100644 --- a/dlls/msvcrtd/msvcrtd.spec +++ b/dlls/msvcrtd/msvcrtd.spec @@ -769,7 +769,7 @@ @ cdecl sin(double) @ cdecl sinh(double) @ varargs sprintf(ptr str) -@ cdecl sqrt(double) +@ cdecl sqrt(double) MSVCRT_sqrt @ cdecl srand(long) @ varargs sscanf(str str) @ cdecl strcat(str str) diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec index 7394e3cc5d0..cad6cf1c381 100644 --- a/dlls/ucrtbase/ucrtbase.spec +++ b/dlls/ucrtbase/ucrtbase.spec @@ -1778,7 +1778,7 @@ @ cdecl -arch=!i386 _o_sinf(float) sinf @ cdecl _o_sinh(double) sinh @ cdecl -arch=!i386 _o_sinhf(float) sinhf -@ cdecl _o_sqrt(double) sqrt +@ cdecl _o_sqrt(double) MSVCRT_sqrt @ cdecl -arch=!i386 _o_sqrtf(float) MSVCRT_sqrtf @ cdecl _o_srand(long) srand @ cdecl _o_strcat_s(str long str) strcat_s @@ -2494,7 +2494,7 @@ @ cdecl -arch=!i386 sinf(float) @ cdecl sinh(double) @ cdecl -arch=!i386 sinhf(float) -@ cdecl sqrt(double) +@ cdecl sqrt(double) MSVCRT_sqrt @ cdecl -arch=!i386 sqrtf(float) MSVCRT_sqrtf @ cdecl srand(long) @ cdecl strcat(str str) diff --git a/libs/musl/src/math/sqrt.c b/libs/musl/src/math/sqrt.c index f0185ec855e..beee70a42b3 100644 --- a/libs/musl/src/math/sqrt.c +++ b/libs/musl/src/math/sqrt.c @@ -35,7 +35,7 @@ double __cdecl sqrt(double x) if (ix == 0x7ff0000000000000) return x; if (ix > 0x7ff0000000000000) - return __math_invalid(x); + return math_error(_DOMAIN, "sqrt", x, 0, (x - x) / (x - x)); /* x is subnormal, normalize it. */ ix = asuint64(x * 0x1p52); top = ix >> 52;