diff options
Diffstat (limited to 'lib/libc/i386/gen')
-rw-r--r-- | lib/libc/i386/gen/Makefile.inc | 6 | ||||
-rw-r--r-- | lib/libc/i386/gen/_setjmp.S | 34 | ||||
-rw-r--r-- | lib/libc/i386/gen/alloca.S | 13 | ||||
-rw-r--r-- | lib/libc/i386/gen/fabs.S | 13 | ||||
-rw-r--r-- | lib/libc/i386/gen/frexp.c | 8 | ||||
-rw-r--r-- | lib/libc/i386/gen/infinity.c | 9 | ||||
-rw-r--r-- | lib/libc/i386/gen/isinf.c | 10 | ||||
-rw-r--r-- | lib/libc/i386/gen/ldexp.c | 18 | ||||
-rw-r--r-- | lib/libc/i386/gen/modf.S | 20 | ||||
-rw-r--r-- | lib/libc/i386/gen/setjmp.S | 51 | ||||
-rw-r--r-- | lib/libc/i386/gen/sigsetjmp.S | 125 |
11 files changed, 255 insertions, 52 deletions
diff --git a/lib/libc/i386/gen/Makefile.inc b/lib/libc/i386/gen/Makefile.inc index 814013d..457d5c3 100644 --- a/lib/libc/i386/gen/Makefile.inc +++ b/lib/libc/i386/gen/Makefile.inc @@ -1,5 +1,5 @@ # @(#)Makefile.inc 8.1 (Berkeley) 6/4/93 +# $Id$ -SRCS+= isinf.c -SRCS+= _setjmp.s alloca.s fabs.s ldexp.c modf.s setjmp.s -SRCS+= divsi3.s fixdfsi.s fixunsdfsi.s udivsi3.s +SRCS+= isinf.c infinity.c +SRCS+= _setjmp.S alloca.S fabs.S ldexp.c modf.S setjmp.S sigsetjmp.S diff --git a/lib/libc/i386/gen/_setjmp.S b/lib/libc/i386/gen/_setjmp.S index 47e319a..62259ce 100644 --- a/lib/libc/i386/gen/_setjmp.S +++ b/lib/libc/i386/gen/_setjmp.S @@ -1,6 +1,6 @@ /*- - * Copyright (c) 1990, 1993 - * The Regents of the University of California. All rights reserved. + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. * * This code is derived from software contributed to Berkeley by * William Jolitz. @@ -32,11 +32,14 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. + * + * $Id$ */ -#if defined(LIBC_SCCS) && !defined(lint) - .asciz "@(#)_setjmp.s 8.1 (Berkeley) 6/4/93" -#endif /* LIBC_SCCS and not lint */ +#if defined(LIBC_RCS) && !defined(lint) + .text + .asciz "$Id$" +#endif /* LIBC_RCS and not lint */ /* * C library -- _setjmp, _longjmp @@ -44,13 +47,17 @@ * _longjmp(a,v) * will generate a "return(v)" from the last call to * _setjmp(a) - * by restoring registers from the stack. + * by restoring registers from the environment 'a'. * The previous signal state is NOT restored. */ #include "DEFS.h" +#ifdef _THREAD_SAFE +ENTRY(__thread_sys_setjmp) +#else ENTRY(_setjmp) +#endif movl 4(%esp),%eax movl 0(%esp),%edx movl %edx, 0(%eax) /* rta */ @@ -59,10 +66,15 @@ ENTRY(_setjmp) movl %ebp,12(%eax) movl %esi,16(%eax) movl %edi,20(%eax) - movl $0,%eax + fnstcw 28(%eax) + xorl %eax,%eax ret +#ifdef _THREAD_SAFE +ENTRY(__thread_sys_longjmp) +#else ENTRY(_longjmp) +#endif movl 4(%esp),%edx movl 8(%esp),%eax movl 0(%edx),%ecx @@ -71,8 +83,10 @@ ENTRY(_longjmp) movl 12(%edx),%ebp movl 16(%edx),%esi movl 20(%edx),%edi - cmpl $0,%eax - jne 1f - movl $1,%eax + fninit + fldcw 28(%edx) + testl %eax,%eax + jnz 1f + incl %eax 1: movl %ecx,0(%esp) ret diff --git a/lib/libc/i386/gen/alloca.S b/lib/libc/i386/gen/alloca.S index a2d6a41..f76b37b 100644 --- a/lib/libc/i386/gen/alloca.S +++ b/lib/libc/i386/gen/alloca.S @@ -1,6 +1,6 @@ /*- - * Copyright (c) 1990, 1993 - * The Regents of the University of California. All rights reserved. + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. * * This code is derived from software contributed to Berkeley by * William Jolitz. @@ -32,11 +32,14 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. + * + * $Id$ */ -#if defined(LIBC_SCCS) && !defined(lint) - .asciz "@(#)alloca.s 8.1 (Berkeley) 6/4/93" -#endif /* LIBC_SCCS and not lint */ +#if defined(LIBC_RCS) && !defined(lint) + .text + .asciz "$Id$" +#endif /* LIBC_RCS and not lint */ /* like alloc, but automatic automatic free in return */ diff --git a/lib/libc/i386/gen/fabs.S b/lib/libc/i386/gen/fabs.S index 40e72c8..5ae5370 100644 --- a/lib/libc/i386/gen/fabs.S +++ b/lib/libc/i386/gen/fabs.S @@ -1,6 +1,6 @@ /*- - * Copyright (c) 1990, 1993 - * The Regents of the University of California. All rights reserved. + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. * * This code is derived from software contributed to Berkeley by * William Jolitz. @@ -32,11 +32,14 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. + * + * $Id$ */ -#if defined(LIBC_SCCS) && !defined(lint) - .asciz "@(#)fabs.s 8.1 (Berkeley) 6/4/93" -#endif /* LIBC_SCCS and not lint */ +#if defined(LIBC_RCS) && !defined(lint) + .text + .asciz "$Id$" +#endif /* LIBC_RCS and not lint */ #include "DEFS.h" diff --git a/lib/libc/i386/gen/frexp.c b/lib/libc/i386/gen/frexp.c index 6cdcd2c..aba4802 100644 --- a/lib/libc/i386/gen/frexp.c +++ b/lib/libc/i386/gen/frexp.c @@ -29,11 +29,13 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. + * + * $Id$ */ -#if defined(LIBC_SCCS) && !defined(lint) -static char sccsid[] = "@(#)frexp.c 8.1 (Berkeley) 6/4/93"; -#endif /* LIBC_SCCS and not lint */ +#if defined(LIBC_RCS) && !defined(lint) +static const char rcsid[] = "$Id$"; +#endif /* LIBC_RCS and not lint */ #include <sys/types.h> #include <math.h> diff --git a/lib/libc/i386/gen/infinity.c b/lib/libc/i386/gen/infinity.c new file mode 100644 index 0000000..e46f676 --- /dev/null +++ b/lib/libc/i386/gen/infinity.c @@ -0,0 +1,9 @@ +/* + * infinity.c + * $Id$ + */ + +#include <math.h> + +/* bytes for +Infinity on a 387 */ +char __infinity[] = { 0, 0, 0, 0, 0, 0, 0xf0, 0x7f }; diff --git a/lib/libc/i386/gen/isinf.c b/lib/libc/i386/gen/isinf.c index bcbeded..a796dcf 100644 --- a/lib/libc/i386/gen/isinf.c +++ b/lib/libc/i386/gen/isinf.c @@ -29,14 +29,17 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. + * + * $Id$ */ -#if defined(LIBC_SCCS) && !defined(lint) -static char sccsid[] = "@(#)isinf.c 8.1 (Berkeley) 6/4/93"; -#endif /* LIBC_SCCS and not lint */ +#if defined(LIBC_RCS) && !defined(lint) +static const char rcsid[] = "$Id$"; +#endif /* LIBC_RCS and not lint */ #include <sys/types.h> +int isnan(d) double d; { @@ -50,6 +53,7 @@ isnan(d) return(p->exp == 2047 && (p->manh || p->manl)); } +int isinf(d) double d; { diff --git a/lib/libc/i386/gen/ldexp.c b/lib/libc/i386/gen/ldexp.c index 7046c4e..8b63f52 100644 --- a/lib/libc/i386/gen/ldexp.c +++ b/lib/libc/i386/gen/ldexp.c @@ -32,11 +32,13 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. + * + * $Id$ */ -#if defined(LIBC_SCCS) && !defined(lint) -static char sccsid[] = "@(#)ldexp.c 8.1 (Berkeley) 6/4/93"; -#endif /* LIBC_SCCS and not lint */ +#if defined(LIBC_RCS) && !defined(lint) +static const char rcsid[] = "$Id$"; +#endif /* LIBC_RCS and not lint */ /* * ldexp(value, exp): return value * (2 ** exp). @@ -55,8 +57,18 @@ ldexp (double value, int exp) { double temp, texp, temp2; texp = exp; +#ifdef __GNUC__ +#if __GNUC__ >= 2 + asm ("fscale " + : "=u" (temp2), "=t" (temp) + : "0" (texp), "1" (value)); +#else asm ("fscale ; fxch %%st(1) ; fstp%L1 %1 " : "=f" (temp), "=0" (temp2) : "0" (texp), "f" (value)); +#endif +#else +error unknown asm +#endif return (temp); } diff --git a/lib/libc/i386/gen/modf.S b/lib/libc/i386/gen/modf.S index 2551237..b457097 100644 --- a/lib/libc/i386/gen/modf.S +++ b/lib/libc/i386/gen/modf.S @@ -1,6 +1,6 @@ /*- - * Copyright (c) 1990, 1993 - * The Regents of the University of California. All rights reserved. + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. * * This code is derived from software contributed to Berkeley by * Sean Eric Fagan. @@ -32,11 +32,14 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. + * + * $Id$ */ -#if defined(LIBC_SCCS) && !defined(lint) - .asciz "@(#)modf.s 8.1 (Berkeley) 6/4/93" -#endif /* LIBC_SCCS and not lint */ +#if defined(LIBC_RCS) && !defined(lint) + .text + .asciz "$Id$" +#endif /* LIBC_RCS and not lint */ /* * modf(value, iptr): return fractional part of value, and stores the @@ -47,9 +50,10 @@ */ /* With CHOP mode on, frndint behaves as TRUNC does. Useful. */ -.text -.globl _modf -_modf: + +#include "DEFS.h" + +ENTRY(modf) pushl %ebp movl %esp,%ebp subl $16,%esp diff --git a/lib/libc/i386/gen/setjmp.S b/lib/libc/i386/gen/setjmp.S index b24da11..6525a16 100644 --- a/lib/libc/i386/gen/setjmp.S +++ b/lib/libc/i386/gen/setjmp.S @@ -1,6 +1,6 @@ /*- - * Copyright (c) 1990, 1993 - * The Regents of the University of California. All rights reserved. + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. * * This code is derived from software contributed to Berkeley by * William Jolitz. @@ -32,11 +32,14 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. + * + * $Id$ */ -#if defined(LIBC_SCCS) && !defined(lint) - .asciz "@(#)setjmp.s 8.1 (Berkeley) 6/4/93" -#endif /* LIBC_SCCS and not lint */ +#if defined(LIBC_RCS) && !defined(lint) + .text + .asciz "$Id$" +#endif /* LIBC_RCS and not lint */ /* * C library -- _setjmp, _longjmp @@ -44,16 +47,27 @@ * longjmp(a,v) * will generate a "return(v)" from the last call to * setjmp(a) - * by restoring registers from the stack. + * by restoring registers from the environment 'a'. * The previous signal state is restored. */ #include "DEFS.h" +#include "SYS.h" +#ifdef _THREAD_SAFE +ENTRY(_thread_sys_setjmp) +#else ENTRY(setjmp) +#endif + PIC_PROLOGUE pushl $0 - call _sigblock +#ifdef _THREAD_SAFE + call PIC_PLT(CNAME(_thread_sys_sigblock)) +#else + call PIC_PLT(CNAME(sigblock)) +#endif popl %edx + PIC_EPILOGUE movl 4(%esp),%ecx movl 0(%esp),%edx movl %edx, 0(%ecx) @@ -63,14 +77,25 @@ ENTRY(setjmp) movl %esi,16(%ecx) movl %edi,20(%ecx) movl %eax,24(%ecx) - movl $0,%eax + fnstcw 28(%ecx) + xorl %eax,%eax ret +#ifdef _THREAD_SAFE +ENTRY(_thread_sys_longjmp) +#else ENTRY(longjmp) +#endif movl 4(%esp),%edx + PIC_PROLOGUE pushl 24(%edx) - call _sigsetmask +#ifdef _THREAD_SAFE + call PIC_PLT(CNAME(_thread_sys_sigsetmask)) +#else + call PIC_PLT(CNAME(sigsetmask)) /* XXX this is not reentrant */ +#endif popl %eax + PIC_EPILOGUE movl 4(%esp),%edx movl 8(%esp),%eax movl 0(%edx),%ecx @@ -79,8 +104,10 @@ ENTRY(longjmp) movl 12(%edx),%ebp movl 16(%edx),%esi movl 20(%edx),%edi - cmpl $0,%eax - jne 1f - movl $1,%eax + fninit + fldcw 28(%edx) + testl %eax,%eax + jnz 1f + incl %eax 1: movl %ecx,0(%esp) ret diff --git a/lib/libc/i386/gen/sigsetjmp.S b/lib/libc/i386/gen/sigsetjmp.S new file mode 100644 index 0000000..1220598 --- /dev/null +++ b/lib/libc/i386/gen/sigsetjmp.S @@ -0,0 +1,125 @@ +/*- + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * William Jolitz. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $Id$ + */ + +#if defined(LIBC_RCS) && !defined(lint) + .text + .asciz "$Id$" +#endif /* LIBC_RCS and not lint */ + +#include "DEFS.h" +#include "SYS.h" + +/*- + * TODO: + * Rename sigsetjmp to __sigsetjmp and siglongjmp to __siglongjmp, + * remove the other *jmp functions and define everything in terms + * of the renamed functions. This requires compiler support for + * the renamed functions (introduced in gcc-2.5.3; previous versions + * only supported *jmp with 0 or 1 leading underscores). + * + * Use sigprocmask() instead of sigblock() and sigsetmask(), and + * check for and handle errors. + * + * Restore _all_ the registers and the signal mask atomically. Can + * use sigreturn() if sigreturn() works. + */ + +#ifdef _THREAD_SAFE +ENTRY(_thread_sys_sigsetjmp) +#else +ENTRY(sigsetjmp) +#endif + movl 8(%esp),%eax + movl 4(%esp),%ecx + movl %eax,32(%ecx) + testl %eax,%eax + jz 2f + PIC_PROLOGUE + pushl $0 +#ifdef _THREAD_SAFE + call PIC_PLT(CNAME(_thread_sys_sigblock)) +#else + call PIC_PLT(CNAME(sigblock)) +#endif + addl $4,%esp + PIC_EPILOGUE + movl 4(%esp),%ecx + movl %eax,24(%ecx) +2: movl 0(%esp),%edx + movl %edx, 0(%ecx) + movl %ebx, 4(%ecx) + movl %esp, 8(%ecx) + movl %ebp,12(%ecx) + movl %esi,16(%ecx) + movl %edi,20(%ecx) + fnstcw 28(%ecx) + xorl %eax,%eax + ret + +#ifdef _THREAD_SAFE +ENTRY(_thread_sys_siglongjmp) +#else +ENTRY(siglongjmp) +#endif + movl 4(%esp),%edx + cmpl $0,32(%edx) + jz 2f + PIC_PROLOGUE + pushl 24(%edx) +#ifdef _THREAD_SAFE + call PIC_PLT(CNAME(_thread_sys_sigsetmask)) +#else + call PIC_PLT(CNAME(sigsetmask)) +#endif + addl $4,%esp + PIC_EPILOGUE +2: movl 4(%esp),%edx + movl 8(%esp),%eax + movl 0(%edx),%ecx + movl 4(%edx),%ebx + movl 8(%edx),%esp + movl 12(%edx),%ebp + movl 16(%edx),%esi + movl 20(%edx),%edi + fninit + fldcw 28(%edx) + testl %eax,%eax + jnz 1f + incl %eax +1: movl %ecx,0(%esp) + ret |