Merge branch 'master' into rosh_for_hpa
[profile/ivi/syslinux.git] / memdisk / memset.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  * memset.S
30  *
31  * Reasonably efficient memset, using aligned transfers at least
32  * for the destination operand.
33  */
34
35         .globl  memset
36         .type   memset,@function
37         .text
38 memset:
39         jecxz   6f
40
41         pushl   %edi
42         pushl   %ebx
43         pushl   %eax            /* Return value */
44
45         movl    %eax,%edi
46         movb    %dl,%dh
47         movzwl  %dx,%eax
48         shll    $16,%edx
49         orl     %edx,%eax
50
51         /* Initial alignment */
52         movl    %edi,%edx
53         shrl    $1,%edx
54         jnc     1f
55         stosb
56         decl    %ecx
57 1:
58         movb    %cl,%bl
59         cmpl    $2,%ecx
60         jb      3f
61         shrl    $1,%edx
62         jnc     2f
63         stosw
64         subl    $2,%ecx
65 2:
66         /* Bulk transfer */
67         movb    %cl,%bl
68         shrl    $2,%ecx
69         rep; stosl
70
71         testb   $2,%bl
72         jz      4f
73         stosw
74 3:
75 4:
76         testb   $1,%bl
77         jz      5f
78         stosb
79 5:
80         popl    %eax            /* Return value */
81         popl    %ebx
82         popl    %edi
83 6:
84         ret
85
86         .size   memset, .-memset