Annotation of sys/lib/libkern/arch/hppa/bcopy.m4, Revision 1.1
1.1 ! nbrk 1: define(_rcsid,``$OpenBSD: bcopy.m4,v 1.16 2007/05/14 19:54:21 martin Exp $'')dnl
! 2: dnl
! 3: dnl
! 4: dnl This is the source file for bcopy.S, spcopy.S
! 5: dnl
! 6: dnl
! 7: define(`versionmacro',substr(_rcsid,1,eval(len(_rcsid)-2)))dnl
! 8: dnl
! 9: /* This is a generated file. DO NOT EDIT. */
! 10: /*
! 11: * Generated from:
! 12: *
! 13: * versionmacro
! 14: */
! 15: /*
! 16: * Copyright (c) 1999 Michael Shalayeff
! 17: * All rights reserved.
! 18: *
! 19: * Redistribution and use in source and binary forms, with or without
! 20: * modification, are permitted provided that the following conditions
! 21: * are met:
! 22: * 1. Redistributions of source code must retain the above copyright
! 23: * notice, this list of conditions and the following disclaimer.
! 24: * 2. Redistributions in binary form must reproduce the above copyright
! 25: * notice, this list of conditions and the following disclaimer in the
! 26: * documentation and/or other materials provided with the distribution.
! 27: *
! 28: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
! 29: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
! 30: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
! 31: * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
! 32: * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
! 33: * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
! 34: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
! 35: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
! 36: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
! 37: * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
! 38: *
! 39: */
! 40:
! 41: dnl
! 42: dnl macro: L(`arg1',`arg2')
! 43: dnl synopsis: creates an assembly label based on args resulting in $arg1.arg2
! 44: dnl
! 45: define(`L', `$$1.$2')dnl
! 46: dnl
! 47: dnl
! 48: dnl
! 49: define(`STWS',`ifelse($5, `u',dnl
! 50: `ifelse($1, `1', `vshd $4, t`$1', r31
! 51: stbys,B,m r31, F`'4($2, $3)',
! 52: `0', `0', `vshd t`'decr($1), t`$1', r31
! 53: stws,M r31, F`'4($2, $3)')',dnl
! 54: `0', `0',
! 55: `ifelse($1, `1',
! 56: `stbys,B`'ifelse(B, `b', `,m ', `0', `0', ` ')`'t`$1', F`'4($2, $3)',
! 57: `0', `0', `stws,M t`$1', F`'4($2, $3)')')')dnl
! 58: define(`STWSS', `ifelse(`$3', `1', `dnl',
! 59: `0', `0', `STWSS($1, $2, eval($3 - 1), $4, $5)')
! 60: STWS($3, $1, $2, $4, $5)dnl
! 61: ')dnl
! 62: define(`LDWSS', `ifelse(`$3', `1', `dnl',
! 63: `0', `0', `LDWSS($1, $2, eval($3 - 1))')
! 64: ldws,M F`'4($1, $2), t`'$3`'dnl
! 65: ')dnl
! 66: dnl
! 67: dnl copy data in 4-words blocks
! 68: dnl
! 69: define(`hppa_blcopy',`
! 70: addi -16, $6, $6
! 71: L($1, `loop16'`$7')
! 72: dnl cache hint may not work on some hardware
! 73: dnl ldw F 32($2, $3), r0
! 74: ifelse(F, `-', `dnl
! 75: addi F`'4, $5, $5', `0', `0', `dnl')
! 76: LDWSS($2, $3, 4)
! 77: STWSS($4, $5, 3, `ret1', $7)
! 78: ifelse($7, `u', `dnl
! 79: STWS(4, $4, $5, `ret1', $7)', $7, `a', `dnl')
! 80: addib,>= -16, $6, L($1, `loop16'`$7')
! 81: ifelse($7, `a', `dnl
! 82: STWS(4, $4, $5, `ret1', $7)dnl
! 83: ', $7, `u', `dnl
! 84: copy t4, ret1')')dnl
! 85: dnl
! 86: dnl copy in words
! 87: dnl
! 88: define(`STWL', `addib,<,n 12, $6, L($1, cleanup)
! 89: ifelse($7, `u', ` copy ret1, t1', $7, `a', `dnl')
! 90: L($1, word)
! 91: ldws,M F`'4($2, $3), t1
! 92: addib,>= -4, $6, L($1, word)
! 93: stws,M t1, F`'4($4, $5)
! 94:
! 95: L($1, cleanup)
! 96: addib,=,n 4, $6, L($1, done)
! 97: ldws 0($2, $3), t1
! 98: add $5, $6, $5
! 99: b L($1, done)
! 100: stbys,E t1, 0($4, $5)
! 101: ')
! 102: dnl
! 103: dnl
! 104: dnl parameters:
! 105: dnl $1 name
! 106: dnl $2 source space
! 107: dnl $3 source address
! 108: dnl $4 destination space
! 109: dnl $5 destination address
! 110: dnl $6 length
! 111: dnl $7 direction
! 112: dnl
! 113: define(hppa_copy,
! 114: `dnl
! 115: dnl
! 116: dnl if direction is `-' (backwards copy), adjust src, dst
! 117: dnl
! 118: ifelse($7,`-', `add $3, $6, $3
! 119: add $5, $6, $5
! 120: define(`F', `-')dnl
! 121: define(`R', `')dnl
! 122: define(`M', `mb')dnl
! 123: define(`B', `e')dnl
! 124: define(`E', `b')dnl
! 125: ',dnl ifelse
! 126: `0',`0',
! 127: `define(`F', `')dnl
! 128: define(`R', `-')dnl
! 129: define(`M', `ma')dnl
! 130: define(`B', `b')dnl
! 131: define(`E', `e')dnl
! 132: ')dnl ifelse
! 133:
! 134: ifelse($7,`-', `', `0',`0',
! 135: ` comib,>=,n 15, $6, L($1, byte)
! 136:
! 137: extru $3, 31, 2, t3
! 138: extru $5, 31, 2, t4
! 139: add $6, t4, $6
! 140: comb,<> t3, t4, L($1, unaligned)
! 141: dep r0, 31, 2, $3
! 142: hppa_blcopy($1, $2, $3, $4, $5, $6, `a')
! 143:
! 144: STWL($1, $2, $3, $4, $5, $6, `a')dnl
! 145:
! 146: L($1, unaligned)
! 147: sub,>= t4, t3, t2
! 148: ldwm F`'4($2, $3), ret1
! 149: zdep t2, 28, 29, t1
! 150: mtsar t1
! 151: hppa_blcopy($1, $2, $3, $4, $5, $6, `u')
! 152:
! 153: dnl STWL($1, $2, $3, $4, $5, $6, `u')
! 154: addib,<,n 12, $6, L($1, cleanup_un)
! 155: L($1, word_un)
! 156: ldws,M F`'4($2, $3), t1
! 157: vshd ret1, t1, t2
! 158: addib,< -4, $6, L($1, cleanup1_un)
! 159: stws,M t2, F`'4($4, $5)
! 160: ldws,M F`'4($2, $3), ret1
! 161: vshd t1, ret1, t2
! 162: addib,>= -4, $6, L($1, word_un)
! 163: stws,M t2, F`'4($4, $5)
! 164:
! 165: L($1, cleanup_un)
! 166: addib,<=,n 4, $6, L($1, done)
! 167: mfctl sar, t4
! 168: add $5, $6, $5
! 169: extru t4, 28, 2, t4
! 170: sub,<= $6, t4, r0
! 171: ldws,M F`'4($2, $3), t1
! 172: vshd ret1, t1, t2
! 173: b L($1, done)
! 174: stbys,E t2, 0($4, $5)
! 175:
! 176: L($1, cleanup1_un)
! 177: b L($1, cleanup_un)
! 178: copy t1, ret1
! 179: ')dnl ifelse
! 180:
! 181: L($1, byte)
! 182: comb,>=,n r0, $6, L($1, done)
! 183: L($1, byte_loop)
! 184: ldbs,M F`'1($2, $3), t1
! 185: addib,<> -1, $6, L($1, byte_loop)
! 186: stbs,M t1, F`'1($4, $5)
! 187: L($1, done)
! 188: ')dnl
! 189: `
! 190: #undef _LOCORE
! 191: #define _LOCORE
! 192: #include <machine/asm.h>
! 193: #include <machine/frame.h>
! 194: '
! 195: ifelse(NAME, `bcopy',
! 196: `
! 197: #if defined(LIBC_SCCS)
! 198: .text
! 199: .asciz "versionmacro"
! 200: .align 4
! 201: #endif
! 202:
! 203: LEAF_ENTRY(memcpy)
! 204: ALTENTRY(memmove)
! 205: copy arg0, t1
! 206: copy arg1, arg0
! 207: copy t1, arg1
! 208: copy arg0, ret0
! 209: ALTENTRY(ovbcopy)
! 210: ALTENTRY(bcopy)
! 211: comb,>,n arg1, arg0, L(bcopy, reverse)
! 212: hppa_copy(bcopy_f, sr0, arg0, sr0, arg1, arg2, `+')
! 213: bv 0(rp)
! 214: nop
! 215: L(bcopy, reverse)
! 216: hppa_copy(bcopy_r, sr0, arg0, sr0, arg1, arg2, `-')
! 217: bv 0(rp)
! 218: nop
! 219: EXIT(memcpy)
! 220: ')dnl
! 221: dnl
! 222: ifelse(NAME, `spcopy',
! 223: `
! 224: #ifdef _KERNEL
! 225: #include <assym.h>
! 226:
! 227: /*
! 228: * int spcopy (pa_space_t ssp, const void *src, pa_space_t dsp, void *dst,
! 229: * size_t size)
! 230: * do a space to space bcopy.
! 231: *
! 232: * assumes that spaces do not clash, otherwise we lose
! 233: */
! 234: .import curproc, data
! 235: .import cpu_info_primary, data
! 236: .import copy_on_fault, code
! 237:
! 238: #define curproc (cpu_info_primary + CI_CURPROC)
! 239:
! 240: LEAF_ENTRY(spcopy)
! 241: ldw HPPA_FRAME_ARG(4)(sp), ret0
! 242: sub,<> r0, ret0, r0
! 243: bv r0(rp)
! 244: nop
! 245: `
! 246: ldo 64(sp), sp
! 247: stw rp, HPPA_FRAME_CRP(sp)
! 248: /* setup fault handler */
! 249: ldil L%curproc, t1
! 250: ldw R%curproc(t1), t3
! 251: ldil L%copy_on_fault, t2
! 252: ldw P_ADDR(t3), r2
! 253: ldo R%copy_on_fault(t2), t2
! 254: ldw PCB_ONFAULT+U_PCB(r2), r1
! 255: stw t2, PCB_ONFAULT+U_PCB(r2)
! 256: '
! 257: mtsp arg0, sr1
! 258: mtsp arg2, sr2
! 259:
! 260: hppa_copy(spcopy, sr1, arg1, sr2, arg3, ret0, `+')
! 261:
! 262: mtsp r0, sr1
! 263: mtsp r0, sr2
! 264: /* reset fault handler */
! 265: stw r1, PCB_ONFAULT+U_PCB(r2)
! 266: ldw HPPA_FRAME_CRP(sp), rp
! 267: ldo -64(sp), sp
! 268: bv 0(rp)
! 269: copy r0, ret0
! 270: EXIT(spcopy)
! 271: #endif
! 272: ')dnl
! 273:
! 274: .end
CVSweb