From: Claudiu Zissulescu Date: Fri, 29 Apr 2016 10:49:26 +0000 (+0200) Subject: [ARC] Handle FPX NaN within optimized floating point library. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=39d504645250d0d367247807e23edf5f74252b6e;p=gcc.git [ARC] Handle FPX NaN within optimized floating point library. gcc/ 2016-04-29 Claudiu Zissulescu * testsuite/gcc.target/arc/ieee_eq.c: New test. libgcc/ 2016-04-29 Claudiu Zissulescu * config/arc/ieee-754/eqdf2.S: Handle FPX NaN. From-SVN: r235633 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e79318d1045..d3fde07a4bd 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +2016-04-29 Claudiu Zissulescu + + * testsuite/gcc.target/arc/ieee_eq.c: New test. + 2016-04-29 Oleg Endo * common/config/sh/sh-common.c (sh_option_optimization_table): Remove diff --git a/gcc/testsuite/gcc.target/arc/ieee_eq.c b/gcc/testsuite/gcc.target/arc/ieee_eq.c new file mode 100644 index 00000000000..70aebad063b --- /dev/null +++ b/gcc/testsuite/gcc.target/arc/ieee_eq.c @@ -0,0 +1,47 @@ +/* { dg-do run } */ +/* { dg-options "-O2" } */ + +#include +#include + +#define TEST_EQ(TYPE,X,Y,RES) \ + do { \ + volatile TYPE a, b; \ + a = (TYPE) X; \ + b = (TYPE) Y; \ + if ((a == b) != RES) \ + { \ + printf ("Runtime computation error @%d. %g " \ + "!= %g\n", __LINE__, a, b); \ + error = 1; \ + } \ + } while (0) + +#ifndef __HS__ +/* Special type of NaN found when using double FPX instructions. */ +static const unsigned long long __nan = 0x7FF0000080000000ULL; +# define W (*(double *) &__nan) +#else +# define W __builtin_nan ("") +#endif + +#define Q __builtin_nan ("") +#define H __builtin_inf () + +int main (void) +{ + int error = 0; + + TEST_EQ (double, 1, 1, 1); + TEST_EQ (double, 1, 2, 0); + TEST_EQ (double, W, W, 0); + TEST_EQ (double, Q, Q, 0); + TEST_EQ (double, __DBL_MAX__, __DBL_MAX__, 1); + TEST_EQ (double, __DBL_MIN__, __DBL_MIN__, 1); + TEST_EQ (double, H, H, 1); + + if (error) + __builtin_abort (); + + return 0; +} diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog index 598c1a09a61..df51a6e0d33 100644 --- a/libgcc/ChangeLog +++ b/libgcc/ChangeLog @@ -1,3 +1,7 @@ +2016-04-29 Claudiu Zissulescu + + * config/arc/ieee-754/eqdf2.S: Handle FPX NaN. + 2016-04-28 Claudiu Zissulescu Joern Rennecke diff --git a/libgcc/config/arc/ieee-754/eqdf2.S b/libgcc/config/arc/ieee-754/eqdf2.S index bc7d88e838d..7e80ef52b2a 100644 --- a/libgcc/config/arc/ieee-754/eqdf2.S +++ b/libgcc/config/arc/ieee-754/eqdf2.S @@ -58,11 +58,16 @@ __eqdf2: well predictable (as seen from the branch predictor). */ __eqdf2: brne.d DBL0H,DBL1H,.Lhighdiff - bmsk r12,DBL0H,20 -#ifdef DPFP_COMPAT - or.f 0,DBL0L,DBL1L - bset.ne r12,r12,21 -#endif /* DPFP_COMPAT */ +#ifndef __HS__ + /* The next two instructions are required to recognize the FPX + NaN, which has a pattern like this: 0x7ff0_0000_8000_0000, as + oposite to 0x7ff8_0000_0000_0000. */ + or.f 0,DBL0L,DBL1L + mov_s r12,0x00200000 + bset.ne r12,r12,0 +#else + bmsk r12,DBL0H,20 +#endif /* __HS__ */ add1.f r12,r12,DBL0H /* set c iff NaN; also, clear z if NaN. */ j_s.d [blink] cmp.cc DBL0L,DBL1L