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