diff options
author | 1996-03-08 23:42:59 +0000 | |
---|---|---|
committer | 1996-03-08 23:42:59 +0000 | |
commit | 7fde9e0dc22beb7d437468cb50f0893c861cf235 (patch) | |
tree | 08400cb2dd9d834d6e06e343519bbc0dfa30deb6 /sys/lib/libkern/arch/i386/memset.S | |
parent | From NetBSD: (diff) | |
download | wireguard-openbsd-7fde9e0dc22beb7d437468cb50f0893c861cf235.tar.xz wireguard-openbsd-7fde9e0dc22beb7d437468cb50f0893c861cf235.zip |
From NetBSD:
linux compatibility changes.
Diffstat (limited to 'sys/lib/libkern/arch/i386/memset.S')
-rw-r--r-- | sys/lib/libkern/arch/i386/memset.S | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/sys/lib/libkern/arch/i386/memset.S b/sys/lib/libkern/arch/i386/memset.S new file mode 100644 index 00000000000..da90db37568 --- /dev/null +++ b/sys/lib/libkern/arch/i386/memset.S @@ -0,0 +1,58 @@ +/* + * Written by J.T. Conklin <jtc@netbsd.org>. + * Public domain. + */ + +#include <machine/asm.h> + +#if defined(LIBC_SCCS) + RCSID("$NetBSD: memset.S,v 1.8 1995/04/28 22:58:05 jtc Exp $") +#endif + +ENTRY(memset) + pushl %edi + pushl %ebx + movl 12(%esp),%edi + movzbl 16(%esp),%eax /* unsigned char, zero extend */ + movl 20(%esp),%ecx + pushl %edi /* push address of buffer */ + + 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. + */ + cmpl $0x0f,%ecx + jle L1 + + movb %al,%ah /* copy char to all bytes in word */ + movl %eax,%edx + sall $16,%eax + orl %edx,%eax + + movl %edi,%edx /* compute misalignment */ + negl %edx + andl $3,%edx + movl %ecx,%ebx + subl %edx,%ebx + + movl %edx,%ecx /* set until word aligned */ + rep + stosb + + movl %ebx,%ecx + shrl $2,%ecx /* set by words */ + rep + stosl + + movl %ebx,%ecx /* set remainder by bytes */ + andl $3,%ecx +L1: rep + stosb + + popl %eax /* pop address of buffer */ + popl %ebx + popl %edi + ret |