diff options
author | Alan Cox <alc@FreeBSD.org> | 2005-04-08 05:15:55 +0000 |
---|---|---|
committer | Alan Cox <alc@FreeBSD.org> | 2005-04-08 05:15:55 +0000 |
commit | 26f6218be92649295dbb54aa1a18fbd9110631fd (patch) | |
tree | 1d60e90ccc86866f80d1d021c44ec1929f68e2aa | |
parent | e76ce25370bd9df6dfa270355bd098033b5c42f1 (diff) |
Notes
-rw-r--r-- | lib/libc/amd64/string/Makefile.inc | 2 | ||||
-rw-r--r-- | lib/libc/amd64/string/bcmp.S | 25 | ||||
-rw-r--r-- | lib/libc/amd64/string/memcmp.S | 41 |
3 files changed, 67 insertions, 1 deletions
diff --git a/lib/libc/amd64/string/Makefile.inc b/lib/libc/amd64/string/Makefile.inc index 725339fd5bb8..b669af8f27f6 100644 --- a/lib/libc/amd64/string/Makefile.inc +++ b/lib/libc/amd64/string/Makefile.inc @@ -1,3 +1,3 @@ # $FreeBSD$ -MDSRCS+= bcopy.S bzero.S memcpy.S memmove.S memset.S +MDSRCS+= bcmp.S bcopy.S bzero.S memcmp.S memcpy.S memmove.S memset.S diff --git a/lib/libc/amd64/string/bcmp.S b/lib/libc/amd64/string/bcmp.S new file mode 100644 index 000000000000..bb72035dabce --- /dev/null +++ b/lib/libc/amd64/string/bcmp.S @@ -0,0 +1,25 @@ +#include <machine/asm.h> +__FBSDID("$FreeBSD$"); + +#if 0 + RCSID("$NetBSD: bcmp.S,v 1.1 2001/06/19 00:25:04 fvdl Exp $") +#endif + +ENTRY(bcmp) + xorl %eax,%eax /* clear return value */ + cld /* set compare direction forward */ + + movq %rdx,%rcx /* compare by words */ + shrq $3,%rcx + repe + cmpsq + jne L1 + + movq %rdx,%rcx /* compare remainder by bytes */ + andq $7,%rcx + repe + cmpsb + je L2 + +L1: incl %eax +L2: ret diff --git a/lib/libc/amd64/string/memcmp.S b/lib/libc/amd64/string/memcmp.S new file mode 100644 index 000000000000..28194f82e7a0 --- /dev/null +++ b/lib/libc/amd64/string/memcmp.S @@ -0,0 +1,41 @@ +/* + * Written by J.T. Conklin <jtc@NetBSD.org>. + * Public domain. + * Adapted for NetBSD/x86_64 by Frank van der Linden <fvdl@wasabisystems.com> + */ + +#include <machine/asm.h> +__FBSDID("$FreeBSD$"); + +#if 0 + RCSID("$NetBSD: memcmp.S,v 1.2 2003/07/26 19:24:39 salo Exp $") +#endif + +ENTRY(memcmp) + cld /* set compare direction forward */ + movq %rdx,%rcx /* compare by longs */ + shrq $3,%rcx + repe + cmpsq + jne L5 /* do we match so far? */ + + movq %rdx,%rcx /* compare remainder by bytes */ + andq $7,%rcx + repe + cmpsb + jne L6 /* do we match? */ + + xorl %eax,%eax /* we match, return zero */ + ret + +L5: movl $8,%ecx /* We know that one of the next */ + subq %rcx,%rdi /* eight pairs of bytes do not */ + subq %rcx,%rsi /* match. */ + repe + cmpsb +L6: xorl %eax,%eax /* Perform unsigned comparison */ + movb -1(%rdi),%al + xorl %edx,%edx + movb -1(%rsi),%dl + subl %edx,%eax + ret |