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