Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/lib/libc/arch/i386/string Bring code in from obsolesent bcopy.S
details: https://anonhg.NetBSD.org/src/rev/d46677def561
branches: trunk
changeset: 573636:d46677def561
user: dsl <dsl%NetBSD.org@localhost>
date: Thu Feb 03 22:31:44 2005 +0000
description:
Bring code in from obsolesent bcopy.S
Optimise to avoid mis-predicted braches and 'rep movsb' for small %cx.
diffstat:
lib/libc/arch/i386/string/memcpy.S | 135 +++++++++++++++++++++++++++++++++++-
lib/libc/arch/i386/string/memmove.S | 4 +-
2 files changed, 134 insertions(+), 5 deletions(-)
diffs (150 lines):
diff -r 740088340336 -r d46677def561 lib/libc/arch/i386/string/memcpy.S
--- a/lib/libc/arch/i386/string/memcpy.S Thu Feb 03 22:05:01 2005 +0000
+++ b/lib/libc/arch/i386/string/memcpy.S Thu Feb 03 22:31:44 2005 +0000
@@ -1,4 +1,133 @@
-/* $NetBSD: memcpy.S,v 1.2 1998/01/09 03:45:07 perry Exp $ */
+/* $NetBSD: memcpy.S,v 1.3 2005/02/03 22:31:44 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. 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 2005/02/03 22:31:44 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 MEMCPY
+#define NO_OVERLAP
+ENTRY(memcpy)
+#endif
+#endif
+ push %esi
+ mov %edi,%edx
+#if defined(MEMCPY) || defined(MEMMOVE)
+ movl 8(%esp),%edi
+ movl 12(%esp),%esi
+#else
+ movl 8(%esp),%esi
+ movl 12(%esp),%edi
+#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
+ movw %ax,(%edi)
+ jmp back_aligned
+1: movb (%esi),%al
+ movb %al,(%edi)
+ jmp back_aligned
+#endif
diff -r 740088340336 -r d46677def561 lib/libc/arch/i386/string/memmove.S
--- a/lib/libc/arch/i386/string/memmove.S Thu Feb 03 22:05:01 2005 +0000
+++ b/lib/libc/arch/i386/string/memmove.S Thu Feb 03 22:31:44 2005 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: memmove.S,v 1.4 1998/01/09 03:45:08 perry Exp $ */
+/* $NetBSD: memmove.S,v 1.5 2005/02/03 22:31:44 dsl Exp $ */
#define MEMMOVE
-#include "bcopy.S"
+#include "memcpy.S"
Home |
Main Index |
Thread Index |
Old Index