1dnl # SPDX-License-Identifier: CDDL-1.0 2dnl # 3dnl # Checks if host toolchain supports SIMD instructions 4dnl # 5 6dnl # 7dnl # Each invocation of ZFS_AC_TOOLCHAIN_SIMD_CHECK(name, asmsrc) creates 8dnl # two sets of macros: 9dnl # - ZFS_AC_TOOLCHAIN_SIMD_<name> 10dnl # - ZFS_AC_KERNEL_SRC_SIMD_<name> & ZFS_AC_KERNEL_SIMD_<name> 11dnl # 12dnl # These try to compile the given <asmsrc> in a __asm__ directive, using 13dnl # either the host or the kernel toolchains. Successful checks set 14dnl # HAVE_TOOLCHAIN_<name> or HAVE_KERNEL_<name>, respectively. 15dnl # 16AC_DEFUN([ZFS_AC_SIMD_CHECK], [ 17 AC_DEFUN([ZFS_AC_TOOLCHAIN_SIMD_]m4_quote($1), [ 18 AC_MSG_CHECKING([whether host toolchain supports $1]) 19 AC_LINK_IFELSE([AC_LANG_SOURCE([[ 20 int main () { 21 __asm__ __volatile__($2); 22 return (0); 23 } 24 ]])], [ 25 AC_DEFINE([HAVE_TOOLCHAIN_$1], 1, 26 [Define if host toolchain supports $1]) 27 AC_MSG_RESULT([yes]) 28 ], [ 29 AC_MSG_RESULT([no]) 30 ]) 31 ]) 32 33 AC_DEFUN([ZFS_AC_KERNEL_SRC_SIMD_]m4_quote($1), [ 34 ZFS_LINUX_TEST_SRC( 35 [simd_]m4_quote(m4_translit([$1], [A-Z], [a-z])), [], [ 36 __asm__ __volatile__($2); 37 ]) 38 ]) 39 AC_DEFUN([ZFS_AC_KERNEL_SIMD_]m4_quote($1), [ 40 AC_MSG_CHECKING([whether kernel toolchain supports $1]) 41 ZFS_LINUX_TEST_RESULT( 42 [simd_]m4_quote(m4_translit([$1], [A-Z], [a-z])), [ 43 AC_MSG_RESULT(yes) 44 AC_DEFINE([HAVE_KERNEL_$1], 1, 45 [Define if kernel toolchain supports $1]) 46 ], [ 47 AC_MSG_RESULT([no]) 48 ]) 49 ]) 50 51 dnl Stash the names of the new functions so we can execute them later. 52 m4_pushdef([_zfs_ac_toolchain_simd_checks], 53 [ZFS_AC_TOOLCHAIN_SIMD_]m4_quote($1)) 54 m4_pushdef([_zfs_ac_kernel_src_simd_checks], 55 [ZFS_AC_KERNEL_SRC_SIMD_]m4_quote($1)) 56 m4_pushdef([_zfs_ac_kernel_simd_checks], 57 [ZFS_AC_KERNEL_SIMD_]m4_quote($1)) 58]) 59 60dnl # Invoke the macros created by ZFS_AC_TOOLCHAIN_SIMD_CHECK. 61AC_DEFUN([ZFS_AC_TOOLCHAIN_SIMD], [ 62 m4_stack_foreach([_zfs_ac_toolchain_simd_checks], [m4_indir]) 63]) 64AC_DEFUN([ZFS_AC_KERNEL_SRC_SIMD], [ 65 m4_stack_foreach([_zfs_ac_kernel_src_simd_checks], [m4_indir]) 66]) 67AC_DEFUN([ZFS_AC_KERNEL_SIMD], [ 68 m4_stack_foreach([_zfs_ac_kernel_simd_checks], [m4_indir]) 69]) 70 71dnl # Instruction sets to test 72ZFS_AC_SIMD_CHECK([SSE2], ["pxor %xmm0, %xmm1"]) 73ZFS_AC_SIMD_CHECK([SSSE3], ["pshufb %xmm0, %xmm1"]) 74ZFS_AC_SIMD_CHECK([SSE4_1], ["pmaxsb %xmm0, %xmm1"]) 75ZFS_AC_SIMD_CHECK([AVX], ["vmovdqa %ymm0, %ymm1"]) 76ZFS_AC_SIMD_CHECK([AVX2], ["vpshufb %ymm0, %ymm1, %ymm2"]) 77ZFS_AC_SIMD_CHECK([AVX512F], ["vpandd %zmm0, %zmm1, %zmm2"]) 78ZFS_AC_SIMD_CHECK([AVX512BW], ["vpshufb %zmm0, %zmm1, %zmm2"]) 79ZFS_AC_SIMD_CHECK([AVX512VL], ["vpabsq %zmm0,%zmm1"]) 80ZFS_AC_SIMD_CHECK([AES], ["aesenc %xmm0, %xmm1"]) 81ZFS_AC_SIMD_CHECK([PCLMULQDQ], ["pclmulqdq %0, %%xmm0, %%xmm1" :: "i"(0)]) 82ZFS_AC_SIMD_CHECK([MOVBE], ["movbe 0(%eax), %eax"]) 83ZFS_AC_SIMD_CHECK([VAES], ["vaesenc %ymm0, %ymm1, %ymm0"]) 84ZFS_AC_SIMD_CHECK([VPCLMULQDQ], ["vpclmulqdq %0, %%ymm4, %%ymm3, %%ymm5" :: "i"(0)]) 85ZFS_AC_SIMD_CHECK([SHA512EXT], ["vsha512msg2 %ymm5, %ymm6"]) 86ZFS_AC_SIMD_CHECK([XSAVE], ["xsave 0"]) 87ZFS_AC_SIMD_CHECK([XSAVEOPT], ["xsaveopt 0"]) 88ZFS_AC_SIMD_CHECK([XSAVES], ["xsaves 0"]) 89