xref: /freebsd/sys/contrib/openzfs/config/toolchain-simd.m4 (revision 80aae8a3f8aa70712930664572be9e6885dc0be7)
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