]>
Commit | Line | Data |
---|---|---|
9f4254b8 | 1 | /* Multiple versions of wcscpy. |
ac49ecaf | 2 | All versions must be listed in ifunc-impl-list.c. |
6d7e8eda | 3 | Copyright (C) 2017-2023 Free Software Foundation, Inc. |
1d3e4b61 UD |
4 | This file is part of the GNU C Library. |
5 | ||
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. | |
10 | ||
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. | |
15 | ||
16 | You should have received a copy of the GNU Lesser General Public | |
59ba27a6 | 17 | License along with the GNU C Library; if not, see |
5a82c748 | 18 | <https://www.gnu.org/licenses/>. */ |
1d3e4b61 | 19 | |
58d021c8 | 20 | /* Define multiple versions only for the definition in libc. */ |
4f41c682 | 21 | #if IS_IN (libc) |
81a14439 | 22 | # define __wcscpy __redirect_wcscpy |
9f4254b8 | 23 | # include <wchar.h> |
81a14439 | 24 | # undef __wcscpy |
9f4254b8 L |
25 | |
26 | # define SYMBOL_NAME wcscpy | |
27 | # include <init-arch.h> | |
28 | ||
64b8b651 NG |
29 | extern __typeof (REDIRECT_NAME) OPTIMIZE (evex) attribute_hidden; |
30 | ||
52cf1100 NG |
31 | extern __typeof (REDIRECT_NAME) OPTIMIZE (avx2) attribute_hidden; |
32 | ||
9f4254b8 L |
33 | extern __typeof (REDIRECT_NAME) OPTIMIZE (ssse3) attribute_hidden; |
34 | ||
192979ee NG |
35 | extern __typeof (REDIRECT_NAME) OPTIMIZE (generic) attribute_hidden; |
36 | ||
9f4254b8 L |
37 | static inline void * |
38 | IFUNC_SELECTOR (void) | |
39 | { | |
40 | const struct cpu_features* cpu_features = __get_cpu_features (); | |
1d3e4b61 | 41 | |
64b8b651 NG |
42 | if (X86_ISA_CPU_FEATURE_USABLE_P (cpu_features, AVX2) |
43 | && X86_ISA_CPU_FEATURE_USABLE_P (cpu_features, BMI2) | |
44 | && X86_ISA_CPU_FEATURES_ARCH_P (cpu_features, AVX_Fast_Unaligned_Load, )) | |
45 | { | |
46 | if (X86_ISA_CPU_FEATURE_USABLE_P (cpu_features, AVX512VL) | |
47 | && X86_ISA_CPU_FEATURE_USABLE_P (cpu_features, AVX512BW)) | |
48 | return OPTIMIZE (evex); | |
52cf1100 NG |
49 | |
50 | if (X86_ISA_CPU_FEATURES_ARCH_P (cpu_features, Prefer_No_VZEROUPPER, !)) | |
51 | return OPTIMIZE (avx2); | |
64b8b651 NG |
52 | } |
53 | ||
192979ee | 54 | if (X86_ISA_CPU_FEATURE_USABLE_P (cpu_features, SSSE3)) |
9f4254b8 | 55 | return OPTIMIZE (ssse3); |
1d3e4b61 | 56 | |
c22eb807 | 57 | return OPTIMIZE (generic); |
9f4254b8 | 58 | } |
1d3e4b61 | 59 | |
81a14439 AZ |
60 | libc_ifunc_redirected (__redirect_wcscpy, __wcscpy, IFUNC_SELECTOR ()); |
61 | weak_alias (__wcscpy, wcscpy) | |
62 | # ifdef SHARED | |
63 | __hidden_ver1 (__wcscpy, __GI___wcscpy, __redirect_wcscpy) | |
64 | __attribute__((visibility ("hidden"))) __attribute_copy__ (wcscpy); | |
65 | # endif | |
1d3e4b61 | 66 | #endif |