powerpc: Fix POWER9 implies
[glibc.git] / sysdeps / i386 / i686 / multiarch / strcpy.S
blob51525bc091a7ec639287a33267ce5fefcc62ec00
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/>.  */
21 #include <sysdep.h>
22 #include <init-arch.h>
24 #if !defined (USE_AS_STPCPY) && !defined (USE_AS_STRNCPY)
25 # ifndef STRCPY
26 #  define STRCPY strcpy
27 # endif
28 #endif
30 #ifdef USE_AS_STPCPY
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
37 # else
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
43 # endif
44 #else
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
50 # else
51 #  define STRCPY_SSSE3  __strcpy_ssse3
52 #  define STRCPY_SSE2           __strcpy_sse2
53 #  define STRCPY_IA32           __strcpy_ia32
54 #  define __GI_STRCPY           __GI_strcpy
55 # endif
56 #endif
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.  */
62 #if IS_IN (libc)
64         .text
65 ENTRY(STRCPY)
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)
70         jz      2f
71         LOAD_FUNC_GOT_EAX (STRCPY_SSE2)
72         HAS_ARCH_FEATURE (Fast_Unaligned_Load)
73         jnz     2f
74         HAS_CPU_FEATURE (SSSE3)
75         jz      2f
76         LOAD_FUNC_GOT_EAX (STRCPY_SSSE3)
77 2:      ret
78 END(STRCPY)
80 # undef ENTRY
81 # define ENTRY(name) \
82         .type STRCPY_IA32, @function; \
83         .align 16; \
84         .globl STRCPY_IA32; \
85         .hidden STRCPY_IA32; \
86         STRCPY_IA32: cfi_startproc; \
87         CALL_MCOUNT
88 # undef END
89 # define END(name) \
90         cfi_endproc; .size STRCPY_IA32, .-STRCPY_IA32
92 # ifdef SHARED
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
103 # endif
104 #endif
106 #ifdef USE_AS_STPCPY
107 # ifdef USE_AS_STRNCPY
108 #  include "../../stpncpy.S"
109 # else
110 #  include "../../i586/stpcpy.S"
111 # endif
112 #else
113 # ifndef USE_AS_STRNCPY
114 #  include "../../i586/strcpy.S"
115 # endif
116 #endif