summaryrefslogtreecommitdiff
path: root/sys/lib
diff options
context:
space:
mode:
authorJason Wright <jason@cvs.openbsd.org>2001-08-19 05:14:36 +0000
committerJason Wright <jason@cvs.openbsd.org>2001-08-19 05:14:36 +0000
commita8ea2c841b93677a32aceb73fb75979a74ad725b (patch)
treed9a29d0917550d56cc50fef2fc59fac6463ef45e /sys/lib
parentb4a11f439bce0c110f0da9ba7c468f745b8de7db (diff)
libkern sparc64 stuff (mostly from NetBSD... lightly modified... with a side of bacon)
Diffstat (limited to 'sys/lib')
-rw-r--r--sys/lib/libkern/arch/sparc64/DEFS.h43
-rw-r--r--sys/lib/libkern/arch/sparc64/Makefile.inc38
-rw-r--r--sys/lib/libkern/arch/sparc64/SYS.h110
-rw-r--r--sys/lib/libkern/arch/sparc64/_setjmp.S117
-rw-r--r--sys/lib/libkern/arch/sparc64/bzero.S165
-rw-r--r--sys/lib/libkern/arch/sparc64/divrem.m4280
-rw-r--r--sys/lib/libkern/arch/sparc64/ffs.S118
-rw-r--r--sys/lib/libkern/arch/sparc64/htonl.S55
-rw-r--r--sys/lib/libkern/arch/sparc64/htons.S54
-rw-r--r--sys/lib/libkern/arch/sparc64/mul.S188
-rw-r--r--sys/lib/libkern/arch/sparc64/ntohl.S55
-rw-r--r--sys/lib/libkern/arch/sparc64/ntohs.S56
-rw-r--r--sys/lib/libkern/arch/sparc64/random.S88
-rw-r--r--sys/lib/libkern/arch/sparc64/saveregs.S61
-rw-r--r--sys/lib/libkern/arch/sparc64/setjmp.S118
-rw-r--r--sys/lib/libkern/arch/sparc64/strlen.S59
-rw-r--r--sys/lib/libkern/arch/sparc64/umul.S192
17 files changed, 1797 insertions, 0 deletions
diff --git a/sys/lib/libkern/arch/sparc64/DEFS.h b/sys/lib/libkern/arch/sparc64/DEFS.h
new file mode 100644
index 00000000000..f0a68d6c4df
--- /dev/null
+++ b/sys/lib/libkern/arch/sparc64/DEFS.h
@@ -0,0 +1,43 @@
+/* $NetBSD: DEFS.h,v 1.1.1.1 1998/06/20 05:18:14 eeh Exp $ */
+
+/*-
+ * Copyright (c) 1992, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * This software was developed by the Computer Systems Engineering group
+ * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
+ * contributed to Berkeley.
+ *
+ * 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.
+ *
+ * @(#)DEFS.h 8.1 (Berkeley) 6/4/93
+ */
+
+#include <machine/asm.h>
+
diff --git a/sys/lib/libkern/arch/sparc64/Makefile.inc b/sys/lib/libkern/arch/sparc64/Makefile.inc
new file mode 100644
index 00000000000..f6fb463fb01
--- /dev/null
+++ b/sys/lib/libkern/arch/sparc64/Makefile.inc
@@ -0,0 +1,38 @@
+# $NetBSD: Makefile.inc,v 1.4 2000/11/01 19:37:20 thorpej Exp $
+
+SRCS+= __main.c \
+ imax.c imin.c lmax.c lmin.c max.c min.c ulmax.c ulmin.c \
+ bcmp.c ffs.S \
+ memchr.c memcmp.c \
+ strcat.c strcmp.c strcpy.c strlen.S \
+ strncasecmp.c strncmp.c strncpy.c \
+ scanc.c skpc.c \
+ htonl.S htons.S ntohl.S ntohs.S
+
+SRCS+= umul.S mul.S rem.S sdiv.S udiv.S umul.S urem.S
+SRCS+= mul.S saveregs.S umul.S
+
+# `source' files built from m4 source
+# the name `div.o' is taken for the ANSI C `div' function, hence sdiv here
+SRCS+= rem.S sdiv.S udiv.S urem.S
+CLEANFILES+=rem.S sdiv.S udiv.S urem.S
+
+sdiv.S: $M/divrem.m4
+ echo 'building ${.TARGET} from ${.ALLSRC}'
+ (echo "define(NAME,\`.div')define(OP,\`div')define(S,\`true')"; \
+ cat ${.ALLSRC}) | m4 > ${.TARGET}
+
+udiv.S: $M/divrem.m4
+ @echo 'building ${.TARGET} from ${.ALLSRC}'
+ @(echo "define(NAME,\`.udiv')define(OP,\`div')define(S,\`false')"; \
+ cat ${.ALLSRC}) | m4 > ${.TARGET}
+
+rem.S: $M/divrem.m4
+ echo 'building ${.TARGET} from ${.ALLSRC}'
+ (echo "define(NAME,\`.rem')define(OP,\`rem')define(S,\`true')"; \
+ cat ${.ALLSRC}) | m4 > ${.TARGET}
+
+urem.S: $M/divrem.m4
+ @echo 'building ${.TARGET} from ${.ALLSRC}'
+ @(echo "define(NAME,\`.urem')define(OP,\`rem')define(S,\`false')"; \
+ cat ${.ALLSRC}) | m4 > ${.TARGET}
diff --git a/sys/lib/libkern/arch/sparc64/SYS.h b/sys/lib/libkern/arch/sparc64/SYS.h
new file mode 100644
index 00000000000..753fadc0570
--- /dev/null
+++ b/sys/lib/libkern/arch/sparc64/SYS.h
@@ -0,0 +1,110 @@
+/* $NetBSD: SYS.h,v 1.2 1999/02/15 04:54:36 hubertf Exp $ */
+/*-
+ * Copyright (c) 1992, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * This software was developed by the Computer Systems Engineering group
+ * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
+ * contributed to Berkeley.
+ *
+ * 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.
+ *
+ * @(#)SYS.h 8.1 (Berkeley) 6/4/93
+ *
+ * from: Header: SYS.h,v 1.2 92/07/03 18:57:00 torek Exp
+ * $Id: SYS.h,v 1.1 2001/08/19 05:14:35 jason Exp $
+ */
+
+#include <machine/asm.h>
+#include <sys/syscall.h>
+#include <machine/trap.h>
+
+#ifdef __STDC__
+#define _CAT(x,y) x##y
+#else
+#define _CAT(x,y) x/**/y
+#endif
+
+/*
+ * ERROR branches to cerror. This is done with a macro so that I can
+ * change it to be position independent later, if need be.
+ */
+#ifdef PIC
+#define ERROR() \
+ PIC_PROLOGUE(%g1,%g2); \
+ ld [%g1+cerror],%g2; jmp %g2; nop
+#else
+#define ERROR() \
+ sethi %hi(cerror),%g1; or %lo(cerror),%g1,%g1; jmp %g1; nop
+#endif
+
+/*
+ * SYSCALL is used when further action must be taken before returning.
+ * Note that it adds a `nop' over what we could do, if we only knew what
+ * came at label 1....
+ */
+#define SYSCALL(x) \
+ ENTRY(x); mov _CAT(SYS_,x),%g1; t ST_SYSCALL; bcc 1f; nop; ERROR(); 1:
+
+/*
+ * RSYSCALL is used when the system call should just return. Here
+ * we use the SYSCALL_G2RFLAG to put the `success' return address in %g2
+ * and avoid a branch.
+ */
+#define RSYSCALL(x) \
+ ENTRY(x); mov (_CAT(SYS_,x))|SYSCALL_G2RFLAG,%g1; add %o7,8,%g2; \
+ t ST_SYSCALL; ERROR()
+
+/*
+ * PSEUDO(x,y) is like RSYSCALL(y) except that the name is x.
+ */
+#define PSEUDO(x,y) \
+ ENTRY(x); mov (_CAT(SYS_,y))|SYSCALL_G2RFLAG,%g1; add %o7,8,%g2; \
+ t ST_SYSCALL; ERROR()
+
+/*
+ * SYSCALL_NOERROR is like SYSCALL, except it's used for syscalls
+ * that never fail.
+ *
+ * XXX - This should be optimized.
+ */
+#define SYSCALL_NOERROR(x) \
+ ENTRY(x); mov _CAT(SYS_,x),%g1; t ST_SYSCALL
+
+/*
+ * RSYSCALL_NOERROR is like RSYSCALL, except it's used for syscalls
+ * that never fail.
+ *
+ * XXX - This should be optimized.
+ */
+#define RSYSCALL_NOERROR(x) \
+ ENTRY(x); mov (_CAT(SYS_,x))|SYSCALL_G2RFLAG,%g1; add %o7,8,%g2; \
+ t ST_SYSCALL
+
+ .globl cerror
diff --git a/sys/lib/libkern/arch/sparc64/_setjmp.S b/sys/lib/libkern/arch/sparc64/_setjmp.S
new file mode 100644
index 00000000000..4bf348d73f5
--- /dev/null
+++ b/sys/lib/libkern/arch/sparc64/_setjmp.S
@@ -0,0 +1,117 @@
+/* $NetBSD: _setjmp.S,v 1.1.1.1 1998/06/20 05:18:14 eeh Exp $ */
+
+/*
+ * Copyright (c) 1992, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * This software was developed by the Computer Systems Engineering group
+ * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
+ * contributed to Berkeley.
+ *
+ * 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.
+ *
+ * Header: _setjmp.s,v 1.1 91/07/06 16:45:53 torek Exp
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+#ifdef notdef
+ .asciz "@(#)_setjmp.s 8.1 (Berkeley) 6/4/93"
+#endif
+ .asciz "$NetBSD: _setjmp.S,v 1.1.1.1 1998/06/20 05:18:14 eeh Exp $"
+#endif /* LIBC_SCCS and not lint */
+
+/*
+ * C library -- _setjmp, _longjmp
+ *
+ * _longjmp(a,v)
+ * will generate a "return(v?v:1)" from
+ * the last call to
+ * _setjmp(a)
+ * by unwinding the call stack.
+ * The previous signal state is NOT restored.
+ */
+
+#include "DEFS.h"
+
+ENTRY(_setjmp)
+ btst 1, %sp
+ bne,a,pt %xcc, 1f ! 32 or 64-bit stack?
+ std %sp, [%o0+0] ! 32-bit stack pointer & return pc
+
+ stx %sp, [%o0+0] ! 64-bit stack pointer
+ stx %o7, [%o0+8] ! 64-bit return pc
+ stx %fp, [%o0+16] ! 64-bit frame pointer
+ retl
+ clr %o0
+1:
+ st %fp, [%o0+8] ! 32-bit frame pointer
+ retl
+ clr %o0
+
+ENTRY(_longjmp)
+ set 1, %g6
+ btst 1, %fp ! 32 or 64-bit stack?
+ movrz %o1, %o1, %g6 ! compute v ? v : 1 in a global register
+ bne,pt %xcc, 2f ! 64-bit
+ mov %o0, %g1 ! save a in another global register
+ ld [%g1+8], %g7 /* get caller's frame */
+
+1:
+ cmp %fp, %g7 ! compare against desired frame
+ bl,a 1b ! if below,
+ restore ! pop frame and loop
+ bne,pn %icc, Llongjmpbotch ! if there,
+ ldd [%g1+0], %o2 ! fetch return %sp and pc, and get out
+ ba,a,pt %icc, 4f
+2:
+ ldx [%g1+16], %g7 /* get caller's frame */
+
+3:
+ cmp %fp, %g7 ! compare against desired frame
+ bl,a,pt %xcc, 3b ! if below,
+ restore ! pop frame and loop
+ bne,pn %xcc, Llongjmpbotch ! if there,
+ ldx [%g1+0], %o2 ! fetch return %sp and pc, and get out
+ ldx [%g1+8], %o3
+4:
+ cmp %o2, %sp ! %sp must not decrease
+ blt,pn %icc, Llongjmpbotch
+ movge %icc, %o2, %sp ! it is OK, put it in place
+ jmp %o3 + 8 ! success, return %g6
+ mov %g6, %o0
+
+Lbotch:
+ call _longjmperror ! otherwise, went too far; bomb out
+ nop
+ unimp 0
+ ! otherwise, went too far; bomb out
+
+
+
+
diff --git a/sys/lib/libkern/arch/sparc64/bzero.S b/sys/lib/libkern/arch/sparc64/bzero.S
new file mode 100644
index 00000000000..de685fbd744
--- /dev/null
+++ b/sys/lib/libkern/arch/sparc64/bzero.S
@@ -0,0 +1,165 @@
+/* $NetBSD: bzero.S,v 1.1.1.1 1998/06/20 05:18:14 eeh Exp $ */
+
+/*
+ * Copyright (c) 1992, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * This software was developed by the Computer Systems Engineering group
+ * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
+ * contributed to Berkeley.
+ *
+ * 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.
+ *
+ * Header: bzero.s,v 1.1 92/06/25 12:52:46 torek Exp
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+#ifdef notdef
+ .asciz "@(#)bzero.s 8.1 (Berkeley) 6/4/93"
+#endif
+ .asciz "$NetBSD: bzero.S,v 1.1.1.1 1998/06/20 05:18:14 eeh Exp $"
+#endif /* LIBC_SCCS and not lint */
+
+#include "DEFS.h"
+
+/*
+ * bzero(addr, len)
+ *
+ * We should unroll the loop, but at the moment this would
+ * gain nothing since the `std' instructions are what limits us.
+ *
+ * I just changed all the `std's to `stx's. It still needs proper
+ * optimization using the block load/store ASIs.
+ */
+ENTRY(bzero)
+#ifdef NOT_DEBUG
+ save %sp, -176, %sp
+ mov %i0, %o1
+ set 9f, %o0
+ call prom_printf
+ mov %i1, %o2
+ ba 8f
+ restore
+9: .asciz "bzero(%p,%x)\r\n"
+ .align 4
+8:
+#endif
+ ! %o0 = addr, %o1 = len
+
+ ! Optimize a common case: addr and len are both multiples of 8.
+ or %o0, %o1, %o2
+ andcc %o2, 7, %g0 ! ((addr | len) & 7) != 0?
+ bnz 1f ! if so, cannot optimize
+ clr %g1 ! in any case, we want g1=0
+
+ /* `Good' operands, can just store doubles. */
+0:
+ deccc 8, %o1 ! while ((len -= 8) >= 0)
+ bge,a 0b
+ stx %g0, [%o0 + %o1] ! *(quad *)(addr + len) = 0;
+ retl
+ nop
+
+ /*
+ * Either the address is unaligned, or the count is not a
+ * multiple of 8, or both. We will have to align the address
+ * in order to use anything `better' than stb.
+ */
+1:
+ cmp %o1, 15 ! len >= 15?
+ bge,a Lstd ! yes, use std
+ andcc %o0, 1, %g0 ! (but first check alignment)
+
+ ! not enough to bother: do byte-at-a-time loop.
+2:
+ deccc %o1 ! while (--len >= 0)
+ bge,a 2b
+ stb %g0, [%o0 + %o1] ! addr[len] = 0;
+ retl
+ nop
+
+Lstd:
+ /*
+ * There are at least 15 bytes to zero.
+ * We may have to zero some initial stuff to align
+ * the address.
+ */
+ bz,a 1f ! if (addr & 1) {
+ andcc %o0, 2, %g0
+ stb %g0, [%o0] ! *addr = 0;
+ inc %o0 ! addr++;
+ dec %o1 ! len--;
+ andcc %o0, 2, %g0 ! }
+1:
+ bz,a 1f ! if (addr & 2) {
+ andcc %o0, 4, %g0
+ sth %g0, [%o0] ! *(short *)addr = 0;
+ inc 2, %o0 ! addr += 2;
+ dec 2, %o1 ! len -= 2;
+ andcc %o0, 4, %g0 ! }
+1:
+ bz 1f ! if (addr & 4) {
+ dec 8, %o1
+ st %g0, [%o0] ! *(int *)addr = 0;
+ inc 4, %o0 ! addr += 4;
+ dec 4, %o1 ! len -= 4;
+ ! }
+ /*
+ * Address is double word aligned; len is 8 less than
+ * the number of bytes remaining (i.e., len is 0 if
+ * the remaining count is 8, 1 if it is 9, etc.).
+ */
+1:
+ stx %g0, [%o0] ! do {
+2: ! *(quad *)addr = 0;
+ inc 8, %o0 ! addr += 8;
+ deccc 8, %o1 ! } while ((len -= 8) >= 0);
+ bge,a 2b
+ stx %g0, [%o0]
+
+ /*
+ * Len is in [-8..-1] where -8 => done, -7 => 1 byte to zero,
+ * -6 => two bytes, etc. Mop up this remainder, if any.
+ */
+ andcc %o1, 4, %g0
+ bz 1f ! if (len & 4) {
+ andcc %o1, 2, %g0
+ st %g0, [%o0] ! *(int *)addr = 0;
+ inc 4, %o0 ! addr += 4;
+1:
+ bz 1f ! if (len & 2) {
+ andcc %o1, 1, %g0
+ sth %g0, [%o0] ! *(short *)addr = 0;
+ inc 2, %o0 ! addr += 2;
+1:
+ bnz,a 1f ! if (len & 1)
+ stb %g0, [%o0] ! *addr = 0;
+1:
+ retl
+ nop
diff --git a/sys/lib/libkern/arch/sparc64/divrem.m4 b/sys/lib/libkern/arch/sparc64/divrem.m4
new file mode 100644
index 00000000000..52fd7e8efdd
--- /dev/null
+++ b/sys/lib/libkern/arch/sparc64/divrem.m4
@@ -0,0 +1,280 @@
+/* $NetBSD: divrem.m4,v 1.1.1.1 1998/06/20 05:18:14 eeh Exp $ */
+
+/*
+ * Copyright (c) 1992, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * This software was developed by the Computer Systems Engineering group
+ * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
+ * contributed to Berkeley.
+ *
+ * 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.
+ *
+ * Header: divrem.m4,v 1.4 92/06/25 13:23:57 torek Exp
+ */
+
+/*
+ * Division and remainder, from Appendix E of the Sparc Version 8
+ * Architecture Manual, with fixes from Gordon Irlam.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+#ifdef notdef
+ .asciz "@(#)divrem.m4 8.1 (Berkeley) 6/4/93"
+#endif
+ .asciz "$NetBSD: divrem.m4,v 1.1.1.1 1998/06/20 05:18:14 eeh Exp $"
+#endif /* LIBC_SCCS and not lint */
+
+/*
+ * Input: dividend and divisor in %o0 and %o1 respectively.
+ *
+ * m4 parameters:
+ * NAME name of function to generate
+ * OP OP=div => %o0 / %o1; OP=rem => %o0 % %o1
+ * S S=true => signed; S=false => unsigned
+ *
+ * Algorithm parameters:
+ * N how many bits per iteration we try to get (4)
+ * WORDSIZE total number of bits (32)
+ *
+ * Derived constants:
+ * TWOSUPN 2^N, for label generation (m4 exponentiation currently broken)
+ * TOPBITS number of bits in the top `decade' of a number
+ *
+ * Important variables:
+ * Q the partial quotient under development (initially 0)
+ * R the remainder so far, initially the dividend
+ * ITER number of main division loop iterations required;
+ * equal to ceil(log2(quotient) / N). Note that this
+ * is the log base (2^N) of the quotient.
+ * V the current comparand, initially divisor*2^(ITER*N-1)
+ *
+ * Cost:
+ * Current estimate for non-large dividend is
+ * ceil(log2(quotient) / N) * (10 + 7N/2) + C
+ * A large dividend is one greater than 2^(31-TOPBITS) and takes a
+ * different path, as the upper bits of the quotient must be developed
+ * one bit at a time.
+ */
+
+define(N, `4')
+define(TWOSUPN, `16')
+define(WORDSIZE, `32')
+define(TOPBITS, eval(WORDSIZE - N*((WORDSIZE-1)/N)))
+
+define(dividend, `%o0')
+define(divisor, `%o1')
+define(Q, `%o2')
+define(R, `%o3')
+define(ITER, `%o4')
+define(V, `%o5')
+
+/* m4 reminder: ifelse(a,b,c,d) => if a is b, then c, else d */
+define(T, `%g1')
+define(SC, `%g7')
+ifelse(S, `true', `define(SIGN, `%g6')')
+
+/*
+ * This is the recursive definition for developing quotient digits.
+ *
+ * Parameters:
+ * $1 the current depth, 1 <= $1 <= N
+ * $2 the current accumulation of quotient bits
+ * N max depth
+ *
+ * We add a new bit to $2 and either recurse or insert the bits in
+ * the quotient. R, Q, and V are inputs and outputs as defined above;
+ * the condition codes are expected to reflect the input R, and are
+ * modified to reflect the output R.
+ */
+define(DEVELOP_QUOTIENT_BITS,
+` ! depth $1, accumulated bits $2
+ bl L.$1.eval(TWOSUPN+$2)
+ srl V,1,V
+ ! remainder is positive
+ subcc R,V,R
+ ifelse($1, N,
+ ` b 9f
+ add Q, ($2*2+1), Q
+ ', ` DEVELOP_QUOTIENT_BITS(incr($1), `eval(2*$2+1)')')
+L.$1.eval(TWOSUPN+$2):
+ ! remainder is negative
+ addcc R,V,R
+ ifelse($1, N,
+ ` b 9f
+ add Q, ($2*2-1), Q
+ ', ` DEVELOP_QUOTIENT_BITS(incr($1), `eval(2*$2-1)')')
+ ifelse($1, 1, `9:')')
+
+#include "DEFS.h"
+#include <machine/trap.h>
+
+FUNC(NAME)
+ifelse(S, `true',
+` ! compute sign of result; if neither is negative, no problem
+ orcc divisor, dividend, %g0 ! either negative?
+ bge 2f ! no, go do the divide
+ ifelse(OP, `div',
+ `xor divisor, dividend, SIGN',
+ `mov dividend, SIGN') ! compute sign in any case
+ tst divisor
+ bge 1f
+ tst dividend
+ ! divisor is definitely negative; dividend might also be negative
+ bge 2f ! if dividend not negative...
+ neg divisor ! in any case, make divisor nonneg
+1: ! dividend is negative, divisor is nonnegative
+ neg dividend ! make dividend nonnegative
+2:
+')
+ ! Ready to divide. Compute size of quotient; scale comparand.
+ orcc divisor, %g0, V
+ bnz 1f
+ mov dividend, R
+
+ ! Divide by zero trap. If it returns, return 0 (about as
+ ! wrong as possible, but that is what SunOS does...).
+ t ST_DIV0
+ retl
+ clr %o0
+
+1:
+ cmp R, V ! if divisor exceeds dividend, done
+ blu Lgot_result ! (and algorithm fails otherwise)
+ clr Q
+ sethi %hi(1 << (WORDSIZE - TOPBITS - 1)), T
+ cmp R, T
+ blu Lnot_really_big
+ clr ITER
+
+ ! `Here the dividend is >= 2^(31-N) or so. We must be careful here,
+ ! as our usual N-at-a-shot divide step will cause overflow and havoc.
+ ! The number of bits in the result here is N*ITER+SC, where SC <= N.
+ ! Compute ITER in an unorthodox manner: know we need to shift V into
+ ! the top decade: so do not even bother to compare to R.'
+ 1:
+ cmp V, T
+ bgeu 3f
+ mov 1, SC
+ sll V, N, V
+ b 1b
+ inc ITER
+
+ ! Now compute SC.
+ 2: addcc V, V, V
+ bcc Lnot_too_big
+ inc SC
+
+ ! We get here if the divisor overflowed while shifting.
+ ! This means that R has the high-order bit set.
+ ! Restore V and subtract from R.
+ sll T, TOPBITS, T ! high order bit
+ srl V, 1, V ! rest of V
+ add V, T, V
+ b Ldo_single_div
+ dec SC
+
+ Lnot_too_big:
+ 3: cmp V, R
+ blu 2b
+ nop
+ be Ldo_single_div
+ nop
+ /* NB: these are commented out in the V8-Sparc manual as well */
+ /* (I do not understand this) */
+ ! V > R: went too far: back up 1 step
+ ! srl V, 1, V
+ ! dec SC
+ ! do single-bit divide steps
+ !
+ ! We have to be careful here. We know that R >= V, so we can do the
+ ! first divide step without thinking. BUT, the others are conditional,
+ ! and are only done if R >= 0. Because both R and V may have the high-
+ ! order bit set in the first step, just falling into the regular
+ ! division loop will mess up the first time around.
+ ! So we unroll slightly...
+ Ldo_single_div:
+ deccc SC
+ bl Lend_regular_divide
+ nop
+ sub R, V, R
+ mov 1, Q
+ b Lend_single_divloop
+ nop
+ Lsingle_divloop:
+ sll Q, 1, Q
+ bl 1f
+ srl V, 1, V
+ ! R >= 0
+ sub R, V, R
+ b 2f
+ inc Q
+ 1: ! R < 0
+ add R, V, R
+ dec Q
+ 2:
+ Lend_single_divloop:
+ deccc SC
+ bge Lsingle_divloop
+ tst R
+ b,a Lend_regular_divide
+
+Lnot_really_big:
+1:
+ sll V, N, V
+ cmp V, R
+ bleu 1b
+ inccc ITER
+ be Lgot_result
+ dec ITER
+
+ tst R ! set up for initial iteration
+Ldivloop:
+ sll Q, N, Q
+ DEVELOP_QUOTIENT_BITS(1, 0)
+Lend_regular_divide:
+ deccc ITER
+ bge Ldivloop
+ tst R
+ bl,a Lgot_result
+ ! non-restoring fixup here (one instruction only!)
+ifelse(OP, `div',
+` dec Q
+', ` add R, divisor, R
+')
+
+Lgot_result:
+ifelse(S, `true',
+` ! check to see if answer should be < 0
+ tst SIGN
+ bl,a 1f
+ ifelse(OP, `div', `neg Q', `neg R')
+1:')
+ retl
+ ifelse(OP, `div', `mov Q, %o0', `mov R, %o0')
diff --git a/sys/lib/libkern/arch/sparc64/ffs.S b/sys/lib/libkern/arch/sparc64/ffs.S
new file mode 100644
index 00000000000..fa701133435
--- /dev/null
+++ b/sys/lib/libkern/arch/sparc64/ffs.S
@@ -0,0 +1,118 @@
+/* $NetBSD: ffs.S,v 1.2 1998/11/26 19:32:10 eeh Exp $ */
+
+/*
+ * Copyright (c) 1992, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * This software was developed by the Computer Systems Engineering group
+ * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
+ * contributed to Berkeley.
+ *
+ * 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.
+ *
+ * Header: ffs.s,v 1.3 92/07/07 00:23:57 torek Exp
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+#ifdef notdef
+ .asciz "@(#)ffs.s 8.1 (Berkeley) 6/4/93"
+#endif
+ .asciz "$NetBSD: ffs.S,v 1.2 1998/11/26 19:32:10 eeh Exp $"
+#endif /* LIBC_SCCS and not lint */
+
+#include "DEFS.h"
+
+/*
+ * ffs returns the number of the rightmost bit set in its argument,
+ * i.e., the lowest value such that (x & (ffs(x) - 1)) is nonzero.
+ * If no bits are set, ffs returns 0.
+ *
+ * We use a table lookup on each byte.
+ *
+ * In each section below, %o1 is the current byte (0, 1, 2, or 3).
+ * The last byte is handled specially: for the first three,
+ * if that byte is nonzero, we return the table value
+ * (plus 0, 8, or 16 for the byte number), but for the last
+ * one, we just return the table value plus 24. This means
+ * that ffstab[0] must be -24 so that ffs(0) will return 0.
+ */
+ENTRY(ffs)
+#ifdef PIC
+ PICCY_SET(_C_LABEL(__ffstab), %o2, %o5)
+#else
+ set _C_LABEL(__ffstab), %o2
+#endif
+ andcc %o0, 0xff, %o1 ! get low byte
+ be,a 1f ! try again if 0
+ srl %o0, 8, %o0 ! delay slot, get ready for next byte
+
+ retl ! return ffstab[%o1]
+ ldsb [%o2 + %o1], %o0
+
+1:
+ andcc %o0, 0xff, %o1 ! byte 1 like byte 0...
+ be,a 2f
+ srl %o0, 8, %o0 ! (use delay to prepare for byte 2)
+
+ ldsb [%o2 + %o1], %o0
+ retl ! return ffstab[%o1] + 8
+ add %o0, 8, %o0
+
+2:
+ andcc %o0, 0xff, %o1
+ be,a 3f
+ srl %o0, 8, %o0 ! (prepare for byte 3)
+
+ ldsb [%o2 + %o1], %o0
+ retl ! return ffstab[%o1] + 16
+ add %o0, 16, %o0
+
+3: ! just return ffstab[%o0] + 24
+ ldsb [%o2 + %o0], %o0
+ retl
+ add %o0, 24, %o0
+
+ .globl _C_LABEL(__ffstab)
+_C_LABEL(__ffstab):
+ .byte -24,1,2,1,3,1,2,1,4,1,2,1,3,1,2,1 /* 00-0f */
+ .byte 5,1,2,1,3,1,2,1,4,1,2,1,3,1,2,1 /* 10-1f */
+ .byte 6,1,2,1,3,1,2,1,4,1,2,1,3,1,2,1 /* 20-2f */
+ .byte 5,1,2,1,3,1,2,1,4,1,2,1,3,1,2,1 /* 30-3f */
+ .byte 7,1,2,1,3,1,2,1,4,1,2,1,3,1,2,1 /* 40-4f */
+ .byte 5,1,2,1,3,1,2,1,4,1,2,1,3,1,2,1 /* 50-5f */
+ .byte 6,1,2,1,3,1,2,1,4,1,2,1,3,1,2,1 /* 60-6f */
+ .byte 5,1,2,1,3,1,2,1,4,1,2,1,3,1,2,1 /* 70-7f */
+ .byte 8,1,2,1,3,1,2,1,4,1,2,1,3,1,2,1 /* 80-8f */
+ .byte 5,1,2,1,3,1,2,1,4,1,2,1,3,1,2,1 /* 10-9f */
+ .byte 6,1,2,1,3,1,2,1,4,1,2,1,3,1,2,1 /* a0-af */
+ .byte 5,1,2,1,3,1,2,1,4,1,2,1,3,1,2,1 /* b0-bf */
+ .byte 7,1,2,1,3,1,2,1,4,1,2,1,3,1,2,1 /* c0-cf */
+ .byte 5,1,2,1,3,1,2,1,4,1,2,1,3,1,2,1 /* d0-df */
+ .byte 6,1,2,1,3,1,2,1,4,1,2,1,3,1,2,1 /* e0-ef */
+ .byte 5,1,2,1,3,1,2,1,4,1,2,1,3,1,2,1 /* f0-ff */
diff --git a/sys/lib/libkern/arch/sparc64/htonl.S b/sys/lib/libkern/arch/sparc64/htonl.S
new file mode 100644
index 00000000000..2991e4293d2
--- /dev/null
+++ b/sys/lib/libkern/arch/sparc64/htonl.S
@@ -0,0 +1,55 @@
+/* $NetBSD: htonl.S,v 1.1.1.1 1998/06/20 05:18:14 eeh Exp $ */
+
+/*
+ * Copyright (c) 1992, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * This software was developed by the Computer Systems Engineering group
+ * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
+ * contributed to Berkeley.
+ *
+ * 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.
+ *
+ * Header: htonl.s,v 1.1 92/06/25 12:47:05 torek Exp
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+#ifdef notdef
+ .asciz "@(#)htonl.s 8.1 (Berkeley) 6/4/93"
+#endif
+ .asciz "$NetBSD: htonl.S,v 1.1.1.1 1998/06/20 05:18:14 eeh Exp $"
+#endif /* LIBC_SCCS and not lint */
+
+/* netorder = htonl(hostorder) */
+
+#include "DEFS.h"
+
+ENTRY(htonl)
+ retl
+ sra %o0, 0, %o0 ! sign extend
diff --git a/sys/lib/libkern/arch/sparc64/htons.S b/sys/lib/libkern/arch/sparc64/htons.S
new file mode 100644
index 00000000000..d991b6f3301
--- /dev/null
+++ b/sys/lib/libkern/arch/sparc64/htons.S
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 1992, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * This software was developed by the Computer Systems Engineering group
+ * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
+ * contributed to Berkeley.
+ *
+ * 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.
+ *
+ * Header: htons.s,v 1.1 92/06/25 12:47:05 torek Exp
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+#ifdef notdef
+ .asciz "@(#)htons.s 8.1 (Berkeley) 6/4/93"
+#endif
+ .asciz "$NetBSD: htons.S,v 1.1.1.1 1998/06/20 05:18:14 eeh Exp $"
+#endif /* LIBC_SCCS and not lint */
+
+/* netorder = htons(hostorder) */
+
+#include "DEFS.h"
+
+ENTRY(htons)
+ sethi %hi(0xffff0000), %o1
+ retl
+ andn %o0, %o1, %o0
diff --git a/sys/lib/libkern/arch/sparc64/mul.S b/sys/lib/libkern/arch/sparc64/mul.S
new file mode 100644
index 00000000000..5daa0f5c3e7
--- /dev/null
+++ b/sys/lib/libkern/arch/sparc64/mul.S
@@ -0,0 +1,188 @@
+/* $NetBSD: mul.S,v 1.4 1998/11/26 19:08:21 eeh Exp $ */
+
+/*
+ * Copyright (c) 1992, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * This software was developed by the Computer Systems Engineering group
+ * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
+ * contributed to Berkeley.
+ *
+ * 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.
+ *
+ * Header: mul.s,v 1.5 92/06/25 13:24:03 torek Exp
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+#ifdef notdef
+ .asciz "@(#)mul.s 8.1 (Berkeley) 6/4/93"
+#endif
+ .asciz "$NetBSD: mul.S,v 1.4 1998/11/26 19:08:21 eeh Exp $"
+#endif /* LIBC_SCCS and not lint */
+
+/*
+ * This doesn't really belong here and should be handled by toolchain
+ * magic.
+ */
+
+.globl __mul64, __div64, __udiv64, __rem64, __urem64
+
+__mul64:
+ ba,a,pt %icc,__muldi3
+__div64:
+ ba,a,pt %icc,__divdi3
+__udiv64:
+ ba,a,pt %icc,__udivdi3
+__rem64:
+ ba,a,pt %icc,__moddi3
+__urem64:
+ ba,a,pt %icc,__umoddi3
+
+/*
+ * Signed multiply, from Appendix E of the Sparc Version 8
+ * Architecture Manual.
+ *
+ * Returns %o0 * %o1 in %o1%o0 (i.e., %o1 holds the upper 32 bits of
+ * the 64-bit product).
+ *
+ * This code optimizes short (less than 13-bit) multiplies.
+ */
+
+#include "DEFS.h"
+FUNC(.mul)
+#if 1
+ cmp %o0, %o1 ! Most efficient if smaller is in rs1
+ blt,a %icc, 1f
+ mulx %o0, %o1, %o0
+ mulx %o1, %o0, %o0
+1:
+ srax %o0, 32, %o1
+ retl
+ sll %o0, 0, %o0 ! Sign extend
+#else
+ mov %o0, %y ! multiplier -> Y
+ andncc %o0, 0xfff, %g0 ! test bits 12..31
+ be Lmul_shortway ! if zero, can do it the short way
+ andcc %g0, %g0, %o4 ! zero the partial product and clear N and V
+
+ /*
+ * Long multiply. 32 steps, followed by a final shift step.
+ */
+ mulscc %o4, %o1, %o4 ! 1
+ mulscc %o4, %o1, %o4 ! 2
+ mulscc %o4, %o1, %o4 ! 3
+ mulscc %o4, %o1, %o4 ! 4
+ mulscc %o4, %o1, %o4 ! 5
+ mulscc %o4, %o1, %o4 ! 6
+ mulscc %o4, %o1, %o4 ! 7
+ mulscc %o4, %o1, %o4 ! 8
+ mulscc %o4, %o1, %o4 ! 9
+ mulscc %o4, %o1, %o4 ! 10
+ mulscc %o4, %o1, %o4 ! 11
+ mulscc %o4, %o1, %o4 ! 12
+ mulscc %o4, %o1, %o4 ! 13
+ mulscc %o4, %o1, %o4 ! 14
+ mulscc %o4, %o1, %o4 ! 15
+ mulscc %o4, %o1, %o4 ! 16
+ mulscc %o4, %o1, %o4 ! 17
+ mulscc %o4, %o1, %o4 ! 18
+ mulscc %o4, %o1, %o4 ! 19
+ mulscc %o4, %o1, %o4 ! 20
+ mulscc %o4, %o1, %o4 ! 21
+ mulscc %o4, %o1, %o4 ! 22
+ mulscc %o4, %o1, %o4 ! 23
+ mulscc %o4, %o1, %o4 ! 24
+ mulscc %o4, %o1, %o4 ! 25
+ mulscc %o4, %o1, %o4 ! 26
+ mulscc %o4, %o1, %o4 ! 27
+ mulscc %o4, %o1, %o4 ! 28
+ mulscc %o4, %o1, %o4 ! 29
+ mulscc %o4, %o1, %o4 ! 30
+ mulscc %o4, %o1, %o4 ! 31
+ mulscc %o4, %o1, %o4 ! 32
+ mulscc %o4, %g0, %o4 ! final shift
+
+ ! If %o0 was negative, the result is
+ ! (%o0 * %o1) + (%o1 << 32))
+ ! We fix that here.
+
+ tst %o0
+ bge 1f
+ rd %y, %o0
+
+ ! %o0 was indeed negative; fix upper 32 bits of result by subtracting
+ ! %o1 (i.e., return %o4 - %o1 in %o1).
+ retl
+ sub %o4, %o1, %o1
+
+1:
+ retl
+ mov %o4, %o1
+
+Lmul_shortway:
+ /*
+ * Short multiply. 12 steps, followed by a final shift step.
+ * The resulting bits are off by 12 and (32-12) = 20 bit positions,
+ * but there is no problem with %o0 being negative (unlike above).
+ */
+ mulscc %o4, %o1, %o4 ! 1
+ mulscc %o4, %o1, %o4 ! 2
+ mulscc %o4, %o1, %o4 ! 3
+ mulscc %o4, %o1, %o4 ! 4
+ mulscc %o4, %o1, %o4 ! 5
+ mulscc %o4, %o1, %o4 ! 6
+ mulscc %o4, %o1, %o4 ! 7
+ mulscc %o4, %o1, %o4 ! 8
+ mulscc %o4, %o1, %o4 ! 9
+ mulscc %o4, %o1, %o4 ! 10
+ mulscc %o4, %o1, %o4 ! 11
+ mulscc %o4, %o1, %o4 ! 12
+ mulscc %o4, %g0, %o4 ! final shift
+
+ /*
+ * %o4 has 20 of the bits that should be in the low part of the
+ * result; %y has the bottom 12 (as %y's top 12). That is:
+ *
+ * %o4 %y
+ * +----------------+----------------+
+ * | -12- | -20- | -12- | -20- |
+ * +------(---------+------)---------+
+ * --hi-- ----low-part----
+ *
+ * The upper 12 bits of %o4 should be sign-extended to form the
+ * high part of the product (i.e., highpart = %o4 >> 20).
+ */
+
+ rd %y, %o5
+ sll %o4, 12, %o0 ! shift middle bits left 12
+ srl %o5, 20, %o5 ! shift low bits right 20, zero fill at left
+ or %o5, %o0, %o0 ! construct low part of result
+ retl
+ sra %o4, 20, %o1 ! ... and extract high part of result
+#endif
diff --git a/sys/lib/libkern/arch/sparc64/ntohl.S b/sys/lib/libkern/arch/sparc64/ntohl.S
new file mode 100644
index 00000000000..942ed0e16bb
--- /dev/null
+++ b/sys/lib/libkern/arch/sparc64/ntohl.S
@@ -0,0 +1,55 @@
+/* $NetBSD: ntohl.S,v 1.1.1.1 1998/06/20 05:18:14 eeh Exp $ */
+
+/*
+ * Copyright (c) 1992, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * This software was developed by the Computer Systems Engineering group
+ * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
+ * contributed to Berkeley.
+ *
+ * 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.
+ *
+ * Header: ntohl.s,v 1.1 92/06/25 12:47:06 torek Exp
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+#ifdef notdef
+ .asciz "@(#)ntohl.s 8.1 (Berkeley) 6/4/93"
+#endif
+ .asciz "$NetBSD: ntohl.S,v 1.1.1.1 1998/06/20 05:18:14 eeh Exp $"
+#endif /* LIBC_SCCS and not lint */
+
+/* hostorder = ntohl(netorder) */
+
+#include "DEFS.h"
+
+ENTRY(ntohl)
+ retl
+ nop
diff --git a/sys/lib/libkern/arch/sparc64/ntohs.S b/sys/lib/libkern/arch/sparc64/ntohs.S
new file mode 100644
index 00000000000..93481e73551
--- /dev/null
+++ b/sys/lib/libkern/arch/sparc64/ntohs.S
@@ -0,0 +1,56 @@
+/* $NetBSD: ntohs.S,v 1.1.1.1 1998/06/20 05:18:14 eeh Exp $ */
+
+/*
+ * Copyright (c) 1992, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * This software was developed by the Computer Systems Engineering group
+ * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
+ * contributed to Berkeley.
+ *
+ * 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.
+ *
+ * Header: ntohs.s,v 1.1 92/06/25 12:47:07 torek Exp
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+#ifdef notdef
+ .asciz "@(#)ntohs.s 8.1 (Berkeley) 6/4/93"
+#endif
+ .asciz "$NetBSD: ntohs.S,v 1.1.1.1 1998/06/20 05:18:14 eeh Exp $"
+#endif /* LIBC_SCCS and not lint */
+
+/* hostorder = ntohs(netorder) */
+
+#include "DEFS.h"
+
+ENTRY(ntohs)
+ sethi %hi(0xffff0000), %o1
+ retl
+ andn %o0, %o1, %o0
diff --git a/sys/lib/libkern/arch/sparc64/random.S b/sys/lib/libkern/arch/sparc64/random.S
new file mode 100644
index 00000000000..42f11c5e015
--- /dev/null
+++ b/sys/lib/libkern/arch/sparc64/random.S
@@ -0,0 +1,88 @@
+/* $NetBSD: random.S,v 1.1.1.1 1998/06/20 05:18:14 eeh Exp $ */
+
+/*
+ * Copyright (c) 1990,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: (1) source code distributions
+ * retain the above copyright notice and this paragraph in its entirety, (2)
+ * distributions including binary code include the above copyright notice and
+ * this paragraph in its entirety in the documentation or other materials
+ * provided with the distribution, and (3) all advertising materials mentioning
+ * features or use of this software display the following acknowledgement:
+ * ``This product includes software developed by the University of California,
+ * Lawrence Berkeley Laboratory and its contributors.'' 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 ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * Here is a very good random number generator. This implementation is
+ * based on ``Two Fast Implementations of the "Minimal Standard" Random
+ * Number Generator'', David G. Carta, Communications of the ACM, Jan 1990,
+ * Vol 33 No 1. Do NOT modify this code unless you have a very thorough
+ * understanding of the algorithm. It's trickier than you think. If
+ * you do change it, make sure that its 10,000'th invocation returns
+ * 1043618065.
+ *
+ * Here is easier-to-decipher pseudocode:
+ *
+ * p = (16807*seed)<30:0> # e.g., the low 31 bits of the product
+ * q = (16807*seed)<62:31> # e.g., the high 31 bits starting at bit 32
+ * if (p + q < 2^31)
+ * seed = p + q
+ * else
+ * seed = ((p + q) & (2^31 - 1)) + 1
+ * return (seed);
+ *
+ * The result is in (0,2^31), e.g., it's always positive.
+ */
+#include <machine/asm.h>
+
+ .data
+randseed:
+ .long 1
+ .text
+ENTRY(random)
+ sethi %hi(16807), %o1
+ wr %o1, %lo(16807), %y
+ sethi %hi(randseed), %g1
+ ld [%g1 + %lo(randseed)], %o0
+ andcc %g0, 0, %o2
+ mulscc %o2, %o0, %o2
+ mulscc %o2, %o0, %o2
+ mulscc %o2, %o0, %o2
+ mulscc %o2, %o0, %o2
+ mulscc %o2, %o0, %o2
+ mulscc %o2, %o0, %o2
+ mulscc %o2, %o0, %o2
+ mulscc %o2, %o0, %o2
+ mulscc %o2, %o0, %o2
+ mulscc %o2, %o0, %o2
+ mulscc %o2, %o0, %o2
+ mulscc %o2, %o0, %o2
+ mulscc %o2, %o0, %o2
+ mulscc %o2, %o0, %o2
+ mulscc %o2, %o0, %o2
+ mulscc %o2, %g0, %o2
+ rd %y, %o3
+ srl %o2, 16, %o1
+ set 0xffff, %o4
+ and %o4, %o2, %o0
+ sll %o0, 15, %o0
+ srl %o3, 17, %o3
+ or %o3, %o0, %o0
+ addcc %o0, %o1, %o0
+ bneg 1f
+ sethi %hi(0x7fffffff), %o1
+ retl
+ st %o0, [%g1 + %lo(randseed)]
+1:
+ or %o1, %lo(0x7fffffff), %o1
+ add %o0, 1, %o0
+ and %o1, %o0, %o0
+ retl
+ st %o0, [%g1 + %lo(randseed)]
diff --git a/sys/lib/libkern/arch/sparc64/saveregs.S b/sys/lib/libkern/arch/sparc64/saveregs.S
new file mode 100644
index 00000000000..eaa0c2ba8ff
--- /dev/null
+++ b/sys/lib/libkern/arch/sparc64/saveregs.S
@@ -0,0 +1,61 @@
+/* $NetBSD: saveregs.S,v 1.1.1.1 1998/06/20 05:18:14 eeh Exp $ */
+
+/*
+ * Copyright (c) 1992, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * This software was developed by the Computer Systems Engineering group
+ * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
+ * contributed to Berkeley.
+ *
+ * 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.
+ *
+ * Header: saveregs.s,v 1.1 91/07/06 17:22:33 torek Exp
+ */
+
+/*
+ * Save register arguments in caller's `arg dump' area, so that
+ * stdarg functions work.
+ *
+ * This really should be done with a pointer to the arg dump area;
+ * our caller should allocate that area, not our caller's caller.
+ * But then, they did not let me invent the calling sequence....
+ *
+ * We assume the caller has executed a `save' instruction.
+ */
+#include "DEFS.h"
+
+ENTRY(__builtin_saveregs)
+ st %i0, [%fp + 0x44] ! fr->fr_argd[0]
+ st %i1, [%fp + 0x48] ! fr->fr_argd[1]
+ st %i2, [%fp + 0x4c] ! fr->fr_argd[2]
+ st %i3, [%fp + 0x50] ! fr->fr_argd[3]
+ st %i4, [%fp + 0x54] ! fr->fr_argd[4]
+ retl
+ st %i5, [%fp + 0x58] ! fr->fr_argd[5]
diff --git a/sys/lib/libkern/arch/sparc64/setjmp.S b/sys/lib/libkern/arch/sparc64/setjmp.S
new file mode 100644
index 00000000000..d9ecb6b5037
--- /dev/null
+++ b/sys/lib/libkern/arch/sparc64/setjmp.S
@@ -0,0 +1,118 @@
+/* $NetBSD: setjmp.S,v 1.1.1.1 1998/06/20 05:18:14 eeh Exp $ */
+
+/*
+ * Copyright (c) 1992, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * This software was developed by the Computer Systems Engineering group
+ * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
+ * contributed to Berkeley.
+ *
+ * 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.
+ *
+ * Header: setjmp.s,v 1.2 92/06/25 03:18:43 torek Exp
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+#ifdef notdef
+ .asciz "@(#)setjmp.s 8.1 (Berkeley) 6/4/93"
+#endif
+ .asciz "$NetBSD: setjmp.S,v 1.1.1.1 1998/06/20 05:18:14 eeh Exp $"
+#endif /* LIBC_SCCS and not lint */
+
+/*
+ * 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>
+ */
+
+#include "SYS.h"
+
+ENTRY(setjmp)
+ /*
+ * We use the caller's `arg dump' area (%sp+0x44; there are 6 ints
+ * reserved there for us) to avoid having to allocate stack space
+ * here.
+ */
+ mov %o0, %o2 /* build sigcontext in [%o2] */
+ mov 1, %o0 /* SIG_BLOCK */
+ mov SYS_sigprocmask, %g1
+ clr %o1 /* sigprocmask(SIG_BLOCK, (sigset_t *)NULL) */
+ t ST_SYSCALL
+ st %o0, [%o2 + 4] /* sc.sc_mask = current mask; */
+ mov SYS_sigaltstack, %g1
+ clr %o0 /* sigstack(NULL, &foo) */
+ add %sp, 0x48, %o1 /* (foo being in arg dump area) */
+ t ST_SYSCALL
+ ld [%sp + 0x50], %o0 /* foo.ss_flags */
+ and %o0, 1, %o1 /* onstack = foo.ss_flags & 1; */
+ st %o0, [%o2 + 0] /* sc.sc_onstack = current onstack; */
+ st %sp, [%o2 + 8] /* sc.sc_sp = sp (both ours and caller's) */
+ add %o7, 8, %o0
+ st %o0, [%o2 + 12] /* sc.sc_pc = return_pc */
+ add %o7, 12, %o0
+ st %o0, [%o2 + 16] /* sc.sc_npc = return_pc + 4 */
+ st %g0, [%o2 + 20] /* sc.sc_psr = (clean psr) */
+ st %fp, [%o2 + 24] /* sc.sc_g1 = %fp (misuse, but what the heck) */
+ /* sc.sc_o0 = random(), set in longjmp */
+ retl /* return 0 */
+ clr %o0
+
+/*
+ * All we need to do here is force sigreturn to load a new stack pointer,
+ * new <pc,npc>, and appropriate %o0 return value from the sigcontext built
+ * in setjmp. The %i and %l registers will be reloaded from the place to
+ * which %sp points, due to sigreturn() semantics (sigreturn does not modify
+ * the window pointer in the psr, hence it must force all windows to reload).
+ */
+ENTRY(longjmp)
+ save %sp, -96, %sp
+ ld [%i0 + 8], %o2 /* make sure sc->sc_sp, sc->sc_fp nonzero */
+ ld [%i0 + 24], %o3
+ orcc %o2, %o3, %g0
+ bz Lbotch
+ tst %i1 /* if (v == 0) v = 1; */
+ bz,a 1f
+ mov 1, %i1
+1:
+ st %i1, [%i0 + 28] /* sc.sc_o0 = v; */
+ mov SYS_sigreturn, %g1
+ mov %i0, %o0
+ t ST_SYSCALL /* sigreturn(scp); */
+
+Lbotch:
+ /* oops, caller botched it */
+ call _longjmperror
+ nop
+ unimp 0
diff --git a/sys/lib/libkern/arch/sparc64/strlen.S b/sys/lib/libkern/arch/sparc64/strlen.S
new file mode 100644
index 00000000000..a8467084882
--- /dev/null
+++ b/sys/lib/libkern/arch/sparc64/strlen.S
@@ -0,0 +1,59 @@
+/* $NetBSD: strlen.S,v 1.1.1.1 1998/06/20 05:18:14 eeh Exp $ */
+
+/*
+ * Copyright (c) 1992, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * This software was developed by the Computer Systems Engineering group
+ * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
+ * contributed to Berkeley.
+ *
+ * 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.
+ *
+ * Header: strlen.s,v 1.1 92/06/25 12:52:47 torek Exp
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+#ifdef notdef
+ .asciz "@(#)strlen.s 8.1 (Berkeley) 6/4/93"
+#endif
+ .asciz "$NetBSD: strlen.S,v 1.1.1.1 1998/06/20 05:18:14 eeh Exp $"
+#endif /* LIBC_SCCS and not lint */
+
+#include "DEFS.h"
+
+ENTRY(strlen)
+ add %o0, 1, %o1 ! save starting point + 1
+1:
+ ldsb [%o0], %o2 ! fetch byte
+ tst %o2 ! null?
+ bne 1b ! no, keep going
+ inc %o0 ! always increment pointer
+ retl
+ sub %o0, %o1, %o0 ! return length (ptr - (origptr+1))
diff --git a/sys/lib/libkern/arch/sparc64/umul.S b/sys/lib/libkern/arch/sparc64/umul.S
new file mode 100644
index 00000000000..22b26464814
--- /dev/null
+++ b/sys/lib/libkern/arch/sparc64/umul.S
@@ -0,0 +1,192 @@
+/* $NetBSD: umul.S,v 1.1.1.1 1998/06/20 05:18:14 eeh Exp $ */
+
+/*
+ * Copyright (c) 1992, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * This software was developed by the Computer Systems Engineering group
+ * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
+ * contributed to Berkeley.
+ *
+ * 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.
+ *
+ * Header: umul.s,v 1.4 92/06/25 13:24:05 torek Exp
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+#ifdef notdef
+ .asciz "@(#)umul.s 8.1 (Berkeley) 6/4/93"
+#endif
+ .asciz "$NetBSD: umul.S,v 1.1.1.1 1998/06/20 05:18:14 eeh Exp $"
+#endif /* LIBC_SCCS and not lint */
+
+/*
+ * Unsigned multiply. Returns %o0 * %o1 in %o1%o0 (i.e., %o1 holds the
+ * upper 32 bits of the 64-bit product).
+ *
+ * This code optimizes short (less than 13-bit) multiplies. Short
+ * multiplies require 25 instruction cycles, and long ones require
+ * 45 instruction cycles.
+ *
+ * On return, overflow has occurred (%o1 is not zero) if and only if
+ * the Z condition code is clear, allowing, e.g., the following:
+ *
+ * call .umul
+ * nop
+ * bnz overflow (or tnz)
+ */
+
+#include "DEFS.h"
+FUNC(.umul)
+ or %o0, %o1, %o4
+ mov %o0, %y ! multiplier -> Y
+ andncc %o4, 0xfff, %g0 ! test bits 12..31 of *both* args
+ be Lmul_shortway ! if zero, can do it the short way
+ andcc %g0, %g0, %o4 ! zero the partial product and clear N and V
+
+ /*
+ * Long multiply. 32 steps, followed by a final shift step.
+ */
+ mulscc %o4, %o1, %o4 ! 1
+ mulscc %o4, %o1, %o4 ! 2
+ mulscc %o4, %o1, %o4 ! 3
+ mulscc %o4, %o1, %o4 ! 4
+ mulscc %o4, %o1, %o4 ! 5
+ mulscc %o4, %o1, %o4 ! 6
+ mulscc %o4, %o1, %o4 ! 7
+ mulscc %o4, %o1, %o4 ! 8
+ mulscc %o4, %o1, %o4 ! 9
+ mulscc %o4, %o1, %o4 ! 10
+ mulscc %o4, %o1, %o4 ! 11
+ mulscc %o4, %o1, %o4 ! 12
+ mulscc %o4, %o1, %o4 ! 13
+ mulscc %o4, %o1, %o4 ! 14
+ mulscc %o4, %o1, %o4 ! 15
+ mulscc %o4, %o1, %o4 ! 16
+ mulscc %o4, %o1, %o4 ! 17
+ mulscc %o4, %o1, %o4 ! 18
+ mulscc %o4, %o1, %o4 ! 19
+ mulscc %o4, %o1, %o4 ! 20
+ mulscc %o4, %o1, %o4 ! 21
+ mulscc %o4, %o1, %o4 ! 22
+ mulscc %o4, %o1, %o4 ! 23
+ mulscc %o4, %o1, %o4 ! 24
+ mulscc %o4, %o1, %o4 ! 25
+ mulscc %o4, %o1, %o4 ! 26
+ mulscc %o4, %o1, %o4 ! 27
+ mulscc %o4, %o1, %o4 ! 28
+ mulscc %o4, %o1, %o4 ! 29
+ mulscc %o4, %o1, %o4 ! 30
+ mulscc %o4, %o1, %o4 ! 31
+ mulscc %o4, %o1, %o4 ! 32
+ mulscc %o4, %g0, %o4 ! final shift
+
+
+ /*
+ * Normally, with the shift-and-add approach, if both numbers are
+ * positive you get the correct result. WIth 32-bit two's-complement
+ * numbers, -x is represented as
+ *
+ * x 32
+ * ( 2 - ------ ) mod 2 * 2
+ * 32
+ * 2
+ *
+ * (the `mod 2' subtracts 1 from 1.bbbb). To avoid lots of 2^32s,
+ * we can treat this as if the radix point were just to the left
+ * of the sign bit (multiply by 2^32), and get
+ *
+ * -x = (2 - x) mod 2
+ *
+ * Then, ignoring the `mod 2's for convenience:
+ *
+ * x * y = xy
+ * -x * y = 2y - xy
+ * x * -y = 2x - xy
+ * -x * -y = 4 - 2x - 2y + xy
+ *
+ * For signed multiplies, we subtract (x << 32) from the partial
+ * product to fix this problem for negative multipliers (see mul.s).
+ * Because of the way the shift into the partial product is calculated
+ * (N xor V), this term is automatically removed for the multiplicand,
+ * so we don't have to adjust.
+ *
+ * But for unsigned multiplies, the high order bit wasn't a sign bit,
+ * and the correction is wrong. So for unsigned multiplies where the
+ * high order bit is one, we end up with xy - (y << 32). To fix it
+ * we add y << 32.
+ */
+ tst %o1
+ bl,a 1f ! if %o1 < 0 (high order bit = 1),
+ add %o4, %o0, %o4 ! %o4 += %o0 (add y to upper half)
+1: rd %y, %o0 ! get lower half of product
+ retl
+ addcc %o4, %g0, %o1 ! put upper half in place and set Z for %o1==0
+
+Lmul_shortway:
+ /*
+ * Short multiply. 12 steps, followed by a final shift step.
+ * The resulting bits are off by 12 and (32-12) = 20 bit positions,
+ * but there is no problem with %o0 being negative (unlike above),
+ * and overflow is impossible (the answer is at most 24 bits long).
+ */
+ mulscc %o4, %o1, %o4 ! 1
+ mulscc %o4, %o1, %o4 ! 2
+ mulscc %o4, %o1, %o4 ! 3
+ mulscc %o4, %o1, %o4 ! 4
+ mulscc %o4, %o1, %o4 ! 5
+ mulscc %o4, %o1, %o4 ! 6
+ mulscc %o4, %o1, %o4 ! 7
+ mulscc %o4, %o1, %o4 ! 8
+ mulscc %o4, %o1, %o4 ! 9
+ mulscc %o4, %o1, %o4 ! 10
+ mulscc %o4, %o1, %o4 ! 11
+ mulscc %o4, %o1, %o4 ! 12
+ mulscc %o4, %g0, %o4 ! final shift
+
+ /*
+ * %o4 has 20 of the bits that should be in the result; %y has
+ * the bottom 12 (as %y's top 12). That is:
+ *
+ * %o4 %y
+ * +----------------+----------------+
+ * | -12- | -20- | -12- | -20- |
+ * +------(---------+------)---------+
+ * -----result-----
+ *
+ * The 12 bits of %o4 left of the `result' area are all zero;
+ * in fact, all top 20 bits of %o4 are zero.
+ */
+
+ rd %y, %o5
+ sll %o4, 12, %o0 ! shift middle bits left 12
+ srl %o5, 20, %o5 ! shift low bits right 20
+ or %o5, %o0, %o0
+ retl
+ addcc %g0, %g0, %o1 ! %o1 = zero, and set Z