Merge 6877642528
into 308f7c2f14
This commit is contained in:
commit
3a0262043d
|
@ -27,6 +27,7 @@ AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_TOOLCHAIN_SIMD], [
|
||||||
ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_XSAVE
|
ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_XSAVE
|
||||||
ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_XSAVEOPT
|
ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_XSAVEOPT
|
||||||
ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_XSAVES
|
ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_XSAVES
|
||||||
|
ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_XSAVEC
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
])
|
])
|
||||||
|
@ -488,3 +489,24 @@ AC_DEFUN([ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_XSAVES], [
|
||||||
AC_MSG_RESULT([no])
|
AC_MSG_RESULT([no])
|
||||||
])
|
])
|
||||||
])
|
])
|
||||||
|
|
||||||
|
dnl #
|
||||||
|
dnl # ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_XSAVEC
|
||||||
|
dnl #
|
||||||
|
AC_DEFUN([ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_XSAVEC], [
|
||||||
|
AC_MSG_CHECKING([whether host toolchain supports XSAVEC])
|
||||||
|
|
||||||
|
AC_LINK_IFELSE([AC_LANG_SOURCE([
|
||||||
|
[
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
char b[4096] __attribute__ ((aligned (64)));
|
||||||
|
__asm__ __volatile__("xsavec %[b]\n" : : [b] "m" (*b) : "memory");
|
||||||
|
}
|
||||||
|
]])], [
|
||||||
|
AC_MSG_RESULT([yes])
|
||||||
|
AC_DEFINE([HAVE_XSAVEC], 1, [Define if host toolchain supports XSAVEC])
|
||||||
|
], [
|
||||||
|
AC_MSG_RESULT([no])
|
||||||
|
])
|
||||||
|
])
|
||||||
|
|
|
@ -322,6 +322,12 @@ kfpu_begin(void)
|
||||||
* FPU state to be correctly preserved and restored.
|
* FPU state to be correctly preserved and restored.
|
||||||
*/
|
*/
|
||||||
uint8_t *state = zfs_kfpu_fpregs[smp_processor_id()];
|
uint8_t *state = zfs_kfpu_fpregs[smp_processor_id()];
|
||||||
|
#if defined(HAVE_XSAVEC)
|
||||||
|
if (static_cpu_has(X86_FEATURE_XSAVEC)) {
|
||||||
|
kfpu_do_xsave("xsavec", state, ~0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
#if defined(HAVE_XSAVES)
|
#if defined(HAVE_XSAVES)
|
||||||
if (static_cpu_has(X86_FEATURE_XSAVES)) {
|
if (static_cpu_has(X86_FEATURE_XSAVES)) {
|
||||||
kfpu_do_xsave("xsaves", state, ~XFEATURE_MASK_XTILE);
|
kfpu_do_xsave("xsaves", state, ~XFEATURE_MASK_XTILE);
|
||||||
|
@ -383,6 +389,13 @@ static inline void
|
||||||
kfpu_end(void)
|
kfpu_end(void)
|
||||||
{
|
{
|
||||||
uint8_t *state = zfs_kfpu_fpregs[smp_processor_id()];
|
uint8_t *state = zfs_kfpu_fpregs[smp_processor_id()];
|
||||||
|
|
||||||
|
#if defined(HAVE_XSAVEC)
|
||||||
|
if (static_cpu_has(X86_FEATURE_XSAVEC)) {
|
||||||
|
kfpu_do_xrstor("xrstor", state, ~0);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
#if defined(HAVE_XSAVES)
|
#if defined(HAVE_XSAVES)
|
||||||
if (static_cpu_has(X86_FEATURE_XSAVES)) {
|
if (static_cpu_has(X86_FEATURE_XSAVES)) {
|
||||||
kfpu_do_xrstor("xrstors", state, ~XFEATURE_MASK_XTILE);
|
kfpu_do_xrstor("xrstors", state, ~XFEATURE_MASK_XTILE);
|
||||||
|
|
Loading…
Reference in New Issue