forked from rpms/glibc
54 lines
2.2 KiB
Diff
54 lines
2.2 KiB
Diff
commit 12f0dcb8da2c7c74d673583ec3286c0354273f52
|
|
Author: Stefan Liebler <stli@linux.ibm.com>
|
|
Date: Tue Dec 18 13:57:25 2018 +0100
|
|
|
|
S390: Refactor gconv_simple ifunc handling.
|
|
|
|
The ifunc handling for various __gconv_transform_* functions
|
|
which are using IFUNC on s390x are adjusted in order to omit ifunc
|
|
if the minimum architecture level already supports newer CPUs by default.
|
|
Instead those functions are just an alias to the vector variants.
|
|
|
|
Furthermore the ifunc-macro s390_libc_ifunc_expr is now used instead of
|
|
s390_vx_libc_ifunc.
|
|
|
|
ChangeLog:
|
|
|
|
* sysdeps/s390/multiarch/gconv_simple.c (ICONV_VX_IFUNC):
|
|
Define macro dependent on HAVE_S390_MIN_Z13_ZARCH_ASM_SUPPORT.
|
|
|
|
diff --git a/sysdeps/s390/multiarch/gconv_simple.c b/sysdeps/s390/multiarch/gconv_simple.c
|
|
index aaa1ebf74acf4dde..078d992c13eb548c 100644
|
|
--- a/sysdeps/s390/multiarch/gconv_simple.c
|
|
+++ b/sysdeps/s390/multiarch/gconv_simple.c
|
|
@@ -27,17 +27,18 @@
|
|
|
|
# define ICONV_C_NAME(NAME) __##NAME##_c
|
|
# define ICONV_VX_NAME(NAME) __##NAME##_vx
|
|
-# define ICONV_VX_IFUNC(FUNC) \
|
|
- extern __typeof (ICONV_C_NAME (FUNC)) __##FUNC; \
|
|
- s390_vx_libc_ifunc (__##FUNC) \
|
|
- int FUNC (struct __gconv_step *step, struct __gconv_step_data *data, \
|
|
- const unsigned char **inptrp, const unsigned char *inend, \
|
|
- unsigned char **outbufstart, size_t *irreversible, \
|
|
- int do_flush, int consume_incomplete) \
|
|
- { \
|
|
- return __##FUNC (step, data, inptrp, inend,outbufstart, \
|
|
- irreversible, do_flush, consume_incomplete); \
|
|
- }
|
|
+# ifdef HAVE_S390_MIN_Z13_ZARCH_ASM_SUPPORT
|
|
+/* We support z13 instructions by default -> Just use the vector variant. */
|
|
+# define ICONV_VX_IFUNC(FUNC) strong_alias (ICONV_VX_NAME (FUNC), FUNC)
|
|
+# else
|
|
+/* We have to use ifunc to determine if z13 instructions are supported. */
|
|
+# define ICONV_VX_IFUNC(FUNC) \
|
|
+ s390_libc_ifunc_expr (ICONV_C_NAME (FUNC), FUNC, \
|
|
+ (hwcap & HWCAP_S390_VX) \
|
|
+ ? ICONV_VX_NAME (FUNC) \
|
|
+ : ICONV_C_NAME (FUNC) \
|
|
+ )
|
|
+# endif
|
|
# define ICONV_VX_SINGLE(NAME) \
|
|
static __typeof (NAME##_single) __##NAME##_vx_single __attribute__((alias(#NAME "_single")));
|
|
|