diff options
-rw-r--r-- | ChangeLog | 14 | ||||
-rw-r--r-- | NEWS | 2 | ||||
-rw-r--r-- | math/libm-test.inc | 5 | ||||
-rw-r--r-- | math/s_nextafter.c | 6 | ||||
-rw-r--r-- | sysdeps/i386/fpu/s_nextafterl.c | 5 | ||||
-rw-r--r-- | sysdeps/ieee754/flt-32/s_nextafterf.c | 6 | ||||
-rw-r--r-- | sysdeps/ieee754/ldbl-128/s_nextafterl.c | 5 | ||||
-rw-r--r-- | sysdeps/ieee754/ldbl-128ibm/s_nextafterl.c | 14 | ||||
-rw-r--r-- | sysdeps/m68k/m680x0/fpu/s_nextafterl.c | 5 |
9 files changed, 42 insertions, 20 deletions
@@ -1,3 +1,17 @@ +2014-03-11 Joseph Myers <joseph@codesourcery.com> + + [BZ #16677] + * math/s_nextafter.c (__nextafter): Do not return value from + overflowing computation. + * sysdeps/i386/fpu/s_nextafterl.c (__nextafterl): Likewise. + * sysdeps/ieee754/flt-32/s_nextafterf.c (__nextafterf): Likewise. + * sysdeps/ieee754/ldbl-128/s_nextafterl.c (__nextafterl): + Likewise. + * sysdeps/ieee754/ldbl-128ibm/s_nextafterl.c (__nextafterl): + Likewise. + * sysdeps/m68k/m680x0/fpu/s_nextafterl.c (__nextafterl): Likewise. + * math/libm-test.inc (nextafter_test): Use ALL_RM_TEST. + 2014-03-11 Roland McGrath <roland@hack.frob.com> * sysdeps/arm/setjmp.S: Use sfi_breg on stores of mangled registers. @@ -10,7 +10,7 @@ Version 2.20 * The following bugs are resolved with this release: 15347, 15804, 15894, 16447, 16532, 16545, 16574, 16600, 16609, 16610, - 16611, 16613, 16623, 16632, 16639, 16670, 16674, 16683. + 16611, 16613, 16623, 16632, 16639, 16670, 16674, 16677, 16683. * The am33 port, which had not worked for several years, has been removed from ports. diff --git a/math/libm-test.inc b/math/libm-test.inc index 0fe0f69..574654e 100644 --- a/math/libm-test.inc +++ b/math/libm-test.inc @@ -9553,10 +9553,7 @@ static const struct test_ff_f_data nextafter_test_data[] = static void nextafter_test (void) { - - START (nextafter, 1); - RUN_TEST_LOOP_ff_f (nextafter, nextafter_test_data, ); - END; + ALL_RM_TEST (nextafter, 1, nextafter_test_data, RUN_TEST_LOOP_ff_f, END); } diff --git a/math/s_nextafter.c b/math/s_nextafter.c index 7b026f0..28962e5 100644 --- a/math/s_nextafter.c +++ b/math/s_nextafter.c @@ -70,10 +70,8 @@ double __nextafter(double x, double y) } hy = hx&0x7ff00000; if(hy>=0x7ff00000) { - x = x+x; /* overflow */ - if (FLT_EVAL_METHOD != 0 && FLT_EVAL_METHOD != 1) - asm ("" : "+m"(x)); - return x; /* overflow */ + double u = x+x; /* overflow */ + math_force_eval (u); } if(hy<0x00100000) { double u = x*x; /* underflow */ diff --git a/sysdeps/i386/fpu/s_nextafterl.c b/sysdeps/i386/fpu/s_nextafterl.c index bafe743..66d903f 100644 --- a/sysdeps/i386/fpu/s_nextafterl.c +++ b/sysdeps/i386/fpu/s_nextafterl.c @@ -106,7 +106,10 @@ long double __nextafterl(long double x, long double y) } } esy = esx&0x7fff; - if(esy==0x7fff) return x+x; /* overflow */ + if(esy==0x7fff) { + long double u = x + x; /* overflow */ + math_force_eval (u); + } if(esy==0) { long double u = x*x; /* underflow */ math_force_eval (u); /* raise underflow flag */ diff --git a/sysdeps/ieee754/flt-32/s_nextafterf.c b/sysdeps/ieee754/flt-32/s_nextafterf.c index b0de3d9..22e0b3d 100644 --- a/sysdeps/ieee754/flt-32/s_nextafterf.c +++ b/sysdeps/ieee754/flt-32/s_nextafterf.c @@ -57,10 +57,8 @@ float __nextafterf(float x, float y) } hy = hx&0x7f800000; if(hy>=0x7f800000) { - x = x+x; /* overflow */ - if (FLT_EVAL_METHOD != 0) - asm ("" : "+m"(x)); - return x; /* overflow */ + float u = x+x; /* overflow */ + math_force_eval (u); } if(hy<0x00800000) { float u = x*x; /* underflow */ diff --git a/sysdeps/ieee754/ldbl-128/s_nextafterl.c b/sysdeps/ieee754/ldbl-128/s_nextafterl.c index e345bc8..d5eaa1c 100644 --- a/sysdeps/ieee754/ldbl-128/s_nextafterl.c +++ b/sysdeps/ieee754/ldbl-128/s_nextafterl.c @@ -67,7 +67,10 @@ long double __nextafterl(long double x, long double y) } } hy = hx&0x7fff000000000000LL; - if(hy==0x7fff000000000000LL) return x+x;/* overflow */ + if(hy==0x7fff000000000000LL) { + long double u = x + x; /* overflow */ + math_force_eval (u); + } if(hy==0) { long double u = x*x; /* underflow */ math_force_eval (u); /* raise underflow flag */ diff --git a/sysdeps/ieee754/ldbl-128ibm/s_nextafterl.c b/sysdeps/ieee754/ldbl-128ibm/s_nextafterl.c index c050944..30b1540 100644 --- a/sysdeps/ieee754/ldbl-128ibm/s_nextafterl.c +++ b/sysdeps/ieee754/ldbl-128ibm/s_nextafterl.c @@ -66,8 +66,11 @@ long double __nextafterl(long double x, long double y) long double with a 106 bit mantissa, and nextafterl is insane with variable precision. So to make nextafterl sane we assume 106 bit precision. */ - if((hx==0xffefffffffffffffLL)&&(lx==0xfc8ffffffffffffeLL)) - return x+x; /* overflow, return -inf */ + if((hx==0xffefffffffffffffLL)&&(lx==0xfc8ffffffffffffeLL)) { + u = x+x; /* overflow, return -inf */ + math_force_eval (u); + return y; + } if (hx >= 0x7ff0000000000000LL) { u = 0x1.fffffffffffff7ffffffffffff8p+1023L; return u; @@ -93,8 +96,11 @@ long double __nextafterl(long double x, long double y) } return x - u; } else { /* x < y, x += ulp */ - if((hx==0x7fefffffffffffffLL)&&(lx==0x7c8ffffffffffffeLL)) - return x+x; /* overflow, return +inf */ + if((hx==0x7fefffffffffffffLL)&&(lx==0x7c8ffffffffffffeLL)) { + u = x+x; /* overflow, return +inf */ + math_force_eval (u); + return y; + } if ((uint64_t) hx >= 0xfff0000000000000ULL) { u = -0x1.fffffffffffff7ffffffffffff8p+1023L; return u; diff --git a/sysdeps/m68k/m680x0/fpu/s_nextafterl.c b/sysdeps/m68k/m680x0/fpu/s_nextafterl.c index 03c136b..ad77ca4 100644 --- a/sysdeps/m68k/m680x0/fpu/s_nextafterl.c +++ b/sysdeps/m68k/m680x0/fpu/s_nextafterl.c @@ -89,7 +89,10 @@ long double __nextafterl(long double x, long double y) } } esy = esx&0x7fff; - if(esy==0x7fff) return x+x; /* overflow */ + if(esy==0x7fff) { + long double u = x + x; /* overflow */ + math_force_eval (u); + } if(esy==0 && (hx & 0x80000000) == 0) { /* underflow */ y = x*x; math_force_eval (y); /* raise underflow flag */ |