]> git.ipfire.org Git - thirdparty/glibc.git/blobdiff - sysdeps/ieee754/ldbl-128ibm/s_nexttowardf.c
.
[thirdparty/glibc.git] / sysdeps / ieee754 / ldbl-128ibm / s_nexttowardf.c
index a9373ff822162becd1cc591e9afa7fc8c01a1438..cf655fad1670cbfef714889b1026585b82621b35 100644 (file)
@@ -19,8 +19,9 @@ static char rcsid[] = "$NetBSD: $";
 #endif
 
 #include "math.h"
-#include "math_private.h"
+#include <math_private.h>
 #include <math_ldbl_opt.h>
+#include <float.h>
 
 #ifdef __STDC__
        float __nexttowardf(float x, long double y)
@@ -46,10 +47,12 @@ static char rcsid[] = "$NetBSD: $";
           return x+y;
        if((long double) x==y) return y;        /* x=y, return y */
        if(ix==0) {                             /* x == 0 */
-           float x2;
+           float u;
            SET_FLOAT_WORD(x,(u_int32_t)((hy>>32)&0x80000000)|1);/* return +-minsub*/
-           x2 = x*x;
-           if(x2==x) return x2; else return x; /* raise underflow flag */
+           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>>52)-0x380
@@ -69,13 +72,16 @@ static char rcsid[] = "$NetBSD: $";
            }
        }
        hy = hx&0x7f800000;
-       if(hy>=0x7f800000) return x+x;  /* overflow  */
+       if(hy>=0x7f800000) {
+         x = x+x;      /* overflow  */
+         if (FLT_EVAL_METHOD != 0)
+           /* Force conversion to float.  */
+           asm ("" : "+m"(x));
+         return x;
+       }
        if(hy<0x00800000) {             /* underflow */
-           float x2 = x*x;
-           if(x2!=x) {         /* raise underflow flag */
-               SET_FLOAT_WORD(x2,hx);
-               return x2;
-           }
+           float u = x*x;
+           math_force_eval (u);        /* raise underflow flag */
        }
        SET_FLOAT_WORD(x,hx);
        return x;