Add versions of wcscpy, wcschr, wcsrchr for power6/power7.

Initially based on the versions found in wcsmbs/* ; these files have
been changed by hand unrolling, and adding some additional variables
to allow some read-ahead to occur, which then relieves some of the
wait-for-increment/wait-for-load/wait-for-compare-results pressure
that was slowing down every iteration through the while-loop.

For 64-bit Power7, These changes give an approx 20% throughput boost
for the wcschr and wcsrchr functions; and approx 40% boost for the
wcscpy function.  32-bit improvements appear to be slightly better
with ~ %30 and ~ %45 respectively.  Results for Power6 closely match
those for power7.
This commit is contained in:
Will Schmidt 2012-08-22 11:04:42 -05:00 committed by Ryan S. Arnold
parent bcca089526
commit 15d0da8cb3
8 changed files with 298 additions and 2 deletions

View File

@ -1,3 +1,13 @@
2012-08-22 Will Schmidt <will_schmidt@vnet.ibm.com>
[BZ #14252]
* powerpc32/power6/wcschr.c: New file.
* powerpc32/power6/wcscpy.c: New file.
* powerpc32/power6/wcsrchr.c: New file.
* powerpc64/power6/wcschr.c: New file.
* powerpc64/power6/wcscpy.c: New file.
* powerpc64/power6/wcsrchr.c: New file.
2012-08-21 Maxim Kuvyrkov <maxim@codesourcery.com> 2012-08-21 Maxim Kuvyrkov <maxim@codesourcery.com>
* string/str-two-way.h (AVAILABLE1_USES_J): New macro, define default. * string/str-two-way.h (AVAILABLE1_USES_J): New macro, define default.

7
NEWS
View File

@ -10,8 +10,8 @@ Version 2.17
* The following bugs are resolved with this release: * The following bugs are resolved with this release:
6778, 6808, 9685, 11607, 13717, 13939, 14042, 14090, 14166, 14150, 14151, 6778, 6808, 9685, 11607, 13717, 13939, 14042, 14090, 14166, 14150, 14151,
14154, 14157, 14166, 14173, 14195, 14283, 14298, 14303, 14307, 14328, 14331, 14154, 14157, 14166, 14173, 14195, 14252, 14283, 14298, 14303, 14307,
14336, 14337, 14347, 14349 14328, 14331, 14336, 14337, 14347, 14349
* Support for STT_GNU_IFUNC symbols added for s390 and s390x. * Support for STT_GNU_IFUNC symbols added for s390 and s390x.
Optimized versions of memcpy, memset, and memcmp added for System z10 and Optimized versions of memcpy, memset, and memcmp added for System z10 and
@ -31,6 +31,9 @@ Version 2.17
* The minimum Linux kernel version that this version of the GNU C Library * The minimum Linux kernel version that this version of the GNU C Library
can be used with is 2.6.16. can be used with is 2.6.16.
* Optimizations of string functions memchr, wcschr, wcscpy, and wcsrchr for
powerpc POWER7. Implemented by Will Schmidt.
Version 2.16 Version 2.16

View File

@ -0,0 +1,88 @@
/* wcschr.c - Wide Character Search for powerpc32/power6.
Copyright (C) 2012 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; see the file COPYING.LIB. If
not, see <http://www.gnu.org/licenses/>. */
#include <wchar.h>
/* Find the first occurrence of WC in WCS. */
wchar_t *
wcschr (wcs, wc)
register const wchar_t *wcs;
register const wchar_t wc;
{
register const wchar_t *wcs2 = wcs + 1;
if (*wcs == wc)
return (wchar_t *) wcs;
if (*wcs == L'\0')
return NULL;
do
{
wcs += 2;
if (*wcs2 == wc)
return (wchar_t *) wcs2;
if (*wcs2 == L'\0')
return NULL;
wcs2 += 2;
if (*wcs == wc)
return (wchar_t *) wcs;
if (*wcs == L'\0')
return NULL;
wcs += 2;
if (*wcs2 == wc)
return (wchar_t *) wcs2;
if (*wcs2 == L'\0')
return NULL;
wcs2 += 2;
if (*wcs == wc)
return (wchar_t *) wcs;
if (*wcs == L'\0')
return NULL;
wcs += 2;
if (*wcs2 == wc)
return (wchar_t *) wcs2;
if (*wcs2 == L'\0')
return NULL;
wcs2 += 2;
if (*wcs == wc)
return (wchar_t *) wcs;
if (*wcs == L'\0')
return NULL;
wcs += 2;
if (*wcs2 == wc)
return (wchar_t *) wcs2;
if (*wcs2 == L'\0')
return NULL;
wcs2 += 2;
if (*wcs == wc)
return (wchar_t *) wcs;
}
while (*wcs != L'\0');
return NULL;
}
libc_hidden_def (wcschr)

View File

@ -0,0 +1,104 @@
/* wcscpy.c - Wide Character Copy for powerpc32/power6.
Copyright (C) 2012 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; see the file COPYING.LIB. If
not, see <http://www.gnu.org/licenses/>. */
#include <stddef.h>
#include <wchar.h>
/* Copy SRC to DEST. */
wchar_t *
wcscpy (dest, src)
wchar_t *dest;
const wchar_t *src;
{
wint_t c,d;
wchar_t *wcp, *wcp2;
if (__alignof__ (wchar_t) >= sizeof (wchar_t))
{
const ptrdiff_t off = dest - src;
wcp = (wchar_t *) src;
wcp2 = wcp + 1 ;
do
{
d = *wcp;
wcp[off] = d;
if (d == L'\0')
return dest;
wcp += 2;
c = *wcp2;
wcp2[off] = c;
if (c == L'\0')
return dest;
wcp2 += 2;
d = *wcp;
wcp[off] = d;
if (d == L'\0')
return dest;
wcp += 2;
c = *wcp2;
wcp2[off] = c;
if (c == L'\0')
return dest;
wcp2 += 2;
d = *wcp;
wcp[off] = d;
if (d == L'\0')
return dest;
wcp += 2;
c = *wcp2;
wcp2[off] = c;
if (c == L'\0')
return dest;
wcp2 += 2;
d = *wcp;
wcp[off] = d;
if (d == L'\0')
return dest;
wcp += 2;
c = *wcp2;
wcp2[off] = c;
if (c == L'\0')
return dest;
wcp2 += 2;
}
while (c != L'\0');
}
else
{
wcp = dest;
do
{
c = *src++;
*wcp++ = c;
}
while (c != L'\0');
}
return dest;
}

View File

@ -0,0 +1,88 @@
/* wcsrchr.c - Wide Character Reverse Search for powerpc32/power6.
Copyright (C) 2012 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; see the file COPYING.LIB. If
not, see <http://www.gnu.org/licenses/>. */
#include <wchar.h>
/* Find the last occurrence of WC in WCS. */
wchar_t *
wcsrchr (wcs, wc)
register const wchar_t *wcs;
register const wchar_t wc;
{
register const wchar_t *wcs2 = wcs + 1;
const wchar_t *retval = NULL;
if (*wcs == wc)
retval = wcs;
if (*wcs == L'\0') return (wchar_t *) retval;
do
{
wcs+=2;
if (*wcs2 == wc)
retval = wcs2;
if (*wcs2 == L'\0')
return (wchar_t *) retval;
wcs2+=2;
if (*wcs == wc)
retval = wcs;
if (*wcs == L'\0')
return (wchar_t *) retval;
wcs+=2;
if (*wcs2 == wc)
retval = wcs2;
if (*wcs2 == L'\0')
return (wchar_t *) retval;
wcs2+=2;
if (*wcs == wc)
retval = wcs;
if (*wcs == L'\0')
return (wchar_t *) retval;
wcs+=2;
if (*wcs2 == wc)
retval = wcs2;
if (*wcs2 == L'\0')
return (wchar_t *) retval;
wcs2+=2;
if (*wcs == wc)
retval = wcs;
if (*wcs == L'\0')
return (wchar_t *) retval;
wcs+=2;
if (*wcs2 == wc)
retval = wcs2;
if (*wcs2 == L'\0')
return (wchar_t *) retval;
wcs2+=2;
if (*wcs == wc)
retval = wcs;
}
while (*wcs != L'\0');
return (wchar_t *) retval;
}

View File

@ -0,0 +1 @@
#include "../../powerpc32/power6/wcschr.c"

View File

@ -0,0 +1 @@
#include "../../powerpc32/power6/wcscpy.c"

View File

@ -0,0 +1 @@
#include "../../powerpc32/power6/wcsrchr.c"