mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-21 20:40:05 +00:00
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:
parent
bcca089526
commit
15d0da8cb3
10
ChangeLog
10
ChangeLog
@ -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
7
NEWS
@ -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
|
||||||
|
|
||||||
|
88
sysdeps/powerpc/powerpc32/power6/wcschr.c
Normal file
88
sysdeps/powerpc/powerpc32/power6/wcschr.c
Normal 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)
|
104
sysdeps/powerpc/powerpc32/power6/wcscpy.c
Normal file
104
sysdeps/powerpc/powerpc32/power6/wcscpy.c
Normal 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;
|
||||||
|
}
|
88
sysdeps/powerpc/powerpc32/power6/wcsrchr.c
Normal file
88
sysdeps/powerpc/powerpc32/power6/wcsrchr.c
Normal 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;
|
||||||
|
}
|
1
sysdeps/powerpc/powerpc64/power6/wcschr.c
Normal file
1
sysdeps/powerpc/powerpc64/power6/wcschr.c
Normal file
@ -0,0 +1 @@
|
|||||||
|
#include "../../powerpc32/power6/wcschr.c"
|
1
sysdeps/powerpc/powerpc64/power6/wcscpy.c
Normal file
1
sysdeps/powerpc/powerpc64/power6/wcscpy.c
Normal file
@ -0,0 +1 @@
|
|||||||
|
#include "../../powerpc32/power6/wcscpy.c"
|
1
sysdeps/powerpc/powerpc64/power6/wcsrchr.c
Normal file
1
sysdeps/powerpc/powerpc64/power6/wcsrchr.c
Normal file
@ -0,0 +1 @@
|
|||||||
|
#include "../../powerpc32/power6/wcsrchr.c"
|
Loading…
Reference in New Issue
Block a user