Converted to use weak aliases with macros from libc-symbols.h.
[kopensolaris-gnu/glibc.git] / sysdeps / vax / memmove.s
1 /*-
2  * Copyright (c) 1990 The Regents of the University of California.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. All advertising materials mentioning features or use of this software
14  *    must display the following acknowledgement:
15  *      This product includes software developed by the University of
16  *      California, Berkeley and its contributors.
17  * 4. Neither the name of the University nor the names of its contributors
18  *    may be used to endorse or promote products derived from this software
19  *    without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31  * SUCH DAMAGE.
32  */
33
34 #if defined(LIBC_SCCS) && !defined(lint)
35         .asciz "@(#)memmove.s   5.1 (Berkeley) 5/15/90"
36 #endif /* LIBC_SCCS and not lint */
37
38 /*
39  * void *memmove(dst, src, size)
40  * returns dst
41  *
42  * This optimises the usual case (count < 65536) at the expense
43  * of some extra memory references and branches when count >= 65536.
44  */
45
46 #include "DEFS.h"
47
48 ENTRY(memmove, 0)
49         movzwl  $65535,r0       /* r0 = 64K (needed below) */
50         movq    8(ap),r1        /* r1 = src, r2 = length */
51         movl    4(ap),r3        /* r3 = dst */
52         cmpl    r1,r3
53         bgtru   1f              /* normal forward case */
54         beql    2f              /* equal, nothing to do */
55         addl2   r2,r1           /* overlaps iff src<dst but src+len>dst */
56         cmpl    r1,r3
57         bgtru   4f              /* overlapping, must move backwards */
58         subl2   r2,r1
59
60 1:      /* move forward */
61         cmpl    r2,r0
62         bgtru   3f              /* stupid movc3 limitation */
63         movc3   r2,(r1),(r3)    /* move it all */
64 2:
65         movl    4(ap),r0        /* return original dst */
66         ret
67 3:
68         subl2   r0,12(ap)       /* adjust length by 64K */
69         movc3   r0,(r1),(r3)    /* move 64K */
70         movl    12(ap),r2
71         decw    r0              /* from 0 to 65535 */
72         brb     1b              /* retry */
73
74 4:      /* move backward */
75         addl2   r2,r3
76 5:
77         cmpl    r2,r0
78         bgtru   6f              /* stupid movc3 limitation */
79         subl2   r2,r1
80         subl2   r2,r3
81         movc3   r2,(r1),(r3)    /* move it all */
82         movl    4(ap),r0        /* return original dst */
83         ret
84 6:
85         subl2   r0,12(ap)       /* adjust length by 64K */
86         subl2   r0,r1
87         subl2   r0,r3
88         movc3   r0,(r1),(r3)    /* move 64K */
89         movl    12(ap),r2
90         decw    r0
91         subl2   r0,r1
92         subl2   r0,r3
93         brb     5b