Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/lib/libkern/arch/i386 Significantly faster memcpy/memmov...
details: https://anonhg.NetBSD.org/src/rev/7bfed591f866
branches: trunk
changeset: 545727:7bfed591f866
user: dsl <dsl%NetBSD.org@localhost>
date: Tue Apr 15 22:49:50 2003 +0000
description:
Significantly faster memcpy/memmove/bcopy and memset/bzero
diffstat:
sys/lib/libkern/arch/i386/bcopy.S | 104 +--------------------------
sys/lib/libkern/arch/i386/bzero.S | 44 +----------
sys/lib/libkern/arch/i386/memcpy.S | 138 +++++++++++++++++++++++++++++++++++-
sys/lib/libkern/arch/i386/memmove.S | 4 +-
sys/lib/libkern/arch/i386/memset.S | 119 +++++++++++++++++++++++-------
5 files changed, 235 insertions(+), 174 deletions(-)
diffs (truncated from 468 to 300 lines):
diff -r 9d7bbb8ac2dd -r 7bfed591f866 sys/lib/libkern/arch/i386/bcopy.S
--- a/sys/lib/libkern/arch/i386/bcopy.S Tue Apr 15 22:26:42 2003 +0000
+++ b/sys/lib/libkern/arch/i386/bcopy.S Tue Apr 15 22:49:50 2003 +0000
@@ -1,101 +1,5 @@
-/*-
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from locore.s.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <machine/asm.h>
-
-#if defined(LIBC_SCCS)
- RCSID("$NetBSD: bcopy.S,v 1.3 2002/07/10 06:02:09 kent Exp $")
-#endif
-
- /*
- * (ov)bcopy (src,dst,cnt)
- * ws%tools.de@localhost (Wolfgang Solfrank, TooLs GmbH) +49-228-985800
- */
+/* $NetBSD: bcopy.S,v 1.4 2003/04/15 22:49:50 dsl Exp $ */
-#ifdef MEMCOPY
-ENTRY(memcpy)
-#else
-#ifdef MEMMOVE
-ENTRY(memmove)
-#else
-ENTRY(bcopy)
-#endif
-#endif
- pushl %esi
- pushl %edi
-#if defined(MEMCOPY) || defined(MEMMOVE)
- movl 12(%esp),%edi
- movl 16(%esp),%esi
- movl %edi,%eax /* return value */
-#else
- movl 12(%esp),%esi
- movl 16(%esp),%edi
-#endif
- movl 20(%esp),%ecx
- movl %edi,%edx
- subl %esi,%edx
- cmpl %ecx,%edx /* overlapping? */
- movl %ecx,%edx
- jb 1f
- cld /* nope, copy forwards. */
- shrl $2,%ecx /* copy by words */
- rep
- movsl
- movl %edx,%ecx
- andl $3,%ecx /* any bytes left? */
- rep
- movsb
- popl %edi
- popl %esi
- ret
-1:
- addl %ecx,%edi /* copy backwards. */
- addl %ecx,%esi
- std
- andl $3,%ecx /* any fractional bytes? */
- decl %edi
- decl %esi
- rep
- movsb
- movl %edx,%ecx /* copy remainder by words */
- shrl $2,%ecx
- subl $3,%esi
- subl $3,%edi
- rep
- movsl
- popl %edi
- popl %esi
- cld
- ret
+#define BCOPY
+#define NO_OVERLAP
+#include "memcpy.S"
diff -r 9d7bbb8ac2dd -r 7bfed591f866 sys/lib/libkern/arch/i386/bzero.S
--- a/sys/lib/libkern/arch/i386/bzero.S Tue Apr 15 22:26:42 2003 +0000
+++ b/sys/lib/libkern/arch/i386/bzero.S Tue Apr 15 22:49:50 2003 +0000
@@ -1,46 +1,10 @@
-/*
- * Written by J.T. Conklin <jtc%netbsd.org@localhost>.
- * Public domain.
- */
+/* $NetBSD: bzero.S,v 1.7 2003/04/15 22:49:50 dsl Exp $ */
#include <machine/asm.h>
#if defined(LIBC_SCCS)
- RCSID("$NetBSD: bzero.S,v 1.6 1998/02/22 08:14:57 mycroft Exp $")
+ RCSID("$NetBSD: bzero.S,v 1.7 2003/04/15 22:49:50 dsl Exp $")
#endif
-ENTRY(bzero)
- pushl %edi
- movl 8(%esp),%edi
- movl 12(%esp),%edx
-
- cld /* set fill direction forward */
- xorl %eax,%eax /* set fill data to 0 */
-
- /*
- * 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 $16,%edx
- jb L1
-
- movl %edi,%ecx /* compute misalignment */
- negl %ecx
- andl $3,%ecx
- subl %ecx,%edx
- rep /* zero until word aligned */
- stosb
-
- movl %edx,%ecx /* zero by words */
- shrl $2,%ecx
- andl $3,%edx
- rep
- stosl
-
-L1: movl %edx,%ecx /* zero remainder by bytes */
- rep
- stosb
-
- popl %edi
- ret
+#define BZERO
+#include "memset.S"
diff -r 9d7bbb8ac2dd -r 7bfed591f866 sys/lib/libkern/arch/i386/memcpy.S
--- a/sys/lib/libkern/arch/i386/memcpy.S Tue Apr 15 22:26:42 2003 +0000
+++ b/sys/lib/libkern/arch/i386/memcpy.S Tue Apr 15 22:49:50 2003 +0000
@@ -1,4 +1,136 @@
-/* $NetBSD: memcpy.S,v 1.2 1998/02/22 08:14:58 mycroft Exp $ */
+/* $NetBSD: memcpy.S,v 1.3 2003/04/15 22:49:50 dsl Exp $ */
+
+/*-
+ * Copyright (c) 1990 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * This code is derived from locore.s.
+ * Optimised by David Laight 2003
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <machine/asm.h>
+
+#if defined(LIBC_SCCS)
+ RCSID("$NetBSD: memcpy.S,v 1.3 2003/04/15 22:49:50 dsl Exp $")
+#endif
+
+ /*
+ * (ov)bcopy (src,dst,cnt)
+ * ws%tools.de@localhost (Wolfgang Solfrank, TooLs GmbH) +49-228-985800
+ */
-#define MEMCOPY
-#include "bcopy.S"
+#ifdef BCOPY
+ENTRY(bcopy)
+#else
+#ifdef MEMMOVE
+ENTRY(memmove)
+#else
+#define NO_OVERLAP
+ENTRY(memcpy)
+#endif
+#endif
+ push %esi
+ mov %edi,%edx
+#if defined(BCOPY)
+ movl 8(%esp),%esi
+ movl 12(%esp),%edi
+#else
+ movl 8(%esp),%edi
+ movl 12(%esp),%esi
+#endif
+ movl 16(%esp),%ecx
+#if defined(NO_OVERLAP)
+ movl %ecx,%eax
+#else
+ movl %edi,%eax
+ subl %esi,%eax
+ cmpl %ecx,%eax /* overlapping? */
+ movl %ecx,%eax
+ jb backwards
+#endif
+ cld /* nope, copy forwards. */
+ shrl $2,%ecx /* copy by words */
+ rep
+ movsl
+ and $3,%eax /* any bytes left? */
+ jnz trailing
+done:
+#if defined(MEMCPY) || defined(MEMMOVE)
+ movl 8(%esp),%eax
+#endif
+ mov %edx,%edi
+ pop %esi
+ ret
+
+trailing:
+ cmp $2,%eax
+ jb 1f
+ movw (%esi),%ax
+ movw %ax,(%edi)
+ je done
+ movb 2(%esi),%al
+ movb %al,2(%edi)
+ jmp done
+1: movb (%esi),%al
+ movb %al,(%edi)
+ jmp done
+
+#if !defined(NO_OVERLAP)
+backwards:
+ addl %ecx,%edi /* copy backwards. */
+ addl %ecx,%esi
+ and $3,%eax /* any fractional bytes? */
+ jnz back_align
+back_aligned:
+ shrl $2,%ecx
+ subl $4,%esi
+ subl $4,%edi
+ std
+ rep
+ movsl
+ cld
+ jmp done
+
+back_align:
+ sub %eax,%esi
+ sub %eax,%edi
+ cmp $2,%eax
+ jb 1f
+ je 2f
+ movb 2(%esi),%al
+ movb %al,2(%edi)
+2: movw (%esi),%ax
Home |
Main Index |
Thread Index |
Old Index