X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=math%2Fs_nexttowardf.c;h=cdc06109cae11b36b3d25082e91fc7b7bb32d0b7;hb=c21c7bc24ec58c516d1608695d9c5a86f2f2fc0c;hp=fb008d579c061e5da94962bf72d8efb5f9f36b4f;hpb=8db218828187d58575c509b6ed3da0cad9f73519;p=thirdparty%2Fglibc.git diff --git a/math/s_nexttowardf.c b/math/s_nexttowardf.c index fb008d579c0..cdc06109cae 100644 --- a/math/s_nexttowardf.c +++ b/math/s_nexttowardf.c @@ -20,14 +20,16 @@ * Special cases: */ +#include #include +#include #include #include float __nexttowardf(float x, long double y) { int32_t hx,hy,ix,iy; - u_int32_t ly; + uint32_t ly; GET_FLOAT_WORD(hx,x); EXTRACT_WORDS(hy,ly,y); @@ -40,38 +42,33 @@ float __nexttowardf(float x, long double y) if((long double) x==y) return y; /* x=y, return y */ if(ix==0) { /* x == 0 */ float u; - SET_FLOAT_WORD(x,(u_int32_t)(hy&0x80000000)|1);/* return +-minsub*/ + SET_FLOAT_WORD(x,(uint32_t)(hy&0x80000000)|1);/* return +-minsub*/ u = math_opt_barrier (x); u = u * u; math_force_eval (u); /* raise underflow flag */ return x; } if(hx>=0) { /* x > 0 */ - if(hy<0||(ix>>23)>(iy>>20)-0x380 - || ((ix>>23)==(iy>>20)-0x380 - && (ix&0x7fffff)>(((hy<<3)|(ly>>29))&0x7fffff))) /* x > y, x -= ulp */ + if(x > y) /* x -= ulp */ hx -= 1; else /* x < y, x += ulp */ hx += 1; } else { /* x < 0 */ - if(hy>=0||(ix>>23)>(iy>>20)-0x380 - || ((ix>>23)==(iy>>20)-0x380 - && (ix&0x7fffff)>(((hy<<3)|(ly>>29))&0x7fffff))) /* x < y, x -= ulp */ + if(x < y) /* x -= ulp */ hx -= 1; else /* x > y, x += ulp */ hx += 1; } hy = hx&0x7f800000; if(hy>=0x7f800000) { - x = x+x; /* overflow */ - if (FLT_EVAL_METHOD != 0) - /* Force conversion to float. */ - asm ("" : "+m"(x)); - return x; + float u = x+x; /* overflow */ + math_force_eval (u); + __set_errno (ERANGE); } if(hy<0x00800000) { float u = x*x; /* underflow */ math_force_eval (u); /* raise underflow flag */ + __set_errno (ERANGE); } SET_FLOAT_WORD(x,hx); return x;