xref: /netbsd-src/common/lib/libc/arch/x86_64/string/memset.S (revision aaf4ece63a859a04e37cf3a7229b5fab0157cc06)
1/*
2 * Written by J.T. Conklin <jtc@NetBSD.org>.
3 * Public domain.
4 * Adapted for NetBSD/x86_64 by Frank van der Linden <fvdl@wasabisystems.com>
5 */
6
7#include <machine/asm.h>
8
9#if defined(LIBC_SCCS)
10	RCSID("$NetBSD: memset.S,v 1.1 2005/12/20 19:28:51 christos Exp $")
11#endif
12
13ENTRY(memset)
14	movq	%rsi,%rax
15	andq	$0xff,%rax
16	movq	%rdx,%rcx
17	movq	%rdi,%r11
18
19	cld				/* set fill direction forward */
20
21	/*
22	 * if the string is too short, it's really not worth the overhead
23	 * of aligning to word boundries, etc.  So we jump to a plain
24	 * unaligned set.
25	 */
26	cmpq	$0x0f,%rcx
27	jle	L1
28
29	movb	%al,%ah			/* copy char to all bytes in word */
30	movl	%eax,%edx
31	sall	$16,%eax
32	orl	%edx,%eax
33
34	movl	%eax,%edx
35	salq	$32,%rax
36	orq	%rdx,%rax
37
38	movq	%rdi,%rdx		/* compute misalignment */
39	negq	%rdx
40	andq	$7,%rdx
41	movq	%rcx,%r8
42	subq	%rdx,%r8
43
44	movq	%rdx,%rcx		/* set until word aligned */
45	rep
46	stosb
47
48	movq	%r8,%rcx
49	shrq	$3,%rcx			/* set by words */
50	rep
51	stosq
52
53	movq	%r8,%rcx		/* set remainder by bytes */
54	andq	$7,%rcx
55L1:	rep
56	stosb
57	movq	%r11,%rax
58
59	ret
60