summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog26
-rw-r--r--README.libm1
-rw-r--r--hurd/hurdinline.c1
-rw-r--r--libio/genops.c22
-rw-r--r--math/math_private.h9
-rw-r--r--sysdeps/i386/fpu/__math.h5
-rw-r--r--sysdeps/libm-ieee754/s_cbrtl.c123
-rw-r--r--sysdeps/unix/mman/syscalls.list2
-rw-r--r--sysdeps/unix/sysv/linux/Dist2
9 files changed, 176 insertions, 15 deletions
diff --git a/ChangeLog b/ChangeLog
index 556db5d59d..70a6b1c944 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,27 @@
+Fri Aug 30 19:55:27 1996  Ulrich Drepper  <drepper@cygnus.com>
+
+	* libio/genops.c: Make _cleanup an alias of _IO_cleanup.
+	Reported by Erik Troan.
+
+Fri Aug 30 15:40:04 1996  Ulrich Drepper  <drepper@cygnus.com>
+
+	* sysdeps/unix/sysv/linux/Dist: Add sys/procfs.h and
+ 	sys/sysmacros.h.  Reported by Curtiss <1CMC3466@IBM.MTSAC.EDU>.
+
+Fri Aug 30 13:53:32 1996  Andreas Jaeger  <aj@arthur.pfalz.de>
+
+	* sysdeps/unix/mman/syscalls.list: `mmap' has 6 arguments, not 5.
+
+Fri Aug 30 13:01:10 1996  NIIBE Yutaka  <gniibe@mri.co.jp>
+
+	* sysdeps/i386/fpu/__math.h (tan): Pop 1.0 in ST to get
+	real result.
+
+Fri Aug 30 03:33:33 1996  Ulrich Drepper  <drepper@cygnus.com>
+
+	* sysdeps/libm-ieee754/s_cbrtl.c: New file.  `long double'
+	implementation.
+
 Fri Aug 30 13:39:21 1996  Thomas Bushnell, n/BSG  <thomas@gnu.ai.mit.edu>
 
 	* Makerules (BUILD_CFLAGS): Use @(common-objpfx) for config.h, not
@@ -23,7 +47,7 @@ Fri Aug 30 13:39:21 1996  Thomas Bushnell, n/BSG  <thomas@gnu.ai.mit.edu>
 
 Fri Aug 30 01:26:44 1996  Ulrich Drepper  <drepper@cygnus.com>
 
-	* sysdeps/unix/sysv/linux/i386/Dist: Add close.S.
+	* sysdeps/unix/sysv/linux/i386/Dist: Add clone.S.
 	* sysdeps/unix/sysv/linux/m68k/Dist: Likewise.
 	* sysdeps/unix/sysv/linux/alpha/Dist: Likewise.
 
diff --git a/README.libm b/README.libm
index fd5dcc3e98..6efd8ceed3 100644
--- a/README.libm
+++ b/README.libm
@@ -25,7 +25,6 @@ k_sinl.c
 k_tanl.c
 
 s_atanl.c
-s_cbrtl.c
 s_erfl.c
 s_expm1l.c
 s_log1pl.c
diff --git a/hurd/hurdinline.c b/hurd/hurdinline.c
index ed55ed6300..5d85c9e4f0 100644
--- a/hurd/hurdinline.c
+++ b/hurd/hurdinline.c
@@ -5,7 +5,6 @@
 #undef _EXTERN_INLINE
 #define _EXTERN_INLINE /* Define the real function. */
 
-#include "hurd.h"
 #include "hurd/fd.h"
 #include "hurd/signal.h"
 #include "hurd/userlink.h"
diff --git a/libio/genops.c b/libio/genops.c
index e5bff7afed..98eef94b58 100644
--- a/libio/genops.c
+++ b/libio/genops.c
@@ -1,4 +1,4 @@
-/* 
+/*
 Copyright (C) 1993, 1995 Free Software Foundation
 
 This file is part of the GNU IO Library.  This library is free
@@ -503,7 +503,7 @@ DEFUN(_IO_default_finish, (fp),
 #ifdef _IO_MTSAFE_IO
   _IO_mutex_destroy (fp->_lock);
 #endif
-  
+
   _IO_un_link(fp);
 }
 
@@ -519,7 +519,7 @@ DEFUN(_IO_sputbackc, (fp, c),
       register _IO_FILE *fp AND int c)
 {
   int result;
-  
+
   if (fp->_IO_read_ptr > fp->_IO_read_base
       && (unsigned char)fp->_IO_read_ptr[-1] == (unsigned char)c)
     {
@@ -540,7 +540,7 @@ DEFUN(_IO_sungetc, (fp),
       register _IO_FILE *fp)
 {
   int result;
-  
+
   if (fp->_IO_read_ptr > fp->_IO_read_base)
     {
       fp->_IO_read_ptr--;
@@ -591,7 +591,7 @@ int
 DEFUN(_IO_get_column, (fp),
       register _IO_FILE *fp)
 {
-  if (fp->_cur_column) 
+  if (fp->_cur_column)
     return _IO_adjust_column(fp->_cur_column - 1,
 			      fp->_IO_write_base,
 			      fp->_IO_write_ptr - fp->_IO_write_base);
@@ -638,7 +638,7 @@ DEFUN_VOID(_IO_cleanup)
      So it is possible that other static destructord might want to
      write to cout - and they're supposed to be able to do so.
 
-     The following will make the standard streambufs be unbuffered, 
+     The following will make the standard streambufs be unbuffered,
      which forces any output from late destructors to be written out. */
   _IO_unbuffer_all ();
 }
@@ -654,7 +654,7 @@ DEFUN(_IO_init_marker, (marker, fp),
     marker->_pos = fp->_IO_read_ptr - fp->_IO_read_end;
   else
     marker->_pos = fp->_IO_read_ptr - fp->_IO_read_base;
-  
+
   /* Should perhaps sort the chain? */
   marker->_next = fp->_markers;
   fp->_markers = marker;
@@ -775,7 +775,7 @@ DEFUN(_IO_default_pbackfail, (fp, c),
 	/* Need to handle a filebuf in write mode (switch to read mode). FIXME!*/
 	if (_IO_have_backup(fp) && !_IO_in_backup(fp))
 	  _IO_switch_to_backup_area(fp);
-	
+
 	if (!_IO_have_backup(fp))
 	  {
 	    /* No backup buffer: allocate one. */
@@ -852,8 +852,12 @@ DEFUN(_IO_default_write, (fp, data, n),
 struct __io_defs {
     __io_defs() { }
     ~__io_defs() { _IO_cleanup(); }
-};   
+};
 __io_defs io_defs__;
 #endif
 
 #endif /* TODO */
+
+#ifdef weak_alias
+weak_alias (_IO_cleanup, _cleanup)
+#endif
diff --git a/math/math_private.h b/math/math_private.h
index 850442ca95..a7a4f3d74e 100644
--- a/math/math_private.h
+++ b/math/math_private.h
@@ -204,6 +204,15 @@ do {								\
   (d) = iw_u.value;						\
 } while (0)
 
+/* Get the more significant 32 bits of a long double mantissa.  */
+
+#define GET_LDOUBLE_MSW(v,d)					\
+do {								\
+  ieee_long_double_shape_type sh_u;				\
+  sh_u.value = (d);						\
+  (v) = sh_u.parts.msw;						\
+} while (0)
+
 /* Set the more significant 32 bits of a long double mantissa from an int.  */
 
 #define SET_LDOUBLE_MSW(d,v)					\
diff --git a/sysdeps/i386/fpu/__math.h b/sysdeps/i386/fpu/__math.h
index 3efa7512eb..de34370d21 100644
--- a/sysdeps/i386/fpu/__math.h
+++ b/sysdeps/i386/fpu/__math.h
@@ -1,6 +1,6 @@
 /* Inline math functions for i387.
 Copyright (C) 1995, 1996 Free Software Foundation, Inc.
-Contributed by John C. Bowman <bowman@hagar.ph.utexas.edu>
+Contributed by John C. Bowman <bowman@ipp-garching.mpg.de>
 
 This file is part of the GNU C Library.
 
@@ -119,7 +119,8 @@ tan (double __x)
 {
   register double __value;
   __asm __volatile__
-    ("fptan"
+    ("fptan\n\t"
+     "fincstp"
      : "=t" (__value) : "0" (__x));
 
   return __value;
diff --git a/sysdeps/libm-ieee754/s_cbrtl.c b/sysdeps/libm-ieee754/s_cbrtl.c
new file mode 100644
index 0000000000..03ebfe7eb8
--- /dev/null
+++ b/sysdeps/libm-ieee754/s_cbrtl.c
@@ -0,0 +1,123 @@
+/* s_cbrtl.c -- long double version of s_cbrt.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"
+
+/* cbrtl(x)
+ * Return cube root of x
+ */
+#ifdef __STDC__
+static const u_int32_t
+#else
+static u_int32_t
+#endif
+	B1_EXP = 10921,		/* = Int(B1) */
+	B1_MANT = 0x7bc4b064,	/* = Int(1.0-0.03306235651)*2**31 */
+
+	B2_EXP = 10900,
+	B2_MANT = 0x7bc4b064;	/* = Int(1.0-0.03306235651)*2**31 */
+
+#ifdef __STDC__
+static const long double
+#else
+static long double
+#endif
+C =  5.42857142857142815906e-01L, /* 19/35 */
+D = -7.05306122448979611050e-01L, /* -864/1225 */
+E =  1.41428571428571436819e+00L, /* 99/70 */
+F =  1.60714285714285720630e+00L, /* 45/28 */
+G =  3.57142857142857150787e-01L; /* 5/14 */
+
+#ifdef __STDC__
+	long double __cbrtl(long double x)
+#else
+	long double __cbrtl(x)
+	long double x;
+#endif
+{
+	int32_t	hx;
+	long double r,s,t=0.0,w;
+	u_int32_t sign, se, x0, x1;
+
+	GET_LDOUBLE_WORDS(se,x0,x1,x);
+	sign=se&0x8000; 		/* sign= sign(x) */
+	se ^= sign;
+	if(se==0x7fff) return(x+x); /* cbrt(NaN,INF) is itself */
+	if((se|x0|x1)==0)
+	    return(x);		/* cbrt(0) is itself */
+
+	SET_LDOUBLE_EXP(x,se);	/* x <- |x| */
+
+/* XXX I don't know whether the numbers for correct are correct.  The
+   precalculation is extended from 20 bits to 32 bits.  This hopefully
+   gives us the needed bits to get us still along with one iteration
+   step.  */
+
+    /* rough cbrt to 5 bits */
+	if(se==0) 		/* subnormal number */
+	  {
+	    u_int64_t xxl;
+	    u_int32_t set,t0,t1;
+	    SET_LDOUBLE_EXP(t,0x4035);	/* set t= 2**54 */
+	    SET_LDOUBLE_MSW(t,0x80000000);
+	    t*=x;
+	    GET_LDOUBLE_WORDS(set,t0,t1,t);
+	    xxl = ((u_int64_t) set) << 32 | t0;
+	    xxl /= 3;
+	    xxl += B2_EXP << 16 | B2_MANT;
+	    t0 = xxl & 0xffffffffu;
+	    set = xxl >> 32;
+	    SET_LDOUBLE_WORDS(t,set,t0,t1);
+	  }
+	else
+	  {
+	    u_int64_t xxl = ((u_int64_t) se) << 32 | x0;
+	    xxl /= 3;
+	    xxl += B1_EXP << 16 | B1_MANT;
+	    SET_LDOUBLE_MSW(t,xxl&0xffffffffu);
+	    xxl >>= 32;
+	    SET_LDOUBLE_EXP(t,xxl);
+	  }
+
+
+    /* new cbrt to 23 bits, may be implemented in single precision */
+	r=t*t/x;
+	s=C+r*t;
+	t*=G+F/(s+E+D/s);
+
+    /* chopped to 32 bits and make it larger than cbrt(x) */
+	GET_LDOUBLE_WORDS(se,x0,x1,t);
+	SET_LDOUBLE_WORDS(t,se,x0+1,0);
+
+
+    /* one step newton iteration to 53 bits with error less than 0.667 ulps */
+	s=t*t;		/* t*t is exact */
+	r=x/s;
+	w=t+t;
+	r=(r-t)/(w+r);	/* r-s is exact */
+	t=t+t*r;
+
+    /* retore the sign bit */
+	GET_LDOUBLE_EXP(se,t);
+	SET_LDOUBLE_EXP(t,se|sign);
+	return(t);
+}
+weak_alias (__cbrtl, cbrtl)
diff --git a/sysdeps/unix/mman/syscalls.list b/sysdeps/unix/mman/syscalls.list
index 6375f5998d..2211e8fa3c 100644
--- a/sysdeps/unix/mman/syscalls.list
+++ b/sysdeps/unix/mman/syscalls.list
@@ -1,7 +1,7 @@
 # File name	Caller	Syscall name	# args	Strong name	Weak names
 
 madvise		-	madvise		3	madvise
-mmap		-	mmap		5	__mmap		mmap
+mmap		-	mmap		6	__mmap		mmap
 mprotect	-	mprotect	3	__mprotect	mprotect
 msync		-	msync		2	msync
 munmap		-	munmap		2	__munmap	munmap
diff --git a/sysdeps/unix/sysv/linux/Dist b/sysdeps/unix/sysv/linux/Dist
index 423d002f0b..a6b5db6749 100644
--- a/sysdeps/unix/sysv/linux/Dist
+++ b/sysdeps/unix/sysv/linux/Dist
@@ -7,10 +7,12 @@ sys/kdaemon.h
 sys/klog.h
 sys/module.h
 sys/mount.h
+sys/procfs.h
 sys/quota.h
 sys/socketcall.h
 sys/sysctl.h
 sys/sysinfo.h
+sys/sysmacros.h
 sys/timex.h
 sys/user.h
 termio.h