summaryrefslogtreecommitdiffstats
path: root/lib/libc/mips/gen
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libc/mips/gen')
-rw-r--r--lib/libc/mips/gen/Makefile.inc6
-rw-r--r--lib/libc/mips/gen/_setjmp.S132
-rw-r--r--lib/libc/mips/gen/fabs.S54
-rw-r--r--lib/libc/mips/gen/flt_rounds.c27
-rw-r--r--lib/libc/mips/gen/fpgetmask.c19
-rw-r--r--lib/libc/mips/gen/fpgetround.c19
-rw-r--r--lib/libc/mips/gen/fpgetsticky.c19
-rw-r--r--lib/libc/mips/gen/fpsetmask.c28
-rw-r--r--lib/libc/mips/gen/fpsetround.c28
-rw-r--r--lib/libc/mips/gen/fpsetsticky.c28
-rw-r--r--lib/libc/mips/gen/frexp.c73
-rw-r--r--lib/libc/mips/gen/infinity.c15
-rw-r--r--lib/libc/mips/gen/isinf.S95
-rw-r--r--lib/libc/mips/gen/ldexp.S217
-rw-r--r--lib/libc/mips/gen/modf.S75
-rw-r--r--lib/libc/mips/gen/setjmp.S128
-rw-r--r--lib/libc/mips/gen/sigsetjmp.S78
17 files changed, 1041 insertions, 0 deletions
diff --git a/lib/libc/mips/gen/Makefile.inc b/lib/libc/mips/gen/Makefile.inc
new file mode 100644
index 0000000..6c358a9
--- /dev/null
+++ b/lib/libc/mips/gen/Makefile.inc
@@ -0,0 +1,6 @@
+# $OpenBSD: Makefile.inc,v 1.4 1995/12/15 01:12:36 jonathan Exp $
+
+SRCS+= _setjmp.S fabs.S frexp.c infinity.c isinf.S ldexp.S modf.S
+SRCS+= flt_rounds.c fpgetmask.c fpgetround.c fpgetsticky.c fpsetmask.c \
+ fpsetround.c fpsetsticky.c
+SRCS+= setjmp.S sigsetjmp.S
diff --git a/lib/libc/mips/gen/_setjmp.S b/lib/libc/mips/gen/_setjmp.S
new file mode 100644
index 0000000..0e7b886
--- /dev/null
+++ b/lib/libc/mips/gen/_setjmp.S
@@ -0,0 +1,132 @@
+/*-
+ * Copyright (c) 1991, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Ralph Campbell.
+ *
+ * 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.
+ */
+
+#include <machine/regnum.h>
+#include <machine/asm.h>
+
+#if defined(LIBC_SCCS)
+ .text
+ .asciz "$OpenBSD: _setjmp.S,v 1.5 1996/08/19 08:15:51 tholo Exp $"
+#endif /* LIBC_SCCS */
+
+/*
+ * C library -- _setjmp, _longjmp
+ *
+ * _longjmp(a,v)
+ * will generate a "return(v)" from
+ * the last call to
+ * _setjmp(a)
+ * by restoring registers from the stack,
+ * The previous signal state is NOT restored.
+ */
+
+LEAF(_setjmp)
+ .set noreorder
+ li v0, 0xACEDBADE # sigcontext magic number
+ sw ra, (2 * 4)(a0) # sc_pc = return address
+ sw v0, (3 * 4)(a0) # saved in sc_regs[0]
+ sw s0, ((S0 + 3) * 4)(a0)
+ sw s1, ((S1 + 3) * 4)(a0)
+ sw s2, ((S2 + 3) * 4)(a0)
+ sw s3, ((S3 + 3) * 4)(a0)
+ sw s4, ((S4 + 3) * 4)(a0)
+ sw s5, ((S5 + 3) * 4)(a0)
+ sw s6, ((S6 + 3) * 4)(a0)
+ sw s7, ((S7 + 3) * 4)(a0)
+ sw sp, ((SP + 3) * 4)(a0)
+ sw s8, ((S8 + 3) * 4)(a0)
+ cfc1 v0, $31 # too bad cant check if FP used
+ swc1 $f20, ((20 + 38) * 4)(a0)
+ swc1 $f21, ((21 + 38) * 4)(a0)
+ swc1 $f22, ((22 + 38) * 4)(a0)
+ swc1 $f23, ((23 + 38) * 4)(a0)
+ swc1 $f24, ((24 + 38) * 4)(a0)
+ swc1 $f25, ((25 + 38) * 4)(a0)
+ swc1 $f26, ((26 + 38) * 4)(a0)
+ swc1 $f27, ((27 + 38) * 4)(a0)
+ swc1 $f28, ((28 + 38) * 4)(a0)
+ swc1 $f29, ((29 + 38) * 4)(a0)
+ swc1 $f30, ((30 + 38) * 4)(a0)
+ swc1 $f31, ((31 + 38) * 4)(a0)
+ sw v0, ((32 + 38) * 4)(a0)
+ j ra
+ move v0, zero
+END(_setjmp)
+
+LEAF(_longjmp)
+#ifdef ABICALLS
+ subu sp, sp, 32
+ .cprestore 16
+#endif
+ .set noreorder
+ lw v0, (3 * 4)(a0) # get magic number
+ lw ra, (2 * 4)(a0)
+ bne v0, 0xACEDBADE, botch # jump if error
+
+ addu sp, sp, 32 # does not matter, sanity
+ lw s0, ((S0 + 3) * 4)(a0)
+ lw s1, ((S1 + 3) * 4)(a0)
+ lw s2, ((S2 + 3) * 4)(a0)
+ lw s3, ((S3 + 3) * 4)(a0)
+ lw s4, ((S4 + 3) * 4)(a0)
+ lw s5, ((S5 + 3) * 4)(a0)
+ lw s6, ((S6 + 3) * 4)(a0)
+ lw s7, ((S7 + 3) * 4)(a0)
+ lw v0, ((32 + 38) * 4)(a0) # get fpu status
+ lw sp, ((SP + 3) * 4)(a0)
+ lw s8, ((S8 + 3) * 4)(a0)
+ ctc1 v0, $31
+ lwc1 $f20, ((20 + 38) * 4)(a0)
+ lwc1 $f21, ((21 + 38) * 4)(a0)
+ lwc1 $f22, ((22 + 38) * 4)(a0)
+ lwc1 $f23, ((23 + 38) * 4)(a0)
+ lwc1 $f24, ((24 + 38) * 4)(a0)
+ lwc1 $f25, ((25 + 38) * 4)(a0)
+ lwc1 $f26, ((26 + 38) * 4)(a0)
+ lwc1 $f27, ((27 + 38) * 4)(a0)
+ lwc1 $f28, ((28 + 38) * 4)(a0)
+ lwc1 $f29, ((29 + 38) * 4)(a0)
+ lwc1 $f30, ((30 + 38) * 4)(a0)
+ lwc1 $f31, ((31 + 38) * 4)(a0)
+
+ j ra
+ move v0, a1
+botch:
+ jal _C_LABEL(longjmperror)
+ nop
+ jal _C_LABEL(abort)
+ nop
+END(_longjmp)
diff --git a/lib/libc/mips/gen/fabs.S b/lib/libc/mips/gen/fabs.S
new file mode 100644
index 0000000..5306870
--- /dev/null
+++ b/lib/libc/mips/gen/fabs.S
@@ -0,0 +1,54 @@
+/*-
+ * Copyright (c) 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Ralph Campbell.
+ *
+ * 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.
+ */
+
+#include <machine/asm.h>
+
+#if defined(LIBC_SCCS)
+ .text
+ .asciz "$OpenBSD$"
+#endif /* LIBC_SCCS */
+
+/*
+ * fabs(x)
+ * double x;
+ *
+ * Return absolute value of x.
+ */
+LEAF(fabs)
+ .set noreorder
+ j ra
+ abs.d $f0, $f12 # compute absolute value of x
+END(fabs)
diff --git a/lib/libc/mips/gen/flt_rounds.c b/lib/libc/mips/gen/flt_rounds.c
new file mode 100644
index 0000000..289ed7c
--- /dev/null
+++ b/lib/libc/mips/gen/flt_rounds.c
@@ -0,0 +1,27 @@
+/*
+ * Written by J.T. Conklin, Apr 11, 1995
+ * Public domain.
+ */
+
+#include <sys/types.h>
+#include <machine/float.h>
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char rcsid[] = "$OpenBSD: flt_rounds.c,v 1.3 1997/08/01 21:36:28 deraadt Exp $";
+#endif /* LIBC_SCCS and not lint */
+
+static const int map[] = {
+ 1, /* round to nearest */
+ 0, /* round to zero */
+ 2, /* round to positive infinity */
+ 3 /* round to negative infinity */
+};
+
+int
+__flt_rounds()
+{
+ int x;
+
+ __asm__("cfc1 %0,$31" : "=r" (x));
+ return map[x & 0x03];
+}
diff --git a/lib/libc/mips/gen/fpgetmask.c b/lib/libc/mips/gen/fpgetmask.c
new file mode 100644
index 0000000..8c1a53e
--- /dev/null
+++ b/lib/libc/mips/gen/fpgetmask.c
@@ -0,0 +1,19 @@
+/*
+ * Written by J.T. Conklin, Apr 11, 1995
+ * Public domain.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char rcsid[] = "$OpenBSD$";
+#endif /* LIBC_SCCS and not lint */
+
+#include <ieeefp.h>
+
+fp_except
+fpgetmask()
+{
+ int x;
+
+ __asm__("cfc1 %0,$31" : "=r" (x));
+ return (x >> 7) & 0x1f;
+}
diff --git a/lib/libc/mips/gen/fpgetround.c b/lib/libc/mips/gen/fpgetround.c
new file mode 100644
index 0000000..565f7c8
--- /dev/null
+++ b/lib/libc/mips/gen/fpgetround.c
@@ -0,0 +1,19 @@
+/*
+ * Written by J.T. Conklin, Apr 11, 1995
+ * Public domain.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char rcsid[] = "$OpenBSD$";
+#endif /* LIBC_SCCS and not lint */
+
+#include <ieeefp.h>
+
+fp_rnd
+fpgetround()
+{
+ int x;
+
+ __asm__("cfc1 %0,$31" : "=r" (x));
+ return x & 0x03;
+}
diff --git a/lib/libc/mips/gen/fpgetsticky.c b/lib/libc/mips/gen/fpgetsticky.c
new file mode 100644
index 0000000..f7057ff
--- /dev/null
+++ b/lib/libc/mips/gen/fpgetsticky.c
@@ -0,0 +1,19 @@
+/*
+ * Written by J.T. Conklin, Apr 11, 1995
+ * Public domain.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char rcsid[] = "$OpenBSD$";
+#endif /* LIBC_SCCS and not lint */
+
+#include <ieeefp.h>
+
+fp_except
+fpgetsticky()
+{
+ int x;
+
+ __asm__("cfc1 %0,$31" : "=r" (x));
+ return (x >> 2) & 0x1f;
+}
diff --git a/lib/libc/mips/gen/fpsetmask.c b/lib/libc/mips/gen/fpsetmask.c
new file mode 100644
index 0000000..c57f52f
--- /dev/null
+++ b/lib/libc/mips/gen/fpsetmask.c
@@ -0,0 +1,28 @@
+/*
+ * Written by J.T. Conklin, Apr 11, 1995
+ * Public domain.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char rcsid[] = "$OpenBSD$";
+#endif /* LIBC_SCCS and not lint */
+
+#include <ieeefp.h>
+
+fp_except
+fpsetmask(mask)
+ fp_except mask;
+{
+ fp_except old;
+ fp_except new;
+
+ __asm__("cfc1 %0,$31" : "=r" (old));
+
+ new = old;
+ new &= ~(0x1f << 7);
+ new |= ((mask & 0x1f) << 7);
+
+ __asm__("ctc1 %0,$31" : : "r" (new));
+
+ return (old >> 7) & 0x1f;
+}
diff --git a/lib/libc/mips/gen/fpsetround.c b/lib/libc/mips/gen/fpsetround.c
new file mode 100644
index 0000000..9516d34
--- /dev/null
+++ b/lib/libc/mips/gen/fpsetround.c
@@ -0,0 +1,28 @@
+/*
+ * Written by J.T. Conklin, Apr 11, 1995
+ * Public domain.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char rcsid[] = "$OpenBSD$";
+#endif /* LIBC_SCCS and not lint */
+
+#include <ieeefp.h>
+
+fp_rnd
+fpsetround(rnd_dir)
+ fp_rnd rnd_dir;
+{
+ fp_rnd old;
+ fp_rnd new;
+
+ __asm__("cfc1 %0,$31" : "=r" (old));
+
+ new = old;
+ new &= ~0x03;
+ new |= (rnd_dir & 0x03);
+
+ __asm__("ctc1 %0,$31" : : "r" (new));
+
+ return old & 0x03;
+}
diff --git a/lib/libc/mips/gen/fpsetsticky.c b/lib/libc/mips/gen/fpsetsticky.c
new file mode 100644
index 0000000..493c3a0
--- /dev/null
+++ b/lib/libc/mips/gen/fpsetsticky.c
@@ -0,0 +1,28 @@
+/*
+ * Written by J.T. Conklin, Apr 11, 1995
+ * Public domain.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char rcsid[] = "$OpenBSD$";
+#endif /* LIBC_SCCS and not lint */
+
+#include <ieeefp.h>
+
+fp_except
+fpsetsticky(sticky)
+ fp_except sticky;
+{
+ fp_except old;
+ fp_except new;
+
+ __asm__("cfc1 %0,$31" : "=r" (old));
+
+ new = old;
+ new &= ~(0x1f << 2);
+ new |= ((sticky & 0x1f) << 2);
+
+ __asm__("ctc1 %0,$31" : : "r" (new));
+
+ return (old >> 2) & 0x1f;
+}
diff --git a/lib/libc/mips/gen/frexp.c b/lib/libc/mips/gen/frexp.c
new file mode 100644
index 0000000..181e1dc
--- /dev/null
+++ b/lib/libc/mips/gen/frexp.c
@@ -0,0 +1,73 @@
+/*-
+ * Copyright (c) 1991, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * 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.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char rcsid[] = "$OpenBSD: frexp.c,v 1.3 1997/07/23 20:55:24 kstailey Exp $";
+#endif /* LIBC_SCCS and not lint */
+
+#include <sys/types.h>
+#include <machine/endian.h>
+#include <math.h>
+
+double
+frexp(value, eptr)
+ double value;
+ int *eptr;
+{
+ union {
+ double v;
+ struct {
+#if BYTE_ORDER == LITTLE_ENDIAN
+ u_int u_mant2 : 32;
+ u_int u_mant1 : 20;
+ u_int u_exp : 11;
+ u_int u_sign : 1;
+#else
+ u_int u_sign : 1;
+ u_int u_exp : 11;
+ u_int u_mant1 : 20;
+ u_int u_mant2 : 32;
+#endif
+ } s;
+ } u;
+
+ if (value) {
+ u.v = value;
+ *eptr = u.s.u_exp - 1022;
+ u.s.u_exp = 1022;
+ return(u.v);
+ } else {
+ *eptr = 0;
+ return((double)0);
+ }
+}
diff --git a/lib/libc/mips/gen/infinity.c b/lib/libc/mips/gen/infinity.c
new file mode 100644
index 0000000..7a0b131
--- /dev/null
+++ b/lib/libc/mips/gen/infinity.c
@@ -0,0 +1,15 @@
+/* infinity.c */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char rcsid[] = "$OpenBSD: infinity.c,v 1.2 1996/08/19 08:16:01 tholo Exp $";
+#endif /* LIBC_SCCS and not lint */
+
+#include <math.h>
+#include <sys/types.h>
+
+/* bytes for +Infinity on a MIPS */
+#if BYTE_ORDER == BIG_ENDIAN
+char __infinity[] = { 0x7f, 0xf0, 0, 0, 0, 0, 0, 0 };
+#else
+char __infinity[] = { 0, 0, 0, 0, 0, 0, 0xf0, 0x7f };
+#endif
diff --git a/lib/libc/mips/gen/isinf.S b/lib/libc/mips/gen/isinf.S
new file mode 100644
index 0000000..e872cd7
--- /dev/null
+++ b/lib/libc/mips/gen/isinf.S
@@ -0,0 +1,95 @@
+/*-
+ * Copyright (c) 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Ralph Campbell.
+ *
+ * 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.
+ */
+
+#include <machine/asm.h>
+
+#if defined(LIBC_SCCS)
+ .text
+ .asciz "$OpenBSD$"
+#endif /* LIBC_SCCS */
+
+#define DEXP_INF 0x7ff
+
+/*
+ * isnan(x)
+ * double x;
+ *
+ * Return true if x is a NAN.
+ */
+LEAF(isnan)
+ .set noreorder
+ mfc1 v1, $f13 # get MSW of x
+ mfc1 t3, $f12 # get LSW of x
+ sll t1, v1, 1 # get x exponent
+ srl t1, t1, 32 - 11
+ bne t1, DEXP_INF, 2f # is it a finite number?
+ sll t2, v1, 32 - 20 # get x fraction
+ bne t3, zero, 1f # is it a NAN?
+ nop
+ beq t2, zero, 2f # its infinity
+ nop
+1:
+ j ra
+ li v0, 1 # x is a NAN
+2:
+ j ra
+ move v0, zero # x is NOT a NAN
+END(isnan)
+
+/*
+ * isinf(x)
+ * double x;
+ *
+ * Return true if x is infinity.
+ */
+LEAF(isinf)
+ .set noreorder
+ mfc1 v1, $f13 # get MSW of x
+ mfc1 t3, $f12 # get LSW of x
+ sll t1, v1, 1 # get x exponent
+ srl t1, t1, 32 - 11
+ bne t1, DEXP_INF, 1f # is it a finite number?
+ sll t2, v1, 32 - 20 # get x fraction
+ bne t3, zero, 1f # is it a NAN?
+ nop
+ bne t2, zero, 1f # is it a NAN?
+ nop
+ j ra
+ li v0, 1 # x is infinity
+1:
+ j ra
+ move v0, zero # x is NOT infinity
+END(isinf)
diff --git a/lib/libc/mips/gen/ldexp.S b/lib/libc/mips/gen/ldexp.S
new file mode 100644
index 0000000..5aa6131
--- /dev/null
+++ b/lib/libc/mips/gen/ldexp.S
@@ -0,0 +1,217 @@
+/*-
+ * Copyright (c) 1991, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Ralph Campbell.
+ *
+ * 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.
+ */
+
+#include <machine/asm.h>
+
+#if defined(LIBC_SCCS)
+ .text
+ .asciz "$OpenBSD$"
+#endif /* LIBC_SCCS */
+
+#define DEXP_INF 0x7ff
+#define DEXP_BIAS 1023
+#define DEXP_MIN -1022
+#define DEXP_MAX 1023
+#define DFRAC_BITS 52
+#define DIMPL_ONE 0x00100000
+#define DLEAD_ZEROS 31 - 20
+#define STICKYBIT 1
+#define GUARDBIT 0x80000000
+#define DSIGNAL_NAN 0x00040000
+#define DQUIET_NAN0 0x0007ffff
+#define DQUIET_NAN1 0xffffffff
+
+/*
+ * double ldexp(x, N)
+ * double x; int N;
+ *
+ * Return x * (2**N), for integer values N.
+ */
+LEAF(ldexp)
+ .set reorder
+ mfc1 v1, $f13 # get MSW of x
+ mfc1 t3, $f12 # get LSW of x
+ sll t1, v1, 1 # get x exponent
+ srl t1, t1, 32 - 11
+ beq t1, DEXP_INF, 9f # is it a NAN or infinity?
+ beq t1, zero, 1f # zero or denormalized number?
+ addu t1, t1, a2 # scale exponent
+ sll v0, a2, 20 # position N for addition
+ bge t1, DEXP_INF, 8f # overflow?
+ addu v0, v0, v1 # multiply by (2**N)
+ ble t1, zero, 4f # underflow?
+ mtc1 v0, $f1 # save MSW of result
+ mtc1 t3, $f0 # save LSW of result
+ j ra
+1:
+ sll t2, v1, 32 - 20 # get x fraction
+ srl t2, t2, 32 - 20
+ srl t0, v1, 31 # get x sign
+ bne t2, zero, 1f
+ beq t3, zero, 9f # result is zero
+1:
+/*
+ * Find out how many leading zero bits are in t2,t3 and put in t9.
+ */
+ move v0, t2
+ move t9, zero
+ bne t2, zero, 1f
+ move v0, t3
+ addu t9, 32
+1:
+ srl t4, v0, 16
+ bne t4, zero, 1f
+ addu t9, 16
+ sll v0, 16
+1:
+ srl t4, v0, 24
+ bne t4, zero, 1f
+ addu t9, 8
+ sll v0, 8
+1:
+ srl t4, v0, 28
+ bne t4, zero, 1f
+ addu t9, 4
+ sll v0, 4
+1:
+ srl t4, v0, 30
+ bne t4, zero, 1f
+ addu t9, 2
+ sll v0, 2
+1:
+ srl t4, v0, 31
+ bne t4, zero, 1f
+ addu t9, 1
+/*
+ * Now shift t2,t3 the correct number of bits.
+ */
+1:
+ subu t9, t9, DLEAD_ZEROS # dont count normal leading zeros
+ li t1, DEXP_MIN + DEXP_BIAS
+ subu t1, t1, t9 # adjust exponent
+ addu t1, t1, a2 # scale exponent
+ li v0, 32
+ blt t9, v0, 1f
+ subu t9, t9, v0 # shift fraction left >= 32 bits
+ sll t2, t3, t9
+ move t3, zero
+ b 2f
+1:
+ subu v0, v0, t9 # shift fraction left < 32 bits
+ sll t2, t2, t9
+ srl t4, t3, v0
+ or t2, t2, t4
+ sll t3, t3, t9
+2:
+ bge t1, DEXP_INF, 8f # overflow?
+ ble t1, zero, 4f # underflow?
+ sll t2, t2, 32 - 20 # clear implied one bit
+ srl t2, t2, 32 - 20
+3:
+ sll t1, t1, 31 - 11 # reposition exponent
+ sll t0, t0, 31 # reposition sign
+ or t0, t0, t1 # put result back together
+ or t0, t0, t2
+ mtc1 t0, $f1 # save MSW of result
+ mtc1 t3, $f0 # save LSW of result
+ j ra
+4:
+ li v0, 0x80000000
+ ble t1, -52, 7f # is result too small for denorm?
+ sll t2, v1, 31 - 20 # clear exponent, extract fraction
+ or t2, t2, v0 # set implied one bit
+ blt t1, -30, 2f # will all bits in t3 be shifted out?
+ srl t2, t2, 31 - 20 # shift fraction back to normal position
+ subu t1, t1, 1
+ sll t4, t2, t1 # shift right t2,t3 based on exponent
+ srl t8, t3, t1 # save bits shifted out
+ negu t1
+ srl t3, t3, t1
+ or t3, t3, t4
+ srl t2, t2, t1
+ bge t8, zero, 1f # does result need to be rounded?
+ addu t3, t3, 1 # round result
+ sltu t4, t3, 1
+ sll t8, t8, 1
+ addu t2, t2, t4
+ bne t8, zero, 1f # round result to nearest
+ and t3, t3, ~1
+1:
+ mtc1 t3, $f0 # save denormalized result (LSW)
+ mtc1 t2, $f1 # save denormalized result (MSW)
+ bge v1, zero, 1f # should result be negative?
+ neg.d $f0, $f0 # negate result
+1:
+ j ra
+2:
+ mtc1 zero, $f1 # exponent and upper fraction
+ addu t1, t1, 20 # compute amount to shift right by
+ sll t8, t2, t1 # save bits shifted out
+ negu t1
+ srl t3, t2, t1
+ bge t8, zero, 1f # does result need to be rounded?
+ addu t3, t3, 1 # round result
+ sltu t4, t3, 1
+ sll t8, t8, 1
+ mtc1 t4, $f1 # exponent and upper fraction
+ bne t8, zero, 1f # round result to nearest
+ and t3, t3, ~1
+1:
+ mtc1 t3, $f0
+ bge v1, zero, 1f # is result negative?
+ neg.d $f0, $f0 # negate result
+1:
+ j ra
+7:
+ mtc1 zero, $f0 # result is zero
+ mtc1 zero, $f1
+ beq t0, zero, 1f # is result positive?
+ neg.d $f0, $f0 # negate result
+1:
+ j ra
+8:
+ li t1, 0x7ff00000 # result is infinity (MSW)
+ mtc1 t1, $f1
+ mtc1 zero, $f0 # result is infinity (LSW)
+ bge v1, zero, 1f # should result be negative infinity?
+ neg.d $f0, $f0 # result is negative infinity
+1:
+ add.d $f0, $f0 # cause overflow faults if enabled
+ j ra
+9:
+ mov.d $f0, $f12 # yes, result is just x
+ j ra
+END(ldexp)
diff --git a/lib/libc/mips/gen/modf.S b/lib/libc/mips/gen/modf.S
new file mode 100644
index 0000000..057feaa
--- /dev/null
+++ b/lib/libc/mips/gen/modf.S
@@ -0,0 +1,75 @@
+/*-
+ * Copyright (c) 1991, 1993, 1995
+ * The Regents of the University of California. All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Ralph Campbell.
+ *
+ * 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.
+ */
+
+#include <machine/asm.h>
+
+#if defined(LIBC_SCCS)
+ .text
+ .asciz "$OpenBSD$"
+#endif /* LIBC_SCCS */
+
+/*
+ * double modf(val, iptr)
+ * double val, *iptr;
+ * returns: xxx and n (in *iptr) where val == n.xxx
+ */
+LEAF(modf)
+ .set reorder
+ cfc1 t0, $31 # get the control register
+ li.d $f2, 4503599627370496e0 # f2 <- 2^52
+
+ or t1, t0, 0x3 # set rounding mode to round to zero
+ xor t1, t1, 0x2 # (i.e., 01)
+ ctc1 t1, $31
+
+ mov.d $f0, $f12 # f0 <- f12
+ abs.d $f4, $f12 # f4 <- |f12|
+ c.olt.d $f4, $f2 # f4 ? < f2
+ bc1f 1f # leave f0 alone if Nan, infinity
+ # or >=2^52
+ c.eq.d $f12,$f4 # was f12 positive ?
+ add.d $f4,$f2,$f4 # round off to integer
+ bc1f 2f # No -> will have to negate result
+ sub.d $f0,$f4,$f2 # Remove fudge factor
+ j 1f # integer fraction got
+2:
+ sub.d $f0,$f2,$f4 # Remove fudge factor and negate
+1:
+ ctc1 t0, $31 # restore old rounding mode
+ s.d $f0, 0(a2) # save the integer part
+ sub.d $f0, $f12, $f0 # subtract val - integer part
+ j ra
+END(modf)
diff --git a/lib/libc/mips/gen/setjmp.S b/lib/libc/mips/gen/setjmp.S
new file mode 100644
index 0000000..0abfed8
--- /dev/null
+++ b/lib/libc/mips/gen/setjmp.S
@@ -0,0 +1,128 @@
+/*-
+ * Copyright (c) 1991, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Ralph Campbell.
+ *
+ * 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.
+ */
+
+#include <sys/syscall.h>
+#include <machine/asm.h>
+#include <machine/regnum.h>
+
+#if defined(LIBC_SCCS)
+ .text
+ .asciz "$OpenBSD: setjmp.S,v 1.6 1997/07/23 20:55:25 kstailey Exp $"
+#endif /* LIBC_SCCS */
+
+/*
+ * C library -- setjmp, longjmp
+ *
+ * longjmp(a,v)
+ * will generate a "return(v)" from
+ * the last call to
+ * setjmp(a)
+ * by restoring registers from the stack,
+ * and a struct sigcontext, see <signal.h>
+ */
+
+#define SETJMP_FRAME_SIZE (STAND_FRAME_SIZE + 12)
+
+NON_LEAF(setjmp, SETJMP_FRAME_SIZE, ra)
+ .mask 0x80000000, (STAND_RA_OFFSET - STAND_FRAME_SIZE)
+ subu sp, sp, SETJMP_FRAME_SIZE # allocate stack frame
+#ifdef ABICALLS
+ .cprestore 16
+#endif
+ .set reorder
+ sw ra, STAND_RA_OFFSET(sp) # save state
+ sw a0, SETJMP_FRAME_SIZE(sp)
+ move a0, zero # get current signal mask
+ jal _C_LABEL(sigblock)
+ lw v1, SETJMP_FRAME_SIZE(sp) # v1 = jmpbuf
+ sw v0, (1 * 4)(v1) # save sc_mask = sigblock(0)
+ move a0, zero
+ addu a1, sp, STAND_FRAME_SIZE # pointer to struct sigaltstack
+ jal _C_LABEL(sigaltstack)
+ lw a0, SETJMP_FRAME_SIZE(sp) # restore jmpbuf
+ lw v1, STAND_FRAME_SIZE+8(sp) # get old ss_onstack
+ and v1, v1, 1 # extract onstack flag
+ sw v1, 0(a0) # save it in sc_onstack
+ lw ra, STAND_RA_OFFSET(sp)
+ addu sp, sp, SETJMP_FRAME_SIZE
+ blt v0, zero, botch # check for sigstack() error
+ sw ra, (2 * 4)(a0) # sc_pc = return address
+ li v0, 0xACEDBADE # sigcontext magic number
+ sw v0, ((ZERO + 3) * 4)(a0) # saved in sc_regs[0]
+ sw s0, ((S0 + 3) * 4)(a0)
+ sw s1, ((S1 + 3) * 4)(a0)
+ sw s2, ((S2 + 3) * 4)(a0)
+ sw s3, ((S3 + 3) * 4)(a0)
+ sw s4, ((S4 + 3) * 4)(a0)
+ sw s5, ((S5 + 3) * 4)(a0)
+ sw s6, ((S6 + 3) * 4)(a0)
+ sw s7, ((S7 + 3) * 4)(a0)
+ sw gp, ((GP + 3) * 4)(a0)
+ sw sp, ((SP + 3) * 4)(a0)
+ sw s8, ((S8 + 3) * 4)(a0)
+ li v0, 1 # be nice if we could tell
+ sw v0, (37 * 4)(a0) # sc_fpused = 1
+ cfc1 v0, $31
+ swc1 $f20, ((20 + 38) * 4)(a0)
+ swc1 $f21, ((21 + 38) * 4)(a0)
+ swc1 $f22, ((22 + 38) * 4)(a0)
+ swc1 $f23, ((23 + 38) * 4)(a0)
+ swc1 $f24, ((24 + 38) * 4)(a0)
+ swc1 $f25, ((25 + 38) * 4)(a0)
+ swc1 $f26, ((26 + 38) * 4)(a0)
+ swc1 $f27, ((27 + 38) * 4)(a0)
+ swc1 $f28, ((28 + 38) * 4)(a0)
+ swc1 $f29, ((29 + 38) * 4)(a0)
+ swc1 $f30, ((30 + 38) * 4)(a0)
+ swc1 $f31, ((31 + 38) * 4)(a0)
+ sw v0, ((32 + 38) * 4)(a0)
+ move v0, zero
+ j ra
+END(setjmp)
+
+LEAF(longjmp)
+#ifdef ABICALLS
+ subu sp, sp, 32
+ .cprestore 16
+#endif
+ .set reorder
+ sw a1, ((V0 + 3) * 4)(a0) # save return value in sc_regs[V0]
+ li v0, SYS_sigreturn
+ syscall
+botch:
+ jal _C_LABEL(longjmperror)
+ jal _C_LABEL(abort)
+END(longjmp)
diff --git a/lib/libc/mips/gen/sigsetjmp.S b/lib/libc/mips/gen/sigsetjmp.S
new file mode 100644
index 0000000..4a7d414
--- /dev/null
+++ b/lib/libc/mips/gen/sigsetjmp.S
@@ -0,0 +1,78 @@
+/*-
+ * Copyright (c) 1991, 1993, 1995,
+ * The Regents of the University of California. All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Havard Eidnes.
+ *
+ * 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.
+ */
+
+#include <sys/syscall.h>
+#include <machine/regnum.h>
+#include <machine/asm.h>
+#include <machine/setjmp.h>
+
+#if defined(LIBC_SCCS)
+ .text
+ .asciz "$OpenBSD$"
+#endif /* LIBC_SCCS */
+
+/*
+ * C library -- sigsetjmp, siglongjmp
+ *
+ * siglongjmp(a,v)
+ * will generate a "return(v)" from
+ * the last call to
+ * sigsetjmp(a, savemask)
+ * by restoring registers from the stack,
+ * and dependent on savemask restores the
+ * signal mask.
+ */
+
+LEAF(sigsetjmp)
+ .set reorder
+ sw a1, (_JBLEN*4)(a0) # save "savemask"
+ bne a1, 0x0, 1f # do saving of signal mask?
+ la t9, _setjmp
+ jr t9
+
+1: la t9, setjmp
+ jr t9
+END(sigsetjmp)
+
+LEAF(siglongjmp)
+ .set reorder
+ lw t0, (_JBLEN * 4)(a0) # get "savemask"
+ bne t0, 0x0, 1f # restore signal mask?
+ la t9, _longjmp
+ jr t9
+1: la t9, longjmp
+ jr t9
+END(siglongjmp)
OpenPOWER on IntegriCloud