]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - config/toolchain-simd.m4
Add support for AVX-512 family of instruction sets
[FreeBSD/FreeBSD.git] / config / toolchain-simd.m4
1 dnl #
2 dnl # Checks if host toolchain supports SIMD instructions
3 dnl #
4 AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_TOOLCHAIN_SIMD], [
5         case "$host_cpu" in
6                 x86_64 | x86 | i686)
7                         ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_SSE
8                         ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_SSE2
9                         ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_SSE3
10                         ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_SSSE3
11                         ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_SSE4_1
12                         ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_SSE4_2
13                         ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_AVX
14                         ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_AVX2
15                         ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_AVX512F
16                         ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_AVX512CD
17                         ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_AVX512DQ
18                         ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_AVX512BW
19                         ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_AVX512IFMA
20                         ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_AVX512VBMI
21                         ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_AVX512PF
22                         ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_AVX512ER
23                         ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_AVX512VL
24                         ;;
25         esac
26 ])
27
28 dnl #
29 dnl # ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_SSE
30 dnl #
31 AC_DEFUN([ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_SSE], [
32         AC_MSG_CHECKING([whether host toolchain supports SSE])
33
34         AC_LINK_IFELSE([AC_LANG_SOURCE([[
35                 void main()
36                 {
37                         __asm__ __volatile__("xorps %xmm0, %xmm1");
38                 }
39         ]])], [
40                 AC_DEFINE([HAVE_SSE], 1, [Define if host toolchain supports SSE])
41                 AC_MSG_RESULT([yes])
42         ], [
43                 AC_MSG_RESULT([no])
44         ])
45 ])
46
47 dnl #
48 dnl # ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_SSE2
49 dnl #
50 AC_DEFUN([ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_SSE2], [
51         AC_MSG_CHECKING([whether host toolchain supports SSE2])
52
53         AC_LINK_IFELSE([AC_LANG_SOURCE([[
54                 void main()
55                 {
56                         __asm__ __volatile__("pxor %xmm0, %xmm1");
57                 }
58         ]])], [
59                 AC_DEFINE([HAVE_SSE2], 1, [Define if host toolchain supports SSE2])
60                 AC_MSG_RESULT([yes])
61         ], [
62                 AC_MSG_RESULT([no])
63         ])
64 ])
65
66 dnl #
67 dnl # ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_SSE3
68 dnl #
69 AC_DEFUN([ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_SSE3], [
70         AC_MSG_CHECKING([whether host toolchain supports SSE3])
71
72         AC_LINK_IFELSE([AC_LANG_SOURCE([[
73                 void main()
74                 {
75                         char v[16];
76                         __asm__ __volatile__("lddqu %0,%%xmm0" :: "m"(v[0]));
77                 }
78         ]])], [
79                 AC_DEFINE([HAVE_SSE3], 1, [Define if host toolchain supports SSE3])
80                 AC_MSG_RESULT([yes])
81         ], [
82                 AC_MSG_RESULT([no])
83         ])
84 ])
85
86 dnl #
87 dnl # ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_SSSE3
88 dnl #
89 AC_DEFUN([ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_SSSE3], [
90         AC_MSG_CHECKING([whether host toolchain supports SSSE3])
91
92         AC_LINK_IFELSE([AC_LANG_SOURCE([[
93                 void main()
94                 {
95                         __asm__ __volatile__("pshufb %xmm0,%xmm1");
96                 }
97         ]])], [
98                 AC_DEFINE([HAVE_SSSE3], 1, [Define if host toolchain supports SSSE3])
99                 AC_MSG_RESULT([yes])
100         ], [
101                 AC_MSG_RESULT([no])
102         ])
103 ])
104
105 dnl #
106 dnl # ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_SSE4_1
107 dnl #
108 AC_DEFUN([ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_SSE4_1], [
109         AC_MSG_CHECKING([whether host toolchain supports SSE4.1])
110
111         AC_LINK_IFELSE([AC_LANG_SOURCE([[
112                 void main()
113                 {
114                         __asm__ __volatile__("pmaxsb %xmm0,%xmm1");
115                 }
116         ]])], [
117                 AC_DEFINE([HAVE_SSE4_1], 1, [Define if host toolchain supports SSE4.1])
118                 AC_MSG_RESULT([yes])
119         ], [
120                 AC_MSG_RESULT([no])
121         ])
122 ])
123
124 dnl #
125 dnl # ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_SSE4_2
126 dnl #
127 AC_DEFUN([ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_SSE4_2], [
128         AC_MSG_CHECKING([whether host toolchain supports SSE4.2])
129
130         AC_LINK_IFELSE([AC_LANG_SOURCE([[
131                 void main()
132                 {
133                         __asm__ __volatile__("pcmpgtq %xmm0, %xmm1");
134                 }
135         ]])], [
136                 AC_DEFINE([HAVE_SSE4_2], 1, [Define if host toolchain supports SSE4.2])
137                 AC_MSG_RESULT([yes])
138         ], [
139                 AC_MSG_RESULT([no])
140         ])
141 ])
142
143 dnl #
144 dnl # ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_AVX
145 dnl #
146 AC_DEFUN([ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_AVX], [
147         AC_MSG_CHECKING([whether host toolchain supports AVX])
148
149         AC_LINK_IFELSE([AC_LANG_SOURCE([[
150                 void main()
151                 {
152                         char v[32];
153                         __asm__ __volatile__("vmovdqa %0,%%ymm0" :: "m"(v[0]));
154                 }
155         ]])], [
156                 AC_MSG_RESULT([yes])
157                 AC_DEFINE([HAVE_AVX], 1, [Define if host toolchain supports AVX])
158         ], [
159                 AC_MSG_RESULT([no])
160         ])
161 ])
162
163 dnl #
164 dnl # ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_AVX2
165 dnl #
166 AC_DEFUN([ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_AVX2], [
167         AC_MSG_CHECKING([whether host toolchain supports AVX2])
168
169         AC_LINK_IFELSE([AC_LANG_SOURCE([
170         [
171                 void main()
172                 {
173                         __asm__ __volatile__("vpshufb %ymm0,%ymm1,%ymm2");
174                 }
175         ]])], [
176                 AC_MSG_RESULT([yes])
177                 AC_DEFINE([HAVE_AVX2], 1, [Define if host toolchain supports AVX2])
178         ], [
179                 AC_MSG_RESULT([no])
180         ])
181 ])
182
183 dnl #
184 dnl # ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_AVX512F
185 dnl #
186 AC_DEFUN([ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_AVX512F], [
187         AC_MSG_CHECKING([whether host toolchain supports AVX512F])
188
189         AC_LINK_IFELSE([AC_LANG_SOURCE([
190         [
191                 void main()
192                 {
193                         __asm__ __volatile__("vpandd %zmm0,%zmm1,%zmm2");
194                 }
195         ]])], [
196                 AC_MSG_RESULT([yes])
197                 AC_DEFINE([HAVE_AVX512F], 1, [Define if host toolchain supports AVX512F])
198         ], [
199                 AC_MSG_RESULT([no])
200         ])
201 ])
202
203 dnl #
204 dnl # ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_AVX512CD
205 dnl #
206 AC_DEFUN([ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_AVX512CD], [
207         AC_MSG_CHECKING([whether host toolchain supports AVX512CD])
208
209         AC_LINK_IFELSE([AC_LANG_SOURCE([
210         [
211                 void main()
212                 {
213                         __asm__ __volatile__("vplzcntd %zmm0,%zmm1");
214                 }
215         ]])], [
216                 AC_MSG_RESULT([yes])
217                 AC_DEFINE([HAVE_AVX512CD], 1, [Define if host toolchain supports AVX512CD])
218         ], [
219                 AC_MSG_RESULT([no])
220         ])
221 ])
222
223 dnl #
224 dnl # ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_AVX512DQ
225 dnl #
226 AC_DEFUN([ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_AVX512DQ], [
227         AC_MSG_CHECKING([whether host toolchain supports AVX512DQ])
228
229         AC_LINK_IFELSE([AC_LANG_SOURCE([
230         [
231                 void main()
232                 {
233                         __asm__ __volatile__("vandpd %zmm0,%zmm1,%zmm2");
234                 }
235         ]])], [
236                 AC_MSG_RESULT([yes])
237                 AC_DEFINE([HAVE_AVX512DQ], 1, [Define if host toolchain supports AVX512DQ])
238         ], [
239                 AC_MSG_RESULT([no])
240         ])
241 ])
242
243 dnl #
244 dnl # ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_AVX512BW
245 dnl #
246 AC_DEFUN([ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_AVX512BW], [
247         AC_MSG_CHECKING([whether host toolchain supports AVX512BW])
248
249         AC_LINK_IFELSE([AC_LANG_SOURCE([
250         [
251                 void main()
252                 {
253                         __asm__ __volatile__("vpshufb %zmm0,%zmm1,%zmm2");
254                 }
255         ]])], [
256                 AC_MSG_RESULT([yes])
257                 AC_DEFINE([HAVE_AVX512BW], 1, [Define if host toolchain supports AVX512BW])
258         ], [
259                 AC_MSG_RESULT([no])
260         ])
261 ])
262
263 dnl #
264 dnl # ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_AVX512IFMA
265 dnl #
266 AC_DEFUN([ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_AVX512IFMA], [
267         AC_MSG_CHECKING([whether host toolchain supports AVX512IFMA])
268
269         AC_LINK_IFELSE([AC_LANG_SOURCE([
270         [
271                 void main()
272                 {
273                         __asm__ __volatile__("vpmadd52luq %zmm0,%zmm1,%zmm2");
274                 }
275         ]])], [
276                 AC_MSG_RESULT([yes])
277                 AC_DEFINE([HAVE_AVX512IFMA], 1, [Define if host toolchain supports AVX512IFMA])
278         ], [
279                 AC_MSG_RESULT([no])
280         ])
281 ])
282
283 dnl #
284 dnl # ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_AVX512VBMI
285 dnl #
286 AC_DEFUN([ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_AVX512VBMI], [
287         AC_MSG_CHECKING([whether host toolchain supports AVX512VBMI])
288
289         AC_LINK_IFELSE([AC_LANG_SOURCE([
290         [
291                 void main()
292                 {
293                         __asm__ __volatile__("vpermb %zmm0,%zmm1,%zmm2");
294                 }
295         ]])], [
296                 AC_MSG_RESULT([yes])
297                 AC_DEFINE([HAVE_AVX512VBMI], 1, [Define if host toolchain supports AVX512VBMI])
298         ], [
299                 AC_MSG_RESULT([no])
300         ])
301 ])
302
303 dnl #
304 dnl # ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_AVX512PF
305 dnl #
306 AC_DEFUN([ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_AVX512PF], [
307         AC_MSG_CHECKING([whether host toolchain supports AVX512PF])
308
309         AC_LINK_IFELSE([AC_LANG_SOURCE([
310         [
311                 void main()
312                 {
313                         __asm__ __volatile__("vgatherpf0dps (%rsi,%zmm0,4){%k1}");
314                 }
315         ]])], [
316                 AC_MSG_RESULT([yes])
317                 AC_DEFINE([HAVE_AVX512PF], 1, [Define if host toolchain supports AVX512PF])
318         ], [
319                 AC_MSG_RESULT([no])
320         ])
321 ])
322
323 dnl #
324 dnl # ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_AVX512ER
325 dnl #
326 AC_DEFUN([ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_AVX512ER], [
327         AC_MSG_CHECKING([whether host toolchain supports AVX512ER])
328
329         AC_LINK_IFELSE([AC_LANG_SOURCE([
330         [
331                 void main()
332                 {
333                         __asm__ __volatile__("vexp2pd %zmm0,%zmm1");
334                 }
335         ]])], [
336                 AC_MSG_RESULT([yes])
337                 AC_DEFINE([HAVE_AVX512ER], 1, [Define if host toolchain supports AVX512ER])
338         ], [
339                 AC_MSG_RESULT([no])
340         ])
341 ])
342
343 dnl #
344 dnl # ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_AVX512VL
345 dnl #
346 AC_DEFUN([ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_AVX512VL], [
347         AC_MSG_CHECKING([whether host toolchain supports AVX512VL])
348
349         AC_LINK_IFELSE([AC_LANG_SOURCE([
350         [
351                 void main()
352                 {
353                         __asm__ __volatile__("vpabsq %zmm0,%zmm1");
354                 }
355         ]])], [
356                 AC_MSG_RESULT([yes])
357                 AC_DEFINE([HAVE_AVX512VL], 1, [Define if host toolchain supports AVX512VL])
358         ], [
359                 AC_MSG_RESULT([no])
360         ])
361 ])