mirror_zfs/config/toolchain-simd.m4
Rob Norris c183268019 config: generate SIMD checks from table
No need to repeat all that boilerplate each time!

Sponsored-by: TrueNAS
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Rob Norris <rob.norris@truenas.com>
Closes #18285
2026-03-05 15:01:26 -08:00

57 lines
2.3 KiB
Plaintext

dnl # SPDX-License-Identifier: CDDL-1.0
dnl #
dnl # Checks if host toolchain supports SIMD instructions
dnl #
dnl #
dnl # Each invocation of ZFS_AC_TOOLCHAIN_SIMD_CHECK(name, asmsrc) creates
dnl # a macro ZFS_AC_TOOLCHAIN_SIMD_<name> that tries to compile
dnl # the given <asmsrc> in a __asm__ directive to the C compiler. If the
dnl # check passes, HAVE_TOOLCHAIN_<name> is defined.
dnl #
AC_DEFUN([ZFS_AC_TOOLCHAIN_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([[
int main () {
__asm__ __volatile__($2);
return (0);
}
]])], [
AC_DEFINE([HAVE_TOOLCHAIN_$1], 1,
[Define if host toolchain supports $1])
AC_MSG_RESULT([yes])
], [
AC_MSG_RESULT([no])
])
])
dnl Stash name of new function so we can execute them later
m4_pushdef([_zfs_ac_toolchain_simd_checks],
[ZFS_AC_TOOLCHAIN_SIMD_]m4_quote($1))
])
dnl # Invokes all macros created by ZFS_AC_TOOLCHAIN_SIMD_CHECK.
AC_DEFUN([ZFS_AC_TOOLCHAIN_SIMD], [
m4_stack_foreach([_zfs_ac_toolchain_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"])