Replace FSF snail mail address with URLs.
[glibc.git] / sysdeps / x86_64 / multiarch / rawmemchr.S
blobc4157add81d9ba043823d7dc18b58b93016707a7
1 /* Copyright (C) 2009, 2011 Free Software Foundation, Inc.
2    Contributed by Ulrich Drepper <drepper@redhat.com>.
3    This file is part of the GNU C Library.
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library; if not, see
17    <http://www.gnu.org/licenses/>.  */
19 #include <sysdep.h>
20 #include <init-arch.h>
23 /* Define multiple versions only for the definition in lib.  */
24 #ifndef NOT_IN_libc
25         .text
26 ENTRY(rawmemchr)
27         .type   rawmemchr, @gnu_indirect_function
28         cmpl    $0, __cpu_features+KIND_OFFSET(%rip)
29         jne     1f
30         call    __init_cpu_features
31 1:      testl   $bit_Prefer_PMINUB_for_stringop, __cpu_features+FEATURE_OFFSET+index_Prefer_PMINUB_for_stringop(%rip)
32         jnz     2f
33         testl   $bit_SSE4_2, __cpu_features+CPUID_OFFSET+index_SSE4_2(%rip)
34         jz      2f
35         leaq    __rawmemchr_sse42(%rip), %rax
36         ret
37 2:      leaq    __rawmemchr_sse2(%rip), %rax
38         ret
40 END(rawmemchr)
41 strong_alias (rawmemchr, __rawmemchr)
44         .section .text.sse4.2,"ax",@progbits
45         .align  16
46         .type   __rawmemchr_sse42, @function
47 __rawmemchr_sse42:
48         cfi_startproc
49         CALL_MCOUNT
50         movd    %esi, %xmm1
51         movq    %rdi, %rcx
52         pxor    %xmm2, %xmm2
53         andq    $~15, %rdi
54         orl     $0xffffffff, %esi
55         pshufb  %xmm2, %xmm1
56         movdqa  (%rdi), %xmm0
57         subq    %rdi, %rcx
58         pcmpeqb %xmm1, %xmm0
59         shl     %cl, %esi
60         pmovmskb %xmm0, %ecx
61         movl    $16, %eax
62         movl    $16, %edx
63         andl    %esi, %ecx
64         jnz     1f
66 2:      pcmpestri $0x08, 16(%rdi), %xmm1
67         leaq    16(%rdi), %rdi
68         jnc     2b
70         leaq    (%rdi,%rcx), %rax
71         ret
73 1:      bsfl    %ecx, %eax
74         addq    %rdi, %rax
75         ret
76         cfi_endproc
77         .size   __rawmemchr_sse42, .-__rawmemchr_sse42
80 # undef ENTRY
81 # define ENTRY(name) \
82         .type __rawmemchr_sse2, @function; \
83         .align 16; \
84         __rawmemchr_sse2: cfi_startproc; \
85         CALL_MCOUNT
86 # undef END
87 # define END(name) \
88         cfi_endproc; .size __rawmemchr_sse2, .-__rawmemchr_sse2
89 # undef libc_hidden_builtin_def
90 /* It doesn't make sense to send libc-internal rawmemchr calls through a PLT.
91    The speedup we get from using SSE4.2 instruction is likely eaten away
92    by the indirect call in the PLT.  */
93 # define libc_hidden_builtin_def(name) \
94         .globl __GI___rawmemchr; __GI___rawmemchr = __rawmemchr_sse2
95 #endif
97 #include "../rawmemchr.S"