1 /* Multiple versions of strcpy
2 All versions must be listed in ifunc-impl-list.c.
3 Copyright (C) 2011-2016 Free Software Foundation, Inc.
4 Contributed by Intel Corporation.
5 This file is part of the GNU C Library.
7 The GNU C Library is free software; you can redistribute it and/or
8 modify it under the terms of the GNU Lesser General Public
9 License as published by the Free Software Foundation; either
10 version 2.1 of the License, or (at your option) any later version.
12 The GNU C Library is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Lesser General Public License for more details.
17 You should have received a copy of the GNU Lesser General Public
18 License along with the GNU C Library; if not, see
19 <http://www.gnu.org/licenses/>. */
22 #include <init-arch.h>
24 #if !defined (USE_AS_STPCPY) && !defined (USE_AS_STRNCPY)
26 # define STRCPY strcpy
31 # ifdef USE_AS_STRNCPY
32 # define STRCPY_SSSE3 __stpncpy_ssse3
33 # define STRCPY_SSE2 __stpncpy_sse2
34 # define STRCPY_IA32 __stpncpy_ia32
35 # define __GI_STRCPY __GI_stpncpy
36 # define __GI___STRCPY __GI___stpncpy
38 # define STRCPY_SSSE3 __stpcpy_ssse3
39 # define STRCPY_SSE2 __stpcpy_sse2
40 # define STRCPY_IA32 __stpcpy_ia32
41 # define __GI_STRCPY __GI_stpcpy
42 # define __GI___STRCPY __GI___stpcpy
45 # ifdef USE_AS_STRNCPY
46 # define STRCPY_SSSE3 __strncpy_ssse3
47 # define STRCPY_SSE2 __strncpy_sse2
48 # define STRCPY_IA32 __strncpy_ia32
49 # define __GI_STRCPY __GI_strncpy
51 # define STRCPY_SSSE3 __strcpy_ssse3
52 # define STRCPY_SSE2 __strcpy_sse2
53 # define STRCPY_IA32 __strcpy_ia32
54 # define __GI_STRCPY __GI_strcpy
59 /* Define multiple versions only for the definition in libc. Don't
60 define multiple versions for strncpy in static library since we
61 need strncpy before the initialization happened. */
66 .type STRCPY, @gnu_indirect_function
67 LOAD_GOT_AND_RTLD_GLOBAL_RO
68 LOAD_FUNC_GOT_EAX (STRCPY_IA32)
69 HAS_CPU_FEATURE (SSE2)
71 LOAD_FUNC_GOT_EAX (STRCPY_SSE2)
72 HAS_ARCH_FEATURE (Fast_Unaligned_Load)
74 HAS_CPU_FEATURE (SSSE3)
76 LOAD_FUNC_GOT_EAX (STRCPY_SSSE3)
81 # define ENTRY(name) \
82 .type STRCPY_IA32, @function; \
85 .hidden STRCPY_IA32; \
86 STRCPY_IA32: cfi_startproc; \
90 cfi_endproc; .size STRCPY_IA32, .-STRCPY_IA32
93 # undef libc_hidden_builtin_def
94 /* It doesn't make sense to send libc-internal strcpy calls through a PLT.
95 The speedup we get from using SSSE3 instruction is likely eaten away
96 by the indirect call in the PLT. */
97 # define libc_hidden_builtin_def(name) \
98 .globl __GI_STRCPY; __GI_STRCPY = STRCPY_IA32
99 # undef libc_hidden_def
100 # define libc_hidden_def(name) \
101 .globl __GI___STRCPY; __GI___STRCPY = STRCPY_IA32
107 # ifdef USE_AS_STRNCPY
108 # include "../../stpncpy.S"
110 # include "../../i586/stpcpy.S"
113 # ifndef USE_AS_STRNCPY
114 # include "../../i586/strcpy.S"