aboutsummaryrefslogtreecommitdiff
path: root/sysdeps
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>1997-01-01 15:28:18 +0000
committerUlrich Drepper <drepper@redhat.com>1997-01-01 15:28:18 +0000
commit6bc31da01b1271826c8feefb5f0efdf22d64061c (patch)
tree14aacf79623cde45cda8b839a225609eb4873540 /sysdeps
parentea971c878fda0a93a568732ca5a8a36524f77ec2 (diff)
downloadglibc-6bc31da01b1271826c8feefb5f0efdf22d64061c.tar
glibc-6bc31da01b1271826c8feefb5f0efdf22d64061c.tar.gz
glibc-6bc31da01b1271826c8feefb5f0efdf22d64061c.tar.bz2
glibc-6bc31da01b1271826c8feefb5f0efdf22d64061c.zip
update from main archive 970101cvs/libc-970102
Wed Jan 1 15:15:00 1997 Ulrich Drepper <drepper@cygnus.com> * libio/Makefile (routines): Add fcloseall. * libio/fcloseall.c: New file. * libio/stdio.h [__USE_GNU]: Add prototype for fcloseall. * libio/iofclose.c: Don't close all streams when argument is NULL. * stdio/Makefile (routines): Add fcloseall. * stdio/fcloseall.c: New file. * stdio/stdio.h [__USE_GNU]: Add prototype for fcloseall. * stdio/fclose.c: Don't close all streams when argument is NULL. * manual/stdio.texi: Document fcloseall. * sysdeps/generic/abort.c: Call __fcloseall instead of fclose with NULL argument. * socket/sys/un.h (SUN_LEN): Add cast. * sunrpc/auth_unix.c (authunix_create): Change parameter types of uid, gid, and aup_gids to uid_t and gid_t respectively. (authunix_create_default): Likewise. (authunix_refresh): Correct cast for aup_gids assignment. * sunrpc/rpc/auth.h (authunix_create): Correct types in declaration. * sunrpc/rpc/auth_unix.h (struct authunix_parms): Correct field types to uid_t and gid_t respectively. (struct short_hand_verf): Likewise. Reported by Andreas Schwab. * sysdeps/ieee754/Makefile: New file. Make sure ieee754.h gets installed. * sysdeps/ieee754/ieee754.h: Protect against multiple inclusion and use in C++ programs. * sysdeps/libm-i387/e_pow.S: New file. Optimized ix87 assembler version of pow() function. * sysdeps/libm-i387/e_powf.S: New file. Float version. * sysdeps/libm-i387/e_powl.S: New file. Long double version. * sysdeps/libm-i387/s_expm1.S: New file. Optimized ix87 assembler version of expm1() function. * sysdeps/libm-i387/s_expm1f.S: New file. Float version. * sysdeps/libm-i387/s_expm1l.S: New file. Long double version. * sysdeps/libm-i387/e_exp.S: Optimize handling of +-Inf. Better handling of computation stack from current NetBSD sources. * sysdeps/libm-i387/e_expf.S: Likewise. * sysdeps/libm-i387/e_expl.S: Likewise. * sysdeps/libm-i387/e_log.S: Use fstp instead of fincstp. * sysdeps/libm-i387/e_logf.S: Likewise. * sysdeps/libm-i387/e_logl.S: Likewise. * sysdeps/libm-i387/e_log10.S: Likewise. * sysdeps/libm-i387/e_log10f.S: Likewise. * sysdeps/libm-i387/e_log10l.S: Likewise. * sysdeps/libm-i387/s_asinh.S: Likewise. * sysdeps/libm-i387/s_asinhf.S: Likewise. * sysdeps/libm-i387/s_asinhl.S: Likewise. * sysdeps/libm-i387/s_significandl.S: Likewise. * sysdeps/libm-i387/s_ceil.S: Don't create stack frame. Modify stack pointer directly. Use 32 bit instead of 16 bit operations. * sysdeps/libm-i387/s_ceilf.S: Likewise. * sysdeps/libm-i387/s_ceill.S: Likewise. * sysdeps/libm-i387/s_floor.S: Likewise. * sysdeps/libm-i387/s_floorf.S: Likewise. * sysdeps/libm-i387/s_floorl.S: Likewise. * sysdeps/libm-ieee754/e_coshf.c (huge): Don't declare volatile. * sysdeps/libm-ieee754/e_expf.c: Likewise. * sysdeps/libm-ieee754/e_powf.c: Likewise. From current NetBSD sources. * sysdeps/libm-ieee754/e_hypot.c (__ieee754_hypot): Don't initialize `a' and `b' in definition. * sysdeps/libm-ieee754/e_hypotf.c: Likewise. * sysdeps/libm-ieee754/e_hypotl.c: New file. Long double implementation. * sysdeps/libm-ieee754/e_sinhl.c: New file. Long double implementation. * sysdeps/stub/e_hypotl.c: Removed. We have a real version now. * sysdeps/stub/e_sinhl.c: Removed. * sysdeps/posix/sigpause.c (__sigpause): Use sigdelset instead of sigaddset. Reported by Andreas Schwab. (__default_sigpause): New function. Call __sigpause as BSD version. Make this the default function by providing alias sigpause. * sysdeps/stub/sigpause.c (__default_sigpause): New funciton. Simply fail. Provide alias sigpause. Wed Jan 1 12:34:54 1997 Ulrich Drepper <drepper@cygnus.com> * po/es.po: Update for glibc-1.98. * po/fr.po: Likewise. * po/sv.po: New file. Swedish translation. Wed Jan 1 12:18:07 1997 MacGyver <macgyver@tos.net> * values.h: Fix typos: use SHRT_MAX but SHORT_MAX and SHRT_MIN but SHORT_MIN. Tue Dec 24 23:10:21 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * Makefile: Replace `stubs.h' by `gnu/stubs.h'. * features.h: Include <gnu/stubs.h> instead of <stubs.h>. Tue Dec 24 22:16:55 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * Makefile (subdirs): Move `elf' last so that librtld.so isn't relinked in the `make others' pass if an add-on adds something to libc. Mon Dec 23 21:23:16 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * sysdeps/m68k/abort-instr.h: New File. Mon Dec 23 21:16:38 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * sysdeps/m68k/Makefile ($(subdir)=elf): Define CFLAGS-rtld.c to prevent warning. Mon Dec 23 21:14:22 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * resolv/Makefile (subdirs-dirs): Define. Mon Dec 23 20:56:49 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * sysdeps/gnu/utmpbits.h (struct utmp): Fix padding. Mon Dec 30 11:05:11 1996 Ulrich Drepper <drepper@cygnus.com> Update from ADO tzcode1996o. * time/difftime.c: De-ANSI-declfy. Simplify computation of hibit according to ADO version. * time/zic.c: Correct typo is message. Update from ADO tzdata1996n. * time/asia: Updated. * time/australasia: Likewise. * time/europe: Likewise. * time/northamerica: Likewise. * time/southamerica: Likewise.
Diffstat (limited to 'sysdeps')
-rw-r--r--sysdeps/generic/abort.c2
-rw-r--r--sysdeps/gnu/utmpbits.h2
-rw-r--r--sysdeps/ieee754/Makefile3
-rw-r--r--sysdeps/ieee754/ieee754.h11
-rw-r--r--sysdeps/libm-i387/e_exp.S21
-rw-r--r--sysdeps/libm-i387/e_expf.S19
-rw-r--r--sysdeps/libm-i387/e_expl.S19
-rw-r--r--sysdeps/libm-i387/e_log.S2
-rw-r--r--sysdeps/libm-i387/e_log10.S2
-rw-r--r--sysdeps/libm-i387/e_log10f.S2
-rw-r--r--sysdeps/libm-i387/e_log10l.S2
-rw-r--r--sysdeps/libm-i387/e_logf.S2
-rw-r--r--sysdeps/libm-i387/e_logl.S2
-rw-r--r--sysdeps/libm-i387/e_pow.S120
-rw-r--r--sysdeps/libm-i387/e_powf.S120
-rw-r--r--sysdeps/libm-i387/e_powl.S120
-rw-r--r--sysdeps/libm-i387/s_asinh.S2
-rw-r--r--sysdeps/libm-i387/s_asinhf.S2
-rw-r--r--sysdeps/libm-i387/s_asinhl.S2
-rw-r--r--sysdeps/libm-i387/s_ceil.S20
-rw-r--r--sysdeps/libm-i387/s_ceilf.S20
-rw-r--r--sysdeps/libm-i387/s_ceill.S20
-rw-r--r--sysdeps/libm-i387/s_expm1.S83
-rw-r--r--sysdeps/libm-i387/s_expm1f.S83
-rw-r--r--sysdeps/libm-i387/s_expm1l.S83
-rw-r--r--sysdeps/libm-i387/s_floor.S26
-rw-r--r--sysdeps/libm-i387/s_floorf.S26
-rw-r--r--sysdeps/libm-i387/s_floorl.S26
-rw-r--r--sysdeps/libm-i387/s_significandl.S2
-rw-r--r--sysdeps/libm-ieee754/e_coshf.c10
-rw-r--r--sysdeps/libm-ieee754/e_expf.c12
-rw-r--r--sysdeps/libm-ieee754/e_hypot.c24
-rw-r--r--sysdeps/libm-ieee754/e_hypotf.c6
-rw-r--r--sysdeps/libm-ieee754/e_hypotl.c133
-rw-r--r--sysdeps/libm-ieee754/e_powf.c4
-rw-r--r--sysdeps/libm-ieee754/e_sinhl.c91
-rw-r--r--sysdeps/m68k/Makefile10
-rw-r--r--sysdeps/posix/sigpause.c15
-rw-r--r--sysdeps/stub/e_hypotl.c11
-rw-r--r--sysdeps/stub/e_sinhl.c11
40 files changed, 1005 insertions, 166 deletions
diff --git a/sysdeps/generic/abort.c b/sysdeps/generic/abort.c
index 604eadc4f5..366a543791 100644
--- a/sysdeps/generic/abort.c
+++ b/sysdeps/generic/abort.c
@@ -90,7 +90,7 @@ abort (void)
if (stage == 4)
{
++stage;
- fclose (NULL);
+ __fcloseall ();
}
/* Try again. */
diff --git a/sysdeps/gnu/utmpbits.h b/sysdeps/gnu/utmpbits.h
index 9fcc77de6b..de4a830bcc 100644
--- a/sysdeps/gnu/utmpbits.h
+++ b/sysdeps/gnu/utmpbits.h
@@ -96,7 +96,7 @@ struct utmp
long ut_session; /* Session ID, used for windowing. */
struct timeval ut_tv; /* Time entry was made. */
int32_t ut_addr_v6[4]; /* Internet address of remote host. */
- char pad[18]; /* Reserved for future use. */
+ char pad[20]; /* Reserved for future use. */
};
/* Backwards compatibility hacks. */
diff --git a/sysdeps/ieee754/Makefile b/sysdeps/ieee754/Makefile
new file mode 100644
index 0000000000..3796e728aa
--- /dev/null
+++ b/sysdeps/ieee754/Makefile
@@ -0,0 +1,3 @@
+ifeq ($(subdir),math)
+sysdep_headers += ieee754.h
+endif
diff --git a/sysdeps/ieee754/ieee754.h b/sysdeps/ieee754/ieee754.h
index 9e6efe4973..ba40cc7683 100644
--- a/sysdeps/ieee754/ieee754.h
+++ b/sysdeps/ieee754/ieee754.h
@@ -16,8 +16,15 @@
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
+#ifndef _IEEE754_H
+
+#define _IEEE754_H 1
+#include <features.h>
+
#include <endian.h>
+__BEGIN_DECLS
+
union ieee754_float
{
float f;
@@ -153,3 +160,7 @@ union ieee854_long_double
};
#define IEEE854_LONG_DOUBLE_BIAS 0x3fff
+
+__END_DECLS
+
+#endif /* ieee754.h */
diff --git a/sysdeps/libm-i387/e_exp.S b/sysdeps/libm-i387/e_exp.S
index 4505ebd309..3c9d45b746 100644
--- a/sysdeps/libm-i387/e_exp.S
+++ b/sysdeps/libm-i387/e_exp.S
@@ -5,7 +5,7 @@
#include <machine/asm.h>
-RCSID("$NetBSD: e_exp.S,v 1.4 1995/05/08 23:47:04 jtc Exp $")
+RCSID("$NetBSD: e_exp.S,v 1.7 1996/07/03 17:31:28 jtc Exp $")
/* e^x = 2^(x * log2(e)) */
ENTRY(__ieee754_exp)
@@ -16,16 +16,16 @@ ENTRY(__ieee754_exp)
-- drepper@cygnus.com. */
fxam /* Is NaN or +-Inf? */
fstsw %ax
- sahf
- jnc .LnoInfNaN /* No, jump. */
- jp .LisInf /* Is +-Inf, jump. */
-.LnoInfNaN:
+ movb $0x45, %dh
+ andb %ah, %dh
+ cmpb $0x05, %dh
+ je 1f /* Is +-Inf, jump. */
fldl2e
fmulp /* x * log2(e) */
fstl %st(1)
frndint /* int(x * log2(e)) */
- fstl %st(2)
- fsubrp /* fract(x * log2(e)) */
+ fsub %st,%st(1) /* fract(x * log2(e)) */
+ fxch
f2xm1 /* 2^(fract(x * log2(e))) - 1 */
fld1
faddp /* 2^(fract(x * log2(e))) */
@@ -33,9 +33,8 @@ ENTRY(__ieee754_exp)
fstp %st(1)
ret
-.LisInf:
- andb $2, %ah /* Test sign. */
- jz .LpInf /* If positive, jump. */
+1: testl $0x200, %eax /* Test sign. */
+ jz 2f /* If positive, jump. */
fldz /* Set result to 0. */
-.LpInf: ret
+2: ret
END (__ieee754_exp)
diff --git a/sysdeps/libm-i387/e_expf.S b/sysdeps/libm-i387/e_expf.S
index c8233eba50..cd8dc7f0b9 100644
--- a/sysdeps/libm-i387/e_expf.S
+++ b/sysdeps/libm-i387/e_expf.S
@@ -17,16 +17,16 @@ ENTRY(__ieee754_expf)
-- drepper@cygnus.com. */
fxam /* Is NaN or +-Inf? */
fstsw %ax
- sahf
- jnc .LnoInfNaN /* No, jump. */
- jp .LisInf /* Is +-Inf, jump. */
-.LnoInfNaN:
+ movb $0x45, %dh
+ andb %ah, %dh
+ cmpb $0x05, %dh
+ je 1f /* Is +-Inf, jump. */
fldl2e
fmulp /* x * log2(e) */
fstl %st(1)
frndint /* int(x * log2(e)) */
- fstl %st(2)
- fsubrp /* fract(x * log2(e)) */
+ fsub %st,%st(1) /* fract(x * log2(e)) */
+ fxch
f2xm1 /* 2^(fract(x * log2(e))) - 1 */
fld1
faddp /* 2^(fract(x * log2(e))) */
@@ -34,9 +34,8 @@ ENTRY(__ieee754_expf)
fstp %st(1)
ret
-.LisInf:
- andb $2, %ah /* Test sign. */
- jz .LpInf /* If positive, jump. */
+1: testl $0x200, %eax /* Test sign. */
+ jz 2f /* If positive, jump. */
fldz /* Set result to 0. */
-.LpInf: ret
+2: ret
END (__ieee754_expf)
diff --git a/sysdeps/libm-i387/e_expl.S b/sysdeps/libm-i387/e_expl.S
index 9103a923aa..e398a90ef6 100644
--- a/sysdeps/libm-i387/e_expl.S
+++ b/sysdeps/libm-i387/e_expl.S
@@ -18,16 +18,16 @@ ENTRY(__ieee754_expl)
-- drepper@cygnus.com. */
fxam /* Is NaN or +-Inf? */
fstsw %ax
- sahf
- jnc .LnoInfNaN /* No, jump. */
- jp .LisInf /* Is +-Inf, jump. */
-.LnoInfNaN:
+ movb $0x45, %dh
+ andb %ah, %dh
+ cmpb $0x05, %dh
+ je 1f /* Is +-Inf, jump. */
fldl2e
fmulp /* x * log2(e) */
fstl %st(1)
frndint /* int(x * log2(e)) */
- fstl %st(2)
- fsubrp /* fract(x * log2(e)) */
+ fsub %st,%st(1) /* fract(x * log2(e)) */
+ fxch
f2xm1 /* 2^(fract(x * log2(e))) - 1 */
fld1
faddp /* 2^(fract(x * log2(e))) */
@@ -35,9 +35,8 @@ ENTRY(__ieee754_expl)
fstp %st(1)
ret
-.LisInf:
- andb $2, %ah /* Test sign. */
- jz .LpInf /* If positive, jump. */
+1: testl $0x200, %eax /* Test sign. */
+ jz 2f /* If positive, jump. */
fldz /* Set result to 0. */
-.LpInf: ret
+2: ret
END (__ieee754_expl)
diff --git a/sysdeps/libm-i387/e_log.S b/sysdeps/libm-i387/e_log.S
index 43d430332c..e7f567d950 100644
--- a/sysdeps/libm-i387/e_log.S
+++ b/sysdeps/libm-i387/e_log.S
@@ -53,7 +53,7 @@ ENTRY(__ieee754_log)
fyl2xp1 // log(x)
ret
-2: fincstp // x : log(2)
+2: fstp %st(0) // x : log(2)
fyl2x // log(x)
ret
END (__ieee754_log)
diff --git a/sysdeps/libm-i387/e_log10.S b/sysdeps/libm-i387/e_log10.S
index 95efc8f7a2..ecb691b905 100644
--- a/sysdeps/libm-i387/e_log10.S
+++ b/sysdeps/libm-i387/e_log10.S
@@ -53,7 +53,7 @@ ENTRY(__ieee754_log10)
fyl2xp1 // log10(x)
ret
-2: fincstp // x : log10(2)
+2: fstp %st(0) // x : log10(2)
fyl2x // log10(x)
ret
END (__ieee754_log10)
diff --git a/sysdeps/libm-i387/e_log10f.S b/sysdeps/libm-i387/e_log10f.S
index bddb5011bc..aac58d0293 100644
--- a/sysdeps/libm-i387/e_log10f.S
+++ b/sysdeps/libm-i387/e_log10f.S
@@ -54,7 +54,7 @@ ENTRY(__ieee754_log10f)
fyl2xp1 // log10(x)
ret
-2: fincstp // x : log10(2)
+2: fstp %st(0) // x : log10(2)
fyl2x // log10(x)
ret
END (__ieee754_log10f)
diff --git a/sysdeps/libm-i387/e_log10l.S b/sysdeps/libm-i387/e_log10l.S
index f0b8f325a7..4f51818bdd 100644
--- a/sysdeps/libm-i387/e_log10l.S
+++ b/sysdeps/libm-i387/e_log10l.S
@@ -55,7 +55,7 @@ ENTRY(__ieee754_log10l)
fyl2xp1 // log10(x)
ret
-2: fincstp // x : log10(2)
+2: fstp %st(0) // x : log10(2)
fyl2x // log10(x)
ret
END(__ieee754_log10l)
diff --git a/sysdeps/libm-i387/e_logf.S b/sysdeps/libm-i387/e_logf.S
index b79f478cdf..4459b7fc08 100644
--- a/sysdeps/libm-i387/e_logf.S
+++ b/sysdeps/libm-i387/e_logf.S
@@ -54,7 +54,7 @@ ENTRY(__ieee754_logf)
fyl2xp1 // log(x)
ret
-2: fincstp // x : log(2)
+2: fstp %st(0) // x : log(2)
fyl2x // log(x)
ret
END (__ieee754_logf)
diff --git a/sysdeps/libm-i387/e_logl.S b/sysdeps/libm-i387/e_logl.S
index 1657dfd5fb..08447a27e7 100644
--- a/sysdeps/libm-i387/e_logl.S
+++ b/sysdeps/libm-i387/e_logl.S
@@ -54,7 +54,7 @@ ENTRY(__ieee754_logl)
fyl2xp1 // log(x)
ret
-2: fincstp // x : log(2)
+2: fstp %st(0) // x : log(2)
fyl2x // log(x)
ret
END (__ieee754_logl)
diff --git a/sysdeps/libm-i387/e_pow.S b/sysdeps/libm-i387/e_pow.S
new file mode 100644
index 0000000000..f6c7562d9c
--- /dev/null
+++ b/sysdeps/libm-i387/e_pow.S
@@ -0,0 +1,120 @@
+/* ix87 specific implementation of pow function.
+ Copyright (C) 1996 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+#include <machine/asm.h>
+
+#ifdef __ELF__
+ .section .rodata
+#else
+ .text
+#endif
+
+ .align ALIGNARG(4)
+ ASM_TYPE_DIRECTIVE(one,@object)
+one: .double 1.0
+ ASM_SIZE_DIRECTIVE(one)
+ ASM_TYPE_DIRECTIVE(limit,@object)
+limit: .double 0.29
+ ASM_SIZE_DIRECTIVE(limit)
+
+#ifdef PIC
+#define MO(op) op##@GOTOFF(%ecx)
+#else
+#define MO(op) op
+#endif
+
+ .text
+ENTRY(__ieee754_pow)
+ fldl 4(%esp) // x
+ fldl 12(%esp) // y : x
+
+#ifdef PIC
+ call 1f
+1: popl %ecx
+ addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %ecx
+#endif
+ subl $8,%esp
+
+ /* First see whether `y' is a natural number. In this case we
+ can use a more precise algorithm. */
+ fld %st // y : y : x
+ fistpll (%esp) // y : x
+ fildll (%esp) // int(y) : y : x
+ fucomp %st(1) // y : x
+ fnstsw
+ sahf
+ jne 2f
+
+ /* OK, we have an integer value for y. */
+ ftst // y : x
+ fstp %st(0) // x
+ fnstsw
+ sahf
+ popl %eax
+ popl %edx
+ jnc 4f // y >= 0, jump
+ fdivrl MO(one) // 1/x (now referred to as x)
+ negl %eax
+ adcl $0, %edx
+ negl %edx
+4: fldl MO(one) // 1 : x
+ fxch
+
+6: shrdl $1, %edx, %eax
+ jnc 5f
+ fxch
+ fmul %st(1) // x : ST*x
+ fxch
+5: fmul %st(0), %st // x*x : ST*x
+ movl %eax, %ecx
+ orl %edx, %ecx
+ jnz 6b
+ fstp %st(0) // ST*x
+ ret
+
+ .align ALIGNARG(4)
+2: /* y is a real number. */
+ fxch // x : y
+ fldl MO(one) // 1.0 : x : y
+ fld %st(1) // x : 1.0 : x : y
+ fsub %st(1) // x-1 : 1.0 : x : y
+ fabs // |x-1| : 1.0 : x : y
+ fcompl MO(limit) // 1.0 : x : y
+ fnstsw
+ fxch // x : 1.0 : y
+ sahf
+ ja 7f
+ fsub %st(1) // x-1 : 1.0 : y
+ fyl2xp1 // log2(x) : y
+ jmp 8f
+
+7: fyl2x // log2(x) : y
+8: fmul %st(1) // y*log2(x) : y
+ fst %st(1) // y*log2(x) : y*log2(x)
+ frndint // int(y*log2(x)) : y*log2(x)
+ fsubr %st, %st(1) // int(y*log2(x)) : fract(y*log2(x))
+ fxch // fract(y*log2(x)) : int(y*log2(x))
+ f2xm1 // 2^fract(y*log2(x))-1 : int(y*log2(x))
+ faddl MO(one) // 2^fract(y*log2(x)) : int(y*log2(x))
+ fscale // 2^fract(y*log2(x))*2^int(y*log2(x)) : int(y*log2(x))
+ addl $8, %esp
+ fstp %st(1) // 2^fract(y*log2(x))*2^int(y*log2(x))
+ ret
+END(__ieee754_pow)
diff --git a/sysdeps/libm-i387/e_powf.S b/sysdeps/libm-i387/e_powf.S
new file mode 100644
index 0000000000..9d6bc510b6
--- /dev/null
+++ b/sysdeps/libm-i387/e_powf.S
@@ -0,0 +1,120 @@
+/* ix87 specific implementation of pow function.
+ Copyright (C) 1996 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+#include <machine/asm.h>
+
+#ifdef __ELF__
+ .section .rodata
+#else
+ .text
+#endif
+
+ .align ALIGNARG(4)
+ ASM_TYPE_DIRECTIVE(one,@object)
+one: .double 1.0
+ ASM_SIZE_DIRECTIVE(one)
+ ASM_TYPE_DIRECTIVE(limit,@object)
+limit: .double 0.29
+ ASM_SIZE_DIRECTIVE(limit)
+
+#ifdef PIC
+#define MO(op) op##@GOTOFF(%ecx)
+#else
+#define MO(op) op
+#endif
+
+ .text
+ENTRY(__ieee754_powf)
+ flds 4(%esp) // x
+ flds 8(%esp) // y : x
+
+#ifdef PIC
+ call 1f
+1: popl %ecx
+ addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %ecx
+#endif
+ subl $8,%esp
+
+ /* First see whether `y' is a natural number. In this case we
+ can use a more precise algorithm. */
+ fld %st // y : y : x
+ fistpll (%esp) // y : x
+ fildll (%esp) // int(y) : y : x
+ fucomp %st(1) // y : x
+ fnstsw
+ sahf
+ jne 2f
+
+ /* OK, we have an integer value for y. */
+ ftst // y : x
+ fstp %st(0) // x
+ fnstsw
+ sahf
+ popl %eax
+ popl %edx
+ jnc 4f // y >= 0, jump
+ fdivrl MO(one) // 1/x (now referred to as x)
+ negl %eax
+ adcl $0, %edx
+ negl %edx
+4: fldl MO(one) // 1 : x
+ fxch
+
+6: shrdl $1, %edx, %eax
+ jnc 5f
+ fxch
+ fmul %st(1) // x : ST*x
+ fxch
+5: fmul %st(0), %st // x*x : ST*x
+ movl %eax, %ecx
+ orl %edx, %ecx
+ jnz 6b
+ fstp %st(0) // ST*x
+ ret
+
+ .align ALIGNARG(4)
+2: /* y is a real number. */
+ fxch // x : y
+ fldl MO(one) // 1.0 : x : y
+ fld %st(1) // x : 1.0 : x : y
+ fsub %st(1) // x-1 : 1.0 : x : y
+ fabs // |x-1| : 1.0 : x : y
+ fcompl MO(limit) // 1.0 : x : y
+ fnstsw
+ fxch // x : 1.0 : y
+ sahf
+ ja 7f
+ fsub %st(1) // x-1 : 1.0 : y
+ fyl2xp1 // log2(x) : y
+ jmp 8f
+
+7: fyl2x // log2(x) : y
+8: fmul %st(1) // y*log2(x) : y
+ fst %st(1) // y*log2(x) : y*log2(x)
+ frndint // int(y*log2(x)) : y*log2(x)
+ fsubr %st, %st(1) // int(y*log2(x)) : fract(y*log2(x))
+ fxch // fract(y*log2(x)) : int(y*log2(x))
+ f2xm1 // 2^fract(y*log2(x))-1 : int(y*log2(x))
+ faddl MO(one) // 2^fract(y*log2(x)) : int(y*log2(x))
+ fscale // 2^fract(y*log2(x))*2^int(y*log2(x)) : int(y*log2(x))
+ addl $8, %esp
+ fstp %st(1) // 2^fract(y*log2(x))*2^int(y*log2(x))
+ ret
+END(__ieee754_powf)
diff --git a/sysdeps/libm-i387/e_powl.S b/sysdeps/libm-i387/e_powl.S
new file mode 100644
index 0000000000..ea445804f0
--- /dev/null
+++ b/sysdeps/libm-i387/e_powl.S
@@ -0,0 +1,120 @@
+/* ix87 specific implementation of pow function.
+ Copyright (C) 1996 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+#include <machine/asm.h>
+
+#ifdef __ELF__
+ .section .rodata
+#else
+ .text
+#endif
+
+ .align ALIGNARG(4)
+ ASM_TYPE_DIRECTIVE(one,@object)
+one: .double 1.0
+ ASM_SIZE_DIRECTIVE(one)
+ ASM_TYPE_DIRECTIVE(limit,@object)
+limit: .double 0.29
+ ASM_SIZE_DIRECTIVE(limit)
+
+#ifdef PIC
+#define MO(op) op##@GOTOFF(%ecx)
+#else
+#define MO(op) op
+#endif
+
+ .text
+ENTRY(__ieee754_powl)
+ fldt 4(%esp) // x
+ fldt 16(%esp) // y : x
+
+#ifdef PIC
+ call 1f
+1: popl %ecx
+ addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %ecx
+#endif
+ subl $8,%esp
+
+ /* First see whether `y' is a natural number. In this case we
+ can use a more precise algorithm. */
+ fld %st // y : y : x
+ fistpll (%esp) // y : x
+ fildll (%esp) // int(y) : y : x
+ fucomp %st(1) // y : x
+ fnstsw
+ sahf
+ jne 2f
+
+ /* OK, we have an integer value for y. */
+ ftst // y : x
+ fstp %st(0) // x
+ fnstsw
+ sahf
+ popl %eax
+ popl %edx
+ jnc 4f // y >= 0, jump
+ fdivrl MO(one) // 1/x (now referred to as x)
+ negl %eax
+ adcl $0, %edx
+ negl %edx
+4: fldl MO(one) // 1 : x
+ fxch
+
+6: shrdl $1, %edx, %eax
+ jnc 5f
+ fxch
+ fmul %st(1) // x : ST*x
+ fxch
+5: fmul %st(0), %st // x*x : ST*x
+ movl %eax, %ecx
+ orl %edx, %ecx
+ jnz 6b
+ fstp %st(0) // ST*x
+ ret
+
+ .align ALIGNARG(4)
+2: /* y is a real number. */
+ fxch // x : y
+ fldl MO(one) // 1.0 : x : y
+ fld %st(1) // x : 1.0 : x : y
+ fsub %st(1) // x-1 : 1.0 : x : y
+ fabs // |x-1| : 1.0 : x : y
+ fcompl MO(limit) // 1.0 : x : y
+ fnstsw
+ fxch // x : 1.0 : y
+ sahf
+ ja 7f
+ fsub %st(1) // x-1 : 1.0 : y
+ fyl2xp1 // log2(x) : y
+ jmp 8f
+
+7: fyl2x // log2(x) : y
+8: fmul %st(1) // y*log2(x) : y
+ fst %st(1) // y*log2(x) : y*log2(x)
+ frndint // int(y*log2(x)) : y*log2(x)
+ fsubr %st, %st(1) // int(y*log2(x)) : fract(y*log2(x))
+ fxch // fract(y*log2(x)) : int(y*log2(x))
+ f2xm1 // 2^fract(y*log2(x))-1 : int(y*log2(x))
+ faddl MO(one) // 2^fract(y*log2(x)) : int(y*log2(x))
+ fscale // 2^fract(y*log2(x))*2^int(y*log2(x)) : int(y*log2(x))
+ addl $8, %esp
+ fstp %st(1) // 2^fract(y*log2(x))*2^int(y*log2(x))
+ ret
+END(__ieee754_powl)
diff --git a/sysdeps/libm-i387/s_asinh.S b/sysdeps/libm-i387/s_asinh.S
index 9b58eaa424..a71d0b66f4 100644
--- a/sysdeps/libm-i387/s_asinh.S
+++ b/sysdeps/libm-i387/s_asinh.S
@@ -101,7 +101,7 @@ ENTRY(__asinh)
fchs // x
4: fld %st // x : x
faddl MO(huge) // huge+x : x
- fincstp // x
+ fstp %st(0) // x
ret
// |x| > 2^28 => y = sign(x) * (log(|x|) + log(2))
diff --git a/sysdeps/libm-i387/s_asinhf.S b/sysdeps/libm-i387/s_asinhf.S
index d0a99a9461..f47bc9e0ac 100644
--- a/sysdeps/libm-i387/s_asinhf.S
+++ b/sysdeps/libm-i387/s_asinhf.S
@@ -101,7 +101,7 @@ ENTRY(__asinhf)
fchs // x
4: fld %st // x : x
faddl MO(huge) // huge+x : x
- fincstp // x
+ fstp %st(0) // x
ret
// |x| > 2^14 => y = sign(x) * (log(|x|) + log(2))
diff --git a/sysdeps/libm-i387/s_asinhl.S b/sysdeps/libm-i387/s_asinhl.S
index 28f76c2649..e112244908 100644
--- a/sysdeps/libm-i387/s_asinhl.S
+++ b/sysdeps/libm-i387/s_asinhl.S
@@ -109,7 +109,7 @@ ENTRY(__asinhl)
4: fld %st // x : x
fldt MO(huge) // huge : x : x
faddp // huge+x : x
- fincstp // x
+ fstp %st(0) // x
ret
// |x| > 2^34 => y = sign(x) * (log(|x|) + log(2))
diff --git a/sysdeps/libm-i387/s_ceil.S b/sysdeps/libm-i387/s_ceil.S
index 309fe882f8..b0159128aa 100644
--- a/sysdeps/libm-i387/s_ceil.S
+++ b/sysdeps/libm-i387/s_ceil.S
@@ -8,27 +8,25 @@
RCSID("$NetBSD: s_ceil.S,v 1.4 1995/05/08 23:52:13 jtc Exp $")
ENTRY(__ceil)
- pushl %ebp
- movl %esp,%ebp
+ fldl 4(%esp)
subl $8,%esp
- fstcw -4(%ebp) /* store fpu control word */
+ fstcw 4(%esp) /* store fpu control word */
/* We use here %edx although only the low 1 bits are defined.
But none of the operations should care and they are faster
than the 16 bit operations. */
- movl -4(%ebp),%edx
- orl $0x0800,%edx /* round towards +oo */
+ movl $0x0800,%edx /* round towards +oo */
+ orl 4(%esp),%edx
andl $0xfbff,%edx
- movl %edx,-8(%ebp)
- fldcw -8(%ebp) /* load modified control word */
+ movl %edx,(%esp)
+ fldcw (%esp) /* load modified control word */
- fldl 8(%ebp); /* round */
- frndint
+ frndint /* round */
- fldcw -4(%ebp) /* restore original control word */
+ fldcw 4(%esp) /* restore original control word */
- leave
+ addl $8,%esp
ret
END (__ceil)
weak_alias (__ceil, ceil)
diff --git a/sysdeps/libm-i387/s_ceilf.S b/sysdeps/libm-i387/s_ceilf.S
index 768d117021..352d40d7ce 100644
--- a/sysdeps/libm-i387/s_ceilf.S
+++ b/sysdeps/libm-i387/s_ceilf.S
@@ -8,27 +8,25 @@
RCSID("$NetBSD: s_ceilf.S,v 1.3 1995/05/08 23:52:44 jtc Exp $")
ENTRY(__ceilf)
- pushl %ebp
- movl %esp,%ebp
+ flds 4(%esp)
subl $8,%esp
- fstcw -4(%ebp) /* store fpu control word */
+ fstcw 4(%esp) /* store fpu control word */
/* We use here %edx although only the low 1 bits are defined.
But none of the operations should care and they are faster
than the 16 bit operations. */
- movl -4(%ebp),%edx
- orl $0x0800,%edx /* round towards +oo */
+ movl $0x0800,%edx /* round towards +oo */
+ orl 4(%esp),%edx
andl $0xfbff,%edx
- movl %edx,-8(%ebp)
- fldcw -8(%ebp) /* load modified control word */
+ movl %edx,(%esp)
+ fldcw (%esp) /* load modified control word */
- flds 8(%ebp); /* round */
- frndint
+ frndint /* round */
- fldcw -4(%ebp) /* restore original control word */
+ fldcw 4(%esp) /* restore original control word */
- leave
+ addl $8,%esp
ret
END (__ceilf)
weak_alias (__ceilf, ceilf)
diff --git a/sysdeps/libm-i387/s_ceill.S b/sysdeps/libm-i387/s_ceill.S
index dcf8719af3..0128966ebe 100644
--- a/sysdeps/libm-i387/s_ceill.S
+++ b/sysdeps/libm-i387/s_ceill.S
@@ -9,27 +9,25 @@
RCSID("$NetBSD: $")
ENTRY(__ceill)
- pushl %ebp
- movl %esp,%ebp
+ fldt 4(%esp)
subl $8,%esp
- fstcw -4(%ebp) /* store fpu control word */
+ fstcw 4(%esp) /* store fpu control word */
/* We use here %edx although only the low 1 bits are defined.
But none of the operations should care and they are faster
than the 16 bit operations. */
- movl -4(%ebp),%edx
- orl $0x0800,%edx /* round towards +oo */
+ movl $0x0800,%edx /* round towards +oo */
+ orl 4(%esp),%edx
andl $0xfbff,%edx
- movl %edx,-8(%ebp)
- fldcw -8(%ebp) /* load modified control word */
+ movl %edx,(%esp)
+ fldcw (%esp) /* load modified control word */
- fldt 8(%ebp); /* round */
- frndint
+ frndint /* round */
- fldcw -4(%ebp) /* restore original control word */
+ fldcw 4(%esp) /* restore original control word */
- leave
+ addl $8,%esp
ret
END (__ceill)
weak_alias (__ceill, ceill)
diff --git a/sysdeps/libm-i387/s_expm1.S b/sysdeps/libm-i387/s_expm1.S
new file mode 100644
index 0000000000..2685d6e770
--- /dev/null
+++ b/sysdeps/libm-i387/s_expm1.S
@@ -0,0 +1,83 @@
+/* ix87 specific implementation of exp(x)-1.
+ Copyright (C) 1996 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
+ Based on code by John C. Bowman <bowman@ipp-garching.mpg.de>.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+ /* Using: e^x - 1 = 2^(x * log2(e)) - 1 */
+
+#include <machine/asm.h>
+
+#ifdef __ELF__
+ .section .rodata
+#else
+ .text
+#endif
+ .align ALIGNARG(4)
+ ASM_TYPE_DIRECTIVE(zero,@object)
+zero: .double 0.0
+ ASM_SIZE_DIRECTIVE(zero)
+ ASM_TYPE_DIRECTIVE(one,@object)
+one: .double 1.0
+ ASM_SIZE_DIRECTIVE(one)
+ ASM_TYPE_DIRECTIVE(l2e,@object)
+l2e: .tfloat 1.442695040888963407359924681002
+ ASM_SIZE_DIRECTIVE(l2e)
+
+#ifdef PIC
+#define MO(op) op##@GOTOFF(%edx)
+#else
+#define MO(op) op
+#endif
+
+ .text
+ENTRY(__expm1)
+ fldl 4(%esp) // x
+ fxam // Is NaN or +-Inf?
+ fstsw %ax
+#ifdef PIC
+ call 1f
+1: popl %edx
+ addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %edx
+#endif
+ movb $0x45, %ch
+ andb %ah, %ch
+ cmpb $0x05, %ch
+ je 2f // Is +-Inf, jump.
+
+ fldt MO(l2e) // log2(e) : x
+ fmulp // log2(e)*x
+ fld %st // log2(e)*x : log2(e)*x
+ frndint // int(log2(e)*x) : log2(e)*x
+ fsub %st, %st(1) // int(log2(e)*x) : fract(log2(e)*x)
+ fxch // fract(log2(e)*x) : int(log2(e)*x)
+ f2xm1 // 2^fract(log2(e)*x)-1 : int(log2(e)*x)
+ fscale // 2^(log2(e)*x)-2^int(log2(e)*x) : int(log2(e)*x)
+ fxch // int(log2(e)*x) : 2^(log2(e)*x)-2^int(log2(e)*x)
+ fldl MO(one) // 1 : int(log2(e)*x) : 2^(log2(e)*x)-2^int(log2(e)*x)
+ fscale // 2^int(log2(e)*x) : 2^(log2(e)*x)-2^int(log2(e)*x)
+ faddp // 2^(log2(e)*x)
+ fsubl MO(one)
+ ret
+
+2: testl $0x200, %eax // Test sign.
+ jz 3f // If positive, jump.
+ fldl MO(zero) // Set result to 0.
+3: ret
+END(__expm1)
+weak_alias (__expm1, expm1)
diff --git a/sysdeps/libm-i387/s_expm1f.S b/sysdeps/libm-i387/s_expm1f.S
new file mode 100644
index 0000000000..85c3c849f1
--- /dev/null
+++ b/sysdeps/libm-i387/s_expm1f.S
@@ -0,0 +1,83 @@
+/* ix87 specific implementation of exp(x)-1.
+ Copyright (C) 1996 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
+ Based on code by John C. Bowman <bowman@ipp-garching.mpg.de>.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+ /* Using: e^x - 1 = 2^(x * log2(e)) - 1 */
+
+#include <machine/asm.h>
+
+#ifdef __ELF__
+ .section .rodata
+#else
+ .text
+#endif
+ .align ALIGNARG(4)
+ ASM_TYPE_DIRECTIVE(zero,@object)
+zero: .double 0.0
+ ASM_SIZE_DIRECTIVE(zero)
+ ASM_TYPE_DIRECTIVE(one,@object)
+one: .double 1.0
+ ASM_SIZE_DIRECTIVE(one)
+ ASM_TYPE_DIRECTIVE(l2e,@object)
+l2e: .tfloat 1.442695040888963407359924681002
+ ASM_SIZE_DIRECTIVE(l2e)
+
+#ifdef PIC
+#define MO(op) op##@GOTOFF(%edx)
+#else
+#define MO(op) op
+#endif
+
+ .text
+ENTRY(__expm1f)
+ flds 4(%esp) // x
+ fxam // Is NaN or +-Inf?
+ fstsw %ax
+#ifdef PIC
+ call 1f
+1: popl %edx
+ addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %edx
+#endif
+ movb $0x45, %ch
+ andb %ah, %ch
+ cmpb $0x05, %ch
+ je 2f // Is +-Inf, jump.
+
+ fldt MO(l2e) // log2(e) : x
+ fmulp // log2(e)*x
+ fld %st // log2(e)*x : log2(e)*x
+ frndint // int(log2(e)*x) : log2(e)*x
+ fsub %st, %st(1) // int(log2(e)*x) : fract(log2(e)*x)
+ fxch // fract(log2(e)*x) : int(log2(e)*x)
+ f2xm1 // 2^fract(log2(e)*x)-1 : int(log2(e)*x)
+ fscale // 2^(log2(e)*x)-2^int(log2(e)*x) : int(log2(e)*x)
+ fxch // int(log2(e)*x) : 2^(log2(e)*x)-2^int(log2(e)*x)
+ fldl MO(one) // 1 : int(log2(e)*x) : 2^(log2(e)*x)-2^int(log2(e)*x)
+ fscale // 2^int(log2(e)*x) : 2^(log2(e)*x)-2^int(log2(e)*x)
+ faddp // 2^(log2(e)*x)
+ fsubl MO(one)
+ ret
+
+2: testl $0x200, %eax // Test sign.
+ jz 3f // If positive, jump.
+ fldl MO(zero) // Set result to 0.
+3: ret
+END(__expm1f)
+weak_alias (__expm1f, expm1f)
diff --git a/sysdeps/libm-i387/s_expm1l.S b/sysdeps/libm-i387/s_expm1l.S
new file mode 100644
index 0000000000..45aa753094
--- /dev/null
+++ b/sysdeps/libm-i387/s_expm1l.S
@@ -0,0 +1,83 @@
+/* ix87 specific implementation of exp(x)-1.
+ Copyright (C) 1996 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
+ Based on code by John C. Bowman <bowman@ipp-garching.mpg.de>.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+ /* Using: e^x - 1 = 2^(x * log2(e)) - 1 */
+
+#include <machine/asm.h>
+
+#ifdef __ELF__
+ .section .rodata
+#else
+ .text
+#endif
+ .align ALIGNARG(4)
+ ASM_TYPE_DIRECTIVE(zero,@object)
+zero: .double 0.0
+ ASM_SIZE_DIRECTIVE(zero)
+ ASM_TYPE_DIRECTIVE(one,@object)
+one: .double 1.0
+ ASM_SIZE_DIRECTIVE(one)
+ ASM_TYPE_DIRECTIVE(l2e,@object)
+l2e: .tfloat 1.442695040888963407359924681002
+ ASM_SIZE_DIRECTIVE(l2e)
+
+#ifdef PIC
+#define MO(op) op##@GOTOFF(%edx)
+#else
+#define MO(op) op
+#endif
+
+ .text
+ENTRY(__expm1l)
+ fldt 4(%esp) // x
+ fxam // Is NaN or +-Inf?
+ fstsw %ax
+#ifdef PIC
+ call 1f
+1: popl %edx
+ addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %edx
+#endif
+ movb $0x45, %ch
+ andb %ah, %ch
+ cmpb $0x05, %ch
+ je 2f // Is +-Inf, jump.
+
+ fldt MO(l2e) // log2(e) : x
+ fmulp // log2(e)*x
+ fld %st // log2(e)*x : log2(e)*x
+ frndint // int(log2(e)*x) : log2(e)*x
+ fsub %st, %st(1) // int(log2(e)*x) : fract(log2(e)*x)
+ fxch // fract(log2(e)*x) : int(log2(e)*x)
+ f2xm1 // 2^fract(log2(e)*x)-1 : int(log2(e)*x)
+ fscale // 2^(log2(e)*x)-2^int(log2(e)*x) : int(log2(e)*x)
+ fxch // int(log2(e)*x) : 2^(log2(e)*x)-2^int(log2(e)*x)
+ fldl MO(one) // 1 : int(log2(e)*x) : 2^(log2(e)*x)-2^int(log2(e)*x)
+ fscale // 2^int(log2(e)*x) : 2^(log2(e)*x)-2^int(log2(e)*x)
+ faddp // 2^(log2(e)*x)
+ fsubl MO(one)
+ ret
+
+2: testl $0x200, %eax // Test sign.
+ jz 3f // If positive, jump.
+ fldl MO(zero) // Set result to 0.
+3: ret
+END(__expm1l)
+weak_alias (__expm1l, expm1l)
diff --git a/sysdeps/libm-i387/s_floor.S b/sysdeps/libm-i387/s_floor.S
index 561f83d98a..20a8660424 100644
--- a/sysdeps/libm-i387/s_floor.S
+++ b/sysdeps/libm-i387/s_floor.S
@@ -8,23 +8,25 @@
RCSID("$NetBSD: s_floor.S,v 1.4 1995/05/09 00:01:59 jtc Exp $")
ENTRY(__floor)
- pushl %ebp
- movl %esp,%ebp
+ fldl 4(%esp)
subl $8,%esp
- fstcw -4(%ebp) /* store fpu control word */
- movw -4(%ebp),%dx
- orw $0x0400,%dx /* round towards -oo */
- andw $0xf7ff,%dx
- movw %dx,-8(%ebp)
- fldcw -8(%ebp) /* load modified control word */
+ fstcw 4(%esp) /* store fpu control word */
- fldl 8(%ebp); /* round */
- frndint
+ /* We use here %edx although only the low 1 bits are defined.
+ But none of the operations should care and they are faster
+ than the 16 bit operations. */
+ movl $0x400,%edx /* round towards -oo */
+ orl 4(%esp),%edx
+ andl $0xf7ff,%edx
+ movl %edx,(%esp)
+ fldcw (%esp) /* load modified control word */
- fldcw -4(%ebp) /* restore original control word */
+ frndint /* round */
- leave
+ fldcw 4(%esp) /* restore original control word */
+
+ addl $8,%esp
ret
END (__floor)
weak_alias (__floor, floor)
diff --git a/sysdeps/libm-i387/s_floorf.S b/sysdeps/libm-i387/s_floorf.S
index 059f4f3a15..eca93a2aa3 100644
--- a/sysdeps/libm-i387/s_floorf.S
+++ b/sysdeps/libm-i387/s_floorf.S
@@ -8,23 +8,25 @@
RCSID("$NetBSD: s_floorf.S,v 1.3 1995/05/09 00:04:32 jtc Exp $")
ENTRY(__floorf)
- pushl %ebp
- movl %esp,%ebp
+ flds 4(%esp)
subl $8,%esp
- fstcw -4(%ebp) /* store fpu control word */
- movw -4(%ebp),%dx
- orw $0x0400,%dx /* round towards -oo */
- andw $0xf7ff,%dx
- movw %dx,-8(%ebp)
- fldcw -8(%ebp) /* load modified control word */
+ fstcw 4(%esp) /* store fpu control word */
- flds 8(%ebp); /* round */
- frndint
+ /* We use here %edx although only the low 1 bits are defined.
+ But none of the operations should care and they are faster
+ than the 16 bit operations. */
+ movl $0x400,%edx /* round towards -oo */
+ orl 4(%esp),%edx
+ andl $0xf7ff,%edx
+ movl %edx,(%esp)
+ fldcw (%esp) /* load modified control word */
- fldcw -4(%ebp) /* restore original control word */
+ frndint /* round */
- leave
+ fldcw 4(%esp) /* restore original control word */
+
+ addl $8,%esp
ret
END (__floorf)
weak_alias (__floorf, floorf)
diff --git a/sysdeps/libm-i387/s_floorl.S b/sysdeps/libm-i387/s_floorl.S
index 7b7cff777a..c2bf091d73 100644
--- a/sysdeps/libm-i387/s_floorl.S
+++ b/sysdeps/libm-i387/s_floorl.S
@@ -9,23 +9,25 @@
RCSID("$NetBSD: $")
ENTRY(__floorl)
- pushl %ebp
- movl %esp,%ebp
+ fldt 4(%esp)
subl $8,%esp
- fstcw -4(%ebp) /* store fpu control word */
- movw -4(%ebp),%dx
- orw $0x0400,%dx /* round towards -oo */
- andw $0xf7ff,%dx
- movw %dx,-8(%ebp)
- fldcw -8(%ebp) /* load modified control word */
+ fstcw 4(%esp) /* store fpu control word */
- fldt 8(%ebp) /* round */
- frndint
+ /* We use here %edx although only the low 1 bits are defined.
+ But none of the operations should care and they are faster
+ than the 16 bit operations. */
+ movl $0x400,%edx /* round towards -oo */
+ orl 4(%esp),%edx
+ andl $0xf7ff,%edx
+ movl %edx,(%esp)
+ fldcw (%esp) /* load modified control word */
- fldcw -4(%ebp) /* restore original control word */
+ frndint /* round */
- leave
+ fldcw 4(%esp) /* restore original control word */
+
+ addl $8,%esp
ret
END (__floorl)
weak_alias (__floorl, floorl)
diff --git a/sysdeps/libm-i387/s_significandl.S b/sysdeps/libm-i387/s_significandl.S
index 1d5f4a3f6a..e3a69cba73 100644
--- a/sysdeps/libm-i387/s_significandl.S
+++ b/sysdeps/libm-i387/s_significandl.S
@@ -11,7 +11,7 @@ RCSID("$NetBSD: $")
ENTRY(__significandl)
fldt 4(%esp)
fxtract
- fincstp
+ fstp %st(0)
ret
END (__significandl)
weak_alias (__significandl, significandl)
diff --git a/sysdeps/libm-ieee754/e_coshf.c b/sysdeps/libm-ieee754/e_coshf.c
index e6f4ed6f37..223fbeea20 100644
--- a/sysdeps/libm-ieee754/e_coshf.c
+++ b/sysdeps/libm-ieee754/e_coshf.c
@@ -8,20 +8,20 @@
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
- * software is freely granted, provided that this notice
+ * software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
-static char rcsid[] = "$NetBSD: e_coshf.c,v 1.5 1995/05/10 20:45:01 jtc Exp $";
+static char rcsid[] = "$NetBSD: e_coshf.c,v 1.6 1996/04/08 15:43:41 phil Exp $";
#endif
#include "math.h"
#include "math_private.h"
#ifdef __STDC__
-static const volatile float huge = 1.0e30;
+static const float huge = 1.0e30;
static const float one = 1.0, half=0.5;
#else
static float one = 1.0, half=0.5, huge = 1.0e30;
@@ -33,7 +33,7 @@ static float one = 1.0, half=0.5, huge = 1.0e30;
float __ieee754_coshf(x)
float x;
#endif
-{
+{
float t,w;
int32_t ix;
@@ -41,7 +41,7 @@ static float one = 1.0, half=0.5, huge = 1.0e30;
ix &= 0x7fffffff;
/* x is INF or NaN */
- if(ix>=0x7f800000) return x*x;
+ if(ix>=0x7f800000) return x*x;
/* |x| in [0,0.5*ln2], return 1+expm1(|x|)^2/(2*exp(|x|)) */
if(ix<0x3eb17218) {
diff --git a/sysdeps/libm-ieee754/e_expf.c b/sysdeps/libm-ieee754/e_expf.c
index 80af17918f..fbf2691bf9 100644
--- a/sysdeps/libm-ieee754/e_expf.c
+++ b/sysdeps/libm-ieee754/e_expf.c
@@ -8,19 +8,19 @@
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
- * software is freely granted, provided that this notice
+ * software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
-static char rcsid[] = "$NetBSD: e_expf.c,v 1.5 1995/05/10 20:45:05 jtc Exp $";
+static char rcsid[] = "$NetBSD: e_expf.c,v 1.6 1996/04/08 15:43:43 phil Exp $";
#endif
#include "math.h"
#include "math_private.h"
-static const volatile float huge = 1.0e+30;
+static const float huge = 1.0e+30;
#ifdef __STDC__
static const float
@@ -69,7 +69,7 @@ P5 = 4.1381369442e-08; /* 0x3331bb4c */
}
/* argument reduction */
- if(hx > 0x3eb17218) { /* if |x| > 0.5 ln2 */
+ if(hx > 0x3eb17218) { /* if |x| > 0.5 ln2 */
if(hx < 0x3F851592) { /* and |x| < 1.5 ln2 */
hi = x-ln2HI[xsb]; lo=ln2LO[xsb]; k = 1-xsb-xsb;
} else {
@@ -79,7 +79,7 @@ P5 = 4.1381369442e-08; /* 0x3331bb4c */
lo = t*ln2LO[0];
}
x = hi - lo;
- }
+ }
else if(hx < 0x31800000) { /* when |x|<2**-28 */
if(huge+x>one) return one+x;/* trigger inexact */
}
@@ -88,7 +88,7 @@ P5 = 4.1381369442e-08; /* 0x3331bb4c */
/* x is now in primary range */
t = x*x;
c = x - t*(P1+t*(P2+t*(P3+t*(P4+t*P5))));
- if(k==0) return one-((x*c)/(c-(float)2.0)-x);
+ if(k==0) return one-((x*c)/(c-(float)2.0)-x);
else y = one-((lo-(x*c)/((float)2.0-c))-hi);
if(k >= -125) {
u_int32_t hy;
diff --git a/sysdeps/libm-ieee754/e_hypot.c b/sysdeps/libm-ieee754/e_hypot.c
index 24c8ae452f..76a77ec33a 100644
--- a/sysdeps/libm-ieee754/e_hypot.c
+++ b/sysdeps/libm-ieee754/e_hypot.c
@@ -5,7 +5,7 @@
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
- * software is freely granted, provided that this notice
+ * software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
@@ -16,12 +16,12 @@ static char rcsid[] = "$NetBSD: e_hypot.c,v 1.9 1995/05/12 04:57:27 jtc Exp $";
/* __ieee754_hypot(x,y)
*
- * Method :
- * If (assume round-to-nearest) z=x*x+y*y
- * has error less than sqrt(2)/2 ulp, than
+ * Method :
+ * If (assume round-to-nearest) z=x*x+y*y
+ * has error less than sqrt(2)/2 ulp, than
* sqrt(z) has error less than 1 ulp (exercise).
*
- * So, compute sqrt(x*x+y*y) with some care as
+ * So, compute sqrt(x*x+y*y) with some care as
* follows to get the error below 1 ulp:
*
* Assume x>y>0;
@@ -31,10 +31,10 @@ static char rcsid[] = "$NetBSD: e_hypot.c,v 1.9 1995/05/12 04:57:27 jtc Exp $";
* where x1 = x with lower 32 bits cleared, x2 = x-x1; else
* 2. if x <= 2y use
* t1*y1+((x-y)*(x-y)+(t1*y2+t2*y))
- * where t1 = 2x with lower 32 bits cleared, t2 = 2x-t1,
+ * where t1 = 2x with lower 32 bits cleared, t2 = 2x-t1,
* y1= y with lower 32 bits chopped, y2 = y-y1.
- *
- * NOTE: scaling may be necessary if some argument is too
+ *
+ * NOTE: scaling may be necessary if some argument is too
* large or too tiny
*
* Special cases:
@@ -42,8 +42,8 @@ static char rcsid[] = "$NetBSD: e_hypot.c,v 1.9 1995/05/12 04:57:27 jtc Exp $";
* hypot(x,y) is NAN if x or y is NAN.
*
* Accuracy:
- * hypot(x,y) returns sqrt(x^2+y^2) with error less
- * than 1 ulps (units in the last place)
+ * hypot(x,y) returns sqrt(x^2+y^2) with error less
+ * than 1 ulps (units in the last place)
*/
#include "math.h"
@@ -56,7 +56,7 @@ static char rcsid[] = "$NetBSD: e_hypot.c,v 1.9 1995/05/12 04:57:27 jtc Exp $";
double x, y;
#endif
{
- double a=x,b=y,t1,t2,y1,y2,w;
+ double a,b,t1,t2,y1,y2,w;
int32_t j,k,ha,hb;
GET_HIGH_WORD(ha,x);
@@ -84,7 +84,7 @@ static char rcsid[] = "$NetBSD: e_hypot.c,v 1.9 1995/05/12 04:57:27 jtc Exp $";
SET_HIGH_WORD(b,hb);
}
if(hb < 0x20b00000) { /* b < 2**-500 */
- if(hb <= 0x000fffff) { /* subnormal b or 0 */
+ if(hb <= 0x000fffff) { /* subnormal b or 0 */
u_int32_t low;
GET_LOW_WORD(low,b);
if((hb|low)==0) return a;
diff --git a/sysdeps/libm-ieee754/e_hypotf.c b/sysdeps/libm-ieee754/e_hypotf.c
index 434cf94e8d..d6b1520cb8 100644
--- a/sysdeps/libm-ieee754/e_hypotf.c
+++ b/sysdeps/libm-ieee754/e_hypotf.c
@@ -8,7 +8,7 @@
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
- * software is freely granted, provided that this notice
+ * software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
@@ -27,7 +27,7 @@ static char rcsid[] = "$NetBSD: e_hypotf.c,v 1.5 1995/05/12 04:57:30 jtc Exp $";
float x, y;
#endif
{
- float a=x,b=y,t1,t2,y1,y2,w;
+ float a,b,t1,t2,y1,y2,w;
int32_t j,k,ha,hb;
GET_FLOAT_WORD(ha,x);
@@ -52,7 +52,7 @@ static char rcsid[] = "$NetBSD: e_hypotf.c,v 1.5 1995/05/12 04:57:30 jtc Exp $";
SET_FLOAT_WORD(b,hb);
}
if(hb < 0x26800000) { /* b < 2**-50 */
- if(hb <= 0x007fffff) { /* subnormal b or 0 */
+ if(hb <= 0x007fffff) { /* subnormal b or 0 */
if(hb==0) return a;
SET_FLOAT_WORD(t1,0x3f000000); /* t1=2^126 */
b *= t1;
diff --git a/sysdeps/libm-ieee754/e_hypotl.c b/sysdeps/libm-ieee754/e_hypotl.c
new file mode 100644
index 0000000000..1a40c556dc
--- /dev/null
+++ b/sysdeps/libm-ieee754/e_hypotl.c
@@ -0,0 +1,133 @@
+/* e_hypotl.c -- long double version of e_hypot.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
+
+/* __ieee754_hypotl(x,y)
+ *
+ * Method :
+ * If (assume round-to-nearest) z=x*x+y*y
+ * has error less than sqrt(2)/2 ulp, than
+ * sqrt(z) has error less than 1 ulp (exercise).
+ *
+ * So, compute sqrt(x*x+y*y) with some care as
+ * follows to get the error below 1 ulp:
+ *
+ * Assume x>y>0;
+ * (if possible, set rounding to round-to-nearest)
+ * 1. if x > 2y use
+ * x1*x1+(y*y+(x2*(x+x1))) for x*x+y*y
+ * where x1 = x with lower 32 bits cleared, x2 = x-x1; else
+ * 2. if x <= 2y use
+ * t1*y1+((x-y)*(x-y)+(t1*y2+t2*y))
+ * where t1 = 2x with lower 32 bits cleared, t2 = 2x-t1,
+ * y1= y with lower 32 bits chopped, y2 = y-y1.
+ *
+ * NOTE: scaling may be necessary if some argument is too
+ * large or too tiny
+ *
+ * Special cases:
+ * hypot(x,y) is INF if x or y is +INF or -INF; else
+ * hypot(x,y) is NAN if x or y is NAN.
+ *
+ * Accuracy:
+ * hypot(x,y) returns sqrt(x^2+y^2) with error less
+ * than 1 ulps (units in the last place)
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+#ifdef __STDC__
+ long double __ieee754_hypotl(long double x, long double y)
+#else
+ long double __ieee754_hypotl(x,y)
+ long double x, y;
+#endif
+{
+ long double a,b,t1,t2,y1,y2,w;
+ u_int32_t j,k,ea,eb;
+
+ GET_LDOUBLE_EXP(ea,x);
+ ea &= 0x7fff;
+ GET_LDOUBLE_EXP(eb,y);
+ eb &= 0x7fff;
+ if(eb > ea) {a=y;b=x;j=ea; ea=eb;eb=j;} else {a=x;b=y;}
+ SET_LDOUBLE_EXP(a,ea); /* a <- |a| */
+ SET_LDOUBLE_EXP(b,eb); /* b <- |b| */
+ if((ea-eb)>0x46) {return a+b;} /* x/y > 2**70 */
+ k=0;
+ if(ea > 0x5f3f) { /* a>2**8000 */
+ if(ea == 0x7fff) { /* Inf or NaN */
+ u_int32_t exp,high,low;
+ w = a+b; /* for sNaN */
+ GET_LDOUBLE_WORDS(exp,high,low,a);
+ if(((high&0x7fffffff)|low)==0) w = a;
+ GET_LDOUBLE_WORDS(exp,high,low,b);
+ if(((eb^0x7fff)|(high&0x7fffffff)|low)==0) w = b;
+ return w;
+ }
+ /* scale a and b by 2**-9600 */
+ ea -= 0x2580; eb -= 0x2580; k += 9600;
+ SET_LDOUBLE_EXP(a,ea);
+ SET_LDOUBLE_EXP(b,eb);
+ }
+ if(eb < 0x20bf) { /* b < 2**-8000 */
+ if(eb == 0) { /* subnormal b or 0 */
+ u_int32_t exp,high,low;
+ GET_LDOUBLE_WORDS(exp,high,low,b);
+ if((high|low)==0) return a;
+ SET_LDOUBLE_WORDS(t1, 0x7ffd, 0, 0); /* t1=2^16382 */
+ b *= t1;
+ a *= t1;
+ k -= 16382;
+ } else { /* scale a and b by 2^9600 */
+ ea += 0x2580; /* a *= 2^9600 */
+ eb += 0x2580; /* b *= 2^9600 */
+ k -= 9600;
+ SET_LDOUBLE_EXP(a,ea);
+ SET_LDOUBLE_EXP(b,eb);
+ }
+ }
+ /* medium size a and b */
+ w = a-b;
+ if (w>b) {
+ u_int32_t high;
+ GET_LDOUBLE_MSW(high,a);
+ SET_LDOUBLE_WORDS(t1,ea,high,0);
+ t2 = a-t1;
+ w = __ieee754_sqrtl(t1*t1-(b*(-b)-t2*(a+t1)));
+ } else {
+ u_int32_t high;
+ GET_LDOUBLE_MSW(high,b);
+ a = a+a;
+ SET_LDOUBLE_WORDS(y1,eb,high,0);
+ y2 = b - y1;
+ GET_LDOUBLE_MSW(high,a);
+ SET_LDOUBLE_WORDS(t1,ea+1,high,0);
+ t2 = a - t1;
+ w = __ieee754_sqrtl(t1*y1-(w*(-w)-(t1*y2+t2*b)));
+ }
+ if(k!=0) {
+ u_int32_t exp;
+ t1 = 1.0;
+ GET_LDOUBLE_EXP(exp,t1);
+ SET_LDOUBLE_EXP(t1,exp+k);
+ return t1*w;
+ } else return w;
+}
diff --git a/sysdeps/libm-ieee754/e_powf.c b/sysdeps/libm-ieee754/e_powf.c
index 1358555128..4798340c84 100644
--- a/sysdeps/libm-ieee754/e_powf.c
+++ b/sysdeps/libm-ieee754/e_powf.c
@@ -14,13 +14,13 @@
*/
#if defined(LIBM_SCCS) && !defined(lint)
-static char rcsid[] = "$NetBSD: e_powf.c,v 1.6 1995/05/12 04:57:35 jtc Exp $";
+static char rcsid[] = "$NetBSD: e_powf.c,v 1.7 1996/04/08 15:43:44 phil Exp $";
#endif
#include "math.h"
#include "math_private.h"
-static const volatile float huge = 1.0e+30, tiny = 1.0e-30;
+static const float huge = 1.0e+30, tiny = 1.0e-30;
#ifdef __STDC__
static const float
diff --git a/sysdeps/libm-ieee754/e_sinhl.c b/sysdeps/libm-ieee754/e_sinhl.c
new file mode 100644
index 0000000000..2d98562f94
--- /dev/null
+++ b/sysdeps/libm-ieee754/e_sinhl.c
@@ -0,0 +1,91 @@
+/* e_asinhl.c -- long double version of e_asinh.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
+
+/* __ieee754_sinhl(x)
+ * Method :
+ * mathematically sinh(x) if defined to be (exp(x)-exp(-x))/2
+ * 1. Replace x by |x| (sinhl(-x) = -sinhl(x)).
+ * 2.
+ * E + E/(E+1)
+ * 0 <= x <= 25 : sinhl(x) := --------------, E=expm1l(x)
+ * 2
+ *
+ * 25 <= x <= lnovft : sinhl(x) := expl(x)/2
+ * lnovft <= x <= ln2ovft: sinhl(x) := expl(x/2)/2 * expl(x/2)
+ * ln2ovft < x : sinhl(x) := x*shuge (overflow)
+ *
+ * Special cases:
+ * sinhl(x) is |x| if x is +INF, -INF, or NaN.
+ * only sinhl(0)=0 is exact for finite x.
+ */
+
+#include "math.h"
+#include "math_private.h"
+
+#ifdef __STDC__
+static const long double one = 1.0, shuge = 1.0e4931L;
+#else
+static long double one = 1.0, shuge = 1.0e4931L;
+#endif
+
+#ifdef __STDC__
+ long double __ieee754_sinhl(long double x)
+#else
+ long double __ieee754_sinhl(x)
+ long double x;
+#endif
+{
+ long double t,w,h;
+ u_int32_t jx,ix,i0,i1;
+
+ /* Words of |x|. */
+ GET_LDOUBLE_WORDS(jx,i0,i1,x);
+ ix = jx&0x7fff;
+
+ /* x is INF or NaN */
+ if(ix==0x7fff) return x+x;
+
+ h = 0.5;
+ if (jx<0) h = -h;
+ /* |x| in [0,25], return sign(x)*0.5*(E+E/(E+1))) */
+ if (ix < 0x4003 || (ix == 0x4003 && i0 <= 0xc8000000)) { /* |x|<25 */
+ if (ix<0x3fe3) /* |x|<2**-28 */
+ if(shuge+x>one) return x;/* sinh(tiny) = tiny with inexact */
+ t = __expm1l(fabsl(x));
+ if(ix<0x3fff) return h*(2.0*t-t*t/(t+one));
+ return h*(t+t/(t+one));
+ }
+
+ /* |x| in [25, log(maxdouble)] return 0.5*exp(|x|) */
+ if (ix < 0x400c || (ix == 0x400c && i0 < 0xb17217f7))
+ return h*__ieee754_expl(fabsl(x));
+
+ /* |x| in [log(maxdouble), overflowthresold] */
+ if (ix<0x400c || (ix == 0x400c && (i0 < 0xb174ddc0
+ || (i0 == 0xb174ddc0
+ && i1 <= 0x31aec0ea)))) {
+ w = __ieee754_expl(0.5*fabsl(x));
+ t = h*w;
+ return t*w;
+ }
+
+ /* |x| > overflowthresold, sinhl(x) overflow */
+ return x*shuge;
+}
diff --git a/sysdeps/m68k/Makefile b/sysdeps/m68k/Makefile
index a5e9064767..dc502912bf 100644
--- a/sysdeps/m68k/Makefile
+++ b/sysdeps/m68k/Makefile
@@ -12,9 +12,9 @@
# Library General Public License for more details.
# You should have received a copy of the GNU Library General Public
-# License along with the GNU C Library; see the file COPYING.LIB. If
-# not, write to the Free Software Foundation, Inc., 675 Mass Ave,
-# Cambridge, MA 02139, USA.
+# License along with the GNU C Library; see the file COPYING.LIB. If not,
+# write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
# The mpn functions need this. All existing 68k ports use MIT syntax. If
# a new port wants to use Motorola or Sony syntax, it can redefine this
@@ -30,3 +30,7 @@ CFLAGS-setjmp.c := -fno-omit-frame-pointer
# The 68k `long double' is a distinct type we support.
long-double-fcts = yes
+
+ifeq ($(subdir),elf)
+CFLAGS-rtld.c += -Wno-uninitialized
+endif
diff --git a/sysdeps/posix/sigpause.c b/sysdeps/posix/sigpause.c
index b3eec8f39a..8b820ecad9 100644
--- a/sysdeps/posix/sigpause.c
+++ b/sysdeps/posix/sigpause.c
@@ -34,7 +34,7 @@ __sigpause (sig_or_mask, is_sig)
/* The modern X/Open implementation is requested. */
if (sigprocmask (0, NULL, &set) < 0
/* Yes, we call `sigaddset' and not `__sigaddset'. */
- || sigaddset (&set, sig_or_mask) < 0)
+ || sigdelset (&set, sig_or_mask) < 0)
return -1;
}
else
@@ -54,3 +54,16 @@ __sigpause (sig_or_mask, is_sig)
return sigsuspend (&set);
}
+
+
+/* We have to provide a default version of this function since the
+ standards demand it. The version which is a bit more reasonable is
+ the BSD version. So make this the default. */
+int __default_sigpause __P ((int mask));
+int
+__default_sigpause (mask)
+ int mask;
+{
+ return __sigpause (mask, 0);
+}
+weak_alias (__default_sigpause, sigpause)
diff --git a/sysdeps/stub/e_hypotl.c b/sysdeps/stub/e_hypotl.c
deleted file mode 100644
index a7a6e124d3..0000000000
--- a/sysdeps/stub/e_hypotl.c
+++ /dev/null
@@ -1,11 +0,0 @@
-#include <math.h>
-#include <stdio.h>
-
-long double
-__ieee754_hypotl (long double x, long double y)
-{
- fputs ("__ieee754_hypotl not implemented\n", stderr);
- return 0.0;
-}
-
-stub_warning (__ieee754_hypotl)
diff --git a/sysdeps/stub/e_sinhl.c b/sysdeps/stub/e_sinhl.c
deleted file mode 100644
index 8fe11d4ea9..0000000000
--- a/sysdeps/stub/e_sinhl.c
+++ /dev/null
@@ -1,11 +0,0 @@
-#include <math.h>
-#include <stdio.h>
-
-long double
-__ieee754_sinhl (long double x)
-{
- fputs ("__ieee754_sinhl not implemented\n", stderr);
- return 0.0;
-}
-
-stub_warning (__ieee754_sinhl)