bcopy.S revision 1.1.16.2 1 /* $NetBSD: bcopy.S,v 1.1.16.2 2020/04/21 19:37:43 martin Exp $ */
2
3 /*-
4 * Copyright (c) 2000 Doug Rabson
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 *
28 * __FBSDID("$FreeBSD: releng/10.1/lib/libc/ia64/string/bcopy.S 125669 2004-02-10 20:45:28Z cperciva $");
29 */
30
31 #include <machine/asm.h>
32
33 /*
34 * void
35 * bcopy(const void *src, void *dst, size_t len);
36 */
37
38 /*
39 * Not the fastest bcopy in the world.
40 */
41 ENTRY(bcopy, 3)
42
43 cmp.le p6,p0=in2,r0 // bail if len <= 0
44 (p6) br.ret.spnt.few rp
45
46 sub r14=in1,in0 ;; // check for overlap
47 cmp.ltu p6,p0=r14,in2 // dst-src < len
48 (p6) br.cond.spnt.few 5f
49
50 extr.u r14=in0,0,3 // src & 7
51 extr.u r15=in1,0,3 ;; // dst & 7
52 cmp.eq p6,p0=r14,r15 // different alignment?
53 (p6) br.cond.spnt.few 2f // branch if same alignment
54
55 1: ld1 r14=[in0],1 ;; // copy bytewise
56 st1 [in1]=r14,1
57 add in2=-1,in2 ;; // len--
58 cmp.ne p6,p0=r0,in2
59 (p6) br.cond.dptk.few 1b // loop
60 br.ret.sptk.few rp // done
61
62 2: cmp.eq p6,p0=r14,r0 // aligned?
63 (p6) br.cond.sptk.few 4f
64
65 3: ld1 r14=[in0],1 ;; // copy bytewise
66 st1 [in1]=r14,1
67 extr.u r15=in0,0,3 // src & 7
68 add in2=-1,in2 ;; // len--
69 cmp.eq p6,p0=r0,in2 // done?
70 cmp.eq p7,p0=r0,r15 ;; // aligned now?
71 (p6) br.ret.spnt.few rp // return if done
72 (p7) br.cond.spnt.few 4f // go to main copy
73 br.cond.sptk.few 3b // more bytes to copy
74
75 // At this point, in2 is non-zero
76
77 4: mov r14=8 ;;
78 cmp.ltu p6,p0=in2,r14 ;; // len < 8?
79 (p6) br.cond.spnt.few 1b // byte copy the end
80 ld8 r15=[in0],8 ;; // copy word
81 st8 [in1]=r15,8
82 add in2=-8,in2 ;; // len -= 8
83 cmp.ne p6,p0=r0,in2 // done?
84 (p6) br.cond.spnt.few 4b // again
85
86 br.ret.sptk.few rp // return
87
88 // Don't bother optimising overlap case
89
90 5: add in0=in0,in2
91 add in1=in1,in2 ;;
92 add in0=-1,in0
93 add in1=-1,in1 ;;
94
95 6: ld1 r14=[in0],-1 ;;
96 st1 [in1]=r14,-1
97 add in2=-1,in2 ;;
98 cmp.ne p6,p0=r0,in2
99 (p6) br.cond.spnt.few 6b
100
101 br.ret.sptk.few rp
102 END(bcopy)
103