1/* Enumerate available IFUNC implementations of a function. x86-64 version.
2 Copyright (C) 2012-2024 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/* Fill ARRAY of MAX elements with IFUNC implementations for function
27 NAME supported on target machine and return the number of valid
28 entries. Each set of implementations for a given function is sorted in
29 descending order by ISA level. */
30
31size_t
32__libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
33 size_t max)
34{
35 size_t i = max;
36
37 /* Support sysdeps/x86_64/multiarch/memcmpeq.c. */
38 IFUNC_IMPL (i, name, __memcmpeq,
39 X86_IFUNC_IMPL_ADD_V4 (array, i, __memcmpeq,
40 (CPU_FEATURE_USABLE (AVX512VL)
41 && CPU_FEATURE_USABLE (AVX512BW)
42 && CPU_FEATURE_USABLE (BMI2)),
43 __memcmpeq_evex)
44 X86_IFUNC_IMPL_ADD_V3 (array, i, __memcmpeq,
45 (CPU_FEATURE_USABLE (AVX2)
46 && CPU_FEATURE_USABLE (BMI2)),
47 __memcmpeq_avx2)
48 X86_IFUNC_IMPL_ADD_V3 (array, i, __memcmpeq,
49 (CPU_FEATURE_USABLE (AVX2)
50 && CPU_FEATURE_USABLE (BMI2)
51 && CPU_FEATURE_USABLE (RTM)),
52 __memcmpeq_avx2_rtm)
53 /* ISA V2 wrapper for SSE2 implementation because the SSE2
54 implementation is also used at ISA level 2. */
55 X86_IFUNC_IMPL_ADD_V2 (array, i, __memcmpeq,
56 1,
57 __memcmpeq_sse2))
58
59 /* Support sysdeps/x86_64/multiarch/memchr.c. */
60 IFUNC_IMPL (i, name, memchr,
61 X86_IFUNC_IMPL_ADD_V4 (array, i, memchr,
62 (CPU_FEATURE_USABLE (AVX512VL)
63 && CPU_FEATURE_USABLE (AVX512BW)
64 && CPU_FEATURE_USABLE (BMI2)),
65 __memchr_evex)
66 X86_IFUNC_IMPL_ADD_V4 (array, i, memchr,
67 (CPU_FEATURE_USABLE (AVX512VL)
68 && CPU_FEATURE_USABLE (AVX512BW)
69 && CPU_FEATURE_USABLE (BMI2)),
70 __memchr_evex512)
71 X86_IFUNC_IMPL_ADD_V4 (array, i, memchr,
72 (CPU_FEATURE_USABLE (AVX512VL)
73 && CPU_FEATURE_USABLE (AVX512BW)
74 && CPU_FEATURE_USABLE (BMI2)),
75 __memchr_evex_rtm)
76 X86_IFUNC_IMPL_ADD_V3 (array, i, memchr,
77 (CPU_FEATURE_USABLE (AVX2)
78 && CPU_FEATURE_USABLE (BMI2)),
79 __memchr_avx2)
80 X86_IFUNC_IMPL_ADD_V3 (array, i, memchr,
81 (CPU_FEATURE_USABLE (AVX2)
82 && CPU_FEATURE_USABLE (BMI2)
83 && CPU_FEATURE_USABLE (RTM)),
84 __memchr_avx2_rtm)
85 /* ISA V2 wrapper for SSE2 implementation because the SSE2
86 implementation is also used at ISA level 2. */
87 X86_IFUNC_IMPL_ADD_V2 (array, i, memchr,
88 1,
89 __memchr_sse2))
90
91 /* Support sysdeps/x86_64/multiarch/memcmp.c. */
92 IFUNC_IMPL (i, name, memcmp,
93 /* NB: If any of these names change or if any new
94 implementations are added be sure to update
95 sysdeps/x86_64/memcmp-isa-default-impl.h. */
96 X86_IFUNC_IMPL_ADD_V4 (array, i, memcmp,
97 (CPU_FEATURE_USABLE (AVX512VL)
98 && CPU_FEATURE_USABLE (AVX512BW)
99 && CPU_FEATURE_USABLE (BMI2)
100 && CPU_FEATURE_USABLE (MOVBE)),
101 __memcmp_evex_movbe)
102 X86_IFUNC_IMPL_ADD_V3 (array, i, memcmp,
103 (CPU_FEATURE_USABLE (AVX2)
104 && CPU_FEATURE_USABLE (BMI2)
105 && CPU_FEATURE_USABLE (MOVBE)),
106 __memcmp_avx2_movbe)
107 X86_IFUNC_IMPL_ADD_V3 (array, i, memcmp,
108 (CPU_FEATURE_USABLE (AVX2)
109 && CPU_FEATURE_USABLE (BMI2)
110 && CPU_FEATURE_USABLE (MOVBE)
111 && CPU_FEATURE_USABLE (RTM)),
112 __memcmp_avx2_movbe_rtm)
113 /* ISA V2 wrapper for SSE2 implementation because the SSE2
114 implementation is also used at ISA level 2. */
115 X86_IFUNC_IMPL_ADD_V2 (array, i, memcmp,
116 1,
117 __memcmp_sse2))
118
119#ifdef SHARED
120 /* Support sysdeps/x86_64/multiarch/memmove_chk.c. */
121 IFUNC_IMPL (i, name, __memmove_chk,
122 IFUNC_IMPL_ADD (array, i, __memmove_chk, 1,
123 __memmove_chk_erms)
124 X86_IFUNC_IMPL_ADD_V4 (array, i, __memmove_chk,
125 CPU_FEATURE_USABLE (AVX512F),
126 __memmove_chk_avx512_no_vzeroupper)
127 X86_IFUNC_IMPL_ADD_V4 (array, i, __memmove_chk,
128 CPU_FEATURE_USABLE (AVX512VL),
129 __memmove_chk_avx512_unaligned)
130 X86_IFUNC_IMPL_ADD_V4 (array, i, __memmove_chk,
131 CPU_FEATURE_USABLE (AVX512VL),
132 __memmove_chk_avx512_unaligned_erms)
133 X86_IFUNC_IMPL_ADD_V4 (array, i, __memmove_chk,
134 CPU_FEATURE_USABLE (AVX512VL),
135 __memmove_chk_evex_unaligned)
136 X86_IFUNC_IMPL_ADD_V4 (array, i, __memmove_chk,
137 CPU_FEATURE_USABLE (AVX512VL),
138 __memmove_chk_evex_unaligned_erms)
139 X86_IFUNC_IMPL_ADD_V3 (array, i, __memmove_chk,
140 CPU_FEATURE_USABLE (AVX),
141 __memmove_chk_avx_unaligned)
142 X86_IFUNC_IMPL_ADD_V3 (array, i, __memmove_chk,
143 CPU_FEATURE_USABLE (AVX),
144 __memmove_chk_avx_unaligned_erms)
145 X86_IFUNC_IMPL_ADD_V3 (array, i, __memmove_chk,
146 (CPU_FEATURE_USABLE (AVX)
147 && CPU_FEATURE_USABLE (RTM)),
148 __memmove_chk_avx_unaligned_rtm)
149 X86_IFUNC_IMPL_ADD_V3 (array, i, __memmove_chk,
150 (CPU_FEATURE_USABLE (AVX)
151 && CPU_FEATURE_USABLE (RTM)),
152 __memmove_chk_avx_unaligned_erms_rtm)
153 /* By V3 we assume fast aligned copy. */
154 X86_IFUNC_IMPL_ADD_V2 (array, i, __memmove_chk,
155 CPU_FEATURE_USABLE (SSSE3),
156 __memmove_chk_ssse3)
157 /* ISA V2 wrapper for SSE2 implementation because the SSE2
158 implementation is also used at ISA level 2 (SSSE3 is too
159 optimized around aligned copy to be better as general
160 purpose memmove). */
161 X86_IFUNC_IMPL_ADD_V2 (array, i, __memmove_chk, 1,
162 __memmove_chk_sse2_unaligned)
163 X86_IFUNC_IMPL_ADD_V2 (array, i, __memmove_chk, 1,
164 __memmove_chk_sse2_unaligned_erms))
165#endif
166
167 /* Support sysdeps/x86_64/multiarch/memmove.c. */
168 IFUNC_IMPL (i, name, memmove,
169 IFUNC_IMPL_ADD (array, i, memmove, 1,
170 __memmove_erms)
171 X86_IFUNC_IMPL_ADD_V4 (array, i, memmove,
172 CPU_FEATURE_USABLE (AVX512F),
173 __memmove_avx512_no_vzeroupper)
174 X86_IFUNC_IMPL_ADD_V4 (array, i, memmove,
175 CPU_FEATURE_USABLE (AVX512VL),
176 __memmove_avx512_unaligned)
177 X86_IFUNC_IMPL_ADD_V4 (array, i, memmove,
178 CPU_FEATURE_USABLE (AVX512VL),
179 __memmove_avx512_unaligned_erms)
180 X86_IFUNC_IMPL_ADD_V4 (array, i, memmove,
181 CPU_FEATURE_USABLE (AVX512VL),
182 __memmove_evex_unaligned)
183 X86_IFUNC_IMPL_ADD_V4 (array, i, memmove,
184 CPU_FEATURE_USABLE (AVX512VL),
185 __memmove_evex_unaligned_erms)
186 X86_IFUNC_IMPL_ADD_V3 (array, i, memmove,
187 CPU_FEATURE_USABLE (AVX),
188 __memmove_avx_unaligned)
189 X86_IFUNC_IMPL_ADD_V3 (array, i, memmove,
190 CPU_FEATURE_USABLE (AVX),
191 __memmove_avx_unaligned_erms)
192 X86_IFUNC_IMPL_ADD_V3 (array, i, memmove,
193 (CPU_FEATURE_USABLE (AVX)
194 && CPU_FEATURE_USABLE (RTM)),
195 __memmove_avx_unaligned_rtm)
196 X86_IFUNC_IMPL_ADD_V3 (array, i, memmove,
197 (CPU_FEATURE_USABLE (AVX)
198 && CPU_FEATURE_USABLE (RTM)),
199 __memmove_avx_unaligned_erms_rtm)
200 /* By V3 we assume fast aligned copy. */
201 X86_IFUNC_IMPL_ADD_V2 (array, i, memmove,
202 CPU_FEATURE_USABLE (SSSE3),
203 __memmove_ssse3)
204 /* ISA V2 wrapper for SSE2 implementation because the SSE2
205 implementation is also used at ISA level 2 (SSSE3 is too
206 optimized around aligned copy to be better as general
207 purpose memmove). */
208 X86_IFUNC_IMPL_ADD_V2 (array, i, memmove, 1,
209 __memmove_sse2_unaligned)
210 X86_IFUNC_IMPL_ADD_V2 (array, i, memmove, 1,
211 __memmove_sse2_unaligned_erms))
212
213 /* Support sysdeps/x86_64/multiarch/memrchr.c. */
214 IFUNC_IMPL (i, name, memrchr,
215 X86_IFUNC_IMPL_ADD_V4 (array, i, memrchr,
216 (CPU_FEATURE_USABLE (AVX512VL)
217 && CPU_FEATURE_USABLE (AVX512BW)
218 && CPU_FEATURE_USABLE (BMI2)
219 && CPU_FEATURE_USABLE (LZCNT)),
220 __memrchr_evex)
221 X86_IFUNC_IMPL_ADD_V3 (array, i, memrchr,
222 (CPU_FEATURE_USABLE (AVX2)
223 && CPU_FEATURE_USABLE (BMI2)
224 && CPU_FEATURE_USABLE (LZCNT)),
225 __memrchr_avx2)
226 X86_IFUNC_IMPL_ADD_V3 (array, i, memrchr,
227 (CPU_FEATURE_USABLE (AVX2)
228 && CPU_FEATURE_USABLE (BMI2)
229 && CPU_FEATURE_USABLE (LZCNT)
230 && CPU_FEATURE_USABLE (RTM)),
231 __memrchr_avx2_rtm)
232 /* ISA V2 wrapper for SSE2 implementation because the SSE2
233 implementation is also used at ISA level 2. */
234 X86_IFUNC_IMPL_ADD_V2 (array, i, memrchr,
235 1,
236 __memrchr_sse2))
237
238#ifdef SHARED
239 /* Support sysdeps/x86_64/multiarch/memset_chk.c. */
240 IFUNC_IMPL (i, name, __memset_chk,
241 IFUNC_IMPL_ADD (array, i, __memset_chk, 1,
242 __memset_chk_erms)
243 X86_IFUNC_IMPL_ADD_V4 (array, i, __memset_chk,
244 (CPU_FEATURE_USABLE (AVX512VL)
245 && CPU_FEATURE_USABLE (AVX512BW)
246 && CPU_FEATURE_USABLE (BMI2)),
247 __memset_chk_avx512_unaligned_erms)
248 X86_IFUNC_IMPL_ADD_V4 (array, i, __memset_chk,
249 (CPU_FEATURE_USABLE (AVX512VL)
250 && CPU_FEATURE_USABLE (AVX512BW)
251 && CPU_FEATURE_USABLE (BMI2)),
252 __memset_chk_avx512_unaligned)
253 X86_IFUNC_IMPL_ADD_V4 (array, i, __memset_chk,
254 CPU_FEATURE_USABLE (AVX512F),
255 __memset_chk_avx512_no_vzeroupper)
256 X86_IFUNC_IMPL_ADD_V4 (array, i, __memset_chk,
257 (CPU_FEATURE_USABLE (AVX512VL)
258 && CPU_FEATURE_USABLE (AVX512BW)
259 && CPU_FEATURE_USABLE (BMI2)),
260 __memset_chk_evex_unaligned)
261 X86_IFUNC_IMPL_ADD_V4 (array, i, __memset_chk,
262 (CPU_FEATURE_USABLE (AVX512VL)
263 && CPU_FEATURE_USABLE (AVX512BW)
264 && CPU_FEATURE_USABLE (BMI2)),
265 __memset_chk_evex_unaligned_erms)
266 X86_IFUNC_IMPL_ADD_V3 (array, i, __memset_chk,
267 CPU_FEATURE_USABLE (AVX2),
268 __memset_chk_avx2_unaligned)
269 X86_IFUNC_IMPL_ADD_V3 (array, i, __memset_chk,
270 CPU_FEATURE_USABLE (AVX2),
271 __memset_chk_avx2_unaligned_erms)
272 X86_IFUNC_IMPL_ADD_V3 (array, i, __memset_chk,
273 (CPU_FEATURE_USABLE (AVX2)
274 && CPU_FEATURE_USABLE (RTM)),
275 __memset_chk_avx2_unaligned_rtm)
276 X86_IFUNC_IMPL_ADD_V3 (array, i, __memset_chk,
277 (CPU_FEATURE_USABLE (AVX2)
278 && CPU_FEATURE_USABLE (RTM)),
279 __memset_chk_avx2_unaligned_erms_rtm)
280 /* ISA V2 wrapper for SSE2 implementation because the SSE2
281 implementation is also used at ISA level 2. */
282 X86_IFUNC_IMPL_ADD_V2 (array, i, __memset_chk, 1,
283 __memset_chk_sse2_unaligned)
284 X86_IFUNC_IMPL_ADD_V2 (array, i, __memset_chk, 1,
285 __memset_chk_sse2_unaligned_erms)
286 )
287#endif
288
289 /* Support sysdeps/x86_64/multiarch/memset.c. */
290 IFUNC_IMPL (i, name, memset,
291 IFUNC_IMPL_ADD (array, i, memset, 1,
292 __memset_erms)
293 X86_IFUNC_IMPL_ADD_V4 (array, i, memset,
294 (CPU_FEATURE_USABLE (AVX512VL)
295 && CPU_FEATURE_USABLE (AVX512BW)
296 && CPU_FEATURE_USABLE (BMI2)),
297 __memset_avx512_unaligned_erms)
298 X86_IFUNC_IMPL_ADD_V4 (array, i, memset,
299 (CPU_FEATURE_USABLE (AVX512VL)
300 && CPU_FEATURE_USABLE (AVX512BW)
301 && CPU_FEATURE_USABLE (BMI2)),
302 __memset_avx512_unaligned)
303 X86_IFUNC_IMPL_ADD_V4 (array, i, memset,
304 CPU_FEATURE_USABLE (AVX512F),
305 __memset_avx512_no_vzeroupper)
306 X86_IFUNC_IMPL_ADD_V4 (array, i, memset,
307 (CPU_FEATURE_USABLE (AVX512VL)
308 && CPU_FEATURE_USABLE (AVX512BW)
309 && CPU_FEATURE_USABLE (BMI2)),
310 __memset_evex_unaligned)
311 X86_IFUNC_IMPL_ADD_V4 (array, i, memset,
312 (CPU_FEATURE_USABLE (AVX512VL)
313 && CPU_FEATURE_USABLE (AVX512BW)
314 && CPU_FEATURE_USABLE (BMI2)),
315 __memset_evex_unaligned_erms)
316 X86_IFUNC_IMPL_ADD_V3 (array, i, memset,
317 CPU_FEATURE_USABLE (AVX2),
318 __memset_avx2_unaligned)
319 X86_IFUNC_IMPL_ADD_V3 (array, i, memset,
320 CPU_FEATURE_USABLE (AVX2),
321 __memset_avx2_unaligned_erms)
322 X86_IFUNC_IMPL_ADD_V3 (array, i, memset,
323 (CPU_FEATURE_USABLE (AVX2)
324 && CPU_FEATURE_USABLE (RTM)),
325 __memset_avx2_unaligned_rtm)
326 X86_IFUNC_IMPL_ADD_V3 (array, i, memset,
327 (CPU_FEATURE_USABLE (AVX2)
328 && CPU_FEATURE_USABLE (RTM)),
329 __memset_avx2_unaligned_erms_rtm)
330 /* ISA V2 wrapper for SSE2 implementation because the SSE2
331 implementation is also used at ISA level 2. */
332 X86_IFUNC_IMPL_ADD_V2 (array, i, memset, 1,
333 __memset_sse2_unaligned)
334 X86_IFUNC_IMPL_ADD_V2 (array, i, memset, 1,
335 __memset_sse2_unaligned_erms)
336 )
337
338 /* Support sysdeps/x86_64/multiarch/rawmemchr.c. */
339 IFUNC_IMPL (i, name, rawmemchr,
340 X86_IFUNC_IMPL_ADD_V4 (array, i, rawmemchr,
341 (CPU_FEATURE_USABLE (AVX512VL)
342 && CPU_FEATURE_USABLE (AVX512BW)
343 && CPU_FEATURE_USABLE (BMI2)),
344 __rawmemchr_evex)
345 X86_IFUNC_IMPL_ADD_V4 (array, i, rawmemchr,
346 (CPU_FEATURE_USABLE (AVX512VL)
347 && CPU_FEATURE_USABLE (AVX512BW)
348 && CPU_FEATURE_USABLE (BMI2)),
349 __rawmemchr_evex512)
350 X86_IFUNC_IMPL_ADD_V4 (array, i, rawmemchr,
351 (CPU_FEATURE_USABLE (AVX512VL)
352 && CPU_FEATURE_USABLE (AVX512BW)
353 && CPU_FEATURE_USABLE (BMI2)),
354 __rawmemchr_evex_rtm)
355 X86_IFUNC_IMPL_ADD_V3 (array, i, rawmemchr,
356 (CPU_FEATURE_USABLE (AVX2)
357 && CPU_FEATURE_USABLE (BMI2)),
358 __rawmemchr_avx2)
359 X86_IFUNC_IMPL_ADD_V3 (array, i, rawmemchr,
360 (CPU_FEATURE_USABLE (AVX2)
361 && CPU_FEATURE_USABLE (BMI2)
362 && CPU_FEATURE_USABLE (RTM)),
363 __rawmemchr_avx2_rtm)
364 /* ISA V2 wrapper for SSE2 implementation because the SSE2
365 implementation is also used at ISA level 2. */
366 X86_IFUNC_IMPL_ADD_V2 (array, i, rawmemchr,
367 1,
368 __rawmemchr_sse2))
369
370 /* Support sysdeps/x86_64/multiarch/strlen.c. */
371 IFUNC_IMPL (i, name, strlen,
372 X86_IFUNC_IMPL_ADD_V4 (array, i, strlen,
373 (CPU_FEATURE_USABLE (AVX512VL)
374 && CPU_FEATURE_USABLE (AVX512BW)
375 && CPU_FEATURE_USABLE (BMI2)),
376 __strlen_evex)
377 X86_IFUNC_IMPL_ADD_V4 (array, i, strlen,
378 (CPU_FEATURE_USABLE (AVX512VL)
379 && CPU_FEATURE_USABLE (AVX512BW)
380 && CPU_FEATURE_USABLE (BMI2)),
381 __strlen_evex512)
382 X86_IFUNC_IMPL_ADD_V3 (array, i, strlen,
383 (CPU_FEATURE_USABLE (AVX2)
384 && CPU_FEATURE_USABLE (BMI2)),
385 __strlen_avx2)
386 X86_IFUNC_IMPL_ADD_V3 (array, i, strlen,
387 (CPU_FEATURE_USABLE (AVX2)
388 && CPU_FEATURE_USABLE (BMI2)
389 && CPU_FEATURE_USABLE (RTM)),
390 __strlen_avx2_rtm)
391 /* ISA V2 wrapper for SSE2 implementation because the SSE2
392 implementation is also used at ISA level 2. */
393 X86_IFUNC_IMPL_ADD_V2 (array, i, strlen,
394 1,
395 __strlen_sse2))
396
397 /* Support sysdeps/x86_64/multiarch/strnlen.c. */
398 IFUNC_IMPL (i, name, strnlen,
399 X86_IFUNC_IMPL_ADD_V4 (array, i, strnlen,
400 (CPU_FEATURE_USABLE (AVX512VL)
401 && CPU_FEATURE_USABLE (AVX512BW)
402 && CPU_FEATURE_USABLE (BMI2)),
403 __strnlen_evex)
404 X86_IFUNC_IMPL_ADD_V4 (array, i, strnlen,
405 (CPU_FEATURE_USABLE (AVX512VL)
406 && CPU_FEATURE_USABLE (AVX512BW)
407 && CPU_FEATURE_USABLE (BMI2)),
408 __strnlen_evex512)
409 X86_IFUNC_IMPL_ADD_V3 (array, i, strnlen,
410 (CPU_FEATURE_USABLE (AVX2)
411 && CPU_FEATURE_USABLE (BMI2)),
412 __strnlen_avx2)
413 X86_IFUNC_IMPL_ADD_V3 (array, i, strnlen,
414 (CPU_FEATURE_USABLE (AVX2)
415 && CPU_FEATURE_USABLE (BMI2)
416 && CPU_FEATURE_USABLE (RTM)),
417 __strnlen_avx2_rtm)
418 /* ISA V2 wrapper for SSE2 implementation because the SSE2
419 implementation is also used at ISA level 2. */
420 X86_IFUNC_IMPL_ADD_V2 (array, i, strnlen,
421 1,
422 __strnlen_sse2))
423
424 /* Support sysdeps/x86_64/multiarch/stpncpy.c. */
425 IFUNC_IMPL (i, name, stpncpy,
426 X86_IFUNC_IMPL_ADD_V4 (array, i, stpncpy,
427 (CPU_FEATURE_USABLE (AVX512VL)
428 && CPU_FEATURE_USABLE (AVX512BW)),
429 __stpncpy_evex)
430 X86_IFUNC_IMPL_ADD_V3 (array, i, stpncpy,
431 CPU_FEATURE_USABLE (AVX2),
432 __stpncpy_avx2)
433 X86_IFUNC_IMPL_ADD_V3 (array, i, stpncpy,
434 (CPU_FEATURE_USABLE (AVX2)
435 && CPU_FEATURE_USABLE (RTM)),
436 __stpncpy_avx2_rtm)
437 /* ISA V2 wrapper for sse2_unaligned implementation because
438 the sse2_unaligned implementation is also used at ISA
439 level 2. */
440 X86_IFUNC_IMPL_ADD_V2 (array, i, stpncpy,
441 1,
442 __stpncpy_sse2_unaligned))
443
444 /* Support sysdeps/x86_64/multiarch/stpcpy.c. */
445 IFUNC_IMPL (i, name, stpcpy,
446 X86_IFUNC_IMPL_ADD_V4 (array, i, stpcpy,
447 (CPU_FEATURE_USABLE (AVX512VL)
448 && CPU_FEATURE_USABLE (AVX512BW)),
449 __stpcpy_evex)
450 X86_IFUNC_IMPL_ADD_V3 (array, i, stpcpy,
451 CPU_FEATURE_USABLE (AVX2),
452 __stpcpy_avx2)
453 X86_IFUNC_IMPL_ADD_V3 (array, i, stpcpy,
454 (CPU_FEATURE_USABLE (AVX2)
455 && CPU_FEATURE_USABLE (RTM)),
456 __stpcpy_avx2_rtm)
457 /* ISA V2 wrapper for sse2_unaligned implementation because
458 the sse2_unaligned implementation is also used at ISA
459 level 2. */
460 X86_IFUNC_IMPL_ADD_V2 (array, i, stpcpy,
461 1,
462 __stpcpy_sse2_unaligned)
463 X86_IFUNC_IMPL_ADD_V1 (array, i, stpcpy,
464 1,
465 __stpcpy_sse2))
466
467 /* Support sysdeps/x86_64/multiarch/strcasecmp_l.c. */
468 IFUNC_IMPL (i, name, strcasecmp,
469 X86_IFUNC_IMPL_ADD_V4 (array, i, strcasecmp,
470 (CPU_FEATURE_USABLE (AVX512VL)
471 && CPU_FEATURE_USABLE (AVX512BW)
472 && CPU_FEATURE_USABLE (BMI2)),
473 __strcasecmp_evex)
474 X86_IFUNC_IMPL_ADD_V3 (array, i, strcasecmp,
475 (CPU_FEATURE_USABLE (AVX2)
476 && CPU_FEATURE_USABLE (BMI2)),
477 __strcasecmp_avx2)
478 X86_IFUNC_IMPL_ADD_V3 (array, i, strcasecmp,
479 (CPU_FEATURE_USABLE (AVX2)
480 && CPU_FEATURE_USABLE (BMI2)
481 && CPU_FEATURE_USABLE (RTM)),
482 __strcasecmp_avx2_rtm)
483 X86_IFUNC_IMPL_ADD_V2 (array, i, strcasecmp,
484 CPU_FEATURE_USABLE (SSE4_2),
485 __strcasecmp_sse42)
486 /* ISA V2 wrapper for SSE2 implementation because the SSE2
487 implementation is also used at ISA level 2. */
488 X86_IFUNC_IMPL_ADD_V2 (array, i, strcasecmp,
489 1,
490 __strcasecmp_sse2))
491
492 /* Support sysdeps/x86_64/multiarch/strcasecmp_l.c. */
493 IFUNC_IMPL (i, name, strcasecmp_l,
494 X86_IFUNC_IMPL_ADD_V4 (array, i, strcasecmp,
495 (CPU_FEATURE_USABLE (AVX512VL)
496 && CPU_FEATURE_USABLE (AVX512BW)
497 && CPU_FEATURE_USABLE (BMI2)),
498 __strcasecmp_l_evex)
499 X86_IFUNC_IMPL_ADD_V3 (array, i, strcasecmp,
500 (CPU_FEATURE_USABLE (AVX2)
501 && CPU_FEATURE_USABLE (BMI2)),
502 __strcasecmp_l_avx2)
503 X86_IFUNC_IMPL_ADD_V3 (array, i, strcasecmp,
504 (CPU_FEATURE_USABLE (AVX2)
505 && CPU_FEATURE_USABLE (BMI2)
506 && CPU_FEATURE_USABLE (RTM)),
507 __strcasecmp_l_avx2_rtm)
508 X86_IFUNC_IMPL_ADD_V2 (array, i, strcasecmp_l,
509 CPU_FEATURE_USABLE (SSE4_2),
510 __strcasecmp_l_sse42)
511 /* ISA V2 wrapper for SSE2 implementation because the SSE2
512 implementation is also used at ISA level 2. */
513 X86_IFUNC_IMPL_ADD_V2 (array, i, strcasecmp_l,
514 1,
515 __strcasecmp_l_sse2))
516
517 /* Support sysdeps/x86_64/multiarch/strcat.c. */
518 IFUNC_IMPL (i, name, strcat,
519 X86_IFUNC_IMPL_ADD_V4 (array, i, strcat,
520 (CPU_FEATURE_USABLE (AVX512VL)
521 && CPU_FEATURE_USABLE (AVX512BW)),
522 __strcat_evex)
523 X86_IFUNC_IMPL_ADD_V3 (array, i, strcat,
524 CPU_FEATURE_USABLE (AVX2),
525 __strcat_avx2)
526 X86_IFUNC_IMPL_ADD_V3 (array, i, strcat,
527 (CPU_FEATURE_USABLE (AVX2)
528 && CPU_FEATURE_USABLE (RTM)),
529 __strcat_avx2_rtm)
530 /* ISA V2 wrapper for sse2_unaligned implementation because
531 the sse2_unaligned implementation is also used at ISA
532 level 2. */
533 X86_IFUNC_IMPL_ADD_V2 (array, i, strcat,
534 1,
535 __strcat_sse2_unaligned)
536 X86_IFUNC_IMPL_ADD_V1 (array, i, strcat,
537 1,
538 __strcat_sse2))
539
540 /* Support sysdeps/x86_64/multiarch/strchr.c. */
541 IFUNC_IMPL (i, name, strchr,
542 X86_IFUNC_IMPL_ADD_V4 (array, i, strchr,
543 (CPU_FEATURE_USABLE (AVX512VL)
544 && CPU_FEATURE_USABLE (AVX512BW)
545 && CPU_FEATURE_USABLE (BMI2)),
546 __strchr_evex)
547 X86_IFUNC_IMPL_ADD_V4 (array, i, strchr,
548 (CPU_FEATURE_USABLE (AVX512VL)
549 && CPU_FEATURE_USABLE (AVX512BW)),
550 __strchr_evex512)
551 X86_IFUNC_IMPL_ADD_V3 (array, i, strchr,
552 (CPU_FEATURE_USABLE (AVX2)
553 && CPU_FEATURE_USABLE (BMI2)),
554 __strchr_avx2)
555 X86_IFUNC_IMPL_ADD_V3 (array, i, strchr,
556 (CPU_FEATURE_USABLE (AVX2)
557 && CPU_FEATURE_USABLE (BMI2)
558 && CPU_FEATURE_USABLE (RTM)),
559 __strchr_avx2_rtm)
560 /* ISA V2 wrapper for SSE2 implementation because the SSE2
561 implementation is also used at ISA level 2. */
562 X86_IFUNC_IMPL_ADD_V2 (array, i, strchr,
563 1,
564 __strchr_sse2)
565 X86_IFUNC_IMPL_ADD_V1 (array, i, strchr,
566 1,
567 __strchr_sse2_no_bsf))
568
569 /* Support sysdeps/x86_64/multiarch/strchrnul.c. */
570 IFUNC_IMPL (i, name, strchrnul,
571 X86_IFUNC_IMPL_ADD_V4 (array, i, strchrnul,
572 (CPU_FEATURE_USABLE (AVX512VL)
573 && CPU_FEATURE_USABLE (AVX512BW)
574 && CPU_FEATURE_USABLE (BMI2)),
575 __strchrnul_evex)
576 X86_IFUNC_IMPL_ADD_V4 (array, i, strchrnul,
577 (CPU_FEATURE_USABLE (AVX512VL)
578 && CPU_FEATURE_USABLE (AVX512BW)),
579 __strchrnul_evex512)
580 X86_IFUNC_IMPL_ADD_V3 (array, i, strchrnul,
581 (CPU_FEATURE_USABLE (AVX2)
582 && CPU_FEATURE_USABLE (BMI2)),
583 __strchrnul_avx2)
584 X86_IFUNC_IMPL_ADD_V3 (array, i, strchrnul,
585 (CPU_FEATURE_USABLE (AVX2)
586 && CPU_FEATURE_USABLE (BMI2)
587 && CPU_FEATURE_USABLE (RTM)),
588 __strchrnul_avx2_rtm)
589 /* ISA V2 wrapper for SSE2 implementation because the SSE2
590 implementation is also used at ISA level 2. */
591 X86_IFUNC_IMPL_ADD_V2 (array, i, strchrnul,
592 1,
593 __strchrnul_sse2))
594
595 /* Support sysdeps/x86_64/multiarch/strrchr.c. */
596 IFUNC_IMPL (i, name, strrchr,
597 X86_IFUNC_IMPL_ADD_V4 (array, i, strrchr,
598 (CPU_FEATURE_USABLE (AVX512VL)
599 && CPU_FEATURE_USABLE (AVX512BW)
600 && CPU_FEATURE_USABLE (BMI1)
601 && CPU_FEATURE_USABLE (BMI2)),
602 __strrchr_evex)
603 X86_IFUNC_IMPL_ADD_V4 (array, i, strrchr,
604 (CPU_FEATURE_USABLE (AVX512VL)
605 && CPU_FEATURE_USABLE (AVX512BW)
606 && CPU_FEATURE_USABLE (BMI2)),
607 __strrchr_evex512)
608 X86_IFUNC_IMPL_ADD_V3 (array, i, strrchr,
609 (CPU_FEATURE_USABLE (AVX2)
610 && CPU_FEATURE_USABLE (BMI1)
611 && CPU_FEATURE_USABLE (BMI2)),
612 __strrchr_avx2)
613 X86_IFUNC_IMPL_ADD_V3 (array, i, strrchr,
614 (CPU_FEATURE_USABLE (AVX2)
615 && CPU_FEATURE_USABLE (BMI1)
616 && CPU_FEATURE_USABLE (BMI2)
617 && CPU_FEATURE_USABLE (RTM)),
618 __strrchr_avx2_rtm)
619 /* ISA V2 wrapper for SSE2 implementation because the SSE2
620 implementation is also used at ISA level 2. */
621 X86_IFUNC_IMPL_ADD_V2 (array, i, strrchr,
622 1,
623 __strrchr_sse2))
624
625 /* Support sysdeps/x86_64/multiarch/strcmp.c. */
626 IFUNC_IMPL (i, name, strcmp,
627 X86_IFUNC_IMPL_ADD_V4 (array, i, strcmp,
628 (CPU_FEATURE_USABLE (AVX512VL)
629 && CPU_FEATURE_USABLE (AVX512BW)
630 && CPU_FEATURE_USABLE (BMI2)),
631 __strcmp_evex)
632 X86_IFUNC_IMPL_ADD_V3 (array, i, strcmp,
633 (CPU_FEATURE_USABLE (AVX2)
634 && CPU_FEATURE_USABLE (BMI2)),
635 __strcmp_avx2)
636 X86_IFUNC_IMPL_ADD_V3 (array, i, strcmp,
637 (CPU_FEATURE_USABLE (AVX2)
638 && CPU_FEATURE_USABLE (BMI2)
639 && CPU_FEATURE_USABLE (RTM)),
640 __strcmp_avx2_rtm)
641 X86_IFUNC_IMPL_ADD_V2 (array, i, strcmp,
642 CPU_FEATURE_USABLE (SSE4_2),
643 __strcmp_sse42)
644 /* ISA V2 wrapper for SSE2 implementations because the SSE2
645 implementations are also used at ISA level 2. */
646 X86_IFUNC_IMPL_ADD_V2 (array, i, strcmp,
647 1,
648 __strcmp_sse2_unaligned)
649 X86_IFUNC_IMPL_ADD_V2 (array, i, strcmp,
650 1,
651 __strcmp_sse2))
652
653 /* Support sysdeps/x86_64/multiarch/strcpy.c. */
654 IFUNC_IMPL (i, name, strcpy,
655 X86_IFUNC_IMPL_ADD_V4 (array, i, strcpy,
656 (CPU_FEATURE_USABLE (AVX512VL)
657 && CPU_FEATURE_USABLE (AVX512BW)),
658 __strcpy_evex)
659 X86_IFUNC_IMPL_ADD_V3 (array, i, strcpy,
660 CPU_FEATURE_USABLE (AVX2),
661 __strcpy_avx2)
662 X86_IFUNC_IMPL_ADD_V3 (array, i, strcpy,
663 (CPU_FEATURE_USABLE (AVX2)
664 && CPU_FEATURE_USABLE (RTM)),
665 __strcpy_avx2_rtm)
666 /* ISA V2 wrapper for sse2_unaligned implementation because
667 the sse2_unaligned implementation is also used at ISA
668 level 2. */
669 X86_IFUNC_IMPL_ADD_V2 (array, i, strcpy,
670 1,
671 __strcpy_sse2_unaligned)
672 X86_IFUNC_IMPL_ADD_V1 (array, i, strcpy,
673 1,
674 __strcpy_sse2))
675
676 /* Support sysdeps/x86_64/multiarch/strcspn.c. */
677 IFUNC_IMPL (i, name, strcspn,
678 /* All implementations of strcspn are built at all ISA
679 levels. */
680 IFUNC_IMPL_ADD (array, i, strcspn, CPU_FEATURE_USABLE (SSE4_2),
681 __strcspn_sse42)
682 IFUNC_IMPL_ADD (array, i, strcspn, 1, __strcspn_generic))
683
684 /* Support sysdeps/x86_64/multiarch/strncase_l.c. */
685 IFUNC_IMPL (i, name, strncasecmp,
686 X86_IFUNC_IMPL_ADD_V4 (array, i, strncasecmp,
687 (CPU_FEATURE_USABLE (AVX512VL)
688 && CPU_FEATURE_USABLE (AVX512BW)
689 && CPU_FEATURE_USABLE (BMI2)),
690 __strncasecmp_evex)
691 X86_IFUNC_IMPL_ADD_V3 (array, i, strncasecmp,
692 (CPU_FEATURE_USABLE (AVX2)
693 && CPU_FEATURE_USABLE (BMI2)),
694 __strncasecmp_avx2)
695 X86_IFUNC_IMPL_ADD_V3 (array, i, strncasecmp,
696 (CPU_FEATURE_USABLE (AVX2)
697 && CPU_FEATURE_USABLE (BMI2)
698 && CPU_FEATURE_USABLE (RTM)),
699 __strncasecmp_avx2_rtm)
700 X86_IFUNC_IMPL_ADD_V2 (array, i, strncasecmp,
701 CPU_FEATURE_USABLE (SSE4_2),
702 __strncasecmp_sse42)
703 /* ISA V2 wrapper for SSE2 implementation because the SSE2
704 implementation is also used at ISA level 2. */
705 X86_IFUNC_IMPL_ADD_V2 (array, i, strncasecmp,
706 1,
707 __strncasecmp_sse2))
708
709 /* Support sysdeps/x86_64/multiarch/strncase_l.c. */
710 IFUNC_IMPL (i, name, strncasecmp_l,
711 X86_IFUNC_IMPL_ADD_V4 (array, i, strncasecmp,
712 (CPU_FEATURE_USABLE (AVX512VL)
713 & CPU_FEATURE_USABLE (AVX512BW)
714 && CPU_FEATURE_USABLE (BMI2)),
715 __strncasecmp_l_evex)
716 X86_IFUNC_IMPL_ADD_V3 (array, i, strncasecmp,
717 (CPU_FEATURE_USABLE (AVX2)
718 && CPU_FEATURE_USABLE (BMI2)),
719 __strncasecmp_l_avx2)
720 X86_IFUNC_IMPL_ADD_V3 (array, i, strncasecmp,
721 (CPU_FEATURE_USABLE (AVX2)
722 && CPU_FEATURE_USABLE (BMI2)
723 && CPU_FEATURE_USABLE (RTM)),
724 __strncasecmp_l_avx2_rtm)
725 X86_IFUNC_IMPL_ADD_V2 (array, i, strncasecmp_l,
726 CPU_FEATURE_USABLE (SSE4_2),
727 __strncasecmp_l_sse42)
728 /* ISA V2 wrapper for SSE2 implementation because the SSE2
729 implementation is also used at ISA level 2. */
730 X86_IFUNC_IMPL_ADD_V2 (array, i, strncasecmp_l,
731 1,
732 __strncasecmp_l_sse2))
733
734 /* Support sysdeps/x86_64/multiarch/strncat.c. */
735 IFUNC_IMPL (i, name, strncat,
736 X86_IFUNC_IMPL_ADD_V4 (array, i, strncat,
737 (CPU_FEATURE_USABLE (AVX512VL)
738 && CPU_FEATURE_USABLE (AVX512BW)),
739 __strncat_evex)
740 X86_IFUNC_IMPL_ADD_V3 (array, i, strncat,
741 CPU_FEATURE_USABLE (AVX2),
742 __strncat_avx2)
743 X86_IFUNC_IMPL_ADD_V3 (array, i, strncat,
744 (CPU_FEATURE_USABLE (AVX2)
745 && CPU_FEATURE_USABLE (RTM)),
746 __strncat_avx2_rtm)
747 /* ISA V2 wrapper for sse2_unaligned implementation because
748 the sse2_unaligned implementation is also used at ISA
749 level 2. */
750 X86_IFUNC_IMPL_ADD_V2 (array, i, strncat,
751 1,
752 __strncat_sse2_unaligned))
753
754 /* Support sysdeps/x86_64/multiarch/strncpy.c. */
755 IFUNC_IMPL (i, name, strncpy,
756 X86_IFUNC_IMPL_ADD_V4 (array, i, strncpy,
757 (CPU_FEATURE_USABLE (AVX512VL)
758 && CPU_FEATURE_USABLE (AVX512BW)),
759 __strncpy_evex)
760 X86_IFUNC_IMPL_ADD_V3 (array, i, strncpy,
761 CPU_FEATURE_USABLE (AVX2),
762 __strncpy_avx2)
763 X86_IFUNC_IMPL_ADD_V3 (array, i, strncpy,
764 (CPU_FEATURE_USABLE (AVX2)
765 && CPU_FEATURE_USABLE (RTM)),
766 __strncpy_avx2_rtm)
767 /* ISA V2 wrapper for sse2_unaligned implementation because
768 the sse2_unaligned implementation is also used at ISA
769 level 2. */
770 X86_IFUNC_IMPL_ADD_V2 (array, i, strncpy,
771 1,
772 __strncpy_sse2_unaligned))
773
774 /* Support sysdeps/x86_64/multiarch/strpbrk.c. */
775 IFUNC_IMPL (i, name, strpbrk,
776 /* All implementations of strpbrk are built at all ISA
777 levels. */
778 IFUNC_IMPL_ADD (array, i, strpbrk, CPU_FEATURE_USABLE (SSE4_2),
779 __strpbrk_sse42)
780 IFUNC_IMPL_ADD (array, i, strpbrk, 1, __strpbrk_generic))
781
782
783 /* Support sysdeps/x86_64/multiarch/strspn.c. */
784 IFUNC_IMPL (i, name, strspn,
785 /* All implementations of strspn are built at all ISA
786 levels. */
787 IFUNC_IMPL_ADD (array, i, strspn, CPU_FEATURE_USABLE (SSE4_2),
788 __strspn_sse42)
789 IFUNC_IMPL_ADD (array, i, strspn, 1, __strspn_generic))
790
791 /* Support sysdeps/x86_64/multiarch/strstr.c. */
792 IFUNC_IMPL (i, name, strstr,
793 IFUNC_IMPL_ADD (array, i, strstr,
794 (CPU_FEATURE_USABLE (AVX512VL)
795 && CPU_FEATURE_USABLE (AVX512BW)
796 && CPU_FEATURE_USABLE (AVX512DQ)
797 && CPU_FEATURE_USABLE (BMI2)),
798 __strstr_avx512)
799 IFUNC_IMPL_ADD (array, i, strstr, 1, __strstr_sse2_unaligned)
800 IFUNC_IMPL_ADD (array, i, strstr, 1, __strstr_generic))
801
802 /* Support sysdeps/x86_64/multiarch/wcschr.c. */
803 IFUNC_IMPL (i, name, wcschr,
804 X86_IFUNC_IMPL_ADD_V4 (array, i, wcschr,
805 (CPU_FEATURE_USABLE (AVX512VL)
806 && CPU_FEATURE_USABLE (AVX512BW)
807 && CPU_FEATURE_USABLE (BMI2)),
808 __wcschr_evex)
809 X86_IFUNC_IMPL_ADD_V4 (array, i, wcschr,
810 (CPU_FEATURE_USABLE (AVX512VL)
811 && CPU_FEATURE_USABLE (AVX512BW)),
812 __wcschr_evex512)
813 X86_IFUNC_IMPL_ADD_V3 (array, i, wcschr,
814 (CPU_FEATURE_USABLE (AVX2)
815 && CPU_FEATURE_USABLE (BMI2)),
816 __wcschr_avx2)
817 X86_IFUNC_IMPL_ADD_V3 (array, i, wcschr,
818 (CPU_FEATURE_USABLE (AVX2)
819 && CPU_FEATURE_USABLE (BMI2)
820 && CPU_FEATURE_USABLE (RTM)),
821 __wcschr_avx2_rtm)
822 /* ISA V2 wrapper for SSE2 implementation because the SSE2
823 implementation is also used at ISA level 2. */
824 X86_IFUNC_IMPL_ADD_V2 (array, i, wcschr,
825 1,
826 __wcschr_sse2))
827
828 /* Support sysdeps/x86_64/multiarch/wcsrchr.c. */
829 IFUNC_IMPL (i, name, wcsrchr,
830 X86_IFUNC_IMPL_ADD_V4 (array, i, wcsrchr,
831 (CPU_FEATURE_USABLE (AVX512VL)
832 && CPU_FEATURE_USABLE (AVX512BW)
833 && CPU_FEATURE_USABLE (BMI1)
834 && CPU_FEATURE_USABLE (BMI2)),
835 __wcsrchr_evex)
836 X86_IFUNC_IMPL_ADD_V4 (array, i, wcsrchr,
837 (CPU_FEATURE_USABLE (AVX512VL)
838 && CPU_FEATURE_USABLE (AVX512BW)
839 && CPU_FEATURE_USABLE (BMI2)),
840 __wcsrchr_evex512)
841 X86_IFUNC_IMPL_ADD_V3 (array, i, wcsrchr,
842 (CPU_FEATURE_USABLE (AVX2)
843 && CPU_FEATURE_USABLE (BMI1)
844 && CPU_FEATURE_USABLE (BMI2)),
845 __wcsrchr_avx2)
846 X86_IFUNC_IMPL_ADD_V3 (array, i, wcsrchr,
847 (CPU_FEATURE_USABLE (AVX2)
848 && CPU_FEATURE_USABLE (BMI1)
849 && CPU_FEATURE_USABLE (BMI2)
850 && CPU_FEATURE_USABLE (RTM)),
851 __wcsrchr_avx2_rtm)
852 /* ISA V2 wrapper for SSE2 implementation because the SSE2
853 implementation is also used at ISA level 2. */
854 X86_IFUNC_IMPL_ADD_V2 (array, i, wcsrchr,
855 1,
856 __wcsrchr_sse2))
857
858 /* Support sysdeps/x86_64/multiarch/wcscmp.c. */
859 IFUNC_IMPL (i, name, wcscmp,
860 X86_IFUNC_IMPL_ADD_V4 (array, i, wcscmp,
861 (CPU_FEATURE_USABLE (AVX512VL)
862 && CPU_FEATURE_USABLE (AVX512BW)
863 && CPU_FEATURE_USABLE (BMI2)),
864 __wcscmp_evex)
865 X86_IFUNC_IMPL_ADD_V3 (array, i, wcscmp,
866 (CPU_FEATURE_USABLE (AVX2)
867 && CPU_FEATURE_USABLE (BMI2)),
868 __wcscmp_avx2)
869 X86_IFUNC_IMPL_ADD_V3 (array, i, wcscmp,
870 (CPU_FEATURE_USABLE (AVX2)
871 && CPU_FEATURE_USABLE (BMI2)
872 && CPU_FEATURE_USABLE (RTM)),
873 __wcscmp_avx2_rtm)
874 /* ISA V2 wrapper for SSE2 implementation because the SSE2
875 implementation is also used at ISA level 2. */
876 X86_IFUNC_IMPL_ADD_V2 (array, i, wcscmp,
877 1,
878 __wcscmp_sse2))
879
880 /* Support sysdeps/x86_64/multiarch/wcsncmp.c. */
881 IFUNC_IMPL (i, name, wcsncmp,
882 X86_IFUNC_IMPL_ADD_V4 (array, i, wcsncmp,
883 (CPU_FEATURE_USABLE (AVX512VL)
884 && CPU_FEATURE_USABLE (AVX512BW)
885 && CPU_FEATURE_USABLE (BMI2)),
886 __wcsncmp_evex)
887 X86_IFUNC_IMPL_ADD_V3 (array, i, wcsncmp,
888 (CPU_FEATURE_USABLE (AVX2)
889 && CPU_FEATURE_USABLE (BMI2)),
890 __wcsncmp_avx2)
891 X86_IFUNC_IMPL_ADD_V3 (array, i, wcsncmp,
892 (CPU_FEATURE_USABLE (AVX2)
893 && CPU_FEATURE_USABLE (BMI2)
894 && CPU_FEATURE_USABLE (RTM)),
895 __wcsncmp_avx2_rtm)
896 /* ISA V2 wrapper for GENERIC implementation because the
897 GENERIC implementation is also used at ISA level 2. */
898 X86_IFUNC_IMPL_ADD_V2 (array, i, wcsncmp,
899 1,
900 __wcsncmp_generic))
901
902 /* Support sysdeps/x86_64/multiarch/wcscpy.c. */
903 IFUNC_IMPL (i, name, wcscpy,
904 X86_IFUNC_IMPL_ADD_V4 (array, i, wcscpy,
905 (CPU_FEATURE_USABLE (AVX512VL)
906 && CPU_FEATURE_USABLE (AVX512BW)
907 && CPU_FEATURE_USABLE (BMI2)),
908 __wcscpy_evex)
909 X86_IFUNC_IMPL_ADD_V3 (array, i, wcscpy,
910 (CPU_FEATURE_USABLE (AVX2)
911 && CPU_FEATURE_USABLE (BMI2)),
912 __wcscpy_avx2)
913 X86_IFUNC_IMPL_ADD_V2 (array, i, wcscpy,
914 CPU_FEATURE_USABLE (SSSE3),
915 __wcscpy_ssse3)
916 X86_IFUNC_IMPL_ADD_V1 (array, i, wcscpy,
917 1,
918 __wcscpy_generic))
919
920 /* Support sysdeps/x86_64/multiarch/wcsncpy.c. */
921 IFUNC_IMPL (i, name, wcsncpy,
922 X86_IFUNC_IMPL_ADD_V4 (array, i, wcsncpy,
923 (CPU_FEATURE_USABLE (AVX512VL)
924 && CPU_FEATURE_USABLE (AVX512BW)
925 && CPU_FEATURE_USABLE (BMI2)),
926 __wcsncpy_evex)
927 X86_IFUNC_IMPL_ADD_V3 (array, i, wcsncpy,
928 (CPU_FEATURE_USABLE (AVX2)
929 && CPU_FEATURE_USABLE (BMI2)),
930 __wcsncpy_avx2)
931 X86_IFUNC_IMPL_ADD_V2 (array, i, wcpncpy,
932 1,
933 __wcsncpy_generic))
934
935 /* Support sysdeps/x86_64/multiarch/wcpcpy.c. */
936 IFUNC_IMPL (i, name, wcpcpy,
937 X86_IFUNC_IMPL_ADD_V4 (array, i, wcpcpy,
938 (CPU_FEATURE_USABLE (AVX512VL)
939 && CPU_FEATURE_USABLE (AVX512BW)
940 && CPU_FEATURE_USABLE (BMI2)),
941 __wcpcpy_evex)
942 X86_IFUNC_IMPL_ADD_V3 (array, i, wcpcpy,
943 (CPU_FEATURE_USABLE (AVX2)
944 && CPU_FEATURE_USABLE (BMI2)),
945 __wcpcpy_avx2)
946 X86_IFUNC_IMPL_ADD_V2 (array, i, wcpcpy,
947 1,
948 __wcpcpy_generic))
949
950 /* Support sysdeps/x86_64/multiarch/wcpncpy.c. */
951 IFUNC_IMPL (i, name, wcpncpy,
952 X86_IFUNC_IMPL_ADD_V4 (array, i, wcpncpy,
953 (CPU_FEATURE_USABLE (AVX512VL)
954 && CPU_FEATURE_USABLE (AVX512BW)
955 && CPU_FEATURE_USABLE (BMI2)),
956 __wcpncpy_evex)
957 X86_IFUNC_IMPL_ADD_V3 (array, i, wcpncpy,
958 (CPU_FEATURE_USABLE (AVX2)
959 && CPU_FEATURE_USABLE (BMI2)),
960 __wcpncpy_avx2)
961 X86_IFUNC_IMPL_ADD_V2 (array, i, wcsncpy,
962 1,
963 __wcpncpy_generic))
964
965 /* Support sysdeps/x86_64/multiarch/wcscat.c. */
966 IFUNC_IMPL (i, name, wcscat,
967 X86_IFUNC_IMPL_ADD_V4 (array, i, wcscat,
968 (CPU_FEATURE_USABLE (AVX512VL)
969 && CPU_FEATURE_USABLE (AVX512BW)
970 && CPU_FEATURE_USABLE (BMI2)),
971 __wcscat_evex)
972 X86_IFUNC_IMPL_ADD_V3 (array, i, wcscat,
973 (CPU_FEATURE_USABLE (AVX2)
974 && CPU_FEATURE_USABLE (BMI2)),
975 __wcscat_avx2)
976 X86_IFUNC_IMPL_ADD_V2 (array, i, wcscat,
977 1,
978 __wcscat_generic))
979
980 /* Support sysdeps/x86_64/multiarch/wcsncat.c. */
981 IFUNC_IMPL (i, name, wcsncat,
982 X86_IFUNC_IMPL_ADD_V4 (array, i, wcsncat,
983 (CPU_FEATURE_USABLE (AVX512VL)
984 && CPU_FEATURE_USABLE (AVX512BW)
985 && CPU_FEATURE_USABLE (BMI2)),
986 __wcsncat_evex)
987 X86_IFUNC_IMPL_ADD_V3 (array, i, wcsncat,
988 (CPU_FEATURE_USABLE (AVX2)
989 && CPU_FEATURE_USABLE (BMI2)),
990 __wcsncat_avx2)
991 X86_IFUNC_IMPL_ADD_V2 (array, i, wcsncat,
992 1,
993 __wcsncat_generic))
994
995 /* Support sysdeps/x86_64/multiarch/wcslen.c. */
996 IFUNC_IMPL (i, name, wcslen,
997 X86_IFUNC_IMPL_ADD_V4 (array, i, wcslen,
998 (CPU_FEATURE_USABLE (AVX512VL)
999 && CPU_FEATURE_USABLE (AVX512BW)
1000 && CPU_FEATURE_USABLE (BMI2)),
1001 __wcslen_evex)
1002 X86_IFUNC_IMPL_ADD_V4 (array, i, wcslen,
1003 (CPU_FEATURE_USABLE (AVX512VL)
1004 && CPU_FEATURE_USABLE (AVX512BW)
1005 && CPU_FEATURE_USABLE (BMI2)),
1006 __wcslen_evex512)
1007 X86_IFUNC_IMPL_ADD_V3 (array, i, wcslen,
1008 (CPU_FEATURE_USABLE (AVX2)
1009 && CPU_FEATURE_USABLE (BMI2)),
1010 __wcslen_avx2)
1011 X86_IFUNC_IMPL_ADD_V3 (array, i, wcslen,
1012 (CPU_FEATURE_USABLE (AVX2)
1013 && CPU_FEATURE_USABLE (BMI2)
1014 && CPU_FEATURE_USABLE (RTM)),
1015 __wcslen_avx2_rtm)
1016 X86_IFUNC_IMPL_ADD_V2 (array, i, wcslen,
1017 CPU_FEATURE_USABLE (SSE4_1),
1018 __wcslen_sse4_1)
1019 X86_IFUNC_IMPL_ADD_V1 (array, i, wcslen,
1020 1,
1021 __wcslen_sse2))
1022
1023 /* Support sysdeps/x86_64/multiarch/wcsnlen.c. */
1024 IFUNC_IMPL (i, name, wcsnlen,
1025 X86_IFUNC_IMPL_ADD_V4 (array, i, wcsnlen,
1026 (CPU_FEATURE_USABLE (AVX512VL)
1027 && CPU_FEATURE_USABLE (AVX512BW)
1028 && CPU_FEATURE_USABLE (BMI2)),
1029 __wcsnlen_evex)
1030 X86_IFUNC_IMPL_ADD_V4 (array, i, wcsnlen,
1031 (CPU_FEATURE_USABLE (AVX512VL)
1032 && CPU_FEATURE_USABLE (AVX512BW)
1033 && CPU_FEATURE_USABLE (BMI2)),
1034 __wcsnlen_evex512)
1035 X86_IFUNC_IMPL_ADD_V3 (array, i, wcsnlen,
1036 (CPU_FEATURE_USABLE (AVX2)
1037 && CPU_FEATURE_USABLE (BMI2)),
1038 __wcsnlen_avx2)
1039 X86_IFUNC_IMPL_ADD_V3 (array, i, wcsnlen,
1040 (CPU_FEATURE_USABLE (AVX2)
1041 && CPU_FEATURE_USABLE (BMI2)
1042 && CPU_FEATURE_USABLE (RTM)),
1043 __wcsnlen_avx2_rtm)
1044 X86_IFUNC_IMPL_ADD_V2 (array, i, wcsnlen,
1045 CPU_FEATURE_USABLE (SSE4_1),
1046 __wcsnlen_sse4_1)
1047 X86_IFUNC_IMPL_ADD_V1 (array, i, wcsnlen,
1048 1,
1049 __wcsnlen_generic))
1050
1051 /* Support sysdeps/x86_64/multiarch/wmemchr.c. */
1052 IFUNC_IMPL (i, name, wmemchr,
1053 X86_IFUNC_IMPL_ADD_V4 (array, i, wmemchr,
1054 (CPU_FEATURE_USABLE (AVX512VL)
1055 && CPU_FEATURE_USABLE (AVX512BW)
1056 && CPU_FEATURE_USABLE (BMI2)),
1057 __wmemchr_evex)
1058 X86_IFUNC_IMPL_ADD_V4 (array, i, wmemchr,
1059 (CPU_FEATURE_USABLE (AVX512VL)
1060 && CPU_FEATURE_USABLE (AVX512BW)
1061 && CPU_FEATURE_USABLE (BMI2)),
1062 __wmemchr_evex512)
1063 X86_IFUNC_IMPL_ADD_V4 (array, i, wmemchr,
1064 (CPU_FEATURE_USABLE (AVX512VL)
1065 && CPU_FEATURE_USABLE (AVX512BW)
1066 && CPU_FEATURE_USABLE (BMI2)),
1067 __wmemchr_evex_rtm)
1068 X86_IFUNC_IMPL_ADD_V3 (array, i, wmemchr,
1069 (CPU_FEATURE_USABLE (AVX2)
1070 && CPU_FEATURE_USABLE (BMI2)),
1071 __wmemchr_avx2)
1072 X86_IFUNC_IMPL_ADD_V3 (array, i, wmemchr,
1073 (CPU_FEATURE_USABLE (AVX2)
1074 && CPU_FEATURE_USABLE (BMI2)
1075 && CPU_FEATURE_USABLE (RTM)),
1076 __wmemchr_avx2_rtm)
1077 /* ISA V2 wrapper for SSE2 implementation because the SSE2
1078 implementation is also used at ISA level 2. */
1079 X86_IFUNC_IMPL_ADD_V2 (array, i, wmemchr,
1080 1,
1081 __wmemchr_sse2))
1082
1083 /* Support sysdeps/x86_64/multiarch/wmemcmp.c. */
1084 IFUNC_IMPL (i, name, wmemcmp,
1085 X86_IFUNC_IMPL_ADD_V4 (array, i, wmemcmp,
1086 (CPU_FEATURE_USABLE (AVX512VL)
1087 && CPU_FEATURE_USABLE (AVX512BW)
1088 && CPU_FEATURE_USABLE (BMI2)
1089 && CPU_FEATURE_USABLE (MOVBE)),
1090 __wmemcmp_evex_movbe)
1091 X86_IFUNC_IMPL_ADD_V3 (array, i, wmemcmp,
1092 (CPU_FEATURE_USABLE (AVX2)
1093 && CPU_FEATURE_USABLE (BMI2)
1094 && CPU_FEATURE_USABLE (MOVBE)),
1095 __wmemcmp_avx2_movbe)
1096 X86_IFUNC_IMPL_ADD_V3 (array, i, wmemcmp,
1097 (CPU_FEATURE_USABLE (AVX2)
1098 && CPU_FEATURE_USABLE (BMI2)
1099 && CPU_FEATURE_USABLE (MOVBE)
1100 && CPU_FEATURE_USABLE (RTM)),
1101 __wmemcmp_avx2_movbe_rtm)
1102 /* ISA V2 wrapper for SSE2 implementation because the SSE2
1103 implementation is also used at ISA level 2. */
1104 X86_IFUNC_IMPL_ADD_V2 (array, i, wmemcmp,
1105 1,
1106 __wmemcmp_sse2))
1107
1108 /* Support sysdeps/x86_64/multiarch/wmemset.c. */
1109 IFUNC_IMPL (i, name, wmemset,
1110 X86_IFUNC_IMPL_ADD_V4 (array, i, wmemset,
1111 (CPU_FEATURE_USABLE (AVX512VL)
1112 && CPU_FEATURE_USABLE (AVX512BW)
1113 && CPU_FEATURE_USABLE (BMI2)),
1114 __wmemset_evex_unaligned)
1115 X86_IFUNC_IMPL_ADD_V4 (array, i, wmemset,
1116 (CPU_FEATURE_USABLE (AVX512VL)
1117 && CPU_FEATURE_USABLE (AVX512BW)
1118 && CPU_FEATURE_USABLE (BMI2)),
1119 __wmemset_avx512_unaligned)
1120 X86_IFUNC_IMPL_ADD_V3 (array, i, wmemset,
1121 CPU_FEATURE_USABLE (AVX2),
1122 __wmemset_avx2_unaligned)
1123 X86_IFUNC_IMPL_ADD_V3 (array, i, wmemset,
1124 (CPU_FEATURE_USABLE (AVX2)
1125 && CPU_FEATURE_USABLE (RTM)),
1126 __wmemset_avx2_unaligned_rtm)
1127 /* ISA V2 wrapper for SSE2 implementation because the SSE2
1128 implementation is also used at ISA level 2. */
1129 X86_IFUNC_IMPL_ADD_V2 (array, i, wmemset, 1,
1130 __wmemset_sse2_unaligned))
1131
1132#ifdef SHARED
1133 /* Support sysdeps/x86_64/multiarch/memcpy_chk.c. */
1134 IFUNC_IMPL (i, name, __memcpy_chk,
1135 IFUNC_IMPL_ADD (array, i, __memcpy_chk, 1,
1136 __memcpy_chk_erms)
1137 X86_IFUNC_IMPL_ADD_V4 (array, i, __memcpy_chk,
1138 CPU_FEATURE_USABLE (AVX512F),
1139 __memcpy_chk_avx512_no_vzeroupper)
1140 X86_IFUNC_IMPL_ADD_V4 (array, i, __memcpy_chk,
1141 CPU_FEATURE_USABLE (AVX512VL),
1142 __memcpy_chk_avx512_unaligned)
1143 X86_IFUNC_IMPL_ADD_V4 (array, i, __memcpy_chk,
1144 CPU_FEATURE_USABLE (AVX512VL),
1145 __memcpy_chk_avx512_unaligned_erms)
1146 X86_IFUNC_IMPL_ADD_V4 (array, i, __memcpy_chk,
1147 CPU_FEATURE_USABLE (AVX512VL),
1148 __memcpy_chk_evex_unaligned)
1149 X86_IFUNC_IMPL_ADD_V4 (array, i, __memcpy_chk,
1150 CPU_FEATURE_USABLE (AVX512VL),
1151 __memcpy_chk_evex_unaligned_erms)
1152 X86_IFUNC_IMPL_ADD_V3 (array, i, __memcpy_chk,
1153 CPU_FEATURE_USABLE (AVX),
1154 __memcpy_chk_avx_unaligned)
1155 X86_IFUNC_IMPL_ADD_V3 (array, i, __memcpy_chk,
1156 CPU_FEATURE_USABLE (AVX),
1157 __memcpy_chk_avx_unaligned_erms)
1158 X86_IFUNC_IMPL_ADD_V3 (array, i, __memcpy_chk,
1159 (CPU_FEATURE_USABLE (AVX)
1160 && CPU_FEATURE_USABLE (RTM)),
1161 __memcpy_chk_avx_unaligned_rtm)
1162 X86_IFUNC_IMPL_ADD_V3 (array, i, __memcpy_chk,
1163 (CPU_FEATURE_USABLE (AVX)
1164 && CPU_FEATURE_USABLE (RTM)),
1165 __memcpy_chk_avx_unaligned_erms_rtm)
1166 /* By V3 we assume fast aligned copy. */
1167 X86_IFUNC_IMPL_ADD_V2 (array, i, __memcpy_chk,
1168 CPU_FEATURE_USABLE (SSSE3),
1169 __memcpy_chk_ssse3)
1170 /* ISA V2 wrapper for SSE2 implementation because the SSE2
1171 implementation is also used at ISA level 2 (SSSE3 is too
1172 optimized around aligned copy to be better as general
1173 purpose memmove). */
1174 X86_IFUNC_IMPL_ADD_V2 (array, i, __memcpy_chk, 1,
1175 __memcpy_chk_sse2_unaligned)
1176 X86_IFUNC_IMPL_ADD_V2 (array, i, __memcpy_chk, 1,
1177 __memcpy_chk_sse2_unaligned_erms))
1178#endif
1179
1180 /* Support sysdeps/x86_64/multiarch/memcpy.c. */
1181 IFUNC_IMPL (i, name, memcpy,
1182 IFUNC_IMPL_ADD (array, i, memcpy, 1,
1183 __memcpy_erms)
1184 X86_IFUNC_IMPL_ADD_V4 (array, i, memcpy,
1185 CPU_FEATURE_USABLE (AVX512F),
1186 __memcpy_avx512_no_vzeroupper)
1187 X86_IFUNC_IMPL_ADD_V4 (array, i, memcpy,
1188 CPU_FEATURE_USABLE (AVX512VL),
1189 __memcpy_avx512_unaligned)
1190 X86_IFUNC_IMPL_ADD_V4 (array, i, memcpy,
1191 CPU_FEATURE_USABLE (AVX512VL),
1192 __memcpy_avx512_unaligned_erms)
1193 X86_IFUNC_IMPL_ADD_V4 (array, i, memcpy,
1194 CPU_FEATURE_USABLE (AVX512VL),
1195 __memcpy_evex_unaligned)
1196 X86_IFUNC_IMPL_ADD_V4 (array, i, memcpy,
1197 CPU_FEATURE_USABLE (AVX512VL),
1198 __memcpy_evex_unaligned_erms)
1199 X86_IFUNC_IMPL_ADD_V3 (array, i, memcpy,
1200 CPU_FEATURE_USABLE (AVX),
1201 __memcpy_avx_unaligned)
1202 X86_IFUNC_IMPL_ADD_V3 (array, i, memcpy,
1203 CPU_FEATURE_USABLE (AVX),
1204 __memcpy_avx_unaligned_erms)
1205 X86_IFUNC_IMPL_ADD_V3 (array, i, memcpy,
1206 (CPU_FEATURE_USABLE (AVX)
1207 && CPU_FEATURE_USABLE (RTM)),
1208 __memcpy_avx_unaligned_rtm)
1209 X86_IFUNC_IMPL_ADD_V3 (array, i, memcpy,
1210 (CPU_FEATURE_USABLE (AVX)
1211 && CPU_FEATURE_USABLE (RTM)),
1212 __memcpy_avx_unaligned_erms_rtm)
1213 /* By V3 we assume fast aligned copy. */
1214 X86_IFUNC_IMPL_ADD_V2 (array, i, memcpy,
1215 CPU_FEATURE_USABLE (SSSE3),
1216 __memcpy_ssse3)
1217 /* ISA V2 wrapper for SSE2 implementation because the SSE2
1218 implementation is also used at ISA level 2 (SSSE3 is too
1219 optimized around aligned copy to be better as general
1220 purpose memmove). */
1221 X86_IFUNC_IMPL_ADD_V2 (array, i, memcpy, 1,
1222 __memcpy_sse2_unaligned)
1223 X86_IFUNC_IMPL_ADD_V2 (array, i, memcpy, 1,
1224 __memcpy_sse2_unaligned_erms))
1225
1226#ifdef SHARED
1227 /* Support sysdeps/x86_64/multiarch/mempcpy_chk.c. */
1228 IFUNC_IMPL (i, name, __mempcpy_chk,
1229 IFUNC_IMPL_ADD (array, i, __mempcpy_chk, 1,
1230 __mempcpy_chk_erms)
1231 X86_IFUNC_IMPL_ADD_V4 (array, i, __mempcpy_chk,
1232 CPU_FEATURE_USABLE (AVX512F),
1233 __mempcpy_chk_avx512_no_vzeroupper)
1234 X86_IFUNC_IMPL_ADD_V4 (array, i, __mempcpy_chk,
1235 CPU_FEATURE_USABLE (AVX512VL),
1236 __mempcpy_chk_avx512_unaligned)
1237 X86_IFUNC_IMPL_ADD_V4 (array, i, __mempcpy_chk,
1238 CPU_FEATURE_USABLE (AVX512VL),
1239 __mempcpy_chk_avx512_unaligned_erms)
1240 X86_IFUNC_IMPL_ADD_V4 (array, i, __mempcpy_chk,
1241 CPU_FEATURE_USABLE (AVX512VL),
1242 __mempcpy_chk_evex_unaligned)
1243 X86_IFUNC_IMPL_ADD_V4 (array, i, __mempcpy_chk,
1244 CPU_FEATURE_USABLE (AVX512VL),
1245 __mempcpy_chk_evex_unaligned_erms)
1246 X86_IFUNC_IMPL_ADD_V3 (array, i, __mempcpy_chk,
1247 CPU_FEATURE_USABLE (AVX),
1248 __mempcpy_chk_avx_unaligned)
1249 X86_IFUNC_IMPL_ADD_V3 (array, i, __mempcpy_chk,
1250 CPU_FEATURE_USABLE (AVX),
1251 __mempcpy_chk_avx_unaligned_erms)
1252 X86_IFUNC_IMPL_ADD_V3 (array, i, __mempcpy_chk,
1253 (CPU_FEATURE_USABLE (AVX)
1254 && CPU_FEATURE_USABLE (RTM)),
1255 __mempcpy_chk_avx_unaligned_rtm)
1256 X86_IFUNC_IMPL_ADD_V3 (array, i, __mempcpy_chk,
1257 (CPU_FEATURE_USABLE (AVX)
1258 && CPU_FEATURE_USABLE (RTM)),
1259 __mempcpy_chk_avx_unaligned_erms_rtm)
1260 /* By V3 we assume fast aligned copy. */
1261 X86_IFUNC_IMPL_ADD_V2 (array, i, __mempcpy_chk,
1262 CPU_FEATURE_USABLE (SSSE3),
1263 __mempcpy_chk_ssse3)
1264 /* ISA V2 wrapper for SSE2 implementation because the SSE2
1265 implementation is also used at ISA level 2 (SSSE3 is too
1266 optimized around aligned copy to be better as general
1267 purpose memmove). */
1268 X86_IFUNC_IMPL_ADD_V2 (array, i, __mempcpy_chk, 1,
1269 __mempcpy_chk_sse2_unaligned)
1270 X86_IFUNC_IMPL_ADD_V2 (array, i, __mempcpy_chk, 1,
1271 __mempcpy_chk_sse2_unaligned_erms))
1272#endif
1273
1274 /* Support sysdeps/x86_64/multiarch/mempcpy.c. */
1275 IFUNC_IMPL (i, name, mempcpy,
1276 IFUNC_IMPL_ADD (array, i, mempcpy, 1,
1277 __mempcpy_erms)
1278 X86_IFUNC_IMPL_ADD_V4 (array, i, mempcpy,
1279 CPU_FEATURE_USABLE (AVX512F),
1280 __mempcpy_avx512_no_vzeroupper)
1281 X86_IFUNC_IMPL_ADD_V4 (array, i, mempcpy,
1282 CPU_FEATURE_USABLE (AVX512VL),
1283 __mempcpy_avx512_unaligned)
1284 X86_IFUNC_IMPL_ADD_V4 (array, i, mempcpy,
1285 CPU_FEATURE_USABLE (AVX512VL),
1286 __mempcpy_avx512_unaligned_erms)
1287 X86_IFUNC_IMPL_ADD_V4 (array, i, mempcpy,
1288 CPU_FEATURE_USABLE (AVX512VL),
1289 __mempcpy_evex_unaligned)
1290 X86_IFUNC_IMPL_ADD_V4 (array, i, mempcpy,
1291 CPU_FEATURE_USABLE (AVX512VL),
1292 __mempcpy_evex_unaligned_erms)
1293 X86_IFUNC_IMPL_ADD_V3 (array, i, mempcpy,
1294 CPU_FEATURE_USABLE (AVX),
1295 __mempcpy_avx_unaligned)
1296 X86_IFUNC_IMPL_ADD_V3 (array, i, mempcpy,
1297 CPU_FEATURE_USABLE (AVX),
1298 __mempcpy_avx_unaligned_erms)
1299 X86_IFUNC_IMPL_ADD_V3 (array, i, mempcpy,
1300 (CPU_FEATURE_USABLE (AVX)
1301 && CPU_FEATURE_USABLE (RTM)),
1302 __mempcpy_avx_unaligned_rtm)
1303 X86_IFUNC_IMPL_ADD_V3 (array, i, mempcpy,
1304 (CPU_FEATURE_USABLE (AVX)
1305 && CPU_FEATURE_USABLE (RTM)),
1306 __mempcpy_avx_unaligned_erms_rtm)
1307 /* By V3 we assume fast aligned copy. */
1308 X86_IFUNC_IMPL_ADD_V2 (array, i, mempcpy,
1309 CPU_FEATURE_USABLE (SSSE3),
1310 __mempcpy_ssse3)
1311 /* ISA V2 wrapper for SSE2 implementation because the SSE2
1312 implementation is also used at ISA level 2 (SSSE3 is too
1313 optimized around aligned copy to be better as general
1314 purpose memmove). */
1315 X86_IFUNC_IMPL_ADD_V2 (array, i, mempcpy, 1,
1316 __mempcpy_sse2_unaligned)
1317 X86_IFUNC_IMPL_ADD_V2 (array, i, mempcpy, 1,
1318 __mempcpy_sse2_unaligned_erms))
1319
1320 /* Support sysdeps/x86_64/multiarch/strncmp.c. */
1321 IFUNC_IMPL (i, name, strncmp,
1322 X86_IFUNC_IMPL_ADD_V4 (array, i, strncmp,
1323 (CPU_FEATURE_USABLE (AVX512VL)
1324 && CPU_FEATURE_USABLE (AVX512BW)
1325 && CPU_FEATURE_USABLE (BMI2)),
1326 __strncmp_evex)
1327 X86_IFUNC_IMPL_ADD_V3 (array, i, strncmp,
1328 (CPU_FEATURE_USABLE (AVX2)
1329 && CPU_FEATURE_USABLE (BMI2)),
1330 __strncmp_avx2)
1331 X86_IFUNC_IMPL_ADD_V3 (array, i, strncmp,
1332 (CPU_FEATURE_USABLE (AVX2)
1333 && CPU_FEATURE_USABLE (BMI2)
1334 && CPU_FEATURE_USABLE (RTM)),
1335 __strncmp_avx2_rtm)
1336 X86_IFUNC_IMPL_ADD_V2 (array, i, strncmp,
1337 CPU_FEATURE_USABLE (SSE4_2),
1338 __strncmp_sse42)
1339 /* ISA V2 wrapper for SSE2 implementation because the SSE2
1340 implementation is also used at ISA level 2. */
1341 X86_IFUNC_IMPL_ADD_V2 (array, i, strncmp,
1342 1,
1343 __strncmp_sse2))
1344
1345#ifdef SHARED
1346 /* Support sysdeps/x86_64/multiarch/wmemset_chk.c. */
1347 IFUNC_IMPL (i, name, __wmemset_chk,
1348 X86_IFUNC_IMPL_ADD_V4 (array, i, __wmemset_chk,
1349 (CPU_FEATURE_USABLE (AVX512VL)
1350 && CPU_FEATURE_USABLE (AVX512BW)
1351 && CPU_FEATURE_USABLE (BMI2)),
1352 __wmemset_chk_evex_unaligned)
1353 X86_IFUNC_IMPL_ADD_V4 (array, i, __wmemset_chk,
1354 (CPU_FEATURE_USABLE (AVX512VL)
1355 && CPU_FEATURE_USABLE (AVX512BW)
1356 && CPU_FEATURE_USABLE (BMI2)),
1357 __wmemset_chk_avx512_unaligned)
1358 X86_IFUNC_IMPL_ADD_V3 (array, i, __wmemset_chk,
1359 CPU_FEATURE_USABLE (AVX2),
1360 __wmemset_chk_avx2_unaligned)
1361 X86_IFUNC_IMPL_ADD_V3 (array, i, __wmemset_chk,
1362 (CPU_FEATURE_USABLE (AVX2)
1363 && CPU_FEATURE_USABLE (RTM)),
1364 __wmemset_chk_avx2_unaligned_rtm)
1365 /* ISA V2 wrapper for SSE2 implementation because the SSE2
1366 implementation is also used at ISA level 2. */
1367 X86_IFUNC_IMPL_ADD_V2 (array, i, __wmemset_chk, 1,
1368 __wmemset_chk_sse2_unaligned))
1369#endif
1370
1371 return 0;
1372}
1373

source code of glibc/sysdeps/x86_64/multiarch/ifunc-impl-list.c