-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
This patch provides optimized versions of stpcpy and wcpcpy with the z13 vector instructions. ChangeLog: * sysdeps/s390/multiarch/stpcpy-c.c: New File. * sysdeps/s390/multiarch/stpcpy-vx.S: Likewise. * sysdeps/s390/multiarch/stpcpy.c: Likewise. * sysdeps/s390/multiarch/wcpcpy-c.c: Likewise. * sysdeps/s390/multiarch/wcpcpy-vx.S: Likewise. * sysdeps/s390/multiarch/wcpcpy.c: Likewise. * sysdeps/s390/multiarch/Makefile (sysdep_routines): Add stpcpy and wcpcpy functions. * string/stpcpy.c: Use STPCPY if defined. * wcsmbs/wcpcpy.c: Use WCPCPY if defined. * sysdeps/s390/multiarch/ifunc-impl-list.c (__libc_ifunc_impl_list): Add ifunc test for stpcpy, wcpcpy. * string/test-stpcpy.c: Add wcpcpy support. * wcsmbs/test-wcpcpy.c: New File. * wcsmbs/Makefile (strop-tests): Add wcpcpy. * benchtests/bench-stpcpy.c: Add wcpcpy support. * benchtests/bench-wcpcpy.c: New File. * benchtests/Makefile (wcsmbs-bench): Add wcpcpy.
- Loading branch information
Stefan Liebler
authored and
Andreas Krebbel
committed
Aug 26, 2015
1 parent
680df12
commit 8ade3db
Showing
16 changed files
with
461 additions
and
24 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
/* Measure wcpcpy functions. | ||
Copyright (C) 2015 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/>. */ | ||
|
||
#define WIDE 1 | ||
#include "bench-stpcpy.c" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,11 +1,13 @@ | ||
ifeq ($(subdir),string) | ||
sysdep_routines += strlen strlen-vx strlen-c \ | ||
strnlen strnlen-vx strnlen-c \ | ||
strcpy strcpy-vx | ||
strcpy strcpy-vx \ | ||
stpcpy stpcpy-vx stpcpy-c | ||
endif | ||
|
||
ifeq ($(subdir),wcsmbs) | ||
sysdep_routines += wcslen wcslen-vx wcslen-c \ | ||
wcsnlen wcsnlen-vx wcsnlen-c \ | ||
wcscpy wcscpy-vx wcscpy-c | ||
wcscpy wcscpy-vx wcscpy-c \ | ||
wcpcpy wcpcpy-vx wcpcpy-c | ||
endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
/* Default stpcpy implementation for S/390. | ||
Copyright (C) 2015 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/>. */ | ||
|
||
#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) | ||
# define STPCPY __stpcpy_c | ||
# undef weak_alias | ||
# define weak_alias(a, b) | ||
# ifdef SHARED | ||
# undef libc_hidden_def | ||
# define libc_hidden_def(name) \ | ||
__hidden_ver1 (__stpcpy_c, __GI___stpcpy, __stpcpy_c); | ||
# undef libc_hidden_builtin_def | ||
# define libc_hidden_builtin_def(name) \ | ||
strong_alias (__stpcpy_c, __stpcpy_c_1); \ | ||
__hidden_ver1 (__stpcpy_c_1, __GI_stpcpy, __stpcpy_c_1); | ||
# endif /* SHARED */ | ||
|
||
|
||
# include <string/stpcpy.c> | ||
#endif /* HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,104 @@ | ||
/* Vector optimized 32/64 bit S/390 version of stpcpy. | ||
Copyright (C) 2015 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/>. */ | ||
|
||
#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) | ||
|
||
# include "sysdep.h" | ||
# include "asm-syntax.h" | ||
|
||
.text | ||
|
||
/* char * stpcpy (const char *dest, const char *src) | ||
Copy string src to dest returning a pointer to its end. | ||
Register usage: | ||
-r1=tmp | ||
-r2=dest and return value | ||
-r3=src | ||
-r4=tmp | ||
-r5=current_len | ||
-v16=part of src | ||
-v17=index of zero | ||
-v18=part of src | ||
*/ | ||
ENTRY(__stpcpy_vx) | ||
.machine "z13" | ||
.machinemode "zarch_nohighgprs" | ||
|
||
vlbb %v16,0(%r3),6 /* Load s until next 4k-byte boundary. */ | ||
lcbb %r1,0(%r3),6 /* Get bytes to 4k-byte boundary or 16. */ | ||
|
||
vfenezb %v17,%v16,%v16 /* Find element not equal with zero search. */ | ||
vlgvb %r5,%v17,7 /* Load zero index or 16 if not found. */ | ||
clrjl %r5,%r1,.Lfound_align /* If found zero within loaded bytes, | ||
copy bytes before and return. */ | ||
|
||
/* Align s to 16 byte. */ | ||
risbgn %r4,%r3,60,128+63,0 /* %r3 = bits 60-63 of %r2 'and' 15. */ | ||
lghi %r5,15 /* current_len = 15. */ | ||
slr %r5,%r4 /* Compute highest index to 16byte boundary. */ | ||
|
||
vstl %v16,%r5,0(%r2) /* Copy loaded characters - no zero. */ | ||
ahi %r5,1 /* Start loop at next character. */ | ||
|
||
/* Find zero in 16byte aligned loop. */ | ||
.Lloop: | ||
vl %v16,0(%r5,%r3) /* Load s. */ | ||
vfenezbs %v17,%v16,%v16 /* Find element not equal with zero search. */ | ||
je .Lfound_v16_0 /* Jump away if zero was found. */ | ||
vl %v18,16(%r5,%r3) /* Load next part of s. */ | ||
vst %v16,0(%r5,%r2) /* Store previous part without zero to dst. */ | ||
vfenezbs %v17,%v18,%v18 | ||
je .Lfound_v18_16 | ||
vl %v16,32(%r5,%r3) | ||
vst %v18,16(%r5,%r2) | ||
vfenezbs %v17,%v16,%v16 | ||
je .Lfound_v16_32 | ||
vl %v18,48(%r5,%r3) | ||
vst %v16,32(%r5,%r2) | ||
vfenezbs %v17,%v18,%v18 | ||
je .Lfound_v18_48 | ||
vst %v18,48(%r5,%r2) | ||
|
||
aghi %r5,64 | ||
j .Lloop /* No zero found -> loop. */ | ||
|
||
.Lfound_v16_32: | ||
aghi %r5,32 | ||
.Lfound_v16_0: | ||
la %r3,0(%r5,%r2) | ||
vlgvb %r1,%v17,7 /* Load byte index of zero. */ | ||
vstl %v16,%r1,0(%r3) /* Copy characters including zero. */ | ||
la %r2,0(%r1,%r3) /* Return pointer to zero. */ | ||
br %r14 | ||
|
||
.Lfound_v18_48: | ||
aghi %r5,32 | ||
.Lfound_v18_16: | ||
la %r3,16(%r5,%r2) | ||
vlgvb %r1,%v17,7 /* Load byte index of zero. */ | ||
vstl %v18,%r1,0(%r3) /* Copy characters including zero. */ | ||
la %r2,0(%r1,%r3) /* Return pointer to zero. */ | ||
br %r14 | ||
|
||
.Lfound_align: | ||
vstl %v16,%r5,0(%r2) /* Copy characters including zero. */ | ||
la %r2,0(%r5,%r2) /* Return pointer to zero. */ | ||
br %r14 | ||
END(__stpcpy_vx) | ||
#endif /* HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
/* Multiple versions of stpcpy. | ||
Copyright (C) 2015 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/>. */ | ||
|
||
#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) | ||
# define NO_MEMPCPY_STPCPY_REDIRECT | ||
# include <string.h> | ||
# include <ifunc-resolve.h> | ||
|
||
s390_vx_libc_ifunc (__stpcpy) | ||
weak_alias (__stpcpy, stpcpy) | ||
libc_hidden_builtin_def (stpcpy) | ||
|
||
#else | ||
# include <string/stpcpy.c> | ||
#endif /* !(defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc)) */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
/* Default wcslen implementation for S/390. | ||
Copyright (C) 2015 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/>. */ | ||
|
||
#if defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) | ||
# define WCPCPY __wcpcpy_c | ||
|
||
# include <wchar.h> | ||
extern __typeof (__wcpcpy) __wcpcpy_c; | ||
# include <wcsmbs/wcpcpy.c> | ||
#endif |
Oops, something went wrong.