+2007-07-18 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ 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 <ro@TechFak.Uni-Bielefeld.DE>
PR libgcj/28190
*
* 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.
*
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\
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 };
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 };
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 };
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"
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"
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"
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"
#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) \
#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 */
#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 */
#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 */
+2007-07-18 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * 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 <bob.wilson@acm.org>
* lib/target-supports.exp (check_effective_target_sync_int_long):
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;
}
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;
}
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;
}
#include <math.h>
+#include <fenv.h>
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 (); \
\
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) \
if (isnan (huge)) \
abort (); \
\
- if (isnan (norm)) \
+ if (isnan (norm1)) \
+ abort (); \
+ \
+ if (isnan (norm2)) \
+ abort (); \
+ \
+ if (isnan (norm3)) \
abort (); \
\
if (isnan (sub)) \
if (!isinf (huge)) \
abort (); \
\
- if (isinf (norm)) \
+ if (isinf (norm1)) \
+ abort (); \
+ \
+ if (isinf (norm2)) \
+ abort (); \
+ \
+ if (isinf (norm3)) \
abort (); \
\
if (isinf (sub)) \
if (isfinite (huge)) \
abort (); \
\
- if (!isfinite (norm)) \
+ if (!isfinite (norm1)) \
+ abort (); \
+ \
+ if (!isfinite (norm2)) \
+ abort (); \
+ \
+ if (!isfinite (norm3)) \
abort (); \
\
if (!isfinite (sub)) \
if (isnormal (huge)) \
abort (); \
\
- if (!isnormal (norm)) \
+ if (!isnormal (norm1)) \
+ abort (); \
+ \
+ if (!isnormal (norm2)) \
+ abort (); \
+ \
+ if (!isnormal (norm3)) \
abort (); \
\
if (isnormal (sub)) \
abort (); \
\
\
- if (signbit (norm)) \
+ if (!!signbit (nan) != neg) \
abort (); \
\
- if (!signbit (-(norm))) \
+ if (!!signbit (inf) != neg) \
abort (); \
\
+ if (!!signbit (huge) != neg) \
+ abort (); \
\
- if (!isgreater ((inf), (norm))) \
+ if (!!signbit (norm1) != neg) \
abort (); \
\
- if (!isgreaterequal ((inf), (huge))) \
+ if (!!signbit (norm2) != neg) \
abort (); \
\
- if (!isless ((norm), (inf))) \
+ if (!!signbit (norm3) != neg) \
abort (); \
\
- if (!islessequal ((huge), (inf))) \
+ if (!!signbit (sub) != neg) \
abort (); \
\
- if (!islessgreater ((inf), (norm))) \
+ if (!!signbit (zero) != neg) \
abort (); \
\
- if (!isunordered ((nan), (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 (!islessgreater ((inf), (norm2))) \
+ abort (); \
+ \
+ if (!islessgreater ((inf), (norm3))) \
+ abort (); \
+ \
+ if (!isunordered ((nan), (norm1))) \
+ abort (); \
+ \
+ if (!isunordered ((nan), (norm2))) \
+ abort (); \
+ \
+ if (!isunordered ((nan), (norm3))) \
+ abort (); \
+ \
+ \
+ if (fetestexcept (FE_ALL_EXCEPT) != 0) \
+ abort(); \
}