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