1 /* Enumerate available IFUNC implementations of a function. s390/s390x version.
2    Copyright (C) 2015-2021 Free Software Foundation, Inc.
3    This file is part of the GNU C Library.
4 
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
9 
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
14 
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library; if not, see
17    <https://www.gnu.org/licenses/>.  */
18 
19 #include <assert.h>
20 #include <string.h>
21 #include <wchar.h>
22 #include <ifunc-impl-list.h>
23 #include <ifunc-resolve.h>
24 #include <ifunc-memset.h>
25 #include <ifunc-memcmp.h>
26 #include <ifunc-memcpy.h>
27 #include <ifunc-strstr.h>
28 #include <ifunc-memmem.h>
29 #include <ifunc-strlen.h>
30 #include <ifunc-strnlen.h>
31 #include <ifunc-strcpy.h>
32 #include <ifunc-stpcpy.h>
33 #include <ifunc-strncpy.h>
34 #include <ifunc-stpncpy.h>
35 #include <ifunc-strcat.h>
36 #include <ifunc-strncat.h>
37 #include <ifunc-strcmp.h>
38 #include <ifunc-strncmp.h>
39 #include <ifunc-strchr.h>
40 #include <ifunc-strchrnul.h>
41 #include <ifunc-strrchr.h>
42 #include <ifunc-strspn.h>
43 #include <ifunc-strpbrk.h>
44 #include <ifunc-strcspn.h>
45 #include <ifunc-memchr.h>
46 #include <ifunc-rawmemchr.h>
47 #include <ifunc-memccpy.h>
48 #include <ifunc-memrchr.h>
49 #include <ifunc-wcslen.h>
50 #include <ifunc-wcsnlen.h>
51 #include <ifunc-wcscpy.h>
52 #include <ifunc-wcpcpy.h>
53 #include <ifunc-wcsncpy.h>
54 #include <ifunc-wcpncpy.h>
55 #include <ifunc-wcscat.h>
56 #include <ifunc-wcsncat.h>
57 #include <ifunc-wcscmp.h>
58 #include <ifunc-wcsncmp.h>
59 #include <ifunc-wcschr.h>
60 #include <ifunc-wcschrnul.h>
61 #include <ifunc-wcsrchr.h>
62 #include <ifunc-wcsspn.h>
63 #include <ifunc-wcspbrk.h>
64 #include <ifunc-wcscspn.h>
65 #include <ifunc-wmemchr.h>
66 #include <ifunc-wmemset.h>
67 #include <ifunc-wmemcmp.h>
68 
69 /* Maximum number of IFUNC implementations.  */
70 #define MAX_IFUNC	3
71 
72 /* Fill ARRAY of MAX elements with IFUNC implementations for function
73    NAME supported on target machine and return the number of valid
74    entries.  */
75 size_t
__libc_ifunc_impl_list(const char * name,struct libc_ifunc_impl * array,size_t max)76 __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
77 			size_t max)
78 {
79   assert (max >= MAX_IFUNC);
80 
81   size_t i = 0;
82 
83   /* Get hardware information.  */
84   unsigned long int dl_hwcap = GLRO (dl_hwcap);
85   unsigned long long stfle_bits = 0ULL;
86   if ((dl_hwcap & HWCAP_S390_STFLE)
87 	&& (dl_hwcap & HWCAP_S390_ZARCH)
88 	&& (dl_hwcap & HWCAP_S390_HIGH_GPRS))
89     {
90       S390_STORE_STFLE (stfle_bits);
91     }
92 
93 #if HAVE_MEMSET_IFUNC
94   IFUNC_IMPL (i, name, memset,
95 # if HAVE_MEMSET_Z196
96 	      IFUNC_IMPL_ADD (array, i, memset,
97 			      S390_IS_Z196 (stfle_bits), MEMSET_Z196)
98 # endif
99 # if HAVE_MEMSET_Z10
100 	      IFUNC_IMPL_ADD (array, i, memset,
101 			      S390_IS_Z10 (stfle_bits), MEMSET_Z10)
102 # endif
103 # if HAVE_MEMSET_Z900_G5
104 	      IFUNC_IMPL_ADD (array, i, memset, 1, MEMSET_Z900_G5)
105 # endif
106 	      )
107 
108   /* Note: bzero is implemented in memset.  */
109   IFUNC_IMPL (i, name, bzero,
110 # if HAVE_MEMSET_Z196
111 	      IFUNC_IMPL_ADD (array, i, bzero,
112 			      S390_IS_Z196 (stfle_bits), BZERO_Z196)
113 # endif
114 # if HAVE_MEMSET_Z10
115 	      IFUNC_IMPL_ADD (array, i, bzero,
116 			      S390_IS_Z10 (stfle_bits), BZERO_Z10)
117 # endif
118 # if HAVE_MEMSET_Z900_G5
119 	      IFUNC_IMPL_ADD (array, i, bzero, 1, BZERO_Z900_G5)
120 # endif
121 	      )
122 #endif /* HAVE_MEMSET_IFUNC */
123 
124 #if HAVE_MEMCMP_IFUNC
125   IFUNC_IMPL (i, name, memcmp,
126 # if HAVE_MEMCMP_Z196
127 	      IFUNC_IMPL_ADD (array, i, memcmp,
128 			      S390_IS_Z196 (stfle_bits), MEMCMP_Z196)
129 # endif
130 # if HAVE_MEMCMP_Z10
131 	      IFUNC_IMPL_ADD (array, i, memcmp,
132 			      S390_IS_Z10 (stfle_bits), MEMCMP_Z10)
133 # endif
134 # if HAVE_MEMCMP_Z900_G5
135 	      IFUNC_IMPL_ADD (array, i, memcmp, 1, MEMCMP_Z900_G5)
136 # endif
137 	      )
138 #endif /* HAVE_MEMCMP_IFUNC */
139 
140 #if HAVE_MEMCPY_IFUNC
141   IFUNC_IMPL (i, name, memcpy,
142 # if HAVE_MEMCPY_Z196
143 	      IFUNC_IMPL_ADD (array, i, memcpy,
144 			      S390_IS_Z196 (stfle_bits), MEMCPY_Z196)
145 # endif
146 # if HAVE_MEMCPY_Z10
147 	      IFUNC_IMPL_ADD (array, i, memcpy,
148 			      S390_IS_Z10 (stfle_bits), MEMCPY_Z10)
149 # endif
150 # if HAVE_MEMCPY_Z900_G5
151 	      IFUNC_IMPL_ADD (array, i, memcpy, 1, MEMCPY_Z900_G5)
152 # endif
153 	      )
154 
155   IFUNC_IMPL (i, name, mempcpy,
156 # if HAVE_MEMCPY_Z196
157 	      IFUNC_IMPL_ADD (array, i, mempcpy,
158 			      S390_IS_Z196 (stfle_bits), MEMPCPY_Z196)
159 # endif
160 # if HAVE_MEMCPY_Z10
161 	      IFUNC_IMPL_ADD (array, i, mempcpy,
162 			      S390_IS_Z10 (stfle_bits), MEMPCPY_Z10)
163 # endif
164 # if HAVE_MEMCPY_Z900_G5
165 	      IFUNC_IMPL_ADD (array, i, mempcpy, 1, MEMPCPY_Z900_G5)
166 # endif
167 	      )
168 #endif /* HAVE_MEMCPY_IFUNC  */
169 
170 #if HAVE_MEMMOVE_IFUNC
171     IFUNC_IMPL (i, name, memmove,
172 # if HAVE_MEMMOVE_ARCH13
173 		IFUNC_IMPL_ADD (array, i, memmove,
174 				((dl_hwcap & HWCAP_S390_VXRS_EXT2)
175 				 && S390_IS_ARCH13_MIE3 (stfle_bits)),
176 				MEMMOVE_ARCH13)
177 # endif
178 # if HAVE_MEMMOVE_Z13
179 		IFUNC_IMPL_ADD (array, i, memmove,
180 				dl_hwcap & HWCAP_S390_VX, MEMMOVE_Z13)
181 # endif
182 # if HAVE_MEMMOVE_C
183 		IFUNC_IMPL_ADD (array, i, memmove, 1, MEMMOVE_C)
184 # endif
185 		)
186 #endif /* HAVE_MEMMOVE_IFUNC  */
187 
188 #if HAVE_STRSTR_IFUNC
189     IFUNC_IMPL (i, name, strstr,
190 # if HAVE_STRSTR_ARCH13
191 		IFUNC_IMPL_ADD (array, i, strstr,
192 				dl_hwcap & HWCAP_S390_VXRS_EXT2, STRSTR_ARCH13)
193 # endif
194 # if HAVE_STRSTR_Z13
195 		IFUNC_IMPL_ADD (array, i, strstr,
196 				dl_hwcap & HWCAP_S390_VX, STRSTR_Z13)
197 # endif
198 # if HAVE_STRSTR_C
199 		IFUNC_IMPL_ADD (array, i, strstr, 1, STRSTR_C)
200 # endif
201 		)
202 #endif /* HAVE_STRSTR_IFUNC  */
203 
204 #if HAVE_MEMMEM_IFUNC
205     IFUNC_IMPL (i, name, memmem,
206 # if HAVE_MEMMEM_ARCH13
207 	      IFUNC_IMPL_ADD (array, i, memmem,
208 			      dl_hwcap & HWCAP_S390_VXRS_EXT2, MEMMEM_ARCH13)
209 # endif
210 # if HAVE_MEMMEM_Z13
211 		IFUNC_IMPL_ADD (array, i, memmem,
212 				dl_hwcap & HWCAP_S390_VX, MEMMEM_Z13)
213 # endif
214 # if HAVE_MEMMEM_C
215 		IFUNC_IMPL_ADD (array, i, memmem, 1, MEMMEM_C)
216 # endif
217 		)
218 #endif /* HAVE_MEMMEM_IFUNC  */
219 
220 #if HAVE_STRLEN_IFUNC
221     IFUNC_IMPL (i, name, strlen,
222 # if HAVE_STRLEN_Z13
223 		IFUNC_IMPL_ADD (array, i, strlen,
224 				dl_hwcap & HWCAP_S390_VX, STRLEN_Z13)
225 # endif
226 # if HAVE_STRLEN_C
227 		IFUNC_IMPL_ADD (array, i, strlen, 1, STRLEN_C)
228 # endif
229 		)
230 #endif /* HAVE_STRLEN_IFUNC  */
231 
232 #if HAVE_STRNLEN_IFUNC
233     IFUNC_IMPL (i, name, strnlen,
234 # if HAVE_STRNLEN_Z13
235 		IFUNC_IMPL_ADD (array, i, strnlen,
236 				dl_hwcap & HWCAP_S390_VX, STRNLEN_Z13)
237 # endif
238 # if HAVE_STRNLEN_C
239 		IFUNC_IMPL_ADD (array, i, strnlen, 1, STRNLEN_C)
240 # endif
241 		)
242 #endif /* HAVE_STRNLEN_IFUNC  */
243 
244 #if HAVE_STRCPY_IFUNC
245     IFUNC_IMPL (i, name, strcpy,
246 # if HAVE_STRCPY_Z13
247 		IFUNC_IMPL_ADD (array, i, strcpy,
248 				dl_hwcap & HWCAP_S390_VX, STRCPY_Z13)
249 # endif
250 # if HAVE_STRCPY_Z900_G5
251 		IFUNC_IMPL_ADD (array, i, strcpy, 1, STRCPY_Z900_G5)
252 # endif
253 		)
254 #endif /* HAVE_STRCPY_IFUNC  */
255 
256 #if HAVE_STPCPY_IFUNC
257     IFUNC_IMPL (i, name, stpcpy,
258 # if HAVE_STPCPY_Z13
259 		IFUNC_IMPL_ADD (array, i, stpcpy,
260 				dl_hwcap & HWCAP_S390_VX, STPCPY_Z13)
261 # endif
262 # if HAVE_STPCPY_C
263 		IFUNC_IMPL_ADD (array, i, stpcpy, 1, STPCPY_C)
264 # endif
265 		)
266 #endif /* HAVE_STPCPY_IFUNC  */
267 
268 #if HAVE_STRNCPY_IFUNC
269     IFUNC_IMPL (i, name, strncpy,
270 # if HAVE_STRNCPY_Z13
271 		IFUNC_IMPL_ADD (array, i, strncpy,
272 				dl_hwcap & HWCAP_S390_VX, STRNCPY_Z13)
273 # endif
274 # if HAVE_STRNCPY_Z900_G5
275 		IFUNC_IMPL_ADD (array, i, strncpy, 1, STRNCPY_Z900_G5)
276 # endif
277 		)
278 #endif /* HAVE_STRNCPY_IFUNC  */
279 
280 #if HAVE_STPNCPY_IFUNC
281     IFUNC_IMPL (i, name, stpncpy,
282 # if HAVE_STPNCPY_Z13
283 		IFUNC_IMPL_ADD (array, i, stpncpy,
284 				dl_hwcap & HWCAP_S390_VX, STPNCPY_Z13)
285 # endif
286 # if HAVE_STPNCPY_C
287 		IFUNC_IMPL_ADD (array, i, stpncpy, 1, STPNCPY_C)
288 # endif
289 		)
290 #endif /* HAVE_STPNCPY_IFUNC  */
291 
292 #if HAVE_STRCAT_IFUNC
293     IFUNC_IMPL (i, name, strcat,
294 # if HAVE_STRCAT_Z13
295 		IFUNC_IMPL_ADD (array, i, strcat,
296 				dl_hwcap & HWCAP_S390_VX, STRCAT_Z13)
297 # endif
298 # if HAVE_STRCAT_C
299 		IFUNC_IMPL_ADD (array, i, strcat, 1, STRCAT_C)
300 # endif
301 		)
302 #endif /* HAVE_STRCAT_IFUNC  */
303 
304 #if HAVE_STRNCAT_IFUNC
305     IFUNC_IMPL (i, name, strncat,
306 # if HAVE_STRNCAT_Z13
307 		IFUNC_IMPL_ADD (array, i, strncat,
308 				dl_hwcap & HWCAP_S390_VX, STRNCAT_Z13)
309 # endif
310 # if HAVE_STRNCAT_C
311 		IFUNC_IMPL_ADD (array, i, strncat, 1, STRNCAT_C)
312 # endif
313 		)
314 #endif /* HAVE_STRNCAT_IFUNC  */
315 
316 #if HAVE_STRCMP_IFUNC
317     IFUNC_IMPL (i, name, strcmp,
318 # if HAVE_STRCMP_Z13
319 		IFUNC_IMPL_ADD (array, i, strcmp,
320 				dl_hwcap & HWCAP_S390_VX, STRCMP_Z13)
321 # endif
322 # if HAVE_STRCMP_Z900_G5
323 		IFUNC_IMPL_ADD (array, i, strcmp, 1, STRCMP_Z900_G5)
324 # endif
325 		)
326 #endif /* HAVE_STRCMP_IFUNC  */
327 
328 #if HAVE_STRNCMP_IFUNC
329     IFUNC_IMPL (i, name, strncmp,
330 # if HAVE_STRNCMP_Z13
331 		IFUNC_IMPL_ADD (array, i, strncmp,
332 				dl_hwcap & HWCAP_S390_VX, STRNCMP_Z13)
333 # endif
334 # if HAVE_STRNCMP_C
335 		IFUNC_IMPL_ADD (array, i, strncmp, 1, STRNCMP_C)
336 # endif
337 		)
338 #endif /* HAVE_STRNCMP_IFUNC  */
339 
340 #if HAVE_STRCHR_IFUNC
341     IFUNC_IMPL (i, name, strchr,
342 # if HAVE_STRCHR_Z13
343 		IFUNC_IMPL_ADD (array, i, strchr,
344 				dl_hwcap & HWCAP_S390_VX, STRCHR_Z13)
345 # endif
346 # if HAVE_STRCHR_C
347 		IFUNC_IMPL_ADD (array, i, strchr, 1, STRCHR_C)
348 # endif
349 		)
350 #endif /* HAVE_STRCHR_IFUNC  */
351 
352 #if HAVE_STRCHRNUL_IFUNC
353     IFUNC_IMPL (i, name, strchrnul,
354 # if HAVE_STRCHRNUL_Z13
355 		IFUNC_IMPL_ADD (array, i, strchrnul,
356 				dl_hwcap & HWCAP_S390_VX, STRCHRNUL_Z13)
357 # endif
358 # if HAVE_STRCHRNUL_C
359 		IFUNC_IMPL_ADD (array, i, strchrnul, 1, STRCHRNUL_C)
360 # endif
361 		)
362 #endif /* HAVE_STRCHRNUL_IFUNC  */
363 
364 #if HAVE_STRRCHR_IFUNC
365     IFUNC_IMPL (i, name, strrchr,
366 # if HAVE_STRRCHR_Z13
367 		IFUNC_IMPL_ADD (array, i, strrchr,
368 				dl_hwcap & HWCAP_S390_VX, STRRCHR_Z13)
369 # endif
370 # if HAVE_STRRCHR_C
371 		IFUNC_IMPL_ADD (array, i, strrchr, 1, STRRCHR_C)
372 # endif
373 		)
374 #endif /* HAVE_STRRCHR_IFUNC  */
375 
376 #if HAVE_STRSPN_IFUNC
377     IFUNC_IMPL (i, name, strspn,
378 # if HAVE_STRSPN_Z13
379 		IFUNC_IMPL_ADD (array, i, strspn,
380 				dl_hwcap & HWCAP_S390_VX, STRSPN_Z13)
381 # endif
382 # if HAVE_STRSPN_C
383 		IFUNC_IMPL_ADD (array, i, strspn, 1, STRSPN_C)
384 # endif
385 		)
386 #endif /* HAVE_STRSPN_IFUNC  */
387 
388 #if HAVE_STRPBRK_IFUNC
389     IFUNC_IMPL (i, name, strpbrk,
390 # if HAVE_STRPBRK_Z13
391 		IFUNC_IMPL_ADD (array, i, strpbrk,
392 				dl_hwcap & HWCAP_S390_VX, STRPBRK_Z13)
393 # endif
394 # if HAVE_STRPBRK_C
395 		IFUNC_IMPL_ADD (array, i, strpbrk, 1, STRPBRK_C)
396 # endif
397 		)
398 #endif /* HAVE_STRPBRK_IFUNC  */
399 
400 #if HAVE_STRCSPN_IFUNC
401     IFUNC_IMPL (i, name, strcspn,
402 # if HAVE_STRCSPN_Z13
403 		IFUNC_IMPL_ADD (array, i, strcspn,
404 				dl_hwcap & HWCAP_S390_VX, STRCSPN_Z13)
405 # endif
406 # if HAVE_STRCSPN_C
407 		IFUNC_IMPL_ADD (array, i, strcspn, 1, STRCSPN_C)
408 # endif
409 		)
410 #endif /* HAVE_STRCSPN_IFUNC  */
411 
412 #if HAVE_MEMCHR_IFUNC
413     IFUNC_IMPL (i, name, memchr,
414 # if HAVE_MEMCHR_Z13
415 		IFUNC_IMPL_ADD (array, i, memchr,
416 				dl_hwcap & HWCAP_S390_VX, MEMCHR_Z13)
417 # endif
418 # if HAVE_MEMCHR_Z900_G5
419 		IFUNC_IMPL_ADD (array, i, memchr, 1, MEMCHR_Z900_G5)
420 # endif
421 		)
422 #endif /* HAVE_MEMCHR_IFUNC  */
423 
424 #if HAVE_RAWMEMCHR_IFUNC
425     IFUNC_IMPL (i, name, rawmemchr,
426 # if HAVE_RAWMEMCHR_Z13
427 		IFUNC_IMPL_ADD (array, i, rawmemchr,
428 				dl_hwcap & HWCAP_S390_VX, RAWMEMCHR_Z13)
429 # endif
430 # if HAVE_RAWMEMCHR_C
431 		IFUNC_IMPL_ADD (array, i, rawmemchr, 1, RAWMEMCHR_C)
432 # endif
433 		)
434 #endif /* HAVE_RAWMEMCHR_IFUNC  */
435 
436 #if HAVE_MEMCCPY_IFUNC
437     IFUNC_IMPL (i, name, memccpy,
438 # if HAVE_MEMCCPY_Z13
439 		IFUNC_IMPL_ADD (array, i, memccpy,
440 				dl_hwcap & HWCAP_S390_VX, MEMCCPY_Z13)
441 # endif
442 # if HAVE_MEMCCPY_C
443 		IFUNC_IMPL_ADD (array, i, memccpy, 1, MEMCCPY_C)
444 # endif
445 		)
446 #endif /* HAVE_MEMCCPY_IFUNC  */
447 
448 #if HAVE_MEMRCHR_IFUNC
449     IFUNC_IMPL (i, name, memrchr,
450 # if HAVE_MEMRCHR_Z13
451 		IFUNC_IMPL_ADD (array, i, memrchr,
452 				dl_hwcap & HWCAP_S390_VX, MEMRCHR_Z13)
453 # endif
454 # if HAVE_MEMRCHR_C
455 		IFUNC_IMPL_ADD (array, i, memrchr, 1, MEMRCHR_C)
456 # endif
457 		)
458 #endif /* HAVE_MEMRCHR_IFUNC  */
459 
460 #if HAVE_WCSLEN_IFUNC
461     IFUNC_IMPL (i, name, wcslen,
462 # if HAVE_WCSLEN_Z13
463 		IFUNC_IMPL_ADD (array, i, wcslen,
464 				dl_hwcap & HWCAP_S390_VX, WCSLEN_Z13)
465 # endif
466 # if HAVE_WCSLEN_C
467 		IFUNC_IMPL_ADD (array, i, wcslen, 1, WCSLEN_C)
468 # endif
469 		)
470 #endif /* HAVE_WCSLEN_IFUNC  */
471 
472 #if HAVE_WCSNLEN_IFUNC
473     IFUNC_IMPL (i, name, wcsnlen,
474 # if HAVE_WCSNLEN_Z13
475 		IFUNC_IMPL_ADD (array, i, wcsnlen,
476 				dl_hwcap & HWCAP_S390_VX, WCSNLEN_Z13)
477 # endif
478 # if HAVE_WCSNLEN_C
479 		IFUNC_IMPL_ADD (array, i, wcsnlen, 1, WCSNLEN_C)
480 # endif
481 		)
482 #endif /* HAVE_WCSNLEN_IFUNC  */
483 
484 #if HAVE_WCSCPY_IFUNC
485     IFUNC_IMPL (i, name, wcscpy,
486 # if HAVE_WCSCPY_Z13
487 		IFUNC_IMPL_ADD (array, i, wcscpy,
488 				dl_hwcap & HWCAP_S390_VX, WCSCPY_Z13)
489 # endif
490 # if HAVE_WCSCPY_C
491 		IFUNC_IMPL_ADD (array, i, wcscpy, 1, WCSCPY_C)
492 # endif
493 		)
494 #endif /* HAVE_WCSCPY_IFUNC  */
495 
496 #if HAVE_WCPCPY_IFUNC
497     IFUNC_IMPL (i, name, wcpcpy,
498 # if HAVE_WCPCPY_Z13
499 		IFUNC_IMPL_ADD (array, i, wcpcpy,
500 				dl_hwcap & HWCAP_S390_VX, WCPCPY_Z13)
501 # endif
502 # if HAVE_WCPCPY_C
503 		IFUNC_IMPL_ADD (array, i, wcpcpy, 1, WCPCPY_C)
504 # endif
505 		)
506 #endif /* HAVE_WCPCPY_IFUNC  */
507 
508 #if HAVE_WCSNCPY_IFUNC
509     IFUNC_IMPL (i, name, wcsncpy,
510 # if HAVE_WCSNCPY_Z13
511 		IFUNC_IMPL_ADD (array, i, wcsncpy,
512 				dl_hwcap & HWCAP_S390_VX, WCSNCPY_Z13)
513 # endif
514 # if HAVE_WCSNCPY_C
515 		IFUNC_IMPL_ADD (array, i, wcsncpy, 1, WCSNCPY_C)
516 # endif
517 		)
518 #endif /* HAVE_WCSNCPY_IFUNC  */
519 
520 #if HAVE_WCPNCPY_IFUNC
521     IFUNC_IMPL (i, name, wcpncpy,
522 # if HAVE_WCPNCPY_Z13
523 		IFUNC_IMPL_ADD (array, i, wcpncpy,
524 				dl_hwcap & HWCAP_S390_VX, WCPNCPY_Z13)
525 # endif
526 # if HAVE_WCPNCPY_C
527 		IFUNC_IMPL_ADD (array, i, wcpncpy, 1, WCPNCPY_C)
528 # endif
529 		)
530 #endif /* HAVE_WCPNCPY_IFUNC  */
531 
532 #if HAVE_WCSCAT_IFUNC
533     IFUNC_IMPL (i, name, wcscat,
534 # if HAVE_WCSCAT_Z13
535 		IFUNC_IMPL_ADD (array, i, wcscat,
536 				dl_hwcap & HWCAP_S390_VX, WCSCAT_Z13)
537 # endif
538 # if HAVE_WCSCAT_C
539 		IFUNC_IMPL_ADD (array, i, wcscat, 1, WCSCAT_C)
540 # endif
541 		)
542 #endif /* HAVE_WCSCAT_IFUNC  */
543 
544 #if HAVE_WCSNCAT_IFUNC
545     IFUNC_IMPL (i, name, wcsncat,
546 # if HAVE_WCSNCAT_Z13
547 		IFUNC_IMPL_ADD (array, i, wcsncat,
548 				dl_hwcap & HWCAP_S390_VX, WCSNCAT_Z13)
549 # endif
550 # if HAVE_WCSNCAT_C
551 		IFUNC_IMPL_ADD (array, i, wcsncat, 1, WCSNCAT_C)
552 # endif
553 		)
554 #endif /* HAVE_WCSNCAT_IFUNC  */
555 
556 #if HAVE_WCSCMP_IFUNC
557     IFUNC_IMPL (i, name, wcscmp,
558 # if HAVE_WCSCMP_Z13
559 		IFUNC_IMPL_ADD (array, i, wcscmp,
560 				dl_hwcap & HWCAP_S390_VX, WCSCMP_Z13)
561 # endif
562 # if HAVE_WCSCMP_C
563 		IFUNC_IMPL_ADD (array, i, wcscmp, 1, WCSCMP_C)
564 # endif
565 		)
566 #endif /* HAVE_WCSCMP_IFUNC  */
567 
568 #if HAVE_WCSNCMP_IFUNC
569     IFUNC_IMPL (i, name, wcsncmp,
570 # if HAVE_WCSNCMP_Z13
571 		IFUNC_IMPL_ADD (array, i, wcsncmp,
572 				dl_hwcap & HWCAP_S390_VX, WCSNCMP_Z13)
573 # endif
574 # if HAVE_WCSNCMP_C
575 		IFUNC_IMPL_ADD (array, i, wcsncmp, 1, WCSNCMP_C)
576 # endif
577 		)
578 #endif /* HAVE_WCSNCMP_IFUNC  */
579 
580 #if HAVE_WCSCHR_IFUNC
581     IFUNC_IMPL (i, name, wcschr,
582 # if HAVE_WCSCHR_Z13
583 		IFUNC_IMPL_ADD (array, i, wcschr,
584 				dl_hwcap & HWCAP_S390_VX, WCSCHR_Z13)
585 # endif
586 # if HAVE_WCSCHR_C
587 		IFUNC_IMPL_ADD (array, i, wcschr, 1, WCSCHR_C)
588 # endif
589 		)
590 #endif /* HAVE_WCSCHR_IFUNC  */
591 
592 #if HAVE_WCSCHRNUL_IFUNC
593     IFUNC_IMPL (i, name, wcschrnul,
594 # if HAVE_WCSCHRNUL_Z13
595 		IFUNC_IMPL_ADD (array, i, wcschrnul,
596 				dl_hwcap & HWCAP_S390_VX, WCSCHRNUL_Z13)
597 # endif
598 # if HAVE_WCSCHRNUL_C
599 		IFUNC_IMPL_ADD (array, i, wcschrnul, 1, WCSCHRNUL_C)
600 # endif
601 		)
602 #endif /* HAVE_WCSCHRNUL_IFUNC  */
603 
604 #if HAVE_WCSRCHR_IFUNC
605     IFUNC_IMPL (i, name, wcsrchr,
606 # if HAVE_WCSRCHR_Z13
607 		IFUNC_IMPL_ADD (array, i, wcsrchr,
608 				dl_hwcap & HWCAP_S390_VX, WCSRCHR_Z13)
609 # endif
610 # if HAVE_WCSRCHR_C
611 		IFUNC_IMPL_ADD (array, i, wcsrchr, 1, WCSRCHR_C)
612 # endif
613 		)
614 #endif /* HAVE_WCSRCHR_IFUNC  */
615 
616 #if HAVE_WCSSPN_IFUNC
617     IFUNC_IMPL (i, name, wcsspn,
618 # if HAVE_WCSSPN_Z13
619 		IFUNC_IMPL_ADD (array, i, wcsspn,
620 				dl_hwcap & HWCAP_S390_VX, WCSSPN_Z13)
621 # endif
622 # if HAVE_WCSSPN_C
623 		IFUNC_IMPL_ADD (array, i, wcsspn, 1, WCSSPN_C)
624 # endif
625 		)
626 #endif /* HAVE_WCSSPN_IFUNC  */
627 
628 #if HAVE_WCSPBRK_IFUNC
629     IFUNC_IMPL (i, name, wcspbrk,
630 # if HAVE_WCSPBRK_Z13
631 		IFUNC_IMPL_ADD (array, i, wcspbrk,
632 				dl_hwcap & HWCAP_S390_VX, WCSPBRK_Z13)
633 # endif
634 # if HAVE_WCSPBRK_C
635 		IFUNC_IMPL_ADD (array, i, wcspbrk, 1, WCSPBRK_C)
636 # endif
637 		)
638 #endif /* HAVE_WCSPBRK_IFUNC  */
639 
640 #if HAVE_WCSCSPN_IFUNC
641     IFUNC_IMPL (i, name, wcscspn,
642 # if HAVE_WCSCSPN_Z13
643 		IFUNC_IMPL_ADD (array, i, wcscspn,
644 				dl_hwcap & HWCAP_S390_VX, WCSCSPN_Z13)
645 # endif
646 # if HAVE_WCSCSPN_C
647 		IFUNC_IMPL_ADD (array, i, wcscspn, 1, WCSCSPN_C)
648 # endif
649 		)
650 #endif /* HAVE_WCSCSPN_IFUNC  */
651 
652 #if HAVE_WMEMCHR_IFUNC
653     IFUNC_IMPL (i, name, wmemchr,
654 # if HAVE_WMEMCHR_Z13
655 		IFUNC_IMPL_ADD (array, i, wmemchr,
656 				dl_hwcap & HWCAP_S390_VX, WMEMCHR_Z13)
657 # endif
658 # if HAVE_WMEMCHR_C
659 		IFUNC_IMPL_ADD (array, i, wmemchr, 1, WMEMCHR_C)
660 # endif
661 		)
662 #endif /* HAVE_WMEMCHR_IFUNC  */
663 
664 #if HAVE_WMEMSET_IFUNC
665     IFUNC_IMPL (i, name, wmemset,
666 # if HAVE_WMEMSET_Z13
667 		IFUNC_IMPL_ADD (array, i, wmemset,
668 				dl_hwcap & HWCAP_S390_VX, WMEMSET_Z13)
669 # endif
670 # if HAVE_WMEMSET_C
671 		IFUNC_IMPL_ADD (array, i, wmemset, 1, WMEMSET_C)
672 # endif
673 		)
674 #endif /* HAVE_WMEMSET_IFUNC  */
675 
676 #if HAVE_WMEMCMP_IFUNC
677     IFUNC_IMPL (i, name, wmemcmp,
678 # if HAVE_WMEMCMP_Z13
679 		IFUNC_IMPL_ADD (array, i, wmemcmp,
680 				dl_hwcap & HWCAP_S390_VX, WMEMCMP_Z13)
681 # endif
682 # if HAVE_WMEMCMP_C
683 		IFUNC_IMPL_ADD (array, i, wmemcmp, 1, WMEMCMP_C)
684 # endif
685 		)
686 #endif /* HAVE_WMEMCMP_IFUNC  */
687 
688   return i;
689 }
690