1/* Enumerate available IFUNC implementations of a function. x86-64 version.
2 Copyright (C) 2012-2018 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 <http://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, 1,
203 __stpncpy_sse2_unaligned)
204 IFUNC_IMPL_ADD (array, i, stpncpy, 1, __stpncpy_sse2))
205
206 /* Support sysdeps/x86_64/multiarch/stpcpy.c. */
207 IFUNC_IMPL (i, name, stpcpy,
208 IFUNC_IMPL_ADD (array, i, stpcpy, HAS_CPU_FEATURE (SSSE3),
209 __stpcpy_ssse3)
210 IFUNC_IMPL_ADD (array, i, stpcpy, 1, __stpcpy_sse2_unaligned)
211 IFUNC_IMPL_ADD (array, i, stpcpy, 1, __stpcpy_sse2))
212
213 /* Support sysdeps/x86_64/multiarch/strcasecmp_l.c. */
214 IFUNC_IMPL (i, name, strcasecmp,
215 IFUNC_IMPL_ADD (array, i, strcasecmp,
216 HAS_ARCH_FEATURE (AVX_Usable),
217 __strcasecmp_avx)
218 IFUNC_IMPL_ADD (array, i, strcasecmp,
219 HAS_CPU_FEATURE (SSE4_2),
220 __strcasecmp_sse42)
221 IFUNC_IMPL_ADD (array, i, strcasecmp,
222 HAS_CPU_FEATURE (SSSE3),
223 __strcasecmp_ssse3)
224 IFUNC_IMPL_ADD (array, i, strcasecmp, 1, __strcasecmp_sse2))
225
226 /* Support sysdeps/x86_64/multiarch/strcasecmp_l.c. */
227 IFUNC_IMPL (i, name, strcasecmp_l,
228 IFUNC_IMPL_ADD (array, i, strcasecmp_l,
229 HAS_ARCH_FEATURE (AVX_Usable),
230 __strcasecmp_l_avx)
231 IFUNC_IMPL_ADD (array, i, strcasecmp_l,
232 HAS_CPU_FEATURE (SSE4_2),
233 __strcasecmp_l_sse42)
234 IFUNC_IMPL_ADD (array, i, strcasecmp_l,
235 HAS_CPU_FEATURE (SSSE3),
236 __strcasecmp_l_ssse3)
237 IFUNC_IMPL_ADD (array, i, strcasecmp_l, 1,
238 __strcasecmp_l_sse2))
239
240 /* Support sysdeps/x86_64/multiarch/strcat.c. */
241 IFUNC_IMPL (i, name, strcat,
242 IFUNC_IMPL_ADD (array, i, strcat, HAS_CPU_FEATURE (SSSE3),
243 __strcat_ssse3)
244 IFUNC_IMPL_ADD (array, i, strcat, 1, __strcat_sse2_unaligned)
245 IFUNC_IMPL_ADD (array, i, strcat, 1, __strcat_sse2))
246
247 /* Support sysdeps/x86_64/multiarch/strchr.c. */
248 IFUNC_IMPL (i, name, strchr,
249 IFUNC_IMPL_ADD (array, i, strchr,
250 HAS_ARCH_FEATURE (AVX2_Usable),
251 __strchr_avx2)
252 IFUNC_IMPL_ADD (array, i, strchr, 1, __strchr_sse2_no_bsf)
253 IFUNC_IMPL_ADD (array, i, strchr, 1, __strchr_sse2))
254
255 /* Support sysdeps/x86_64/multiarch/strchrnul.c. */
256 IFUNC_IMPL (i, name, strchrnul,
257 IFUNC_IMPL_ADD (array, i, strchrnul,
258 HAS_ARCH_FEATURE (AVX2_Usable),
259 __strchrnul_avx2)
260 IFUNC_IMPL_ADD (array, i, strchrnul, 1, __strchrnul_sse2))
261
262 /* Support sysdeps/x86_64/multiarch/strrchr.c. */
263 IFUNC_IMPL (i, name, strrchr,
264 IFUNC_IMPL_ADD (array, i, strrchr,
265 HAS_ARCH_FEATURE (AVX2_Usable),
266 __strrchr_avx2)
267 IFUNC_IMPL_ADD (array, i, strrchr, 1, __strrchr_sse2))
268
269 /* Support sysdeps/x86_64/multiarch/strcmp.c. */
270 IFUNC_IMPL (i, name, strcmp,
271 IFUNC_IMPL_ADD (array, i, strcmp,
272 HAS_ARCH_FEATURE (AVX2_Usable),
273 __strcmp_avx2)
274 IFUNC_IMPL_ADD (array, i, strcmp, HAS_CPU_FEATURE (SSE4_2),
275 __strcmp_sse42)
276 IFUNC_IMPL_ADD (array, i, strcmp, HAS_CPU_FEATURE (SSSE3),
277 __strcmp_ssse3)
278 IFUNC_IMPL_ADD (array, i, strcmp, 1, __strcmp_sse2_unaligned)
279 IFUNC_IMPL_ADD (array, i, strcmp, 1, __strcmp_sse2))
280
281 /* Support sysdeps/x86_64/multiarch/strcpy.c. */
282 IFUNC_IMPL (i, name, strcpy,
283 IFUNC_IMPL_ADD (array, i, strcpy, HAS_CPU_FEATURE (SSSE3),
284 __strcpy_ssse3)
285 IFUNC_IMPL_ADD (array, i, strcpy, 1, __strcpy_sse2_unaligned)
286 IFUNC_IMPL_ADD (array, i, strcpy, 1, __strcpy_sse2))
287
288 /* Support sysdeps/x86_64/multiarch/strcspn.c. */
289 IFUNC_IMPL (i, name, strcspn,
290 IFUNC_IMPL_ADD (array, i, strcspn, HAS_CPU_FEATURE (SSE4_2),
291 __strcspn_sse42)
292 IFUNC_IMPL_ADD (array, i, strcspn, 1, __strcspn_sse2))
293
294 /* Support sysdeps/x86_64/multiarch/strncase_l.c. */
295 IFUNC_IMPL (i, name, strncasecmp,
296 IFUNC_IMPL_ADD (array, i, strncasecmp,
297 HAS_ARCH_FEATURE (AVX_Usable),
298 __strncasecmp_avx)
299 IFUNC_IMPL_ADD (array, i, strncasecmp,
300 HAS_CPU_FEATURE (SSE4_2),
301 __strncasecmp_sse42)
302 IFUNC_IMPL_ADD (array, i, strncasecmp,
303 HAS_CPU_FEATURE (SSSE3),
304 __strncasecmp_ssse3)
305 IFUNC_IMPL_ADD (array, i, strncasecmp, 1,
306 __strncasecmp_sse2))
307
308 /* Support sysdeps/x86_64/multiarch/strncase_l.c. */
309 IFUNC_IMPL (i, name, strncasecmp_l,
310 IFUNC_IMPL_ADD (array, i, strncasecmp_l,
311 HAS_ARCH_FEATURE (AVX_Usable),
312 __strncasecmp_l_avx)
313 IFUNC_IMPL_ADD (array, i, strncasecmp_l,
314 HAS_CPU_FEATURE (SSE4_2),
315 __strncasecmp_l_sse42)
316 IFUNC_IMPL_ADD (array, i, strncasecmp_l,
317 HAS_CPU_FEATURE (SSSE3),
318 __strncasecmp_l_ssse3)
319 IFUNC_IMPL_ADD (array, i, strncasecmp_l, 1,
320 __strncasecmp_l_sse2))
321
322 /* Support sysdeps/x86_64/multiarch/strncat.c. */
323 IFUNC_IMPL (i, name, strncat,
324 IFUNC_IMPL_ADD (array, i, strncat, HAS_CPU_FEATURE (SSSE3),
325 __strncat_ssse3)
326 IFUNC_IMPL_ADD (array, i, strncat, 1,
327 __strncat_sse2_unaligned)
328 IFUNC_IMPL_ADD (array, i, strncat, 1, __strncat_sse2))
329
330 /* Support sysdeps/x86_64/multiarch/strncpy.c. */
331 IFUNC_IMPL (i, name, strncpy,
332 IFUNC_IMPL_ADD (array, i, strncpy, HAS_CPU_FEATURE (SSSE3),
333 __strncpy_ssse3)
334 IFUNC_IMPL_ADD (array, i, strncpy, 1,
335 __strncpy_sse2_unaligned)
336 IFUNC_IMPL_ADD (array, i, strncpy, 1, __strncpy_sse2))
337
338 /* Support sysdeps/x86_64/multiarch/strpbrk.c. */
339 IFUNC_IMPL (i, name, strpbrk,
340 IFUNC_IMPL_ADD (array, i, strpbrk, HAS_CPU_FEATURE (SSE4_2),
341 __strpbrk_sse42)
342 IFUNC_IMPL_ADD (array, i, strpbrk, 1, __strpbrk_sse2))
343
344
345 /* Support sysdeps/x86_64/multiarch/strspn.c. */
346 IFUNC_IMPL (i, name, strspn,
347 IFUNC_IMPL_ADD (array, i, strspn, HAS_CPU_FEATURE (SSE4_2),
348 __strspn_sse42)
349 IFUNC_IMPL_ADD (array, i, strspn, 1, __strspn_sse2))
350
351 /* Support sysdeps/x86_64/multiarch/strstr.c. */
352 IFUNC_IMPL (i, name, strstr,
353 IFUNC_IMPL_ADD (array, i, strstr, 1, __strstr_sse2_unaligned)
354 IFUNC_IMPL_ADD (array, i, strstr, 1, __strstr_sse2))
355
356 /* Support sysdeps/x86_64/multiarch/wcschr.c. */
357 IFUNC_IMPL (i, name, wcschr,
358 IFUNC_IMPL_ADD (array, i, wcschr,
359 HAS_ARCH_FEATURE (AVX2_Usable),
360 __wcschr_avx2)
361 IFUNC_IMPL_ADD (array, i, wcschr, 1, __wcschr_sse2))
362
363 /* Support sysdeps/x86_64/multiarch/wcsrchr.c. */
364 IFUNC_IMPL (i, name, wcsrchr,
365 IFUNC_IMPL_ADD (array, i, wcsrchr,
366 HAS_ARCH_FEATURE (AVX2_Usable),
367 __wcsrchr_avx2)
368 IFUNC_IMPL_ADD (array, i, wcsrchr, 1, __wcsrchr_sse2))
369
370 /* Support sysdeps/x86_64/multiarch/wcscmp.c. */
371 IFUNC_IMPL (i, name, wcscmp,
372 IFUNC_IMPL_ADD (array, i, wcscmp,
373 HAS_ARCH_FEATURE (AVX2_Usable),
374 __wcscmp_avx2)
375 IFUNC_IMPL_ADD (array, i, wcscmp, 1, __wcscmp_sse2))
376
377 /* Support sysdeps/x86_64/multiarch/wcsncmp.c. */
378 IFUNC_IMPL (i, name, wcsncmp,
379 IFUNC_IMPL_ADD (array, i, wcsncmp,
380 HAS_ARCH_FEATURE (AVX2_Usable),
381 __wcsncmp_avx2)
382 IFUNC_IMPL_ADD (array, i, wcsncmp, 1, __wcsncmp_sse2))
383
384 /* Support sysdeps/x86_64/multiarch/wcscpy.c. */
385 IFUNC_IMPL (i, name, wcscpy,
386 IFUNC_IMPL_ADD (array, i, wcscpy, HAS_CPU_FEATURE (SSSE3),
387 __wcscpy_ssse3)
388 IFUNC_IMPL_ADD (array, i, wcscpy, 1, __wcscpy_sse2))
389
390 /* Support sysdeps/x86_64/multiarch/wcslen.c. */
391 IFUNC_IMPL (i, name, wcslen,
392 IFUNC_IMPL_ADD (array, i, wcslen,
393 HAS_ARCH_FEATURE (AVX2_Usable),
394 __wcslen_avx2)
395 IFUNC_IMPL_ADD (array, i, wcslen, 1, __wcslen_sse2))
396
397 /* Support sysdeps/x86_64/multiarch/wcsnlen.c. */
398 IFUNC_IMPL (i, name, wcsnlen,
399 IFUNC_IMPL_ADD (array, i, wcsnlen,
400 HAS_ARCH_FEATURE (AVX2_Usable),
401 __wcsnlen_avx2)
402 IFUNC_IMPL_ADD (array, i, wcsnlen,
403 HAS_CPU_FEATURE (SSE4_1),
404 __wcsnlen_sse4_1)
405 IFUNC_IMPL_ADD (array, i, wcsnlen, 1, __wcsnlen_sse2))
406
407 /* Support sysdeps/x86_64/multiarch/wmemchr.c. */
408 IFUNC_IMPL (i, name, wmemchr,
409 IFUNC_IMPL_ADD (array, i, wmemchr,
410 HAS_ARCH_FEATURE (AVX2_Usable),
411 __wmemchr_avx2)
412 IFUNC_IMPL_ADD (array, i, wmemchr, 1, __wmemchr_sse2))
413
414 /* Support sysdeps/x86_64/multiarch/wmemcmp.c. */
415 IFUNC_IMPL (i, name, wmemcmp,
416 IFUNC_IMPL_ADD (array, i, wmemcmp,
417 (HAS_ARCH_FEATURE (AVX2_Usable)
418 && HAS_CPU_FEATURE (MOVBE)),
419 __wmemcmp_avx2_movbe)
420 IFUNC_IMPL_ADD (array, i, wmemcmp, HAS_CPU_FEATURE (SSE4_1),
421 __wmemcmp_sse4_1)
422 IFUNC_IMPL_ADD (array, i, wmemcmp, HAS_CPU_FEATURE (SSSE3),
423 __wmemcmp_ssse3)
424 IFUNC_IMPL_ADD (array, i, wmemcmp, 1, __wmemcmp_sse2))
425
426 /* Support sysdeps/x86_64/multiarch/wmemset.c. */
427 IFUNC_IMPL (i, name, wmemset,
428 IFUNC_IMPL_ADD (array, i, wmemset, 1,
429 __wmemset_sse2_unaligned)
430 IFUNC_IMPL_ADD (array, i, wmemset,
431 HAS_ARCH_FEATURE (AVX2_Usable),
432 __wmemset_avx2_unaligned)
433 IFUNC_IMPL_ADD (array, i, wmemset,
434 HAS_ARCH_FEATURE (AVX512F_Usable),
435 __wmemset_avx512_unaligned))
436
437#ifdef SHARED
438 /* Support sysdeps/x86_64/multiarch/memcpy_chk.c. */
439 IFUNC_IMPL (i, name, __memcpy_chk,
440 IFUNC_IMPL_ADD (array, i, __memcpy_chk,
441 HAS_ARCH_FEATURE (AVX512F_Usable),
442 __memcpy_chk_avx512_no_vzeroupper)
443 IFUNC_IMPL_ADD (array, i, __memcpy_chk,
444 HAS_ARCH_FEATURE (AVX512F_Usable),
445 __memcpy_chk_avx512_unaligned)
446 IFUNC_IMPL_ADD (array, i, __memcpy_chk,
447 HAS_ARCH_FEATURE (AVX512F_Usable),
448 __memcpy_chk_avx512_unaligned_erms)
449 IFUNC_IMPL_ADD (array, i, __memcpy_chk,
450 HAS_ARCH_FEATURE (AVX_Usable),
451 __memcpy_chk_avx_unaligned)
452 IFUNC_IMPL_ADD (array, i, __memcpy_chk,
453 HAS_ARCH_FEATURE (AVX_Usable),
454 __memcpy_chk_avx_unaligned_erms)
455 IFUNC_IMPL_ADD (array, i, __memcpy_chk,
456 HAS_CPU_FEATURE (SSSE3),
457 __memcpy_chk_ssse3_back)
458 IFUNC_IMPL_ADD (array, i, __memcpy_chk,
459 HAS_CPU_FEATURE (SSSE3),
460 __memcpy_chk_ssse3)
461 IFUNC_IMPL_ADD (array, i, __memcpy_chk, 1,
462 __memcpy_chk_sse2_unaligned)
463 IFUNC_IMPL_ADD (array, i, __memcpy_chk, 1,
464 __memcpy_chk_sse2_unaligned_erms)
465 IFUNC_IMPL_ADD (array, i, __memcpy_chk, 1,
466 __memcpy_chk_erms))
467#endif
468
469 /* Support sysdeps/x86_64/multiarch/memcpy.c. */
470 IFUNC_IMPL (i, name, memcpy,
471 IFUNC_IMPL_ADD (array, i, memcpy,
472 HAS_ARCH_FEATURE (AVX_Usable),
473 __memcpy_avx_unaligned)
474 IFUNC_IMPL_ADD (array, i, memcpy,
475 HAS_ARCH_FEATURE (AVX_Usable),
476 __memcpy_avx_unaligned_erms)
477 IFUNC_IMPL_ADD (array, i, memcpy, HAS_CPU_FEATURE (SSSE3),
478 __memcpy_ssse3_back)
479 IFUNC_IMPL_ADD (array, i, memcpy, HAS_CPU_FEATURE (SSSE3),
480 __memcpy_ssse3)
481 IFUNC_IMPL_ADD (array, i, memcpy,
482 HAS_ARCH_FEATURE (AVX512F_Usable),
483 __memcpy_avx512_no_vzeroupper)
484 IFUNC_IMPL_ADD (array, i, memcpy,
485 HAS_ARCH_FEATURE (AVX512F_Usable),
486 __memcpy_avx512_unaligned)
487 IFUNC_IMPL_ADD (array, i, memcpy,
488 HAS_ARCH_FEATURE (AVX512F_Usable),
489 __memcpy_avx512_unaligned_erms)
490 IFUNC_IMPL_ADD (array, i, memcpy, 1, __memcpy_sse2_unaligned)
491 IFUNC_IMPL_ADD (array, i, memcpy, 1,
492 __memcpy_sse2_unaligned_erms)
493 IFUNC_IMPL_ADD (array, i, memcpy, 1, __memcpy_erms))
494
495#ifdef SHARED
496 /* Support sysdeps/x86_64/multiarch/mempcpy_chk.c. */
497 IFUNC_IMPL (i, name, __mempcpy_chk,
498 IFUNC_IMPL_ADD (array, i, __mempcpy_chk,
499 HAS_ARCH_FEATURE (AVX512F_Usable),
500 __mempcpy_chk_avx512_no_vzeroupper)
501 IFUNC_IMPL_ADD (array, i, __mempcpy_chk,
502 HAS_ARCH_FEATURE (AVX512F_Usable),
503 __mempcpy_chk_avx512_unaligned)
504 IFUNC_IMPL_ADD (array, i, __mempcpy_chk,
505 HAS_ARCH_FEATURE (AVX512F_Usable),
506 __mempcpy_chk_avx512_unaligned_erms)
507 IFUNC_IMPL_ADD (array, i, __mempcpy_chk,
508 HAS_ARCH_FEATURE (AVX_Usable),
509 __mempcpy_chk_avx_unaligned)
510 IFUNC_IMPL_ADD (array, i, __mempcpy_chk,
511 HAS_ARCH_FEATURE (AVX_Usable),
512 __mempcpy_chk_avx_unaligned_erms)
513 IFUNC_IMPL_ADD (array, i, __mempcpy_chk,
514 HAS_CPU_FEATURE (SSSE3),
515 __mempcpy_chk_ssse3_back)
516 IFUNC_IMPL_ADD (array, i, __mempcpy_chk,
517 HAS_CPU_FEATURE (SSSE3),
518 __mempcpy_chk_ssse3)
519 IFUNC_IMPL_ADD (array, i, __mempcpy_chk, 1,
520 __mempcpy_chk_sse2_unaligned)
521 IFUNC_IMPL_ADD (array, i, __mempcpy_chk, 1,
522 __mempcpy_chk_sse2_unaligned_erms)
523 IFUNC_IMPL_ADD (array, i, __mempcpy_chk, 1,
524 __mempcpy_chk_erms))
525#endif
526
527 /* Support sysdeps/x86_64/multiarch/mempcpy.c. */
528 IFUNC_IMPL (i, name, mempcpy,
529 IFUNC_IMPL_ADD (array, i, mempcpy,
530 HAS_ARCH_FEATURE (AVX512F_Usable),
531 __mempcpy_avx512_no_vzeroupper)
532 IFUNC_IMPL_ADD (array, i, mempcpy,
533 HAS_ARCH_FEATURE (AVX512F_Usable),
534 __mempcpy_avx512_unaligned)
535 IFUNC_IMPL_ADD (array, i, mempcpy,
536 HAS_ARCH_FEATURE (AVX512F_Usable),
537 __mempcpy_avx512_unaligned_erms)
538 IFUNC_IMPL_ADD (array, i, mempcpy,
539 HAS_ARCH_FEATURE (AVX_Usable),
540 __mempcpy_avx_unaligned)
541 IFUNC_IMPL_ADD (array, i, mempcpy,
542 HAS_ARCH_FEATURE (AVX_Usable),
543 __mempcpy_avx_unaligned_erms)
544 IFUNC_IMPL_ADD (array, i, mempcpy, HAS_CPU_FEATURE (SSSE3),
545 __mempcpy_ssse3_back)
546 IFUNC_IMPL_ADD (array, i, mempcpy, HAS_CPU_FEATURE (SSSE3),
547 __mempcpy_ssse3)
548 IFUNC_IMPL_ADD (array, i, mempcpy, 1,
549 __mempcpy_sse2_unaligned)
550 IFUNC_IMPL_ADD (array, i, mempcpy, 1,
551 __mempcpy_sse2_unaligned_erms)
552 IFUNC_IMPL_ADD (array, i, mempcpy, 1, __mempcpy_erms))
553
554 /* Support sysdeps/x86_64/multiarch/strncmp.c. */
555 IFUNC_IMPL (i, name, strncmp,
556 IFUNC_IMPL_ADD (array, i, strncmp,
557 HAS_ARCH_FEATURE (AVX2_Usable),
558 __strncmp_avx2)
559 IFUNC_IMPL_ADD (array, i, strncmp, HAS_CPU_FEATURE (SSE4_2),
560 __strncmp_sse42)
561 IFUNC_IMPL_ADD (array, i, strncmp, HAS_CPU_FEATURE (SSSE3),
562 __strncmp_ssse3)
563 IFUNC_IMPL_ADD (array, i, strncmp, 1, __strncmp_sse2))
564
565#ifdef SHARED
566 /* Support sysdeps/x86_64/multiarch/wmemset_chk.c. */
567 IFUNC_IMPL (i, name, __wmemset_chk,
568 IFUNC_IMPL_ADD (array, i, __wmemset_chk, 1,
569 __wmemset_chk_sse2_unaligned)
570 IFUNC_IMPL_ADD (array, i, __wmemset_chk,
571 HAS_ARCH_FEATURE (AVX2_Usable),
572 __wmemset_chk_avx2_unaligned)
573 IFUNC_IMPL_ADD (array, i, __wmemset_chk,
574 HAS_ARCH_FEATURE (AVX512F_Usable),
575 __wmemset_chk_avx512_unaligned))
576#endif
577
578 return i;
579}
580