diff options
author | Rajalakshmi Srinivasaraghavan <raji@linux.vnet.ibm.com> | 2017-10-02 17:31:13 +0530 |
---|---|---|
committer | Rajalakshmi Srinivasaraghavan <raji@linux.vnet.ibm.com> | 2017-10-02 17:31:13 +0530 |
commit | 59ba2d2b542142e575d185f07e1eb96800d9862c (patch) | |
tree | f2137c2e24bf432a39491ac0aeacd08d8f4970f2 /sysdeps/powerpc/powerpc64/multiarch | |
parent | 397286ea93ad30c24a5dad7928d0056c7b7d603d (diff) | |
download | glibc-59ba2d2b542142e575d185f07e1eb96800d9862c.tar.gz glibc-59ba2d2b542142e575d185f07e1eb96800d9862c.tar.xz glibc-59ba2d2b542142e575d185f07e1eb96800d9862c.zip |
powerpc: Optimize memrchr for power8
Vectorized loops are used for sizes greater than 32B to improve performance over power7 optimization. This shows as an average of 25% improvement depending on the position of search character. The performance is same for shorter strings.
Diffstat (limited to 'sysdeps/powerpc/powerpc64/multiarch')
4 files changed, 47 insertions, 3 deletions
diff --git a/sysdeps/powerpc/powerpc64/multiarch/Makefile b/sysdeps/powerpc/powerpc64/multiarch/Makefile index f6491a2dc6..dea49acff5 100644 --- a/sysdeps/powerpc/powerpc64/multiarch/Makefile +++ b/sysdeps/powerpc/powerpc64/multiarch/Makefile @@ -6,8 +6,9 @@ sysdep_routines += memcpy-power7 memcpy-a2 memcpy-power6 memcpy-cell \ memset-ppc64 memset-power8 \ mempcpy-power7 mempcpy-ppc64 \ memchr-power8 memchr-power7 memchr-ppc64 \ - memrchr-power7 memrchr-ppc64 rawmemchr-power7 \ - rawmemchr-ppc64 strlen-power7 strlen-ppc64 \ + memrchr-power8 memrchr-power7 memrchr-ppc64 \ + rawmemchr-power7 rawmemchr-ppc64 \ + strlen-power7 strlen-ppc64 \ strnlen-power8 strnlen-power7 strnlen-ppc64 \ strcasecmp-power7 strcasecmp_l-power7 \ strncase-power7 strncase_l-power7 \ diff --git a/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c b/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c index a1d3ca0088..6a88536c98 100644 --- a/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c +++ b/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c @@ -194,6 +194,9 @@ __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, + __memrchr_power8) + IFUNC_IMPL_ADD (array, i, memrchr, hwcap & PPC_FEATURE_HAS_VSX, __memrchr_power7) IFUNC_IMPL_ADD (array, i, memrchr, 1, diff --git a/sysdeps/powerpc/powerpc64/multiarch/memrchr-power8.S b/sysdeps/powerpc/powerpc64/multiarch/memrchr-power8.S new file mode 100644 index 0000000000..0dcb9e75f3 --- /dev/null +++ b/sysdeps/powerpc/powerpc64/multiarch/memrchr-power8.S @@ -0,0 +1,28 @@ +/* Optimized memrchr implementation for PowerPC64/POWER8. + Copyright (C) 2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <sysdep.h> + +#define MEMRCHR __memrchr_power8 + +#undef libc_hidden_builtin_def +#define libc_hidden_builtin_def(name) +#undef weak_alias +#define weak_alias(name,alias) + +#include <sysdeps/powerpc/powerpc64/power8/memrchr.S> diff --git a/sysdeps/powerpc/powerpc64/multiarch/memrchr-ppc64.c b/sysdeps/powerpc/powerpc64/multiarch/memrchr-ppc64.c index 2fc706db71..be24689336 100644 --- a/sysdeps/powerpc/powerpc64/multiarch/memrchr-ppc64.c +++ b/sysdeps/powerpc/powerpc64/multiarch/memrchr-ppc64.c @@ -16,4 +16,16 @@ License along with the GNU C Library; if not, see <http://www.gnu.org/licenses/>. */ -#include <sysdeps/powerpc/powerpc32/power4/multiarch/memrchr-ppc32.c> +#include <string.h> + +#define MEMRCHR __memrchr_ppc + +#undef weak_alias +#define weak_alias(a, b) + +#undef libc_hidden_builtin_def +#define libc_hidden_builtin_def(name) + +extern __typeof (memrchr) __memrchr_ppc attribute_hidden; + +#include <string/memrchr.c> |