summaryrefslogtreecommitdiff
path: root/sys/lib
diff options
context:
space:
mode:
authorMichael Shalayeff <mickey@cvs.openbsd.org>1999-05-19 17:10:52 +0000
committerMichael Shalayeff <mickey@cvs.openbsd.org>1999-05-19 17:10:52 +0000
commitf20c27e4f0b47089a51022e6fe9536f12f33f29e (patch)
tree167f58dd2f5f8dfb58b8dcb68e9d11cd22878d1e /sys/lib
parent7ec87eaaa2f1a1f8e3d401f689bce716e4c4cf7f (diff)
bcopy() and space-space bcopy()
Diffstat (limited to 'sys/lib')
-rw-r--r--sys/lib/libkern/arch/hppa/Makefile.inc15
-rw-r--r--sys/lib/libkern/arch/hppa/bcopy.m4246
2 files changed, 259 insertions, 2 deletions
diff --git a/sys/lib/libkern/arch/hppa/Makefile.inc b/sys/lib/libkern/arch/hppa/Makefile.inc
index 629462f8b79..f60d6522f98 100644
--- a/sys/lib/libkern/arch/hppa/Makefile.inc
+++ b/sys/lib/libkern/arch/hppa/Makefile.inc
@@ -1,7 +1,18 @@
-# $OpenBSD: Makefile.inc,v 1.6 1999/04/20 21:08:51 mickey Exp $
+# $OpenBSD: Makefile.inc,v 1.7 1999/05/19 17:10:51 mickey Exp $
SRCS+= __main.c imax.c imin.c lmax.c lmin.c max.c min.c ulmax.c ulmin.c \
random.c ashrdi3.c divdi3.c strncpy.c strncmp.c strcmp.c memchr.c \
memset.c strlen.c strcpy.c strcat.c skpc.c strncasecmp.c scanc.c
-SRCS+= milli.S bzero.S bcopy.S bcmp.S ffs.S
+SRCS+= milli.S bzero.S bcmp.S ffs.S
+
+SRCS+= bcopy.S spcopy.S
+CLEANFILES+= bcopy.S spcopy.S
+
+bcopy.S: ${M}/bcopy.m4
+ @echo 'building ${.TARGET} from ${.ALLSRC}'
+ @m4 -DNAME=bcopy ${.ALLSRC} > ${.TARGET}
+
+spcopy.S: ${M}/bcopy.m4
+ @echo 'building ${.TARGET} from ${.ALLSRC}'
+ @m4 -DNAME=spcopy ${.ALLSRC} > ${.TARGET}
diff --git a/sys/lib/libkern/arch/hppa/bcopy.m4 b/sys/lib/libkern/arch/hppa/bcopy.m4
new file mode 100644
index 00000000000..b800194b255
--- /dev/null
+++ b/sys/lib/libkern/arch/hppa/bcopy.m4
@@ -0,0 +1,246 @@
+define(_rcsid,``$OpenBSD: bcopy.m4,v 1.1 1999/05/19 17:10:51 mickey Exp $'')dnl
+dnl
+dnl
+dnl This is the source file for bcopy.S, spcopy.S
+dnl
+dnl
+define(`versionmacro',substr(_rcsid,1,eval(len(_rcsid)-2)))dnl
+dnl
+/* This is a generated file. DO NOT EDIT. */
+/*
+ * Generated from:
+ *
+ * versionmacro
+ */
+/*
+ * Copyright (c) 1999 Michael Shalayeff
+ * 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 Michael Shalayeff.
+ * 4. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
+ *
+ */
+
+dnl
+dnl macro: L(`arg1',`arg2')
+dnl synopsis: creates an assembly label based on args resulting in $arg1.arg2
+dnl
+define(`L', `$$1.$2')dnl
+dnl
+dnl
+dnl
+define(`STWS',`ifelse($5, `u',dnl
+`ifelse($1, `1', `vshd $4, t`$1', r31
+ stbys,B,m r31, F`'4($2, $3)',
+`0', `0', `vshd t`'decr($1), t`$1', r31
+ stws,M r31, F`'4($2, $3)')',dnl
+`0', `0',
+`ifelse($1, `1',
+`stbys,B`'ifelse(B, `b', `,m ', `0', `0', ` ')`'t`$1', F`'4($2, $3)',
+`0', `0', `stws,M t`$1', F`'4($2, $3)')')')dnl
+define(`STWSS', `ifelse(`$3', `1', `dnl',
+`0', `0', `STWSS($1, $2, eval($3 - 1), $4, $5)')
+ STWS($3, $1, $2, $4, $5)dnl
+')dnl
+define(`LDWSS', `ifelse(`$3', `1', `dnl',
+`0', `0', `LDWSS($1, $2, eval($3 - 1))')
+ ldws,M F`'4($1, $2), t`'$3`'dnl
+')dnl
+dnl
+dnl copy data in 4-words blocks
+dnl
+define(`hppa_blcopy',`
+L($1, `loop16'`$7')
+dnl cache hint may not work on some hardware
+dnl ldw F 32($2, $3), r0
+dnl
+ifelse(F, `-', `dnl
+ addi F`'4, $5, $5', `0', `0', `dnl')
+LDWSS($2, $3, 4)
+STWSS($4, $5, 3, `ret1', $7)
+ifelse($7, `u', `dnl
+ STWS(4, $4, $5, `ret1', $7)', $7, `a', `dnl')
+ addib,>= -16, $6, L($1, `loop16'`$7')
+ifelse($7, `a', `dnl
+ STWS(4, $4, $5, `ret1', $7)dnl
+', $7, `u', `dnl
+ copy t4, ret1')')dnl
+dnl
+dnl copy in words
+dnl
+define(`STWL', `addib,< 12, $6, L($1, byte)
+ ifelse($7, `u', `copy ret1, t1', $7, `a', `nop')
+L($1, word)
+ ldws,M F 4($2, $3), t1
+ addib,>= -4, $6, L($1, word)
+ stws,M t1, F 4($4, $5)
+
+ b,n L($1, byte)
+')
+dnl
+dnl
+dnl parameters:
+dnl $1 name
+dnl $2 source space
+dnl $3 source address
+dnl $4 destination space
+dnl $5 destination address
+dnl $6 length
+dnl $7 direction
+dnl
+define(hppa_copy,
+`dnl
+dnl
+dnl if direction is `-' (backwards copy), adjust src, dst
+dnl
+ifelse($7,`-', `add $3, $6, $3
+ add $5, $6, $5
+define(`F', `-')dnl
+define(`R', `')dnl
+define(`M', `mb')dnl
+define(`B', `e')dnl
+define(`E', `b')dnl
+',dnl ifelse
+`0',`0',
+`define(`F', `')dnl
+define(`R', `-')dnl
+define(`M', `ma')dnl
+define(`B', `b')dnl
+define(`E', `e')dnl
+')dnl ifelse
+
+ifelse($7,`-', `', `0',`0',
+` comib,>=,n 15, $6, L($1, byte)
+
+ extru $3, 31, 2, t3
+ extru $5, 31, 2, t4
+ add $6, t3, $6
+ comb,<> t3, t4, L($1, unaligned)
+ dep r0, 31, 2, $3
+ hppa_blcopy($1, $2, $3, $4, $5, $6, `a')
+
+ STWL($1, $2, $3, $4, $5, $6, `a')
+
+L($1, unaligned)
+ sub,>= t4, t3, t2
+ ldwm F`'4($2, $3), ret1
+ zdep t2, 28, 29, t1
+ mtsar t1
+ hppa_blcopy($1, $2, $3, $4, $5, $6, `u')
+
+dnl STWL($1, $2, $3, $4, $5, $6, `u')
+L($1, word_un)
+ ldwm F`'4($2, $3), t2
+ vshd ret1, t2, t3
+ addib,< R`'4, $6, L($1, byte)
+ stbys,B,m t3, F`'4($4, $5)
+ ldwm F`'4($2, $3), ret1
+ vshd t2, ret1, t3
+ addib,> R`'4, $6, L($1, word_un)
+ stbys,B,m t3, F`'4($4, $5)
+')dnl ifelse
+
+L($1, byte)
+ comb,>=,n r0, $6, L($1, done)
+L($1, byte_loop)
+ ldbs,M F`'1($2, $3), t1
+ addib,<> -1, $6, L($1, byte_loop)
+ stbs,M t1, F`'1($4, $5)
+L($1, done)
+')dnl
+`
+#include <machine/asm.h>
+'
+ifelse(NAME, `bcopy',
+`
+#if defined(LIBC_SCCS)
+ .text
+ .asciz "versionmacro"
+#endif
+
+ENTRY(memcpy)
+ALTENTRY(memmove)
+ copy arg0, t1
+ copy arg1, arg0
+ copy t1, arg1
+ALTENTRY(ovbcopy)
+ALTENTRY(bcopy)
+ALTENTRY(mycopy)
+ add arg0, arg2, t1
+ comb,>,n t1, arg1, L(bcopy, reverse)
+ hppa_copy(bcopy_f, sr0, arg0, sr0, arg1, arg2, `+')
+ b,n L(bcopy, ret)
+L(bcopy, reverse)
+ hppa_copy(bcopy_r, sr0, arg0, sr0, arg1, arg2, `-')
+L(bcopy, ret)
+ bv 0(rp)
+ nop
+EXIT(memcpy)
+')dnl
+dnl
+ifelse(NAME, `spcopy',
+`
+#ifdef _KERNEL
+#include <assym.h>
+
+/*
+ * int spcopy (pa_space_t ssp, const void *src, pa_space_t dsp, void *dst,
+ * size_t size)
+ * do a space to space bcopy.
+ *
+ * assumed that spaces do not clash, otherwise we loose
+ */
+ .import curproc, data
+ .import copy_on_fault, code
+ENTRY(spcopy)
+ ldw VA_ARG4(sp), ret1
+ comb,>=,n r0, ret1, L(spcopy, ret)
+`
+ /* setup fault handler */
+ ldil L%curproc, r31
+ ldw R%curproc(r31), r31
+ ldil L%copy_on_fault, t2
+ ldw p_addr(r31), r31
+ ldo R%copy_on_fault(t2), t2
+ stw t2, pcb_onfault+u_pcb(r31)
+'
+ mfctl sr2, ret0 /* XXX need this?, sr1 is scratchable */
+ mtctl arg0, sr1
+ mtctl arg2, sr2
+ copy ret1, arg0 /* ret1 is used in hppa_blcopy() */
+
+ hppa_copy(spcopy, sr1, arg1, sr2, arg3, ret1, `+')
+
+ /* reset fault handler */
+ stw r0, pcb_onfault+u_pcb(r31)
+ mtctl ret0, sr2
+L(spcopy, ret)
+ bv 0(rp)
+ copy r0, ret0
+EXIT(spcopy)
+#endif
+')dnl
+
+ .end