| 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 |
| |
| |
| @@ -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"))); |
| |