diff options
Diffstat (limited to 'sysdeps')
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 |
