-
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.
S390: Refactor ifunc implementations and enable ifunc-test-framework.
On s390 all ifunc resolvers were implemented in multiarch/ifunc-resolve.c. The resulting single object files has undefined references to all ifunc-functions. This patch introduces one multiarch/<func>.c file for each of memcpy, memcmp and memset with the function specific ifunc resolver. The different function implementations are now implemented in multiarch/<func>-s390x.S (moved from multiarch/<func>.S). The new multiarch/ifunc-resolve.h file contains the ifunc-resolver macro and other helper-macros. They are merged and are now used in common for 32/64bit. Therefore the __<func>_g5/__<func>_z900 functions were renamed to __<func>_default. This patch also enables testing the ifunc implementations by implementing the function __libc_ifunc_impl_list. It uses the helper-macros of ifunc-resolve.h. ChangeLog: * sysdeps/s390/s390-32/multiarch/Makefile (sysdep_routines): Remove ifunc-resolve, add memset-s390, memcpy-s390, memcmp-s390. * sysdeps/s390/s390-32/multiarch/ifunc-resolve.c: Delete File. * sysdeps/s390/s390-32/multiarch/memcmp.S: Move to ... * sysdeps/s390/s390-32/multiarch/memcmp-s390.S: ... here. (memcmp, bcmp): Use __memcmp_default as alias source. * sysdeps/s390/s390-32/multiarch/memcmp.c: New File. * sysdeps/s390/s390-32/memcmp.S (__memcmp_g5): Rename to __memcmp_default. * sysdeps/s390/s390-32/multiarch/memcpy.S: Move to ... * sysdeps/s390/s390-32/multiarch/memcpy-s390.S: ... here. (memcpy): Use __memcpy_default as alias source. * sysdeps/s390/s390-32/multiarch/memcpy.c: New File. * sysdeps/s390/s390-32/memcpy.S (__memcpy_g5): Rename to __memcpy_default. * sysdeps/s390/s390-32/multiarch/memset.S: Move to ... * sysdeps/s390/s390-32/multiarch/memset-s390.S: ... here. (memset): Use __memset_default as alias source. * sysdeps/s390/s390-32/multiarch/memset.c: New File. * sysdeps/s390/s390-32/memset.S (__memset_g5): Rename to __memset_default. * sysdeps/s390/s390-64/multiarch/Makefile (sysdep_routines): Remove ifunc-resolve, add memset-s390x, memcpy-s390x, memcmp-s390x. * sysdeps/s390/s390-64/multiarch/ifunc-resolve.c: Delete File. * sysdeps/s390/s390-64/multiarch/memcmp.S: Move to ... * sysdeps/s390/s390-64/multiarch/memcmp-s390x.S: ... here. (memcmp, bcmp): Use __memcmp_default as alias source. * sysdeps/s390/s390-64/multiarch/memcmp.c: New File. * sysdeps/s390/s390-64/memcmp.S (__memcmp_z900): Rename to __memcmp_default. * sysdeps/s390/s390-64/multiarch/memcpy.S: Move to ... * sysdeps/s390/s390-64/multiarch/memcpy-s390x.S: ... here. (memcpy): Use __memcpy_default as alias source. * sysdeps/s390/s390-64/multiarch/memcpy.c: New File. * sysdeps/s390/s390-64/memcpy.S (__memcpy_z900): Rename to __memcpy_default. * sysdeps/s390/s390-64/multiarch/memset.S: Move to ... * sysdeps/s390/s390-64/multiarch/memset-s390x.S: ... here. (memset): Use __memset_default as alias source. * sysdeps/s390/s390-64/multiarch/memset.c: New File. * sysdeps/s390/s390-64/memset.S (__memset_z900): Rename to __memset_default. * sysdeps/s390/multiarch/ifunc-resolve.h: New File. * sysdeps/s390/multiarch/ifunc-impl-list.c: New File.
- Loading branch information
Stefan Liebler
authored and
Andreas Krebbel
committed
Aug 26, 2015
1 parent
5d96fe8
commit 3155624
Showing
24 changed files
with
676 additions
and
484 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,74 @@ | ||
/* Enumerate available IFUNC implementations of a function. s390/s390x version. | ||
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/>. */ | ||
|
||
#include <assert.h> | ||
#include <string.h> | ||
#include <ifunc-impl-list.h> | ||
#include <ifunc-resolve.h> | ||
|
||
/* Maximum number of IFUNC implementations. */ | ||
#define MAX_IFUNC 3 | ||
|
||
/* Fill ARRAY of MAX elements with IFUNC implementations for function | ||
NAME supported on target machine and return the number of valid | ||
entries. */ | ||
size_t | ||
__libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, | ||
size_t max) | ||
{ | ||
assert (max >= MAX_IFUNC); | ||
|
||
size_t i = 0; | ||
|
||
/* Get hardware information. */ | ||
unsigned long int dl_hwcap = GLRO (dl_hwcap); | ||
unsigned long long stfle_bits = 0ULL; | ||
if ((dl_hwcap & HWCAP_S390_STFLE) | ||
&& (dl_hwcap & HWCAP_S390_ZARCH) | ||
&& (dl_hwcap & HWCAP_S390_HIGH_GPRS)) | ||
{ | ||
S390_STORE_STFLE (stfle_bits); | ||
} | ||
|
||
IFUNC_IMPL (i, name, memset, | ||
IFUNC_IMPL_ADD (array, i, memset, | ||
S390_IS_Z196 (stfle_bits), __memset_z196) | ||
IFUNC_IMPL_ADD (array, i, memset, | ||
S390_IS_Z10 (stfle_bits), __memset_z10) | ||
IFUNC_IMPL_ADD (array, i, memset, 1, __memset_default)) | ||
|
||
IFUNC_IMPL (i, name, memcmp, | ||
IFUNC_IMPL_ADD (array, i, memcmp, | ||
S390_IS_Z196 (stfle_bits), __memcmp_z196) | ||
IFUNC_IMPL_ADD (array, i, memcmp, | ||
S390_IS_Z10 (stfle_bits), __memcmp_z10) | ||
IFUNC_IMPL_ADD (array, i, memcmp, 1, __memcmp_default)) | ||
|
||
#ifdef SHARED | ||
|
||
IFUNC_IMPL (i, name, memcpy, | ||
IFUNC_IMPL_ADD (array, i, memcpy, | ||
S390_IS_Z196 (stfle_bits), __memcpy_z196) | ||
IFUNC_IMPL_ADD (array, i, memcpy, | ||
S390_IS_Z10 (stfle_bits), __memcpy_z10) | ||
IFUNC_IMPL_ADD (array, i, memcpy, 1, __memcpy_default)) | ||
|
||
#endif /* SHARED */ | ||
|
||
return i; | ||
} |
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
Oops, something went wrong.