Undo accidental checkin.
[glibc.git] / sysdeps / i386 / i686 / multiarch / strspn.S
blobdbdf1af48229b09f05e68d7c6a759ce455d32828
1 /* Multiple versions of strspn
2    Copyright (C) 2009,2010 Free Software Foundation, Inc.
3    Contributed by Intel Corporation.
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, write to the Free
18    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
19    02111-1307 USA.  */
21 #include <config.h>
23 #ifdef HAVE_SSE4_SUPPORT
25 #include <sysdep.h>
26 #include <init-arch.h>
28 /* Define multiple versions only for the definition in libc.  */
29 #ifndef NOT_IN_libc
30 # ifdef SHARED
31         .section        .gnu.linkonce.t.__i686.get_pc_thunk.bx,"ax",@progbits
32         .globl  __i686.get_pc_thunk.bx
33         .hidden __i686.get_pc_thunk.bx
34         .p2align 4
35         .type   __i686.get_pc_thunk.bx,@function
36 __i686.get_pc_thunk.bx:
37         movl    (%esp), %ebx
38         ret
40         .text
41 ENTRY(strspn)
42         .type   strspn, @gnu_indirect_function
43         pushl   %ebx
44         cfi_adjust_cfa_offset (4)
45         cfi_rel_offset (ebx, 0)
46         call    __i686.get_pc_thunk.bx
47         addl    $_GLOBAL_OFFSET_TABLE_, %ebx
48         cmpl    $0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx)
49         jne     1f
50         call    __init_cpu_features
51 1:      leal    __strspn_ia32@GOTOFF(%ebx), %eax
52         testl   $bit_SSE4_2, CPUID_OFFSET+index_SSE4_2+__cpu_features@GOTOFF(%ebx)
53         jz      2f
54         leal    __strspn_sse42@GOTOFF(%ebx), %eax
55 2:      popl    %ebx
56         cfi_adjust_cfa_offset (-4);
57         cfi_restore (ebx)
58         ret
59 END(strspn)
60 # else
61         .text
62 ENTRY(strspn)
63         .type   strspn, @gnu_indirect_function
64         cmpl    $0, KIND_OFFSET+__cpu_features
65         jne     1f
66         call    __init_cpu_features
67 1:      leal    __strspn_ia32, %eax
68         testl   $bit_SSE4_2, CPUID_OFFSET+index_SSE4_2+__cpu_features
69         jz      2f
70         leal    __strspn_sse42, %eax
71 2:      ret
72 END(strspn)
73 # endif
75 # undef ENTRY
76 # define ENTRY(name) \
77         .type __strspn_ia32, @function; \
78         .globl __strspn_ia32; \
79         .p2align 4
80         __strspn_ia32: cfi_startproc; \
81         CALL_MCOUNT
82 # undef END
83 # define END(name) \
84         cfi_endproc; .size __strspn_ia32, .-__strspn_ia32
85 # undef libc_hidden_builtin_def
86 /* IFUNC doesn't work with the hidden functions in shared library since
87    they will be called without setting up EBX needed for PLT which is
88    used by IFUNC.  */
89 # define libc_hidden_builtin_def(name) \
90         .globl __GI_strspn; __GI_strspn = __strspn_ia32
91 #endif
93 #endif /* HAVE_SSE4_SUPPORT */
95 #include "../../strspn.S"