summaryrefslogtreecommitdiff
path: root/sysdeps
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>1996-07-12 00:43:28 +0000
committerRoland McGrath <roland@gnu.org>1996-07-12 00:43:28 +0000
commite6c9a67a0bdb970f3b7f7ced6581b98cfe35797c (patch)
treef44ede8d7ebfe1f660126bebf0f2ef7009e04309 /sysdeps
parentadc6ff7f817959b0acf48de1bf0e7a7a6c0b901d (diff)
* math/Makefile (calls): Add s_frexp, s_ldexp.
(routines): Remove them and &f from here. * sys/socket.h: New file, wrapper for socket/sys/socket.h. Thu Jul 11 00:22:40 1996 Ulrich Drepper <drepper@cygnus.com> * sysdeps/libm-ieee754/s_frexpl.c: New file. `long double' implementation of frexp() function. * sysdeps/libm-ieee754/s_ldexpl.c: New file. `long double' implementation of ldexp() function. * sysdeps/libm-i387/s_isnanl.c (isnanl): Mask explicit one out before or'ing.
Diffstat (limited to 'sysdeps')
-rw-r--r--sysdeps/libm-i387/s_isnanl.c9
-rw-r--r--sysdeps/libm-ieee754/s_frexpl.c69
-rw-r--r--sysdeps/libm-ieee754/s_ldexpl.c37
3 files changed, 111 insertions, 4 deletions
diff --git a/sysdeps/libm-i387/s_isnanl.c b/sysdeps/libm-i387/s_isnanl.c
index 768ea2164b..6a74b956cc 100644
--- a/sysdeps/libm-i387/s_isnanl.c
+++ b/sysdeps/libm-i387/s_isnanl.c
@@ -36,10 +36,11 @@ static char rcsid[] = "$NetBSD: $";
int32_t se,hx,lx;
GET_LDOUBLE_WORDS(se,hx,lx,x);
se = (se & 0x7fff) << 1;
- lx |= hx;
- /* The additional &hx is required because Intel's extended format
- has the normally implicit 1 explicit present. Sigh! */
- se |= (u_int32_t)((lx|(-lx))&hx)>>31;
+ /* The additional & 0x7fffffff is required because Intel's
+ extended format has the normally implicit 1 explicit
+ present. Sigh! */
+ lx |= hx & 0x7fffffff;
+ se |= (u_int32_t)(lx|(-lx))>>31;
se = 0xfffe - se;
return (int)((u_int32_t)(se))>>16;
}
diff --git a/sysdeps/libm-ieee754/s_frexpl.c b/sysdeps/libm-ieee754/s_frexpl.c
new file mode 100644
index 0000000000..7a49bc37c8
--- /dev/null
+++ b/sysdeps/libm-ieee754/s_frexpl.c
@@ -0,0 +1,69 @@
+/* s_frexpl.c -- long double version of s_frexp.c.
+ * Conversion to long double by Ulrich Drepper,
+ * Cygnus Support, drepper@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#if defined(LIBM_SCCS) && !defined(lint)
+static char rcsid[] = "$NetBSD: $";
+#endif
+
+/*
+ * for non-zero x
+ * x = frexpl(arg,&exp);
+ * return a long double fp quantity x such that 0.5 <= |x| <1.0
+ * and the corresponding binary exponent "exp". That is
+ * arg = x*2^exp.
+ * If arg is inf, 0.0, or NaN, then frexpl(arg,&exp) returns arg
+ * with *exp=0.
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+#ifdef __STDC__
+static const long double
+#else
+static long double
+#endif
+#if LDBL_MANT_DIG == 64
+two65 = 3.68934881474191032320e+19L; /* 0x4040, 0x80000000, 0x00000000 */
+#else
+# error "Cannot handle this MANT_DIG"
+#endif
+
+
+#ifdef __STDC__
+ long double __frexpl(long double x, int *eptr)
+#else
+ long double __frexpl(x, eptr)
+ long double x; int *eptr;
+#endif
+{
+ u_int32_t se, hx, ix, lx;
+ GET_LDOUBLE_WORDS(se,hx,lx,x);
+ ix = 0x7fff&se;
+ *eptr = 0;
+ if(ix==0x7fff||((ix|hx|lx)==0)) return x; /* 0,inf,nan */
+ if (ix==0x0000) { /* subnormal */
+ x *= two65;
+ GET_LDOUBLE_EXP(se,x);
+ ix = se&0x7fff;
+ *eptr = -65;
+ }
+ *eptr += ix-16382;
+ se = (se & 0x8000) | 0x3ffe;
+ SET_LDOUBLE_EXP(x,se);
+ return x;
+}
+weak_alias (__frexpl, frexpl)
diff --git a/sysdeps/libm-ieee754/s_ldexpl.c b/sysdeps/libm-ieee754/s_ldexpl.c
new file mode 100644
index 0000000000..bf64c89898
--- /dev/null
+++ b/sysdeps/libm-ieee754/s_ldexpl.c
@@ -0,0 +1,37 @@
+/* s_ldexpl.c -- long double version of s_ldexp.c.
+ * Conversion to long double by Ulrich Drepper,
+ * Cygnus Support, drepper@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+#if defined(LIBM_SCCS) && !defined(lint)
+static char rcsid[] = "$NetBSD: $";
+#endif
+
+#include "math.h"
+#include "math_private.h"
+#include <errno.h>
+
+#ifdef __STDC__
+ long double __ldexpl(long double value, int exp)
+#else
+ long double __ldexpl(value, exp)
+ long double value; int exp;
+#endif
+{
+ if(!__finitel(value)||value==0.0) return value;
+ value = __scalbnl(value,exp);
+ if(!__finitel(value)||value==0.0) errno = ERANGE;
+ return value;
+}
+weak_alias (__ldexpl, ldexpl)