Blame sysdeps/x86_64/strchr.S

Packit Service 82fcde
/* strchr (str, ch) -- Return pointer to first occurrence of CH in STR.
Packit Service 82fcde
   For AMD x86-64.
Packit Service 82fcde
   Copyright (C) 2009-2018 Free Software Foundation, Inc.
Packit Service 82fcde
   This file is part of the GNU C Library.
Packit Service 82fcde
Packit Service 82fcde
   The GNU C Library is free software; you can redistribute it and/or
Packit Service 82fcde
   modify it under the terms of the GNU Lesser General Public
Packit Service 82fcde
   License as published by the Free Software Foundation; either
Packit Service 82fcde
   version 2.1 of the License, or (at your option) any later version.
Packit Service 82fcde
Packit Service 82fcde
   The GNU C Library is distributed in the hope that it will be useful,
Packit Service 82fcde
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 82fcde
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 82fcde
   Lesser General Public License for more details.
Packit Service 82fcde
Packit Service 82fcde
   You should have received a copy of the GNU Lesser General Public
Packit Service 82fcde
   License along with the GNU C Library; if not, see
Packit Service 82fcde
   <http://www.gnu.org/licenses/>.  */
Packit Service 82fcde
Packit Service 82fcde
#include <sysdep.h>
Packit Service 82fcde
Packit Service 82fcde
	.text
Packit Service 82fcde
ENTRY (strchr)
Packit Service 82fcde
	movd	%esi, %xmm1
Packit Service 82fcde
	movl	%edi, %eax
Packit Service 82fcde
	andl	$4095, %eax
Packit Service 82fcde
	punpcklbw %xmm1, %xmm1
Packit Service 82fcde
	cmpl	$4032, %eax
Packit Service 82fcde
	punpcklwd %xmm1, %xmm1
Packit Service 82fcde
	pshufd	$0, %xmm1, %xmm1
Packit Service 82fcde
	jg	L(cross_page)
Packit Service 82fcde
	movdqu	(%rdi), %xmm0
Packit Service 82fcde
	pxor	%xmm3, %xmm3
Packit Service 82fcde
	movdqa	%xmm0, %xmm4
Packit Service 82fcde
	pcmpeqb	%xmm1, %xmm0
Packit Service 82fcde
	pcmpeqb	%xmm3, %xmm4
Packit Service 82fcde
	por	%xmm4, %xmm0
Packit Service 82fcde
	pmovmskb %xmm0, %eax
Packit Service 82fcde
	test	%eax, %eax
Packit Service 82fcde
	je	L(next_48_bytes)
Packit Service 82fcde
	bsf	%eax, %eax
Packit Service 82fcde
#ifdef AS_STRCHRNUL
Packit Service 82fcde
	leaq	(%rdi,%rax), %rax
Packit Service 82fcde
#else
Packit Service 82fcde
	movl	$0, %edx
Packit Service 82fcde
	leaq	(%rdi,%rax), %rax
Packit Service 82fcde
	cmpb	%sil, (%rax)
Packit Service 82fcde
	cmovne	%rdx, %rax
Packit Service 82fcde
#endif
Packit Service 82fcde
	ret
Packit Service 82fcde
Packit Service 82fcde
	.p2align 3
Packit Service 82fcde
	L(next_48_bytes):
Packit Service 82fcde
	movdqu	16(%rdi), %xmm0
Packit Service 82fcde
	movdqa	%xmm0, %xmm4
Packit Service 82fcde
	pcmpeqb	%xmm1, %xmm0
Packit Service 82fcde
	pcmpeqb	%xmm3, %xmm4
Packit Service 82fcde
	por	%xmm4, %xmm0
Packit Service 82fcde
	pmovmskb %xmm0, %ecx
Packit Service 82fcde
	movdqu	32(%rdi), %xmm0
Packit Service 82fcde
	movdqa	%xmm0, %xmm4
Packit Service 82fcde
	pcmpeqb	%xmm1, %xmm0
Packit Service 82fcde
	salq	$16, %rcx
Packit Service 82fcde
	pcmpeqb	%xmm3, %xmm4
Packit Service 82fcde
	por	%xmm4, %xmm0
Packit Service 82fcde
	pmovmskb %xmm0, %eax
Packit Service 82fcde
	movdqu	48(%rdi), %xmm0
Packit Service 82fcde
	pcmpeqb	%xmm0, %xmm3
Packit Service 82fcde
	salq	$32, %rax
Packit Service 82fcde
	pcmpeqb	%xmm1, %xmm0
Packit Service 82fcde
	orq	%rcx, %rax
Packit Service 82fcde
	por	%xmm3, %xmm0
Packit Service 82fcde
	pmovmskb %xmm0, %ecx
Packit Service 82fcde
	salq	$48, %rcx
Packit Service 82fcde
	orq	%rcx, %rax
Packit Service 82fcde
	testq	%rax, %rax
Packit Service 82fcde
	jne	L(return)
Packit Service 82fcde
L(loop_start):
Packit Service 82fcde
	/* We use this alignment to force loop be aligned to 8 but not
Packit Service 82fcde
	   16 bytes.  This gives better sheduling on AMD processors.  */
Packit Service 82fcde
	.p2align 4
Packit Service 82fcde
	pxor	%xmm6, %xmm6
Packit Service 82fcde
	andq	$-64, %rdi
Packit Service 82fcde
	.p2align 3
Packit Service 82fcde
L(loop64):
Packit Service 82fcde
	addq	$64, %rdi
Packit Service 82fcde
	movdqa	(%rdi), %xmm5
Packit Service 82fcde
	movdqa	16(%rdi), %xmm2
Packit Service 82fcde
	movdqa	32(%rdi), %xmm3
Packit Service 82fcde
	pxor	%xmm1, %xmm5
Packit Service 82fcde
	movdqa	48(%rdi), %xmm4
Packit Service 82fcde
	pxor	%xmm1, %xmm2
Packit Service 82fcde
	pxor	%xmm1, %xmm3
Packit Service 82fcde
	pminub	(%rdi), %xmm5
Packit Service 82fcde
	pxor	%xmm1, %xmm4
Packit Service 82fcde
	pminub	16(%rdi), %xmm2
Packit Service 82fcde
	pminub	32(%rdi), %xmm3
Packit Service 82fcde
	pminub	%xmm2, %xmm5
Packit Service 82fcde
	pminub	48(%rdi), %xmm4
Packit Service 82fcde
	pminub	%xmm3, %xmm5
Packit Service 82fcde
	pminub	%xmm4, %xmm5
Packit Service 82fcde
	pcmpeqb %xmm6, %xmm5
Packit Service 82fcde
	pmovmskb %xmm5, %eax
Packit Service 82fcde
Packit Service 82fcde
	testl	%eax, %eax
Packit Service 82fcde
	je	L(loop64)
Packit Service 82fcde
Packit Service 82fcde
	movdqa	(%rdi), %xmm5
Packit Service 82fcde
	movdqa	%xmm5, %xmm0
Packit Service 82fcde
	pcmpeqb	%xmm1, %xmm5
Packit Service 82fcde
	pcmpeqb	%xmm6, %xmm0
Packit Service 82fcde
	por	%xmm0, %xmm5
Packit Service 82fcde
	pcmpeqb %xmm6, %xmm2
Packit Service 82fcde
	pcmpeqb %xmm6, %xmm3
Packit Service 82fcde
	pcmpeqb %xmm6, %xmm4
Packit Service 82fcde
Packit Service 82fcde
	pmovmskb %xmm5, %ecx
Packit Service 82fcde
	pmovmskb %xmm2, %eax
Packit Service 82fcde
	salq	$16, %rax
Packit Service 82fcde
	pmovmskb %xmm3, %r8d
Packit Service 82fcde
	pmovmskb %xmm4, %edx
Packit Service 82fcde
	salq	$32, %r8
Packit Service 82fcde
	orq	%r8, %rax
Packit Service 82fcde
	orq	%rcx, %rax
Packit Service 82fcde
	salq	$48, %rdx
Packit Service 82fcde
	orq	%rdx, %rax
Packit Service 82fcde
	.p2align 3
Packit Service 82fcde
L(return):
Packit Service 82fcde
	bsfq	%rax, %rax
Packit Service 82fcde
#ifdef AS_STRCHRNUL
Packit Service 82fcde
	leaq	(%rdi,%rax), %rax
Packit Service 82fcde
#else
Packit Service 82fcde
	movl	$0, %edx
Packit Service 82fcde
	leaq	(%rdi,%rax), %rax
Packit Service 82fcde
	cmpb	%sil, (%rax)
Packit Service 82fcde
	cmovne	%rdx, %rax
Packit Service 82fcde
#endif
Packit Service 82fcde
	ret
Packit Service 82fcde
	.p2align 4
Packit Service 82fcde
Packit Service 82fcde
L(cross_page):
Packit Service 82fcde
	movq	%rdi, %rdx
Packit Service 82fcde
	pxor	%xmm2, %xmm2
Packit Service 82fcde
	andq	$-64, %rdx
Packit Service 82fcde
	movdqa	%xmm1, %xmm0
Packit Service 82fcde
	movdqa	(%rdx), %xmm3
Packit Service 82fcde
	movdqa	%xmm3, %xmm4
Packit Service 82fcde
	pcmpeqb	%xmm1, %xmm3
Packit Service 82fcde
	pcmpeqb	%xmm2, %xmm4
Packit Service 82fcde
	por	%xmm4, %xmm3
Packit Service 82fcde
	pmovmskb %xmm3, %r8d
Packit Service 82fcde
	movdqa	16(%rdx), %xmm3
Packit Service 82fcde
	movdqa	%xmm3, %xmm4
Packit Service 82fcde
	pcmpeqb	%xmm1, %xmm3
Packit Service 82fcde
	pcmpeqb	%xmm2, %xmm4
Packit Service 82fcde
	por	%xmm4, %xmm3
Packit Service 82fcde
	pmovmskb %xmm3, %eax
Packit Service 82fcde
	movdqa	32(%rdx), %xmm3
Packit Service 82fcde
	movdqa	%xmm3, %xmm4
Packit Service 82fcde
	pcmpeqb	%xmm1, %xmm3
Packit Service 82fcde
	salq	$16, %rax
Packit Service 82fcde
	pcmpeqb	%xmm2, %xmm4
Packit Service 82fcde
	por	%xmm4, %xmm3
Packit Service 82fcde
	pmovmskb %xmm3, %r9d
Packit Service 82fcde
	movdqa	48(%rdx), %xmm3
Packit Service 82fcde
	pcmpeqb	%xmm3, %xmm2
Packit Service 82fcde
	salq	$32, %r9
Packit Service 82fcde
	pcmpeqb	%xmm3, %xmm0
Packit Service 82fcde
	orq	%r9, %rax
Packit Service 82fcde
	orq	%r8, %rax
Packit Service 82fcde
	por	%xmm2, %xmm0
Packit Service 82fcde
	pmovmskb %xmm0, %ecx
Packit Service 82fcde
	salq	$48, %rcx
Packit Service 82fcde
	orq	%rcx, %rax
Packit Service 82fcde
	movl	%edi, %ecx
Packit Service 82fcde
	subb	%dl, %cl
Packit Service 82fcde
	shrq	%cl, %rax
Packit Service 82fcde
	testq	%rax, %rax
Packit Service 82fcde
	jne	L(return)
Packit Service 82fcde
	jmp	L(loop_start)
Packit Service 82fcde
Packit Service 82fcde
END (strchr)
Packit Service 82fcde
Packit Service 82fcde
#ifndef AS_STRCHRNUL
Packit Service 82fcde
weak_alias (strchr, index)
Packit Service 82fcde
libc_hidden_builtin_def (strchr)
Packit Service 82fcde
#endif