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