Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/lib/libm/src For the non-fenv archs: just use double - punt



details:   https://anonhg.NetBSD.org/src/rev/76bdffe41bd7
branches:  trunk
changeset: 791543:76bdffe41bd7
user:      martin <martin%NetBSD.org@localhost>
date:      Fri Nov 22 20:15:06 2013 +0000

description:
For the non-fenv archs: just use double - punt

diffstat:

 lib/libm/src/e_sqrtl.c |  26 +++++++++++++++++---------
 1 files changed, 17 insertions(+), 9 deletions(-)

diffs (77 lines):

diff -r 9bc12c598b19 -r 76bdffe41bd7 lib/libm/src/e_sqrtl.c
--- a/lib/libm/src/e_sqrtl.c    Fri Nov 22 19:59:36 2013 +0000
+++ b/lib/libm/src/e_sqrtl.c    Fri Nov 22 20:15:06 2013 +0000
@@ -28,7 +28,7 @@
 #if 0
 __FBSDID("$FreeBSD: head/lib/msun/src/e_sqrtl.c 176720 2008-03-02 01:47:58Z das $");
 #endif
-__RCSID("$NetBSD: e_sqrtl.c,v 1.3 2013/11/22 13:37:24 martin Exp $");
+__RCSID("$NetBSD: e_sqrtl.c,v 1.4 2013/11/22 20:15:06 martin Exp $");
 
 #include <machine/ieee.h>
 #include <float.h>
@@ -46,6 +46,8 @@
 #define        LDBL_NBIT       0
 #endif
 
+#ifdef HAVE_FENV_H
+
 /* Return (x + ulp) for normal positive x. Assumes no overflow. */
 static inline long double
 inc(long double x)
@@ -87,9 +89,7 @@
        union ieee_ext_u ux = { .extu_ld = x, };
        int k, r;
        long double lo, xn;
-#ifdef HAVE_FENV_H
        fenv_t env;
-#endif
 
        /* If x = NaN, then sqrt(x) = NaN. */
        /* If x = Inf, then sqrt(x) = Inf. */
@@ -105,9 +105,7 @@
        if (ux.extu_sign)
                return ((x - x) / (x - x));
 
-#ifdef HAVE_FENV_H
        feholdexcept(&env);
-#endif
 
        if (ux.extu_exp == 0) {
                /* Adjust subnormal numbers. */
@@ -150,9 +148,7 @@
 
        if (!fetestexcept(FE_INEXACT)) { /* Quotient is exact. */
                if (xn == ux.extu_ld) {
-#ifdef HAVE_FENV_H
                        fesetenv(&env);
-#endif
                        return (ux.extu_ld);
                }
                /* Round correctly for inputs like x = y**2 - ulp. */
@@ -166,11 +162,23 @@
                xn = inc(xn);           /* xn  = xn + ulp. */
        }
        ux.extu_ld = ux.extu_ld + xn;           /* Chopped sum. */
-#ifdef HAVE_FENV_H
        feupdateenv(&env);      /* Restore env and raise inexact */
-#endif
        ux.extu_exp--;
        return (ux.extu_ld);
 }
 
+#else
+
+/*
+ * No fenv support:
+ * poor man's version: just use double
+ */
+long double
+__ieee754_sqrtl(long double x)
+{
+       return __ieee754_sqrt((double)x);
+}
+
 #endif
+
+#endif



Home | Main Index | Thread Index | Old Index