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