|
|
1.1 root 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 are permitted
6: * provided that: (1) source distributions retain this entire copyright
7: * notice and comment, and (2) distributions including binaries display
8: * the following acknowledgement: ``This product includes software
9: * developed by the University of California, Berkeley and its contributors''
10: * in the documentation or other materials provided with the distribution
11: * and in all advertising materials mentioning features or use of this
12: * software. Neither the name of the University nor the names of its
13: * contributors may be used to endorse or promote products derived
14: * from this software without specific prior written permission.
15: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
16: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
17: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
18: */
19:
20: #if defined(LIBC_SCCS) && !defined(lint)
21: .asciz "@(#)memmove.s 5.1 (Berkeley) 5/15/90"
22: #endif /* LIBC_SCCS and not lint */
23:
24: /*
25: * void *memmove(dst, src, size)
26: * returns dst
27: *
28: * This optimises the usual case (count < 65536) at the expense
29: * of some extra memory references and branches when count >= 65536.
30: */
31:
32: #include "DEFS.h"
33:
34: ENTRY(memmove, 0)
35: movzwl $65535,r0 /* r0 = 64K (needed below) */
36: movq 8(ap),r1 /* r1 = src, r2 = length */
37: movl 4(ap),r3 /* r3 = dst */
38: cmpl r1,r3
39: bgtru 1f /* normal forward case */
40: beql 2f /* equal, nothing to do */
41: addl2 r2,r1 /* overlaps iff src<dst but src+len>dst */
42: cmpl r1,r3
43: bgtru 4f /* overlapping, must move backwards */
44: subl2 r2,r1
45:
46: 1: /* move forward */
47: cmpl r2,r0
48: bgtru 3f /* stupid movc3 limitation */
49: movc3 r2,(r1),(r3) /* move it all */
50: 2:
51: movl 4(ap),r0 /* return original dst */
52: ret
53: 3:
54: subl2 r0,12(ap) /* adjust length by 64K */
55: movc3 r0,(r1),(r3) /* move 64K */
56: movl 12(ap),r2
57: decw r0 /* from 0 to 65535 */
58: brb 1b /* retry */
59:
60: 4: /* move backward */
61: addl2 r2,r3
62: 5:
63: cmpl r2,r0
64: bgtru 6f /* stupid movc3 limitation */
65: subl2 r2,r1
66: subl2 r2,r3
67: movc3 r2,(r1),(r3) /* move it all */
68: movl 4(ap),r0 /* return original dst */
69: ret
70: 6:
71: subl2 r0,12(ap) /* adjust length by 64K */
72: subl2 r0,r1
73: subl2 r0,r3
74: movc3 r0,(r1),(r3) /* move 64K */
75: movl 12(ap),r2
76: decw r0
77: subl2 r0,r1
78: subl2 r0,r3
79: brb 5b
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.