diff options
Diffstat (limited to 'lib/libc/amd64/string/memset.S')
-rw-r--r-- | lib/libc/amd64/string/memset.S | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/lib/libc/amd64/string/memset.S b/lib/libc/amd64/string/memset.S new file mode 100644 index 0000000..142387a --- /dev/null +++ b/lib/libc/amd64/string/memset.S @@ -0,0 +1,60 @@ +/* + * Written by J.T. Conklin <jtc@NetBSD.org>. + * Public domain. + * Adapted for NetBSD/x86_64 by Frank van der Linden <fvdl@wasabisystems.com> + */ + +#include <machine/asm.h> +__FBSDID("$FreeBSD$"); + +#if 0 + RCSID("$NetBSD: memset.S,v 1.3 2004/02/26 20:50:06 drochner Exp $") +#endif + +ENTRY(memset) + movq %rsi,%rax + andq $0xff,%rax + movq %rdx,%rcx + movq %rdi,%r11 + + cld /* set fill direction forward */ + + /* + * if the string is too short, it's really not worth the overhead + * of aligning to word boundries, etc. So we jump to a plain + * unaligned set. + */ + cmpq $0x0f,%rcx + jle L1 + + movb %al,%ah /* copy char to all bytes in word */ + movl %eax,%edx + sall $16,%eax + orl %edx,%eax + + movl %eax,%edx + salq $32,%rax + orq %rdx,%rax + + movq %rdi,%rdx /* compute misalignment */ + negq %rdx + andq $7,%rdx + movq %rcx,%r8 + subq %rdx,%r8 + + movq %rdx,%rcx /* set until word aligned */ + rep + stosb + + movq %r8,%rcx + shrq $3,%rcx /* set by words */ + rep + stosq + + movq %r8,%rcx /* set remainder by bytes */ + andq $7,%rcx +L1: rep + stosb + movq %r11,%rax + + ret |