diff options
Diffstat (limited to 'sysdeps/ieee754')
-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 |
3 files changed, 16 insertions, 9 deletions
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; |