1/* Enumerate available IFUNC implementations of a function. x86-64 version.
2 Copyright (C) 2012-2017 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, HAS_CPU_FEATURE (SSE4_2),
272 __strcmp_sse42)
273 IFUNC_IMPL_ADD (array, i, strcmp, HAS_CPU_FEATURE (SSSE3),
274 __strcmp_ssse3)
275 IFUNC_IMPL_ADD (array, i, strcmp, 1, __strcmp_sse2_unaligned)
276 IFUNC_IMPL_ADD (array, i, strcmp, 1, __strcmp_sse2))
277
278 /* Support sysdeps/x86_64/multiarch/strcpy.c. */
279 IFUNC_IMPL (i, name, strcpy,
280 IFUNC_IMPL_ADD (array, i, strcpy, HAS_CPU_FEATURE (SSSE3),
281 __strcpy_ssse3)
282 IFUNC_IMPL_ADD (array, i, strcpy, 1, __strcpy_sse2_unaligned)
283 IFUNC_IMPL_ADD (array, i, strcpy, 1, __strcpy_sse2))
284
285 /* Support sysdeps/x86_64/multiarch/strcspn.c. */
286 IFUNC_IMPL (i, name, strcspn,
287 IFUNC_IMPL_ADD (array, i, strcspn, HAS_CPU_FEATURE (SSE4_2),
288 __strcspn_sse42)
289 IFUNC_IMPL_ADD (array, i, strcspn, 1, __strcspn_sse2))
290
291 /* Support sysdeps/x86_64/multiarch/strncase_l.c. */
292 IFUNC_IMPL (i, name, strncasecmp,
293 IFUNC_IMPL_ADD (array, i, strncasecmp,
294 HAS_ARCH_FEATURE (AVX_Usable),
295 __strncasecmp_avx)
296 IFUNC_IMPL_ADD (array, i, strncasecmp,
297 HAS_CPU_FEATURE (SSE4_2),
298 __strncasecmp_sse42)
299 IFUNC_IMPL_ADD (array, i, strncasecmp,
300 HAS_CPU_FEATURE (SSSE3),
301 __strncasecmp_ssse3)
302 IFUNC_IMPL_ADD (array, i, strncasecmp, 1,
303 __strncasecmp_sse2))
304
305 /* Support sysdeps/x86_64/multiarch/strncase_l.c. */
306 IFUNC_IMPL (i, name, strncasecmp_l,
307 IFUNC_IMPL_ADD (array, i, strncasecmp_l,
308 HAS_ARCH_FEATURE (AVX_Usable),
309 __strncasecmp_l_avx)
310 IFUNC_IMPL_ADD (array, i, strncasecmp_l,
311 HAS_CPU_FEATURE (SSE4_2),
312 __strncasecmp_l_sse42)
313 IFUNC_IMPL_ADD (array, i, strncasecmp_l,
314 HAS_CPU_FEATURE (SSSE3),
315 __strncasecmp_l_ssse3)
316 IFUNC_IMPL_ADD (array, i, strncasecmp_l, 1,
317 __strncasecmp_l_sse2))
318
319 /* Support sysdeps/x86_64/multiarch/strncat.c. */
320 IFUNC_IMPL (i, name, strncat,
321 IFUNC_IMPL_ADD (array, i, strncat, HAS_CPU_FEATURE (SSSE3),
322 __strncat_ssse3)
323 IFUNC_IMPL_ADD (array, i, strncat, 1,
324 __strncat_sse2_unaligned)
325 IFUNC_IMPL_ADD (array, i, strncat, 1, __strncat_sse2))
326
327 /* Support sysdeps/x86_64/multiarch/strncpy.c. */
328 IFUNC_IMPL (i, name, strncpy,
329 IFUNC_IMPL_ADD (array, i, strncpy, HAS_CPU_FEATURE (SSSE3),
330 __strncpy_ssse3)
331 IFUNC_IMPL_ADD (array, i, strncpy, 1,
332 __strncpy_sse2_unaligned)
333 IFUNC_IMPL_ADD (array, i, strncpy, 1, __strncpy_sse2))
334
335 /* Support sysdeps/x86_64/multiarch/strpbrk.c. */
336 IFUNC_IMPL (i, name, strpbrk,
337 IFUNC_IMPL_ADD (array, i, strpbrk, HAS_CPU_FEATURE (SSE4_2),
338 __strpbrk_sse42)
339 IFUNC_IMPL_ADD (array, i, strpbrk, 1, __strpbrk_sse2))
340
341
342 /* Support sysdeps/x86_64/multiarch/strspn.c. */
343 IFUNC_IMPL (i, name, strspn,
344 IFUNC_IMPL_ADD (array, i, strspn, HAS_CPU_FEATURE (SSE4_2),
345 __strspn_sse42)
346 IFUNC_IMPL_ADD (array, i, strspn, 1, __strspn_sse2))
347
348 /* Support sysdeps/x86_64/multiarch/strstr.c. */
349 IFUNC_IMPL (i, name, strstr,
350 IFUNC_IMPL_ADD (array, i, strstr, 1, __strstr_sse2_unaligned)
351 IFUNC_IMPL_ADD (array, i, strstr, 1, __strstr_sse2))
352
353 /* Support sysdeps/x86_64/multiarch/wcschr.c. */
354 IFUNC_IMPL (i, name, wcschr,
355 IFUNC_IMPL_ADD (array, i, wcschr,
356 HAS_ARCH_FEATURE (AVX2_Usable),
357 __wcschr_avx2)
358 IFUNC_IMPL_ADD (array, i, wcschr, 1, __wcschr_sse2))
359
360 /* Support sysdeps/x86_64/multiarch/wcsrchr.c. */
361 IFUNC_IMPL (i, name, wcsrchr,
362 IFUNC_IMPL_ADD (array, i, wcsrchr,
363 HAS_ARCH_FEATURE (AVX2_Usable),
364 __wcsrchr_avx2)
365 IFUNC_IMPL_ADD (array, i, wcsrchr, 1, __wcsrchr_sse2))
366
367 /* Support sysdeps/x86_64/multiarch/wcscpy.c. */
368 IFUNC_IMPL (i, name, wcscpy,
369 IFUNC_IMPL_ADD (array, i, wcscpy, HAS_CPU_FEATURE (SSSE3),
370 __wcscpy_ssse3)
371 IFUNC_IMPL_ADD (array, i, wcscpy, 1, __wcscpy_sse2))
372
373 /* Support sysdeps/x86_64/multiarch/wcslen.c. */
374 IFUNC_IMPL (i, name, wcslen,
375 IFUNC_IMPL_ADD (array, i, wcslen,
376 HAS_ARCH_FEATURE (AVX2_Usable),
377 __wcslen_avx2)
378 IFUNC_IMPL_ADD (array, i, wcslen, 1, __wcslen_sse2))
379
380 /* Support sysdeps/x86_64/multiarch/wcsnlen.c. */
381 IFUNC_IMPL (i, name, wcsnlen,
382 IFUNC_IMPL_ADD (array, i, wcsnlen,
383 HAS_ARCH_FEATURE (AVX2_Usable),
384 __wcsnlen_avx2)
385 IFUNC_IMPL_ADD (array, i, wcsnlen,
386 HAS_CPU_FEATURE (SSE4_1),
387 __wcsnlen_sse4_1)
388 IFUNC_IMPL_ADD (array, i, wcsnlen, 1, __wcsnlen_sse2))
389
390 /* Support sysdeps/x86_64/multiarch/wmemchr.c. */
391 IFUNC_IMPL (i, name, wmemchr,
392 IFUNC_IMPL_ADD (array, i, wmemchr,
393 HAS_ARCH_FEATURE (AVX2_Usable),
394 __wmemchr_avx2)
395 IFUNC_IMPL_ADD (array, i, wmemchr, 1, __wmemchr_sse2))
396
397 /* Support sysdeps/x86_64/multiarch/wmemcmp.c. */
398 IFUNC_IMPL (i, name, wmemcmp,
399 IFUNC_IMPL_ADD (array, i, wmemcmp,
400 (HAS_ARCH_FEATURE (AVX2_Usable)
401 && HAS_CPU_FEATURE (MOVBE)),
402 __wmemcmp_avx2_movbe)
403 IFUNC_IMPL_ADD (array, i, wmemcmp, HAS_CPU_FEATURE (SSE4_1),
404 __wmemcmp_sse4_1)
405 IFUNC_IMPL_ADD (array, i, wmemcmp, HAS_CPU_FEATURE (SSSE3),
406 __wmemcmp_ssse3)
407 IFUNC_IMPL_ADD (array, i, wmemcmp, 1, __wmemcmp_sse2))
408
409 /* Support sysdeps/x86_64/multiarch/wmemset.c. */
410 IFUNC_IMPL (i, name, wmemset,
411 IFUNC_IMPL_ADD (array, i, wmemset, 1,
412 __wmemset_sse2_unaligned)
413 IFUNC_IMPL_ADD (array, i, wmemset,
414 HAS_ARCH_FEATURE (AVX2_Usable),
415 __wmemset_avx2_unaligned)
416 IFUNC_IMPL_ADD (array, i, wmemset,
417 HAS_ARCH_FEATURE (AVX512F_Usable),
418 __wmemset_avx512_unaligned))
419
420#ifdef SHARED
421 /* Support sysdeps/x86_64/multiarch/memcpy_chk.c. */
422 IFUNC_IMPL (i, name, __memcpy_chk,
423 IFUNC_IMPL_ADD (array, i, __memcpy_chk,
424 HAS_ARCH_FEATURE (AVX512F_Usable),
425 __memcpy_chk_avx512_no_vzeroupper)
426 IFUNC_IMPL_ADD (array, i, __memcpy_chk,
427 HAS_ARCH_FEATURE (AVX512F_Usable),
428 __memcpy_chk_avx512_unaligned)
429 IFUNC_IMPL_ADD (array, i, __memcpy_chk,
430 HAS_ARCH_FEATURE (AVX512F_Usable),
431 __memcpy_chk_avx512_unaligned_erms)
432 IFUNC_IMPL_ADD (array, i, __memcpy_chk,
433 HAS_ARCH_FEATURE (AVX_Usable),
434 __memcpy_chk_avx_unaligned)
435 IFUNC_IMPL_ADD (array, i, __memcpy_chk,
436 HAS_ARCH_FEATURE (AVX_Usable),
437 __memcpy_chk_avx_unaligned_erms)
438 IFUNC_IMPL_ADD (array, i, __memcpy_chk,
439 HAS_CPU_FEATURE (SSSE3),
440 __memcpy_chk_ssse3_back)
441 IFUNC_IMPL_ADD (array, i, __memcpy_chk,
442 HAS_CPU_FEATURE (SSSE3),
443 __memcpy_chk_ssse3)
444 IFUNC_IMPL_ADD (array, i, __memcpy_chk, 1,
445 __memcpy_chk_sse2_unaligned)
446 IFUNC_IMPL_ADD (array, i, __memcpy_chk, 1,
447 __memcpy_chk_sse2_unaligned_erms)
448 IFUNC_IMPL_ADD (array, i, __memcpy_chk, 1,
449 __memcpy_chk_erms))
450
451 /* Support sysdeps/x86_64/multiarch/memcpy.c. */
452 IFUNC_IMPL (i, name, memcpy,
453 IFUNC_IMPL_ADD (array, i, memcpy,
454 HAS_ARCH_FEATURE (AVX_Usable),
455 __memcpy_avx_unaligned)
456 IFUNC_IMPL_ADD (array, i, memcpy,
457 HAS_ARCH_FEATURE (AVX_Usable),
458 __memcpy_avx_unaligned_erms)
459 IFUNC_IMPL_ADD (array, i, memcpy, HAS_CPU_FEATURE (SSSE3),
460 __memcpy_ssse3_back)
461 IFUNC_IMPL_ADD (array, i, memcpy, HAS_CPU_FEATURE (SSSE3),
462 __memcpy_ssse3)
463 IFUNC_IMPL_ADD (array, i, memcpy,
464 HAS_ARCH_FEATURE (AVX512F_Usable),
465 __memcpy_avx512_no_vzeroupper)
466 IFUNC_IMPL_ADD (array, i, memcpy,
467 HAS_ARCH_FEATURE (AVX512F_Usable),
468 __memcpy_avx512_unaligned)
469 IFUNC_IMPL_ADD (array, i, memcpy,
470 HAS_ARCH_FEATURE (AVX512F_Usable),
471 __memcpy_avx512_unaligned_erms)
472 IFUNC_IMPL_ADD (array, i, memcpy, 1, __memcpy_sse2_unaligned)
473 IFUNC_IMPL_ADD (array, i, memcpy, 1,
474 __memcpy_sse2_unaligned_erms)
475 IFUNC_IMPL_ADD (array, i, memcpy, 1, __memcpy_erms))
476
477 /* Support sysdeps/x86_64/multiarch/mempcpy_chk.c. */
478 IFUNC_IMPL (i, name, __mempcpy_chk,
479 IFUNC_IMPL_ADD (array, i, __mempcpy_chk,
480 HAS_ARCH_FEATURE (AVX512F_Usable),
481 __mempcpy_chk_avx512_no_vzeroupper)
482 IFUNC_IMPL_ADD (array, i, __mempcpy_chk,
483 HAS_ARCH_FEATURE (AVX512F_Usable),
484 __mempcpy_chk_avx512_unaligned)
485 IFUNC_IMPL_ADD (array, i, __mempcpy_chk,
486 HAS_ARCH_FEATURE (AVX512F_Usable),
487 __mempcpy_chk_avx512_unaligned_erms)
488 IFUNC_IMPL_ADD (array, i, __mempcpy_chk,
489 HAS_ARCH_FEATURE (AVX_Usable),
490 __mempcpy_chk_avx_unaligned)
491 IFUNC_IMPL_ADD (array, i, __mempcpy_chk,
492 HAS_ARCH_FEATURE (AVX_Usable),
493 __mempcpy_chk_avx_unaligned_erms)
494 IFUNC_IMPL_ADD (array, i, __mempcpy_chk,
495 HAS_CPU_FEATURE (SSSE3),
496 __mempcpy_chk_ssse3_back)
497 IFUNC_IMPL_ADD (array, i, __mempcpy_chk,
498 HAS_CPU_FEATURE (SSSE3),
499 __mempcpy_chk_ssse3)
500 IFUNC_IMPL_ADD (array, i, __mempcpy_chk, 1,
501 __mempcpy_chk_sse2_unaligned)
502 IFUNC_IMPL_ADD (array, i, __mempcpy_chk, 1,
503 __mempcpy_chk_sse2_unaligned_erms)
504 IFUNC_IMPL_ADD (array, i, __mempcpy_chk, 1,
505 __mempcpy_chk_erms))
506
507 /* Support sysdeps/x86_64/multiarch/mempcpy.c. */
508 IFUNC_IMPL (i, name, mempcpy,
509 IFUNC_IMPL_ADD (array, i, mempcpy,
510 HAS_ARCH_FEATURE (AVX512F_Usable),
511 __mempcpy_avx512_no_vzeroupper)
512 IFUNC_IMPL_ADD (array, i, mempcpy,
513 HAS_ARCH_FEATURE (AVX512F_Usable),
514 __mempcpy_avx512_unaligned)
515 IFUNC_IMPL_ADD (array, i, mempcpy,
516 HAS_ARCH_FEATURE (AVX512F_Usable),
517 __mempcpy_avx512_unaligned_erms)
518 IFUNC_IMPL_ADD (array, i, mempcpy,
519 HAS_ARCH_FEATURE (AVX_Usable),
520 __mempcpy_avx_unaligned)
521 IFUNC_IMPL_ADD (array, i, mempcpy,
522 HAS_ARCH_FEATURE (AVX_Usable),
523 __mempcpy_avx_unaligned_erms)
524 IFUNC_IMPL_ADD (array, i, mempcpy, HAS_CPU_FEATURE (SSSE3),
525 __mempcpy_ssse3_back)
526 IFUNC_IMPL_ADD (array, i, mempcpy, HAS_CPU_FEATURE (SSSE3),
527 __mempcpy_ssse3)
528 IFUNC_IMPL_ADD (array, i, mempcpy, 1,
529 __mempcpy_sse2_unaligned)
530 IFUNC_IMPL_ADD (array, i, mempcpy, 1,
531 __mempcpy_sse2_unaligned_erms)
532 IFUNC_IMPL_ADD (array, i, mempcpy, 1, __mempcpy_erms))
533
534 /* Support sysdeps/x86_64/multiarch/strncmp.c. */
535 IFUNC_IMPL (i, name, strncmp,
536 IFUNC_IMPL_ADD (array, i, strncmp, HAS_CPU_FEATURE (SSE4_2),
537 __strncmp_sse42)
538 IFUNC_IMPL_ADD (array, i, strncmp, HAS_CPU_FEATURE (SSSE3),
539 __strncmp_ssse3)
540 IFUNC_IMPL_ADD (array, i, strncmp, 1, __strncmp_sse2))
541
542 /* Support sysdeps/x86_64/multiarch/wmemset_chk.c. */
543 IFUNC_IMPL (i, name, __wmemset_chk,
544 IFUNC_IMPL_ADD (array, i, __wmemset_chk, 1,
545 __wmemset_chk_sse2_unaligned)
546 IFUNC_IMPL_ADD (array, i, __wmemset_chk,
547 HAS_ARCH_FEATURE (AVX2_Usable),
548 __wmemset_chk_avx2_unaligned)
549 IFUNC_IMPL_ADD (array, i, __wmemset_chk,
550 HAS_ARCH_FEATURE (AVX512F_Usable),
551 __wmemset_chk_avx512_unaligned))
552#endif
553
554 return i;
555}
556