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