update for HEAD-2003091401
[reactos.git] / lib / string / i386 / memmove.s
1 /* 
2  * $Id$
3  */
4
5 /*
6  * void *memmove (void *to, const void *from, size_t count)
7  */
8
9 .globl  _memmove
10
11 _memmove:
12         push    %ebp
13         mov     %esp,%ebp
14         
15         push    %esi
16         push    %edi
17         
18         mov     8(%ebp),%edi
19         mov     12(%ebp),%esi
20         mov     16(%ebp),%ecx
21         
22         cmp     %esi,%edi
23         jbe     .CopyUp
24         mov     %ecx,%eax
25         add     %esi,%eax
26         cmp     %eax,%edi
27         jb      .CopyDown
28         
29 .CopyUp:        
30         cld
31         
32         cmp     $16,%ecx
33         jb      .L1
34         mov     %ecx,%edx
35         test    $3,%edi
36         je      .L2
37 /*
38  * Make the destination dword aligned
39  */
40         mov     %edi,%ecx
41         and     $3,%ecx
42         sub     $5,%ecx
43         not     %ecx
44         sub     %ecx,%edx
45         rep     movsb
46         mov     %edx,%ecx       
47 .L2:
48         shr     $2,%ecx
49         rep     movsl
50         mov     %edx,%ecx
51         and     $3,%ecx
52 .L1:    
53         test    %ecx,%ecx
54         je      .L3
55         rep     movsb
56 .L3:
57         mov     16(%ebp),%eax
58         pop     %edi
59         pop     %esi
60         leave
61         ret
62
63 .CopyDown:
64         std
65         
66         add     %ecx,%edi
67         add     %ecx,%esi
68         
69         cmp     $16,%ecx
70         jb      .L4
71         mov     %ecx,%edx
72         test    $3,%edi
73         je      .L5
74         
75 /*
76  * Make the destination dword aligned
77  */
78         mov     %edi,%ecx
79         and     $3,%ecx
80         sub     %ecx,%edx
81         dec     %esi
82         dec     %edi
83         rep     movsb
84         mov     %edx,%ecx
85         
86         sub     $3,%esi
87         sub     $3,%edi
88 .L6:    
89         shr     $2,%ecx
90         rep     movsl
91         mov     %edx,%ecx
92         and     $3,%ecx
93         je      .L7
94         add     $3,%esi
95         add     $3,%edi
96 .L8:    
97         rep     movsb
98 .L7:
99         cld
100         mov     8(%ebp),%eax
101         pop     %edi
102         pop     %esi
103         leave
104         ret
105 .L5:
106         sub     $4,%edi
107         sub     $4,%esi
108         jmp     .L6
109                 
110 .L4:
111         test    %ecx,%ecx
112         je      .L7     
113         dec     %esi
114         dec     %edi
115         jmp     .L8
116