From patchwork Fri Jun 6 14:55:31 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: vidya@linux.vnet.ibm.com X-Patchwork-Id: 356838 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 36FC81400A0 for ; Sat, 7 Jun 2014 00:55:43 +1000 (EST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:cc:subject:date:message-id; q=dns; s= default; b=YbbD96HT2eV628+J7EMIPNB5BTlIlMNhLAY9nAvUBMRLF2KOAFJeq h7f7Mo7lAfOFwTyCxwvirnKPB+6kVMDdUlqWkgmKArU16xQ6CIv7PuSDtb9P58cl JKIlNM+uuF8KJpLi33+iaJi7JnAUvGy01Lm8dwobORZ0SknkLLwbds= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:cc:subject:date:message-id; s=default; bh=yqBlelj8hkHbNnRgfzS6Y1kRuSk=; b=on+Z+FaYfMy+Nju+Yve9HsoiBa6n H9zR7THqE0EkNZApryx88blNF0CYL01GKCv8nMP+C9HbQ5NH/h0swdT4VwGvL+Lu iCGAMslcJtTnyACfiKUZLAtNd4UlfFueil3wNgIUDL7Xjc2ZVR4Z9LqNoHo/Eo9B 2doQF1F8O/nPh5Q= Received: (qmail 5675 invoked by alias); 6 Jun 2014 14:55:37 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 5665 invoked by uid 89); 6 Jun 2014 14:55:37 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.3 required=5.0 tests=AWL, BAYES_00, RP_MATCHES_RCVD autolearn=ham version=3.3.2 X-HELO: e28smtp03.in.ibm.com From: vidya@linux.vnet.ibm.com To: libc-alpha@sourceware.org Cc: Vidya Ranganathan Subject: [PATCH] Fast catenation for Power7. Date: Fri, 6 Jun 2014 10:55:31 -0400 Message-Id: <1402066531-23035-1-git-send-email-vidya@linux.vnet.ibm.com> X-TM-AS-MML: disable X-Content-Scanned: Fidelis XPS MAILER x-cbid: 14060614-3864-0000-0000-00000EA8907C From: Vidya Ranganathan An IFUNC version for POWER7 to call __strlen_power7/__strcpy_power7 following logic at glibc-git/sysdeps/powerpc/strcat.c has been created. __strlen_power7 and __strcpy_power7 performs aligned memory access and improves performance significantly. Change log: * string/strcat.c: Using macro to redefine symbol name. * sysdeps/powerpc/strcat.c: Using macro to redefine symbol name. * sysdeps/powerpc/powerpc64/multiarch/Makefile: Add strcat multiarch optimizations. * sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c: (__libc_ifunc_impl_list): Likewise. * sysdeps/powerpc/powerpc64/multiarch/strcat.c: New file: multiarch strcat for PPC64. * sysdeps/powerpc/powerpc64/multiarch/strcat-ppc64.c: New file * sysdeps/powerpc/powerpc64/multiarch/strcat-power7.c: New file Signed-off-by: Vidya Ranganathan --- string/strcat.c | 7 +++-- sysdeps/powerpc/powerpc64/multiarch/Makefile | 2 +- .../powerpc/powerpc64/multiarch/ifunc-impl-list.c | 8 ++++++ .../powerpc/powerpc64/multiarch/strcat-power7.c | 28 +++++++++++++++++++ sysdeps/powerpc/powerpc64/multiarch/strcat-ppc64.c | 29 ++++++++++++++++++++ sysdeps/powerpc/powerpc64/multiarch/strcat.c | 31 ++++++++++++++++++++++ sysdeps/powerpc/strcat.c | 9 ++++--- 7 files changed, 108 insertions(+), 6 deletions(-) create mode 100644 sysdeps/powerpc/powerpc64/multiarch/strcat-power7.c create mode 100644 sysdeps/powerpc/powerpc64/multiarch/strcat-ppc64.c create mode 100644 sysdeps/powerpc/powerpc64/multiarch/strcat.c diff --git a/string/strcat.c b/string/strcat.c index 2cbe8b3..14d311c 100644 --- a/string/strcat.c +++ b/string/strcat.c @@ -17,11 +17,14 @@ #include -#undef strcat +#ifndef STRCAT +# undef strcat +# define STRCAT strcat +#endif /* Append SRC on the end of DEST. */ char * -strcat (char *dest, const char *src) +STRCAT (char *dest, const char *src) { char *s1 = dest; const char *s2 = src; diff --git a/sysdeps/powerpc/powerpc64/multiarch/Makefile b/sysdeps/powerpc/powerpc64/multiarch/Makefile index 35020a7..e5670b1 100644 --- a/sysdeps/powerpc/powerpc64/multiarch/Makefile +++ b/sysdeps/powerpc/powerpc64/multiarch/Makefile @@ -17,7 +17,7 @@ sysdep_routines += memcpy-power7 memcpy-a2 memcpy-power6 memcpy-cell \ strrchr-power7 strrchr-ppc64 strncat-power7 strncat-ppc64 \ strspn-power7 strspn-ppc64 strcspn-power7 strcspn-ppc64 \ strpbrk-power7 strpbrk-ppc64 strncpy-power7 strncpy-ppc64 \ - stpncpy-power7 stpncpy-ppc64 + stpncpy-power7 stpncpy-ppc64 strcat-power7 strcat-ppc64 CFLAGS-strncase-power7.c += -mcpu=power7 -funroll-loops CFLAGS-strncase_l-power7.c += -mcpu=power7 -funroll-loops diff --git a/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c b/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c index d8578fb..747180a 100644 --- a/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c +++ b/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c @@ -294,5 +294,13 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, IFUNC_IMPL_ADD (array, i, stpncpy, 1, __stpncpy_ppc)) + /* Support sysdeps/powerpc/powerpc64/multiarch/strcat.c. */ + IFUNC_IMPL (i, name, strcat, + IFUNC_IMPL_ADD (array, i, strcat, + hwcap & PPC_FEATURE_HAS_VSX, + __strcat_power7) + IFUNC_IMPL_ADD (array, i, strcat, 1, + __strcat_ppc)) + return i; } diff --git a/sysdeps/powerpc/powerpc64/multiarch/strcat-power7.c b/sysdeps/powerpc/powerpc64/multiarch/strcat-power7.c new file mode 100644 index 0000000..ba9a460 --- /dev/null +++ b/sysdeps/powerpc/powerpc64/multiarch/strcat-power7.c @@ -0,0 +1,28 @@ +/* Copyright (C) 2014 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 + . */ + +#include + +#define STRCAT __strcat_power7 + +#undef libc_hidden_def +#define libc_hidden_def(name) + +#define strcpy __strcpy_power7 +#define strlen __strlen_power7 + +#include diff --git a/sysdeps/powerpc/powerpc64/multiarch/strcat-ppc64.c b/sysdeps/powerpc/powerpc64/multiarch/strcat-ppc64.c new file mode 100644 index 0000000..1245764 --- /dev/null +++ b/sysdeps/powerpc/powerpc64/multiarch/strcat-ppc64.c @@ -0,0 +1,29 @@ +/* Copyright (C) 2014 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 + . */ + +#include + +#define STRCAT __strcat_ppc +#ifdef SHARED +# undef libc_hidden_builtin_def +# define libc_hidden_builtin_def(name) \ + __hidden_ver1 (__strcat_ppc, __GI_strcat, __strcat_ppc); +#endif + +extern __typeof (strcat) __strcat_ppc attribute_hidden; + +#include diff --git a/sysdeps/powerpc/powerpc64/multiarch/strcat.c b/sysdeps/powerpc/powerpc64/multiarch/strcat.c new file mode 100644 index 0000000..847a62d --- /dev/null +++ b/sysdeps/powerpc/powerpc64/multiarch/strcat.c @@ -0,0 +1,31 @@ +/* Multiple versions of strcat. PowerPC64 version. + Copyright (C) 2014 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 + . */ + +#ifndef NOT_IN_libc +# include +# include +# include "init-arch.h" + +extern __typeof (strcat) __strcat_ppc attribute_hidden; +extern __typeof (strcat) __strcat_power7 attribute_hidden; + +libc_ifunc (strcat, + (hwcap & PPC_FEATURE_HAS_VSX) + ? __strcat_power7 + : __strcat_ppc); +#endif diff --git a/sysdeps/powerpc/strcat.c b/sysdeps/powerpc/strcat.c index 06ceca7..4ff37ea 100644 --- a/sysdeps/powerpc/strcat.c +++ b/sysdeps/powerpc/strcat.c @@ -18,13 +18,16 @@ #include -#undef strcat +#ifndef STRCAT +# undef strcat +# define STRCAT strcat +#endif /* Append SRC on the end of DEST. */ char * -strcat (char *dest, const char *src) +STRCAT(char *dest, const char *src) { strcpy (dest + strlen (dest), src); return dest; } -libc_hidden_builtin_def (strcat) +libc_hidden_builtin_def (STRCAT)