re PR target/32641 (C99 fpclassify, isinf, isfinite, isnormal may raise FP exceptions)

fixincludes:
	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.

gcc/testsuite:
	* 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.

From-SVN: r126730
This commit is contained in:
Kaveh R. Ghazi 2007-07-18 20:22:32 +00:00 committed by Kaveh Ghazi
parent 2a48b790b2
commit dadda6caba
9 changed files with 226 additions and 67 deletions

View file

@ -1,3 +1,13 @@
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

View file

@ -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 };

View file

@ -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"

View file

@ -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 */

View file

@ -1,3 +1,12 @@
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):

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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;
}

View file

@ -1,9 +1,14 @@
#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 (); \
\
@ -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(); \
}