59 lines
1.0 KiB
ArmAsm
59 lines
1.0 KiB
ArmAsm
/*
|
|
* 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>
|
|
|
|
#if defined(LIBC_SCCS)
|
|
RCSID("$NetBSD: memset.S,v 1.1 2001/06/19 00:22:46 fvdl Exp $")
|
|
#endif
|
|
|
|
ENTRY(memset)
|
|
movq %rsi,%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
|