diff options
Diffstat (limited to 'math/s_nexttowardf.c')
-rw-r--r-- | math/s_nexttowardf.c | 21 |
1 files changed, 11 insertions, 10 deletions
diff --git a/math/s_nexttowardf.c b/math/s_nexttowardf.c index 0494d1a..1a10266 100644 --- a/math/s_nexttowardf.c +++ b/math/s_nexttowardf.c @@ -21,7 +21,7 @@ */ #include <math.h> -#include <math_private.h> +#include "math_private.h" #include <float.h> #ifdef __STDC__ @@ -45,12 +45,10 @@ return x+y; if((long double) x==y) return y; /* x=y, return y */ if(ix==0) { /* x == 0 */ - float u; + float x2; SET_FLOAT_WORD(x,(u_int32_t)(hy&0x80000000)|1);/* return +-minsub*/ - u = math_opt_barrier (x); - u = u * u; - math_force_eval (u); /* raise underflow flag */ - return x; + x2 = x*x; + if(x2==x) return x2; else return x; /* raise underflow flag */ } if(hx>=0) { /* x > 0 */ if(hy<0||(ix>>23)>(iy>>20)-0x380 @@ -72,12 +70,15 @@ x = x+x; /* overflow */ if (FLT_EVAL_METHOD != 0) /* Force conversion to float. */ - asm ("" : "+m"(x)); + asm ("" : "=m"(x) : "m"(x)); return x; } - if(hy<0x00800000) { - float u = x*x; /* underflow */ - math_force_eval (u); /* raise underflow flag */ + if(hy<0x00800000) { /* underflow */ + float x2 = x*x; + if(x2!=x) { /* raise underflow flag */ + SET_FLOAT_WORD(x2,hx); + return x2; + } } SET_FLOAT_WORD(x,hx); return x; |