diff options
author | Michael Shalayeff <mickey@cvs.openbsd.org> | 1996-03-08 23:43:09 +0000 |
---|---|---|
committer | Michael Shalayeff <mickey@cvs.openbsd.org> | 1996-03-08 23:43:09 +0000 |
commit | 8ab2b3248060a94c830a02a994ed3772efb2413d (patch) | |
tree | cd006918f1e3eaeb33acd209b8ef855abf14489c /sys/lib/libkern/arch/i386 | |
parent | 85864939dde7c81c82fffc74e98da01f3f05408a (diff) |
From NetBSD:
linux compatibility changes.
Diffstat (limited to 'sys/lib/libkern/arch/i386')
-rw-r--r-- | sys/lib/libkern/arch/i386/Makefile.inc | 2 | ||||
-rw-r--r-- | sys/lib/libkern/arch/i386/memset.S | 58 |
2 files changed, 59 insertions, 1 deletions
diff --git a/sys/lib/libkern/arch/i386/Makefile.inc b/sys/lib/libkern/arch/i386/Makefile.inc index 533df315a66..cbeec30a509 100644 --- a/sys/lib/libkern/arch/i386/Makefile.inc +++ b/sys/lib/libkern/arch/i386/Makefile.inc @@ -1,5 +1,5 @@ # $NetBSD: Makefile.inc,v 1.7 1995/10/07 09:52:48 mycroft Exp $ SRCS+= __main.c imax.c imin.c lmax.c lmin.c max.c min.c ulmax.c ulmin.c \ - bcmp.S ffs.S strcat.S strcmp.S strcpy.S strlen.S strncmp.c \ + bcmp.S ffs.S memset.S strcat.S strcmp.S strcpy.S strlen.S strncmp.c \ strncpy.c scanc.S skpc.S locc.S htonl.S htons.S ntohl.S ntohs.S 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 |