1/* Enumerate available IFUNC implementations of a function. x86-64 version.
2 Copyright (C) 2012-2021 Free Software Foundation, Inc.
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
17 <https://www.gnu.org/licenses/>. */
18
19#include <assert.h>
20#include <string.h>
21#include <wchar.h>
22#include <ifunc-impl-list.h>
23#include <sysdep.h>
24#include "init-arch.h"
25
26/* Maximum number of IFUNC implementations. */
27#define MAX_IFUNC 5
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
41 /* Support sysdeps/x86_64/multiarch/memchr.c. */
42 IFUNC_IMPL (i, name, memchr,
43 IFUNC_IMPL_ADD (array, i, memchr,
44 CPU_FEATURE_USABLE (AVX2),
45 __memchr_avx2)
46 IFUNC_IMPL_ADD (array, i, memchr,
47 (CPU_FEATURE_USABLE (AVX2)
48 && CPU_FEATURE_USABLE (RTM)),
49 __memchr_avx2_rtm)
50 IFUNC_IMPL_ADD (array, i, memchr,
51 (CPU_FEATURE_USABLE (AVX512VL)
52 && CPU_FEATURE_USABLE (AVX512BW)
53 && CPU_FEATURE_USABLE (BMI2)),
54 __memchr_evex)
55 IFUNC_IMPL_ADD (array, i, memchr,
56 (CPU_FEATURE_USABLE (AVX512VL)
57 && CPU_FEATURE_USABLE (AVX512BW)
58 && CPU_FEATURE_USABLE (BMI2)),
59 __memchr_evex_rtm)
60 IFUNC_IMPL_ADD (array, i, memchr, 1, __memchr_sse2))
61
62 /* Support sysdeps/x86_64/multiarch/memcmp.c. */
63 IFUNC_IMPL (i, name, memcmp,
64 IFUNC_IMPL_ADD (array, i, memcmp,
65 (CPU_FEATURE_USABLE (AVX2)
66 && CPU_FEATURE_USABLE (BMI2)
67 && CPU_FEATURE_USABLE (MOVBE)),
68 __memcmp_avx2_movbe)
69 IFUNC_IMPL_ADD (array, i, memcmp,
70 (CPU_FEATURE_USABLE (AVX2)
71 && CPU_FEATURE_USABLE (BMI2)
72 && CPU_FEATURE_USABLE (MOVBE)
73 && CPU_FEATURE_USABLE (RTM)),
74 __memcmp_avx2_movbe_rtm)
75 IFUNC_IMPL_ADD (array, i, memcmp,
76 (CPU_FEATURE_USABLE (AVX512VL)
77 && CPU_FEATURE_USABLE (AVX512BW)
78 && CPU_FEATURE_USABLE (BMI2)
79 && CPU_FEATURE_USABLE (MOVBE)),
80 __memcmp_evex_movbe)
81 IFUNC_IMPL_ADD (array, i, memcmp, CPU_FEATURE_USABLE (SSE4_1),
82 __memcmp_sse4_1)
83 IFUNC_IMPL_ADD (array, i, memcmp, CPU_FEATURE_USABLE (SSSE3),
84 __memcmp_ssse3)
85 IFUNC_IMPL_ADD (array, i, memcmp, 1, __memcmp_sse2))
86
87#ifdef SHARED
88 /* Support sysdeps/x86_64/multiarch/memmove_chk.c. */
89 IFUNC_IMPL (i, name, __memmove_chk,
90 IFUNC_IMPL_ADD (array, i, __memmove_chk,
91 CPU_FEATURE_USABLE (AVX512F),
92 __memmove_chk_avx512_no_vzeroupper)
93 IFUNC_IMPL_ADD (array, i, __memmove_chk,
94 CPU_FEATURE_USABLE (AVX512VL),
95 __memmove_chk_avx512_unaligned)
96 IFUNC_IMPL_ADD (array, i, __memmove_chk,
97 CPU_FEATURE_USABLE (AVX512VL),
98 __memmove_chk_avx512_unaligned_erms)
99 IFUNC_IMPL_ADD (array, i, __memmove_chk,
100 CPU_FEATURE_USABLE (AVX),
101 __memmove_chk_avx_unaligned)
102 IFUNC_IMPL_ADD (array, i, __memmove_chk,
103 CPU_FEATURE_USABLE (AVX),
104 __memmove_chk_avx_unaligned_erms)
105 IFUNC_IMPL_ADD (array, i, __memmove_chk,
106 (CPU_FEATURE_USABLE (AVX)
107 && CPU_FEATURE_USABLE (RTM)),
108 __memmove_chk_avx_unaligned_rtm)
109 IFUNC_IMPL_ADD (array, i, __memmove_chk,
110 (CPU_FEATURE_USABLE (AVX)
111 && CPU_FEATURE_USABLE (RTM)),
112 __memmove_chk_avx_unaligned_erms_rtm)
113 IFUNC_IMPL_ADD (array, i, __memmove_chk,
114 CPU_FEATURE_USABLE (AVX512VL),
115 __memmove_chk_evex_unaligned)
116 IFUNC_IMPL_ADD (array, i, __memmove_chk,
117 CPU_FEATURE_USABLE (AVX512VL),
118 __memmove_chk_evex_unaligned_erms)
119 IFUNC_IMPL_ADD (array, i, __memmove_chk,
120 CPU_FEATURE_USABLE (SSSE3),
121 __memmove_chk_ssse3_back)
122 IFUNC_IMPL_ADD (array, i, __memmove_chk,
123 CPU_FEATURE_USABLE (SSSE3),
124 __memmove_chk_ssse3)
125 IFUNC_IMPL_ADD (array, i, __memmove_chk, 1,
126 __memmove_chk_sse2_unaligned)
127 IFUNC_IMPL_ADD (array, i, __memmove_chk, 1,
128 __memmove_chk_sse2_unaligned_erms)
129 IFUNC_IMPL_ADD (array, i, __memmove_chk, 1,
130 __memmove_chk_erms))
131#endif
132
133 /* Support sysdeps/x86_64/multiarch/memmove.c. */
134 IFUNC_IMPL (i, name, memmove,
135 IFUNC_IMPL_ADD (array, i, memmove,
136 CPU_FEATURE_USABLE (AVX),
137 __memmove_avx_unaligned)
138 IFUNC_IMPL_ADD (array, i, memmove,
139 CPU_FEATURE_USABLE (AVX),
140 __memmove_avx_unaligned_erms)
141 IFUNC_IMPL_ADD (array, i, memmove,
142 (CPU_FEATURE_USABLE (AVX)
143 && CPU_FEATURE_USABLE (RTM)),
144 __memmove_avx_unaligned_rtm)
145 IFUNC_IMPL_ADD (array, i, memmove,
146 (CPU_FEATURE_USABLE (AVX)
147 && CPU_FEATURE_USABLE (RTM)),
148 __memmove_avx_unaligned_erms_rtm)
149 IFUNC_IMPL_ADD (array, i, memmove,
150 CPU_FEATURE_USABLE (AVX512VL),
151 __memmove_evex_unaligned)
152 IFUNC_IMPL_ADD (array, i, memmove,
153 CPU_FEATURE_USABLE (AVX512VL),
154 __memmove_evex_unaligned_erms)
155 IFUNC_IMPL_ADD (array, i, memmove,
156 CPU_FEATURE_USABLE (AVX512F),
157 __memmove_avx512_no_vzeroupper)
158 IFUNC_IMPL_ADD (array, i, memmove,
159 CPU_FEATURE_USABLE (AVX512VL),
160 __memmove_avx512_unaligned)
161 IFUNC_IMPL_ADD (array, i, memmove,
162 CPU_FEATURE_USABLE (AVX512VL),
163 __memmove_avx512_unaligned_erms)
164 IFUNC_IMPL_ADD (array, i, memmove, CPU_FEATURE_USABLE (SSSE3),
165 __memmove_ssse3_back)
166 IFUNC_IMPL_ADD (array, i, memmove, CPU_FEATURE_USABLE (SSSE3),
167 __memmove_ssse3)
168 IFUNC_IMPL_ADD (array, i, memmove, 1, __memmove_erms)
169 IFUNC_IMPL_ADD (array, i, memmove, 1,
170 __memmove_sse2_unaligned)
171 IFUNC_IMPL_ADD (array, i, memmove, 1,
172 __memmove_sse2_unaligned_erms))
173
174 /* Support sysdeps/x86_64/multiarch/memrchr.c. */
175 IFUNC_IMPL (i, name, memrchr,
176 IFUNC_IMPL_ADD (array, i, memrchr,
177 CPU_FEATURE_USABLE (AVX2),
178 __memrchr_avx2)
179 IFUNC_IMPL_ADD (array, i, memrchr,
180 (CPU_FEATURE_USABLE (AVX2)
181 && CPU_FEATURE_USABLE (RTM)),
182 __memrchr_avx2_rtm)
183 IFUNC_IMPL_ADD (array, i, memrchr,
184 (CPU_FEATURE_USABLE (AVX512VL)
185 && CPU_FEATURE_USABLE (AVX512BW)),
186 __memrchr_evex)
187
188 IFUNC_IMPL_ADD (array, i, memrchr, 1, __memrchr_sse2))
189
190#ifdef SHARED
191 /* Support sysdeps/x86_64/multiarch/memset_chk.c. */
192 IFUNC_IMPL (i, name, __memset_chk,
193 IFUNC_IMPL_ADD (array, i, __memset_chk, 1,
194 __memset_chk_erms)
195 IFUNC_IMPL_ADD (array, i, __memset_chk, 1,
196 __memset_chk_sse2_unaligned)
197 IFUNC_IMPL_ADD (array, i, __memset_chk, 1,
198 __memset_chk_sse2_unaligned_erms)
199 IFUNC_IMPL_ADD (array, i, __memset_chk,
200 CPU_FEATURE_USABLE (AVX2),
201 __memset_chk_avx2_unaligned)
202 IFUNC_IMPL_ADD (array, i, __memset_chk,
203 CPU_FEATURE_USABLE (AVX2),
204 __memset_chk_avx2_unaligned_erms)
205 IFUNC_IMPL_ADD (array, i, __memset_chk,
206 (CPU_FEATURE_USABLE (AVX2)
207 && CPU_FEATURE_USABLE (RTM)),
208 __memset_chk_avx2_unaligned_rtm)
209 IFUNC_IMPL_ADD (array, i, __memset_chk,
210 (CPU_FEATURE_USABLE (AVX2)
211 && CPU_FEATURE_USABLE (RTM)),
212 __memset_chk_avx2_unaligned_erms_rtm)
213 IFUNC_IMPL_ADD (array, i, __memset_chk,
214 (CPU_FEATURE_USABLE (AVX512VL)
215 && CPU_FEATURE_USABLE (AVX512BW)
216 && CPU_FEATURE_USABLE (BMI2)),
217 __memset_chk_evex_unaligned)
218 IFUNC_IMPL_ADD (array, i, __memset_chk,
219 (CPU_FEATURE_USABLE (AVX512VL)
220 && CPU_FEATURE_USABLE (AVX512BW)
221 && CPU_FEATURE_USABLE (BMI2)),
222 __memset_chk_evex_unaligned_erms)
223 IFUNC_IMPL_ADD (array, i, __memset_chk,
224 (CPU_FEATURE_USABLE (AVX512VL)
225 && CPU_FEATURE_USABLE (AVX512BW)
226 && CPU_FEATURE_USABLE (BMI2)),
227 __memset_chk_avx512_unaligned_erms)
228 IFUNC_IMPL_ADD (array, i, __memset_chk,
229 (CPU_FEATURE_USABLE (AVX512VL)
230 && CPU_FEATURE_USABLE (AVX512BW)
231 && CPU_FEATURE_USABLE (BMI2)),
232 __memset_chk_avx512_unaligned)
233 IFUNC_IMPL_ADD (array, i, __memset_chk,
234 CPU_FEATURE_USABLE (AVX512F),
235 __memset_chk_avx512_no_vzeroupper)
236 )
237#endif
238
239 /* Support sysdeps/x86_64/multiarch/memset.c. */
240 IFUNC_IMPL (i, name, memset,
241 IFUNC_IMPL_ADD (array, i, memset, 1,
242 __memset_sse2_unaligned)
243 IFUNC_IMPL_ADD (array, i, memset, 1,
244 __memset_sse2_unaligned_erms)
245 IFUNC_IMPL_ADD (array, i, memset, 1, __memset_erms)
246 IFUNC_IMPL_ADD (array, i, memset,
247 CPU_FEATURE_USABLE (AVX2),
248 __memset_avx2_unaligned)
249 IFUNC_IMPL_ADD (array, i, memset,
250 CPU_FEATURE_USABLE (AVX2),
251 __memset_avx2_unaligned_erms)
252 IFUNC_IMPL_ADD (array, i, memset,
253 (CPU_FEATURE_USABLE (AVX2)
254 && CPU_FEATURE_USABLE (RTM)),
255 __memset_avx2_unaligned_rtm)
256 IFUNC_IMPL_ADD (array, i, memset,
257 (CPU_FEATURE_USABLE (AVX2)
258 && CPU_FEATURE_USABLE (RTM)),
259 __memset_avx2_unaligned_erms_rtm)
260 IFUNC_IMPL_ADD (array, i, memset,
261 (CPU_FEATURE_USABLE (AVX512VL)
262 && CPU_FEATURE_USABLE (AVX512BW)
263 && CPU_FEATURE_USABLE (BMI2)),
264 __memset_evex_unaligned)
265 IFUNC_IMPL_ADD (array, i, memset,
266 (CPU_FEATURE_USABLE (AVX512VL)
267 && CPU_FEATURE_USABLE (AVX512BW)
268 && CPU_FEATURE_USABLE (BMI2)),
269 __memset_evex_unaligned_erms)
270 IFUNC_IMPL_ADD (array, i, memset,
271 (CPU_FEATURE_USABLE (AVX512VL)
272 && CPU_FEATURE_USABLE (AVX512BW)
273 && CPU_FEATURE_USABLE (BMI2)),
274 __memset_avx512_unaligned_erms)
275 IFUNC_IMPL_ADD (array, i, memset,
276 (CPU_FEATURE_USABLE (AVX512VL)
277 && CPU_FEATURE_USABLE (AVX512BW)
278 && CPU_FEATURE_USABLE (BMI2)),
279 __memset_avx512_unaligned)
280 IFUNC_IMPL_ADD (array, i, memset,
281 CPU_FEATURE_USABLE (AVX512F),
282 __memset_avx512_no_vzeroupper)
283 )
284
285 /* Support sysdeps/x86_64/multiarch/rawmemchr.c. */
286 IFUNC_IMPL (i, name, rawmemchr,
287 IFUNC_IMPL_ADD (array, i, rawmemchr,
288 CPU_FEATURE_USABLE (AVX2),
289 __rawmemchr_avx2)
290 IFUNC_IMPL_ADD (array, i, rawmemchr,
291 (CPU_FEATURE_USABLE (AVX2)
292 && CPU_FEATURE_USABLE (RTM)),
293 __rawmemchr_avx2_rtm)
294 IFUNC_IMPL_ADD (array, i, rawmemchr,
295 (CPU_FEATURE_USABLE (AVX512VL)
296 && CPU_FEATURE_USABLE (AVX512BW)
297 && CPU_FEATURE_USABLE (BMI2)),
298 __rawmemchr_evex)
299 IFUNC_IMPL_ADD (array, i, rawmemchr,
300 (CPU_FEATURE_USABLE (AVX512VL)
301 && CPU_FEATURE_USABLE (AVX512BW)
302 && CPU_FEATURE_USABLE (BMI2)),
303 __rawmemchr_evex_rtm)
304 IFUNC_IMPL_ADD (array, i, rawmemchr, 1, __rawmemchr_sse2))
305
306 /* Support sysdeps/x86_64/multiarch/strlen.c. */
307 IFUNC_IMPL (i, name, strlen,
308 IFUNC_IMPL_ADD (array, i, strlen,
309 (CPU_FEATURE_USABLE (AVX2)
310 && CPU_FEATURE_USABLE (BMI2)),
311 __strlen_avx2)
312 IFUNC_IMPL_ADD (array, i, strlen,
313 (CPU_FEATURE_USABLE (AVX2)
314 && CPU_FEATURE_USABLE (BMI2)
315 && CPU_FEATURE_USABLE (RTM)),
316 __strlen_avx2_rtm)
317 IFUNC_IMPL_ADD (array, i, strlen,
318 (CPU_FEATURE_USABLE (AVX512VL)
319 && CPU_FEATURE_USABLE (AVX512BW)
320 && CPU_FEATURE_USABLE (BMI2)),
321 __strlen_evex)
322 IFUNC_IMPL_ADD (array, i, strlen, 1, __strlen_sse2))
323
324 /* Support sysdeps/x86_64/multiarch/strnlen.c. */
325 IFUNC_IMPL (i, name, strnlen,
326 IFUNC_IMPL_ADD (array, i, strnlen,
327 (CPU_FEATURE_USABLE (AVX2)
328 && CPU_FEATURE_USABLE (BMI2)),
329 __strnlen_avx2)
330 IFUNC_IMPL_ADD (array, i, strnlen,
331 (CPU_FEATURE_USABLE (AVX2)
332 && CPU_FEATURE_USABLE (BMI2)
333 && CPU_FEATURE_USABLE (RTM)),
334 __strnlen_avx2_rtm)
335 IFUNC_IMPL_ADD (array, i, strnlen,
336 (CPU_FEATURE_USABLE (AVX512VL)
337 && CPU_FEATURE_USABLE (AVX512BW)
338 && CPU_FEATURE_USABLE (BMI2)),
339 __strnlen_evex)
340 IFUNC_IMPL_ADD (array, i, strnlen, 1, __strnlen_sse2))
341
342 /* Support sysdeps/x86_64/multiarch/stpncpy.c. */
343 IFUNC_IMPL (i, name, stpncpy,
344 IFUNC_IMPL_ADD (array, i, stpncpy, CPU_FEATURE_USABLE (SSSE3),
345 __stpncpy_ssse3)
346 IFUNC_IMPL_ADD (array, i, stpncpy, CPU_FEATURE_USABLE (AVX2),
347 __stpncpy_avx2)
348 IFUNC_IMPL_ADD (array, i, stpncpy,
349 (CPU_FEATURE_USABLE (AVX2)
350 && CPU_FEATURE_USABLE (RTM)),
351 __stpncpy_avx2_rtm)
352 IFUNC_IMPL_ADD (array, i, stpncpy,
353 (CPU_FEATURE_USABLE (AVX512VL)
354 && CPU_FEATURE_USABLE (AVX512BW)),
355 __stpncpy_evex)
356 IFUNC_IMPL_ADD (array, i, stpncpy, 1,
357 __stpncpy_sse2_unaligned)
358 IFUNC_IMPL_ADD (array, i, stpncpy, 1, __stpncpy_sse2))
359
360 /* Support sysdeps/x86_64/multiarch/stpcpy.c. */
361 IFUNC_IMPL (i, name, stpcpy,
362 IFUNC_IMPL_ADD (array, i, stpcpy, CPU_FEATURE_USABLE (SSSE3),
363 __stpcpy_ssse3)
364 IFUNC_IMPL_ADD (array, i, stpcpy, CPU_FEATURE_USABLE (AVX2),
365 __stpcpy_avx2)
366 IFUNC_IMPL_ADD (array, i, stpcpy,
367 (CPU_FEATURE_USABLE (AVX2)
368 && CPU_FEATURE_USABLE (RTM)),
369 __stpcpy_avx2_rtm)
370 IFUNC_IMPL_ADD (array, i, stpcpy,
371 (CPU_FEATURE_USABLE (AVX512VL)
372 && CPU_FEATURE_USABLE (AVX512BW)),
373 __stpcpy_evex)
374 IFUNC_IMPL_ADD (array, i, stpcpy, 1, __stpcpy_sse2_unaligned)
375 IFUNC_IMPL_ADD (array, i, stpcpy, 1, __stpcpy_sse2))
376
377 /* Support sysdeps/x86_64/multiarch/strcasecmp_l.c. */
378 IFUNC_IMPL (i, name, strcasecmp,
379 IFUNC_IMPL_ADD (array, i, strcasecmp,
380 CPU_FEATURE_USABLE (AVX),
381 __strcasecmp_avx)
382 IFUNC_IMPL_ADD (array, i, strcasecmp,
383 CPU_FEATURE_USABLE (SSE4_2),
384 __strcasecmp_sse42)
385 IFUNC_IMPL_ADD (array, i, strcasecmp,
386 CPU_FEATURE_USABLE (SSSE3),
387 __strcasecmp_ssse3)
388 IFUNC_IMPL_ADD (array, i, strcasecmp, 1, __strcasecmp_sse2))
389
390 /* Support sysdeps/x86_64/multiarch/strcasecmp_l.c. */
391 IFUNC_IMPL (i, name, strcasecmp_l,
392 IFUNC_IMPL_ADD (array, i, strcasecmp_l,
393 CPU_FEATURE_USABLE (AVX),
394 __strcasecmp_l_avx)
395 IFUNC_IMPL_ADD (array, i, strcasecmp_l,
396 CPU_FEATURE_USABLE (SSE4_2),
397 __strcasecmp_l_sse42)
398 IFUNC_IMPL_ADD (array, i, strcasecmp_l,
399 CPU_FEATURE_USABLE (SSSE3),
400 __strcasecmp_l_ssse3)
401 IFUNC_IMPL_ADD (array, i, strcasecmp_l, 1,
402 __strcasecmp_l_sse2))
403
404 /* Support sysdeps/x86_64/multiarch/strcat.c. */
405 IFUNC_IMPL (i, name, strcat,
406 IFUNC_IMPL_ADD (array, i, strcat, CPU_FEATURE_USABLE (AVX2),
407 __strcat_avx2)
408 IFUNC_IMPL_ADD (array, i, strcat,
409 (CPU_FEATURE_USABLE (AVX2)
410 && CPU_FEATURE_USABLE (RTM)),
411 __strcat_avx2_rtm)
412 IFUNC_IMPL_ADD (array, i, strcat,
413 (CPU_FEATURE_USABLE (AVX512VL)
414 && CPU_FEATURE_USABLE (AVX512BW)),
415 __strcat_evex)
416 IFUNC_IMPL_ADD (array, i, strcat, CPU_FEATURE_USABLE (SSSE3),
417 __strcat_ssse3)
418 IFUNC_IMPL_ADD (array, i, strcat, 1, __strcat_sse2_unaligned)
419 IFUNC_IMPL_ADD (array, i, strcat, 1, __strcat_sse2))
420
421 /* Support sysdeps/x86_64/multiarch/strchr.c. */
422 IFUNC_IMPL (i, name, strchr,
423 IFUNC_IMPL_ADD (array, i, strchr,
424 (CPU_FEATURE_USABLE (AVX2)
425 && CPU_FEATURE_USABLE (BMI2)),
426 __strchr_avx2)
427 IFUNC_IMPL_ADD (array, i, strchr,
428 (CPU_FEATURE_USABLE (AVX2)
429 && CPU_FEATURE_USABLE (BMI2)
430 && CPU_FEATURE_USABLE (RTM)),
431 __strchr_avx2_rtm)
432 IFUNC_IMPL_ADD (array, i, strchr,
433 (CPU_FEATURE_USABLE (AVX512VL)
434 && CPU_FEATURE_USABLE (AVX512BW)
435 && CPU_FEATURE_USABLE (BMI2)),
436 __strchr_evex)
437 IFUNC_IMPL_ADD (array, i, strchr, 1, __strchr_sse2_no_bsf)
438 IFUNC_IMPL_ADD (array, i, strchr, 1, __strchr_sse2))
439
440 /* Support sysdeps/x86_64/multiarch/strchrnul.c. */
441 IFUNC_IMPL (i, name, strchrnul,
442 IFUNC_IMPL_ADD (array, i, strchrnul,
443 (CPU_FEATURE_USABLE (AVX2)
444 && CPU_FEATURE_USABLE (BMI2)),
445 __strchrnul_avx2)
446 IFUNC_IMPL_ADD (array, i, strchrnul,
447 (CPU_FEATURE_USABLE (AVX2)
448 && CPU_FEATURE_USABLE (BMI2)
449 && CPU_FEATURE_USABLE (RTM)),
450 __strchrnul_avx2_rtm)
451 IFUNC_IMPL_ADD (array, i, strchrnul,
452 (CPU_FEATURE_USABLE (AVX512VL)
453 && CPU_FEATURE_USABLE (AVX512BW)
454 && CPU_FEATURE_USABLE (BMI2)),
455 __strchrnul_evex)
456 IFUNC_IMPL_ADD (array, i, strchrnul, 1, __strchrnul_sse2))
457
458 /* Support sysdeps/x86_64/multiarch/strrchr.c. */
459 IFUNC_IMPL (i, name, strrchr,
460 IFUNC_IMPL_ADD (array, i, strrchr,
461 CPU_FEATURE_USABLE (AVX2),
462 __strrchr_avx2)
463 IFUNC_IMPL_ADD (array, i, strrchr,
464 (CPU_FEATURE_USABLE (AVX2)
465 && CPU_FEATURE_USABLE (RTM)),
466 __strrchr_avx2_rtm)
467 IFUNC_IMPL_ADD (array, i, strrchr,
468 (CPU_FEATURE_USABLE (AVX512VL)
469 && CPU_FEATURE_USABLE (AVX512BW)),
470 __strrchr_evex)
471 IFUNC_IMPL_ADD (array, i, strrchr, 1, __strrchr_sse2))
472
473 /* Support sysdeps/x86_64/multiarch/strcmp.c. */
474 IFUNC_IMPL (i, name, strcmp,
475 IFUNC_IMPL_ADD (array, i, strcmp,
476 CPU_FEATURE_USABLE (AVX2),
477 __strcmp_avx2)
478 IFUNC_IMPL_ADD (array, i, strcmp,
479 (CPU_FEATURE_USABLE (AVX2)
480 && CPU_FEATURE_USABLE (RTM)),
481 __strcmp_avx2_rtm)
482 IFUNC_IMPL_ADD (array, i, strcmp,
483 (CPU_FEATURE_USABLE (AVX512VL)
484 && CPU_FEATURE_USABLE (AVX512BW)
485 && CPU_FEATURE_USABLE (BMI2)),
486 __strcmp_evex)
487 IFUNC_IMPL_ADD (array, i, strcmp, CPU_FEATURE_USABLE (SSE4_2),
488 __strcmp_sse42)
489 IFUNC_IMPL_ADD (array, i, strcmp, CPU_FEATURE_USABLE (SSSE3),
490 __strcmp_ssse3)
491 IFUNC_IMPL_ADD (array, i, strcmp, 1, __strcmp_sse2_unaligned)
492 IFUNC_IMPL_ADD (array, i, strcmp, 1, __strcmp_sse2))
493
494 /* Support sysdeps/x86_64/multiarch/strcpy.c. */
495 IFUNC_IMPL (i, name, strcpy,
496 IFUNC_IMPL_ADD (array, i, strcpy, CPU_FEATURE_USABLE (AVX2),
497 __strcpy_avx2)
498 IFUNC_IMPL_ADD (array, i, strcpy,
499 (CPU_FEATURE_USABLE (AVX2)
500 && CPU_FEATURE_USABLE (RTM)),
501 __strcpy_avx2_rtm)
502 IFUNC_IMPL_ADD (array, i, strcpy,
503 (CPU_FEATURE_USABLE (AVX512VL)
504 && CPU_FEATURE_USABLE (AVX512BW)),
505 __strcpy_evex)
506 IFUNC_IMPL_ADD (array, i, strcpy, CPU_FEATURE_USABLE (SSSE3),
507 __strcpy_ssse3)
508 IFUNC_IMPL_ADD (array, i, strcpy, 1, __strcpy_sse2_unaligned)
509 IFUNC_IMPL_ADD (array, i, strcpy, 1, __strcpy_sse2))
510
511 /* Support sysdeps/x86_64/multiarch/strcspn.c. */
512 IFUNC_IMPL (i, name, strcspn,
513 IFUNC_IMPL_ADD (array, i, strcspn, CPU_FEATURE_USABLE (SSE4_2),
514 __strcspn_sse42)
515 IFUNC_IMPL_ADD (array, i, strcspn, 1, __strcspn_sse2))
516
517 /* Support sysdeps/x86_64/multiarch/strncase_l.c. */
518 IFUNC_IMPL (i, name, strncasecmp,
519 IFUNC_IMPL_ADD (array, i, strncasecmp,
520 CPU_FEATURE_USABLE (AVX),
521 __strncasecmp_avx)
522 IFUNC_IMPL_ADD (array, i, strncasecmp,
523 CPU_FEATURE_USABLE (SSE4_2),
524 __strncasecmp_sse42)
525 IFUNC_IMPL_ADD (array, i, strncasecmp,
526 CPU_FEATURE_USABLE (SSSE3),
527 __strncasecmp_ssse3)
528 IFUNC_IMPL_ADD (array, i, strncasecmp, 1,
529 __strncasecmp_sse2))
530
531 /* Support sysdeps/x86_64/multiarch/strncase_l.c. */
532 IFUNC_IMPL (i, name, strncasecmp_l,
533 IFUNC_IMPL_ADD (array, i, strncasecmp_l,
534 CPU_FEATURE_USABLE (AVX),
535 __strncasecmp_l_avx)
536 IFUNC_IMPL_ADD (array, i, strncasecmp_l,
537 CPU_FEATURE_USABLE (SSE4_2),
538 __strncasecmp_l_sse42)
539 IFUNC_IMPL_ADD (array, i, strncasecmp_l,
540 CPU_FEATURE_USABLE (SSSE3),
541 __strncasecmp_l_ssse3)
542 IFUNC_IMPL_ADD (array, i, strncasecmp_l, 1,
543 __strncasecmp_l_sse2))
544
545 /* Support sysdeps/x86_64/multiarch/strncat.c. */
546 IFUNC_IMPL (i, name, strncat,
547 IFUNC_IMPL_ADD (array, i, strncat, CPU_FEATURE_USABLE (AVX2),
548 __strncat_avx2)
549 IFUNC_IMPL_ADD (array, i, strncat,
550 (CPU_FEATURE_USABLE (AVX2)
551 && CPU_FEATURE_USABLE (RTM)),
552 __strncat_avx2_rtm)
553 IFUNC_IMPL_ADD (array, i, strncat,
554 (CPU_FEATURE_USABLE (AVX512VL)
555 && CPU_FEATURE_USABLE (AVX512BW)),
556 __strncat_evex)
557 IFUNC_IMPL_ADD (array, i, strncat, CPU_FEATURE_USABLE (SSSE3),
558 __strncat_ssse3)
559 IFUNC_IMPL_ADD (array, i, strncat, 1,
560 __strncat_sse2_unaligned)
561 IFUNC_IMPL_ADD (array, i, strncat, 1, __strncat_sse2))
562
563 /* Support sysdeps/x86_64/multiarch/strncpy.c. */
564 IFUNC_IMPL (i, name, strncpy,
565 IFUNC_IMPL_ADD (array, i, strncpy, CPU_FEATURE_USABLE (AVX2),
566 __strncpy_avx2)
567 IFUNC_IMPL_ADD (array, i, strncpy,
568 (CPU_FEATURE_USABLE (AVX2)
569 && CPU_FEATURE_USABLE (RTM)),
570 __strncpy_avx2_rtm)
571 IFUNC_IMPL_ADD (array, i, strncpy,
572 (CPU_FEATURE_USABLE (AVX512VL)
573 && CPU_FEATURE_USABLE (AVX512BW)),
574 __strncpy_evex)
575 IFUNC_IMPL_ADD (array, i, strncpy, CPU_FEATURE_USABLE (SSSE3),
576 __strncpy_ssse3)
577 IFUNC_IMPL_ADD (array, i, strncpy, 1,
578 __strncpy_sse2_unaligned)
579 IFUNC_IMPL_ADD (array, i, strncpy, 1, __strncpy_sse2))
580
581 /* Support sysdeps/x86_64/multiarch/strpbrk.c. */
582 IFUNC_IMPL (i, name, strpbrk,
583 IFUNC_IMPL_ADD (array, i, strpbrk, CPU_FEATURE_USABLE (SSE4_2),
584 __strpbrk_sse42)
585 IFUNC_IMPL_ADD (array, i, strpbrk, 1, __strpbrk_sse2))
586
587
588 /* Support sysdeps/x86_64/multiarch/strspn.c. */
589 IFUNC_IMPL (i, name, strspn,
590 IFUNC_IMPL_ADD (array, i, strspn, CPU_FEATURE_USABLE (SSE4_2),
591 __strspn_sse42)
592 IFUNC_IMPL_ADD (array, i, strspn, 1, __strspn_sse2))
593
594 /* Support sysdeps/x86_64/multiarch/strstr.c. */
595 IFUNC_IMPL (i, name, strstr,
596 IFUNC_IMPL_ADD (array, i, strstr, 1, __strstr_sse2_unaligned)
597 IFUNC_IMPL_ADD (array, i, strstr, 1, __strstr_sse2))
598
599 /* Support sysdeps/x86_64/multiarch/wcschr.c. */
600 IFUNC_IMPL (i, name, wcschr,
601 IFUNC_IMPL_ADD (array, i, wcschr,
602 (CPU_FEATURE_USABLE (AVX2)
603 && CPU_FEATURE_USABLE (BMI2)),
604 __wcschr_avx2)
605 IFUNC_IMPL_ADD (array, i, wcschr,
606 (CPU_FEATURE_USABLE (AVX2)
607 && CPU_FEATURE_USABLE (BMI2)
608 && CPU_FEATURE_USABLE (RTM)),
609 __wcschr_avx2_rtm)
610 IFUNC_IMPL_ADD (array, i, wcschr,
611 (CPU_FEATURE_USABLE (AVX512VL)
612 && CPU_FEATURE_USABLE (AVX512BW)
613 && CPU_FEATURE_USABLE (BMI2)),
614 __wcschr_evex)
615 IFUNC_IMPL_ADD (array, i, wcschr, 1, __wcschr_sse2))
616
617 /* Support sysdeps/x86_64/multiarch/wcsrchr.c. */
618 IFUNC_IMPL (i, name, wcsrchr,
619 IFUNC_IMPL_ADD (array, i, wcsrchr,
620 CPU_FEATURE_USABLE (AVX2),
621 __wcsrchr_avx2)
622 IFUNC_IMPL_ADD (array, i, wcsrchr,
623 (CPU_FEATURE_USABLE (AVX2)
624 && CPU_FEATURE_USABLE (RTM)),
625 __wcsrchr_avx2_rtm)
626 IFUNC_IMPL_ADD (array, i, wcsrchr,
627 (CPU_FEATURE_USABLE (AVX512VL)
628 && CPU_FEATURE_USABLE (AVX512BW)
629 && CPU_FEATURE_USABLE (BMI2)),
630 __wcsrchr_evex)
631 IFUNC_IMPL_ADD (array, i, wcsrchr, 1, __wcsrchr_sse2))
632
633 /* Support sysdeps/x86_64/multiarch/wcscmp.c. */
634 IFUNC_IMPL (i, name, wcscmp,
635 IFUNC_IMPL_ADD (array, i, wcscmp,
636 CPU_FEATURE_USABLE (AVX2),
637 __wcscmp_avx2)
638 IFUNC_IMPL_ADD (array, i, wcscmp,
639 (CPU_FEATURE_USABLE (AVX2)
640 && CPU_FEATURE_USABLE (RTM)),
641 __wcscmp_avx2_rtm)
642 IFUNC_IMPL_ADD (array, i, wcscmp,
643 (CPU_FEATURE_USABLE (AVX512VL)
644 && CPU_FEATURE_USABLE (AVX512BW)
645 && CPU_FEATURE_USABLE (BMI2)),
646 __wcscmp_evex)
647 IFUNC_IMPL_ADD (array, i, wcscmp, 1, __wcscmp_sse2))
648
649 /* Support sysdeps/x86_64/multiarch/wcsncmp.c. */
650 IFUNC_IMPL (i, name, wcsncmp,
651 IFUNC_IMPL_ADD (array, i, wcsncmp,
652 CPU_FEATURE_USABLE (AVX2),
653 __wcsncmp_avx2)
654 IFUNC_IMPL_ADD (array, i, wcsncmp,
655 (CPU_FEATURE_USABLE (AVX2)
656 && CPU_FEATURE_USABLE (RTM)),
657 __wcsncmp_avx2_rtm)
658 IFUNC_IMPL_ADD (array, i, wcsncmp,
659 (CPU_FEATURE_USABLE (AVX512VL)
660 && CPU_FEATURE_USABLE (AVX512BW)
661 && CPU_FEATURE_USABLE (BMI2)),
662 __wcsncmp_evex)
663 IFUNC_IMPL_ADD (array, i, wcsncmp, 1, __wcsncmp_sse2))
664
665 /* Support sysdeps/x86_64/multiarch/wcscpy.c. */
666 IFUNC_IMPL (i, name, wcscpy,
667 IFUNC_IMPL_ADD (array, i, wcscpy, CPU_FEATURE_USABLE (SSSE3),
668 __wcscpy_ssse3)
669 IFUNC_IMPL_ADD (array, i, wcscpy, 1, __wcscpy_sse2))
670
671 /* Support sysdeps/x86_64/multiarch/wcslen.c. */
672 IFUNC_IMPL (i, name, wcslen,
673 IFUNC_IMPL_ADD (array, i, wcslen,
674 (CPU_FEATURE_USABLE (AVX2)
675 && CPU_FEATURE_USABLE (BMI2)),
676 __wcslen_avx2)
677 IFUNC_IMPL_ADD (array, i, wcslen,
678 (CPU_FEATURE_USABLE (AVX2)
679 && CPU_FEATURE_USABLE (BMI2)
680 && CPU_FEATURE_USABLE (RTM)),
681 __wcslen_avx2_rtm)
682 IFUNC_IMPL_ADD (array, i, wcslen,
683 (CPU_FEATURE_USABLE (AVX512VL)
684 && CPU_FEATURE_USABLE (AVX512BW)
685 && CPU_FEATURE_USABLE (BMI2)),
686 __wcslen_evex)
687 IFUNC_IMPL_ADD (array, i, wcslen,
688 CPU_FEATURE_USABLE (SSE4_1),
689 __wcslen_sse4_1)
690 IFUNC_IMPL_ADD (array, i, wcslen, 1, __wcslen_sse2))
691
692 /* Support sysdeps/x86_64/multiarch/wcsnlen.c. */
693 IFUNC_IMPL (i, name, wcsnlen,
694 IFUNC_IMPL_ADD (array, i, wcsnlen,
695 (CPU_FEATURE_USABLE (AVX2)
696 && CPU_FEATURE_USABLE (BMI2)),
697 __wcsnlen_avx2)
698 IFUNC_IMPL_ADD (array, i, wcsnlen,
699 (CPU_FEATURE_USABLE (AVX2)
700 && CPU_FEATURE_USABLE (BMI2)
701 && CPU_FEATURE_USABLE (RTM)),
702 __wcsnlen_avx2_rtm)
703 IFUNC_IMPL_ADD (array, i, wcsnlen,
704 (CPU_FEATURE_USABLE (AVX512VL)
705 && CPU_FEATURE_USABLE (AVX512BW)
706 && CPU_FEATURE_USABLE (BMI2)),
707 __wcsnlen_evex)
708 IFUNC_IMPL_ADD (array, i, wcsnlen,
709 CPU_FEATURE_USABLE (SSE4_1),
710 __wcsnlen_sse4_1)
711 IFUNC_IMPL_ADD (array, i, wcsnlen, 1, __wcsnlen_sse2))
712
713 /* Support sysdeps/x86_64/multiarch/wmemchr.c. */
714 IFUNC_IMPL (i, name, wmemchr,
715 IFUNC_IMPL_ADD (array, i, wmemchr,
716 CPU_FEATURE_USABLE (AVX2),
717 __wmemchr_avx2)
718 IFUNC_IMPL_ADD (array, i, wmemchr,
719 (CPU_FEATURE_USABLE (AVX2)
720 && CPU_FEATURE_USABLE (RTM)),
721 __wmemchr_avx2_rtm)
722 IFUNC_IMPL_ADD (array, i, wmemchr,
723 (CPU_FEATURE_USABLE (AVX512VL)
724 && CPU_FEATURE_USABLE (AVX512BW)
725 && CPU_FEATURE_USABLE (BMI2)),
726 __wmemchr_evex)
727 IFUNC_IMPL_ADD (array, i, wmemchr,
728 (CPU_FEATURE_USABLE (AVX512VL)
729 && CPU_FEATURE_USABLE (AVX512BW)
730 && CPU_FEATURE_USABLE (BMI2)),
731 __wmemchr_evex_rtm)
732 IFUNC_IMPL_ADD (array, i, wmemchr, 1, __wmemchr_sse2))
733
734 /* Support sysdeps/x86_64/multiarch/wmemcmp.c. */
735 IFUNC_IMPL (i, name, wmemcmp,
736 IFUNC_IMPL_ADD (array, i, wmemcmp,
737 (CPU_FEATURE_USABLE (AVX2)
738 && CPU_FEATURE_USABLE (BMI2)
739 && CPU_FEATURE_USABLE (MOVBE)),
740 __wmemcmp_avx2_movbe)
741 IFUNC_IMPL_ADD (array, i, wmemcmp,
742 (CPU_FEATURE_USABLE (AVX2)
743 && CPU_FEATURE_USABLE (BMI2)
744 && CPU_FEATURE_USABLE (MOVBE)
745 && CPU_FEATURE_USABLE (RTM)),
746 __wmemcmp_avx2_movbe_rtm)
747 IFUNC_IMPL_ADD (array, i, wmemcmp,
748 (CPU_FEATURE_USABLE (AVX512VL)
749 && CPU_FEATURE_USABLE (AVX512BW)
750 && CPU_FEATURE_USABLE (BMI2)
751 && CPU_FEATURE_USABLE (MOVBE)),
752 __wmemcmp_evex_movbe)
753 IFUNC_IMPL_ADD (array, i, wmemcmp, CPU_FEATURE_USABLE (SSE4_1),
754 __wmemcmp_sse4_1)
755 IFUNC_IMPL_ADD (array, i, wmemcmp, CPU_FEATURE_USABLE (SSSE3),
756 __wmemcmp_ssse3)
757 IFUNC_IMPL_ADD (array, i, wmemcmp, 1, __wmemcmp_sse2))
758
759 /* Support sysdeps/x86_64/multiarch/wmemset.c. */
760 IFUNC_IMPL (i, name, wmemset,
761 IFUNC_IMPL_ADD (array, i, wmemset, 1,
762 __wmemset_sse2_unaligned)
763 IFUNC_IMPL_ADD (array, i, wmemset,
764 CPU_FEATURE_USABLE (AVX2),
765 __wmemset_avx2_unaligned)
766 IFUNC_IMPL_ADD (array, i, wmemset,
767 (CPU_FEATURE_USABLE (AVX2)
768 && CPU_FEATURE_USABLE (RTM)),
769 __wmemset_avx2_unaligned_rtm)
770 IFUNC_IMPL_ADD (array, i, wmemset,
771 (CPU_FEATURE_USABLE (AVX512VL)
772 && CPU_FEATURE_USABLE (AVX512BW)
773 && CPU_FEATURE_USABLE (BMI2)),
774 __wmemset_evex_unaligned)
775 IFUNC_IMPL_ADD (array, i, wmemset,
776 (CPU_FEATURE_USABLE (AVX512VL)
777 && CPU_FEATURE_USABLE (AVX512BW)
778 && CPU_FEATURE_USABLE (BMI2)),
779 __wmemset_avx512_unaligned))
780
781#ifdef SHARED
782 /* Support sysdeps/x86_64/multiarch/memcpy_chk.c. */
783 IFUNC_IMPL (i, name, __memcpy_chk,
784 IFUNC_IMPL_ADD (array, i, __memcpy_chk,
785 CPU_FEATURE_USABLE (AVX512F),
786 __memcpy_chk_avx512_no_vzeroupper)
787 IFUNC_IMPL_ADD (array, i, __memcpy_chk,
788 CPU_FEATURE_USABLE (AVX512VL),
789 __memcpy_chk_avx512_unaligned)
790 IFUNC_IMPL_ADD (array, i, __memcpy_chk,
791 CPU_FEATURE_USABLE (AVX512VL),
792 __memcpy_chk_avx512_unaligned_erms)
793 IFUNC_IMPL_ADD (array, i, __memcpy_chk,
794 CPU_FEATURE_USABLE (AVX),
795 __memcpy_chk_avx_unaligned)
796 IFUNC_IMPL_ADD (array, i, __memcpy_chk,
797 CPU_FEATURE_USABLE (AVX),
798 __memcpy_chk_avx_unaligned_erms)
799 IFUNC_IMPL_ADD (array, i, __memcpy_chk,
800 (CPU_FEATURE_USABLE (AVX)
801 && CPU_FEATURE_USABLE (RTM)),
802 __memcpy_chk_avx_unaligned_rtm)
803 IFUNC_IMPL_ADD (array, i, __memcpy_chk,
804 (CPU_FEATURE_USABLE (AVX)
805 && CPU_FEATURE_USABLE (RTM)),
806 __memcpy_chk_avx_unaligned_erms_rtm)
807 IFUNC_IMPL_ADD (array, i, __memcpy_chk,
808 CPU_FEATURE_USABLE (AVX512VL),
809 __memcpy_chk_evex_unaligned)
810 IFUNC_IMPL_ADD (array, i, __memcpy_chk,
811 CPU_FEATURE_USABLE (AVX512VL),
812 __memcpy_chk_evex_unaligned_erms)
813 IFUNC_IMPL_ADD (array, i, __memcpy_chk,
814 CPU_FEATURE_USABLE (SSSE3),
815 __memcpy_chk_ssse3_back)
816 IFUNC_IMPL_ADD (array, i, __memcpy_chk,
817 CPU_FEATURE_USABLE (SSSE3),
818 __memcpy_chk_ssse3)
819 IFUNC_IMPL_ADD (array, i, __memcpy_chk, 1,
820 __memcpy_chk_sse2_unaligned)
821 IFUNC_IMPL_ADD (array, i, __memcpy_chk, 1,
822 __memcpy_chk_sse2_unaligned_erms)
823 IFUNC_IMPL_ADD (array, i, __memcpy_chk, 1,
824 __memcpy_chk_erms))
825#endif
826
827 /* Support sysdeps/x86_64/multiarch/memcpy.c. */
828 IFUNC_IMPL (i, name, memcpy,
829 IFUNC_IMPL_ADD (array, i, memcpy,
830 CPU_FEATURE_USABLE (AVX),
831 __memcpy_avx_unaligned)
832 IFUNC_IMPL_ADD (array, i, memcpy,
833 CPU_FEATURE_USABLE (AVX),
834 __memcpy_avx_unaligned_erms)
835 IFUNC_IMPL_ADD (array, i, memcpy,
836 (CPU_FEATURE_USABLE (AVX)
837 && CPU_FEATURE_USABLE (RTM)),
838 __memcpy_avx_unaligned_rtm)
839 IFUNC_IMPL_ADD (array, i, memcpy,
840 (CPU_FEATURE_USABLE (AVX)
841 && CPU_FEATURE_USABLE (RTM)),
842 __memcpy_avx_unaligned_erms_rtm)
843 IFUNC_IMPL_ADD (array, i, memcpy,
844 CPU_FEATURE_USABLE (AVX512VL),
845 __memcpy_evex_unaligned)
846 IFUNC_IMPL_ADD (array, i, memcpy,
847 CPU_FEATURE_USABLE (AVX512VL),
848 __memcpy_evex_unaligned_erms)
849 IFUNC_IMPL_ADD (array, i, memcpy, CPU_FEATURE_USABLE (SSSE3),
850 __memcpy_ssse3_back)
851 IFUNC_IMPL_ADD (array, i, memcpy, CPU_FEATURE_USABLE (SSSE3),
852 __memcpy_ssse3)
853 IFUNC_IMPL_ADD (array, i, memcpy,
854 CPU_FEATURE_USABLE (AVX512F),
855 __memcpy_avx512_no_vzeroupper)
856 IFUNC_IMPL_ADD (array, i, memcpy,
857 CPU_FEATURE_USABLE (AVX512VL),
858 __memcpy_avx512_unaligned)
859 IFUNC_IMPL_ADD (array, i, memcpy,
860 CPU_FEATURE_USABLE (AVX512VL),
861 __memcpy_avx512_unaligned_erms)
862 IFUNC_IMPL_ADD (array, i, memcpy, 1, __memcpy_sse2_unaligned)
863 IFUNC_IMPL_ADD (array, i, memcpy, 1,
864 __memcpy_sse2_unaligned_erms)
865 IFUNC_IMPL_ADD (array, i, memcpy, 1, __memcpy_erms))
866
867#ifdef SHARED
868 /* Support sysdeps/x86_64/multiarch/mempcpy_chk.c. */
869 IFUNC_IMPL (i, name, __mempcpy_chk,
870 IFUNC_IMPL_ADD (array, i, __mempcpy_chk,
871 CPU_FEATURE_USABLE (AVX512F),
872 __mempcpy_chk_avx512_no_vzeroupper)
873 IFUNC_IMPL_ADD (array, i, __mempcpy_chk,
874 CPU_FEATURE_USABLE (AVX512VL),
875 __mempcpy_chk_avx512_unaligned)
876 IFUNC_IMPL_ADD (array, i, __mempcpy_chk,
877 CPU_FEATURE_USABLE (AVX512VL),
878 __mempcpy_chk_avx512_unaligned_erms)
879 IFUNC_IMPL_ADD (array, i, __mempcpy_chk,
880 CPU_FEATURE_USABLE (AVX),
881 __mempcpy_chk_avx_unaligned)
882 IFUNC_IMPL_ADD (array, i, __mempcpy_chk,
883 CPU_FEATURE_USABLE (AVX),
884 __mempcpy_chk_avx_unaligned_erms)
885 IFUNC_IMPL_ADD (array, i, __mempcpy_chk,
886 (CPU_FEATURE_USABLE (AVX)
887 && CPU_FEATURE_USABLE (RTM)),
888 __mempcpy_chk_avx_unaligned_rtm)
889 IFUNC_IMPL_ADD (array, i, __mempcpy_chk,
890 (CPU_FEATURE_USABLE (AVX)
891 && CPU_FEATURE_USABLE (RTM)),
892 __mempcpy_chk_avx_unaligned_erms_rtm)
893 IFUNC_IMPL_ADD (array, i, __mempcpy_chk,
894 CPU_FEATURE_USABLE (AVX512VL),
895 __mempcpy_chk_evex_unaligned)
896 IFUNC_IMPL_ADD (array, i, __mempcpy_chk,
897 CPU_FEATURE_USABLE (AVX512VL),
898 __mempcpy_chk_evex_unaligned_erms)
899 IFUNC_IMPL_ADD (array, i, __mempcpy_chk,
900 CPU_FEATURE_USABLE (SSSE3),
901 __mempcpy_chk_ssse3_back)
902 IFUNC_IMPL_ADD (array, i, __mempcpy_chk,
903 CPU_FEATURE_USABLE (SSSE3),
904 __mempcpy_chk_ssse3)
905 IFUNC_IMPL_ADD (array, i, __mempcpy_chk, 1,
906 __mempcpy_chk_sse2_unaligned)
907 IFUNC_IMPL_ADD (array, i, __mempcpy_chk, 1,
908 __mempcpy_chk_sse2_unaligned_erms)
909 IFUNC_IMPL_ADD (array, i, __mempcpy_chk, 1,
910 __mempcpy_chk_erms))
911#endif
912
913 /* Support sysdeps/x86_64/multiarch/mempcpy.c. */
914 IFUNC_IMPL (i, name, mempcpy,
915 IFUNC_IMPL_ADD (array, i, mempcpy,
916 CPU_FEATURE_USABLE (AVX512F),
917 __mempcpy_avx512_no_vzeroupper)
918 IFUNC_IMPL_ADD (array, i, mempcpy,
919 CPU_FEATURE_USABLE (AVX512VL),
920 __mempcpy_avx512_unaligned)
921 IFUNC_IMPL_ADD (array, i, mempcpy,
922 CPU_FEATURE_USABLE (AVX512VL),
923 __mempcpy_avx512_unaligned_erms)
924 IFUNC_IMPL_ADD (array, i, mempcpy,
925 CPU_FEATURE_USABLE (AVX),
926 __mempcpy_avx_unaligned)
927 IFUNC_IMPL_ADD (array, i, mempcpy,
928 CPU_FEATURE_USABLE (AVX),
929 __mempcpy_avx_unaligned_erms)
930 IFUNC_IMPL_ADD (array, i, mempcpy,
931 (CPU_FEATURE_USABLE (AVX)
932 && CPU_FEATURE_USABLE (RTM)),
933 __mempcpy_avx_unaligned_rtm)
934 IFUNC_IMPL_ADD (array, i, mempcpy,
935 (CPU_FEATURE_USABLE (AVX)
936 && CPU_FEATURE_USABLE (RTM)),
937 __mempcpy_avx_unaligned_erms_rtm)
938 IFUNC_IMPL_ADD (array, i, mempcpy,
939 CPU_FEATURE_USABLE (AVX512VL),
940 __mempcpy_evex_unaligned)
941 IFUNC_IMPL_ADD (array, i, mempcpy,
942 CPU_FEATURE_USABLE (AVX512VL),
943 __mempcpy_evex_unaligned_erms)
944 IFUNC_IMPL_ADD (array, i, mempcpy, CPU_FEATURE_USABLE (SSSE3),
945 __mempcpy_ssse3_back)
946 IFUNC_IMPL_ADD (array, i, mempcpy, CPU_FEATURE_USABLE (SSSE3),
947 __mempcpy_ssse3)
948 IFUNC_IMPL_ADD (array, i, mempcpy, 1,
949 __mempcpy_sse2_unaligned)
950 IFUNC_IMPL_ADD (array, i, mempcpy, 1,
951 __mempcpy_sse2_unaligned_erms)
952 IFUNC_IMPL_ADD (array, i, mempcpy, 1, __mempcpy_erms))
953
954 /* Support sysdeps/x86_64/multiarch/strncmp.c. */
955 IFUNC_IMPL (i, name, strncmp,
956 IFUNC_IMPL_ADD (array, i, strncmp,
957 CPU_FEATURE_USABLE (AVX2),
958 __strncmp_avx2)
959 IFUNC_IMPL_ADD (array, i, strncmp,
960 (CPU_FEATURE_USABLE (AVX2)
961 && CPU_FEATURE_USABLE (RTM)),
962 __strncmp_avx2_rtm)
963 IFUNC_IMPL_ADD (array, i, strncmp,
964 (CPU_FEATURE_USABLE (AVX512VL)
965 && CPU_FEATURE_USABLE (AVX512BW)),
966 __strncmp_evex)
967 IFUNC_IMPL_ADD (array, i, strncmp, CPU_FEATURE_USABLE (SSE4_2),
968 __strncmp_sse42)
969 IFUNC_IMPL_ADD (array, i, strncmp, CPU_FEATURE_USABLE (SSSE3),
970 __strncmp_ssse3)
971 IFUNC_IMPL_ADD (array, i, strncmp, 1, __strncmp_sse2))
972
973#ifdef SHARED
974 /* Support sysdeps/x86_64/multiarch/wmemset_chk.c. */
975 IFUNC_IMPL (i, name, __wmemset_chk,
976 IFUNC_IMPL_ADD (array, i, __wmemset_chk, 1,
977 __wmemset_chk_sse2_unaligned)
978 IFUNC_IMPL_ADD (array, i, __wmemset_chk,
979 CPU_FEATURE_USABLE (AVX2),
980 __wmemset_chk_avx2_unaligned)
981 IFUNC_IMPL_ADD (array, i, __wmemset_chk,
982 (CPU_FEATURE_USABLE (AVX512VL)
983 && CPU_FEATURE_USABLE (AVX512BW)
984 && CPU_FEATURE_USABLE (BMI2)),
985 __wmemset_chk_evex_unaligned)
986 IFUNC_IMPL_ADD (array, i, __wmemset_chk,
987 (CPU_FEATURE_USABLE (AVX512VL)
988 && CPU_FEATURE_USABLE (AVX512BW)
989 && CPU_FEATURE_USABLE (BMI2)),
990 __wmemset_chk_avx512_unaligned))
991#endif
992
993 return i;
994}
995