]> git.ipfire.org Git - thirdparty/glibc.git/blame - sysdeps/x86_64/multiarch/ifunc-impl-list.c
Update copyright dates with scripts/update-copyrights
[thirdparty/glibc.git] / sysdeps / x86_64 / multiarch / ifunc-impl-list.c
CommitLineData
ac49ecaf 1/* Enumerate available IFUNC implementations of a function. x86-64 version.
2b778ceb 2 Copyright (C) 2012-2021 Free Software Foundation, Inc.
ac49ecaf
L
3 This file is part of the GNU C Library.
4
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.
9
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.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library; if not, see
5a82c748 17 <https://www.gnu.org/licenses/>. */
ac49ecaf
L
18
19#include <assert.h>
20#include <string.h>
21#include <wchar.h>
22#include <ifunc-impl-list.h>
83d776f9 23#include <sysdep.h>
ac49ecaf
L
24#include "init-arch.h"
25
26/* Maximum number of IFUNC implementations. */
72276d6e 27#define MAX_IFUNC 5
ac49ecaf
L
28
29/* Fill ARRAY of MAX elements with IFUNC implementations for function
30 NAME supported on target machine and return the number of valid
31 entries. */
32
33size_t
34__libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
35 size_t max)
36{
37 assert (max >= MAX_IFUNC);
38
39 size_t i = 0;
40
6b6710e5 41 /* Support sysdeps/x86_64/multiarch/memchr.c. */
2f5d20ac
L
42 IFUNC_IMPL (i, name, memchr,
43 IFUNC_IMPL_ADD (array, i, memchr,
107e6a3c 44 CPU_FEATURE_USABLE (AVX2),
2f5d20ac
L
45 __memchr_avx2)
46 IFUNC_IMPL_ADD (array, i, memchr, 1, __memchr_sse2))
47
b91a52d0 48 /* Support sysdeps/x86_64/multiarch/memcmp.c. */
ac49ecaf 49 IFUNC_IMPL (i, name, memcmp,
935971ba 50 IFUNC_IMPL_ADD (array, i, memcmp,
107e6a3c
L
51 (CPU_FEATURE_USABLE (AVX2)
52 && CPU_FEATURE_USABLE (MOVBE)),
935971ba 53 __memcmp_avx2_movbe)
107e6a3c 54 IFUNC_IMPL_ADD (array, i, memcmp, CPU_FEATURE_USABLE (SSE4_1),
ac49ecaf 55 __memcmp_sse4_1)
107e6a3c 56 IFUNC_IMPL_ADD (array, i, memcmp, CPU_FEATURE_USABLE (SSSE3),
0b5395f0 57 __memcmp_ssse3)
ac49ecaf
L
58 IFUNC_IMPL_ADD (array, i, memcmp, 1, __memcmp_sse2))
59
7a499756 60#ifdef SHARED
5c3e322d 61 /* Support sysdeps/x86_64/multiarch/memmove_chk.c. */
ac49ecaf 62 IFUNC_IMPL (i, name, __memmove_chk,
72276d6e 63 IFUNC_IMPL_ADD (array, i, __memmove_chk,
107e6a3c 64 CPU_FEATURE_USABLE (AVX512F),
72276d6e 65 __memmove_chk_avx512_no_vzeroupper)
88b57b8e 66 IFUNC_IMPL_ADD (array, i, __memmove_chk,
107e6a3c 67 CPU_FEATURE_USABLE (AVX512F),
c867597b 68 __memmove_chk_avx512_unaligned)
88b57b8e 69 IFUNC_IMPL_ADD (array, i, __memmove_chk,
107e6a3c 70 CPU_FEATURE_USABLE (AVX512F),
88b57b8e 71 __memmove_chk_avx512_unaligned_erms)
0b5395f0 72 IFUNC_IMPL_ADD (array, i, __memmove_chk,
107e6a3c 73 CPU_FEATURE_USABLE (AVX),
05f3633d 74 __memmove_chk_avx_unaligned)
88b57b8e 75 IFUNC_IMPL_ADD (array, i, __memmove_chk,
107e6a3c 76 CPU_FEATURE_USABLE (AVX),
88b57b8e 77 __memmove_chk_avx_unaligned_erms)
0b5395f0 78 IFUNC_IMPL_ADD (array, i, __memmove_chk,
107e6a3c 79 CPU_FEATURE_USABLE (SSSE3),
ac49ecaf 80 __memmove_chk_ssse3_back)
0b5395f0 81 IFUNC_IMPL_ADD (array, i, __memmove_chk,
107e6a3c 82 CPU_FEATURE_USABLE (SSSE3),
ac49ecaf 83 __memmove_chk_ssse3)
88b57b8e 84 IFUNC_IMPL_ADD (array, i, __memmove_chk, 1,
c867597b 85 __memmove_chk_sse2_unaligned)
88b57b8e 86 IFUNC_IMPL_ADD (array, i, __memmove_chk, 1,
5c3e322d
L
87 __memmove_chk_sse2_unaligned_erms)
88 IFUNC_IMPL_ADD (array, i, __memmove_chk, 1,
89 __memmove_chk_erms))
7a499756 90#endif
ac49ecaf 91
5c3e322d 92 /* Support sysdeps/x86_64/multiarch/memmove.c. */
ac49ecaf 93 IFUNC_IMPL (i, name, memmove,
0b5395f0 94 IFUNC_IMPL_ADD (array, i, memmove,
107e6a3c 95 CPU_FEATURE_USABLE (AVX),
05f3633d 96 __memmove_avx_unaligned)
88b57b8e 97 IFUNC_IMPL_ADD (array, i, memmove,
107e6a3c 98 CPU_FEATURE_USABLE (AVX),
88b57b8e 99 __memmove_avx_unaligned_erms)
72276d6e 100 IFUNC_IMPL_ADD (array, i, memmove,
107e6a3c 101 CPU_FEATURE_USABLE (AVX512F),
72276d6e 102 __memmove_avx512_no_vzeroupper)
88b57b8e 103 IFUNC_IMPL_ADD (array, i, memmove,
107e6a3c 104 CPU_FEATURE_USABLE (AVX512F),
c867597b 105 __memmove_avx512_unaligned)
88b57b8e 106 IFUNC_IMPL_ADD (array, i, memmove,
107e6a3c 107 CPU_FEATURE_USABLE (AVX512F),
88b57b8e 108 __memmove_avx512_unaligned_erms)
107e6a3c 109 IFUNC_IMPL_ADD (array, i, memmove, CPU_FEATURE_USABLE (SSSE3),
ac49ecaf 110 __memmove_ssse3_back)
107e6a3c 111 IFUNC_IMPL_ADD (array, i, memmove, CPU_FEATURE_USABLE (SSSE3),
ac49ecaf 112 __memmove_ssse3)
88b57b8e
L
113 IFUNC_IMPL_ADD (array, i, memmove, 1, __memmove_erms)
114 IFUNC_IMPL_ADD (array, i, memmove, 1,
c867597b 115 __memmove_sse2_unaligned)
88b57b8e 116 IFUNC_IMPL_ADD (array, i, memmove, 1,
c867597b 117 __memmove_sse2_unaligned_erms))
ac49ecaf 118
6b6710e5 119 /* Support sysdeps/x86_64/multiarch/memrchr.c. */
5ac7aa1d
L
120 IFUNC_IMPL (i, name, memrchr,
121 IFUNC_IMPL_ADD (array, i, memrchr,
107e6a3c 122 CPU_FEATURE_USABLE (AVX2),
5ac7aa1d
L
123 __memrchr_avx2)
124 IFUNC_IMPL_ADD (array, i, memrchr, 1, __memrchr_sse2))
125
7a499756 126#ifdef SHARED
93e46f87 127 /* Support sysdeps/x86_64/multiarch/memset_chk.c. */
d92d8f8a 128 IFUNC_IMPL (i, name, __memset_chk,
93e46f87
L
129 IFUNC_IMPL_ADD (array, i, __memset_chk, 1,
130 __memset_chk_erms)
83056630
L
131 IFUNC_IMPL_ADD (array, i, __memset_chk, 1,
132 __memset_chk_sse2_unaligned)
133 IFUNC_IMPL_ADD (array, i, __memset_chk, 1,
134 __memset_chk_sse2_unaligned_erms)
83056630 135 IFUNC_IMPL_ADD (array, i, __memset_chk,
107e6a3c 136 CPU_FEATURE_USABLE (AVX2),
83056630
L
137 __memset_chk_avx2_unaligned)
138 IFUNC_IMPL_ADD (array, i, __memset_chk,
107e6a3c 139 CPU_FEATURE_USABLE (AVX2),
83056630 140 __memset_chk_avx2_unaligned_erms)
83056630 141 IFUNC_IMPL_ADD (array, i, __memset_chk,
107e6a3c 142 CPU_FEATURE_USABLE (AVX512F),
83056630
L
143 __memset_chk_avx512_unaligned_erms)
144 IFUNC_IMPL_ADD (array, i, __memset_chk,
107e6a3c 145 CPU_FEATURE_USABLE (AVX512F),
83056630 146 __memset_chk_avx512_unaligned)
83d776f9 147 IFUNC_IMPL_ADD (array, i, __memset_chk,
107e6a3c 148 CPU_FEATURE_USABLE (AVX512F),
83d776f9 149 __memset_chk_avx512_no_vzeroupper)
83d776f9 150 )
7a499756 151#endif
d92d8f8a 152
93e46f87 153 /* Support sysdeps/x86_64/multiarch/memset.c. */
d92d8f8a 154 IFUNC_IMPL (i, name, memset,
83056630
L
155 IFUNC_IMPL_ADD (array, i, memset, 1,
156 __memset_sse2_unaligned)
157 IFUNC_IMPL_ADD (array, i, memset, 1,
158 __memset_sse2_unaligned_erms)
159 IFUNC_IMPL_ADD (array, i, memset, 1, __memset_erms)
83056630 160 IFUNC_IMPL_ADD (array, i, memset,
107e6a3c 161 CPU_FEATURE_USABLE (AVX2),
83056630
L
162 __memset_avx2_unaligned)
163 IFUNC_IMPL_ADD (array, i, memset,
107e6a3c 164 CPU_FEATURE_USABLE (AVX2),
83056630 165 __memset_avx2_unaligned_erms)
83056630 166 IFUNC_IMPL_ADD (array, i, memset,
107e6a3c 167 CPU_FEATURE_USABLE (AVX512F),
83056630
L
168 __memset_avx512_unaligned_erms)
169 IFUNC_IMPL_ADD (array, i, memset,
107e6a3c 170 CPU_FEATURE_USABLE (AVX512F),
83056630 171 __memset_avx512_unaligned)
83d776f9 172 IFUNC_IMPL_ADD (array, i, memset,
107e6a3c 173 CPU_FEATURE_USABLE (AVX512F),
83d776f9 174 __memset_avx512_no_vzeroupper)
83d776f9 175 )
d92d8f8a 176
6b6710e5 177 /* Support sysdeps/x86_64/multiarch/rawmemchr.c. */
2f5d20ac
L
178 IFUNC_IMPL (i, name, rawmemchr,
179 IFUNC_IMPL_ADD (array, i, rawmemchr,
107e6a3c 180 CPU_FEATURE_USABLE (AVX2),
2f5d20ac
L
181 __rawmemchr_avx2)
182 IFUNC_IMPL_ADD (array, i, rawmemchr, 1, __rawmemchr_sse2))
183
6b6710e5 184 /* Support sysdeps/x86_64/multiarch/strlen.c. */
dc485ceb
L
185 IFUNC_IMPL (i, name, strlen,
186 IFUNC_IMPL_ADD (array, i, strlen,
107e6a3c 187 CPU_FEATURE_USABLE (AVX2),
dc485ceb
L
188 __strlen_avx2)
189 IFUNC_IMPL_ADD (array, i, strlen, 1, __strlen_sse2))
190
6b6710e5 191 /* Support sysdeps/x86_64/multiarch/strnlen.c. */
dc485ceb
L
192 IFUNC_IMPL (i, name, strnlen,
193 IFUNC_IMPL_ADD (array, i, strnlen,
107e6a3c 194 CPU_FEATURE_USABLE (AVX2),
dc485ceb
L
195 __strnlen_avx2)
196 IFUNC_IMPL_ADD (array, i, strnlen, 1, __strnlen_sse2))
197
4df54c89 198 /* Support sysdeps/x86_64/multiarch/stpncpy.c. */
ac49ecaf 199 IFUNC_IMPL (i, name, stpncpy,
107e6a3c 200 IFUNC_IMPL_ADD (array, i, stpncpy, CPU_FEATURE_USABLE (SSSE3),
ac49ecaf 201 __stpncpy_ssse3)
107e6a3c 202 IFUNC_IMPL_ADD (array, i, stpncpy, CPU_FEATURE_USABLE (AVX2),
1a153e47 203 __stpncpy_avx2)
ac49ecaf
L
204 IFUNC_IMPL_ADD (array, i, stpncpy, 1,
205 __stpncpy_sse2_unaligned)
206 IFUNC_IMPL_ADD (array, i, stpncpy, 1, __stpncpy_sse2))
207
4df54c89 208 /* Support sysdeps/x86_64/multiarch/stpcpy.c. */
ac49ecaf 209 IFUNC_IMPL (i, name, stpcpy,
107e6a3c 210 IFUNC_IMPL_ADD (array, i, stpcpy, CPU_FEATURE_USABLE (SSSE3),
0b5395f0 211 __stpcpy_ssse3)
107e6a3c 212 IFUNC_IMPL_ADD (array, i, stpcpy, CPU_FEATURE_USABLE (AVX2),
1a153e47 213 __stpcpy_avx2)
ac49ecaf
L
214 IFUNC_IMPL_ADD (array, i, stpcpy, 1, __stpcpy_sse2_unaligned)
215 IFUNC_IMPL_ADD (array, i, stpcpy, 1, __stpcpy_sse2))
216
4df54c89 217 /* Support sysdeps/x86_64/multiarch/strcasecmp_l.c. */
ac49ecaf 218 IFUNC_IMPL (i, name, strcasecmp,
0b5395f0 219 IFUNC_IMPL_ADD (array, i, strcasecmp,
107e6a3c 220 CPU_FEATURE_USABLE (AVX),
ac49ecaf 221 __strcasecmp_avx)
0b5395f0 222 IFUNC_IMPL_ADD (array, i, strcasecmp,
107e6a3c 223 CPU_FEATURE_USABLE (SSE4_2),
ac49ecaf 224 __strcasecmp_sse42)
0b5395f0 225 IFUNC_IMPL_ADD (array, i, strcasecmp,
107e6a3c 226 CPU_FEATURE_USABLE (SSSE3),
ac49ecaf
L
227 __strcasecmp_ssse3)
228 IFUNC_IMPL_ADD (array, i, strcasecmp, 1, __strcasecmp_sse2))
229
4df54c89 230 /* Support sysdeps/x86_64/multiarch/strcasecmp_l.c. */
ac49ecaf 231 IFUNC_IMPL (i, name, strcasecmp_l,
0b5395f0 232 IFUNC_IMPL_ADD (array, i, strcasecmp_l,
107e6a3c 233 CPU_FEATURE_USABLE (AVX),
ac49ecaf 234 __strcasecmp_l_avx)
0b5395f0 235 IFUNC_IMPL_ADD (array, i, strcasecmp_l,
107e6a3c 236 CPU_FEATURE_USABLE (SSE4_2),
ac49ecaf 237 __strcasecmp_l_sse42)
0b5395f0 238 IFUNC_IMPL_ADD (array, i, strcasecmp_l,
107e6a3c 239 CPU_FEATURE_USABLE (SSSE3),
ac49ecaf
L
240 __strcasecmp_l_ssse3)
241 IFUNC_IMPL_ADD (array, i, strcasecmp_l, 1,
242 __strcasecmp_l_sse2))
243
4df54c89 244 /* Support sysdeps/x86_64/multiarch/strcat.c. */
ac49ecaf 245 IFUNC_IMPL (i, name, strcat,
107e6a3c 246 IFUNC_IMPL_ADD (array, i, strcat, CPU_FEATURE_USABLE (AVX2),
1a153e47 247 __strcat_avx2)
107e6a3c 248 IFUNC_IMPL_ADD (array, i, strcat, CPU_FEATURE_USABLE (SSSE3),
0b5395f0 249 __strcat_ssse3)
ac49ecaf
L
250 IFUNC_IMPL_ADD (array, i, strcat, 1, __strcat_sse2_unaligned)
251 IFUNC_IMPL_ADD (array, i, strcat, 1, __strcat_sse2))
252
8fe57365 253 /* Support sysdeps/x86_64/multiarch/strchr.c. */
ac49ecaf 254 IFUNC_IMPL (i, name, strchr,
8fe57365 255 IFUNC_IMPL_ADD (array, i, strchr,
107e6a3c 256 CPU_FEATURE_USABLE (AVX2),
8fe57365 257 __strchr_avx2)
ac49ecaf
L
258 IFUNC_IMPL_ADD (array, i, strchr, 1, __strchr_sse2_no_bsf)
259 IFUNC_IMPL_ADD (array, i, strchr, 1, __strchr_sse2))
260
8fe57365
L
261 /* Support sysdeps/x86_64/multiarch/strchrnul.c. */
262 IFUNC_IMPL (i, name, strchrnul,
263 IFUNC_IMPL_ADD (array, i, strchrnul,
107e6a3c 264 CPU_FEATURE_USABLE (AVX2),
8fe57365
L
265 __strchrnul_avx2)
266 IFUNC_IMPL_ADD (array, i, strchrnul, 1, __strchrnul_sse2))
267
d2538b91
L
268 /* Support sysdeps/x86_64/multiarch/strrchr.c. */
269 IFUNC_IMPL (i, name, strrchr,
270 IFUNC_IMPL_ADD (array, i, strrchr,
107e6a3c 271 CPU_FEATURE_USABLE (AVX2),
d2538b91
L
272 __strrchr_avx2)
273 IFUNC_IMPL_ADD (array, i, strrchr, 1, __strrchr_sse2))
274
4df54c89 275 /* Support sysdeps/x86_64/multiarch/strcmp.c. */
ac49ecaf 276 IFUNC_IMPL (i, name, strcmp,
14570163 277 IFUNC_IMPL_ADD (array, i, strcmp,
107e6a3c 278 CPU_FEATURE_USABLE (AVX2),
14570163 279 __strcmp_avx2)
107e6a3c 280 IFUNC_IMPL_ADD (array, i, strcmp, CPU_FEATURE_USABLE (SSE4_2),
0b5395f0 281 __strcmp_sse42)
107e6a3c 282 IFUNC_IMPL_ADD (array, i, strcmp, CPU_FEATURE_USABLE (SSSE3),
0b5395f0 283 __strcmp_ssse3)
8f02859f 284 IFUNC_IMPL_ADD (array, i, strcmp, 1, __strcmp_sse2_unaligned)
ac49ecaf
L
285 IFUNC_IMPL_ADD (array, i, strcmp, 1, __strcmp_sse2))
286
4df54c89 287 /* Support sysdeps/x86_64/multiarch/strcpy.c. */
ac49ecaf 288 IFUNC_IMPL (i, name, strcpy,
107e6a3c 289 IFUNC_IMPL_ADD (array, i, strcpy, CPU_FEATURE_USABLE (AVX2),
1a153e47 290 __strcpy_avx2)
107e6a3c 291 IFUNC_IMPL_ADD (array, i, strcpy, CPU_FEATURE_USABLE (SSSE3),
0b5395f0 292 __strcpy_ssse3)
ac49ecaf
L
293 IFUNC_IMPL_ADD (array, i, strcpy, 1, __strcpy_sse2_unaligned)
294 IFUNC_IMPL_ADD (array, i, strcpy, 1, __strcpy_sse2))
295
4df54c89 296 /* Support sysdeps/x86_64/multiarch/strcspn.c. */
ac49ecaf 297 IFUNC_IMPL (i, name, strcspn,
107e6a3c 298 IFUNC_IMPL_ADD (array, i, strcspn, CPU_FEATURE_USABLE (SSE4_2),
ac49ecaf
L
299 __strcspn_sse42)
300 IFUNC_IMPL_ADD (array, i, strcspn, 1, __strcspn_sse2))
301
4df54c89 302 /* Support sysdeps/x86_64/multiarch/strncase_l.c. */
ac49ecaf 303 IFUNC_IMPL (i, name, strncasecmp,
0b5395f0 304 IFUNC_IMPL_ADD (array, i, strncasecmp,
107e6a3c 305 CPU_FEATURE_USABLE (AVX),
ac49ecaf 306 __strncasecmp_avx)
0b5395f0 307 IFUNC_IMPL_ADD (array, i, strncasecmp,
107e6a3c 308 CPU_FEATURE_USABLE (SSE4_2),
ac49ecaf 309 __strncasecmp_sse42)
0b5395f0 310 IFUNC_IMPL_ADD (array, i, strncasecmp,
107e6a3c 311 CPU_FEATURE_USABLE (SSSE3),
ac49ecaf
L
312 __strncasecmp_ssse3)
313 IFUNC_IMPL_ADD (array, i, strncasecmp, 1,
314 __strncasecmp_sse2))
315
4df54c89 316 /* Support sysdeps/x86_64/multiarch/strncase_l.c. */
ac49ecaf 317 IFUNC_IMPL (i, name, strncasecmp_l,
0b5395f0 318 IFUNC_IMPL_ADD (array, i, strncasecmp_l,
107e6a3c 319 CPU_FEATURE_USABLE (AVX),
ac49ecaf 320 __strncasecmp_l_avx)
0b5395f0 321 IFUNC_IMPL_ADD (array, i, strncasecmp_l,
107e6a3c 322 CPU_FEATURE_USABLE (SSE4_2),
ac49ecaf 323 __strncasecmp_l_sse42)
0b5395f0 324 IFUNC_IMPL_ADD (array, i, strncasecmp_l,
107e6a3c 325 CPU_FEATURE_USABLE (SSSE3),
ac49ecaf
L
326 __strncasecmp_l_ssse3)
327 IFUNC_IMPL_ADD (array, i, strncasecmp_l, 1,
328 __strncasecmp_l_sse2))
329
4df54c89 330 /* Support sysdeps/x86_64/multiarch/strncat.c. */
ac49ecaf 331 IFUNC_IMPL (i, name, strncat,
107e6a3c 332 IFUNC_IMPL_ADD (array, i, strncat, CPU_FEATURE_USABLE (AVX2),
1a153e47 333 __strncat_avx2)
107e6a3c 334 IFUNC_IMPL_ADD (array, i, strncat, CPU_FEATURE_USABLE (SSSE3),
ac49ecaf
L
335 __strncat_ssse3)
336 IFUNC_IMPL_ADD (array, i, strncat, 1,
337 __strncat_sse2_unaligned)
338 IFUNC_IMPL_ADD (array, i, strncat, 1, __strncat_sse2))
339
4df54c89 340 /* Support sysdeps/x86_64/multiarch/strncpy.c. */
ac49ecaf 341 IFUNC_IMPL (i, name, strncpy,
107e6a3c 342 IFUNC_IMPL_ADD (array, i, strncpy, CPU_FEATURE_USABLE (AVX2),
1a153e47 343 __strncpy_avx2)
107e6a3c 344 IFUNC_IMPL_ADD (array, i, strncpy, CPU_FEATURE_USABLE (SSSE3),
ac49ecaf
L
345 __strncpy_ssse3)
346 IFUNC_IMPL_ADD (array, i, strncpy, 1,
347 __strncpy_sse2_unaligned)
348 IFUNC_IMPL_ADD (array, i, strncpy, 1, __strncpy_sse2))
349
4df54c89 350 /* Support sysdeps/x86_64/multiarch/strpbrk.c. */
ac49ecaf 351 IFUNC_IMPL (i, name, strpbrk,
107e6a3c 352 IFUNC_IMPL_ADD (array, i, strpbrk, CPU_FEATURE_USABLE (SSE4_2),
ac49ecaf
L
353 __strpbrk_sse42)
354 IFUNC_IMPL_ADD (array, i, strpbrk, 1, __strpbrk_sse2))
355
ac49ecaf 356
4df54c89 357 /* Support sysdeps/x86_64/multiarch/strspn.c. */
ac49ecaf 358 IFUNC_IMPL (i, name, strspn,
107e6a3c 359 IFUNC_IMPL_ADD (array, i, strspn, CPU_FEATURE_USABLE (SSE4_2),
0b5395f0 360 __strspn_sse42)
ac49ecaf
L
361 IFUNC_IMPL_ADD (array, i, strspn, 1, __strspn_sse2))
362
6f8e37eb 363 /* Support sysdeps/x86_64/multiarch/strstr.c. */
ac49ecaf 364 IFUNC_IMPL (i, name, strstr,
584b18eb 365 IFUNC_IMPL_ADD (array, i, strstr, 1, __strstr_sse2_unaligned)
ac49ecaf
L
366 IFUNC_IMPL_ADD (array, i, strstr, 1, __strstr_sse2))
367
8fe57365
L
368 /* Support sysdeps/x86_64/multiarch/wcschr.c. */
369 IFUNC_IMPL (i, name, wcschr,
370 IFUNC_IMPL_ADD (array, i, wcschr,
107e6a3c 371 CPU_FEATURE_USABLE (AVX2),
8fe57365
L
372 __wcschr_avx2)
373 IFUNC_IMPL_ADD (array, i, wcschr, 1, __wcschr_sse2))
374
d2538b91
L
375 /* Support sysdeps/x86_64/multiarch/wcsrchr.c. */
376 IFUNC_IMPL (i, name, wcsrchr,
377 IFUNC_IMPL_ADD (array, i, wcsrchr,
107e6a3c 378 CPU_FEATURE_USABLE (AVX2),
d2538b91
L
379 __wcsrchr_avx2)
380 IFUNC_IMPL_ADD (array, i, wcsrchr, 1, __wcsrchr_sse2))
381
14570163
LS
382 /* Support sysdeps/x86_64/multiarch/wcscmp.c. */
383 IFUNC_IMPL (i, name, wcscmp,
384 IFUNC_IMPL_ADD (array, i, wcscmp,
107e6a3c 385 CPU_FEATURE_USABLE (AVX2),
14570163
LS
386 __wcscmp_avx2)
387 IFUNC_IMPL_ADD (array, i, wcscmp, 1, __wcscmp_sse2))
388
389 /* Support sysdeps/x86_64/multiarch/wcsncmp.c. */
390 IFUNC_IMPL (i, name, wcsncmp,
391 IFUNC_IMPL_ADD (array, i, wcsncmp,
107e6a3c 392 CPU_FEATURE_USABLE (AVX2),
14570163
LS
393 __wcsncmp_avx2)
394 IFUNC_IMPL_ADD (array, i, wcsncmp, 1, __wcsncmp_sse2))
395
4df54c89 396 /* Support sysdeps/x86_64/multiarch/wcscpy.c. */
ac49ecaf 397 IFUNC_IMPL (i, name, wcscpy,
107e6a3c 398 IFUNC_IMPL_ADD (array, i, wcscpy, CPU_FEATURE_USABLE (SSSE3),
0b5395f0 399 __wcscpy_ssse3)
ac49ecaf
L
400 IFUNC_IMPL_ADD (array, i, wcscpy, 1, __wcscpy_sse2))
401
dc485ceb
L
402 /* Support sysdeps/x86_64/multiarch/wcslen.c. */
403 IFUNC_IMPL (i, name, wcslen,
404 IFUNC_IMPL_ADD (array, i, wcslen,
107e6a3c 405 CPU_FEATURE_USABLE (AVX2),
dc485ceb
L
406 __wcslen_avx2)
407 IFUNC_IMPL_ADD (array, i, wcslen, 1, __wcslen_sse2))
408
d4cc385c
L
409 /* Support sysdeps/x86_64/multiarch/wcsnlen.c. */
410 IFUNC_IMPL (i, name, wcsnlen,
dc485ceb 411 IFUNC_IMPL_ADD (array, i, wcsnlen,
107e6a3c 412 CPU_FEATURE_USABLE (AVX2),
dc485ceb 413 __wcsnlen_avx2)
d4cc385c 414 IFUNC_IMPL_ADD (array, i, wcsnlen,
107e6a3c 415 CPU_FEATURE_USABLE (SSE4_1),
d4cc385c
L
416 __wcsnlen_sse4_1)
417 IFUNC_IMPL_ADD (array, i, wcsnlen, 1, __wcsnlen_sse2))
418
2f5d20ac
L
419 /* Support sysdeps/x86_64/multiarch/wmemchr.c. */
420 IFUNC_IMPL (i, name, wmemchr,
421 IFUNC_IMPL_ADD (array, i, wmemchr,
107e6a3c 422 CPU_FEATURE_USABLE (AVX2),
2f5d20ac
L
423 __wmemchr_avx2)
424 IFUNC_IMPL_ADD (array, i, wmemchr, 1, __wmemchr_sse2))
425
b91a52d0 426 /* Support sysdeps/x86_64/multiarch/wmemcmp.c. */
ac49ecaf 427 IFUNC_IMPL (i, name, wmemcmp,
935971ba 428 IFUNC_IMPL_ADD (array, i, wmemcmp,
107e6a3c
L
429 (CPU_FEATURE_USABLE (AVX2)
430 && CPU_FEATURE_USABLE (MOVBE)),
935971ba 431 __wmemcmp_avx2_movbe)
107e6a3c 432 IFUNC_IMPL_ADD (array, i, wmemcmp, CPU_FEATURE_USABLE (SSE4_1),
ac49ecaf 433 __wmemcmp_sse4_1)
107e6a3c 434 IFUNC_IMPL_ADD (array, i, wmemcmp, CPU_FEATURE_USABLE (SSSE3),
ac49ecaf
L
435 __wmemcmp_ssse3)
436 IFUNC_IMPL_ADD (array, i, wmemcmp, 1, __wmemcmp_sse2))
437
5e112282 438 /* Support sysdeps/x86_64/multiarch/wmemset.c. */
ef9c4cb6
L
439 IFUNC_IMPL (i, name, wmemset,
440 IFUNC_IMPL_ADD (array, i, wmemset, 1,
441 __wmemset_sse2_unaligned)
442 IFUNC_IMPL_ADD (array, i, wmemset,
107e6a3c 443 CPU_FEATURE_USABLE (AVX2),
ef9c4cb6
L
444 __wmemset_avx2_unaligned)
445 IFUNC_IMPL_ADD (array, i, wmemset,
107e6a3c 446 CPU_FEATURE_USABLE (AVX512F),
ef9c4cb6
L
447 __wmemset_avx512_unaligned))
448
ac49ecaf 449#ifdef SHARED
5c3e322d 450 /* Support sysdeps/x86_64/multiarch/memcpy_chk.c. */
ac49ecaf 451 IFUNC_IMPL (i, name, __memcpy_chk,
72276d6e 452 IFUNC_IMPL_ADD (array, i, __memcpy_chk,
107e6a3c 453 CPU_FEATURE_USABLE (AVX512F),
72276d6e 454 __memcpy_chk_avx512_no_vzeroupper)
88b57b8e 455 IFUNC_IMPL_ADD (array, i, __memcpy_chk,
107e6a3c 456 CPU_FEATURE_USABLE (AVX512F),
c867597b 457 __memcpy_chk_avx512_unaligned)
88b57b8e 458 IFUNC_IMPL_ADD (array, i, __memcpy_chk,
107e6a3c 459 CPU_FEATURE_USABLE (AVX512F),
88b57b8e 460 __memcpy_chk_avx512_unaligned_erms)
0b5395f0 461 IFUNC_IMPL_ADD (array, i, __memcpy_chk,
107e6a3c 462 CPU_FEATURE_USABLE (AVX),
05f3633d 463 __memcpy_chk_avx_unaligned)
88b57b8e 464 IFUNC_IMPL_ADD (array, i, __memcpy_chk,
107e6a3c 465 CPU_FEATURE_USABLE (AVX),
88b57b8e 466 __memcpy_chk_avx_unaligned_erms)
0b5395f0 467 IFUNC_IMPL_ADD (array, i, __memcpy_chk,
107e6a3c 468 CPU_FEATURE_USABLE (SSSE3),
ac49ecaf 469 __memcpy_chk_ssse3_back)
0b5395f0 470 IFUNC_IMPL_ADD (array, i, __memcpy_chk,
107e6a3c 471 CPU_FEATURE_USABLE (SSSE3),
ac49ecaf 472 __memcpy_chk_ssse3)
88b57b8e 473 IFUNC_IMPL_ADD (array, i, __memcpy_chk, 1,
c867597b 474 __memcpy_chk_sse2_unaligned)
ac49ecaf 475 IFUNC_IMPL_ADD (array, i, __memcpy_chk, 1,
5c3e322d
L
476 __memcpy_chk_sse2_unaligned_erms)
477 IFUNC_IMPL_ADD (array, i, __memcpy_chk, 1,
478 __memcpy_chk_erms))
fc11ff8d 479#endif
ac49ecaf 480
5c3e322d 481 /* Support sysdeps/x86_64/multiarch/memcpy.c. */
ac49ecaf 482 IFUNC_IMPL (i, name, memcpy,
0b5395f0 483 IFUNC_IMPL_ADD (array, i, memcpy,
107e6a3c 484 CPU_FEATURE_USABLE (AVX),
05f3633d 485 __memcpy_avx_unaligned)
88b57b8e 486 IFUNC_IMPL_ADD (array, i, memcpy,
107e6a3c 487 CPU_FEATURE_USABLE (AVX),
88b57b8e 488 __memcpy_avx_unaligned_erms)
107e6a3c 489 IFUNC_IMPL_ADD (array, i, memcpy, CPU_FEATURE_USABLE (SSSE3),
ac49ecaf 490 __memcpy_ssse3_back)
107e6a3c 491 IFUNC_IMPL_ADD (array, i, memcpy, CPU_FEATURE_USABLE (SSSE3),
0b5395f0 492 __memcpy_ssse3)
72276d6e 493 IFUNC_IMPL_ADD (array, i, memcpy,
107e6a3c 494 CPU_FEATURE_USABLE (AVX512F),
72276d6e 495 __memcpy_avx512_no_vzeroupper)
88b57b8e 496 IFUNC_IMPL_ADD (array, i, memcpy,
107e6a3c 497 CPU_FEATURE_USABLE (AVX512F),
c867597b 498 __memcpy_avx512_unaligned)
88b57b8e 499 IFUNC_IMPL_ADD (array, i, memcpy,
107e6a3c 500 CPU_FEATURE_USABLE (AVX512F),
88b57b8e 501 __memcpy_avx512_unaligned_erms)
2d48b41c 502 IFUNC_IMPL_ADD (array, i, memcpy, 1, __memcpy_sse2_unaligned)
88b57b8e
L
503 IFUNC_IMPL_ADD (array, i, memcpy, 1,
504 __memcpy_sse2_unaligned_erms)
c867597b 505 IFUNC_IMPL_ADD (array, i, memcpy, 1, __memcpy_erms))
ac49ecaf 506
fc11ff8d 507#ifdef SHARED
5c3e322d 508 /* Support sysdeps/x86_64/multiarch/mempcpy_chk.c. */
ac49ecaf 509 IFUNC_IMPL (i, name, __mempcpy_chk,
72276d6e 510 IFUNC_IMPL_ADD (array, i, __mempcpy_chk,
107e6a3c 511 CPU_FEATURE_USABLE (AVX512F),
72276d6e 512 __mempcpy_chk_avx512_no_vzeroupper)
88b57b8e 513 IFUNC_IMPL_ADD (array, i, __mempcpy_chk,
107e6a3c 514 CPU_FEATURE_USABLE (AVX512F),
c867597b 515 __mempcpy_chk_avx512_unaligned)
88b57b8e 516 IFUNC_IMPL_ADD (array, i, __mempcpy_chk,
107e6a3c 517 CPU_FEATURE_USABLE (AVX512F),
88b57b8e 518 __mempcpy_chk_avx512_unaligned_erms)
0b5395f0 519 IFUNC_IMPL_ADD (array, i, __mempcpy_chk,
107e6a3c 520 CPU_FEATURE_USABLE (AVX),
05f3633d 521 __mempcpy_chk_avx_unaligned)
88b57b8e 522 IFUNC_IMPL_ADD (array, i, __mempcpy_chk,
107e6a3c 523 CPU_FEATURE_USABLE (AVX),
88b57b8e 524 __mempcpy_chk_avx_unaligned_erms)
0b5395f0 525 IFUNC_IMPL_ADD (array, i, __mempcpy_chk,
107e6a3c 526 CPU_FEATURE_USABLE (SSSE3),
ac49ecaf 527 __mempcpy_chk_ssse3_back)
0b5395f0 528 IFUNC_IMPL_ADD (array, i, __mempcpy_chk,
107e6a3c 529 CPU_FEATURE_USABLE (SSSE3),
ac49ecaf 530 __mempcpy_chk_ssse3)
88b57b8e 531 IFUNC_IMPL_ADD (array, i, __mempcpy_chk, 1,
c867597b 532 __mempcpy_chk_sse2_unaligned)
ac49ecaf 533 IFUNC_IMPL_ADD (array, i, __mempcpy_chk, 1,
5c3e322d
L
534 __mempcpy_chk_sse2_unaligned_erms)
535 IFUNC_IMPL_ADD (array, i, __mempcpy_chk, 1,
536 __mempcpy_chk_erms))
fc11ff8d 537#endif
ac49ecaf 538
5c3e322d 539 /* Support sysdeps/x86_64/multiarch/mempcpy.c. */
ac49ecaf 540 IFUNC_IMPL (i, name, mempcpy,
72276d6e 541 IFUNC_IMPL_ADD (array, i, mempcpy,
107e6a3c 542 CPU_FEATURE_USABLE (AVX512F),
72276d6e 543 __mempcpy_avx512_no_vzeroupper)
88b57b8e 544 IFUNC_IMPL_ADD (array, i, mempcpy,
107e6a3c 545 CPU_FEATURE_USABLE (AVX512F),
c867597b 546 __mempcpy_avx512_unaligned)
88b57b8e 547 IFUNC_IMPL_ADD (array, i, mempcpy,
107e6a3c 548 CPU_FEATURE_USABLE (AVX512F),
88b57b8e 549 __mempcpy_avx512_unaligned_erms)
0b5395f0 550 IFUNC_IMPL_ADD (array, i, mempcpy,
107e6a3c 551 CPU_FEATURE_USABLE (AVX),
05f3633d 552 __mempcpy_avx_unaligned)
88b57b8e 553 IFUNC_IMPL_ADD (array, i, mempcpy,
107e6a3c 554 CPU_FEATURE_USABLE (AVX),
88b57b8e 555 __mempcpy_avx_unaligned_erms)
107e6a3c 556 IFUNC_IMPL_ADD (array, i, mempcpy, CPU_FEATURE_USABLE (SSSE3),
ac49ecaf 557 __mempcpy_ssse3_back)
107e6a3c 558 IFUNC_IMPL_ADD (array, i, mempcpy, CPU_FEATURE_USABLE (SSSE3),
ac49ecaf 559 __mempcpy_ssse3)
88b57b8e 560 IFUNC_IMPL_ADD (array, i, mempcpy, 1,
c867597b 561 __mempcpy_sse2_unaligned)
88b57b8e
L
562 IFUNC_IMPL_ADD (array, i, mempcpy, 1,
563 __mempcpy_sse2_unaligned_erms)
c867597b 564 IFUNC_IMPL_ADD (array, i, mempcpy, 1, __mempcpy_erms))
ac49ecaf 565
4df54c89 566 /* Support sysdeps/x86_64/multiarch/strncmp.c. */
ac49ecaf 567 IFUNC_IMPL (i, name, strncmp,
14570163 568 IFUNC_IMPL_ADD (array, i, strncmp,
107e6a3c 569 CPU_FEATURE_USABLE (AVX2),
14570163 570 __strncmp_avx2)
107e6a3c 571 IFUNC_IMPL_ADD (array, i, strncmp, CPU_FEATURE_USABLE (SSE4_2),
ac49ecaf 572 __strncmp_sse42)
107e6a3c 573 IFUNC_IMPL_ADD (array, i, strncmp, CPU_FEATURE_USABLE (SSSE3),
ac49ecaf
L
574 __strncmp_ssse3)
575 IFUNC_IMPL_ADD (array, i, strncmp, 1, __strncmp_sse2))
ef9c4cb6 576
fc11ff8d 577#ifdef SHARED
5e112282 578 /* Support sysdeps/x86_64/multiarch/wmemset_chk.c. */
ef9c4cb6
L
579 IFUNC_IMPL (i, name, __wmemset_chk,
580 IFUNC_IMPL_ADD (array, i, __wmemset_chk, 1,
581 __wmemset_chk_sse2_unaligned)
582 IFUNC_IMPL_ADD (array, i, __wmemset_chk,
107e6a3c 583 CPU_FEATURE_USABLE (AVX2),
ef9c4cb6
L
584 __wmemset_chk_avx2_unaligned)
585 IFUNC_IMPL_ADD (array, i, __wmemset_chk,
107e6a3c 586 CPU_FEATURE_USABLE (AVX512F),
ef9c4cb6 587 __wmemset_chk_avx512_unaligned))
ac49ecaf
L
588#endif
589
590 return i;
591}