]>
Commit | Line | Data |
---|---|---|
ae65139d | 1 | /* Enumerate available IFUNC implementations of a function. ARM version. |
d4697bc9 | 2 | Copyright (C) 2013-2014 Free Software Foundation, Inc. |
ae65139d WN |
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 | <http://www.gnu.org/licenses/>. */ | |
18 | ||
d7dffa6a | 19 | #include <stdbool.h> |
ae65139d WN |
20 | #include <string.h> |
21 | #include <ldsodefs.h> | |
22 | #include <sysdep.h> | |
23 | #include <ifunc-impl-list.h> | |
24 | ||
25 | /* Fill ARRAY of MAX elements with IFUNC implementations for function | |
26 | NAME and return the number of valid entries. */ | |
27 | ||
28 | size_t | |
29 | __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, | |
30 | size_t max) | |
31 | { | |
32 | size_t i = 0; | |
ae65139d | 33 | |
d7dffa6a | 34 | bool use_neon = true; |
5d5ef5db | 35 | #ifdef __ARM_NEON__ |
d7dffa6a | 36 | # define __memcpy_neon memcpy |
5d5ef5db | 37 | #else |
d7dffa6a | 38 | use_neon = (GLRO(dl_hwcap) & HWCAP_ARM_NEON) != 0; |
5d5ef5db | 39 | #endif |
d7dffa6a RM |
40 | |
41 | #ifndef __ARM_NEON__ | |
42 | bool use_vfp = true; | |
43 | # ifdef __SOFTFP__ | |
44 | use_vfp = (GLRO(dl_hwcap) & HWCAP_ARM_VFP) != 0; | |
45 | # endif | |
46 | #endif | |
47 | ||
48 | IFUNC_IMPL (i, name, memcpy, | |
49 | IFUNC_IMPL_ADD (array, i, memcpy, use_neon, __memcpy_neon) | |
5d5ef5db | 50 | #ifndef __ARM_NEON__ |
d7dffa6a | 51 | IFUNC_IMPL_ADD (array, i, memcpy, use_vfp, __memcpy_vfp) |
5d5ef5db | 52 | #endif |
ae65139d WN |
53 | IFUNC_IMPL_ADD (array, i, memcpy, 1, __memcpy_arm)); |
54 | ||
55 | return i; | |
56 | } |