From 1ab7d22f97ea0829f4ecd7575ba5e8c1bea12bca Mon Sep 17 00:00:00 2001 From: alc Date: Fri, 8 Apr 2005 05:15:55 +0000 Subject: Add machine-specific, optimized implementations of bcmp and memcmp. PR: 73111 Submitted by: Ville-Pertti Keinonen (taken from NetBSD) MFC after: 3 weeks --- lib/libc/amd64/string/Makefile.inc | 2 +- lib/libc/amd64/string/bcmp.S | 25 +++++++++++++++++++++++ lib/libc/amd64/string/memcmp.S | 41 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 lib/libc/amd64/string/bcmp.S create mode 100644 lib/libc/amd64/string/memcmp.S (limited to 'lib/libc') diff --git a/lib/libc/amd64/string/Makefile.inc b/lib/libc/amd64/string/Makefile.inc index 725339f..b669af8 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 0000000..bb72035 --- /dev/null +++ b/lib/libc/amd64/string/bcmp.S @@ -0,0 +1,25 @@ +#include +__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 0000000..28194f8 --- /dev/null +++ b/lib/libc/amd64/string/memcmp.S @@ -0,0 +1,41 @@ +/* + * Written by J.T. Conklin . + * Public domain. + * Adapted for NetBSD/x86_64 by Frank van der Linden + */ + +#include +__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 -- cgit v1.1