about summary refs log tree commit diff
path: root/sysdeps/x86_64/strchrnul.S
diff options
context:
space:
mode:
authorOndřej Bílka <neleai@seznam.cz>2013-09-11 17:07:38 +0200
committerOndřej Bílka <neleai@seznam.cz>2013-09-11 17:07:38 +0200
commit5905e7b3e29139dbef84c065ca39315485f497e1 (patch)
treec0333d621bbb599eb32a3c773ebc21ce53d6c438 /sysdeps/x86_64/strchrnul.S
parentb987c776723eea2f223885289c466386f12e823a (diff)
downloadglibc-5905e7b3e29139dbef84c065ca39315485f497e1.tar.gz
glibc-5905e7b3e29139dbef84c065ca39315485f497e1.tar.xz
glibc-5905e7b3e29139dbef84c065ca39315485f497e1.zip
Faster strchr implementation.
Diffstat (limited to 'sysdeps/x86_64/strchrnul.S')
-rw-r--r--sysdeps/x86_64/strchrnul.S41
1 files changed, 3 insertions, 38 deletions
diff --git a/sysdeps/x86_64/strchrnul.S b/sysdeps/x86_64/strchrnul.S
index d8c345ba7d..bceeb61875 100644
--- a/sysdeps/x86_64/strchrnul.S
+++ b/sysdeps/x86_64/strchrnul.S
@@ -20,43 +20,8 @@
 
 #include <sysdep.h>
 
-
-	.text
-ENTRY (__strchrnul)
-	movd	%esi, %xmm1
-	movq	%rdi, %rcx
-	punpcklbw %xmm1, %xmm1
-	andq	$~15, %rdi
-	pxor	%xmm2, %xmm2
-	punpcklbw %xmm1, %xmm1
-	orl	$0xffffffff, %esi
-	movdqa	(%rdi), %xmm0
-	pshufd	$0, %xmm1, %xmm1
-	subq	%rdi, %rcx
-	movdqa	%xmm0, %xmm3
-	leaq	16(%rdi), %rdi
-	pcmpeqb	%xmm1, %xmm0
-	pcmpeqb	%xmm2, %xmm3
-	shl	%cl, %esi
-	pmovmskb %xmm0, %edx
-	pmovmskb %xmm3, %ecx
-	orl	%edx, %ecx
-	andl	%esi, %ecx
-	jnz	1f
-
-2:	movdqa	(%rdi), %xmm0
-	leaq	16(%rdi), %rdi
-	movdqa	%xmm0, %xmm3
-	pcmpeqb	%xmm1, %xmm0
-	pcmpeqb	%xmm2, %xmm3
-	pmovmskb %xmm0, %edx
-	pmovmskb %xmm3, %ecx
-	orl	%edx, %ecx
-	jz	2b
-
-1:	bsfl	%ecx, %edx
-	leaq	-16(%rdi,%rdx), %rax
-	ret
-END (__strchrnul)
+#define strchr __strchrnul
+#define AS_STRCHRNUL
+#include "strchr.S"
 
 weak_alias (__strchrnul, strchrnul)