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