diff options
Diffstat (limited to 'lib/libc/arch/hppa/string/bcopy.m4')
-rw-r--r-- | lib/libc/arch/hppa/string/bcopy.m4 | 269 |
1 files changed, 269 insertions, 0 deletions
diff --git a/lib/libc/arch/hppa/string/bcopy.m4 b/lib/libc/arch/hppa/string/bcopy.m4 new file mode 100644 index 00000000000..bf69e1349ab --- /dev/null +++ b/lib/libc/arch/hppa/string/bcopy.m4 @@ -0,0 +1,269 @@ +define(_rcsid,``$OpenBSD: bcopy.m4,v 1.1 1999/09/14 00:46:18 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',` + addi -16, $6, $6 +L($1, `loop16'`$7') +dnl cache hint may not work on some hardware +dnl ldw F 32($2, $3), r0 +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,<,n 12, $6, L($1, cleanup) +ifelse($7, `u', ` copy ret1, t1', $7, `a', `dnl') +L($1, word) + ldws,M F`'4($2, $3), t1 + addib,>= -4, $6, L($1, word) + stws,M t1, F`'4($4, $5) + +L($1, cleanup) + addib,=,n 4, $6, L($1, done) + ldws 0($2, $3), t1 + add $5, $6, $5 + bv r0(rp) + stbys,E t1, 0($4, $5) +') +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, t4, $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')dnl + +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') + addib,<,n 12, $6, L($1, cleanup_un) +L($1, word_un) + ldws,M F`'4($2, $3), t1 + vshd ret1, t1, t2 + addib,< -4, $6, L($1, cleanup1_un) + stws,M t2, F`'4($4, $5) + ldws,M F`'4($2, $3), ret1 + vshd t1, ret1, t2 + addib,>= -4, $6, L($1, word_un) + stws,M t2, F`'4($4, $5) + +L($1, cleanup_un) + addib,<=,n 4, $6, L($1, done) + mfctl sar, t4 + add $5, $6, $5 + extru t4, 28, 2, t4 + sub,<= $6, t4, r0 + ldws,M F`'4($2, $3), t1 + vshd ret1, t1, t2 + bv r0(rp) + stbys,E t2, 0($4, $5) + +L($1, cleanup1_un) + b L($1, cleanup_un) + copy t1, ret1 +')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 +` +#undef _LOCORE +#define _LOCORE +#include <machine/asm.h> +#include <machine/frame.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) + 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 HPPA_FRAME_ARG(4)(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 |