Initial commit: functional for newer bzImage kernels
[wraplinux.git] / reloc / memmove.S
1 /* ----------------------------------------------------------------------- *
2  *   
3  *   Copyright 2008 H. Peter Anvin - All Rights Reserved
4  *
5  *   Permission is hereby granted, free of charge, to any person
6  *   obtaining a copy of this software and associated documentation
7  *   files (the "Software"), to deal in the Software without
8  *   restriction, including without limitation the rights to use,
9  *   copy, modify, merge, publish, distribute, sublicense, and/or
10  *   sell copies of the Software, and to permit persons to whom
11  *   the Software is furnished to do so, subject to the following
12  *   conditions:
13  *   
14  *   The above copyright notice and this permission notice shall
15  *   be included in all copies or substantial portions of the Software.
16  *   
17  *   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18  *   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
19  *   OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20  *   NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
21  *   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
22  *   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
23  *   FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
24  *   OTHER DEALINGS IN THE SOFTWARE.
25  *
26  * ----------------------------------------------------------------------- */
27
28 /*
29  * memmove.S
30  *
31  * Reasonably efficient memmove
32  */
33
34         .globl  memmove
35         .type   memmove,@function
36         .text
37 memmove:
38         pushl   %ebx
39         pushl   %esi
40         pushl   %edi
41
42         movl    %eax,%edi
43         movl    %edx,%esi
44
45         cmpl    %edi,%esi
46         jb      1f
47
48         /* source >= dest, forwards move */
49         movl    %ecx,%eax
50         shrl    $2,%ecx
51         andl    $3,%eax
52
53         rep; movsl
54         movl    %eax,%ecx
55         rep; movsb
56
57         jmp     2f
58 1:
59         /* source < dest, backwards move */
60         leal    -4(%ecx,%esi),%esi
61         leal    -4(%ecx,%edi),%edi
62
63         movl    %ecx,%eax
64         shrl    $2,%ecx
65         andl    $3,%eax
66
67         std
68         rep; movsl
69         movl    %eax,%ecx
70         addl    $3,%esi
71         addl    $3,%edi
72         rep; movsb
73         cld
74
75 2:
76         popl    %edi
77         popl    %esi
78         popl    %ebx
79         ret
80
81         .size   memmove, .-memmove