diff --git a/fixincludes/ChangeLog b/fixincludes/ChangeLog index 526e003e43c..eb1e719baf2 100644 --- a/fixincludes/ChangeLog +++ b/fixincludes/ChangeLog @@ -1,3 +1,13 @@ +2007-07-18 Kaveh R. Ghazi + + PR target/32641 + + * inclhack.def (solaris_math_4, solaris_math_5, solaris_math_6, + solaris_math_7): Constify and make FP exception-safe. + * tests/base/iso/math_c99.h: Update. + + * fixincl.x: Regenerate. + 2007-07-05 Rainer Orth PR libgcj/28190 diff --git a/fixincludes/fixincl.x b/fixincludes/fixincl.x index f6288d2661d..41818d5605a 100644 --- a/fixincludes/fixincl.x +++ b/fixincludes/fixincl.x @@ -2,11 +2,11 @@ * * DO NOT EDIT THIS FILE (fixincl.x) * - * It has been AutoGen-ed Friday June 29, 2007 at 06:59:26 PM MEST + * It has been AutoGen-ed Saturday July 7, 2007 at 11:23:30 PM EDT * From the definitions inclhack.def * and the template file fixincl */ -/* DO NOT SVN-MERGE THIS FILE, EITHER Fri Jun 29 18:59:26 MEST 2007 +/* DO NOT SVN-MERGE THIS FILE, EITHER Sat Jul 7 23:23:30 EDT 2007 * * You must regenerate it. Use the ./genfixes script. * @@ -5629,7 +5629,7 @@ static tTestDesc aSolaris_Math_4Tests[] = { static const char* apzSolaris_Math_4Patch[] = { "format", "#define\tfpclassify(x) \\\n\ - __extension__ ({ __typeof(x) __x_fp = (x); \\\n\ + __extension__ ({ const __typeof(x) __x_fp = (x); \\\n\ \t\t isnan(__x_fp) \\\n\ \t\t ? FP_NAN \\\n\ \t\t : isinf(__x_fp) \\\n\ @@ -5682,8 +5682,12 @@ static tTestDesc aSolaris_Math_5Tests[] = { static const char* apzSolaris_Math_5Patch[] = { "format", "#define\tisfinite(x) \\\n\ - __extension__ ({ __typeof (x) __x_f = (x); \\\n\ -\t\t __builtin_expect(!isnan(__x_f - __x_f), 1); })", + __extension__ ({ const __typeof (x) __x_f = (x); \\\n\ +\t\t __builtin_expect(sizeof(__x_f) == sizeof(float) \\\n\ +\t\t\t ? islessequal(__builtin_fabsf(__x_f),__FLT_MAX__) \\\n\ +\t\t\t : sizeof(__x_f) == sizeof(long double) \\\n\ +\t\t\t ? islessequal(__builtin_fabsl(__x_f),__LDBL_MAX__) \\\n\ +\t\t\t : islessequal(__builtin_fabs(__x_f),__DBL_MAX__), 1); })", "^#define[ \t]+isfinite\\(x\\)[ \t]+__builtin_isfinite\\(x\\)", (char*)NULL }; @@ -5727,8 +5731,12 @@ static tTestDesc aSolaris_Math_6Tests[] = { static const char* apzSolaris_Math_6Patch[] = { "format", "#define\tisinf(x) \\\n\ - __extension__ ({ __typeof (x) __x_i = (x); \\\n\ -\t\t __builtin_expect(!isnan(__x_i) && !isfinite(__x_i), 0); })", + __extension__ ({ const __typeof (x) __x_i = (x); \\\n\ +\t\t __builtin_expect(sizeof(__x_i) == sizeof(float) \\\n\ +\t\t\t ? isgreater(__builtin_fabsf(__x_i),__FLT_MAX__) \\\n\ +\t\t\t : sizeof(__x_i) == sizeof(long double) \\\n\ +\t\t\t ? isgreater(__builtin_fabsl(__x_i),__LDBL_MAX__) \\\n\ +\t\t\t : isgreater(__builtin_fabs(__x_i),__DBL_MAX__), 0); })", "^#define[ \t]+isinf\\(x\\)[ \t]+__builtin_isinf\\(x\\)", (char*)NULL }; @@ -5772,14 +5780,13 @@ static tTestDesc aSolaris_Math_7Tests[] = { static const char* apzSolaris_Math_7Patch[] = { "format", "#define\tisnormal(x) \\\n\ - __extension__ ({ __typeof(x) __x_n = (x); \\\n\ -\t\t if (__x_n < 0.0) __x_n = -__x_n; \\\n\ + __extension__ ({ const __typeof(x) __x_n = (x); \\\n\ \t\t __builtin_expect(isfinite(__x_n) \\\n\ \t\t\t\t && (sizeof(__x_n) == sizeof(float) \\\n\ -\t\t\t\t\t ? __x_n >= __FLT_MIN__ \\\n\ +\t\t\t\t\t ? isgreaterequal(__builtin_fabsf(__x_n),__FLT_MIN__) \\\n\ \t\t\t\t\t : sizeof(__x_n) == sizeof(long double) \\\n\ -\t\t\t\t\t ? __x_n >= __LDBL_MIN__ \\\n\ -\t\t\t\t\t : __x_n >= __DBL_MIN__), 1); })", +\t\t\t\t\t ? isgreaterequal(__builtin_fabsl(__x_n),__LDBL_MIN__) \\\n\ +\t\t\t\t\t : isgreaterequal(__builtin_fabs(__x_n),__DBL_MIN__)), 1); })", "^#define[ \t]+isnormal\\(x\\)[ \t]+__builtin_isnormal\\(x\\)", (char*)NULL }; diff --git a/fixincludes/inclhack.def b/fixincludes/inclhack.def index f7f9888969f..fbc1b2a62d4 100644 --- a/fixincludes/inclhack.def +++ b/fixincludes/inclhack.def @@ -3088,7 +3088,7 @@ fix = { files = iso/math_c99.h; c_fix = format; c_fix_arg = "#define\tfpclassify(x) \\\n" - " __extension__ ({ __typeof(x) __x_fp = (x); \\\n" + " __extension__ ({ const __typeof(x) __x_fp = (x); \\\n" "\t\t isnan(__x_fp) \\\n" "\t\t ? FP_NAN \\\n" "\t\t : isinf(__x_fp) \\\n" @@ -3112,8 +3112,12 @@ fix = { files = iso/math_c99.h; c_fix = format; c_fix_arg = "#define\tisfinite(x) \\\n" - " __extension__ ({ __typeof (x) __x_f = (x); \\\n" - "\t\t __builtin_expect(!isnan(__x_f - __x_f), 1); })"; + " __extension__ ({ const __typeof (x) __x_f = (x); \\\n" + "\t\t __builtin_expect(sizeof(__x_f) == sizeof(float) \\\n" + "\t\t\t ? islessequal(__builtin_fabsf(__x_f),__FLT_MAX__) \\\n" + "\t\t\t : sizeof(__x_f) == sizeof(long double) \\\n" + "\t\t\t ? islessequal(__builtin_fabsl(__x_f),__LDBL_MAX__) \\\n" + "\t\t\t : islessequal(__builtin_fabs(__x_f),__DBL_MAX__), 1); })"; c_fix_arg = "^#define[ \t]+isfinite\\(x\\)[ \t]+__builtin_isfinite\\(x\\)"; test_text = '#ident "@(#)math_c99.h 1.9 04/11/01 SMI"'"\n" @@ -3128,8 +3132,12 @@ fix = { files = iso/math_c99.h; c_fix = format; c_fix_arg = "#define\tisinf(x) \\\n" - " __extension__ ({ __typeof (x) __x_i = (x); \\\n" - "\t\t __builtin_expect(!isnan(__x_i) && !isfinite(__x_i), 0); })"; + " __extension__ ({ const __typeof (x) __x_i = (x); \\\n" + "\t\t __builtin_expect(sizeof(__x_i) == sizeof(float) \\\n" + "\t\t\t ? isgreater(__builtin_fabsf(__x_i),__FLT_MAX__) \\\n" + "\t\t\t : sizeof(__x_i) == sizeof(long double) \\\n" + "\t\t\t ? isgreater(__builtin_fabsl(__x_i),__LDBL_MAX__) \\\n" + "\t\t\t : isgreater(__builtin_fabs(__x_i),__DBL_MAX__), 0); })"; c_fix_arg = "^#define[ \t]+isinf\\(x\\)[ \t]+__builtin_isinf\\(x\\)"; test_text = '#ident "@(#)math_c99.h 1.9 04/11/01 SMI"'"\n" @@ -3144,14 +3152,13 @@ fix = { files = iso/math_c99.h; c_fix = format; c_fix_arg = "#define\tisnormal(x) \\\n" - " __extension__ ({ __typeof(x) __x_n = (x); \\\n" - "\t\t if (__x_n < 0.0) __x_n = -__x_n; \\\n" + " __extension__ ({ const __typeof(x) __x_n = (x); \\\n" "\t\t __builtin_expect(isfinite(__x_n) \\\n" "\t\t\t\t && (sizeof(__x_n) == sizeof(float) \\\n" - "\t\t\t\t\t ? __x_n >= __FLT_MIN__ \\\n" + "\t\t\t\t\t ? isgreaterequal(__builtin_fabsf(__x_n),__FLT_MIN__) \\\n" "\t\t\t\t\t : sizeof(__x_n) == sizeof(long double) \\\n" - "\t\t\t\t\t ? __x_n >= __LDBL_MIN__ \\\n" - "\t\t\t\t\t : __x_n >= __DBL_MIN__), 1); })"; + "\t\t\t\t\t ? isgreaterequal(__builtin_fabsl(__x_n),__LDBL_MIN__) \\\n" + "\t\t\t\t\t : isgreaterequal(__builtin_fabs(__x_n),__DBL_MIN__)), 1); })"; c_fix_arg = "^#define[ \t]+isnormal\\(x\\)[ \t]+__builtin_isnormal\\(x\\)"; test_text = '#ident "@(#)math_c99.h 1.9 04/11/01 SMI"'"\n" diff --git a/fixincludes/tests/base/iso/math_c99.h b/fixincludes/tests/base/iso/math_c99.h index 86b6c20504f..bc2b653424d 100644 --- a/fixincludes/tests/base/iso/math_c99.h +++ b/fixincludes/tests/base/iso/math_c99.h @@ -38,7 +38,7 @@ #ident "@(#)math_c99.h 1.9 04/11/01 SMI" #undef fpclassify #define fpclassify(x) \ - __extension__ ({ __typeof(x) __x_fp = (x); \ + __extension__ ({ const __typeof(x) __x_fp = (x); \ isnan(__x_fp) \ ? FP_NAN \ : isinf(__x_fp) \ @@ -55,8 +55,12 @@ #ident "@(#)math_c99.h 1.9 04/11/01 SMI" #undef isfinite #define isfinite(x) \ - __extension__ ({ __typeof (x) __x_f = (x); \ - __builtin_expect(!isnan(__x_f - __x_f), 1); }) + __extension__ ({ const __typeof (x) __x_f = (x); \ + __builtin_expect(sizeof(__x_f) == sizeof(float) \ + ? islessequal(__builtin_fabsf(__x_f),__FLT_MAX__) \ + : sizeof(__x_f) == sizeof(long double) \ + ? islessequal(__builtin_fabsl(__x_f),__LDBL_MAX__) \ + : islessequal(__builtin_fabs(__x_f),__DBL_MAX__), 1); }) #endif /* SOLARIS_MATH_5_CHECK */ @@ -64,8 +68,12 @@ #ident "@(#)math_c99.h 1.9 04/11/01 SMI" #undef isinf #define isinf(x) \ - __extension__ ({ __typeof (x) __x_i = (x); \ - __builtin_expect(!isnan(__x_i) && !isfinite(__x_i), 0); }) + __extension__ ({ const __typeof (x) __x_i = (x); \ + __builtin_expect(sizeof(__x_i) == sizeof(float) \ + ? isgreater(__builtin_fabsf(__x_i),__FLT_MAX__) \ + : sizeof(__x_i) == sizeof(long double) \ + ? isgreater(__builtin_fabsl(__x_i),__LDBL_MAX__) \ + : isgreater(__builtin_fabs(__x_i),__DBL_MAX__), 0); }) #endif /* SOLARIS_MATH_6_CHECK */ @@ -73,14 +81,13 @@ #ident "@(#)math_c99.h 1.9 04/11/01 SMI" #undef isnormal #define isnormal(x) \ - __extension__ ({ __typeof(x) __x_n = (x); \ - if (__x_n < 0.0) __x_n = -__x_n; \ + __extension__ ({ const __typeof(x) __x_n = (x); \ __builtin_expect(isfinite(__x_n) \ && (sizeof(__x_n) == sizeof(float) \ - ? __x_n >= __FLT_MIN__ \ + ? isgreaterequal(__builtin_fabsf(__x_n),__FLT_MIN__) \ : sizeof(__x_n) == sizeof(long double) \ - ? __x_n >= __LDBL_MIN__ \ - : __x_n >= __DBL_MIN__), 1); }) + ? isgreaterequal(__builtin_fabsl(__x_n),__LDBL_MIN__) \ + : isgreaterequal(__builtin_fabs(__x_n),__DBL_MIN__)), 1); }) #endif /* SOLARIS_MATH_7_CHECK */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 72564be48eb..1cac0885304 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,12 @@ +2007-07-18 Kaveh R. Ghazi + + * gcc.dg/c99-math-double-1.c: Mark test variables as volatile. + Test negative numbers also. + * gcc.dg/c99-math-float-1.c: Likewise. + * gcc.dg/c99-math-long-double-1.c: Likewise. + * gcc.dg/c99-math.h: Check for FP exceptions. Update for negative + test inputs. + 2007-07-18 Bob Wilson * lib/target-supports.exp (check_effective_target_sync_int_long): diff --git a/gcc/testsuite/gcc.dg/c99-math-double-1.c b/gcc/testsuite/gcc.dg/c99-math-double-1.c index ef11d1ba317..6441a59fe1c 100644 --- a/gcc/testsuite/gcc.dg/c99-math-double-1.c +++ b/gcc/testsuite/gcc.dg/c99-math-double-1.c @@ -6,14 +6,17 @@ int main(void) { - double nan = NAN; - double inf = INFINITY; - double huge = HUGE_VAL; - double norm = __DBL_MIN__; - double sub = __DBL_MIN__ / 2; - double zero = 0.0; + volatile double nan = NAN; + volatile double inf = INFINITY; + volatile double huge = HUGE_VAL; + volatile double norm1 = __DBL_MIN__; + volatile double norm2 = 1; + volatile double norm3 = __DBL_MAX__; + volatile double sub = __DBL_MIN__ / 2; + volatile double zero = 0.0; - C99_MATH_TESTS (nan, inf, huge, norm, sub, zero) + C99_MATH_TESTS (nan, inf, huge, norm1, norm2, norm3, sub, zero, /*neg=*/0) + C99_MATH_TESTS (-nan, -inf, -huge, -norm1, -norm2, -norm3, -sub, -zero, /*neg=*/1) return 0; } diff --git a/gcc/testsuite/gcc.dg/c99-math-float-1.c b/gcc/testsuite/gcc.dg/c99-math-float-1.c index f377c1af5b8..36a73960266 100644 --- a/gcc/testsuite/gcc.dg/c99-math-float-1.c +++ b/gcc/testsuite/gcc.dg/c99-math-float-1.c @@ -6,14 +6,17 @@ int main(void) { - float nan = NAN; - float inf = INFINITY; - float huge = HUGE_VALF; - float norm = __FLT_MIN__; - float sub = __FLT_MIN__ / 2; - float zero = 0.0f; + volatile float nan = NAN; + volatile float inf = INFINITY; + volatile float huge = HUGE_VALF; + volatile float norm1 = __FLT_MIN__; + volatile float norm2 = 1; + volatile float norm3 = __FLT_MAX__; + volatile float sub = __FLT_MIN__ / 2; + volatile float zero = 0.0f; - C99_MATH_TESTS (nan, inf, huge, norm, sub, zero) + C99_MATH_TESTS (nan, inf, huge, norm1, norm2, norm3, sub, zero, /*neg=*/0) + C99_MATH_TESTS (-nan, -inf, -huge, -norm1, -norm2, -norm3, -sub, -zero, /*neg=*/1) return 0; } diff --git a/gcc/testsuite/gcc.dg/c99-math-long-double-1.c b/gcc/testsuite/gcc.dg/c99-math-long-double-1.c index 5f1cd3097d3..d8146c28a5a 100644 --- a/gcc/testsuite/gcc.dg/c99-math-long-double-1.c +++ b/gcc/testsuite/gcc.dg/c99-math-long-double-1.c @@ -6,14 +6,17 @@ int main(void) { - long double nan = NAN; - long double inf = INFINITY; - long double huge = HUGE_VALL; - long double norm = __LDBL_MIN__; - long double sub = __LDBL_MIN__ / 2; - long double zero = 0.0l; + volatile long double nan = NAN; + volatile long double inf = INFINITY; + volatile long double huge = HUGE_VALL; + volatile long double norm1 = __LDBL_MIN__; + volatile long double norm2 = 1; + volatile long double norm3 = __LDBL_MAX__; + volatile long double sub = __LDBL_MIN__ / 2; + volatile long double zero = 0.0l; - C99_MATH_TESTS (nan, inf, huge, norm, sub, zero) + C99_MATH_TESTS (nan, inf, huge, norm1, norm2, norm3, sub, zero, /*neg=*/0) + C99_MATH_TESTS (-nan, -inf, -huge, -norm1, -norm2, -norm3, -sub, -zero, /*neg=*/1) return 0; } diff --git a/gcc/testsuite/gcc.dg/c99-math.h b/gcc/testsuite/gcc.dg/c99-math.h index aff81b319ca..81f2e6ddb43 100644 --- a/gcc/testsuite/gcc.dg/c99-math.h +++ b/gcc/testsuite/gcc.dg/c99-math.h @@ -1,9 +1,14 @@ #include +#include extern void abort(void); -#define C99_MATH_TESTS(nan, inf, huge, norm, sub, zero) \ +#define C99_MATH_TESTS(nan, inf, huge, norm1, norm2, norm3, sub, zero, neg) \ { \ + if (feclearexcept (FE_ALL_EXCEPT) != 0) \ + abort(); \ + \ + \ if (fpclassify (nan) != FP_NAN) \ abort (); \ \ @@ -13,7 +18,13 @@ extern void abort(void); if (fpclassify (huge) != FP_INFINITE) \ abort (); \ \ - if (fpclassify (norm) != FP_NORMAL) \ + if (fpclassify (norm1) != FP_NORMAL) \ + abort (); \ + \ + if (fpclassify (norm2) != FP_NORMAL) \ + abort (); \ + \ + if (fpclassify (norm3) != FP_NORMAL) \ abort (); \ \ if (fpclassify (sub) != FP_SUBNORMAL) \ @@ -32,7 +43,13 @@ extern void abort(void); if (isnan (huge)) \ abort (); \ \ - if (isnan (norm)) \ + if (isnan (norm1)) \ + abort (); \ + \ + if (isnan (norm2)) \ + abort (); \ + \ + if (isnan (norm3)) \ abort (); \ \ if (isnan (sub)) \ @@ -51,7 +68,13 @@ extern void abort(void); if (!isinf (huge)) \ abort (); \ \ - if (isinf (norm)) \ + if (isinf (norm1)) \ + abort (); \ + \ + if (isinf (norm2)) \ + abort (); \ + \ + if (isinf (norm3)) \ abort (); \ \ if (isinf (sub)) \ @@ -70,7 +93,13 @@ extern void abort(void); if (isfinite (huge)) \ abort (); \ \ - if (!isfinite (norm)) \ + if (!isfinite (norm1)) \ + abort (); \ + \ + if (!isfinite (norm2)) \ + abort (); \ + \ + if (!isfinite (norm3)) \ abort (); \ \ if (!isfinite (sub)) \ @@ -89,7 +118,13 @@ extern void abort(void); if (isnormal (huge)) \ abort (); \ \ - if (!isnormal (norm)) \ + if (!isnormal (norm1)) \ + abort (); \ + \ + if (!isnormal (norm2)) \ + abort (); \ + \ + if (!isnormal (norm3)) \ abort (); \ \ if (isnormal (sub)) \ @@ -99,28 +134,103 @@ extern void abort(void); abort (); \ \ \ - if (signbit (norm)) \ + if (!!signbit (nan) != neg) \ abort (); \ \ - if (!signbit (-(norm))) \ + if (!!signbit (inf) != neg) \ + abort (); \ + \ + if (!!signbit (huge) != neg) \ + abort (); \ + \ + if (!!signbit (norm1) != neg) \ + abort (); \ + \ + if (!!signbit (norm2) != neg) \ + abort (); \ + \ + if (!!signbit (norm3) != neg) \ + abort (); \ + \ + if (!!signbit (sub) != neg) \ + abort (); \ + \ + if (!!signbit (zero) != neg) \ abort (); \ \ \ - if (!isgreater ((inf), (norm))) \ + if (neg) \ + { \ + if (!isless ((inf), (norm1))) \ + abort (); \ + \ + if (!isless ((inf), (norm2))) \ + abort (); \ + \ + if (!isless ((inf), (norm3))) \ + abort (); \ + \ + if (!islessequal ((inf), (huge))) \ + abort (); \ + \ + if (!isgreater ((norm1), (inf))) \ + abort (); \ + \ + if (!isgreater ((norm2), (inf))) \ + abort (); \ + \ + if (!isgreater ((norm3), (inf))) \ + abort (); \ + \ + if (!isgreaterequal ((huge), (inf))) \ + abort (); \ + } \ + else \ + { \ + if (!isgreater ((inf), (norm1))) \ + abort (); \ + \ + if (!isgreater ((inf), (norm2))) \ + abort (); \ + \ + if (!isgreater ((inf), (norm3))) \ + abort (); \ + \ + if (!isgreaterequal ((inf), (huge))) \ + abort (); \ + \ + if (!isless ((norm1), (inf))) \ + abort (); \ + \ + if (!isless ((norm2), (inf))) \ + abort (); \ + \ + if (!isless ((norm3), (inf))) \ + abort (); \ + \ + if (!islessequal ((huge), (inf))) \ + abort (); \ + } \ + \ + if (!islessgreater ((inf), (norm1))) \ abort (); \ \ - if (!isgreaterequal ((inf), (huge))) \ + if (!islessgreater ((inf), (norm2))) \ abort (); \ \ - if (!isless ((norm), (inf))) \ + if (!islessgreater ((inf), (norm3))) \ abort (); \ \ - if (!islessequal ((huge), (inf))) \ + if (!isunordered ((nan), (norm1))) \ abort (); \ \ - if (!islessgreater ((inf), (norm))) \ + if (!isunordered ((nan), (norm2))) \ abort (); \ \ - if (!isunordered ((nan), (norm))) \ + if (!isunordered ((nan), (norm3))) \ abort (); \ + \ + \ + if (fetestexcept (FE_ALL_EXCEPT) != 0) \ + abort(); \ }