diff options
author | Stefan Liebler <stli@linux.ibm.com> | 2019-03-22 11:14:08 +0100 |
---|---|---|
committer | Stefan Liebler <stli@linux.ibm.com> | 2019-03-22 11:14:08 +0100 |
commit | 96fbb9a328232e42814334d6e29a9a9c7995c01d (patch) | |
tree | 3df42c7279ddb720eb4b57cd5f685619d8bad08d /sysdeps/s390/memmove.c | |
parent | a899a5512f618d5c4093a2d65e8dee07c791b0ab (diff) | |
download | glibc-96fbb9a328232e42814334d6e29a9a9c7995c01d.tar.gz glibc-96fbb9a328232e42814334d6e29a9a9c7995c01d.tar.xz glibc-96fbb9a328232e42814334d6e29a9a9c7995c01d.zip |
S390: Add arch13 memmove ifunc variant.
This patch introduces the new arch13 ifunc variant for memmove. For the forward or non-overlapping case it is just using memcpy. For the backward case it relies on the new instruction mvcrl. The instruction copies up to 256 bytes at once. In case of an overlap, it copies the bytes like copying them one by one starting from right to left. ChangeLog: * sysdeps/s390/ifunc-memcpy.h (HAVE_MEMMOVE_ARCH13, MEMMOVE_ARCH13 HAVE_MEMMOVE_IFUNC_AND_ARCH13_SUPPORT): New defines. * sysdeps/s390/memcpy-z900.S: Add arch13 memmove implementation. * sysdeps/s390/memmove.c (memmove): Add arch13 variant in ifunc selector. * sysdeps/s390/multiarch/ifunc-impl-list.c (__libc_ifunc_impl_list): Add ifunc variant for arch13 memmove. * sysdeps/s390/multiarch/ifunc-resolve.h (S390_STFLE_BITS_ARCH13_MIE3, S390_IS_ARCH13_MIE3): New defines.
Diffstat (limited to 'sysdeps/s390/memmove.c')
-rw-r--r-- | sysdeps/s390/memmove.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/sysdeps/s390/memmove.c b/sysdeps/s390/memmove.c index fd4da377a3..fb6b69ae2f 100644 --- a/sysdeps/s390/memmove.c +++ b/sysdeps/s390/memmove.c @@ -36,9 +36,19 @@ extern __typeof (__redirect_memmove) MEMMOVE_C attribute_hidden; extern __typeof (__redirect_memmove) MEMMOVE_Z13 attribute_hidden; # endif +# if HAVE_MEMMOVE_ARCH13 +extern __typeof (__redirect_memmove) MEMMOVE_ARCH13 attribute_hidden; +# endif + s390_libc_ifunc_expr (__redirect_memmove, memmove, - (HAVE_MEMMOVE_Z13 && (hwcap & HWCAP_S390_VX)) - ? MEMMOVE_Z13 - : MEMMOVE_DEFAULT + ({ + s390_libc_ifunc_expr_stfle_init (); + (HAVE_MEMMOVE_ARCH13 + && S390_IS_ARCH13_MIE3 (stfle_bits)) + ? MEMMOVE_ARCH13 + : (HAVE_MEMMOVE_Z13 && (hwcap & HWCAP_S390_VX)) + ? MEMMOVE_Z13 + : MEMMOVE_DEFAULT; + }) ) #endif |