(__nextafterl): Use math_opt_barrier and math_force_eval macros.
authordrepper <drepper>
Mon, 16 Apr 2007 20:39:50 +0000 (20:39 +0000)
committerdrepper <drepper>
Mon, 16 Apr 2007 20:39:50 +0000 (20:39 +0000)
sysdeps/i386/fpu/s_nextafterl.c
sysdeps/ieee754/ldbl-128/s_nextafterl.c
sysdeps/ieee754/ldbl-96/s_nextafterl.c

index 5b617cb..aef0a14 100644 (file)
@@ -27,7 +27,7 @@ static char rcsid[] = "$NetBSD: $";
  */
 
 #include "math.h"
-#include "math_private.h"
+#include <math_private.h>
 
 #ifdef __STDC__
        long double __nextafterl(long double x, long double y)
@@ -52,9 +52,12 @@ static char rcsid[] = "$NetBSD: $";
           return x+y;
        if(x==y) return y;              /* x=y, return y */
        if((ix|hx|lx)==0) {                     /* x == 0 */
+           long double u;
            SET_LDOUBLE_WORDS(x,esy&0x8000,0,1);/* return +-minsubnormal */
-           y = x*x;
-           if(y==x) return y; else return x;   /* raise underflow flag */
+           u = math_opt_barrier (x);
+           u = u * u;
+           math_force_eval (u);                /* raise underflow flag */
+           return x;
        }
        if(esx>=0) {                    /* x > 0 */
            if(esx>esy||((esx==esy) && (hx>hy||((hx==hy)&&(lx>ly))))) {
@@ -109,12 +112,9 @@ static char rcsid[] = "$NetBSD: $";
        }
        esy = esx&0x7fff;
        if(esy==0x7fff) return x+x;     /* overflow  */
-       if(esy==0) {                    /* underflow */
-           y = x*x;
-           if(y!=x) {          /* raise underflow flag */
-               SET_LDOUBLE_WORDS(y,esx,hx,lx);
-               return y;
-           }
+       if(esy==0) {
+           long double u = x*x;                /* underflow */
+           math_force_eval (u);                /* raise underflow flag */
        }
        SET_LDOUBLE_WORDS(x,esx,hx,lx);
        return x;
index d3df668..7bc869a 100644 (file)
@@ -25,7 +25,7 @@ static char rcsid[] = "$NetBSD: $";
  */
 
 #include "math.h"
-#include "math_private.h"
+#include <math_private.h>
 
 #ifdef __STDC__
        long double __nextafterl(long double x, long double y)
@@ -47,9 +47,12 @@ static char rcsid[] = "$NetBSD: $";
           return x+y;
        if(x==y) return y;              /* x=y, return y */
        if((ix|lx)==0) {                        /* x == 0 */
+           long double u;
            SET_LDOUBLE_WORDS64(x,hy&0x8000000000000000ULL,1);/* return +-minsubnormal */
-           y = x*x;
-           if(y==x) return y; 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(hx>hy||((hx==hy)&&(lx>ly))) {    /* x > y, x -= ulp */
@@ -70,12 +73,9 @@ static char rcsid[] = "$NetBSD: $";
        }
        hy = hx&0x7fff000000000000LL;
        if(hy==0x7fff000000000000LL) return x+x;/* overflow  */
-       if(hy==0) {                             /* underflow */
-           y = x*x;
-           if(y!=x) {          /* raise underflow flag */
-               SET_LDOUBLE_WORDS64(y,hx,lx);
-               return y;
-           }
+       if(hy==0) {
+           long double u = x*x;                /* underflow */
+           math_force_eval (u);                /* raise underflow flag */
        }
        SET_LDOUBLE_WORDS64(x,hx,lx);
        return x;
index 1798261..ed0877d 100644 (file)
@@ -26,7 +26,7 @@ static char rcsid[] = "$NetBSD: $";
  */
 
 #include "math.h"
-#include "math_private.h"
+#include <math_private.h>
 
 #ifdef __STDC__
        long double __nextafterl(long double x, long double y)
@@ -48,9 +48,12 @@ static char rcsid[] = "$NetBSD: $";
           return x+y;
        if(x==y) return y;              /* x=y, return y */
        if((ix|hx|lx)==0) {                     /* x == 0 */
+           long double u;
            SET_LDOUBLE_WORDS(x,esy&0x8000,0,1);/* return +-minsubnormal */
-           y = x*x;
-           if(y==x) return y; else return x;   /* raise underflow flag */
+           u = math_opt_barrier (x);
+           u = u * u;
+           math_force_eval (u);                /* raise underflow flag */
+           return x;
        }
        if(esx<0x8000) {                        /* x > 0 */
            if(ix>iy||((ix==iy) && (hx>hy||((hx==hy)&&(lx>ly))))) {
@@ -85,13 +88,10 @@ static char rcsid[] = "$NetBSD: $";
            }
        }
        esy = esx&0x7fff;
-       if(esy==0x7fff) return x+x;     /* overflow  */
-       if(esy==0) {                    /* underflow */
-           y = x*x;
-           if(y!=x) {          /* raise underflow flag */
-               SET_LDOUBLE_WORDS(y,esx,hx,lx);
-               return y;
-           }
+       if(esy==0x7fff) return x+x;             /* overflow  */
+       if(esy==0) {
+           long double u = x*x;                /* underflow */
+           math_force_eval (u);                /* raise underflow flag */
        }
        SET_LDOUBLE_WORDS(x,esx,hx,lx);
        return x;