diff options
Diffstat (limited to 'sysdeps/s390')
-rw-r--r-- | sysdeps/s390/multiarch/gconv_simple.c | 23 |
1 files changed, 12 insertions, 11 deletions
diff --git a/sysdeps/s390/multiarch/gconv_simple.c b/sysdeps/s390/multiarch/gconv_simple.c index aaa1ebf74a..078d992c13 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"))); |