diff options
author | Anton Blanchard <anton@ozlabs.org> | 2021-07-27 15:47:51 +1000 |
---|---|---|
committer | Tulio Magno Quites Machado Filho <tuliom@linux.ibm.com> | 2021-08-06 16:10:08 -0300 |
commit | 60b4dd25790342b40e8942e3a4115f511a6b6911 (patch) | |
tree | 3e2684b2432e8fe0ff9f65fa66cb238112309a0b | |
parent | f2a15dd668913c5a1388ba7e1131b25162b2ea75 (diff) | |
download | glibc-60b4dd25790342b40e8942e3a4115f511a6b6911.tar.gz |
powerpc64: Add checks for Altivec and VSX in ifunc selection
We'd like to support processors without Altivec or VSX, so check
the relevant hwcap bits before selecting them.
Reviewed-by: Tulio Magno Quites Machado Filho <tuliom@linux.ibm.com>
26 files changed, 139 insertions, 68 deletions
diff --git a/sysdeps/powerpc/powerpc64/multiarch/bzero.c b/sysdeps/powerpc/powerpc64/multiarch/bzero.c index 660d7dc686..c8ffbea01c 100644 --- a/sysdeps/powerpc/powerpc64/multiarch/bzero.c +++ b/sysdeps/powerpc/powerpc64/multiarch/bzero.c @@ -38,11 +38,13 @@ libc_ifunc (__bzero, && hwcap & PPC_FEATURE_HAS_VSX) ? __bzero_power10 : # endif - (hwcap2 & PPC_FEATURE2_ARCH_2_07) + (hwcap2 & PPC_FEATURE2_ARCH_2_07 + && hwcap & PPC_FEATURE_HAS_ALTIVEC) ? __bzero_power8 : (hwcap & PPC_FEATURE_HAS_VSX) ? __bzero_power7 : - (hwcap & PPC_FEATURE_ARCH_2_05) + (hwcap & PPC_FEATURE_ARCH_2_05 + && hwcap & PPC_FEATURE_HAS_ALTIVEC) ? __bzero_power6 : (hwcap & PPC_FEATURE_POWER4) ? __bzero_power4 diff --git a/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c b/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c index a3fdcd43bd..c3e25c5981 100644 --- a/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c +++ b/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c @@ -60,9 +60,11 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, && hwcap & PPC_FEATURE_HAS_VSX, __memcpy_power10) #endif - IFUNC_IMPL_ADD (array, i, memcpy, hwcap2 & PPC_FEATURE2_ARCH_2_07, + IFUNC_IMPL_ADD (array, i, memcpy, hwcap2 & PPC_FEATURE2_ARCH_2_07 + && hwcap & PPC_FEATURE_HAS_ALTIVEC, __memcpy_power8_cached) - IFUNC_IMPL_ADD (array, i, memcpy, hwcap & PPC_FEATURE_HAS_VSX, + IFUNC_IMPL_ADD (array, i, memcpy, hwcap & PPC_FEATURE_ARCH_2_06 + && hwcap & PPC_FEATURE_HAS_ALTIVEC, __memcpy_power7) IFUNC_IMPL_ADD (array, i, memcpy, hwcap & PPC_FEATURE_ARCH_2_06, __memcpy_a2) @@ -83,7 +85,8 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, && hwcap & PPC_FEATURE_HAS_VSX, __memmove_power10) #endif - IFUNC_IMPL_ADD (array, i, memmove, hwcap & PPC_FEATURE_HAS_VSX, + IFUNC_IMPL_ADD (array, i, memmove, hwcap & PPC_FEATURE_ARCH_2_06 + && hwcap & PPC_FEATURE_HAS_ALTIVEC, __memmove_power7) IFUNC_IMPL_ADD (array, i, memmove, 1, __memmove_ppc)) @@ -98,6 +101,7 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, __memset_power10) #endif IFUNC_IMPL_ADD (array, i, memset, hwcap2 & PPC_FEATURE2_ARCH_2_07 + && hwcap & PPC_FEATURE_HAS_ALTIVEC && cacheline_size == 128, __memset_power8) IFUNC_IMPL_ADD (array, i, memset, hwcap & PPC_FEATURE_ARCH_2_06 @@ -114,12 +118,15 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, /* Support sysdeps/powerpc/powerpc64/multiarch/strcpy.c. */ IFUNC_IMPL (i, name, strcpy, #ifdef __LITTLE_ENDIAN__ - IFUNC_IMPL_ADD (array, i, strcpy, hwcap2 & PPC_FEATURE2_ARCH_3_00, + IFUNC_IMPL_ADD (array, i, strcpy, hwcap2 & PPC_FEATURE2_ARCH_3_00 + && hwcap & PPC_FEATURE_HAS_VSX, __strcpy_power9) #endif - IFUNC_IMPL_ADD (array, i, strcpy, hwcap2 & PPC_FEATURE2_ARCH_2_07, + IFUNC_IMPL_ADD (array, i, strcpy, hwcap2 & PPC_FEATURE2_ARCH_2_07 + && hwcap & PPC_FEATURE_HAS_ALTIVEC, __strcpy_power8) - IFUNC_IMPL_ADD (array, i, strcpy, hwcap & PPC_FEATURE_HAS_VSX, + IFUNC_IMPL_ADD (array, i, strcpy, hwcap & PPC_FEATURE_ARCH_2_06 + && hwcap & PPC_FEATURE_HAS_VSX, __strcpy_power7) IFUNC_IMPL_ADD (array, i, strcpy, 1, __strcpy_ppc)) @@ -127,12 +134,15 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, /* Support sysdeps/powerpc/powerpc64/multiarch/stpcpy.c. */ IFUNC_IMPL (i, name, stpcpy, #ifdef __LITTLE_ENDIAN__ - IFUNC_IMPL_ADD (array, i, stpcpy, hwcap2 & PPC_FEATURE2_ARCH_3_00, + IFUNC_IMPL_ADD (array, i, stpcpy, hwcap2 & PPC_FEATURE2_ARCH_3_00 + && hwcap & PPC_FEATURE_HAS_VSX, __stpcpy_power9) #endif - IFUNC_IMPL_ADD (array, i, stpcpy, hwcap2 & PPC_FEATURE2_ARCH_2_07, + IFUNC_IMPL_ADD (array, i, stpcpy, hwcap2 & PPC_FEATURE2_ARCH_2_07 + && hwcap & PPC_FEATURE_HAS_ALTIVEC, __stpcpy_power8) - IFUNC_IMPL_ADD (array, i, stpcpy, hwcap & PPC_FEATURE_HAS_VSX, + IFUNC_IMPL_ADD (array, i, stpcpy, hwcap & PPC_FEATURE_ARCH_2_06 + && hwcap & PPC_FEATURE_HAS_VSX, __stpcpy_power7) IFUNC_IMPL_ADD (array, i, stpcpy, 1, __stpcpy_ppc)) @@ -140,12 +150,15 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, /* Support sysdeps/powerpc/powerpc64/multiarch/strlen.c. */ IFUNC_IMPL (i, name, strlen, #ifdef __LITTLE_ENDIAN__ - IFUNC_IMPL_ADD (array, i, strlen, hwcap2 & PPC_FEATURE2_ARCH_3_1, + IFUNC_IMPL_ADD (array, i, strlen, hwcap2 & PPC_FEATURE2_ARCH_3_1 + && hwcap & PPC_FEATURE_HAS_VSX, __strlen_power10) - IFUNC_IMPL_ADD (array, i, strlen, hwcap2 & PPC_FEATURE2_ARCH_3_00, + IFUNC_IMPL_ADD (array, i, strlen, hwcap2 & PPC_FEATURE2_ARCH_3_00 + && hwcap & PPC_FEATURE_HAS_VSX, __strlen_power9) #endif - IFUNC_IMPL_ADD (array, i, strlen, hwcap2 & PPC_FEATURE2_ARCH_2_07, + IFUNC_IMPL_ADD (array, i, strlen, hwcap2 & PPC_FEATURE2_ARCH_2_07 + && hwcap & PPC_FEATURE_HAS_ALTIVEC, __strlen_power8) IFUNC_IMPL_ADD (array, i, strlen, hwcap & PPC_FEATURE_ARCH_2_06, __strlen_power7) @@ -155,7 +168,8 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, /* Support sysdeps/powerpc/powerpc64/multiarch/strncmp.c. */ IFUNC_IMPL (i, name, strncmp, #ifdef __LITTLE_ENDIAN__ - IFUNC_IMPL_ADD (array, i, strncmp, hwcap2 & PPC_FEATURE2_ARCH_3_00, + IFUNC_IMPL_ADD (array, i, strncmp, hwcap2 & PPC_FEATURE2_ARCH_3_00 + && hwcap & PPC_FEATURE_HAS_ALTIVEC, __strncmp_power9) #endif IFUNC_IMPL_ADD (array, i, strncmp, hwcap2 & PPC_FEATURE2_ARCH_2_07, @@ -170,7 +184,8 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, /* Support sysdeps/powerpc/powerpc64/multiarch/strchr.c. */ IFUNC_IMPL (i, name, strchr, IFUNC_IMPL_ADD (array, i, strchr, - hwcap2 & PPC_FEATURE2_ARCH_2_07, + hwcap2 & PPC_FEATURE2_ARCH_2_07 + && hwcap & PPC_FEATURE_HAS_ALTIVEC, __strchr_power8) IFUNC_IMPL_ADD (array, i, strchr, hwcap & PPC_FEATURE_ARCH_2_06, @@ -181,7 +196,8 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, /* Support sysdeps/powerpc/powerpc64/multiarch/strchrnul.c. */ IFUNC_IMPL (i, name, strchrnul, IFUNC_IMPL_ADD (array, i, strchrnul, - hwcap2 & PPC_FEATURE2_ARCH_2_07, + hwcap2 & PPC_FEATURE2_ARCH_2_07 + && hwcap & PPC_FEATURE_HAS_ALTIVEC, __strchrnul_power8) IFUNC_IMPL_ADD (array, i, strchrnul, hwcap & PPC_FEATURE_ARCH_2_06, @@ -198,7 +214,8 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, && hwcap & PPC_FEATURE_HAS_VSX, __memcmp_power10) #endif - IFUNC_IMPL_ADD (array, i, memcmp, hwcap2 & PPC_FEATURE2_ARCH_2_07, + IFUNC_IMPL_ADD (array, i, memcmp, hwcap2 & PPC_FEATURE2_ARCH_2_07 + && hwcap & PPC_FEATURE_HAS_ALTIVEC, __memcmp_power8) IFUNC_IMPL_ADD (array, i, memcmp, hwcap & PPC_FEATURE_ARCH_2_06, __memcmp_power7) @@ -215,11 +232,13 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, && hwcap & PPC_FEATURE_HAS_VSX, __bzero_power10) #endif - IFUNC_IMPL_ADD (array, i, bzero, hwcap2 & PPC_FEATURE2_ARCH_2_07, + IFUNC_IMPL_ADD (array, i, bzero, hwcap2 & PPC_FEATURE2_ARCH_2_07 + && hwcap & PPC_FEATURE_HAS_ALTIVEC, __bzero_power8) IFUNC_IMPL_ADD (array, i, bzero, hwcap & PPC_FEATURE_HAS_VSX, __bzero_power7) - IFUNC_IMPL_ADD (array, i, bzero, hwcap & PPC_FEATURE_ARCH_2_05, + IFUNC_IMPL_ADD (array, i, bzero, hwcap & PPC_FEATURE_ARCH_2_05 + && hwcap & PPC_FEATURE_HAS_ALTIVEC, __bzero_power6) IFUNC_IMPL_ADD (array, i, bzero, hwcap & PPC_FEATURE_POWER4, __bzero_power4) @@ -241,7 +260,8 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, /* Support sysdeps/powerpc/powerpc64/multiarch/mempcpy.c. */ IFUNC_IMPL (i, name, mempcpy, IFUNC_IMPL_ADD (array, i, mempcpy, - hwcap & PPC_FEATURE_HAS_VSX, + hwcap & PPC_FEATURE_ARCH_2_06 + && hwcap & PPC_FEATURE_HAS_ALTIVEC, __mempcpy_power7) IFUNC_IMPL_ADD (array, i, mempcpy, 1, __mempcpy_ppc)) @@ -249,7 +269,8 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, /* Support sysdeps/powerpc/powerpc64/multiarch/memchr.c. */ IFUNC_IMPL (i, name, memchr, IFUNC_IMPL_ADD (array, i, memchr, - hwcap2 & PPC_FEATURE2_ARCH_2_07, + hwcap2 & PPC_FEATURE2_ARCH_2_07 + && hwcap & PPC_FEATURE_HAS_ALTIVEC, __memchr_power8) IFUNC_IMPL_ADD (array, i, memchr, hwcap & PPC_FEATURE_ARCH_2_06, @@ -260,7 +281,8 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, /* Support sysdeps/powerpc/powerpc64/multiarch/memrchr.c. */ IFUNC_IMPL (i, name, memrchr, IFUNC_IMPL_ADD (array, i, memrchr, - hwcap2 & PPC_FEATURE2_ARCH_2_07, + hwcap2 & PPC_FEATURE2_ARCH_2_07 + && hwcap & PPC_FEATURE_HAS_ALTIVEC, __memrchr_power8) IFUNC_IMPL_ADD (array, i, memrchr, hwcap & PPC_FEATURE_ARCH_2_06, @@ -276,7 +298,8 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, && (hwcap & PPC_FEATURE_HAS_VSX), __rawmemchr_power10) IFUNC_IMPL_ADD (array, i, rawmemchr, - hwcap2 & PPC_FEATURE2_ARCH_3_00, + hwcap2 & PPC_FEATURE2_ARCH_3_00 + && hwcap & PPC_FEATURE_HAS_VSX, __rawmemchr_power9) #endif IFUNC_IMPL_ADD (array, i, rawmemchr, @@ -288,7 +311,8 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, /* Support sysdeps/powerpc/powerpc64/multiarch/strnlen.c. */ IFUNC_IMPL (i, name, strnlen, IFUNC_IMPL_ADD (array, i, strnlen, - hwcap2 & PPC_FEATURE2_ARCH_2_07, + hwcap2 & PPC_FEATURE2_ARCH_2_07 + && hwcap & PPC_FEATURE_HAS_ALTIVEC, __strnlen_power8) IFUNC_IMPL_ADD (array, i, strnlen, hwcap & PPC_FEATURE_ARCH_2_06, __strnlen_power7) @@ -298,7 +322,8 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, /* Support sysdeps/powerpc/powerpc64/multiarch/strcasecmp.c. */ IFUNC_IMPL (i, name, strcasecmp, IFUNC_IMPL_ADD (array, i, strcasecmp, - hwcap2 & PPC_FEATURE2_ARCH_2_07, + hwcap2 & PPC_FEATURE2_ARCH_2_07 + && hwcap & PPC_FEATURE_HAS_ALTIVEC, __strcasecmp_power8) IFUNC_IMPL_ADD (array, i, strcasecmp, hwcap & PPC_FEATURE_ARCH_2_06, @@ -316,7 +341,8 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, /* Support sysdeps/powerpc/powerpc64/multiarch/strncase.c. */ IFUNC_IMPL (i, name, strncasecmp, IFUNC_IMPL_ADD (array, i, strncasecmp, - hwcap2 & PPC_FEATURE2_ARCH_2_07, + hwcap2 & PPC_FEATURE2_ARCH_2_07 + && hwcap & PPC_FEATURE_HAS_ALTIVEC, __strncasecmp_power8) IFUNC_IMPL_ADD (array, i, strncasecmp, hwcap & PPC_FEATURE_ARCH_2_06, @@ -334,7 +360,8 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, /* Support sysdeps/powerpc/powerpc64/multiarch/strrchr.c. */ IFUNC_IMPL (i, name, strrchr, IFUNC_IMPL_ADD (array, i, strrchr, - hwcap2 & PPC_FEATURE2_ARCH_2_07, + hwcap2 & PPC_FEATURE2_ARCH_2_07 + && hwcap & PPC_FEATURE_HAS_ALTIVEC, __strrchr_power8) IFUNC_IMPL_ADD (array, i, strrchr, hwcap & PPC_FEATURE_ARCH_2_06, @@ -345,10 +372,12 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, /* Support sysdeps/powerpc/powerpc64/multiarch/strncat.c. */ IFUNC_IMPL (i, name, strncat, IFUNC_IMPL_ADD (array, i, strncat, - hwcap2 & PPC_FEATURE2_ARCH_2_07, + hwcap2 & PPC_FEATURE2_ARCH_2_07 + && hwcap & PPC_FEATURE_HAS_VSX, __strncat_power8) IFUNC_IMPL_ADD (array, i, strncat, - hwcap & PPC_FEATURE_HAS_VSX, + hwcap & PPC_FEATURE_ARCH_2_06 + && hwcap & PPC_FEATURE_HAS_VSX, __strncat_power7) IFUNC_IMPL_ADD (array, i, strncat, 1, __strncat_ppc)) @@ -391,7 +420,8 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, IFUNC_IMPL (i, name, strcmp, #ifdef __LITTLE_ENDIAN__ IFUNC_IMPL_ADD (array, i, strcmp, - hwcap2 & PPC_FEATURE2_ARCH_3_00, + hwcap2 & PPC_FEATURE2_ARCH_3_00 + && hwcap & PPC_FEATURE_HAS_ALTIVEC, __strcmp_power9) #endif IFUNC_IMPL_ADD (array, i, strcmp, @@ -406,10 +436,12 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, /* Support sysdeps/powerpc/powerpc64/multiarch/strcat.c. */ IFUNC_IMPL (i, name, strcat, IFUNC_IMPL_ADD (array, i, strcat, - hwcap2 & PPC_FEATURE2_ARCH_2_07, + hwcap2 & PPC_FEATURE2_ARCH_2_07 + && hwcap & PPC_FEATURE_HAS_VSX, __strcat_power8) IFUNC_IMPL_ADD (array, i, strcat, - hwcap & PPC_FEATURE_HAS_VSX, + hwcap & PPC_FEATURE_ARCH_2_06 + && hwcap & PPC_FEATURE_HAS_VSX, __strcat_power7) IFUNC_IMPL_ADD (array, i, strcat, 1, __strcat_ppc)) @@ -417,7 +449,8 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, /* Support sysdeps/powerpc/powerpc64/multiarch/strspn.c. */ IFUNC_IMPL (i, name, strspn, IFUNC_IMPL_ADD (array, i, strspn, - hwcap2 & PPC_FEATURE2_ARCH_2_07, + hwcap2 & PPC_FEATURE2_ARCH_2_07 + && hwcap & PPC_FEATURE_HAS_VSX, __strspn_power8) IFUNC_IMPL_ADD (array, i, strspn, 1, __strspn_ppc)) @@ -425,7 +458,8 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, /* Support sysdeps/powerpc/powerpc64/multiarch/strcspn.c. */ IFUNC_IMPL (i, name, strcspn, IFUNC_IMPL_ADD (array, i, strcspn, - hwcap2 & PPC_FEATURE2_ARCH_2_07, + hwcap2 & PPC_FEATURE2_ARCH_2_07 + && hwcap & PPC_FEATURE_HAS_VSX, __strcspn_power8) IFUNC_IMPL_ADD (array, i, strcspn, 1, __strcspn_ppc)) @@ -442,7 +476,8 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, /* Support sysdeps/powerpc/powerpc64/multiarch/strcasestr.c. */ IFUNC_IMPL (i, name, strcasestr, IFUNC_IMPL_ADD (array, i, strcasestr, - hwcap2 & PPC_FEATURE2_ARCH_2_07, + hwcap2 & PPC_FEATURE2_ARCH_2_07 + && hwcap & PPC_FEATURE_HAS_ALTIVEC, __strcasestr_power8) IFUNC_IMPL_ADD (array, i, strcasestr, 1, __strcasestr_ppc)) diff --git a/sysdeps/powerpc/powerpc64/multiarch/memchr.c b/sysdeps/powerpc/powerpc64/multiarch/memchr.c index c24186689e..f40013e061 100644 --- a/sysdeps/powerpc/powerpc64/multiarch/memchr.c +++ b/sysdeps/powerpc/powerpc64/multiarch/memchr.c @@ -28,7 +28,8 @@ extern __typeof (__memchr) __memchr_power8 attribute_hidden; /* Avoid DWARF definition DIE on ifunc symbol so that GDB can handle ifunc symbol properly. */ libc_ifunc (__memchr, - (hwcap2 & PPC_FEATURE2_ARCH_2_07) + (hwcap2 & PPC_FEATURE2_ARCH_2_07 + && hwcap & PPC_FEATURE_HAS_ALTIVEC) ? __memchr_power8 : (hwcap & PPC_FEATURE_ARCH_2_06) ? __memchr_power7 diff --git a/sysdeps/powerpc/powerpc64/multiarch/memcmp.c b/sysdeps/powerpc/powerpc64/multiarch/memcmp.c index 99559bce26..89b56c103b 100644 --- a/sysdeps/powerpc/powerpc64/multiarch/memcmp.c +++ b/sysdeps/powerpc/powerpc64/multiarch/memcmp.c @@ -38,7 +38,8 @@ libc_ifunc_redirected (__redirect_memcmp, memcmp, && hwcap & PPC_FEATURE_HAS_VSX) ? __memcmp_power10 : #endif - (hwcap2 & PPC_FEATURE2_ARCH_2_07) + (hwcap2 & PPC_FEATURE2_ARCH_2_07 + && hwcap & PPC_FEATURE_HAS_ALTIVEC) ? __memcmp_power8 : (hwcap & PPC_FEATURE_ARCH_2_06) ? __memcmp_power7 diff --git a/sysdeps/powerpc/powerpc64/multiarch/memcpy.c b/sysdeps/powerpc/powerpc64/multiarch/memcpy.c index 53ab32ef26..684ee064f2 100644 --- a/sysdeps/powerpc/powerpc64/multiarch/memcpy.c +++ b/sysdeps/powerpc/powerpc64/multiarch/memcpy.c @@ -45,9 +45,12 @@ libc_ifunc (__libc_memcpy, (hwcap2 & PPC_FEATURE2_ARCH_3_1 && hwcap & PPC_FEATURE_HAS_VSX) ? __memcpy_power10 : # endif - ((hwcap2 & PPC_FEATURE2_ARCH_2_07) && use_cached_memopt) + (hwcap2 & PPC_FEATURE2_ARCH_2_07 + && hwcap & PPC_FEATURE_HAS_ALTIVEC + && use_cached_memopt) ? __memcpy_power8_cached : - (hwcap & PPC_FEATURE_HAS_VSX) + (hwcap & PPC_FEATURE_ARCH_2_06 + && hwcap & PPC_FEATURE_HAS_ALTIVEC) ? __memcpy_power7 : (hwcap & PPC_FEATURE_ARCH_2_06) ? __memcpy_a2 : diff --git a/sysdeps/powerpc/powerpc64/multiarch/memmove.c b/sysdeps/powerpc/powerpc64/multiarch/memmove.c index 637b2cbf7f..50253b4554 100644 --- a/sysdeps/powerpc/powerpc64/multiarch/memmove.c +++ b/sysdeps/powerpc/powerpc64/multiarch/memmove.c @@ -41,7 +41,8 @@ libc_ifunc (__libc_memmove, && hwcap & PPC_FEATURE_HAS_VSX) ? __memmove_power10 : #endif - (hwcap & PPC_FEATURE_HAS_VSX) + (hwcap & PPC_FEATURE_ARCH_2_06 + && hwcap & PPC_FEATURE_HAS_ALTIVEC) ? __memmove_power7 : __memmove_ppc); diff --git a/sysdeps/powerpc/powerpc64/multiarch/mempcpy.c b/sysdeps/powerpc/powerpc64/multiarch/mempcpy.c index b37e0f35b5..563095a5ec 100644 --- a/sysdeps/powerpc/powerpc64/multiarch/mempcpy.c +++ b/sysdeps/powerpc/powerpc64/multiarch/mempcpy.c @@ -33,7 +33,8 @@ extern __typeof (__mempcpy) __mempcpy_power7 attribute_hidden; /* Avoid DWARF definition DIE on ifunc symbol so that GDB can handle ifunc symbol properly. */ libc_ifunc_redirected (__redirect___mempcpy, __mempcpy, - (hwcap & PPC_FEATURE_HAS_VSX) + (hwcap & PPC_FEATURE_ARCH_2_06 + && hwcap & PPC_FEATURE_HAS_ALTIVEC) ? __mempcpy_power7 : __mempcpy_ppc); diff --git a/sysdeps/powerpc/powerpc64/multiarch/memrchr.c b/sysdeps/powerpc/powerpc64/multiarch/memrchr.c index 16bb6f0042..a8b985b06a 100644 --- a/sysdeps/powerpc/powerpc64/multiarch/memrchr.c +++ b/sysdeps/powerpc/powerpc64/multiarch/memrchr.c @@ -28,7 +28,8 @@ extern __typeof (__memrchr) __memrchr_power8 attribute_hidden; /* Avoid DWARF definition DIE on ifunc symbol so that GDB can handle ifunc symbol properly. */ libc_ifunc (__memrchr, - (hwcap2 & PPC_FEATURE2_ARCH_2_07) + (hwcap2 & PPC_FEATURE2_ARCH_2_07 + && hwcap & PPC_FEATURE_HAS_ALTIVEC) ? __memrchr_power8 : (hwcap & PPC_FEATURE_ARCH_2_06) ? __memrchr_power7 diff --git a/sysdeps/powerpc/powerpc64/multiarch/memset.c b/sysdeps/powerpc/powerpc64/multiarch/memset.c index 056e911699..a2bc223bcc 100644 --- a/sysdeps/powerpc/powerpc64/multiarch/memset.c +++ b/sysdeps/powerpc/powerpc64/multiarch/memset.c @@ -48,6 +48,7 @@ libc_ifunc (__libc_memset, ? __memset_power10 : # endif (hwcap2 & PPC_FEATURE2_ARCH_2_07 + && hwcap & PPC_FEATURE_HAS_ALTIVEC && GLRO(dl_cache_line_size) == 128) ? __memset_power8 : (hwcap & PPC_FEATURE_ARCH_2_06 diff --git a/sysdeps/powerpc/powerpc64/multiarch/rawmemchr.c b/sysdeps/powerpc/powerpc64/multiarch/rawmemchr.c index b5d2d3a635..43eb459e02 100644 --- a/sysdeps/powerpc/powerpc64/multiarch/rawmemchr.c +++ b/sysdeps/powerpc/powerpc64/multiarch/rawmemchr.c @@ -38,7 +38,8 @@ libc_ifunc_redirected (__redirect___rawmemchr, __rawmemchr, (hwcap2 & PPC_FEATURE2_ARCH_3_1) && (hwcap & PPC_FEATURE_HAS_VSX) ? __rawmemchr_power10 : - (hwcap2 & PPC_FEATURE2_ARCH_3_00) + (hwcap2 & PPC_FEATURE2_ARCH_3_00 + && hwcap & PPC_FEATURE_HAS_VSX) ? __rawmemchr_power9 : # endif (hwcap & PPC_FEATURE_ARCH_2_06) diff --git a/sysdeps/powerpc/powerpc64/multiarch/stpcpy.c b/sysdeps/powerpc/powerpc64/multiarch/stpcpy.c index d4eb4285fc..5be413405e 100644 --- a/sysdeps/powerpc/powerpc64/multiarch/stpcpy.c +++ b/sysdeps/powerpc/powerpc64/multiarch/stpcpy.c @@ -32,12 +32,15 @@ extern __typeof (__stpcpy) __stpcpy_power9 attribute_hidden; libc_ifunc_hidden (__stpcpy, __stpcpy, # ifdef __LITTLE_ENDIAN__ - (hwcap2 & PPC_FEATURE2_ARCH_3_00) + (hwcap2 & PPC_FEATURE2_ARCH_3_00 + && hwcap & PPC_FEATURE_HAS_VSX) ? __stpcpy_power9 : # endif - (hwcap2 & PPC_FEATURE2_ARCH_2_07) + (hwcap2 & PPC_FEATURE2_ARCH_2_07 + && hwcap & PPC_FEATURE_HAS_ALTIVEC) ? __stpcpy_power8 - : (hwcap & PPC_FEATURE_HAS_VSX) + : (hwcap & PPC_FEATURE_ARCH_2_06 + && hwcap & PPC_FEATURE_HAS_VSX) ? __stpcpy_power7 : __stpcpy_ppc); diff --git a/sysdeps/powerpc/powerpc64/multiarch/strcasecmp.c b/sysdeps/powerpc/powerpc64/multiarch/strcasecmp.c index 55ca6c85c4..21ce2d279b 100644 --- a/sysdeps/powerpc/powerpc64/multiarch/strcasecmp.c +++ b/sysdeps/powerpc/powerpc64/multiarch/strcasecmp.c @@ -27,7 +27,8 @@ extern __typeof (__strcasecmp) __strcasecmp_power7 attribute_hidden; extern __typeof (__strcasecmp) __strcasecmp_power8 attribute_hidden; libc_ifunc (__libc_strcasecmp, - (hwcap2 & PPC_FEATURE2_ARCH_2_07) + (hwcap2 & PPC_FEATURE2_ARCH_2_07 + && hwcap & PPC_FEATURE_HAS_ALTIVEC) ? __strcasecmp_power8: (hwcap & PPC_FEATURE_ARCH_2_06) ? __strcasecmp_power7 diff --git a/sysdeps/powerpc/powerpc64/multiarch/strcasestr.c b/sysdeps/powerpc/powerpc64/multiarch/strcasestr.c index 7e4bd3b5ac..5bb3016022 100644 --- a/sysdeps/powerpc/powerpc64/multiarch/strcasestr.c +++ b/sysdeps/powerpc/powerpc64/multiarch/strcasestr.c @@ -27,7 +27,8 @@ extern __typeof (__strcasestr) __strcasestr_power8 attribute_hidden; /* Avoid DWARF definition DIE on ifunc symbol so that GDB can handle ifunc symbol properly. */ libc_ifunc (__strcasestr, - (hwcap2 & PPC_FEATURE2_ARCH_2_07) + (hwcap2 & PPC_FEATURE2_ARCH_2_07 + && hwcap & PPC_FEATURE_HAS_ALTIVEC) ? __strcasestr_power8 : __strcasestr_ppc); diff --git a/sysdeps/powerpc/powerpc64/multiarch/strcat.c b/sysdeps/powerpc/powerpc64/multiarch/strcat.c index 6d342324c4..d8d9870824 100644 --- a/sysdeps/powerpc/powerpc64/multiarch/strcat.c +++ b/sysdeps/powerpc/powerpc64/multiarch/strcat.c @@ -28,9 +28,11 @@ extern __typeof (strcat) __strcat_power8 attribute_hidden; # undef strcat libc_ifunc_redirected (__redirect_strcat, strcat, - (hwcap2 & PPC_FEATURE2_ARCH_2_07) + (hwcap2 & PPC_FEATURE2_ARCH_2_07 + && hwcap & PPC_FEATURE_HAS_VSX) ? __strcat_power8 - : (hwcap & PPC_FEATURE_HAS_VSX) + : (hwcap & PPC_FEATURE_ARCH_2_06 + && hwcap & PPC_FEATURE_HAS_VSX) ? __strcat_power7 : __strcat_ppc); #endif diff --git a/sysdeps/powerpc/powerpc64/multiarch/strchr.c b/sysdeps/powerpc/powerpc64/multiarch/strchr.c index 27c794c6b7..62b202baf9 100644 --- a/sysdeps/powerpc/powerpc64/multiarch/strchr.c +++ b/sysdeps/powerpc/powerpc64/multiarch/strchr.c @@ -33,7 +33,8 @@ extern __typeof (strchr) __strchr_power8 attribute_hidden; /* Avoid DWARF definition DIE on ifunc symbol so that GDB can handle ifunc symbol properly. */ libc_ifunc_redirected (__redirect_strchr, strchr, - (hwcap2 & PPC_FEATURE2_ARCH_2_07) + (hwcap2 & PPC_FEATURE2_ARCH_2_07 + && hwcap & PPC_FEATURE_HAS_ALTIVEC) ? __strchr_power8 : (hwcap & PPC_FEATURE_ARCH_2_06) ? __strchr_power7 diff --git a/sysdeps/powerpc/powerpc64/multiarch/strchrnul.c b/sysdeps/powerpc/powerpc64/multiarch/strchrnul.c index 4a07b4a242..40e529b9d9 100644 --- a/sysdeps/powerpc/powerpc64/multiarch/strchrnul.c +++ b/sysdeps/powerpc/powerpc64/multiarch/strchrnul.c @@ -28,7 +28,8 @@ extern __typeof (__strchrnul) __strchrnul_power8 attribute_hidden; /* Avoid DWARF definition DIE on ifunc symbol so that GDB can handle ifunc symbol properly. */ libc_ifunc (__strchrnul, - (hwcap2 & PPC_FEATURE2_ARCH_2_07) + (hwcap2 & PPC_FEATURE2_ARCH_2_07 + && hwcap & PPC_FEATURE_HAS_ALTIVEC) ? __strchrnul_power8 : (hwcap & PPC_FEATURE_ARCH_2_06) ? __strchrnul_power7 diff --git a/sysdeps/powerpc/powerpc64/multiarch/strcmp.c b/sysdeps/powerpc/powerpc64/multiarch/strcmp.c index 4b0b25fff6..8132682a99 100644 --- a/sysdeps/powerpc/powerpc64/multiarch/strcmp.c +++ b/sysdeps/powerpc/powerpc64/multiarch/strcmp.c @@ -35,7 +35,8 @@ extern __typeof (strcmp) __strcmp_power9 attribute_hidden; libc_ifunc_redirected (__redirect_strcmp, strcmp, # ifdef __LITTLE_ENDIAN__ - (hwcap2 & PPC_FEATURE2_ARCH_3_00) + (hwcap2 & PPC_FEATURE2_ARCH_3_00 + && hwcap & PPC_FEATURE_HAS_ALTIVEC) ? __strcmp_power9 : # endif (hwcap2 & PPC_FEATURE2_ARCH_2_07) diff --git a/sysdeps/powerpc/powerpc64/multiarch/strcpy.c b/sysdeps/powerpc/powerpc64/multiarch/strcpy.c index b733fa5a23..5af1d45cc1 100644 --- a/sysdeps/powerpc/powerpc64/multiarch/strcpy.c +++ b/sysdeps/powerpc/powerpc64/multiarch/strcpy.c @@ -32,12 +32,15 @@ extern __typeof (strcpy) __strcpy_power9 attribute_hidden; libc_ifunc_redirected (__redirect_strcpy, strcpy, # ifdef __LITTLE_ENDIAN__ - (hwcap2 & PPC_FEATURE2_ARCH_3_00) + (hwcap2 & PPC_FEATURE2_ARCH_3_00 + && hwcap & PPC_FEATURE_HAS_VSX) ? __strcpy_power9 : # endif - (hwcap2 & PPC_FEATURE2_ARCH_2_07) + (hwcap2 & PPC_FEATURE2_ARCH_2_07 + && hwcap & PPC_FEATURE_HAS_ALTIVEC) ? __strcpy_power8 - : (hwcap & PPC_FEATURE_HAS_VSX) + : (hwcap & PPC_FEATURE_ARCH_2_06 + && hwcap & PPC_FEATURE_HAS_VSX) ? __strcpy_power7 : __strcpy_ppc); #endif diff --git a/sysdeps/powerpc/powerpc64/multiarch/strcspn.c b/sysdeps/powerpc/powerpc64/multiarch/strcspn.c index 683aa104d7..8ba01c13b1 100644 --- a/sysdeps/powerpc/powerpc64/multiarch/strcspn.c +++ b/sysdeps/powerpc/powerpc64/multiarch/strcspn.c @@ -27,7 +27,8 @@ extern __typeof (strcspn) __strcspn_ppc attribute_hidden; extern __typeof (strcspn) __strcspn_power8 attribute_hidden; libc_ifunc (__libc_strcspn, - (hwcap2 & PPC_FEATURE2_ARCH_2_07) + (hwcap2 & PPC_FEATURE2_ARCH_2_07 + && hwcap & PPC_FEATURE_HAS_VSX) ? __strcspn_power8 : __strcspn_ppc); diff --git a/sysdeps/powerpc/powerpc64/multiarch/strlen.c b/sysdeps/powerpc/powerpc64/multiarch/strlen.c index 0cd1c6faff..f1e28414e0 100644 --- a/sysdeps/powerpc/powerpc64/multiarch/strlen.c +++ b/sysdeps/powerpc/powerpc64/multiarch/strlen.c @@ -35,12 +35,15 @@ extern __typeof (__redirect_strlen) __strlen_power10 attribute_hidden; libc_ifunc (__libc_strlen, # ifdef __LITTLE_ENDIAN__ - (hwcap2 & PPC_FEATURE2_ARCH_3_1) + (hwcap2 & PPC_FEATURE2_ARCH_3_1 + && hwcap & PPC_FEATURE_HAS_VSX) ? __strlen_power10 : - (hwcap2 & PPC_FEATURE2_ARCH_3_00) + (hwcap2 & PPC_FEATURE2_ARCH_3_00 + && hwcap & PPC_FEATURE_HAS_VSX) ? __strlen_power9 : # endif - (hwcap2 & PPC_FEATURE2_ARCH_2_07) + (hwcap2 & PPC_FEATURE2_ARCH_2_07 + && hwcap & PPC_FEATURE_HAS_ALTIVEC) ? __strlen_power8 : (hwcap & PPC_FEATURE_ARCH_2_06) ? __strlen_power7 diff --git a/sysdeps/powerpc/powerpc64/multiarch/strncase.c b/sysdeps/powerpc/powerpc64/multiarch/strncase.c index 644046bd74..2802cf2c3f 100644 --- a/sysdeps/powerpc/powerpc64/multiarch/strncase.c +++ b/sysdeps/powerpc/powerpc64/multiarch/strncase.c @@ -27,7 +27,8 @@ extern __typeof (__strncasecmp) __strncasecmp_power7 attribute_hidden; extern __typeof (__strncasecmp) __strncasecmp_power8 attribute_hidden; libc_ifunc (__libc_strncasecmp, - (hwcap2 & PPC_FEATURE2_ARCH_2_07) + (hwcap2 & PPC_FEATURE2_ARCH_2_07 + && hwcap & PPC_FEATURE_HAS_ALTIVEC) ? __strncasecmp_power8: (hwcap & PPC_FEATURE_ARCH_2_06) ? __strncasecmp_power7 diff --git a/sysdeps/powerpc/powerpc64/multiarch/strncat.c b/sysdeps/powerpc/powerpc64/multiarch/strncat.c index 0036fca91a..9ea294a72d 100644 --- a/sysdeps/powerpc/powerpc64/multiarch/strncat.c +++ b/sysdeps/powerpc/powerpc64/multiarch/strncat.c @@ -26,9 +26,11 @@ extern __typeof (strncat) __strncat_power7 attribute_hidden; extern __typeof (strncat) __strncat_power8 attribute_hidden; libc_ifunc (strncat, - (hwcap2 & PPC_FEATURE2_ARCH_2_07) + (hwcap2 & PPC_FEATURE2_ARCH_2_07 + && hwcap & PPC_FEATURE_HAS_VSX) ? __strncat_power8 - : (hwcap & PPC_FEATURE_HAS_VSX) + : (hwcap & PPC_FEATURE_ARCH_2_06 + && hwcap & PPC_FEATURE_HAS_VSX) ? __strncat_power7 : __strncat_ppc); #endif diff --git a/sysdeps/powerpc/powerpc64/multiarch/strncmp.c b/sysdeps/powerpc/powerpc64/multiarch/strncmp.c index 1f689e5c05..2d21122854 100644 --- a/sysdeps/powerpc/powerpc64/multiarch/strncmp.c +++ b/sysdeps/powerpc/powerpc64/multiarch/strncmp.c @@ -38,7 +38,8 @@ extern __typeof (strncmp) __strncmp_power9 attribute_hidden; ifunc symbol properly. */ libc_ifunc_redirected (__redirect_strncmp, strncmp, # ifdef __LITTLE_ENDIAN__ - (hwcap2 & PPC_FEATURE2_ARCH_3_00) + (hwcap2 & PPC_FEATURE2_ARCH_3_00 + && hwcap & PPC_FEATURE_HAS_ALTIVEC) ? __strncmp_power9 : # endif (hwcap2 & PPC_FEATURE2_ARCH_2_07) diff --git a/sysdeps/powerpc/powerpc64/multiarch/strnlen.c b/sysdeps/powerpc/powerpc64/multiarch/strnlen.c index baf375a75a..e68e9d9f88 100644 --- a/sysdeps/powerpc/powerpc64/multiarch/strnlen.c +++ b/sysdeps/powerpc/powerpc64/multiarch/strnlen.c @@ -29,7 +29,8 @@ extern __typeof (__strnlen) __strnlen_power8 attribute_hidden; # undef strnlen # undef __strnlen libc_ifunc_redirected (__redirect___strnlen, __strnlen, - (hwcap2 & PPC_FEATURE2_ARCH_2_07) + (hwcap2 & PPC_FEATURE2_ARCH_2_07 + && hwcap & PPC_FEATURE_HAS_ALTIVEC) ? __strnlen_power8 : (hwcap & PPC_FEATURE_ARCH_2_06) ? __strnlen_power7 diff --git a/sysdeps/powerpc/powerpc64/multiarch/strrchr.c b/sysdeps/powerpc/powerpc64/multiarch/strrchr.c index 1c9eea1817..7f0cf2a1b7 100644 --- a/sysdeps/powerpc/powerpc64/multiarch/strrchr.c +++ b/sysdeps/powerpc/powerpc64/multiarch/strrchr.c @@ -31,7 +31,8 @@ extern __typeof (strrchr) __strrchr_power8 attribute_hidden; /* Avoid DWARF definition DIE on ifunc symbol so that GDB can handle ifunc symbol properly. */ libc_ifunc_redirected (__redirect_strrchr, strrchr, - (hwcap2 & PPC_FEATURE2_ARCH_2_07) + (hwcap2 & PPC_FEATURE2_ARCH_2_07 + && hwcap & PPC_FEATURE_HAS_ALTIVEC) ? __strrchr_power8 : (hwcap & PPC_FEATURE_ARCH_2_06) ? __strrchr_power7 diff --git a/sysdeps/powerpc/powerpc64/multiarch/strspn.c b/sysdeps/powerpc/powerpc64/multiarch/strspn.c index 70167a176b..7613ab3d55 100644 --- a/sysdeps/powerpc/powerpc64/multiarch/strspn.c +++ b/sysdeps/powerpc/powerpc64/multiarch/strspn.c @@ -27,7 +27,8 @@ extern __typeof (strspn) __strspn_ppc attribute_hidden; extern __typeof (strspn) __strspn_power8 attribute_hidden; libc_ifunc (__libc_strspn, - (hwcap2 & PPC_FEATURE2_ARCH_2_07) + (hwcap2 & PPC_FEATURE2_ARCH_2_07 + && hwcap & PPC_FEATURE_HAS_VSX) ? __strspn_power8 : __strspn_ppc); |