Cygwin: Add new APIs tc[gs]etwinsize()
[newlib-cygwin.git] / newlib / libc / machine / i386 / memset.S
blob83b25567b7f2a8baffab427bdc45915e62e67007
1 /*
2  * ====================================================
3  * Copyright (C) 1998, 2002, 2008 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  */
11         #include "i386mach.h"
13         .global SYM (memset)
14        SOTYPE_FUNCTION(memset)
16 SYM (memset):
18 #ifdef __iamcu__
19         pushl edi
20         movl eax,edi
21         movzbl dl,eax
22         mov edi,edx
23         rep stosb
24         mov edx,eax
25         popl edi
26 #else
27         pushl ebp
28         movl esp,ebp
29         pushl edi
30         movl 8(ebp),edi
31         movzbl 12(ebp),eax
32         movl 16(ebp),ecx
33         cld
35 #ifndef __OPTIMIZE_SIZE__
36 /* Less than 16 bytes won't benefit from the 'rep stosl' loop.  */
37         cmpl $16,ecx
38         jbe .L19
39         testl $7,edi
40         je .L10
42 /* It turns out that 8-byte aligned 'rep stosl' outperforms
43    4-byte aligned on some x86 platforms.  */
44         movb al,(edi)
45         incl edi
46         decl ecx
47         testl $7,edi
48         je .L10
50         movb al,(edi)
51         incl edi
52         decl ecx
53         testl $7,edi
54         je .L10
56         movb al,(edi)
57         incl edi
58         decl ecx
59         testl $7,edi
60         je .L10
62         movb al,(edi)
63         incl edi
64         decl ecx
65         testl $7,edi
66         je .L10
68         movb al,(edi)
69         incl edi
70         decl ecx
71         testl $7,edi
72         je .L10
74         movb al,(edi)
75         incl edi
76         decl ecx
77         testl $7,edi
78         je .L10
80         movb al,(edi)
81         incl edi
82         decl ecx
84 /* At this point, ecx>8 and edi%8==0.  */
85 .L10:
86         movb al,ah
87         movl eax,edx
88         sall $16,edx
89         orl edx,eax
91         movl ecx,edx
92         shrl $2,ecx
93         andl $3,edx
94         rep
95         stosl
96         movl edx,ecx
97 #endif /* not __OPTIMIZE_SIZE__ */
99 .L19:
100         rep
101         stosb
103         movl 8(ebp),eax
105         leal -4(ebp),esp
106         popl edi
107         leave
108 #endif
109         ret