1 /* Enumerate available IFUNC implementations of a function. PowerPC64 version.
2 Copyright (C) 2013-2023 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
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.
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.
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/>. */
20 #include <cpu-features.h>
24 #include <ifunc-impl-list.h>
27 __libc_ifunc_impl_list (const char *name
, struct libc_ifunc_impl
*array
,
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
;
35 int cacheline_size
= GLRO(dl_cache_line_size
);
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
;
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
,
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
,
65 IFUNC_IMPL_ADD (array
, i
, memcpy
, hwcap
& PPC_FEATURE_ARCH_2_06
,
67 IFUNC_IMPL_ADD (array
, i
, memcpy
, hwcap
& PPC_FEATURE_ARCH_2_05
,
69 IFUNC_IMPL_ADD (array
, i
, memcpy
, hwcap
& PPC_FEATURE_CELL_BE
,
71 IFUNC_IMPL_ADD (array
, i
, memcpy
, hwcap
& PPC_FEATURE_POWER4
,
73 IFUNC_IMPL_ADD (array
, i
, memcpy
, 1, __memcpy_ppc
))
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
,
84 IFUNC_IMPL_ADD (array
, i
, memmove
, hwcap
& PPC_FEATURE_ARCH_2_06
85 && hwcap
& PPC_FEATURE_HAS_ALTIVEC
,
87 IFUNC_IMPL_ADD (array
, i
, memmove
, 1, __memmove_ppc
))
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,
99 IFUNC_IMPL_ADD (array
, i
, memset
, hwcap2
& PPC_FEATURE2_ARCH_2_07
100 && hwcap
& PPC_FEATURE_HAS_ALTIVEC
101 && cacheline_size
== 128,
103 IFUNC_IMPL_ADD (array
, i
, memset
, hwcap
& PPC_FEATURE_ARCH_2_06
104 && cacheline_size
== 128,
106 IFUNC_IMPL_ADD (array
, i
, memset
, hwcap
& PPC_FEATURE_ARCH_2_05
107 && cacheline_size
== 128,
109 IFUNC_IMPL_ADD (array
, i
, memset
, hwcap
& PPC_FEATURE_POWER4
110 && cacheline_size
== 128,
112 IFUNC_IMPL_ADD (array
, i
, memset
, 1, __memset_ppc
))
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
,
121 IFUNC_IMPL_ADD (array
, i
, strcpy
, hwcap2
& PPC_FEATURE2_ARCH_2_07
122 && hwcap
& PPC_FEATURE_HAS_ALTIVEC
,
124 IFUNC_IMPL_ADD (array
, i
, strcpy
, hwcap
& PPC_FEATURE_ARCH_2_06
125 && hwcap
& PPC_FEATURE_HAS_VSX
,
127 IFUNC_IMPL_ADD (array
, i
, strcpy
, 1,
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
,
137 IFUNC_IMPL_ADD (array
, i
, stpcpy
, hwcap2
& PPC_FEATURE2_ARCH_2_07
138 && hwcap
& PPC_FEATURE_HAS_ALTIVEC
,
140 IFUNC_IMPL_ADD (array
, i
, stpcpy
, hwcap
& PPC_FEATURE_ARCH_2_06
141 && hwcap
& PPC_FEATURE_HAS_VSX
,
143 IFUNC_IMPL_ADD (array
, i
, stpcpy
, 1,
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
,
152 IFUNC_IMPL_ADD (array
, i
, strlen
, hwcap2
& PPC_FEATURE2_ARCH_3_00
153 && hwcap
& PPC_FEATURE_HAS_VSX
,
156 IFUNC_IMPL_ADD (array
, i
, strlen
, hwcap2
& PPC_FEATURE2_ARCH_2_07
157 && hwcap
& PPC_FEATURE_HAS_ALTIVEC
,
159 IFUNC_IMPL_ADD (array
, i
, strlen
, hwcap
& PPC_FEATURE_ARCH_2_06
,
161 IFUNC_IMPL_ADD (array
, i
, strlen
, 1,
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
,
171 IFUNC_IMPL_ADD (array
, i
, strncmp
, hwcap2
& PPC_FEATURE2_ARCH_2_07
,
173 IFUNC_IMPL_ADD (array
, i
, strncmp
, 1,
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
,
182 IFUNC_IMPL_ADD (array
, i
, strchr
,
183 hwcap
& PPC_FEATURE_ARCH_2_06
,
185 IFUNC_IMPL_ADD (array
, i
, strchr
, 1,
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
,
194 IFUNC_IMPL_ADD (array
, i
, strchrnul
,
195 hwcap
& PPC_FEATURE_ARCH_2_06
,
197 IFUNC_IMPL_ADD (array
, i
, strchrnul
, 1,
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
,
209 IFUNC_IMPL_ADD (array
, i
, memcmp
, hwcap2
& PPC_FEATURE2_ARCH_2_07
210 && hwcap
& PPC_FEATURE_HAS_ALTIVEC
,
212 IFUNC_IMPL_ADD (array
, i
, memcmp
, hwcap
& PPC_FEATURE_ARCH_2_06
,
214 IFUNC_IMPL_ADD (array
, i
, memcmp
, hwcap
& PPC_FEATURE_POWER4
,
216 IFUNC_IMPL_ADD (array
, i
, memcmp
, 1, __memcmp_ppc
))
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
,
224 IFUNC_IMPL_ADD (array
, i
, mempcpy
, 1,
227 /* Support sysdeps/powerpc/powerpc64/multiarch/memchr.c. */
228 IFUNC_IMPL (i
, name
, memchr
,
229 IFUNC_IMPL_ADD (array
, i
, memchr
,
230 hwcap2
& PPC_FEATURE2_ARCH_2_07
231 && hwcap
& PPC_FEATURE_HAS_ALTIVEC
,
233 IFUNC_IMPL_ADD (array
, i
, memchr
,
234 hwcap
& PPC_FEATURE_ARCH_2_06
,
236 IFUNC_IMPL_ADD (array
, i
, memchr
, 1,
239 /* Support sysdeps/powerpc/powerpc64/multiarch/memrchr.c. */
240 IFUNC_IMPL (i
, name
, memrchr
,
241 IFUNC_IMPL_ADD (array
, i
, memrchr
,
242 hwcap2
& PPC_FEATURE2_ARCH_2_07
243 && hwcap
& PPC_FEATURE_HAS_ALTIVEC
,
245 IFUNC_IMPL_ADD (array
, i
, memrchr
,
246 hwcap
& PPC_FEATURE_ARCH_2_06
,
248 IFUNC_IMPL_ADD (array
, i
, memrchr
, 1,
251 /* Support sysdeps/powerpc/powerpc64/multiarch/rawmemchr.c. */
252 IFUNC_IMPL (i
, name
, rawmemchr
,
253 #ifdef __LITTLE_ENDIAN__
254 IFUNC_IMPL_ADD (array
, i
, rawmemchr
,
255 (hwcap2
& PPC_FEATURE2_ARCH_3_1
)
256 && (hwcap
& PPC_FEATURE_HAS_VSX
),
258 IFUNC_IMPL_ADD (array
, i
, rawmemchr
,
259 hwcap2
& PPC_FEATURE2_ARCH_3_00
260 && hwcap
& PPC_FEATURE_HAS_VSX
,
263 IFUNC_IMPL_ADD (array
, i
, rawmemchr
,
264 hwcap
& PPC_FEATURE_ARCH_2_06
,
266 IFUNC_IMPL_ADD (array
, i
, rawmemchr
, 1,
269 /* Support sysdeps/powerpc/powerpc64/multiarch/strnlen.c. */
270 IFUNC_IMPL (i
, name
, strnlen
,
271 IFUNC_IMPL_ADD (array
, i
, strnlen
,
272 hwcap2
& PPC_FEATURE2_ARCH_2_07
273 && hwcap
& PPC_FEATURE_HAS_ALTIVEC
,
275 IFUNC_IMPL_ADD (array
, i
, strnlen
, hwcap
& PPC_FEATURE_ARCH_2_06
,
277 IFUNC_IMPL_ADD (array
, i
, strnlen
, 1,
280 /* Support sysdeps/powerpc/powerpc64/multiarch/strcasecmp.c. */
281 IFUNC_IMPL (i
, name
, strcasecmp
,
282 IFUNC_IMPL_ADD (array
, i
, strcasecmp
,
283 hwcap2
& PPC_FEATURE2_ARCH_2_07
284 && hwcap
& PPC_FEATURE_HAS_ALTIVEC
,
286 IFUNC_IMPL_ADD (array
, i
, strcasecmp
,
287 hwcap
& PPC_FEATURE_ARCH_2_06
,
289 IFUNC_IMPL_ADD (array
, i
, strcasecmp
, 1, __strcasecmp_ppc
))
291 /* Support sysdeps/powerpc/powerpc64/multiarch/strcasecmp_l.c. */
292 IFUNC_IMPL (i
, name
, strcasecmp_l
,
293 IFUNC_IMPL_ADD (array
, i
, strcasecmp_l
,
294 hwcap
& PPC_FEATURE_ARCH_2_06
,
295 __strcasecmp_l_power7
)
296 IFUNC_IMPL_ADD (array
, i
, strcasecmp_l
, 1,
299 /* Support sysdeps/powerpc/powerpc64/multiarch/strncase.c. */
300 IFUNC_IMPL (i
, name
, strncasecmp
,
301 IFUNC_IMPL_ADD (array
, i
, strncasecmp
,
302 hwcap2
& PPC_FEATURE2_ARCH_2_07
303 && hwcap
& PPC_FEATURE_HAS_ALTIVEC
,
304 __strncasecmp_power8
)
305 IFUNC_IMPL_ADD (array
, i
, strncasecmp
,
306 hwcap
& PPC_FEATURE_ARCH_2_06
,
307 __strncasecmp_power7
)
308 IFUNC_IMPL_ADD (array
, i
, strncasecmp
, 1, __strncasecmp_ppc
))
310 /* Support sysdeps/powerpc/powerpc64/multiarch/strncase_l.c. */
311 IFUNC_IMPL (i
, name
, strncasecmp_l
,
312 IFUNC_IMPL_ADD (array
, i
, strncasecmp_l
,
313 hwcap
& PPC_FEATURE_ARCH_2_06
,
314 __strncasecmp_l_power7
)
315 IFUNC_IMPL_ADD (array
, i
, strncasecmp_l
, 1,
316 __strncasecmp_l_ppc
))
318 /* Support sysdeps/powerpc/powerpc64/multiarch/strrchr.c. */
319 IFUNC_IMPL (i
, name
, strrchr
,
320 IFUNC_IMPL_ADD (array
, i
, strrchr
,
321 hwcap2
& PPC_FEATURE2_ARCH_2_07
322 && hwcap
& PPC_FEATURE_HAS_ALTIVEC
,
324 IFUNC_IMPL_ADD (array
, i
, strrchr
,
325 hwcap
& PPC_FEATURE_ARCH_2_06
,
327 IFUNC_IMPL_ADD (array
, i
, strrchr
, 1,
330 /* Support sysdeps/powerpc/powerpc64/multiarch/strncat.c. */
331 IFUNC_IMPL (i
, name
, strncat
,
332 IFUNC_IMPL_ADD (array
, i
, strncat
,
333 hwcap2
& PPC_FEATURE2_ARCH_2_07
334 && hwcap
& PPC_FEATURE_HAS_VSX
,
336 IFUNC_IMPL_ADD (array
, i
, strncat
,
337 hwcap
& PPC_FEATURE_ARCH_2_06
338 && hwcap
& PPC_FEATURE_HAS_VSX
,
340 IFUNC_IMPL_ADD (array
, i
, strncat
, 1,
343 /* Support sysdeps/powerpc/powerpc64/multiarch/strncpy.c. */
344 IFUNC_IMPL (i
, name
, strncpy
,
345 #ifdef __LITTLE_ENDIAN__
346 IFUNC_IMPL_ADD (array
, i
, strncpy
,
347 (hwcap2
& PPC_FEATURE2_ARCH_3_00
)
348 && (hwcap
& PPC_FEATURE_HAS_VSX
),
351 IFUNC_IMPL_ADD (array
, i
, strncpy
,
352 hwcap2
& PPC_FEATURE2_ARCH_2_07
,
354 IFUNC_IMPL_ADD (array
, i
, strncpy
,
355 hwcap
& PPC_FEATURE_ARCH_2_06
,
357 IFUNC_IMPL_ADD (array
, i
, strncpy
, 1,
360 /* Support sysdeps/powerpc/powerpc64/multiarch/stpncpy.c. */
361 IFUNC_IMPL (i
, name
, stpncpy
,
362 #ifdef __LITTLE_ENDIAN__
363 IFUNC_IMPL_ADD (array
, i
, stpncpy
,
364 (hwcap2
& PPC_FEATURE2_ARCH_3_00
)
365 && (hwcap
& PPC_FEATURE_HAS_VSX
),
368 IFUNC_IMPL_ADD (array
, i
, stpncpy
,
369 hwcap2
& PPC_FEATURE2_ARCH_2_07
,
371 IFUNC_IMPL_ADD (array
, i
, stpncpy
,
372 hwcap
& PPC_FEATURE_ARCH_2_06
,
374 IFUNC_IMPL_ADD (array
, i
, stpncpy
, 1,
377 /* Support sysdeps/powerpc/powerpc64/multiarch/strcmp.c. */
378 IFUNC_IMPL (i
, name
, strcmp
,
379 #ifdef __LITTLE_ENDIAN__
380 IFUNC_IMPL_ADD (array
, i
, strcmp
,
381 hwcap2
& PPC_FEATURE2_ARCH_3_00
382 && hwcap
& PPC_FEATURE_HAS_ALTIVEC
,
385 IFUNC_IMPL_ADD (array
, i
, strcmp
,
386 hwcap2
& PPC_FEATURE2_ARCH_2_07
,
388 IFUNC_IMPL_ADD (array
, i
, strcmp
,
389 hwcap
& PPC_FEATURE_ARCH_2_06
,
391 IFUNC_IMPL_ADD (array
, i
, strcmp
, 1,
394 /* Support sysdeps/powerpc/powerpc64/multiarch/strcat.c. */
395 IFUNC_IMPL (i
, name
, strcat
,
396 IFUNC_IMPL_ADD (array
, i
, strcat
,
397 hwcap2
& PPC_FEATURE2_ARCH_2_07
398 && hwcap
& PPC_FEATURE_HAS_VSX
,
400 IFUNC_IMPL_ADD (array
, i
, strcat
,
401 hwcap
& PPC_FEATURE_ARCH_2_06
402 && hwcap
& PPC_FEATURE_HAS_VSX
,
404 IFUNC_IMPL_ADD (array
, i
, strcat
, 1,
407 /* Support sysdeps/powerpc/powerpc64/multiarch/strspn.c. */
408 IFUNC_IMPL (i
, name
, strspn
,
409 IFUNC_IMPL_ADD (array
, i
, strspn
,
410 hwcap2
& PPC_FEATURE2_ARCH_2_07
411 && hwcap
& PPC_FEATURE_HAS_VSX
,
413 IFUNC_IMPL_ADD (array
, i
, strspn
, 1,
416 /* Support sysdeps/powerpc/powerpc64/multiarch/strcspn.c. */
417 IFUNC_IMPL (i
, name
, strcspn
,
418 IFUNC_IMPL_ADD (array
, i
, strcspn
,
419 hwcap2
& PPC_FEATURE2_ARCH_2_07
420 && hwcap
& PPC_FEATURE_HAS_VSX
,
422 IFUNC_IMPL_ADD (array
, i
, strcspn
, 1,
425 /* Support sysdeps/powerpc/powerpc64/multiarch/strstr.c. */
426 IFUNC_IMPL (i
, name
, strstr
,
427 IFUNC_IMPL_ADD (array
, i
, strstr
,
428 hwcap
& PPC_FEATURE_ARCH_2_06
,
430 IFUNC_IMPL_ADD (array
, i
, strstr
, 1,
434 /* Support sysdeps/powerpc/powerpc64/multiarch/strcasestr.c. */
435 IFUNC_IMPL (i
, name
, strcasestr
,
436 IFUNC_IMPL_ADD (array
, i
, strcasestr
,
437 hwcap2
& PPC_FEATURE2_ARCH_2_07
438 && hwcap
& PPC_FEATURE_HAS_ALTIVEC
,
440 IFUNC_IMPL_ADD (array
, i
, strcasestr
, 1,