OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [newlib-1.17.0/] [newlib/] [libc/] [machine/] [i386/] [memmove.S] - Blame information for rev 816

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 148 jeremybenn
/*
2
 * ====================================================
3
 * Copyright (C) 1998, 2002 by Red Hat Inc. All rights reserved.
4
 *
5
 * Permission to use, copy, modify, and distribute this
6
 * software is freely granted, provided that this notice
7
 * is preserved.
8
 * ====================================================
9
 */
10
 
11
        #include "i386mach.h"
12
 
13
        .global SYM (memmove)
14
       SOTYPE_FUNCTION(memmove)
15
 
16
SYM (memmove):
17
 
18
        pushl ebp
19
        movl esp,ebp
20
        pushl esi
21
        pushl edi
22
        pushl ebx
23
        movl 8(ebp),edi
24
        movl 16(ebp),ecx
25
        movl 12(ebp),esi
26
 
27
/*  check for destructive overlap (src < dst && dst < src + length) */
28
 
29
        cld
30
        cmpl edi,esi
31
        jae  .L2
32
        leal -1(ecx,esi),ebx
33
        cmpl ebx,edi
34
        ja   .L2
35
 
36
/* IF:   destructive overlap, must copy backwards */
37
 
38
        addl ecx,esi
39
        addl ecx,edi
40
        std
41
 
42
#ifndef __OPTIMIZE_SIZE__
43
 
44
        cmpl $8,ecx
45
        jbe .L13
46
.L18:
47
 
48
/* move trailing bytes in reverse until destination address is long word aligned */
49
 
50
        movl edi,edx
51
        movl ecx,ebx
52
        andl $3,edx
53
        jz .L21
54
 
55
        movl edx,ecx
56
        decl esi
57
        decl edi
58
        subl ecx,ebx
59
        rep
60
        movsb
61
 
62
        mov ebx,ecx
63
        incl esi
64
        incl edi
65
 
66
.L21:
67
 
68
/* move bytes in reverse, a long word at a time */
69
 
70
        shrl $2,ecx
71
        subl $4,esi
72
        subl $4,edi
73
        rep
74
        movsl
75
 
76
        addl $4,esi
77
        addl $4,edi
78
        movl ebx,ecx
79
        andl $3,ecx
80
 
81
#endif /* !__OPTIMIZE_SIZE__ */
82
 
83
/* handle any remaining bytes not on a long word boundary */
84
 
85
.L13:
86
        decl esi
87
        decl edi
88
 
89
.L15:
90
        rep
91
        movsb
92
        jmp .L5
93
        .p2align 4,,7
94
 
95
/* ELSE:   no destructive overlap so we copy forwards */
96
 
97
.L2:
98
 
99
#ifndef __OPTIMIZE_SIZE__
100
 
101
        cmpl $8,ecx
102
        jbe .L3
103
 
104
/* move any preceding bytes until destination address is long word aligned */
105
 
106
        movl edi,edx
107
        movl ecx,ebx
108
        andl $3,edx
109
        jz .L11
110
        movl $4,ecx
111
        subl edx,ecx
112
        andl $3,ecx
113
        subl ecx,ebx
114
        rep
115
        movsb
116
 
117
        mov ebx,ecx
118
 
119
/* move bytes a long word at a time */
120
 
121
.L11:
122
        shrl $2,ecx
123
        .p2align 2
124
        rep
125
        movsl
126
 
127
        movl ebx,ecx
128
        andl $3,ecx
129
 
130
#endif /* !__OPTIMIZE_SIZE__ */
131
 
132
/* handle any remaining bytes */
133
 
134
.L3:
135
        rep
136
        movsb
137
.L5:
138
        movl 8(ebp),eax
139
        cld
140
 
141
        leal -12(ebp),esp
142
        popl ebx
143
        popl edi
144
        popl esi
145
        leave
146
        ret

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.