Define VERSYMIDX/VALIDX/ADDRIDX in ldsodefs.h
[glibc.git] / sysdeps / x86_64 / strchr.S
blob00153a2c492ff1c58062ba66273e67ee66b71d7b
1 /* strchr (str, ch) -- Return pointer to first occurrence of CH in STR.
2    For AMD x86-64.
3    Copyright (C) 2009 Free Software Foundation, Inc.
4    This file is part of the GNU C Library.
6    The GNU C Library is free software; you can redistribute it and/or
7    modify it under the terms of the GNU Lesser General Public
8    License as published by the Free Software Foundation; either
9    version 2.1 of the License, or (at your option) any later version.
11    The GNU C Library is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14    Lesser General Public License for more details.
16    You should have received a copy of the GNU Lesser General Public
17    License along with the GNU C Library; if not, see
18    <http://www.gnu.org/licenses/>.  */
20 #include <sysdep.h>
23         .text
24 ENTRY (strchr)
25         movd    %esi, %xmm1
26         movq    %rdi, %rcx
27         punpcklbw %xmm1, %xmm1
28         andq    $~15, %rdi
29         pxor    %xmm2, %xmm2
30         punpcklbw %xmm1, %xmm1
31         orl     $0xffffffff, %esi
32         movdqa  (%rdi), %xmm0
33         pshufd  $0, %xmm1, %xmm1
34         subq    %rdi, %rcx
35         movdqa  %xmm0, %xmm3
36         leaq    16(%rdi), %rdi
37         pcmpeqb %xmm1, %xmm0
38         pcmpeqb %xmm2, %xmm3
39         shl     %cl, %esi
40         pmovmskb %xmm0, %edx
41         pmovmskb %xmm3, %ecx
42         andl    %esi, %edx
43         andl    %esi, %ecx
44         orl     %edx, %ecx
45         jnz     1f
47 2:      movdqa  (%rdi), %xmm0
48         leaq    16(%rdi), %rdi
49         movdqa  %xmm0, %xmm3
50         pcmpeqb %xmm1, %xmm0
51         pcmpeqb %xmm2, %xmm3
52         pmovmskb %xmm0, %edx
53         pmovmskb %xmm3, %ecx
54         orl     %edx, %ecx
55         jz      2b
57 1:      bsfl    %edx, %edx
58         jz      4f
59         bsfl    %ecx, %ecx
60         leaq    -16(%rdi,%rdx), %rax
61         cmpl    %edx, %ecx
62         je      5f
63 4:      xorl    %eax, %eax
64 5:      ret
65 END (strchr)
67 weak_alias (strchr, index)
68 libc_hidden_builtin_def (strchr)