xref: /openbsd-src/sys/lib/libkern/arch/amd64/bzero.S (revision 5cd8e87fa7cd53a2131a2fe6e6551a2efe02ce90)
1f5df1827Smickey/*
2f5df1827Smickey * Written by J.T. Conklin <jtc@netbsd.org>.
3f5df1827Smickey * Public domain.
4f5df1827Smickey * Adapted for NetBSD/x86_64 by Frank van der Linden <fvdl@wasabisystems.com>
5f5df1827Smickey */
6f5df1827Smickey
7f5df1827Smickey#include <machine/asm.h>
8f5df1827Smickey
9f5df1827SmickeyENTRY(bzero)
101d66f0a0Smortimer	RETGUARD_SETUP(bzero, r11)
11f5df1827Smickey	movq	%rsi,%rdx
12f5df1827Smickey
13f5df1827Smickey	xorq	%rax,%rax		/* set fill data to 0 */
14f5df1827Smickey
15f5df1827Smickey	/*
16f5df1827Smickey	 * if the string is too short, it's really not worth the overhead
17f70d55c3Skrw	 * of aligning to word boundaries, etc.  So we jump to a plain
18f5df1827Smickey	 * unaligned set.
19f5df1827Smickey	 */
20f5df1827Smickey	cmpq	$16,%rdx
21*5cd8e87fSguenther	jb	1f
22f5df1827Smickey
23f5df1827Smickey	movq	%rdi,%rcx		/* compute misalignment */
24f5df1827Smickey	negq	%rcx
25f5df1827Smickey	andq	$7,%rcx
26f5df1827Smickey	subq	%rcx,%rdx
27f5df1827Smickey	rep				/* zero until word aligned */
28f5df1827Smickey	stosb
29f5df1827Smickey
30f5df1827Smickey	movq	%rdx,%rcx		/* zero by words */
31f5df1827Smickey	shrq	$3,%rcx
32f5df1827Smickey	andq	$7,%rdx
33f5df1827Smickey	rep
34f5df1827Smickey	stosq
35f5df1827Smickey
36*5cd8e87fSguenther1:	movq	%rdx,%rcx		/* zero remainder by bytes */
37f5df1827Smickey	rep
38f5df1827Smickey	stosb
391d66f0a0Smortimer	RETGUARD_CHECK(bzero, r11)
40f5df1827Smickey	ret
41fc541c5dSguenther	lfence
42*5cd8e87fSguentherEND(bzero)
43