xref: /freebsd/lib/libc/amd64/string/memset.S (revision 282a3889ebf826db9839be296ff1dd903f6d6d6e)
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__FBSDID("$FreeBSD$");
9
10#if 0
11	RCSID("$NetBSD: memset.S,v 1.3 2004/02/26 20:50:06 drochner Exp $")
12#endif
13
14ENTRY(memset)
15	movq	%rsi,%rax
16	andq	$0xff,%rax
17	movq	%rdx,%rcx
18	movq	%rdi,%r11
19
20	cld				/* set fill direction forward */
21
22	/*
23	 * if the string is too short, it's really not worth the overhead
24	 * of aligning to word boundries, etc.  So we jump to a plain
25	 * unaligned set.
26	 */
27	cmpq	$0x0f,%rcx
28	jle	L1
29
30	movb	%al,%ah			/* copy char to all bytes in word */
31	movl	%eax,%edx
32	sall	$16,%eax
33	orl	%edx,%eax
34
35	movl	%eax,%edx
36	salq	$32,%rax
37	orq	%rdx,%rax
38
39	movq	%rdi,%rdx		/* compute misalignment */
40	negq	%rdx
41	andq	$7,%rdx
42	movq	%rcx,%r8
43	subq	%rdx,%r8
44
45	movq	%rdx,%rcx		/* set until word aligned */
46	rep
47	stosb
48
49	movq	%r8,%rcx
50	shrq	$3,%rcx			/* set by words */
51	rep
52	stosq
53
54	movq	%r8,%rcx		/* set remainder by bytes */
55	andq	$7,%rcx
56L1:	rep
57	stosb
58	movq	%r11,%rax
59
60	ret
61