1 /* $OpenBSD: memset.S,v 1.3 2007/05/25 20:32:29 krw Exp $ */
2
3 /*
4 * Written by J.T. Conklin <jtc@netbsd.org>.
5 * Public domain.
6 */
7
8 #include <machine/asm.h>
9
10 ENTRY(memset)
11 pushl %edi
12 pushl %ebx
13 movl 12(%esp),%edi
14 movzbl 16(%esp),%eax /* unsigned char, zero extend */
15 movl 20(%esp),%ecx
16 pushl %edi /* push address of buffer */
17
18 cld /* set fill direction forward */
19
20 /*
21 * if the string is too short, it's really not worth the overhead
22 * of aligning to word boundaries, etc. So we jump to a plain
23 * unaligned set.
24 */
25 cmpl $0x0f,%ecx
26 jle L1
27
28 movb %al,%ah /* copy char to all bytes in word */
29 movl %eax,%edx
30 sall $16,%eax
31 orl %edx,%eax
32
33 movl %edi,%edx /* compute misalignment */
34 negl %edx
35 andl $3,%edx
36 movl %ecx,%ebx
37 subl %edx,%ebx
38
39 movl %edx,%ecx /* set until word aligned */
40 rep
41 stosb
42
43 movl %ebx,%ecx
44 shrl $2,%ecx /* set by words */
45 rep
46 stosl
47
48 movl %ebx,%ecx /* set remainder by bytes */
49 andl $3,%ecx
50 L1: rep
51 stosb
52
53 popl %eax /* pop address of buffer */
54 popl %ebx
55 popl %edi
56 ret