aarch64: Cleanup memset ifunc

Cleanup memset ifunc selectors. The A64FX memset relies on a ZVA size of
256, so add an explicit check.
This commit is contained in:
Wilco Dijkstra 2022-10-26 14:12:55 +01:00
parent 891a7958a2
commit a8e72913fe
2 changed files with 26 additions and 17 deletions

View File

@ -60,7 +60,7 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
IFUNC_IMPL_ADD (array, i, memset, (zva_size == 64), __memset_emag)
IFUNC_IMPL_ADD (array, i, memset, 1, __memset_kunpeng)
#if HAVE_AARCH64_SVE_ASM
IFUNC_IMPL_ADD (array, i, memset, sve, __memset_a64fx)
IFUNC_IMPL_ADD (array, i, memset, sve && zva_size == 256, __memset_a64fx)
#endif
IFUNC_IMPL_ADD (array, i, memset, 1, __memset_generic))
IFUNC_IMPL (i, name, memchr,

View File

@ -31,25 +31,34 @@ extern __typeof (__redirect_memset) __libc_memset;
extern __typeof (__redirect_memset) __memset_falkor attribute_hidden;
extern __typeof (__redirect_memset) __memset_emag attribute_hidden;
extern __typeof (__redirect_memset) __memset_kunpeng attribute_hidden;
# if HAVE_AARCH64_SVE_ASM
extern __typeof (__redirect_memset) __memset_a64fx attribute_hidden;
# endif
extern __typeof (__redirect_memset) __memset_generic attribute_hidden;
libc_ifunc (__libc_memset,
IS_KUNPENG920 (midr)
?__memset_kunpeng
: ((IS_FALKOR (midr) || IS_PHECDA (midr)) && zva_size == 64
? __memset_falkor
: (IS_EMAG (midr) && zva_size == 64
? __memset_emag
# if HAVE_AARCH64_SVE_ASM
: (IS_A64FX (midr) && sve
? __memset_a64fx
: __memset_generic))));
# else
: __memset_generic)));
# endif
static inline __typeof (__redirect_memset) *
select_memset_ifunc (void)
{
INIT_ARCH ();
if (sve && HAVE_AARCH64_SVE_ASM)
{
if (IS_A64FX (midr) && zva_size == 256)
return __memset_a64fx;
return __memset_generic;
}
if (IS_KUNPENG920 (midr))
return __memset_kunpeng;
if ((IS_FALKOR (midr) || IS_PHECDA (midr)) && zva_size == 64)
return __memset_falkor;
if (IS_EMAG (midr) && zva_size == 64)
return __memset_emag;
return __memset_generic;
}
libc_ifunc (__libc_memset, select_memset_ifunc ());
# undef memset
strong_alias (__libc_memset, memset);