diff options
| author | scottr <scottr@NetBSD.org> | 2001-02-05 00:17:22 +0000 |
|---|---|---|
| committer | scottr <scottr@NetBSD.org> | 2001-02-05 00:17:22 +0000 |
| commit | ed472989a6c27e05a5793e4f3bdf030d9cd023eb (patch) | |
| tree | 62f201f5ee0b32e0ff3c2a25ed53c57fab890ff5 | |
| parent | 7b10d18078192f45bc5eb6f229adf22059726132 (diff) | |
Implement a significantly improved version of memccpy(), with thanks to
Ignatios Souvatzis for correcting the SVR4 ABI code and for a few
micro-optimizations that followed from these changes.
The overall improvement was measured at 3-4x for copies of at least
4 bytes on the 68030, and 8 bytes on the 68040. For smaller copies
the improvement was still measurable, if not as dramatic.
| -rw-r--r-- | lib/libc/arch/m68k/string/memccpy.S | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/lib/libc/arch/m68k/string/memccpy.S b/lib/libc/arch/m68k/string/memccpy.S new file mode 100644 index 00000000000..4a88a9c8e39 --- /dev/null +++ b/lib/libc/arch/m68k/string/memccpy.S @@ -0,0 +1,82 @@ +/* $NetBSD: memccpy.S,v 1.1 2001/02/05 00:17:22 scottr Exp $ */ + +/* + * Copyright (C) 1999 Scott Reynolds. All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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) && !defined(lint) + RCSID("$NetBSD: memccpy.S,v 1.1 2001/02/05 00:17:22 scottr Exp $") +#endif /* LIBC_SCCS and not lint */ + +ENTRY(memccpy) + movl %sp@(16),%d0 | count + jeq Lmcbail | nothing to do + + movl %sp@(4),%a0 | a0 = toaddr + subql #1,%d0 | prepare count for DBcc loop + movl %sp@(8),%a1 | a1 = fromaddr + movl %sp@(12),%d1 | d1 = terminator + jeq Lmcloop | handle ASCII NUL specially + + movl %d2,%sp@- | save scratch register +Lmcnzloop: + movb %a1@+,%d2 | move a byte + movb %d2,%a0@+ + cmpb %d2,%d1 | found the terminator? + dbeq %d0,Lmcnzloop | if not, keep transferring, + jeq Lmcnzdone | otherwise done + clrw %d0 | check to see if more to do + subql #1,%d0 + jcc Lmcnzloop | yes, keep going... + + movl %sp@+,%d2 | restore scratch register + movql #0,%d0 | no terminator found, return NULL +#ifdef __SVR4_ABI__ + movl %d0,%a0 | XXX maybe use lea to avoid stall? +#endif + rts + +Lmcloop: + movb %a1@+,%a0@+ | move a byte; was it NUL? + dbeq %d0,Lmcloop | if not, keep transferring, + jeq Lmcdone | otherwise done + clrw %d0 | check to see if more to do + subql #1,%d0 + jcc Lmcloop | yes, keep going... + | Note: %d0 is now -1! + movql #0,%d0 | no terminator found, return NULL +Lmcbail: +#ifdef __SVR4_ABI__ + movl %d0,%a0 | XXX maybe use lea to avoid stall? +#endif + rts + +Lmcnzdone: + movl %sp@+,%d2 | restore scratch register +Lmcdone: + movl %a0,%d0 + rts |
