Annotation of sys/lib/libkern/arch/hppa64/bcopy.m4, Revision 1.1
1.1 ! nbrk 1: define(_rcsid,``$OpenBSD: bcopy.m4,v 1.2 2005/08/01 12:10:26 miod 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,2004 Michael Shalayeff
! 17: * All rights reserved.
! 18: *
! 19: * Permission to use, copy, modify, and distribute this software for any
! 20: * purpose with or without fee is hereby granted, provided that the above
! 21: * copyright notice and this permission notice appear in all copies.
! 22: *
! 23: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
! 24: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
! 25: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
! 26: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
! 27: * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER IN
! 28: * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
! 29: * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
! 30: */
! 31: dnl
! 32: dnl macro: L(`%arg1',`%arg2')
! 33: dnl synopsis: creates an assembly label based on args resulting in $%arg1.%arg2
! 34: dnl
! 35: define(`L', `$$1.$2')dnl
! 36: dnl
! 37: dnl
! 38: dnl
! 39: define(`STWS',`ifelse($5, `u',dnl
! 40: `ifelse($1, `1', `vshd $4, %r`$1', %r31
! 41: stbys,B,m %r31, F`'4($2, $3)',
! 42: `0', `0', `vshd %r`'decr($1), %r`$1', %r31
! 43: stws,M %r31, F`'4($2, $3)')',dnl
! 44: `0', `0',
! 45: `ifelse($1, `1',
! 46: `stbys,B`'ifelse(B, `b', `,m ', `0', `0', ` ')`'%r`$1', F`'4($2, $3)',
! 47: `0', `0', `stws,M %r`$1', F`'4($2, $3)')')')dnl
! 48: define(`STWSS', `ifelse(`$3', `19', `dnl',
! 49: `0', `0', `STWSS($1, $2, eval($3 - 1), $4, $5)')
! 50: STWS($3, $1, $2, $4, $5)dnl
! 51: ')dnl
! 52: define(`LDWSS', `ifelse(`$3', `19', `dnl',
! 53: `0', `0', `LDWSS($1, $2, eval($3 - 1))')
! 54: ldws,M F`'4($1, $2), %r`'$3`'dnl
! 55: ')dnl
! 56: dnl
! 57: dnl copy data in 4-words blocks
! 58: dnl
! 59: define(`hppa_blcopy',`
! 60: addi -16, $6, $6
! 61: L($1, `loop16'`$7')
! 62: ldw F 32($2, $3), %r0
! 63: ifelse(F, `-', `dnl
! 64: addi F`'4, $5, $5', `0', `0', `dnl')
! 65: LDWSS($2, $3, 22)
! 66: STWSS($4, $5, 21, `%ret1', $7)
! 67: ifelse($7, `u', `dnl
! 68: STWS(4, $4, $5, `%ret1', $7)', $7, `a', `dnl')
! 69: addib,>= -16, $6, L($1, `loop16'`$7')
! 70: ifelse($7, `a', `dnl
! 71: STWS(4, $4, $5, `%ret1', $7)dnl
! 72: ', $7, `u', `dnl
! 73: copy %r19, %ret1')')dnl
! 74: dnl
! 75: dnl copy in words
! 76: dnl
! 77: define(`STWL', `addib,<,n 12, $6, L($1, cleanup)
! 78: ifelse($7, `u', ` copy %ret1, %r22', $7, `a', `dnl')
! 79: L($1, word)
! 80: ldws,M F`'4($2, $3), %r22
! 81: addib,>= -4, $6, L($1, word)
! 82: stws,M %r22, F`'4($4, $5)
! 83:
! 84: L($1, cleanup)
! 85: addib,=,n 4, $6, L($1, done)
! 86: ldws 0($2, $3), %r22
! 87: add $5, $6, $5
! 88: b L($1, done)
! 89: stbys,E %r22, 0($4, $5)
! 90: ')
! 91: dnl
! 92: dnl
! 93: dnl parameters:
! 94: dnl $1 name
! 95: dnl $2 source space
! 96: dnl $3 source address
! 97: dnl $4 destination space
! 98: dnl $5 destination address
! 99: dnl $6 length
! 100: dnl $7 direction
! 101: dnl
! 102: define(hppa_copy,
! 103: `dnl
! 104: dnl
! 105: dnl if direction is `-' (backwards copy), adjust src, dst
! 106: dnl
! 107: ifelse($7,`-', `add $3, $6, $3
! 108: add $5, $6, $5
! 109: define(`F', `-')dnl
! 110: define(`R', `')dnl
! 111: define(`M', `mb')dnl
! 112: define(`B', `e')dnl
! 113: define(`E', `b')dnl
! 114: ',dnl ifelse
! 115: `0',`0',
! 116: `define(`F', `')dnl
! 117: define(`R', `-')dnl
! 118: define(`M', `ma')dnl
! 119: define(`B', `b')dnl
! 120: define(`E', `e')dnl
! 121: ')dnl ifelse
! 122:
! 123: ifelse($7,`-', `', `0',`0',
! 124: ` comib,>=,n 15, $6, L($1, byte)
! 125:
! 126: extru $3, 31, 2, %r20
! 127: extru $5, 31, 2, %r19
! 128: add $6, %r19, $6
! 129: comb,<> %r20, %r19, L($1, unaligned)
! 130: dep %r0, 31, 2, $3
! 131: hppa_blcopy($1, $2, $3, $4, $5, $6, `a')
! 132:
! 133: STWL($1, $2, $3, $4, $5, $6, `a')dnl
! 134:
! 135: L($1, unaligned)
! 136: sub,>= %r19, %r20, %r21
! 137: ldwm F`'4($2, $3), %ret1
! 138: zdep %r21, 28, 29, %r22
! 139: mtsar %r22
! 140: hppa_blcopy($1, $2, $3, $4, $5, $6, `u')
! 141:
! 142: dnl STWL($1, $2, $3, $4, $5, $6, `u')
! 143: addib,<,n 12, $6, L($1, cleanup_un)
! 144: L($1, word_un)
! 145: ldws,M F`'4($2, $3), %r22
! 146: vshd %ret1, %r22, %r21
! 147: addib,< -4, $6, L($1, cleanup1_un)
! 148: stws,M %r21, F`'4($4, $5)
! 149: ldws,M F`'4($2, $3), %ret1
! 150: vshd %r22, %ret1, %r21
! 151: addib,>= -4, $6, L($1, word_un)
! 152: stws,M %r21, F`'4($4, $5)
! 153:
! 154: L($1, cleanup_un)
! 155: addib,<=,n 4, $6, L($1, done)
! 156: mfctl %sar, %r19
! 157: add $5, $6, $5
! 158: extru %r19, 28, 2, %r19
! 159: sub,<= $6, %r19, %r0
! 160: ldws,M F`'4($2, $3), %r22
! 161: vshd %ret1, %r22, %r21
! 162: b L($1, done)
! 163: stbys,E %r21, 0($4, $5)
! 164:
! 165: L($1, cleanup1_un)
! 166: b L($1, cleanup_un)
! 167: copy %r22, %ret1
! 168: ')dnl ifelse
! 169:
! 170: L($1, byte)
! 171: comb,>=,n %r0, $6, L($1, done)
! 172: L($1, byte_loop)
! 173: ldbs,M F`'1($2, $3), %r22
! 174: addib,<> -1, $6, L($1, byte_loop)
! 175: stbs,M %r22, F`'1($4, $5)
! 176: L($1, done)
! 177: ')dnl
! 178: `
! 179: #undef _LOCORE
! 180: #define _LOCORE
! 181: #include <machine/asm.h>
! 182: #include <machine/frame.h>
! 183: '
! 184: ifelse(NAME, `bcopy',
! 185: `
! 186: #if defined(LIBC_SCCS)
! 187: .text
! 188: .asciz "versionmacro"
! 189: .align 4
! 190: #endif
! 191:
! 192: LEAF_ENTRY(memcpy)
! 193: ALTENTRY(memmove)
! 194: copy %arg0, %r22
! 195: copy %arg1, %arg0
! 196: copy %r22, %arg1
! 197: copy %arg0, %ret0
! 198: ALTENTRY(ovbcopy)
! 199: ALTENTRY(bcopy)
! 200: comb,>,n %arg1, %arg0, L(bcopy, reverse)
! 201: hppa_copy(bcopy_f, %sr0, %arg0, %sr0, %arg1, %arg2, `+')
! 202: bv %r0(%rp)
! 203: nop
! 204: L(bcopy, reverse)
! 205: hppa_copy(bcopy_r, %sr0, %arg0, %sr0, %arg1, %arg2, `-')
! 206: bv %r0(%rp)
! 207: nop
! 208: EXIT(memcpy)
! 209: ')dnl
! 210: dnl
! 211: ifelse(NAME, `spcopy',
! 212: `
! 213: #ifdef _KERNEL
! 214: #include <assym.h>
! 215:
! 216: /*
! 217: * int spcopy (pa_space_t ssp, const void *src, pa_space_t dsp, void *dst,
! 218: * size_t size)
! 219: * do a space to space bcopy.
! 220: *
! 221: * assumes that spaces do not clash, otherwise we lose
! 222: */
! 223: .import copy_on_fault, code
! 224: LEAF_ENTRY(spcopy)
! 225: sub,<> %r0, arg4, %r0
! 226: bv %r0(%rp)
! 227: nop
! 228: `
! 229: std %rp, HPPA_FRAME_RP(%sp)
! 230: ldo HPPA_FRAME_SIZE(%sp), %sp
! 231: /* setup fault handler */
! 232: mfctl %cr24, %arg1
! 233: ldd CI_CURPROC(%arg1), %r1
! 234: ldil L%copy_on_fault, %r21
! 235: ldd P_ADDR(%r20), %r2
! 236: ldo R%copy_on_fault(%r21), %r21
! 237: ldd PCB_ONFAULT+U_PCB(%r2), %r1
! 238: std %r21, PCB_ONFAULT+U_PCB(%r2)
! 239: '
! 240: mtsp %arg0, %sr1
! 241: mtsp %arg2, %sr2
! 242:
! 243: copy arg4, %ret0
! 244: hppa_copy(spcopy, %sr1, %arg1, %sr2, %arg3, %ret0, `+')
! 245:
! 246: mtsp %r0, %sr1
! 247: mtsp %r0, %sr2
! 248: /* reset fault handler */
! 249: std %r1, PCB_ONFAULT+U_PCB(%r2)
! 250: ldo -HPPA_FRAME_SIZE(%sp), %sp
! 251: ldd HPPA_FRAME_RP(%sp), %rp
! 252: bv %r0(%rp)
! 253: copy %r0, %ret0
! 254: EXIT(spcopy)
! 255: #endif
! 256: ')dnl
! 257:
! 258: .end
CVSweb