diff options
author | Adhemerval Zanella <azanella@linux.vnet.ibm.com> | 2013-03-26 09:26:15 -0500 |
---|---|---|
committer | Adhemerval Zanella <azanella@linux.vnet.ibm.com> | 2013-03-26 09:26:15 -0500 |
commit | 8aa649dd3cfe67bf59c2aedf8df2e9b6ed484c42 (patch) | |
tree | 397282804a5b0451a13bd14d34f3e7370b5e8f8c /sysdeps | |
parent | a2f7665683ca5913883db08ee78dc9dd7bd6dda5 (diff) | |
download | glibc-8aa649dd3cfe67bf59c2aedf8df2e9b6ed484c42.tar.gz glibc-8aa649dd3cfe67bf59c2aedf8df2e9b6ed484c42.tar.xz glibc-8aa649dd3cfe67bf59c2aedf8df2e9b6ed484c42.zip |
Fixes and refactor for powerpc32/ifunc-impl-list
Diffstat (limited to 'sysdeps')
-rw-r--r-- | sysdeps/powerpc/powerpc32/multiarch/ifunc-impl-list.c | 32 |
1 files changed, 18 insertions, 14 deletions
diff --git a/sysdeps/powerpc/powerpc32/multiarch/ifunc-impl-list.c b/sysdeps/powerpc/powerpc32/multiarch/ifunc-impl-list.c index aae8d99c74..371467620b 100644 --- a/sysdeps/powerpc/powerpc32/multiarch/ifunc-impl-list.c +++ b/sysdeps/powerpc/powerpc32/multiarch/ifunc-impl-list.c @@ -25,11 +25,6 @@ /* Maximum number of IFUNC implementations. */ #define MAX_IFUNC 5 -/* Some of the . */ -#define PPC_POWER4 (PPC_FEATURE_POWER4|PPC_FEATURE_ARCH_2_05| \ - PPC_FEATURE_ARCH_2_06) -#define PPC_POWER6 (PPC_FEATURE_ARCH_2_05|PPC_FEATURE_ARCH_2_06) - size_t __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, size_t max) @@ -38,25 +33,34 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, size_t i = 0; - uint32_t hwcap; - - hwcap = GLRO(dl_hwcap); + unsigned long int hwcap = GLRO(dl_hwcap); + /* hwcap contains only the latest supported ISA, the code checks which is + and fill the previous supported ones. */ + if (hwcap & PPC_FEATURE_ARCH_2_06) + hwcap |= PPC_FEATURE_ARCH_2_05 | PPC_FEATURE_POWER5_PLUS | + PPC_FEATURE_POWER5 | PPC_FEATURE_POWER4; + else if (hwcap & PPC_FEATURE_ARCH_2_05) + hwcap |= PPC_FEATURE_POWER5_PLUS | PPC_FEATURE_POWER5 | PPC_FEATURE_POWER4; + else if (hwcap & PPC_FEATURE_POWER5_PLUS) + hwcap |= PPC_FEATURE_POWER5 | PPC_FEATURE_POWER4; + else if (hwcap & PPC_FEATURE_POWER5) + hwcap |= PPC_FEATURE_POWER4; IFUNC_IMPL (i, name, bzero, IFUNC_IMPL_ADD (array, i, bzero, hwcap & PPC_FEATURE_HAS_VSX, __bzero_power7) - IFUNC_IMPL_ADD (array, i, bzero, hwcap & PPC_POWER6, + IFUNC_IMPL_ADD (array, i, bzero, hwcap & PPC_FEATURE_ARCH_2_05, __bzero_power6) - IFUNC_IMPL_ADD (array, i, bzero, hwcap & PPC_POWER4, + IFUNC_IMPL_ADD (array, i, bzero, hwcap & PPC_FEATURE_POWER4, __bzero_power4) IFUNC_IMPL_ADD (array, i, bzero, 1, __bzero_ppc32)) IFUNC_IMPL (i, name, memset, IFUNC_IMPL_ADD (array, i, memset, hwcap & PPC_FEATURE_HAS_VSX, __memset_power7) - IFUNC_IMPL_ADD (array, i, memset, hwcap & PPC_POWER6, + IFUNC_IMPL_ADD (array, i, memset, hwcap & PPC_FEATURE_ARCH_2_05, __memset_power6) - IFUNC_IMPL_ADD (array, i, memset, hwcap & PPC_POWER4, + IFUNC_IMPL_ADD (array, i, memset, hwcap & PPC_FEATURE_POWER4, __memset_power4) IFUNC_IMPL_ADD (array, i, memset, 1, __memset_ppc32)) @@ -71,7 +75,7 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, __memcpy_power7) IFUNC_IMPL_ADD (array, i, memcpy, hwcap & PPC_FEATURE_ARCH_2_06, __memcpy_a2) - IFUNC_IMPL_ADD (array, i, memcpy, hwcap & PPC_POWER6, + IFUNC_IMPL_ADD (array, i, memcpy, hwcap & PPC_FEATURE_ARCH_2_05, __memcpy_power6) IFUNC_IMPL_ADD (array, i, memcpy, hwcap & (PPC_FEATURE_CELL_BE >> 16), @@ -86,7 +90,7 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, IFUNC_IMPL (i, name, strncmp, IFUNC_IMPL_ADD (array, i, strncmp, hwcap & PPC_FEATURE_HAS_VSX, __strncmp_power7) - IFUNC_IMPL_ADD (array, i, strncmp, hwcap & PPC_POWER4, + IFUNC_IMPL_ADD (array, i, strncmp, hwcap & PPC_FEATURE_POWER4, __strncmp_power4) IFUNC_IMPL_ADD (array, i, strncmp, 1, __strncmp_ppc32)) #endif |