~ubuntu-branches/ubuntu/precise/eglibc/precise-201308281639

« back to all changes in this revision

Viewing changes to ports/sysdeps/vax/memmove.s

  • Committer: Package Import Robot
  • Author(s): Matthias Klose
  • Date: 2012-02-08 01:58:09 UTC
  • mfrom: (1.5.3) (288.1.12 precise)
  • Revision ID: package-import@ubuntu.com-20120208015809-ulscst7uteq3e22z
Tags: 2.15~pre6-0ubuntu10
Merge from Debian (r5151, 2.13-26).

Show diffs side-by-side

added added

removed removed

Lines of Context:
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
 
 * 4. Neither the name of the University nor the names of its contributors
14
 
 *    may be used to endorse or promote products derived from this software
15
 
 *    without specific prior written permission.
16
 
 *
17
 
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
18
 
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19
 
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20
 
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
21
 
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22
 
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23
 
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24
 
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25
 
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26
 
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27
 
 * SUCH DAMAGE.
28
 
 */
29
 
 
30
 
#if defined(LIBC_SCCS) && !defined(lint)
31
 
        .asciz "@(#)memmove.s   5.1 (Berkeley) 5/15/90"
32
 
#endif /* LIBC_SCCS and not lint */
33
 
 
34
 
/*
35
 
 * void *memmove(dst, src, size)
36
 
 * returns dst
37
 
 *
38
 
 * This optimises the usual case (count < 65536) at the expense
39
 
 * of some extra memory references and branches when count >= 65536.
40
 
 */
41
 
 
42
 
#include "DEFS.h"
43
 
 
44
 
ENTRY(memmove, 0)
45
 
        movzwl  $65535,r0       /* r0 = 64K (needed below) */
46
 
        movq    8(ap),r1        /* r1 = src, r2 = length */
47
 
        movl    4(ap),r3        /* r3 = dst */
48
 
        cmpl    r1,r3
49
 
        bgtru   1f              /* normal forward case */
50
 
        beql    2f              /* equal, nothing to do */
51
 
        addl2   r2,r1           /* overlaps iff src<dst but src+len>dst */
52
 
        cmpl    r1,r3
53
 
        bgtru   4f              /* overlapping, must move backwards */
54
 
        subl2   r2,r1
55
 
 
56
 
1:      /* move forward */
57
 
        cmpl    r2,r0
58
 
        bgtru   3f              /* stupid movc3 limitation */
59
 
        movc3   r2,(r1),(r3)    /* move it all */
60
 
2:
61
 
        movl    4(ap),r0        /* return original dst */
62
 
        ret
63
 
3:
64
 
        subl2   r0,12(ap)       /* adjust length by 64K */
65
 
        movc3   r0,(r1),(r3)    /* move 64K */
66
 
        movl    12(ap),r2
67
 
        decw    r0              /* from 0 to 65535 */
68
 
        brb     1b              /* retry */
69
 
 
70
 
4:      /* move backward */
71
 
        addl2   r2,r3
72
 
5:
73
 
        cmpl    r2,r0
74
 
        bgtru   6f              /* stupid movc3 limitation */
75
 
        subl2   r2,r1
76
 
        subl2   r2,r3
77
 
        movc3   r2,(r1),(r3)    /* move it all */
78
 
        movl    4(ap),r0        /* return original dst */
79
 
        ret
80
 
6:
81
 
        subl2   r0,12(ap)       /* adjust length by 64K */
82
 
        subl2   r0,r1
83
 
        subl2   r0,r3
84
 
        movc3   r0,(r1),(r3)    /* move 64K */
85
 
        movl    12(ap),r2
86
 
        decw    r0
87
 
        subl2   r0,r1
88
 
        subl2   r0,r3
89
 
        brb     5b