From 6c4de23c638fe836eff0abacc284ff76f95ffa89 Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Fri, 3 Jan 2014 15:54:24 +0000 Subject: [PATCH] ibm-ldouble.c (__gcc_qdiv): Scale up arguments in case of small numerator and finite nonzero result. libgcc: * config/rs6000/ibm-ldouble.c (__gcc_qdiv): Scale up arguments in case of small numerator and finite nonzero result. gcc/testsuite: * gcc.target/powerpc/rs6000-ldouble-3.c: New test. From-SVN: r206321 --- gcc/testsuite/ChangeLog | 4 ++++ .../gcc.target/powerpc/rs6000-ldouble-3.c | 21 +++++++++++++++++++ libgcc/ChangeLog | 5 +++++ libgcc/config/rs6000/ibm-ldouble.c | 11 +++++++++- 4 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.target/powerpc/rs6000-ldouble-3.c diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7a33757aeff6..2f73fb97b5f5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2014-01-03 Joseph Myers + + * gcc.target/powerpc/rs6000-ldouble-3.c: New test. + 2013-12-12 Uros Bizjak Backport from mainline diff --git a/gcc/testsuite/gcc.target/powerpc/rs6000-ldouble-3.c b/gcc/testsuite/gcc.target/powerpc/rs6000-ldouble-3.c new file mode 100644 index 000000000000..1c78052e6d74 --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/rs6000-ldouble-3.c @@ -0,0 +1,21 @@ +/* Test accuracy of long double division (glibc bug 15396). */ +/* { dg-do run { target powerpc*-*-linux* powerpc*-*-darwin* powerpc*-*-aix* rs6000-*-* } } */ +/* { dg-options "-mlong-double-128" } */ + +extern void exit (int); +extern void abort (void); + +volatile long double a = 0x1p-1024L; +volatile long double b = 0x3p-53L; +volatile long double r; +volatile long double expected = 0x1.55555555555555555555555555p-973L; + +int +main (void) +{ + r = a / b; + /* Allow error up to 2ulp. */ + if (__builtin_fabsl (r - expected) > 0x1p-1073L) + abort (); + exit (0); +} diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog index 53f32383f63d..40fe9fe3821b 100644 --- a/libgcc/ChangeLog +++ b/libgcc/ChangeLog @@ -1,3 +1,8 @@ +2014-01-03 Joseph Myers + + * config/rs6000/ibm-ldouble.c (__gcc_qdiv): Scale up arguments in + case of small numerator and finite nonzero result. + 2013-11-10 Kai Tietz Back-merged from trunk diff --git a/libgcc/config/rs6000/ibm-ldouble.c b/libgcc/config/rs6000/ibm-ldouble.c index b0b8037cdcec..658ca9adea79 100644 --- a/libgcc/config/rs6000/ibm-ldouble.c +++ b/libgcc/config/rs6000/ibm-ldouble.c @@ -189,7 +189,16 @@ __gcc_qdiv (double a, double b, double c, double d) || nonfinite (t)) return t; - /* Finite nonzero result requires corrections to the highest order term. */ + /* Finite nonzero result requires corrections to the highest order + term. These corrections require the low part of c * t to be + exactly represented in double. */ + if (fabs (a) <= 0x1p-969) + { + a *= 0x1p106; + b *= 0x1p106; + c *= 0x1p106; + d *= 0x1p106; + } s = c * t; /* (s,sigma) = c*t exactly. */ w = -(-b + d * t); /* Written to get fnmsub for speed, but not -- 2.47.2