1 /* Enumerate available IFUNC implementations of a function.  PowerPC64 version.
2    Copyright (C) 2013-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 <ldsodefs.h>
23 #include <ifunc-impl-list.h>
24 
25 /* Maximum number of IFUNC implementations.  */
26 #define MAX_IFUNC	6
27 
28 size_t
__libc_ifunc_impl_list(const char * name,struct libc_ifunc_impl * array,size_t max)29 __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
30 			size_t max)
31 {
32   assert (max >= MAX_IFUNC);
33 
34   size_t i = 0;
35 
36   unsigned long int hwcap = GLRO(dl_hwcap);
37   unsigned long int hwcap2 = GLRO(dl_hwcap2);
38 #ifdef SHARED
39   int cacheline_size = GLRO(dl_cache_line_size);
40 #endif
41 
42   /* hwcap contains only the latest supported ISA, the code checks which is
43      and fills the previous supported ones.  */
44   if (hwcap & PPC_FEATURE_ARCH_2_06)
45     hwcap |= PPC_FEATURE_ARCH_2_05 | PPC_FEATURE_POWER5_PLUS |
46              PPC_FEATURE_POWER5 | PPC_FEATURE_POWER4;
47   else if (hwcap & PPC_FEATURE_ARCH_2_05)
48     hwcap |= PPC_FEATURE_POWER5_PLUS | PPC_FEATURE_POWER5 | PPC_FEATURE_POWER4;
49   else if (hwcap & PPC_FEATURE_POWER5_PLUS)
50     hwcap |= PPC_FEATURE_POWER5 | PPC_FEATURE_POWER4;
51   else if (hwcap & PPC_FEATURE_POWER5)
52     hwcap |= PPC_FEATURE_POWER4;
53 
54 #ifdef SHARED
55   /* Support sysdeps/powerpc/powerpc64/multiarch/memcpy.c.  */
56   IFUNC_IMPL (i, name, memcpy,
57 #ifdef __LITTLE_ENDIAN__
58 	      IFUNC_IMPL_ADD (array, i, memcpy,
59 			      hwcap2 & PPC_FEATURE2_ARCH_3_1
60 			      && hwcap & PPC_FEATURE_HAS_VSX,
61 			      __memcpy_power10)
62 #endif
63 	      IFUNC_IMPL_ADD (array, i, memcpy, hwcap2 & PPC_FEATURE2_ARCH_2_07
64 			      && hwcap & PPC_FEATURE_HAS_ALTIVEC,
65 			      __memcpy_power8_cached)
66 	      IFUNC_IMPL_ADD (array, i, memcpy, hwcap & PPC_FEATURE_ARCH_2_06
67 			      && hwcap & PPC_FEATURE_HAS_ALTIVEC,
68 			      __memcpy_power7)
69 	      IFUNC_IMPL_ADD (array, i, memcpy, hwcap & PPC_FEATURE_ARCH_2_06,
70 			      __memcpy_a2)
71 	      IFUNC_IMPL_ADD (array, i, memcpy, hwcap & PPC_FEATURE_ARCH_2_05,
72 			      __memcpy_power6)
73 	      IFUNC_IMPL_ADD (array, i, memcpy, hwcap & PPC_FEATURE_CELL_BE,
74 			      __memcpy_cell)
75 	      IFUNC_IMPL_ADD (array, i, memcpy, hwcap & PPC_FEATURE_POWER4,
76 			      __memcpy_power4)
77 	      IFUNC_IMPL_ADD (array, i, memcpy, 1, __memcpy_ppc))
78 
79   /* Support sysdeps/powerpc/powerpc64/multiarch/memmove.c.  */
80   IFUNC_IMPL (i, name, memmove,
81 #ifdef __LITTLE_ENDIAN__
82 	      IFUNC_IMPL_ADD (array, i, memmove,
83 			      hwcap2 & PPC_FEATURE2_ARCH_3_1
84 			      && hwcap2 & PPC_FEATURE2_HAS_ISEL
85 			      && hwcap & PPC_FEATURE_HAS_VSX,
86 			      __memmove_power10)
87 #endif
88 	      IFUNC_IMPL_ADD (array, i, memmove, hwcap & PPC_FEATURE_ARCH_2_06
89 			      && hwcap & PPC_FEATURE_HAS_ALTIVEC,
90 			      __memmove_power7)
91 	      IFUNC_IMPL_ADD (array, i, memmove, 1, __memmove_ppc))
92 
93   /* Support sysdeps/powerpc/powerpc64/multiarch/memset.c.  */
94   IFUNC_IMPL (i, name, memset,
95 #ifdef __LITTLE_ENDIAN__
96 	      IFUNC_IMPL_ADD (array, i, memset,
97 			      hwcap2 & PPC_FEATURE2_ARCH_3_1
98 			      && hwcap2 & PPC_FEATURE2_HAS_ISEL
99 			      && hwcap & PPC_FEATURE_HAS_VSX
100 			      && cacheline_size == 128,
101 			      __memset_power10)
102 #endif
103 	      IFUNC_IMPL_ADD (array, i, memset, hwcap2 & PPC_FEATURE2_ARCH_2_07
104 			      && hwcap & PPC_FEATURE_HAS_ALTIVEC
105 			      && cacheline_size == 128,
106 			      __memset_power8)
107 	      IFUNC_IMPL_ADD (array, i, memset, hwcap & PPC_FEATURE_ARCH_2_06
108 			      && cacheline_size == 128,
109 			      __memset_power7)
110 	      IFUNC_IMPL_ADD (array, i, memset, hwcap & PPC_FEATURE_ARCH_2_05
111 			      && cacheline_size == 128,
112 			      __memset_power6)
113 	      IFUNC_IMPL_ADD (array, i, memset, hwcap & PPC_FEATURE_POWER4
114 			      && cacheline_size == 128,
115 			      __memset_power4)
116 	      IFUNC_IMPL_ADD (array, i, memset, 1, __memset_ppc))
117 
118   /* Support sysdeps/powerpc/powerpc64/multiarch/strcpy.c.  */
119   IFUNC_IMPL (i, name, strcpy,
120 #ifdef __LITTLE_ENDIAN__
121 	      IFUNC_IMPL_ADD (array, i, strcpy, hwcap2 & PPC_FEATURE2_ARCH_3_00
122 			      && hwcap & PPC_FEATURE_HAS_VSX,
123 			      __strcpy_power9)
124 #endif
125 	      IFUNC_IMPL_ADD (array, i, strcpy, hwcap2 & PPC_FEATURE2_ARCH_2_07
126 			      && hwcap & PPC_FEATURE_HAS_ALTIVEC,
127 			      __strcpy_power8)
128 	      IFUNC_IMPL_ADD (array, i, strcpy, hwcap & PPC_FEATURE_ARCH_2_06
129 			      && hwcap & PPC_FEATURE_HAS_VSX,
130 			      __strcpy_power7)
131 	      IFUNC_IMPL_ADD (array, i, strcpy, 1,
132 			      __strcpy_ppc))
133 
134   /* Support sysdeps/powerpc/powerpc64/multiarch/stpcpy.c.  */
135   IFUNC_IMPL (i, name, stpcpy,
136 #ifdef __LITTLE_ENDIAN__
137 	      IFUNC_IMPL_ADD (array, i, stpcpy, hwcap2 & PPC_FEATURE2_ARCH_3_00
138 			      && hwcap & PPC_FEATURE_HAS_VSX,
139 			      __stpcpy_power9)
140 #endif
141 	      IFUNC_IMPL_ADD (array, i, stpcpy, hwcap2 & PPC_FEATURE2_ARCH_2_07
142 			      && hwcap & PPC_FEATURE_HAS_ALTIVEC,
143 			      __stpcpy_power8)
144 	      IFUNC_IMPL_ADD (array, i, stpcpy, hwcap & PPC_FEATURE_ARCH_2_06
145 			      && hwcap & PPC_FEATURE_HAS_VSX,
146 			      __stpcpy_power7)
147 	      IFUNC_IMPL_ADD (array, i, stpcpy, 1,
148 			      __stpcpy_ppc))
149 
150   /* Support sysdeps/powerpc/powerpc64/multiarch/strlen.c.  */
151   IFUNC_IMPL (i, name, strlen,
152 #ifdef __LITTLE_ENDIAN__
153 	      IFUNC_IMPL_ADD (array, i, strlen, hwcap2 & PPC_FEATURE2_ARCH_3_1
154 			      && hwcap & PPC_FEATURE_HAS_VSX,
155 			      __strlen_power10)
156 	      IFUNC_IMPL_ADD (array, i, strlen, hwcap2 & PPC_FEATURE2_ARCH_3_00
157 			      && hwcap & PPC_FEATURE_HAS_VSX,
158 			      __strlen_power9)
159 #endif
160 	      IFUNC_IMPL_ADD (array, i, strlen, hwcap2 & PPC_FEATURE2_ARCH_2_07
161 			      && hwcap & PPC_FEATURE_HAS_ALTIVEC,
162 			      __strlen_power8)
163 	      IFUNC_IMPL_ADD (array, i, strlen, hwcap & PPC_FEATURE_ARCH_2_06,
164 			      __strlen_power7)
165 	      IFUNC_IMPL_ADD (array, i, strlen, 1,
166 			      __strlen_ppc))
167 
168   /* Support sysdeps/powerpc/powerpc64/multiarch/strncmp.c.  */
169   IFUNC_IMPL (i, name, strncmp,
170 #ifdef __LITTLE_ENDIAN__
171 	      IFUNC_IMPL_ADD (array, i, strncmp, hwcap2 & PPC_FEATURE2_ARCH_3_00
172 			      && hwcap & PPC_FEATURE_HAS_ALTIVEC,
173 			      __strncmp_power9)
174 #endif
175 	      IFUNC_IMPL_ADD (array, i, strncmp, hwcap2 & PPC_FEATURE2_ARCH_2_07,
176 			      __strncmp_power8)
177 	      IFUNC_IMPL_ADD (array, i, strncmp, hwcap & PPC_FEATURE_ARCH_2_06,
178 			      __strncmp_power7)
179 	      IFUNC_IMPL_ADD (array, i, strncmp, hwcap & PPC_FEATURE_POWER4,
180 			      __strncmp_power4)
181 	      IFUNC_IMPL_ADD (array, i, strncmp, 1,
182 			      __strncmp_ppc))
183 
184   /* Support sysdeps/powerpc/powerpc64/multiarch/strchr.c.  */
185   IFUNC_IMPL (i, name, strchr,
186 	      IFUNC_IMPL_ADD (array, i, strchr,
187 			      hwcap2 & PPC_FEATURE2_ARCH_2_07
188 			      && hwcap & PPC_FEATURE_HAS_ALTIVEC,
189 			      __strchr_power8)
190 	      IFUNC_IMPL_ADD (array, i, strchr,
191 			      hwcap & PPC_FEATURE_ARCH_2_06,
192 			      __strchr_power7)
193 	      IFUNC_IMPL_ADD (array, i, strchr, 1,
194 			      __strchr_ppc))
195 
196   /* Support sysdeps/powerpc/powerpc64/multiarch/strchrnul.c.  */
197   IFUNC_IMPL (i, name, strchrnul,
198 	      IFUNC_IMPL_ADD (array, i, strchrnul,
199 			      hwcap2 & PPC_FEATURE2_ARCH_2_07
200 			      && hwcap & PPC_FEATURE_HAS_ALTIVEC,
201 			      __strchrnul_power8)
202 	      IFUNC_IMPL_ADD (array, i, strchrnul,
203 			      hwcap & PPC_FEATURE_ARCH_2_06,
204 			      __strchrnul_power7)
205 	      IFUNC_IMPL_ADD (array, i, strchrnul, 1,
206 			      __strchrnul_ppc))
207 #endif
208 
209   /* Support sysdeps/powerpc/powerpc64/multiarch/memcmp.c.  */
210   IFUNC_IMPL (i, name, memcmp,
211 #ifdef __LITTLE_ENDIAN__
212 	      IFUNC_IMPL_ADD (array, i, memcmp,
213             hwcap2 & PPC_FEATURE2_ARCH_3_1
214             && hwcap & PPC_FEATURE_HAS_VSX,
215 			      __memcmp_power10)
216 #endif
217 	      IFUNC_IMPL_ADD (array, i, memcmp, hwcap2 & PPC_FEATURE2_ARCH_2_07
218 			      && hwcap & PPC_FEATURE_HAS_ALTIVEC,
219 			      __memcmp_power8)
220 	      IFUNC_IMPL_ADD (array, i, memcmp, hwcap & PPC_FEATURE_ARCH_2_06,
221 			      __memcmp_power7)
222 	      IFUNC_IMPL_ADD (array, i, memcmp, hwcap & PPC_FEATURE_POWER4,
223 			      __memcmp_power4)
224 	      IFUNC_IMPL_ADD (array, i, memcmp, 1, __memcmp_ppc))
225 
226   /* Support sysdeps/powerpc/powerpc64/multiarch/bzero.c.  */
227   IFUNC_IMPL (i, name, bzero,
228 #ifdef __LITTLE_ENDIAN__
229 	      IFUNC_IMPL_ADD (array, i, bzero,
230 			      hwcap2 & PPC_FEATURE2_ARCH_3_1
231 			      && hwcap2 & PPC_FEATURE2_HAS_ISEL
232 			      && hwcap & PPC_FEATURE_HAS_VSX,
233 			      __bzero_power10)
234 #endif
235 	      IFUNC_IMPL_ADD (array, i, bzero, hwcap2 & PPC_FEATURE2_ARCH_2_07
236 			      && hwcap & PPC_FEATURE_HAS_ALTIVEC,
237 			      __bzero_power8)
238 	      IFUNC_IMPL_ADD (array, i, bzero, hwcap & PPC_FEATURE_HAS_VSX,
239 			      __bzero_power7)
240 	      IFUNC_IMPL_ADD (array, i, bzero, hwcap & PPC_FEATURE_ARCH_2_05
241 			      && hwcap & PPC_FEATURE_HAS_ALTIVEC,
242 			      __bzero_power6)
243 	      IFUNC_IMPL_ADD (array, i, bzero, hwcap & PPC_FEATURE_POWER4,
244 			      __bzero_power4)
245 	      IFUNC_IMPL_ADD (array, i, bzero, 1, __bzero_ppc))
246 
247   /* Support sysdeps/powerpc/powerpc64/multiarch/bcopy.c.  */
248   IFUNC_IMPL (i, name, bcopy,
249 #ifdef __LITTLE_ENDIAN__
250 	      IFUNC_IMPL_ADD (array, i, bcopy,
251 			      hwcap2 & PPC_FEATURE2_ARCH_3_1
252 			      && hwcap2 & PPC_FEATURE2_HAS_ISEL
253 			      && hwcap & PPC_FEATURE_HAS_VSX,
254 			      __bcopy_power10)
255 #endif
256 	      IFUNC_IMPL_ADD (array, i, bcopy, hwcap & PPC_FEATURE_HAS_VSX,
257 			      __bcopy_power7)
258 	      IFUNC_IMPL_ADD (array, i, bcopy, 1, __bcopy_ppc))
259 
260   /* Support sysdeps/powerpc/powerpc64/multiarch/mempcpy.c.  */
261   IFUNC_IMPL (i, name, mempcpy,
262 	      IFUNC_IMPL_ADD (array, i, mempcpy,
263 			      hwcap & PPC_FEATURE_ARCH_2_06
264 			      && hwcap & PPC_FEATURE_HAS_ALTIVEC,
265 			      __mempcpy_power7)
266 	      IFUNC_IMPL_ADD (array, i, mempcpy, 1,
267 			      __mempcpy_ppc))
268 
269   /* Support sysdeps/powerpc/powerpc64/multiarch/memchr.c.  */
270   IFUNC_IMPL (i, name, memchr,
271 	      IFUNC_IMPL_ADD (array, i, memchr,
272 			      hwcap2 & PPC_FEATURE2_ARCH_2_07
273 			      && hwcap & PPC_FEATURE_HAS_ALTIVEC,
274 			      __memchr_power8)
275 	      IFUNC_IMPL_ADD (array, i, memchr,
276 			      hwcap & PPC_FEATURE_ARCH_2_06,
277 			      __memchr_power7)
278 	      IFUNC_IMPL_ADD (array, i, memchr, 1,
279 			      __memchr_ppc))
280 
281   /* Support sysdeps/powerpc/powerpc64/multiarch/memrchr.c.  */
282   IFUNC_IMPL (i, name, memrchr,
283 	      IFUNC_IMPL_ADD (array, i, memrchr,
284 			      hwcap2 & PPC_FEATURE2_ARCH_2_07
285 			      && hwcap & PPC_FEATURE_HAS_ALTIVEC,
286 			      __memrchr_power8)
287 	      IFUNC_IMPL_ADD (array, i, memrchr,
288 			      hwcap & PPC_FEATURE_ARCH_2_06,
289 			      __memrchr_power7)
290 	      IFUNC_IMPL_ADD (array, i, memrchr, 1,
291 			      __memrchr_ppc))
292 
293   /* Support sysdeps/powerpc/powerpc64/multiarch/rawmemchr.c.  */
294   IFUNC_IMPL (i, name, rawmemchr,
295 #ifdef __LITTLE_ENDIAN__
296 	      IFUNC_IMPL_ADD (array, i, rawmemchr,
297 			      (hwcap2 & PPC_FEATURE2_ARCH_3_1)
298                               && (hwcap & PPC_FEATURE_HAS_VSX),
299                               __rawmemchr_power10)
300 	      IFUNC_IMPL_ADD (array, i, rawmemchr,
301 			      hwcap2 & PPC_FEATURE2_ARCH_3_00
302 			      && hwcap & PPC_FEATURE_HAS_VSX,
303 			      __rawmemchr_power9)
304 #endif
305 	      IFUNC_IMPL_ADD (array, i, rawmemchr,
306 			      hwcap & PPC_FEATURE_ARCH_2_06,
307 			      __rawmemchr_power7)
308 	      IFUNC_IMPL_ADD (array, i, rawmemchr, 1,
309 			      __rawmemchr_ppc))
310 
311   /* Support sysdeps/powerpc/powerpc64/multiarch/strnlen.c.  */
312   IFUNC_IMPL (i, name, strnlen,
313 	      IFUNC_IMPL_ADD (array, i, strnlen,
314 			      hwcap2 & PPC_FEATURE2_ARCH_2_07
315 			      && hwcap & PPC_FEATURE_HAS_ALTIVEC,
316 			      __strnlen_power8)
317 	      IFUNC_IMPL_ADD (array, i, strnlen, hwcap & PPC_FEATURE_ARCH_2_06,
318 			      __strnlen_power7)
319 	      IFUNC_IMPL_ADD (array, i, strnlen, 1,
320 			      __strnlen_ppc))
321 
322   /* Support sysdeps/powerpc/powerpc64/multiarch/strcasecmp.c.  */
323   IFUNC_IMPL (i, name, strcasecmp,
324 	      IFUNC_IMPL_ADD (array, i, strcasecmp,
325 			      hwcap2 & PPC_FEATURE2_ARCH_2_07
326 			      && hwcap & PPC_FEATURE_HAS_ALTIVEC,
327 			      __strcasecmp_power8)
328 	      IFUNC_IMPL_ADD (array, i, strcasecmp,
329 			      hwcap & PPC_FEATURE_ARCH_2_06,
330 			      __strcasecmp_power7)
331 	      IFUNC_IMPL_ADD (array, i, strcasecmp, 1, __strcasecmp_ppc))
332 
333   /* Support sysdeps/powerpc/powerpc64/multiarch/strcasecmp_l.c.  */
334   IFUNC_IMPL (i, name, strcasecmp_l,
335 	      IFUNC_IMPL_ADD (array, i, strcasecmp_l,
336 			      hwcap & PPC_FEATURE_ARCH_2_06,
337 			      __strcasecmp_l_power7)
338 	      IFUNC_IMPL_ADD (array, i, strcasecmp_l, 1,
339 			      __strcasecmp_l_ppc))
340 
341   /* Support sysdeps/powerpc/powerpc64/multiarch/strncase.c.  */
342   IFUNC_IMPL (i, name, strncasecmp,
343 	      IFUNC_IMPL_ADD (array, i, strncasecmp,
344 			      hwcap2 & PPC_FEATURE2_ARCH_2_07
345 			       && hwcap & PPC_FEATURE_HAS_ALTIVEC,
346 			      __strncasecmp_power8)
347 	      IFUNC_IMPL_ADD (array, i, strncasecmp,
348 			      hwcap & PPC_FEATURE_ARCH_2_06,
349 			      __strncasecmp_power7)
350 	      IFUNC_IMPL_ADD (array, i, strncasecmp, 1, __strncasecmp_ppc))
351 
352   /* Support sysdeps/powerpc/powerpc64/multiarch/strncase_l.c.  */
353   IFUNC_IMPL (i, name, strncasecmp_l,
354 	      IFUNC_IMPL_ADD (array, i, strncasecmp_l,
355 			      hwcap & PPC_FEATURE_ARCH_2_06,
356 			      __strncasecmp_l_power7)
357 	      IFUNC_IMPL_ADD (array, i, strncasecmp_l, 1,
358 			      __strncasecmp_l_ppc))
359 
360   /* Support sysdeps/powerpc/powerpc64/multiarch/strrchr.c.  */
361   IFUNC_IMPL (i, name, strrchr,
362 	      IFUNC_IMPL_ADD (array, i, strrchr,
363 			      hwcap2 & PPC_FEATURE2_ARCH_2_07
364 			      && hwcap & PPC_FEATURE_HAS_ALTIVEC,
365 			      __strrchr_power8)
366 	      IFUNC_IMPL_ADD (array, i, strrchr,
367 			      hwcap & PPC_FEATURE_ARCH_2_06,
368 			      __strrchr_power7)
369 	      IFUNC_IMPL_ADD (array, i, strrchr, 1,
370 			      __strrchr_ppc))
371 
372   /* Support sysdeps/powerpc/powerpc64/multiarch/strncat.c.  */
373   IFUNC_IMPL (i, name, strncat,
374 	      IFUNC_IMPL_ADD (array, i, strncat,
375 			      hwcap2 & PPC_FEATURE2_ARCH_2_07
376 			      && hwcap & PPC_FEATURE_HAS_VSX,
377 			      __strncat_power8)
378 	      IFUNC_IMPL_ADD (array, i, strncat,
379 			      hwcap & PPC_FEATURE_ARCH_2_06
380 			      && hwcap & PPC_FEATURE_HAS_VSX,
381 			      __strncat_power7)
382 	      IFUNC_IMPL_ADD (array, i, strncat, 1,
383 			      __strncat_ppc))
384 
385   /* Support sysdeps/powerpc/powerpc64/multiarch/strncpy.c.  */
386   IFUNC_IMPL (i, name, strncpy,
387 #ifdef __LITTLE_ENDIAN__
388 	      IFUNC_IMPL_ADD (array, i, strncpy,
389 			      (hwcap2 & PPC_FEATURE2_ARCH_3_00)
390 			      && (hwcap & PPC_FEATURE_HAS_VSX),
391 			      __strncpy_power9)
392 #endif
393 	      IFUNC_IMPL_ADD (array, i, strncpy,
394 			      hwcap2 & PPC_FEATURE2_ARCH_2_07,
395 			      __strncpy_power8)
396 	      IFUNC_IMPL_ADD (array, i, strncpy,
397 			      hwcap & PPC_FEATURE_ARCH_2_06,
398 			      __strncpy_power7)
399 	      IFUNC_IMPL_ADD (array, i, strncpy, 1,
400 			     __strncpy_ppc))
401 
402   /* Support sysdeps/powerpc/powerpc64/multiarch/stpncpy.c.  */
403   IFUNC_IMPL (i, name, stpncpy,
404 #ifdef __LITTLE_ENDIAN__
405 	      IFUNC_IMPL_ADD (array, i, stpncpy,
406 			      (hwcap2 & PPC_FEATURE2_ARCH_3_00)
407 			      && (hwcap & PPC_FEATURE_HAS_VSX),
408 			      __stpncpy_power9)
409 #endif
410 	      IFUNC_IMPL_ADD (array, i, stpncpy,
411 			      hwcap2 & PPC_FEATURE2_ARCH_2_07,
412 			      __stpncpy_power8)
413 	      IFUNC_IMPL_ADD (array, i, stpncpy,
414 			      hwcap & PPC_FEATURE_ARCH_2_06,
415 			      __stpncpy_power7)
416 	      IFUNC_IMPL_ADD (array, i, stpncpy, 1,
417 			     __stpncpy_ppc))
418 
419   /* Support sysdeps/powerpc/powerpc64/multiarch/strcmp.c.  */
420   IFUNC_IMPL (i, name, strcmp,
421 #ifdef __LITTLE_ENDIAN__
422 	      IFUNC_IMPL_ADD (array, i, strcmp,
423 			      hwcap2 & PPC_FEATURE2_ARCH_3_00
424 			      && hwcap & PPC_FEATURE_HAS_ALTIVEC,
425 			      __strcmp_power9)
426 #endif
427 	      IFUNC_IMPL_ADD (array, i, strcmp,
428 			      hwcap2 & PPC_FEATURE2_ARCH_2_07,
429 			      __strcmp_power8)
430 	      IFUNC_IMPL_ADD (array, i, strcmp,
431 			      hwcap & PPC_FEATURE_ARCH_2_06,
432 			      __strcmp_power7)
433 	      IFUNC_IMPL_ADD (array, i, strcmp, 1,
434 			     __strcmp_ppc))
435 
436   /* Support sysdeps/powerpc/powerpc64/multiarch/strcat.c.  */
437   IFUNC_IMPL (i, name, strcat,
438 	      IFUNC_IMPL_ADD (array, i, strcat,
439 			      hwcap2 & PPC_FEATURE2_ARCH_2_07
440 			      && hwcap & PPC_FEATURE_HAS_VSX,
441 			      __strcat_power8)
442 	      IFUNC_IMPL_ADD (array, i, strcat,
443 			      hwcap & PPC_FEATURE_ARCH_2_06
444 			      && hwcap & PPC_FEATURE_HAS_VSX,
445 			      __strcat_power7)
446 	      IFUNC_IMPL_ADD (array, i, strcat, 1,
447 			     __strcat_ppc))
448 
449   /* Support sysdeps/powerpc/powerpc64/multiarch/strspn.c.  */
450   IFUNC_IMPL (i, name, strspn,
451              IFUNC_IMPL_ADD (array, i, strspn,
452                              hwcap2 & PPC_FEATURE2_ARCH_2_07
453                              && hwcap & PPC_FEATURE_HAS_VSX,
454                              __strspn_power8)
455              IFUNC_IMPL_ADD (array, i, strspn, 1,
456                              __strspn_ppc))
457 
458   /* Support sysdeps/powerpc/powerpc64/multiarch/strcspn.c.  */
459   IFUNC_IMPL (i, name, strcspn,
460              IFUNC_IMPL_ADD (array, i, strcspn,
461                              hwcap2 & PPC_FEATURE2_ARCH_2_07
462                              && hwcap & PPC_FEATURE_HAS_VSX,
463                              __strcspn_power8)
464              IFUNC_IMPL_ADD (array, i, strcspn, 1,
465                              __strcspn_ppc))
466 
467   /* Support sysdeps/powerpc/powerpc64/multiarch/strstr.c.  */
468   IFUNC_IMPL (i, name, strstr,
469              IFUNC_IMPL_ADD (array, i, strstr,
470                              hwcap & PPC_FEATURE_ARCH_2_06,
471                              __strstr_power7)
472              IFUNC_IMPL_ADD (array, i, strstr, 1,
473                              __strstr_ppc))
474 
475 
476   /* Support sysdeps/powerpc/powerpc64/multiarch/strcasestr.c.  */
477   IFUNC_IMPL (i, name, strcasestr,
478 	      IFUNC_IMPL_ADD (array, i, strcasestr,
479 			      hwcap2 & PPC_FEATURE2_ARCH_2_07
480 			      && hwcap & PPC_FEATURE_HAS_ALTIVEC,
481 			      __strcasestr_power8)
482              IFUNC_IMPL_ADD (array, i, strcasestr, 1,
483                              __strcasestr_ppc))
484 
485   return i;
486 }
487