mirror of git://sourceware.org/git/glibc.git
S390: Also check vector support in memmove ifunc-selector [BZ #27511]
The arch13 memmove variant is currently selected by the ifunc selector if the Miscellaneous-Instruction-Extensions Facility 3 facility bit is present, but the function is also using vector instructions. If the vector support is not present, one is receiving an operation exception. Therefore this patch also checks for vector support in the ifunc selector and in ifunc-impl-list.c. Just to be sure, the configure check is now also testing an arch13 vector instruction and an arch13 Miscellaneous-Instruction-Extensions Facility 3 instruction.
This commit is contained in:
parent
1966f47a1e
commit
7759be2593
|
@ -123,7 +123,9 @@ void testinsn (char *buf)
|
|||
__asm__ (".machine \"arch13\" \n\t"
|
||||
".machinemode \"zarch_nohighgprs\" \n\t"
|
||||
"lghi %%r0,16 \n\t"
|
||||
"mvcrl 0(%0),32(%0)" : : "a" (buf) : "memory", "r0");
|
||||
"mvcrl 0(%0),32(%0) \n\t"
|
||||
"vstrs %%v20,%%v20,%%v20,%%v20,0,2"
|
||||
: : "a" (buf) : "memory", "r0");
|
||||
}
|
||||
EOF
|
||||
if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS --shared conftest.c
|
||||
|
@ -271,7 +273,9 @@ else
|
|||
void testinsn (char *buf)
|
||||
{
|
||||
__asm__ ("lghi %%r0,16 \n\t"
|
||||
"mvcrl 0(%0),32(%0)" : : "a" (buf) : "memory", "r0");
|
||||
"mvcrl 0(%0),32(%0) \n\t"
|
||||
"vstrs %%v20,%%v20,%%v20,%%v20,0,2"
|
||||
: : "a" (buf) : "memory", "r0");
|
||||
}
|
||||
EOF
|
||||
if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS --shared conftest.c
|
||||
|
|
|
@ -88,7 +88,9 @@ void testinsn (char *buf)
|
|||
__asm__ (".machine \"arch13\" \n\t"
|
||||
".machinemode \"zarch_nohighgprs\" \n\t"
|
||||
"lghi %%r0,16 \n\t"
|
||||
"mvcrl 0(%0),32(%0)" : : "a" (buf) : "memory", "r0");
|
||||
"mvcrl 0(%0),32(%0) \n\t"
|
||||
"vstrs %%v20,%%v20,%%v20,%%v20,0,2"
|
||||
: : "a" (buf) : "memory", "r0");
|
||||
}
|
||||
EOF
|
||||
dnl test, if assembler supports S390 arch13 instructions
|
||||
|
@ -195,7 +197,9 @@ cat > conftest.c <<\EOF
|
|||
void testinsn (char *buf)
|
||||
{
|
||||
__asm__ ("lghi %%r0,16 \n\t"
|
||||
"mvcrl 0(%0),32(%0)" : : "a" (buf) : "memory", "r0");
|
||||
"mvcrl 0(%0),32(%0) \n\t"
|
||||
"vstrs %%v20,%%v20,%%v20,%%v20,0,2"
|
||||
: : "a" (buf) : "memory", "r0");
|
||||
}
|
||||
EOF
|
||||
dnl test, if assembler supports S390 arch13 zarch instructions as default
|
||||
|
|
|
@ -43,7 +43,7 @@ extern __typeof (__redirect_memmove) MEMMOVE_ARCH13 attribute_hidden;
|
|||
s390_libc_ifunc_expr (__redirect_memmove, memmove,
|
||||
({
|
||||
s390_libc_ifunc_expr_stfle_init ();
|
||||
(HAVE_MEMMOVE_ARCH13
|
||||
(HAVE_MEMMOVE_ARCH13 && (hwcap & HWCAP_S390_VXRS_EXT2)
|
||||
&& S390_IS_ARCH13_MIE3 (stfle_bits))
|
||||
? MEMMOVE_ARCH13
|
||||
: (HAVE_MEMMOVE_Z13 && (hwcap & HWCAP_S390_VX))
|
||||
|
|
|
@ -171,7 +171,8 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
|
|||
IFUNC_IMPL (i, name, memmove,
|
||||
# if HAVE_MEMMOVE_ARCH13
|
||||
IFUNC_IMPL_ADD (array, i, memmove,
|
||||
S390_IS_ARCH13_MIE3 (stfle_bits),
|
||||
((dl_hwcap & HWCAP_S390_VXRS_EXT2)
|
||||
&& S390_IS_ARCH13_MIE3 (stfle_bits)),
|
||||
MEMMOVE_ARCH13)
|
||||
# endif
|
||||
# if HAVE_MEMMOVE_Z13
|
||||
|
|
Loading…
Reference in New Issue