From 4a6c754b7a63dc27eda74622783b059029f85eb3 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Fri, 3 Feb 2006 11:44:08 +0000 Subject: [PATCH] re PR target/25960 (__gcc_qadd doesn't handle -0.0L properly) PR target/25960 gcc/ * config/rs6000/darwin-ldouble.c (__gcc_qadd): Preserve -0.0 result. gcc/testsuite/ * gcc.target/powerpc/pr25960.c: New test. From-SVN: r110540 --- gcc/ChangeLog | 6 ++++++ gcc/config/rs6000/darwin-ldouble.c | 6 +++++- gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gcc.target/powerpc/pr25960.c | 17 +++++++++++++++++ 4 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.target/powerpc/pr25960.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2a8be97e735..53e6953270c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2006-02-03 Alan Modra + + PR target/25960 + * config/rs6000/darwin-ldouble.c (__gcc_qadd): Preserve -0.0 result. + 2006-02-03 Andreas Krebbel Ulrich Weigand @@ -1544,6 +1549,7 @@ 2006-01-20 Alan Modra + PR target/25668 * libgcc2.c (__floatdisf, __floatdidf): Don't use IBM Extended Double TFmode. (__floatundisf, __floatundidf): Likewise. diff --git a/gcc/config/rs6000/darwin-ldouble.c b/gcc/config/rs6000/darwin-ldouble.c index 11df6494f74..08ff351d52c 100644 --- a/gcc/config/rs6000/darwin-ldouble.c +++ b/gcc/config/rs6000/darwin-ldouble.c @@ -117,8 +117,12 @@ __gcc_qadd (double a, double aa, double c, double cc) { q = a - z; zz = q + c + (a - (q + z)) + aa + cc; - xh = z + zz; + /* Keep -0 result. */ + if (zz == 0.0) + return z; + + xh = z + zz; if (nonfinite (xh)) return xh; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 217aad8e806..c4d45285865 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2006-02-03 Alan Modra + + * gcc.target/powerpc/pr25960.c: New test. + 2006-02-02 Steven G. Kargl PR fortran/24958 diff --git a/gcc/testsuite/gcc.target/powerpc/pr25960.c b/gcc/testsuite/gcc.target/powerpc/pr25960.c new file mode 100644 index 00000000000..9ab9a10a1a4 --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/pr25960.c @@ -0,0 +1,17 @@ +/* { dg-do run { target { powerpc*-*-darwin* powerpc*-*-aix* rs6000-*-* powerpc*-*-linux* } } } */ +/* { dg-options "-O2 -mlong-double-128" } */ + +extern void abort (void); + +volatile long double l, m, n; + +int +main (void) +{ + l = __builtin_copysignl (0.0L, -1.0L); + m = __builtin_copysignl (0.0L, -1.0L); + n = l + m; + if (__builtin_copysignl (1.0L, n) >= 0.0L) + abort (); + return 0; +} -- 2.30.2