diff --git a/config/kernel.m4 b/config/kernel.m4 index 45a215d22..bd47ac595 100644 --- a/config/kernel.m4 +++ b/config/kernel.m4 @@ -37,6 +37,7 @@ dnl # only once the compilation can be done in parallel significantly dnl # speeding up the process. dnl # AC_DEFUN([ZFS_AC_KERNEL_TEST_SRC], [ + ZFS_AC_KERNEL_SRC_SIMD ZFS_AC_KERNEL_SRC_TYPES ZFS_AC_KERNEL_SRC_OBJTOOL ZFS_AC_KERNEL_SRC_ACCESS_OK_TYPE @@ -161,6 +162,7 @@ dnl # dnl # Check results of kernel interface tests. dnl # AC_DEFUN([ZFS_AC_KERNEL_TEST_RESULT], [ + ZFS_AC_KERNEL_SIMD ZFS_AC_KERNEL_TYPES ZFS_AC_KERNEL_ACCESS_OK_TYPE ZFS_AC_KERNEL_OBJTOOL diff --git a/config/toolchain-simd.m4 b/config/toolchain-simd.m4 index 453874930..1d20370f8 100644 --- a/config/toolchain-simd.m4 +++ b/config/toolchain-simd.m4 @@ -5,11 +5,15 @@ dnl # dnl # dnl # Each invocation of ZFS_AC_TOOLCHAIN_SIMD_CHECK(name, asmsrc) creates -dnl # a macro ZFS_AC_TOOLCHAIN_SIMD_ that tries to compile -dnl # the given in a __asm__ directive to the C compiler. If the -dnl # check passes, HAVE_TOOLCHAIN_ is defined. +dnl # two sets of macros: +dnl # - ZFS_AC_TOOLCHAIN_SIMD_ +dnl # - ZFS_AC_KERNEL_SRC_SIMD_ & ZFS_AC_KERNEL_SIMD_ dnl # -AC_DEFUN([ZFS_AC_TOOLCHAIN_SIMD_CHECK], [ +dnl # These try to compile the given in a __asm__ directive, using +dnl # either the host or the kernel toolchains. Successful checks set +dnl # HAVE_TOOLCHAIN_ or HAVE_KERNEL_, respectively. +dnl # +AC_DEFUN([ZFS_AC_SIMD_CHECK], [ AC_DEFUN([ZFS_AC_TOOLCHAIN_SIMD_]m4_quote($1), [ AC_MSG_CHECKING([whether host toolchain supports $1]) AC_LINK_IFELSE([AC_LANG_SOURCE([[ @@ -26,31 +30,59 @@ AC_DEFUN([ZFS_AC_TOOLCHAIN_SIMD_CHECK], [ ]) ]) - dnl Stash name of new function so we can execute them later + AC_DEFUN([ZFS_AC_KERNEL_SRC_SIMD_]m4_quote($1), [ + ZFS_LINUX_TEST_SRC( + [simd_]m4_quote(m4_translit([$1], [A-Z], [a-z])), [], [ + __asm__ __volatile__($2); + ]) + ]) + AC_DEFUN([ZFS_AC_KERNEL_SIMD_]m4_quote($1), [ + AC_MSG_CHECKING([whether kernel toolchain supports $1]) + ZFS_LINUX_TEST_RESULT( + [simd_]m4_quote(m4_translit([$1], [A-Z], [a-z])), [ + AC_MSG_RESULT(yes) + AC_DEFINE([HAVE_KERNEL_$1], 1, + [Define if kernel toolchain supports $1]) + ], [ + AC_MSG_RESULT([no]) + ]) + ]) + + dnl Stash the names of the new functions so we can execute them later. m4_pushdef([_zfs_ac_toolchain_simd_checks], [ZFS_AC_TOOLCHAIN_SIMD_]m4_quote($1)) + m4_pushdef([_zfs_ac_kernel_src_simd_checks], + [ZFS_AC_KERNEL_SRC_SIMD_]m4_quote($1)) + m4_pushdef([_zfs_ac_kernel_simd_checks], + [ZFS_AC_KERNEL_SIMD_]m4_quote($1)) ]) -dnl # Invokes all macros created by ZFS_AC_TOOLCHAIN_SIMD_CHECK. +dnl # Invoke the macros created by ZFS_AC_TOOLCHAIN_SIMD_CHECK. AC_DEFUN([ZFS_AC_TOOLCHAIN_SIMD], [ m4_stack_foreach([_zfs_ac_toolchain_simd_checks], [m4_indir]) ]) +AC_DEFUN([ZFS_AC_KERNEL_SRC_SIMD], [ + m4_stack_foreach([_zfs_ac_kernel_src_simd_checks], [m4_indir]) +]) +AC_DEFUN([ZFS_AC_KERNEL_SIMD], [ + m4_stack_foreach([_zfs_ac_kernel_simd_checks], [m4_indir]) +]) dnl # Instruction sets to test -ZFS_AC_TOOLCHAIN_SIMD_CHECK([SSE2], ["pxor %xmm0, %xmm1"]) -ZFS_AC_TOOLCHAIN_SIMD_CHECK([SSSE3], ["pshufb %xmm0, %xmm1"]) -ZFS_AC_TOOLCHAIN_SIMD_CHECK([SSE4_1], ["pmaxsb %xmm0, %xmm1"]) -ZFS_AC_TOOLCHAIN_SIMD_CHECK([AVX], ["vmovdqa %ymm0, %ymm1"]) -ZFS_AC_TOOLCHAIN_SIMD_CHECK([AVX2], ["vpshufb %ymm0, %ymm1, %ymm2"]) -ZFS_AC_TOOLCHAIN_SIMD_CHECK([AVX512F], ["vpandd %zmm0, %zmm1, %zmm2"]) -ZFS_AC_TOOLCHAIN_SIMD_CHECK([AVX512BW], ["vpshufb %zmm0, %zmm1, %zmm2"]) -ZFS_AC_TOOLCHAIN_SIMD_CHECK([AVX512VL], ["vpabsq %zmm0,%zmm1"]) -ZFS_AC_TOOLCHAIN_SIMD_CHECK([AES], ["aesenc %xmm0, %xmm1"]) -ZFS_AC_TOOLCHAIN_SIMD_CHECK([PCLMULQDQ], ["pclmulqdq %0, %%xmm0, %%xmm1" :: "i"(0)]) -ZFS_AC_TOOLCHAIN_SIMD_CHECK([MOVBE], ["movbe 0(%eax), %eax"]) -ZFS_AC_TOOLCHAIN_SIMD_CHECK([VAES], ["vaesenc %ymm0, %ymm1, %ymm0"]) -ZFS_AC_TOOLCHAIN_SIMD_CHECK([VPCLMULQDQ], ["vpclmulqdq %0, %%ymm4, %%ymm3, %%ymm5" :: "i"(0)]) -ZFS_AC_TOOLCHAIN_SIMD_CHECK([SHA512EXT], ["vsha512msg2 %ymm5, %ymm6"]) -ZFS_AC_TOOLCHAIN_SIMD_CHECK([XSAVE], ["xsave 0"]) -ZFS_AC_TOOLCHAIN_SIMD_CHECK([XSAVEOPT], ["xsaveopt 0"]) -ZFS_AC_TOOLCHAIN_SIMD_CHECK([XSAVES], ["xsaves 0"]) +ZFS_AC_SIMD_CHECK([SSE2], ["pxor %xmm0, %xmm1"]) +ZFS_AC_SIMD_CHECK([SSSE3], ["pshufb %xmm0, %xmm1"]) +ZFS_AC_SIMD_CHECK([SSE4_1], ["pmaxsb %xmm0, %xmm1"]) +ZFS_AC_SIMD_CHECK([AVX], ["vmovdqa %ymm0, %ymm1"]) +ZFS_AC_SIMD_CHECK([AVX2], ["vpshufb %ymm0, %ymm1, %ymm2"]) +ZFS_AC_SIMD_CHECK([AVX512F], ["vpandd %zmm0, %zmm1, %zmm2"]) +ZFS_AC_SIMD_CHECK([AVX512BW], ["vpshufb %zmm0, %zmm1, %zmm2"]) +ZFS_AC_SIMD_CHECK([AVX512VL], ["vpabsq %zmm0,%zmm1"]) +ZFS_AC_SIMD_CHECK([AES], ["aesenc %xmm0, %xmm1"]) +ZFS_AC_SIMD_CHECK([PCLMULQDQ], ["pclmulqdq %0, %%xmm0, %%xmm1" :: "i"(0)]) +ZFS_AC_SIMD_CHECK([MOVBE], ["movbe 0(%eax), %eax"]) +ZFS_AC_SIMD_CHECK([VAES], ["vaesenc %ymm0, %ymm1, %ymm0"]) +ZFS_AC_SIMD_CHECK([VPCLMULQDQ], ["vpclmulqdq %0, %%ymm4, %%ymm3, %%ymm5" :: "i"(0)]) +ZFS_AC_SIMD_CHECK([SHA512EXT], ["vsha512msg2 %ymm5, %ymm6"]) +ZFS_AC_SIMD_CHECK([XSAVE], ["xsave 0"]) +ZFS_AC_SIMD_CHECK([XSAVEOPT], ["xsaveopt 0"]) +ZFS_AC_SIMD_CHECK([XSAVES], ["xsaves 0"])