about summary refs log tree commit diff
path: root/math
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>1996-05-30 16:12:42 +0000
committerRoland McGrath <roland@gnu.org>1996-05-30 16:12:42 +0000
commit76060ec0b8b5d6f0a860a94f100dc6e48041bac3 (patch)
treeb4ff1b5370a30a16705239598cb8e98f4b80b9ca /math
parentc3352e623384fe221743a6d2212c17d9619041ef (diff)
downloadglibc-76060ec0b8b5d6f0a860a94f100dc6e48041bac3.tar.gz
glibc-76060ec0b8b5d6f0a860a94f100dc6e48041bac3.tar.xz
glibc-76060ec0b8b5d6f0a860a94f100dc6e48041bac3.zip
Thu May 30 11:24:05 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu> cvs/libc-960602 cvs/libc-960601 cvs/libc-960531
	* po/header.pot: Replace with exact boilerplate pinard dictates.

	* sysdeps/i386/strtok.S (Lillegal_argument): Remove this code to set
	errno and the check that jumped to it.

	* sysdeps/mach/hurd/Makefile (errnos.d): Use $(sed-remove-objpfx).

Thu May 30 03:21:57 1996  Ulrich Drepper  <drepper@cygnus.com>

	* FAQ: Document need of gperf program for developers.

	* elf/elf.h: Fix typos in comments.

	* libio/stdio.h [!__STRICT_ANSI__ || _POSIX_SOURCE]: Add
        prototypes for `ctermid' and `cuserid'.

	* locale/programs/locale.c: Switch to user selected locale
	before printing variables.

	* math/Makefile [$(long-double-fcts)==yes]: Define long-m-routines
        and long-c-routines.  Only if the `long double' data type is
        available we need to compile the functions.
	(libm-routines): Add $(long-m-routines).
	(routines): Remove isinfl, isnanl.  Use new file s_isinfl and
	s_isnanl instead if `long double' is available.

	* math/math.h: Include <mathcalls.h> again to define `long double'
        functions.

	* math/math_private.h: Define data types, prototypes and access
        macros for `long double'.

	* stdlib/stdlib.h: Add prototypes for `strtoll' and `strtoull'.
	[GCC2 && OPTIMIZE]: Define strto{,u}ll as inline function which
	calls __strto{,u}q_internal.

	* stdlib/strfmon.c: Replace PTR by `void *'.

	* stdlib/strtoq.c: Define strtoll as weak alias.
	* stdlib/strtouq.c: Define strtoull as weak alias.

	* string/tester.c: Correct `strsep' test.

	* sysdeps/generic/strsep.c: Make compatible with BSD version.
        Trailing characters of skip set are not skipped.  In this case
        empty tokens are returned.

	* sysdeps/i386/isinfl.c, sysdeps/i386/isnanl.c,
        sysdeps/ieee754/isinf.c, sysdeps/ieee754/isinfl.c,
        sysdeps/ieee754/isnan.c, sysdeps/ieee754/isnanl.c: Removed.  We
        now use the versions part of libm.

	* sysdeps/i386/strsep.S: Removed.  Generic C version is of
	similar speed.
	* sysdeps/i386/strtok.S: Remove support for `strsep'.

	* sysdeps/libm-i387/e_acosl.S, sysdeps/libm-i387/s_ceill.S,
        sysdeps/libm-i387/s_copysignl.S, sysdeps/libm-i387/s_finitel.S,
        sysdeps/libm-i387/s_floorl.S, sysdeps/libm-i387/s_isinfl.c,
        sysdeps/libm-i387/s_isnanl.c, sysdeps/libm-i387/s_nextafterl.c,
        sysdeps/libm-i387/s_rintl.S, sysdeps/libm-i387/s_significandl.S:
        New i387 specific math functions implementing `long double'
        versions.

	* sysdeps/libm-ieee754/s_ceill.c,
        sysdeps/libm-ieee754/s_copysignl.c,
        sysdeps/libm-ieee754/s_fabsl.c, sysdeps/libm-ieee754/s_finitel.c,
        sysdeps/libm-ieee754/s_floorl.c, sysdeps/libm-ieee754/s_isinfl.c,
        sysdeps/libm-ieee754/s_isnanl.c,
        sysdeps/libm-ieee754/s_nextafterl.c,
        sysdeps/libm-ieee754/s_rintl.c, sysdeps/libm-ieee754/s_scalbnl.c,
        sysdeps/libm-ieee754/s_significandl.c: New generic `long double'
        versions of libm functions.

	* sysdeps/libm-i387/e_exp.S: Add a few comments to explain the
        Intel FPU nonsense.

	* sysdeps/libm-i387/s_ceil.S, sysdeps/libm-i387/s_ceilf.S,
        sysdeps/libm-i387/s_floor.S, sysdeps/libm-i387/s_floorf.S: Correct
        handling of local variables.  The old version created a stack
        frame but stored the values outside.

	* sysdeps/libm-ieee754/s_isinf.c, sysdeps/libm-ieee754/s_isnan.c
        [!NO_LONG_DOUBLE]: Define alias with `long double' versions name.

	* login/pututline_r.c: Include sys/stat.h.  Fix typos.

        according to currently used locale for category LC_CTYPE by
	inet_nsap_ntoa.  Now in <arpa/inet.h>.
        _IO_dup2 to contain complete parameter list.
Diffstat (limited to 'math')
-rw-r--r--math/Makefile16
-rw-r--r--math/math.h13
-rw-r--r--math/math_private.h124
3 files changed, 149 insertions, 4 deletions
diff --git a/math/Makefile b/math/Makefile
index e1caa2908f..730b5610e0 100644
--- a/math/Makefile
+++ b/math/Makefile
@@ -30,7 +30,7 @@ distribute	:= math_private.h machine/asm.h machine/endian.h
 # Build the -lm library.
 
 extra-libs	:= libm
-libm-routines	:= e_acos e_acosf e_acosh e_acoshf e_asin e_asinf	\
+libm-routines	 = e_acos e_acosf e_acosh e_acoshf e_asin e_asinf	\
 		   e_atan2 e_atan2f e_atanh e_atanhf e_cosh e_coshf	\
 		   e_exp e_expf e_fmod e_fmodf e_hypot e_hypotf e_j0	\
 		   e_j0f e_j1 e_j1f e_jn e_jnf e_lgamma_r e_lgammaf_r	\
@@ -55,12 +55,22 @@ libm-routines	:= e_acos e_acosf e_acosh e_acoshf e_asin e_asinf	\
 		   w_j0f w_j1 w_j1f w_jn w_jnf w_lgamma w_lgamma_r	\
 		   w_lgammaf w_lgammaf_r w_log w_log10 w_log10f w_logf	\
 		   w_pow w_powf w_remainder w_remainderf w_scalb	\
-		   w_scalbf w_sinh w_sinhf w_sqrt w_sqrtf
+		   w_scalbf w_sinh w_sinhf w_sqrt w_sqrtf		\
+		   $(long-m-routines)
+
+ifeq ($(long-double-fcts),yes)
+long-m-routines	:= s_ceill s_copysignl s_fabsl s_finitel s_floorl	\
+		   s_nextafterl s_rintl s_significandl
+endif
 
 # These functions are in libc instead of libm because __printf_fp
 # calls them, so any program using printf will need them linked in,
 # and we don't want to have to link every program with -lm.
-routines := s_isinf s_isinff s_isnan s_isnanf isinfl isnanl
+routines = s_isinf s_isinff s_isnan s_isnanf $(long-c-routines)
+
+ifeq ($(long-double-fcts),yes)
+long-c-routines	:= s_isinfl s_isnanl
+endif
 
 
 include ../Rules
diff --git a/math/math.h b/math/math.h
index 7bec1300c2..7a6134a6f0 100644
--- a/math/math.h
+++ b/math/math.h
@@ -61,6 +61,7 @@ __BEGIN_DECLS
 #undef	__MATH_PRECNAME
 
 #ifdef __USE_MISC
+
 /* Include the file of declarations again, this type using `float'
    instead of `double' and appending f to each function name.  */
 
@@ -69,7 +70,17 @@ __BEGIN_DECLS
 #include <mathcalls.h>
 #undef	_Mdouble_
 #undef	__MATH_PRECNAME
-#endif
+
+/* Include the file of declarations again, this type using `long double'
+   instead of `double' and appending l to each function name.  */
+
+#define _Mdouble_ 		long double
+#define __MATH_PRECNAME(name,r)	name##l##r
+#include <mathcalls.h>
+#undef	_Mdouble_
+#undef	__MATH_PRECNAME
+
+#endif	/* Use misc.  */
 
 
 #ifdef	__USE_MISC
diff --git a/math/math_private.h b/math/math_private.h
index 95f65a293b..c4ac857607 100644
--- a/math/math_private.h
+++ b/math/math_private.h
@@ -147,6 +147,93 @@ do {								\
   (d) = sf_u.value;						\
 } while (0)
 
+/* A union which permits us to convert between a long double and
+   three 32 bit ints.  */
+
+#if BYTE_ORDER == BIG_ENDIAN
+
+typedef union
+{
+  long double value;
+  struct
+  {
+    unsigned int sign_exponent:16;
+    unsigned int empty:16;
+    u_int32_t msw;
+    u_int32_t lsw;
+  } parts;
+} ieee_long_double_shape_type;
+
+#endif
+
+#if BYTE_ORDER == LITTLE_ENDIAN
+
+typedef union
+{
+  long double value;
+  struct
+  {
+    u_int32_t lsw;
+    u_int32_t msw;
+    unsigned int sign_exponent:16;
+    unsigned int empty:16;
+  } parts;
+} ieee_long_double_shape_type;
+
+#endif
+
+/* Get three 32 bit ints from a double.  */
+
+#define GET_LDOUBLE_WORDS(exp,ix0,ix1,d)			\
+do {								\
+  ieee_long_double_shape_type ew_u;				\
+  ew_u.value = (d);						\
+  (exp) = ew_u.parts.sign_exponent;				\
+  (ix0) = ew_u.parts.msw;					\
+  (ix1) = ew_u.parts.lsw;					\
+} while (0)
+
+/* Set a double from two 32 bit ints.  */
+
+#define SET_LDOUBLE_WORDS(d,exp,ix0,ix1)			\
+do {								\
+  ieee_long_double_shape_type iw_u;				\
+  iw_u.parts.sign_exponent = (exp);				\
+  iw_u.parts.msw = (ix0);					\
+  iw_u.parts.lsw = (ix1);					\
+  (d) = iw_u.value;						\
+} while (0)
+
+/* Set the more significant 32 bits of a long double mantissa from an int.  */
+
+#define SET_LDOUBLE_MSW(d,v)					\
+do {								\
+  ieee_long_double_shape_type sh_u;				\
+  sh_u.value = (d);						\
+  sh_u.parts.msw = (v);						\
+  (d) = sh_u.value;						\
+} while (0)
+
+/* Get int from the exponent of a long double.  */
+
+#define GET_LDOUBLE_EXP(exp,d)					\
+do {								\
+  ieee_long_double_shape_type ge_u;				\
+  ge_u.value = (d);
+  (exp) = ge_u.parts.sign_exponent;				\
+} while (0)
+
+/* Set exponent of a long double from an int.  */
+
+#define SET_LDOUBLE_EXP(d,exp)					\
+do {								\
+  ieee_long_double_shape_type se_u;				\
+  se_u.value = (d);						\
+  se_u.parts.sign_exponent = (exp);				\
+  (d) = se_u.value;						\
+} while (0)
+
+
 /* ieee style elementary functions */
 extern double __ieee754_sqrt __P((double));
 extern double __ieee754_acos __P((double));
@@ -219,4 +306,41 @@ extern float __kernel_cosf __P((float,float));
 extern float __kernel_tanf __P((float,float,int));
 extern int   __kernel_rem_pio2f __P((float*,float*,int,int,int,const int*));
 
+
+/* ieee style elementary long double functions */
+extern long double __ieee754_sqrtl __P((long double));
+extern long double __ieee754_acosl __P((long double));
+extern long double __ieee754_acoshl __P((long double));
+extern long double __ieee754_logl __P((long double));
+extern long double __ieee754_atanhl __P((long double));
+extern long double __ieee754_asinl __P((long double));
+extern long double __ieee754_atan2l __P((long double,long double));
+extern long double __ieee754_expl __P((long double));
+extern long double __ieee754_coshl __P((long double));
+extern long double __ieee754_fmodl __P((long double,long double));
+extern long double __ieee754_powl __P((long double,long double));
+extern long double __ieee754_lgammal_r __P((long double,int *));
+extern long double __ieee754_gammal_r __P((long double,int *));
+extern long double __ieee754_lgammal __P((long double));
+extern long double __ieee754_gammal __P((long double));
+extern long double __ieee754_log10l __P((long double));
+extern long double __ieee754_sinhl __P((long double));
+extern long double __ieee754_hypotl __P((long double,long double));
+extern long double __ieee754_j0l __P((long double));
+extern long double __ieee754_j1l __P((long double));
+extern long double __ieee754_y0l __P((long double));
+extern long double __ieee754_y1l __P((long double));
+extern long double __ieee754_jnl __P((int,long double));
+extern long double __ieee754_ynl __P((int,long double));
+extern long double __ieee754_remainderl __P((long double,long double));
+extern int   __ieee754_rem_pio2l __P((long double,long double*));
+extern long double __ieee754_scalbl __P((long double,long double));
+
+/* long double versions of fdlibm kernel functions */
+extern long double __kernel_sinl __P((long double,long double,int));
+extern long double __kernel_cosl __P((long double,long double));
+extern long double __kernel_tanl __P((long double,long double,int));
+extern int   __kernel_rem_pio2l __P((long double*,long double*,int,int,
+				     int,const int*));
+
 #endif /* _MATH_PRIVATE_H_ */