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
This commit is contained in:
Joseph Myers 2014-01-03 15:54:24 +00:00 committed by Joseph Myers
parent 0bdc467cc8
commit 6c4de23c63
4 changed files with 40 additions and 1 deletions

View File

@ -1,3 +1,7 @@
2014-01-03 Joseph Myers <joseph@codesourcery.com>
* gcc.target/powerpc/rs6000-ldouble-3.c: New test.
2013-12-12 Uros Bizjak <ubizjak@gmail.com>
Backport from mainline

View File

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

View File

@ -1,3 +1,8 @@
2014-01-03 Joseph Myers <joseph@codesourcery.com>
* config/rs6000/ibm-ldouble.c (__gcc_qdiv): Scale up arguments in
case of small numerator and finite nonzero result.
2013-11-10 Kai Tietz <ktietz@redhat.com>
Back-merged from trunk

View File

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