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