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