powerpc: Optimized strncat for POWER8

Message ID 1491811164-7320-1-git-send-email-raji@linux.vnet.ibm.com
State New
Headers show

Commit Message

Rajalakshmi Srinivasaraghavan April 10, 2017, 7:59 a.m.
With new optimized strnlen for POWER8 [1], this patch adds
strncat for power8 to make use of optimized strlen and strnlen.
This is faster than POWER7 current implementation for larger strings.

Tested on powerpc64 and powerpc64le.

[1] https://sourceware.org/ml/libc-alpha/2017-03/msg00491.html

--
2017-04-10  Rajalakshmi Srinivasaraghavan  <raji@linux.vnet.ibm.com>

	* sysdeps/powerpc/powerpc64/multiarch/Makefile (sysdep_routines): Add
	strncat-power8.
	* sysdeps/powerpc/powerpc64/multiarch/strncat.c (strncat): Add
	__strncat_power8 to ifunc list.
	* sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c
	(strncat): Add __strncat_power8 to list of strncat functions.
	* sysdeps/powerpc/powerpc64/multiarch/strncat-power8.c: New file.
---
 sysdeps/powerpc/powerpc64/multiarch/Makefile       |  3 ++-
 .../powerpc/powerpc64/multiarch/ifunc-impl-list.c  |  3 +++
 .../powerpc/powerpc64/multiarch/strncat-power8.c   | 31 ++++++++++++++++++++++
 sysdeps/powerpc/powerpc64/multiarch/strncat.c      |  5 +++-
 4 files changed, 40 insertions(+), 2 deletions(-)
 create mode 100644 sysdeps/powerpc/powerpc64/multiarch/strncat-power8.c

Comments

Tulio Magno Quites Machado Filho April 12, 2017, 5:29 p.m. | #1
Rajalakshmi Srinivasaraghavan <raji@linux.vnet.ibm.com> writes:

> With new optimized strnlen for POWER8 [1], this patch adds
> strncat for power8 to make use of optimized strlen and strnlen.
> This is faster than POWER7 current implementation for larger strings.
>
> Tested on powerpc64 and powerpc64le.
>
> [1] https://sourceware.org/ml/libc-alpha/2017-03/msg00491.html
>
> --
> 2017-04-10  Rajalakshmi Srinivasaraghavan  <raji@linux.vnet.ibm.com>
>
> 	* sysdeps/powerpc/powerpc64/multiarch/Makefile (sysdep_routines): Add
> 	strncat-power8.
> 	* sysdeps/powerpc/powerpc64/multiarch/strncat.c (strncat): Add
> 	__strncat_power8 to ifunc list.
> 	* sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c
> 	(strncat): Add __strncat_power8 to list of strncat functions.
> 	* sysdeps/powerpc/powerpc64/multiarch/strncat-power8.c: New file.

> diff --git a/sysdeps/powerpc/powerpc64/multiarch/Makefile b/sysdeps/powerpc/powerpc64/multiarch/Makefile
> index 38233a7..0eb3d07 100644
> --- a/sysdeps/powerpc/powerpc64/multiarch/Makefile
> +++ b/sysdeps/powerpc/powerpc64/multiarch/Makefile
> @@ -15,7 +15,8 @@ sysdep_routines += memcpy-power7 memcpy-a2 memcpy-power6 memcpy-cell \
>  		   strchrnul-power8 strchrnul-power7 strchrnul-ppc64 \
>  		   strcpy-power8 strcpy-power7 strcpy-ppc64 stpcpy-power8 \
>  		   stpcpy-power7 stpcpy-ppc64 \
> -		   strrchr-power7 strrchr-ppc64 strncat-power7 strncat-ppc64 \
> +		   strrchr-power7 strrchr-ppc64 \
> +		   strncat-power8 strncat-power7 strncat-ppc64 \

I wonder if these C optimizations should be forced to build using -mcpu and
-mtune.  At least for those processors supported by the minimum required GCC
version.
Anyway, it shouldn't affect your patch as -mcpu=power8 isn't available on
GCC 4.7

LGTM.
Carlos Eduardo Seo April 12, 2017, 7:01 p.m. | #2
On 4/10/17, 4:59 AM, "Rajalakshmi Srinivasaraghavan" <libc-alpha-owner@sourceware.org on behalf of raji@linux.vnet.ibm.com> wrote:

    With new optimized strnlen for POWER8 [1], this patch adds
    strncat for power8 to make use of optimized strlen and strnlen.
    This is faster than POWER7 current implementation for larger strings.
    
    Tested on powerpc64 and powerpc64le.
    

OK.

Patch

diff --git a/sysdeps/powerpc/powerpc64/multiarch/Makefile b/sysdeps/powerpc/powerpc64/multiarch/Makefile
index 38233a7..0eb3d07 100644
--- a/sysdeps/powerpc/powerpc64/multiarch/Makefile
+++ b/sysdeps/powerpc/powerpc64/multiarch/Makefile
@@ -15,7 +15,8 @@  sysdep_routines += memcpy-power7 memcpy-a2 memcpy-power6 memcpy-cell \
 		   strchrnul-power8 strchrnul-power7 strchrnul-ppc64 \
 		   strcpy-power8 strcpy-power7 strcpy-ppc64 stpcpy-power8 \
 		   stpcpy-power7 stpcpy-ppc64 \
-		   strrchr-power7 strrchr-ppc64 strncat-power7 strncat-ppc64 \
+		   strrchr-power7 strrchr-ppc64 \
+		   strncat-power8 strncat-power7 strncat-ppc64 \
 		   strncpy-power7 strncpy-ppc64 \
 		   stpncpy-power8 stpncpy-power7 stpncpy-ppc64 \
 		   strcmp-power9 strcmp-power8 strcmp-power7 strcmp-ppc64 \
diff --git a/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c b/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c
index 30a0133..bddec1a 100644
--- a/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c
+++ b/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c
@@ -292,6 +292,9 @@  __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,
+			      __strncat_power8)
+	      IFUNC_IMPL_ADD (array, i, strncat,
 			      hwcap & PPC_FEATURE_HAS_VSX,
 			      __strncat_power7)
 	      IFUNC_IMPL_ADD (array, i, strncat, 1,
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strncat-power8.c b/sysdeps/powerpc/powerpc64/multiarch/strncat-power8.c
new file mode 100644
index 0000000..1ec1259
--- /dev/null
+++ b/sysdeps/powerpc/powerpc64/multiarch/strncat-power8.c
@@ -0,0 +1,31 @@ 
+/* 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 <string.h>
+
+#define STRNCAT __strncat_power8
+
+extern __typeof (strncat) __strncat_power8 attribute_hidden;
+extern __typeof (strlen) __strlen_power8 attribute_hidden;
+extern __typeof (strnlen) __strnlen_power8 attribute_hidden;
+extern __typeof (memcpy) __memcpy_power7 attribute_hidden;
+
+#define strlen    __strlen_power8
+#define __strnlen __strnlen_power8
+#define memcpy    __memcpy_power7
+
+#include <string/strncat.c>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strncat.c b/sysdeps/powerpc/powerpc64/multiarch/strncat.c
index 1aa5c11..ba3fe5c 100644
--- a/sysdeps/powerpc/powerpc64/multiarch/strncat.c
+++ b/sysdeps/powerpc/powerpc64/multiarch/strncat.c
@@ -23,9 +23,12 @@ 
 
 extern __typeof (strncat) __strncat_ppc attribute_hidden;
 extern __typeof (strncat) __strncat_power7 attribute_hidden;
+extern __typeof (strncat) __strncat_power8 attribute_hidden;
 
 libc_ifunc (strncat,
-            (hwcap & PPC_FEATURE_HAS_VSX)
+	    (hwcap & PPC_FEATURE2_ARCH_2_07)
+	    ? __strncat_power8
+	    : (hwcap & PPC_FEATURE_HAS_VSX)
             ? __strncat_power7
             : __strncat_ppc);
 #endif