]>
git.ipfire.org Git - thirdparty/glibc.git/blob - sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c
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.
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_1
168 && hwcap
& PPC_FEATURE_HAS_VSX
,
170 IFUNC_IMPL_ADD (array
, i
, strncmp
, hwcap2
& PPC_FEATURE2_ARCH_3_00
171 && hwcap
& PPC_FEATURE_HAS_ALTIVEC
,
174 IFUNC_IMPL_ADD (array
, i
, strncmp
, hwcap2
& PPC_FEATURE2_ARCH_2_07
,
176 IFUNC_IMPL_ADD (array
, i
, strncmp
, 1,
179 /* Support sysdeps/powerpc/powerpc64/multiarch/strchr.c. */
180 IFUNC_IMPL (i
, name
, strchr
,
181 IFUNC_IMPL_ADD (array
, i
, strchr
,
182 hwcap2
& PPC_FEATURE2_ARCH_2_07
183 && hwcap
& PPC_FEATURE_HAS_ALTIVEC
,
185 IFUNC_IMPL_ADD (array
, i
, strchr
,
186 hwcap
& PPC_FEATURE_ARCH_2_06
,
188 IFUNC_IMPL_ADD (array
, i
, strchr
, 1,
191 /* Support sysdeps/powerpc/powerpc64/multiarch/strchrnul.c. */
192 IFUNC_IMPL (i
, name
, strchrnul
,
193 IFUNC_IMPL_ADD (array
, i
, strchrnul
,
194 hwcap2
& PPC_FEATURE2_ARCH_2_07
195 && hwcap
& PPC_FEATURE_HAS_ALTIVEC
,
197 IFUNC_IMPL_ADD (array
, i
, strchrnul
,
198 hwcap
& PPC_FEATURE_ARCH_2_06
,
200 IFUNC_IMPL_ADD (array
, i
, strchrnul
, 1,
204 /* Support sysdeps/powerpc/powerpc64/multiarch/memcmp.c. */
205 IFUNC_IMPL (i
, name
, memcmp
,
206 #ifdef __LITTLE_ENDIAN__
207 IFUNC_IMPL_ADD (array
, i
, memcmp
,
208 hwcap2
& PPC_FEATURE2_ARCH_3_1
209 && hwcap
& PPC_FEATURE_HAS_VSX
,
212 IFUNC_IMPL_ADD (array
, i
, memcmp
, hwcap2
& PPC_FEATURE2_ARCH_2_07
213 && hwcap
& PPC_FEATURE_HAS_ALTIVEC
,
215 IFUNC_IMPL_ADD (array
, i
, memcmp
, hwcap
& PPC_FEATURE_ARCH_2_06
,
217 IFUNC_IMPL_ADD (array
, i
, memcmp
, hwcap
& PPC_FEATURE_POWER4
,
219 IFUNC_IMPL_ADD (array
, i
, memcmp
, 1, __memcmp_ppc
))
221 /* Support sysdeps/powerpc/powerpc64/multiarch/mempcpy.c. */
222 IFUNC_IMPL (i
, name
, mempcpy
,
223 IFUNC_IMPL_ADD (array
, i
, mempcpy
,
224 hwcap
& PPC_FEATURE_ARCH_2_06
225 && hwcap
& PPC_FEATURE_HAS_ALTIVEC
,
227 IFUNC_IMPL_ADD (array
, i
, mempcpy
, 1,
230 /* Support sysdeps/powerpc/powerpc64/multiarch/memchr.c. */
231 IFUNC_IMPL (i
, name
, memchr
,
232 #ifdef __LITTLE_ENDIAN__
233 IFUNC_IMPL_ADD (array
, i
, memchr
,
234 hwcap2
& PPC_FEATURE2_ARCH_3_1
235 && hwcap
& PPC_FEATURE_HAS_VSX
,
238 IFUNC_IMPL_ADD (array
, i
, memchr
,
239 hwcap2
& PPC_FEATURE2_ARCH_2_07
240 && hwcap
& PPC_FEATURE_HAS_ALTIVEC
,
242 IFUNC_IMPL_ADD (array
, i
, memchr
,
243 hwcap
& PPC_FEATURE_ARCH_2_06
,
245 IFUNC_IMPL_ADD (array
, i
, memchr
, 1,
248 /* Support sysdeps/powerpc/powerpc64/multiarch/memrchr.c. */
249 IFUNC_IMPL (i
, name
, memrchr
,
250 IFUNC_IMPL_ADD (array
, i
, memrchr
,
251 hwcap2
& PPC_FEATURE2_ARCH_2_07
252 && hwcap
& PPC_FEATURE_HAS_ALTIVEC
,
254 IFUNC_IMPL_ADD (array
, i
, memrchr
,
255 hwcap
& PPC_FEATURE_ARCH_2_06
,
257 IFUNC_IMPL_ADD (array
, i
, memrchr
, 1,
260 /* Support sysdeps/powerpc/powerpc64/multiarch/rawmemchr.c. */
261 IFUNC_IMPL (i
, name
, rawmemchr
,
262 #ifdef __LITTLE_ENDIAN__
263 IFUNC_IMPL_ADD (array
, i
, rawmemchr
,
264 (hwcap2
& PPC_FEATURE2_ARCH_3_1
)
265 && (hwcap
& PPC_FEATURE_HAS_VSX
),
267 IFUNC_IMPL_ADD (array
, i
, rawmemchr
,
268 hwcap2
& PPC_FEATURE2_ARCH_3_00
269 && hwcap
& PPC_FEATURE_HAS_VSX
,
272 IFUNC_IMPL_ADD (array
, i
, rawmemchr
,
273 hwcap
& PPC_FEATURE_ARCH_2_06
,
275 IFUNC_IMPL_ADD (array
, i
, rawmemchr
, 1,
278 /* Support sysdeps/powerpc/powerpc64/multiarch/strnlen.c. */
279 IFUNC_IMPL (i
, name
, strnlen
,
280 IFUNC_IMPL_ADD (array
, i
, strnlen
,
281 hwcap2
& PPC_FEATURE2_ARCH_2_07
282 && hwcap
& PPC_FEATURE_HAS_ALTIVEC
,
284 IFUNC_IMPL_ADD (array
, i
, strnlen
, hwcap
& PPC_FEATURE_ARCH_2_06
,
286 IFUNC_IMPL_ADD (array
, i
, strnlen
, 1,
289 /* Support sysdeps/powerpc/powerpc64/multiarch/strcasecmp.c. */
290 IFUNC_IMPL (i
, name
, strcasecmp
,
291 IFUNC_IMPL_ADD (array
, i
, strcasecmp
,
292 hwcap2
& PPC_FEATURE2_ARCH_2_07
293 && hwcap
& PPC_FEATURE_HAS_ALTIVEC
,
295 IFUNC_IMPL_ADD (array
, i
, strcasecmp
,
296 hwcap
& PPC_FEATURE_ARCH_2_06
,
298 IFUNC_IMPL_ADD (array
, i
, strcasecmp
, 1, __strcasecmp_ppc
))
300 /* Support sysdeps/powerpc/powerpc64/multiarch/strcasecmp_l.c. */
301 IFUNC_IMPL (i
, name
, strcasecmp_l
,
302 IFUNC_IMPL_ADD (array
, i
, strcasecmp_l
,
303 hwcap
& PPC_FEATURE_ARCH_2_06
,
304 __strcasecmp_l_power7
)
305 IFUNC_IMPL_ADD (array
, i
, strcasecmp_l
, 1,
308 /* Support sysdeps/powerpc/powerpc64/multiarch/strncase.c. */
309 IFUNC_IMPL (i
, name
, strncasecmp
,
310 IFUNC_IMPL_ADD (array
, i
, strncasecmp
,
311 hwcap2
& PPC_FEATURE2_ARCH_2_07
312 && hwcap
& PPC_FEATURE_HAS_ALTIVEC
,
313 __strncasecmp_power8
)
314 IFUNC_IMPL_ADD (array
, i
, strncasecmp
,
315 hwcap
& PPC_FEATURE_ARCH_2_06
,
316 __strncasecmp_power7
)
317 IFUNC_IMPL_ADD (array
, i
, strncasecmp
, 1, __strncasecmp_ppc
))
319 /* Support sysdeps/powerpc/powerpc64/multiarch/strncase_l.c. */
320 IFUNC_IMPL (i
, name
, strncasecmp_l
,
321 IFUNC_IMPL_ADD (array
, i
, strncasecmp_l
,
322 hwcap
& PPC_FEATURE_ARCH_2_06
,
323 __strncasecmp_l_power7
)
324 IFUNC_IMPL_ADD (array
, i
, strncasecmp_l
, 1,
325 __strncasecmp_l_ppc
))
327 /* Support sysdeps/powerpc/powerpc64/multiarch/strrchr.c. */
328 IFUNC_IMPL (i
, name
, strrchr
,
329 IFUNC_IMPL_ADD (array
, i
, strrchr
,
330 hwcap2
& PPC_FEATURE2_ARCH_2_07
331 && hwcap
& PPC_FEATURE_HAS_ALTIVEC
,
333 IFUNC_IMPL_ADD (array
, i
, strrchr
,
334 hwcap
& PPC_FEATURE_ARCH_2_06
,
336 IFUNC_IMPL_ADD (array
, i
, strrchr
, 1,
339 /* Support sysdeps/powerpc/powerpc64/multiarch/strncat.c. */
340 IFUNC_IMPL (i
, name
, strncat
,
341 IFUNC_IMPL_ADD (array
, i
, strncat
,
342 hwcap2
& PPC_FEATURE2_ARCH_2_07
343 && hwcap
& PPC_FEATURE_HAS_VSX
,
345 IFUNC_IMPL_ADD (array
, i
, strncat
,
346 hwcap
& PPC_FEATURE_ARCH_2_06
347 && hwcap
& PPC_FEATURE_HAS_VSX
,
349 IFUNC_IMPL_ADD (array
, i
, strncat
, 1,
352 /* Support sysdeps/powerpc/powerpc64/multiarch/strncpy.c. */
353 IFUNC_IMPL (i
, name
, strncpy
,
354 #ifdef __LITTLE_ENDIAN__
355 IFUNC_IMPL_ADD (array
, i
, strncpy
,
356 (hwcap2
& PPC_FEATURE2_ARCH_3_00
)
357 && (hwcap
& PPC_FEATURE_HAS_VSX
),
360 IFUNC_IMPL_ADD (array
, i
, strncpy
,
361 hwcap2
& PPC_FEATURE2_ARCH_2_07
,
363 IFUNC_IMPL_ADD (array
, i
, strncpy
,
364 hwcap
& PPC_FEATURE_ARCH_2_06
,
366 IFUNC_IMPL_ADD (array
, i
, strncpy
, 1,
369 /* Support sysdeps/powerpc/powerpc64/multiarch/stpncpy.c. */
370 IFUNC_IMPL (i
, name
, stpncpy
,
371 #ifdef __LITTLE_ENDIAN__
372 IFUNC_IMPL_ADD (array
, i
, stpncpy
,
373 (hwcap2
& PPC_FEATURE2_ARCH_3_00
)
374 && (hwcap
& PPC_FEATURE_HAS_VSX
),
377 IFUNC_IMPL_ADD (array
, i
, stpncpy
,
378 hwcap2
& PPC_FEATURE2_ARCH_2_07
,
380 IFUNC_IMPL_ADD (array
, i
, stpncpy
,
381 hwcap
& PPC_FEATURE_ARCH_2_06
,
383 IFUNC_IMPL_ADD (array
, i
, stpncpy
, 1,
386 /* Support sysdeps/powerpc/powerpc64/multiarch/strcmp.c. */
387 IFUNC_IMPL (i
, name
, strcmp
,
388 #ifdef __LITTLE_ENDIAN__
389 IFUNC_IMPL_ADD (array
, i
, strcmp
,
390 (hwcap2
& PPC_FEATURE2_ARCH_3_1
)
391 && (hwcap
& PPC_FEATURE_HAS_VSX
),
393 IFUNC_IMPL_ADD (array
, i
, strcmp
,
394 hwcap2
& PPC_FEATURE2_ARCH_3_00
395 && hwcap
& PPC_FEATURE_HAS_ALTIVEC
,
398 IFUNC_IMPL_ADD (array
, i
, strcmp
,
399 hwcap2
& PPC_FEATURE2_ARCH_2_07
,
401 IFUNC_IMPL_ADD (array
, i
, strcmp
,
402 hwcap
& PPC_FEATURE_ARCH_2_06
,
404 IFUNC_IMPL_ADD (array
, i
, strcmp
, 1,
407 /* Support sysdeps/powerpc/powerpc64/multiarch/strcat.c. */
408 IFUNC_IMPL (i
, name
, strcat
,
409 IFUNC_IMPL_ADD (array
, i
, strcat
,
410 hwcap2
& PPC_FEATURE2_ARCH_2_07
411 && hwcap
& PPC_FEATURE_HAS_VSX
,
413 IFUNC_IMPL_ADD (array
, i
, strcat
,
414 hwcap
& PPC_FEATURE_ARCH_2_06
415 && hwcap
& PPC_FEATURE_HAS_VSX
,
417 IFUNC_IMPL_ADD (array
, i
, strcat
, 1,
420 /* Support sysdeps/powerpc/powerpc64/multiarch/strspn.c. */
421 IFUNC_IMPL (i
, name
, strspn
,
422 IFUNC_IMPL_ADD (array
, i
, strspn
,
423 hwcap2
& PPC_FEATURE2_ARCH_2_07
424 && hwcap
& PPC_FEATURE_HAS_VSX
,
426 IFUNC_IMPL_ADD (array
, i
, strspn
, 1,
429 /* Support sysdeps/powerpc/powerpc64/multiarch/strcspn.c. */
430 IFUNC_IMPL (i
, name
, strcspn
,
431 IFUNC_IMPL_ADD (array
, i
, strcspn
,
432 hwcap2
& PPC_FEATURE2_ARCH_2_07
433 && hwcap
& PPC_FEATURE_HAS_VSX
,
435 IFUNC_IMPL_ADD (array
, i
, strcspn
, 1,