diff options
author | Alan Cox <alc@FreeBSD.org> | 2005-04-09 20:47:08 +0000 |
---|---|---|
committer | Alan Cox <alc@FreeBSD.org> | 2005-04-09 20:47:08 +0000 |
commit | e5dd4df84cf1ca0360e111bc6ca4cbbad0b22bb7 (patch) | |
tree | 254d7a3ce20286e478d0d9286350cd7c4b2c821e /lib/libc | |
parent | c5e1d51bcd8d43ecbf24d68ac96885c576128181 (diff) | |
download | src-e5dd4df84cf1ca0360e111bc6ca4cbbad0b22bb7.tar.gz src-e5dd4df84cf1ca0360e111bc6ca4cbbad0b22bb7.zip |
Add a machine-specific, optimized implementation of strcmp.
PR: 73111
Submitted by: Ville-Pertti Keinonen <will@iki.fi> (taken from NetBSD)
MFC after: 3 weeks
Notes
Notes:
svn path=/head/; revision=144847
Diffstat (limited to 'lib/libc')
-rw-r--r-- | lib/libc/amd64/string/Makefile.inc | 3 | ||||
-rw-r--r-- | lib/libc/amd64/string/strcmp.S | 73 |
2 files changed, 75 insertions, 1 deletions
diff --git a/lib/libc/amd64/string/Makefile.inc b/lib/libc/amd64/string/Makefile.inc index b669af8f27f6..4432e59c2f22 100644 --- a/lib/libc/amd64/string/Makefile.inc +++ b/lib/libc/amd64/string/Makefile.inc @@ -1,3 +1,4 @@ # $FreeBSD$ -MDSRCS+= bcmp.S bcopy.S bzero.S memcmp.S memcpy.S memmove.S memset.S +MDSRCS+= bcmp.S bcopy.S bzero.S memcmp.S memcpy.S memmove.S memset.S \ + strcmp.S diff --git a/lib/libc/amd64/string/strcmp.S b/lib/libc/amd64/string/strcmp.S new file mode 100644 index 000000000000..a7d252376978 --- /dev/null +++ b/lib/libc/amd64/string/strcmp.S @@ -0,0 +1,73 @@ +/* + * Written by J.T. Conklin <jtc@acorntoolworks.com> + * Public domain. + */ + +#include <machine/asm.h> +__FBSDID("$FreeBSD$"); + +#if 0 + RCSID("$NetBSD: strcmp.S,v 1.3 2004/07/19 20:04:41 drochner Exp $") +#endif + +ENTRY(strcmp) + /* + * Align s1 to word boundary. + * Consider unrolling loop? + */ +.Ls1align: + testb $7,%dil + je .Ls1aligned + movb (%rdi),%al + incq %rdi + movb (%rsi),%dl + incq %rsi + testb %al,%al + je .Ldone + cmpb %al,%dl + je .Ls1align + jmp .Ldone + + /* + * Check whether s2 is aligned to a word boundry. If it is, we + * can compare by words. Otherwise we have to compare by bytes. + */ +.Ls1aligned: + testb $7,%sil + jne .Lbyte_loop + + movabsq $0x0101010101010101,%r8 + subq $8,%rdi + movabsq $0x8080808080808080,%r9 + subq $8,%rsi + + .align 4 +.Lword_loop: + movq 8(%rdi),%rax + addq $8,%rdi + movq 8(%rsi),%rdx + addq $8,%rsi + cmpq %rax,%rdx + jne .Lbyte_loop + subq %r8,%rdx + notq %rax + andq %rax,%rdx + testq %r9,%rdx + je .Lword_loop + + .align 4 +.Lbyte_loop: + movb (%rdi),%al + incq %rdi + movb (%rsi),%dl + incq %rsi + testb %al,%al + je .Ldone + cmpb %al,%dl + je .Lbyte_loop + +.Ldone: + movzbq %al,%rax + movzbq %dl,%rdx + subq %rdx,%rax + ret |