diff options
author | Kaveh R. Ghazi <ghazi@caip.rutgers.edu> | 2007-07-18 17:30:38 +0000 |
---|---|---|
committer | Kaveh Ghazi <ghazi@gcc.gnu.org> | 2007-07-18 17:30:38 +0000 |
commit | 7faa1bbb5d0206cc83f20c1145f612f7754fdcf3 (patch) | |
tree | eb2db58c64bbaba8f0181d8d24ef99a386911de5 /gcc/testsuite | |
parent | b5d32c25372d1e0604bbd8471d735e46215dbe03 (diff) | |
download | gcc-7faa1bbb5d0206cc83f20c1145f612f7754fdcf3.zip gcc-7faa1bbb5d0206cc83f20c1145f612f7754fdcf3.tar.gz gcc-7faa1bbb5d0206cc83f20c1145f612f7754fdcf3.tar.bz2 |
re PR target/30652 (SSE expansion is missing for isinf() and other fpclassify functions)
PR target/30652
PR middle-end/20558
* builtins.c (expand_builtin_interclass_mathfn): Provide a
generic fallback for isinf.
* c-cppbuiltin.c (builtin_define_float_constants): Move FP max
calculation code ...
* real.c (get_max_float): ... to here.
* real.h (get_max_float): New.
testsuite:
* gcc.dg/pr28796-1.c: Add more cases.
* gcc.dg/pr28796-2.c: Likewise.
From-SVN: r126724
Diffstat (limited to 'gcc/testsuite')
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr28796-1.c | 31 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr28796-2.c | 72 |
3 files changed, 102 insertions, 6 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e1a8f1f..1c48519 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-07-18 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> + + * gcc.dg/pr28796-1.c: Add more cases. + * gcc.dg/pr28796-2.c: Likewise. + 2007-07-17 Janus Weil <jaydub66@gmail.com> PR fortran/32535 diff --git a/gcc/testsuite/gcc.dg/pr28796-1.c b/gcc/testsuite/gcc.dg/pr28796-1.c index a762bec..d200b1a 100644 --- a/gcc/testsuite/gcc.dg/pr28796-1.c +++ b/gcc/testsuite/gcc.dg/pr28796-1.c @@ -1,17 +1,48 @@ /* { dg-do link } */ /* { dg-options "-ffinite-math-only" } */ +extern void link_error(void); + float f; +double d; +long double ld; int main() { if (__builtin_isunordered (f, f) != 0) link_error (); + if (__builtin_isunordered (d, d) != 0) + link_error (); + if (__builtin_isunordered (ld, ld) != 0) + link_error (); + if (__builtin_isnan (f) != 0) link_error (); + if (__builtin_isnan (d) != 0) + link_error (); + if (__builtin_isnan (ld) != 0) + link_error (); + if (__builtin_isnanf (f) != 0) + link_error (); + if (__builtin_isnanl (ld) != 0) + link_error (); + if (__builtin_finite (f) != 1) link_error (); + if (__builtin_finite (d) != 1) + link_error (); + if (__builtin_finite (ld) != 1) + link_error (); + if (__builtin_finitef (f) != 1) + link_error (); + if (__builtin_finitel (ld) != 1) + link_error (); + if (f != f) link_error (); + if (d != d) + link_error (); + if (ld != ld) + link_error (); return 0; } diff --git a/gcc/testsuite/gcc.dg/pr28796-2.c b/gcc/testsuite/gcc.dg/pr28796-2.c index f76bfed..2545484 100644 --- a/gcc/testsuite/gcc.dg/pr28796-2.c +++ b/gcc/testsuite/gcc.dg/pr28796-2.c @@ -4,19 +4,79 @@ extern void abort (void); -void foo(float f) +void __attribute__ ((__noinline__)) +foo_1 (float f, double d, long double ld, + int res_unord, int res_isnan, int res_isinf, int res_isfin) { - if (__builtin_isunordered (f, f) != 1) + if (__builtin_isunordered (f, 0) != res_unord) abort (); - if (__builtin_isnan (f) != 1) + if (__builtin_isunordered (0, f) != res_unord) abort (); - if (__builtin_finite (f) != 0) + if (__builtin_isunordered (d, 0) != res_unord) + abort (); + if (__builtin_isunordered (0, d) != res_unord) + abort (); + if (__builtin_isunordered (ld, 0) != res_unord) + abort (); + if (__builtin_isunordered (0, ld) != res_unord) + abort (); + + if (__builtin_isnan (f) != res_isnan) + abort (); + if (__builtin_isnan (d) != res_isnan) + abort (); + if (__builtin_isnan (ld) != res_isnan) + abort (); + if (__builtin_isnanf (f) != res_isnan) + abort (); + if (__builtin_isnanl (ld) != res_isnan) + abort (); + + if (__builtin_isinf (f) != res_isinf) + abort (); + if (__builtin_isinf (d) != res_isinf) + abort (); + if (__builtin_isinf (ld) != res_isinf) + abort (); + if (__builtin_isinff (f) != res_isinf) + abort (); + if (__builtin_isinfl (ld) != res_isinf) + abort (); + + if (__builtin_finite (f) != res_isfin) + abort (); + if (__builtin_finite (d) != res_isfin) abort (); } +void __attribute__ ((__noinline__)) +foo (float f, double d, long double ld, + int res_unord, int res_isnan, int res_isinf, int res_isfin) +{ + foo_1 (f, d, ld, res_unord, res_isnan, res_isinf, res_isfin); + foo_1 (-f, -d, -ld, res_unord, res_isnan, res_isinf, res_isfin); +} + int main() { - float f = __builtin_nanf(""); - foo(f); + float f; + double d; + long double ld; + + f = __builtin_nanf(""); d = __builtin_nan(""); ld = __builtin_nanl(""); + foo(f, d, ld, /*unord=*/ 1, /*isnan=*/ 1, /*isinf=*/ 0, /*isfin=*/ 0); + + f = __builtin_inff(); d = __builtin_inf(); ld = __builtin_infl(); + foo(f, d, ld, /*unord=*/ 0, /*isnan=*/ 0, /*isinf=*/ 1, /*isfin=*/ 0); + + f = 0; d = 0; ld = 0; + foo(f, d, ld, /*unord=*/ 0, /*isnan=*/ 0, /*isinf=*/ 0, /*isfin=*/ 1); + + f = __FLT_MIN__; d = __DBL_MIN__; ld = __LDBL_MIN__; + foo(f, d, ld, /*unord=*/ 0, /*isnan=*/ 0, /*isinf=*/ 0, /*isfin=*/ 1); + + f = __FLT_MAX__; d = __DBL_MAX__; ld = __LDBL_MAX__; + foo(f, d, ld, /*unord=*/ 0, /*isnan=*/ 0, /*isinf=*/ 0, /*isfin=*/ 1); + return 0; } |