1/* Enumerate available IFUNC implementations of a function. x86-64 version.
2 Copyright (C) 2012-2020 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 HAS_ARCH_FEATURE (AVX2_Usable),
45 __memchr_avx2)
46 IFUNC_IMPL_ADD (array, i, memchr, 1, __memchr_sse2))
47
48 /* Support sysdeps/x86_64/multiarch/memcmp.c. */
49 IFUNC_IMPL (i, name, memcmp,
50 IFUNC_IMPL_ADD (array, i, memcmp,
51 (HAS_ARCH_FEATURE (AVX2_Usable)
52 && HAS_CPU_FEATURE (MOVBE)),
53 __memcmp_avx2_movbe)
54 IFUNC_IMPL_ADD (array, i, memcmp, HAS_CPU_FEATURE (SSE4_1),
55 __memcmp_sse4_1)
56 IFUNC_IMPL_ADD (array, i, memcmp, HAS_CPU_FEATURE (SSSE3),
57 __memcmp_ssse3)
58 IFUNC_IMPL_ADD (array, i, memcmp, 1, __memcmp_sse2))
59
60#ifdef SHARED
61 /* Support sysdeps/x86_64/multiarch/memmove_chk.c. */
62 IFUNC_IMPL (i, name, __memmove_chk,
63 IFUNC_IMPL_ADD (array, i, __memmove_chk,
64 HAS_ARCH_FEATURE (AVX512F_Usable),
65 __memmove_chk_avx512_no_vzeroupper)
66 IFUNC_IMPL_ADD (array, i, __memmove_chk,
67 HAS_ARCH_FEATURE (AVX512F_Usable),
68 __memmove_chk_avx512_unaligned)
69 IFUNC_IMPL_ADD (array, i, __memmove_chk,
70 HAS_ARCH_FEATURE (AVX512F_Usable),
71 __memmove_chk_avx512_unaligned_erms)
72 IFUNC_IMPL_ADD (array, i, __memmove_chk,
73 HAS_ARCH_FEATURE (AVX_Usable),
74 __memmove_chk_avx_unaligned)
75 IFUNC_IMPL_ADD (array, i, __memmove_chk,
76 HAS_ARCH_FEATURE (AVX_Usable),
77 __memmove_chk_avx_unaligned_erms)
78 IFUNC_IMPL_ADD (array, i, __memmove_chk,
79 HAS_CPU_FEATURE (SSSE3),
80 __memmove_chk_ssse3_back)
81 IFUNC_IMPL_ADD (array, i, __memmove_chk,
82 HAS_CPU_FEATURE (SSSE3),
83 __memmove_chk_ssse3)
84 IFUNC_IMPL_ADD (array, i, __memmove_chk, 1,
85 __memmove_chk_sse2_unaligned)
86 IFUNC_IMPL_ADD (array, i, __memmove_chk, 1,
87 __memmove_chk_sse2_unaligned_erms)
88 IFUNC_IMPL_ADD (array, i, __memmove_chk, 1,
89 __memmove_chk_erms))
90#endif
91
92 /* Support sysdeps/x86_64/multiarch/memmove.c. */
93 IFUNC_IMPL (i, name, memmove,
94 IFUNC_IMPL_ADD (array, i, memmove,
95 HAS_ARCH_FEATURE (AVX_Usable),
96 __memmove_avx_unaligned)
97 IFUNC_IMPL_ADD (array, i, memmove,
98 HAS_ARCH_FEATURE (AVX_Usable),
99 __memmove_avx_unaligned_erms)
100 IFUNC_IMPL_ADD (array, i, memmove,
101 HAS_ARCH_FEATURE (AVX512F_Usable),
102 __memmove_avx512_no_vzeroupper)
103 IFUNC_IMPL_ADD (array, i, memmove,
104 HAS_ARCH_FEATURE (AVX512F_Usable),
105 __memmove_avx512_unaligned)
106 IFUNC_IMPL_ADD (array, i, memmove,
107 HAS_ARCH_FEATURE (AVX512F_Usable),
108 __memmove_avx512_unaligned_erms)
109 IFUNC_IMPL_ADD (array, i, memmove, HAS_CPU_FEATURE (SSSE3),
110 __memmove_ssse3_back)
111 IFUNC_IMPL_ADD (array, i, memmove, HAS_CPU_FEATURE (SSSE3),
112 __memmove_ssse3)
113 IFUNC_IMPL_ADD (array, i, memmove, 1, __memmove_erms)
114 IFUNC_IMPL_ADD (array, i, memmove, 1,
115 __memmove_sse2_unaligned)
116 IFUNC_IMPL_ADD (array, i, memmove, 1,
117 __memmove_sse2_unaligned_erms))
118
119 /* Support sysdeps/x86_64/multiarch/memrchr.c. */
120 IFUNC_IMPL (i, name, memrchr,
121 IFUNC_IMPL_ADD (array, i, memrchr,
122 HAS_ARCH_FEATURE (AVX2_Usable),
123 __memrchr_avx2)
124 IFUNC_IMPL_ADD (array, i, memrchr, 1, __memrchr_sse2))
125
126#ifdef SHARED
127 /* Support sysdeps/x86_64/multiarch/memset_chk.c. */
128 IFUNC_IMPL (i, name, __memset_chk,
129 IFUNC_IMPL_ADD (array, i, __memset_chk, 1,
130 __memset_chk_erms)
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)
135 IFUNC_IMPL_ADD (array, i, __memset_chk,
136 HAS_ARCH_FEATURE (AVX2_Usable),
137 __memset_chk_avx2_unaligned)
138 IFUNC_IMPL_ADD (array, i, __memset_chk,
139 HAS_ARCH_FEATURE (AVX2_Usable),
140 __memset_chk_avx2_unaligned_erms)
141 IFUNC_IMPL_ADD (array, i, __memset_chk,
142 HAS_ARCH_FEATURE (AVX512F_Usable),
143 __memset_chk_avx512_unaligned_erms)
144 IFUNC_IMPL_ADD (array, i, __memset_chk,
145 HAS_ARCH_FEATURE (AVX512F_Usable),
146 __memset_chk_avx512_unaligned)
147 IFUNC_IMPL_ADD (array, i, __memset_chk,
148 HAS_ARCH_FEATURE (AVX512F_Usable),
149 __memset_chk_avx512_no_vzeroupper)
150 )
151#endif
152
153 /* Support sysdeps/x86_64/multiarch/memset.c. */
154 IFUNC_IMPL (i, name, memset,
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)
160 IFUNC_IMPL_ADD (array, i, memset,
161 HAS_ARCH_FEATURE (AVX2_Usable),
162 __memset_avx2_unaligned)
163 IFUNC_IMPL_ADD (array, i, memset,
164 HAS_ARCH_FEATURE (AVX2_Usable),
165 __memset_avx2_unaligned_erms)
166 IFUNC_IMPL_ADD (array, i, memset,
167 HAS_ARCH_FEATURE (AVX512F_Usable),
168 __memset_avx512_unaligned_erms)
169 IFUNC_IMPL_ADD (array, i, memset,
170 HAS_ARCH_FEATURE (AVX512F_Usable),
171 __memset_avx512_unaligned)
172 IFUNC_IMPL_ADD (array, i, memset,
173 HAS_ARCH_FEATURE (AVX512F_Usable),
174 __memset_avx512_no_vzeroupper)
175 )
176
177 /* Support sysdeps/x86_64/multiarch/rawmemchr.c. */
178 IFUNC_IMPL (i, name, rawmemchr,
179 IFUNC_IMPL_ADD (array, i, rawmemchr,
180 HAS_ARCH_FEATURE (AVX2_Usable),
181 __rawmemchr_avx2)
182 IFUNC_IMPL_ADD (array, i, rawmemchr, 1, __rawmemchr_sse2))
183
184 /* Support sysdeps/x86_64/multiarch/strlen.c. */
185 IFUNC_IMPL (i, name, strlen,
186 IFUNC_IMPL_ADD (array, i, strlen,
187 HAS_ARCH_FEATURE (AVX2_Usable),
188 __strlen_avx2)
189 IFUNC_IMPL_ADD (array, i, strlen, 1, __strlen_sse2))
190
191 /* Support sysdeps/x86_64/multiarch/strnlen.c. */
192 IFUNC_IMPL (i, name, strnlen,
193 IFUNC_IMPL_ADD (array, i, strnlen,
194 HAS_ARCH_FEATURE (AVX2_Usable),
195 __strnlen_avx2)
196 IFUNC_IMPL_ADD (array, i, strnlen, 1, __strnlen_sse2))
197
198 /* Support sysdeps/x86_64/multiarch/stpncpy.c. */
199 IFUNC_IMPL (i, name, stpncpy,
200 IFUNC_IMPL_ADD (array, i, stpncpy, HAS_CPU_FEATURE (SSSE3),
201 __stpncpy_ssse3)
202 IFUNC_IMPL_ADD (array, i, stpncpy, HAS_ARCH_FEATURE (AVX2_Usable),
203 __stpncpy_avx2)
204 IFUNC_IMPL_ADD (array, i, stpncpy, 1,
205 __stpncpy_sse2_unaligned)
206 IFUNC_IMPL_ADD (array, i, stpncpy, 1, __stpncpy_sse2))
207
208 /* Support sysdeps/x86_64/multiarch/stpcpy.c. */
209 IFUNC_IMPL (i, name, stpcpy,
210 IFUNC_IMPL_ADD (array, i, stpcpy, HAS_CPU_FEATURE (SSSE3),
211 __stpcpy_ssse3)
212 IFUNC_IMPL_ADD (array, i, stpcpy, HAS_ARCH_FEATURE (AVX2_Usable),
213 __stpcpy_avx2)
214 IFUNC_IMPL_ADD (array, i, stpcpy, 1, __stpcpy_sse2_unaligned)
215 IFUNC_IMPL_ADD (array, i, stpcpy, 1, __stpcpy_sse2))
216
217 /* Support sysdeps/x86_64/multiarch/strcasecmp_l.c. */
218 IFUNC_IMPL (i, name, strcasecmp,
219 IFUNC_IMPL_ADD (array, i, strcasecmp,
220 HAS_ARCH_FEATURE (AVX_Usable),
221 __strcasecmp_avx)
222 IFUNC_IMPL_ADD (array, i, strcasecmp,
223 HAS_CPU_FEATURE (SSE4_2),
224 __strcasecmp_sse42)
225 IFUNC_IMPL_ADD (array, i, strcasecmp,
226 HAS_CPU_FEATURE (SSSE3),
227 __strcasecmp_ssse3)
228 IFUNC_IMPL_ADD (array, i, strcasecmp, 1, __strcasecmp_sse2))
229
230 /* Support sysdeps/x86_64/multiarch/strcasecmp_l.c. */
231 IFUNC_IMPL (i, name, strcasecmp_l,
232 IFUNC_IMPL_ADD (array, i, strcasecmp_l,
233 HAS_ARCH_FEATURE (AVX_Usable),
234 __strcasecmp_l_avx)
235 IFUNC_IMPL_ADD (array, i, strcasecmp_l,
236 HAS_CPU_FEATURE (SSE4_2),
237 __strcasecmp_l_sse42)
238 IFUNC_IMPL_ADD (array, i, strcasecmp_l,
239 HAS_CPU_FEATURE (SSSE3),
240 __strcasecmp_l_ssse3)
241 IFUNC_IMPL_ADD (array, i, strcasecmp_l, 1,
242 __strcasecmp_l_sse2))
243
244 /* Support sysdeps/x86_64/multiarch/strcat.c. */
245 IFUNC_IMPL (i, name, strcat,
246 IFUNC_IMPL_ADD (array, i, strcat, HAS_ARCH_FEATURE (AVX2_Usable),
247 __strcat_avx2)
248 IFUNC_IMPL_ADD (array, i, strcat, HAS_CPU_FEATURE (SSSE3),
249 __strcat_ssse3)
250 IFUNC_IMPL_ADD (array, i, strcat, 1, __strcat_sse2_unaligned)
251 IFUNC_IMPL_ADD (array, i, strcat, 1, __strcat_sse2))
252
253 /* Support sysdeps/x86_64/multiarch/strchr.c. */
254 IFUNC_IMPL (i, name, strchr,
255 IFUNC_IMPL_ADD (array, i, strchr,
256 HAS_ARCH_FEATURE (AVX2_Usable),
257 __strchr_avx2)
258 IFUNC_IMPL_ADD (array, i, strchr, 1, __strchr_sse2_no_bsf)
259 IFUNC_IMPL_ADD (array, i, strchr, 1, __strchr_sse2))
260
261 /* Support sysdeps/x86_64/multiarch/strchrnul.c. */
262 IFUNC_IMPL (i, name, strchrnul,
263 IFUNC_IMPL_ADD (array, i, strchrnul,
264 HAS_ARCH_FEATURE (AVX2_Usable),
265 __strchrnul_avx2)
266 IFUNC_IMPL_ADD (array, i, strchrnul, 1, __strchrnul_sse2))
267
268 /* Support sysdeps/x86_64/multiarch/strrchr.c. */
269 IFUNC_IMPL (i, name, strrchr,
270 IFUNC_IMPL_ADD (array, i, strrchr,
271 HAS_ARCH_FEATURE (AVX2_Usable),
272 __strrchr_avx2)
273 IFUNC_IMPL_ADD (array, i, strrchr, 1, __strrchr_sse2))
274
275 /* Support sysdeps/x86_64/multiarch/strcmp.c. */
276 IFUNC_IMPL (i, name, strcmp,
277 IFUNC_IMPL_ADD (array, i, strcmp,
278 HAS_ARCH_FEATURE (AVX2_Usable),
279 __strcmp_avx2)
280 IFUNC_IMPL_ADD (array, i, strcmp, HAS_CPU_FEATURE (SSE4_2),
281 __strcmp_sse42)
282 IFUNC_IMPL_ADD (array, i, strcmp, HAS_CPU_FEATURE (SSSE3),
283 __strcmp_ssse3)
284 IFUNC_IMPL_ADD (array, i, strcmp, 1, __strcmp_sse2_unaligned)
285 IFUNC_IMPL_ADD (array, i, strcmp, 1, __strcmp_sse2))
286
287 /* Support sysdeps/x86_64/multiarch/strcpy.c. */
288 IFUNC_IMPL (i, name, strcpy,
289 IFUNC_IMPL_ADD (array, i, strcpy, HAS_ARCH_FEATURE (AVX2_Usable),
290 __strcpy_avx2)
291 IFUNC_IMPL_ADD (array, i, strcpy, HAS_CPU_FEATURE (SSSE3),
292 __strcpy_ssse3)
293 IFUNC_IMPL_ADD (array, i, strcpy, 1, __strcpy_sse2_unaligned)
294 IFUNC_IMPL_ADD (array, i, strcpy, 1, __strcpy_sse2))
295
296 /* Support sysdeps/x86_64/multiarch/strcspn.c. */
297 IFUNC_IMPL (i, name, strcspn,
298 IFUNC_IMPL_ADD (array, i, strcspn, HAS_CPU_FEATURE (SSE4_2),
299 __strcspn_sse42)
300 IFUNC_IMPL_ADD (array, i, strcspn, 1, __strcspn_sse2))
301
302 /* Support sysdeps/x86_64/multiarch/strncase_l.c. */
303 IFUNC_IMPL (i, name, strncasecmp,
304 IFUNC_IMPL_ADD (array, i, strncasecmp,
305 HAS_ARCH_FEATURE (AVX_Usable),
306 __strncasecmp_avx)
307 IFUNC_IMPL_ADD (array, i, strncasecmp,
308 HAS_CPU_FEATURE (SSE4_2),
309 __strncasecmp_sse42)
310 IFUNC_IMPL_ADD (array, i, strncasecmp,
311 HAS_CPU_FEATURE (SSSE3),
312 __strncasecmp_ssse3)
313 IFUNC_IMPL_ADD (array, i, strncasecmp, 1,
314 __strncasecmp_sse2))
315
316 /* Support sysdeps/x86_64/multiarch/strncase_l.c. */
317 IFUNC_IMPL (i, name, strncasecmp_l,
318 IFUNC_IMPL_ADD (array, i, strncasecmp_l,
319 HAS_ARCH_FEATURE (AVX_Usable),
320 __strncasecmp_l_avx)
321 IFUNC_IMPL_ADD (array, i, strncasecmp_l,
322 HAS_CPU_FEATURE (SSE4_2),
323 __strncasecmp_l_sse42)
324 IFUNC_IMPL_ADD (array, i, strncasecmp_l,
325 HAS_CPU_FEATURE (SSSE3),
326 __strncasecmp_l_ssse3)
327 IFUNC_IMPL_ADD (array, i, strncasecmp_l, 1,
328 __strncasecmp_l_sse2))
329
330 /* Support sysdeps/x86_64/multiarch/strncat.c. */
331 IFUNC_IMPL (i, name, strncat,
332 IFUNC_IMPL_ADD (array, i, strncat, HAS_ARCH_FEATURE (AVX2_Usable),
333 __strncat_avx2)
334 IFUNC_IMPL_ADD (array, i, strncat, HAS_CPU_FEATURE (SSSE3),
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
340 /* Support sysdeps/x86_64/multiarch/strncpy.c. */
341 IFUNC_IMPL (i, name, strncpy,
342 IFUNC_IMPL_ADD (array, i, strncpy, HAS_ARCH_FEATURE (AVX2_Usable),
343 __strncpy_avx2)
344 IFUNC_IMPL_ADD (array, i, strncpy, HAS_CPU_FEATURE (SSSE3),
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
350 /* Support sysdeps/x86_64/multiarch/strpbrk.c. */
351 IFUNC_IMPL (i, name, strpbrk,
352 IFUNC_IMPL_ADD (array, i, strpbrk, HAS_CPU_FEATURE (SSE4_2),
353 __strpbrk_sse42)
354 IFUNC_IMPL_ADD (array, i, strpbrk, 1, __strpbrk_sse2))
355
356
357 /* Support sysdeps/x86_64/multiarch/strspn.c. */
358 IFUNC_IMPL (i, name, strspn,
359 IFUNC_IMPL_ADD (array, i, strspn, HAS_CPU_FEATURE (SSE4_2),
360 __strspn_sse42)
361 IFUNC_IMPL_ADD (array, i, strspn, 1, __strspn_sse2))
362
363 /* Support sysdeps/x86_64/multiarch/strstr.c. */
364 IFUNC_IMPL (i, name, strstr,
365 IFUNC_IMPL_ADD (array, i, strstr, 1, __strstr_sse2_unaligned)
366 IFUNC_IMPL_ADD (array, i, strstr, 1, __strstr_sse2))
367
368 /* Support sysdeps/x86_64/multiarch/wcschr.c. */
369 IFUNC_IMPL (i, name, wcschr,
370 IFUNC_IMPL_ADD (array, i, wcschr,
371 HAS_ARCH_FEATURE (AVX2_Usable),
372 __wcschr_avx2)
373 IFUNC_IMPL_ADD (array, i, wcschr, 1, __wcschr_sse2))
374
375 /* Support sysdeps/x86_64/multiarch/wcsrchr.c. */
376 IFUNC_IMPL (i, name, wcsrchr,
377 IFUNC_IMPL_ADD (array, i, wcsrchr,
378 HAS_ARCH_FEATURE (AVX2_Usable),
379 __wcsrchr_avx2)
380 IFUNC_IMPL_ADD (array, i, wcsrchr, 1, __wcsrchr_sse2))
381
382 /* Support sysdeps/x86_64/multiarch/wcscmp.c. */
383 IFUNC_IMPL (i, name, wcscmp,
384 IFUNC_IMPL_ADD (array, i, wcscmp,
385 HAS_ARCH_FEATURE (AVX2_Usable),
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,
392 HAS_ARCH_FEATURE (AVX2_Usable),
393 __wcsncmp_avx2)
394 IFUNC_IMPL_ADD (array, i, wcsncmp, 1, __wcsncmp_sse2))
395
396 /* Support sysdeps/x86_64/multiarch/wcscpy.c. */
397 IFUNC_IMPL (i, name, wcscpy,
398 IFUNC_IMPL_ADD (array, i, wcscpy, HAS_CPU_FEATURE (SSSE3),
399 __wcscpy_ssse3)
400 IFUNC_IMPL_ADD (array, i, wcscpy, 1, __wcscpy_sse2))
401
402 /* Support sysdeps/x86_64/multiarch/wcslen.c. */
403 IFUNC_IMPL (i, name, wcslen,
404 IFUNC_IMPL_ADD (array, i, wcslen,
405 HAS_ARCH_FEATURE (AVX2_Usable),
406 __wcslen_avx2)
407 IFUNC_IMPL_ADD (array, i, wcslen, 1, __wcslen_sse2))
408
409 /* Support sysdeps/x86_64/multiarch/wcsnlen.c. */
410 IFUNC_IMPL (i, name, wcsnlen,
411 IFUNC_IMPL_ADD (array, i, wcsnlen,
412 HAS_ARCH_FEATURE (AVX2_Usable),
413 __wcsnlen_avx2)
414 IFUNC_IMPL_ADD (array, i, wcsnlen,
415 HAS_CPU_FEATURE (SSE4_1),
416 __wcsnlen_sse4_1)
417 IFUNC_IMPL_ADD (array, i, wcsnlen, 1, __wcsnlen_sse2))
418
419 /* Support sysdeps/x86_64/multiarch/wmemchr.c. */
420 IFUNC_IMPL (i, name, wmemchr,
421 IFUNC_IMPL_ADD (array, i, wmemchr,
422 HAS_ARCH_FEATURE (AVX2_Usable),
423 __wmemchr_avx2)
424 IFUNC_IMPL_ADD (array, i, wmemchr, 1, __wmemchr_sse2))
425
426 /* Support sysdeps/x86_64/multiarch/wmemcmp.c. */
427 IFUNC_IMPL (i, name, wmemcmp,
428 IFUNC_IMPL_ADD (array, i, wmemcmp,
429 (HAS_ARCH_FEATURE (AVX2_Usable)
430 && HAS_CPU_FEATURE (MOVBE)),
431 __wmemcmp_avx2_movbe)
432 IFUNC_IMPL_ADD (array, i, wmemcmp, HAS_CPU_FEATURE (SSE4_1),
433 __wmemcmp_sse4_1)
434 IFUNC_IMPL_ADD (array, i, wmemcmp, HAS_CPU_FEATURE (SSSE3),
435 __wmemcmp_ssse3)
436 IFUNC_IMPL_ADD (array, i, wmemcmp, 1, __wmemcmp_sse2))
437
438 /* Support sysdeps/x86_64/multiarch/wmemset.c. */
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,
443 HAS_ARCH_FEATURE (AVX2_Usable),
444 __wmemset_avx2_unaligned)
445 IFUNC_IMPL_ADD (array, i, wmemset,
446 HAS_ARCH_FEATURE (AVX512F_Usable),
447 __wmemset_avx512_unaligned))
448
449#ifdef SHARED
450 /* Support sysdeps/x86_64/multiarch/memcpy_chk.c. */
451 IFUNC_IMPL (i, name, __memcpy_chk,
452 IFUNC_IMPL_ADD (array, i, __memcpy_chk,
453 HAS_ARCH_FEATURE (AVX512F_Usable),
454 __memcpy_chk_avx512_no_vzeroupper)
455 IFUNC_IMPL_ADD (array, i, __memcpy_chk,
456 HAS_ARCH_FEATURE (AVX512F_Usable),
457 __memcpy_chk_avx512_unaligned)
458 IFUNC_IMPL_ADD (array, i, __memcpy_chk,
459 HAS_ARCH_FEATURE (AVX512F_Usable),
460 __memcpy_chk_avx512_unaligned_erms)
461 IFUNC_IMPL_ADD (array, i, __memcpy_chk,
462 HAS_ARCH_FEATURE (AVX_Usable),
463 __memcpy_chk_avx_unaligned)
464 IFUNC_IMPL_ADD (array, i, __memcpy_chk,
465 HAS_ARCH_FEATURE (AVX_Usable),
466 __memcpy_chk_avx_unaligned_erms)
467 IFUNC_IMPL_ADD (array, i, __memcpy_chk,
468 HAS_CPU_FEATURE (SSSE3),
469 __memcpy_chk_ssse3_back)
470 IFUNC_IMPL_ADD (array, i, __memcpy_chk,
471 HAS_CPU_FEATURE (SSSE3),
472 __memcpy_chk_ssse3)
473 IFUNC_IMPL_ADD (array, i, __memcpy_chk, 1,
474 __memcpy_chk_sse2_unaligned)
475 IFUNC_IMPL_ADD (array, i, __memcpy_chk, 1,
476 __memcpy_chk_sse2_unaligned_erms)
477 IFUNC_IMPL_ADD (array, i, __memcpy_chk, 1,
478 __memcpy_chk_erms))
479#endif
480
481 /* Support sysdeps/x86_64/multiarch/memcpy.c. */
482 IFUNC_IMPL (i, name, memcpy,
483 IFUNC_IMPL_ADD (array, i, memcpy,
484 HAS_ARCH_FEATURE (AVX_Usable),
485 __memcpy_avx_unaligned)
486 IFUNC_IMPL_ADD (array, i, memcpy,
487 HAS_ARCH_FEATURE (AVX_Usable),
488 __memcpy_avx_unaligned_erms)
489 IFUNC_IMPL_ADD (array, i, memcpy, HAS_CPU_FEATURE (SSSE3),
490 __memcpy_ssse3_back)
491 IFUNC_IMPL_ADD (array, i, memcpy, HAS_CPU_FEATURE (SSSE3),
492 __memcpy_ssse3)
493 IFUNC_IMPL_ADD (array, i, memcpy,
494 HAS_ARCH_FEATURE (AVX512F_Usable),
495 __memcpy_avx512_no_vzeroupper)
496 IFUNC_IMPL_ADD (array, i, memcpy,
497 HAS_ARCH_FEATURE (AVX512F_Usable),
498 __memcpy_avx512_unaligned)
499 IFUNC_IMPL_ADD (array, i, memcpy,
500 HAS_ARCH_FEATURE (AVX512F_Usable),
501 __memcpy_avx512_unaligned_erms)
502 IFUNC_IMPL_ADD (array, i, memcpy, 1, __memcpy_sse2_unaligned)
503 IFUNC_IMPL_ADD (array, i, memcpy, 1,
504 __memcpy_sse2_unaligned_erms)
505 IFUNC_IMPL_ADD (array, i, memcpy, 1, __memcpy_erms))
506
507#ifdef SHARED
508 /* Support sysdeps/x86_64/multiarch/mempcpy_chk.c. */
509 IFUNC_IMPL (i, name, __mempcpy_chk,
510 IFUNC_IMPL_ADD (array, i, __mempcpy_chk,
511 HAS_ARCH_FEATURE (AVX512F_Usable),
512 __mempcpy_chk_avx512_no_vzeroupper)
513 IFUNC_IMPL_ADD (array, i, __mempcpy_chk,
514 HAS_ARCH_FEATURE (AVX512F_Usable),
515 __mempcpy_chk_avx512_unaligned)
516 IFUNC_IMPL_ADD (array, i, __mempcpy_chk,
517 HAS_ARCH_FEATURE (AVX512F_Usable),
518 __mempcpy_chk_avx512_unaligned_erms)
519 IFUNC_IMPL_ADD (array, i, __mempcpy_chk,
520 HAS_ARCH_FEATURE (AVX_Usable),
521 __mempcpy_chk_avx_unaligned)
522 IFUNC_IMPL_ADD (array, i, __mempcpy_chk,
523 HAS_ARCH_FEATURE (AVX_Usable),
524 __mempcpy_chk_avx_unaligned_erms)
525 IFUNC_IMPL_ADD (array, i, __mempcpy_chk,
526 HAS_CPU_FEATURE (SSSE3),
527 __mempcpy_chk_ssse3_back)
528 IFUNC_IMPL_ADD (array, i, __mempcpy_chk,
529 HAS_CPU_FEATURE (SSSE3),
530 __mempcpy_chk_ssse3)
531 IFUNC_IMPL_ADD (array, i, __mempcpy_chk, 1,
532 __mempcpy_chk_sse2_unaligned)
533 IFUNC_IMPL_ADD (array, i, __mempcpy_chk, 1,
534 __mempcpy_chk_sse2_unaligned_erms)
535 IFUNC_IMPL_ADD (array, i, __mempcpy_chk, 1,
536 __mempcpy_chk_erms))
537#endif
538
539 /* Support sysdeps/x86_64/multiarch/mempcpy.c. */
540 IFUNC_IMPL (i, name, mempcpy,
541 IFUNC_IMPL_ADD (array, i, mempcpy,
542 HAS_ARCH_FEATURE (AVX512F_Usable),
543 __mempcpy_avx512_no_vzeroupper)
544 IFUNC_IMPL_ADD (array, i, mempcpy,
545 HAS_ARCH_FEATURE (AVX512F_Usable),
546 __mempcpy_avx512_unaligned)
547 IFUNC_IMPL_ADD (array, i, mempcpy,
548 HAS_ARCH_FEATURE (AVX512F_Usable),
549 __mempcpy_avx512_unaligned_erms)
550 IFUNC_IMPL_ADD (array, i, mempcpy,
551 HAS_ARCH_FEATURE (AVX_Usable),
552 __mempcpy_avx_unaligned)
553 IFUNC_IMPL_ADD (array, i, mempcpy,
554 HAS_ARCH_FEATURE (AVX_Usable),
555 __mempcpy_avx_unaligned_erms)
556 IFUNC_IMPL_ADD (array, i, mempcpy, HAS_CPU_FEATURE (SSSE3),
557 __mempcpy_ssse3_back)
558 IFUNC_IMPL_ADD (array, i, mempcpy, HAS_CPU_FEATURE (SSSE3),
559 __mempcpy_ssse3)
560 IFUNC_IMPL_ADD (array, i, mempcpy, 1,
561 __mempcpy_sse2_unaligned)
562 IFUNC_IMPL_ADD (array, i, mempcpy, 1,
563 __mempcpy_sse2_unaligned_erms)
564 IFUNC_IMPL_ADD (array, i, mempcpy, 1, __mempcpy_erms))
565
566 /* Support sysdeps/x86_64/multiarch/strncmp.c. */
567 IFUNC_IMPL (i, name, strncmp,
568 IFUNC_IMPL_ADD (array, i, strncmp,
569 HAS_ARCH_FEATURE (AVX2_Usable),
570 __strncmp_avx2)
571 IFUNC_IMPL_ADD (array, i, strncmp, HAS_CPU_FEATURE (SSE4_2),
572 __strncmp_sse42)
573 IFUNC_IMPL_ADD (array, i, strncmp, HAS_CPU_FEATURE (SSSE3),
574 __strncmp_ssse3)
575 IFUNC_IMPL_ADD (array, i, strncmp, 1, __strncmp_sse2))
576
577#ifdef SHARED
578 /* Support sysdeps/x86_64/multiarch/wmemset_chk.c. */
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,
583 HAS_ARCH_FEATURE (AVX2_Usable),
584 __wmemset_chk_avx2_unaligned)
585 IFUNC_IMPL_ADD (array, i, __wmemset_chk,
586 HAS_ARCH_FEATURE (AVX512F_Usable),
587 __wmemset_chk_avx512_unaligned))
588#endif
589
590 return i;
591}
592