mirror of
https://sourceware.org/git/glibc.git
synced 2024-12-11 22:00:08 +00:00
96fbb9a328
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.
55 lines
1.7 KiB
C
55 lines
1.7 KiB
C
/* Multiple versions of memmove.
|
|
Copyright (C) 2016-2019 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 <ifunc-memcpy.h>
|
|
|
|
#if HAVE_MEMMOVE_IFUNC
|
|
/* If we don't use ifunc, an alias is defined for memmove
|
|
in sysdeps/s390/memmove-c.c or sysdeps/s390/memcpy.S
|
|
depending on the used default implementation. */
|
|
# undef memmove
|
|
# define memmove __redirect_memmove
|
|
# include <string.h>
|
|
# include <ifunc-resolve.h>
|
|
# undef memmove
|
|
|
|
# if HAVE_MEMMOVE_C
|
|
extern __typeof (__redirect_memmove) MEMMOVE_C attribute_hidden;
|
|
# endif
|
|
|
|
# if HAVE_MEMMOVE_Z13
|
|
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,
|
|
({
|
|
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
|