Annotation of sys/lib/libkern/arch/hppa/bcopy.m4, Revision 1.1.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