Index: lib/builtins/divdc3.c =================================================================== --- lib/builtins/divdc3.c +++ lib/builtins/divdc3.c @@ -23,14 +23,15 @@ double __logbw = __compiler_rt_logb(crt_fmax(crt_fabs(__c), crt_fabs(__d))); if (crt_isfinite(__logbw)) { __ilogbw = (int)__logbw; + __a = crt_scalbn(__a, -__ilogbw); + __b = crt_scalbn(__b, -__ilogbw); __c = crt_scalbn(__c, -__ilogbw); __d = crt_scalbn(__d, -__ilogbw); } double __denom = __c * __c + __d * __d; Dcomplex z; - COMPLEX_REAL(z) = crt_scalbn((__a * __c + __b * __d) / __denom, -__ilogbw); - COMPLEX_IMAGINARY(z) = - crt_scalbn((__b * __c - __a * __d) / __denom, -__ilogbw); + COMPLEX_REAL(z) = (__a * __c + __b * __d) / __denom; + COMPLEX_IMAGINARY(z) = (__b * __c - __a * __d) / __denom; if (crt_isnan(COMPLEX_REAL(z)) && crt_isnan(COMPLEX_IMAGINARY(z))) { if ((__denom == 0.0) && (!crt_isnan(__a) || !crt_isnan(__b))) { COMPLEX_REAL(z) = crt_copysign(CRT_INFINITY, __c) * __a; Index: lib/builtins/divsc3.c =================================================================== --- lib/builtins/divsc3.c +++ lib/builtins/divsc3.c @@ -23,14 +23,15 @@ __compiler_rt_logbf(crt_fmaxf(crt_fabsf(__c), crt_fabsf(__d))); if (crt_isfinite(__logbw)) { __ilogbw = (int)__logbw; + __a = crt_scalbnf(__a, -__ilogbw); + __b = crt_scalbnf(__b, -__ilogbw); __c = crt_scalbnf(__c, -__ilogbw); __d = crt_scalbnf(__d, -__ilogbw); } float __denom = __c * __c + __d * __d; Fcomplex z; - COMPLEX_REAL(z) = crt_scalbnf((__a * __c + __b * __d) / __denom, -__ilogbw); - COMPLEX_IMAGINARY(z) = - crt_scalbnf((__b * __c - __a * __d) / __denom, -__ilogbw); + COMPLEX_REAL(z) = (__a * __c + __b * __d) / __denom; + COMPLEX_IMAGINARY(z) = (__b * __c - __a * __d) / __denom; if (crt_isnan(COMPLEX_REAL(z)) && crt_isnan(COMPLEX_IMAGINARY(z))) { if ((__denom == 0) && (!crt_isnan(__a) || !crt_isnan(__b))) { COMPLEX_REAL(z) = crt_copysignf(CRT_INFINITY, __c) * __a; Index: lib/builtins/divtc3.c =================================================================== --- lib/builtins/divtc3.c +++ lib/builtins/divtc3.c @@ -24,14 +24,15 @@ __compiler_rt_logbl(crt_fmaxl(crt_fabsl(__c), crt_fabsl(__d))); if (crt_isfinite(__logbw)) { __ilogbw = (int)__logbw; + __a = crt_scalbnl(__a, -__ilogbw); + __b = crt_scalbnl(__b, -__ilogbw); __c = crt_scalbnl(__c, -__ilogbw); __d = crt_scalbnl(__d, -__ilogbw); } long double __denom = __c * __c + __d * __d; Lcomplex z; - COMPLEX_REAL(z) = crt_scalbnl((__a * __c + __b * __d) / __denom, -__ilogbw); - COMPLEX_IMAGINARY(z) = - crt_scalbnl((__b * __c - __a * __d) / __denom, -__ilogbw); + COMPLEX_REAL(z) = (__a * __c + __b * __d) / __denom; + COMPLEX_IMAGINARY(z) = (__b * __c - __a * __d) / __denom; if (crt_isnan(COMPLEX_REAL(z)) && crt_isnan(COMPLEX_IMAGINARY(z))) { if ((__denom == 0.0) && (!crt_isnan(__a) || !crt_isnan(__b))) { COMPLEX_REAL(z) = crt_copysignl(CRT_INFINITY, __c) * __a; Index: lib/builtins/divxc3.c =================================================================== --- lib/builtins/divxc3.c +++ lib/builtins/divxc3.c @@ -23,14 +23,15 @@ long double __logbw = crt_logbl(crt_fmaxl(crt_fabsl(__c), crt_fabsl(__d))); if (crt_isfinite(__logbw)) { __ilogbw = (int)__logbw; + __a = crt_scalbnl(__a, -__ilogbw); + __b = crt_scalbnl(__b, -__ilogbw); __c = crt_scalbnl(__c, -__ilogbw); __d = crt_scalbnl(__d, -__ilogbw); } long double __denom = __c * __c + __d * __d; Lcomplex z; - COMPLEX_REAL(z) = crt_scalbnl((__a * __c + __b * __d) / __denom, -__ilogbw); - COMPLEX_IMAGINARY(z) = - crt_scalbnl((__b * __c - __a * __d) / __denom, -__ilogbw); + COMPLEX_REAL(z) = (__a * __c + __b * __d) / __denom; + COMPLEX_IMAGINARY(z) = (__b * __c - __a * __d) / __denom; if (crt_isnan(COMPLEX_REAL(z)) && crt_isnan(COMPLEX_IMAGINARY(z))) { if ((__denom == 0) && (!crt_isnan(__a) || !crt_isnan(__b))) { COMPLEX_REAL(z) = crt_copysignl(CRT_INFINITY, __c) * __a; Index: test/builtins/Unit/divdc3_test.c =================================================================== --- test/builtins/Unit/divdc3_test.c +++ test/builtins/Unit/divdc3_test.c @@ -54,14 +54,14 @@ double _Complex r = __divdc3(a, b, c, d); // printf("test__divdc3(%f, %f, %f, %f) = %f + I%f\n", // a, b, c, d, creal(r), cimag(r)); - double _Complex dividend; - double _Complex divisor; - - __real__ dividend = a; - __imag__ dividend = b; - __real__ divisor = c; - __imag__ divisor = d; - + double _Complex dividend; + double _Complex divisor; + + __real__ dividend = a; + __imag__ dividend = b; + __real__ divisor = c; + __imag__ divisor = d; + switch (classify(dividend)) { case zero: @@ -196,7 +196,7 @@ } break; } - + return 0; } @@ -356,9 +356,20 @@ }; +int test_bignum__divdc3(double a, double b, double c, double d, double _Complex r) +{ + return __divdc3(a, b, c, d) != r; +} + +double x_bignum[][5] = +{ + {__DBL_MAX__, __DBL_MAX__, __DBL_MAX__/2, __DBL_MAX__/2, 2.}, + {-__DBL_MAX__, -__DBL_MAX__, __DBL_MAX__/2, __DBL_MAX__/2, -2.}, +}; + int main() { - const unsigned N = sizeof(x) / sizeof(x[0]); + unsigned N = sizeof(x) / sizeof(x[0]); unsigned i, j; for (i = 0; i < N; ++i) { @@ -369,5 +380,13 @@ } } + N = sizeof(x_bignum) / sizeof(x_bignum[0]); + for (i = 0; i < N; ++i) + { + double *t = x_bignum[i]; + if (test_bignum__divdc3(t[0], t[1], t[2], t[3], t[4])) + return 1; + } + return 0; } Index: test/builtins/Unit/divsc3_test.c =================================================================== --- test/builtins/Unit/divsc3_test.c +++ test/builtins/Unit/divsc3_test.c @@ -54,14 +54,14 @@ float _Complex r = __divsc3(a, b, c, d); // printf("test__divsc3(%f, %f, %f, %f) = %f + I%f\n", // a, b, c, d, crealf(r), cimagf(r)); - float _Complex dividend; - float _Complex divisor; - - __real__ dividend = a; - __imag__ dividend = b; - __real__ divisor = c; - __imag__ divisor = d; - + float _Complex dividend; + float _Complex divisor; + + __real__ dividend = a; + __imag__ dividend = b; + __real__ divisor = c; + __imag__ divisor = d; + switch (classify(dividend)) { case zero: @@ -196,7 +196,7 @@ } break; } - + return 0; } @@ -356,9 +356,20 @@ }; +int test_bignum__divsc3(float a, float b, float c, float d, float _Complex r) +{ + return __divsc3(a, b, c, d) != r; +} + +float x_bignum[][5] = +{ + {__FLT_MAX__, __FLT_MAX__, __FLT_MAX__/2, __FLT_MAX__/2, 2.}, + {-__FLT_MAX__, -__FLT_MAX__, __FLT_MAX__/2, __FLT_MAX__/2, -2.}, +}; + int main() { - const unsigned N = sizeof(x) / sizeof(x[0]); + unsigned N = sizeof(x) / sizeof(x[0]); unsigned i, j; for (i = 0; i < N; ++i) { @@ -369,5 +380,13 @@ } } + N = sizeof(x_bignum) / sizeof(x_bignum[0]); + for (i = 0; i < N; ++i) + { + float *t = x_bignum[i]; + if (test_bignum__divsc3(t[0], t[1], t[2], t[3], t[4])) + return 1; + } + return 0; } Index: test/builtins/Unit/divtc3_test.c =================================================================== --- test/builtins/Unit/divtc3_test.c +++ test/builtins/Unit/divtc3_test.c @@ -55,15 +55,15 @@ long double _Complex r = __divtc3(a, b, c, d); // printf("test__divtc3(%Lf, %Lf, %Lf, %Lf) = %Lf + I%Lf\n", // a, b, c, d, creall(r), cimagl(r)); - - long double _Complex dividend; - long double _Complex divisor; - - __real__ dividend = a; - __imag__ dividend = b; - __real__ divisor = c; - __imag__ divisor = d; - + + long double _Complex dividend; + long double _Complex divisor; + + __real__ dividend = a; + __imag__ dividend = b; + __real__ divisor = c; + __imag__ divisor = d; + switch (classify(dividend)) { case zero: @@ -198,7 +198,7 @@ } break; } - + return 0; } @@ -358,9 +358,20 @@ }; +int test_bignum__divtc3(long double a, long double b, long double c, long double d, long double _Complex r) +{ + return __divtc3(a, b, c, d) != r; +} + +long double x_bignum[][5] = +{ + {__LDBL_MAX__, __LDBL_MAX__, __LDBL_MAX__/2, __LDBL_MAX__/2, 2.}, + {-__LDBL_MAX__, -__LDBL_MAX__, __LDBL_MAX__/2, __LDBL_MAX__/2, -2.}, +}; + int main() { - const unsigned N = sizeof(x) / sizeof(x[0]); + unsigned N = sizeof(x) / sizeof(x[0]); unsigned i, j; for (i = 0; i < N; ++i) { @@ -371,6 +382,14 @@ } } -// printf("No errors found.\n"); + N = sizeof(x_bignum) / sizeof(x_bignum[0]); + for (i = 0; i < N; ++i) + { + long double *t = x_bignum[i]; + if (test_bignum__divtc3(t[0], t[1], t[2], t[3], t[4])) + return 1; + } + +// printf("No errors found.\n"); return 0; } Index: test/builtins/Unit/divxc3_test.c =================================================================== --- test/builtins/Unit/divxc3_test.c +++ test/builtins/Unit/divxc3_test.c @@ -59,14 +59,14 @@ long double _Complex r = __divxc3(a, b, c, d); // printf("test__divxc3(%Lf, %Lf, %Lf, %Lf) = %Lf + I%Lf\n", // a, b, c, d, creall(r), cimagl(r)); - long double _Complex dividend; - long double _Complex divisor; - - __real__ dividend = a; - __imag__ dividend = b; - __real__ divisor = c; - __imag__ divisor = d; - + long double _Complex dividend; + long double _Complex divisor; + + __real__ dividend = a; + __imag__ dividend = b; + __real__ divisor = c; + __imag__ divisor = d; + switch (classify(dividend)) { case zero: @@ -201,7 +201,7 @@ } break; } - + return 0; } @@ -361,12 +361,23 @@ }; +int test_bignum__divxc3(long double a, long double b, long double c, long double d, long double _Complex r) +{ + return __divxc3(a, b, c, d) != r; +} + +long double x_bignum[][5] = +{ + {__LDBL_MAX__, __LDBL_MAX__, __LDBL_MAX__/2, __LDBL_MAX__/2, 2.}, + {-__LDBL_MAX__, -__LDBL_MAX__, __LDBL_MAX__/2, __LDBL_MAX__/2, -2.}, +}; + #endif int main() { #if !_ARCH_PPC - const unsigned N = sizeof(x) / sizeof(x[0]); + unsigned N = sizeof(x) / sizeof(x[0]); unsigned i, j; for (i = 0; i < N; ++i) { @@ -377,6 +388,14 @@ } } + N = sizeof(x_bignum) / sizeof(x_bignum[0]); + for (i = 0; i < N; ++i) + { + long double *t = x_bignum[i]; + if (test_bignum__divxc3(t[0], t[1], t[2], t[3], t[4])) + return 1; + } + #else printf("skipped\n"); #endif