core: do aligned transfers in bcopy32
[syslinux.git] / com32 / lib / memmove.S
blobe39f884be98b1f72ce89e935530e72b3116b7adc
1 /* ----------------------------------------------------------------------- *
2  *
3  *   Copyright 2008 rPath, Inc. - 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  * ----------------------------------------------------------------------- */
29  * memmove.S
30  *
31  * Reasonably efficient memmove
32  */
34         .globl  memmove
35         .type   memmove,@function
36         .text
37 memmove:
38         pushl   %esi
39         pushl   %edi
41         movl    %eax,%edi
42         movl    %edx,%esi
44         cmpl    %edi,%esi
45         jb      1f
47         /* source >= dest, forwards move */
48         movl    %ecx,%edx
49         shrl    $2,%ecx
50         andl    $3,%edx
52         rep; movsl
53         movl    %edx,%ecx
54         rep; movsb
56         jmp     2f
58         /* source < dest, backwards move */
59         leal    -4(%ecx,%esi),%esi
60         leal    -4(%ecx,%edi),%edi
62         movl    %ecx,%edx
63         shrl    $2,%ecx
64         andl    $3,%edx
66         std
67         rep; movsl
68         movl    %edx,%ecx
69         addl    $3,%esi
70         addl    $3,%edi
71         rep; movsb
72         cld
75         popl    %edi
76         popl    %esi
77         ret
79         .size   memmove, .-memmove