xref: /freebsd/sys/contrib/openzfs/config/toolchain-simd.m4 (revision 24e4dcf4ba5e9dedcf89efd358ea3e1fe5867020)
1dnl #
2dnl # Checks if host toolchain supports SIMD instructions
3dnl #
4AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_TOOLCHAIN_SIMD], [
5	case "$host_cpu" in
6		amd64 | 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			ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_AES
25			ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_PCLMULQDQ
26			ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_MOVBE
27			ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_VAES
28			ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_VPCLMULQDQ
29			ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_XSAVE
30			ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_XSAVEOPT
31			ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_XSAVES
32			;;
33	esac
34])
35
36dnl #
37dnl # ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_SSE
38dnl #
39AC_DEFUN([ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_SSE], [
40	AC_MSG_CHECKING([whether host toolchain supports SSE])
41
42	AC_LINK_IFELSE([AC_LANG_SOURCE([[
43		int main()
44		{
45			__asm__ __volatile__("xorps %xmm0, %xmm1");
46			return (0);
47		}
48	]])], [
49		AC_DEFINE([HAVE_SSE], 1, [Define if host toolchain supports SSE])
50		AC_MSG_RESULT([yes])
51	], [
52		AC_MSG_RESULT([no])
53	])
54])
55
56dnl #
57dnl # ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_SSE2
58dnl #
59AC_DEFUN([ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_SSE2], [
60	AC_MSG_CHECKING([whether host toolchain supports SSE2])
61
62	AC_LINK_IFELSE([AC_LANG_SOURCE([[
63		int main()
64		{
65			__asm__ __volatile__("pxor %xmm0, %xmm1");
66			return (0);
67		}
68	]])], [
69		AC_DEFINE([HAVE_SSE2], 1, [Define if host toolchain supports SSE2])
70		AC_MSG_RESULT([yes])
71	], [
72		AC_MSG_RESULT([no])
73	])
74])
75
76dnl #
77dnl # ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_SSE3
78dnl #
79AC_DEFUN([ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_SSE3], [
80	AC_MSG_CHECKING([whether host toolchain supports SSE3])
81
82	AC_LINK_IFELSE([AC_LANG_SOURCE([[
83		int main()
84		{
85			char v[16];
86			__asm__ __volatile__("lddqu %0,%%xmm0" :: "m"(v[0]));
87			return (0);
88		}
89	]])], [
90		AC_DEFINE([HAVE_SSE3], 1, [Define if host toolchain supports SSE3])
91		AC_MSG_RESULT([yes])
92	], [
93		AC_MSG_RESULT([no])
94	])
95])
96
97dnl #
98dnl # ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_SSSE3
99dnl #
100AC_DEFUN([ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_SSSE3], [
101	AC_MSG_CHECKING([whether host toolchain supports SSSE3])
102
103	AC_LINK_IFELSE([AC_LANG_SOURCE([[
104		int main()
105		{
106			__asm__ __volatile__("pshufb %xmm0,%xmm1");
107			return (0);
108		}
109	]])], [
110		AC_DEFINE([HAVE_SSSE3], 1, [Define if host toolchain supports SSSE3])
111		AC_MSG_RESULT([yes])
112	], [
113		AC_MSG_RESULT([no])
114	])
115])
116
117dnl #
118dnl # ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_SSE4_1
119dnl #
120AC_DEFUN([ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_SSE4_1], [
121	AC_MSG_CHECKING([whether host toolchain supports SSE4.1])
122
123	AC_LINK_IFELSE([AC_LANG_SOURCE([[
124		int main()
125		{
126			__asm__ __volatile__("pmaxsb %xmm0,%xmm1");
127			return (0);
128		}
129	]])], [
130		AC_DEFINE([HAVE_SSE4_1], 1, [Define if host toolchain supports SSE4.1])
131		AC_MSG_RESULT([yes])
132	], [
133		AC_MSG_RESULT([no])
134	])
135])
136
137dnl #
138dnl # ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_SSE4_2
139dnl #
140AC_DEFUN([ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_SSE4_2], [
141	AC_MSG_CHECKING([whether host toolchain supports SSE4.2])
142
143	AC_LINK_IFELSE([AC_LANG_SOURCE([[
144		int main()
145		{
146			__asm__ __volatile__("pcmpgtq %xmm0, %xmm1");
147			return (0);
148		}
149	]])], [
150		AC_DEFINE([HAVE_SSE4_2], 1, [Define if host toolchain supports SSE4.2])
151		AC_MSG_RESULT([yes])
152	], [
153		AC_MSG_RESULT([no])
154	])
155])
156
157dnl #
158dnl # ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_AVX
159dnl #
160AC_DEFUN([ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_AVX], [
161	AC_MSG_CHECKING([whether host toolchain supports AVX])
162
163	AC_LINK_IFELSE([AC_LANG_SOURCE([[
164		int main()
165		{
166			char v[32];
167			__asm__ __volatile__("vmovdqa %0,%%ymm0" :: "m"(v[0]));
168			return (0);
169		}
170	]])], [
171		AC_MSG_RESULT([yes])
172		AC_DEFINE([HAVE_AVX], 1, [Define if host toolchain supports AVX])
173	], [
174		AC_MSG_RESULT([no])
175	])
176])
177
178dnl #
179dnl # ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_AVX2
180dnl #
181AC_DEFUN([ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_AVX2], [
182	AC_MSG_CHECKING([whether host toolchain supports AVX2])
183
184	AC_LINK_IFELSE([AC_LANG_SOURCE([
185	[
186		int main()
187		{
188			__asm__ __volatile__("vpshufb %ymm0,%ymm1,%ymm2");
189			return (0);
190		}
191	]])], [
192		AC_MSG_RESULT([yes])
193		AC_DEFINE([HAVE_AVX2], 1, [Define if host toolchain supports AVX2])
194	], [
195		AC_MSG_RESULT([no])
196	])
197])
198
199dnl #
200dnl # ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_AVX512F
201dnl #
202AC_DEFUN([ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_AVX512F], [
203	AC_MSG_CHECKING([whether host toolchain supports AVX512F])
204
205	AC_LINK_IFELSE([AC_LANG_SOURCE([
206	[
207		int main()
208		{
209			__asm__ __volatile__("vpandd %zmm0,%zmm1,%zmm2");
210			return (0);
211		}
212	]])], [
213		AC_MSG_RESULT([yes])
214		AC_DEFINE([HAVE_AVX512F], 1, [Define if host toolchain supports AVX512F])
215	], [
216		AC_MSG_RESULT([no])
217	])
218])
219
220dnl #
221dnl # ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_AVX512CD
222dnl #
223AC_DEFUN([ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_AVX512CD], [
224	AC_MSG_CHECKING([whether host toolchain supports AVX512CD])
225
226	AC_LINK_IFELSE([AC_LANG_SOURCE([
227	[
228		int main()
229		{
230			__asm__ __volatile__("vplzcntd %zmm0,%zmm1");
231			return (0);
232		}
233	]])], [
234		AC_MSG_RESULT([yes])
235		AC_DEFINE([HAVE_AVX512CD], 1, [Define if host toolchain supports AVX512CD])
236	], [
237		AC_MSG_RESULT([no])
238	])
239])
240
241dnl #
242dnl # ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_AVX512DQ
243dnl #
244AC_DEFUN([ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_AVX512DQ], [
245	AC_MSG_CHECKING([whether host toolchain supports AVX512DQ])
246
247	AC_LINK_IFELSE([AC_LANG_SOURCE([
248	[
249		int main()
250		{
251			__asm__ __volatile__("vandpd %zmm0,%zmm1,%zmm2");
252			return (0);
253		}
254	]])], [
255		AC_MSG_RESULT([yes])
256		AC_DEFINE([HAVE_AVX512DQ], 1, [Define if host toolchain supports AVX512DQ])
257	], [
258		AC_MSG_RESULT([no])
259	])
260])
261
262dnl #
263dnl # ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_AVX512BW
264dnl #
265AC_DEFUN([ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_AVX512BW], [
266	AC_MSG_CHECKING([whether host toolchain supports AVX512BW])
267
268	AC_LINK_IFELSE([AC_LANG_SOURCE([
269	[
270		int main()
271		{
272			__asm__ __volatile__("vpshufb %zmm0,%zmm1,%zmm2");
273			return (0);
274		}
275	]])], [
276		AC_MSG_RESULT([yes])
277		AC_DEFINE([HAVE_AVX512BW], 1, [Define if host toolchain supports AVX512BW])
278	], [
279		AC_MSG_RESULT([no])
280	])
281])
282
283dnl #
284dnl # ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_AVX512IFMA
285dnl #
286AC_DEFUN([ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_AVX512IFMA], [
287	AC_MSG_CHECKING([whether host toolchain supports AVX512IFMA])
288
289	AC_LINK_IFELSE([AC_LANG_SOURCE([
290	[
291		int main()
292		{
293			__asm__ __volatile__("vpmadd52luq %zmm0,%zmm1,%zmm2");
294			return (0);
295		}
296	]])], [
297		AC_MSG_RESULT([yes])
298		AC_DEFINE([HAVE_AVX512IFMA], 1, [Define if host toolchain supports AVX512IFMA])
299	], [
300		AC_MSG_RESULT([no])
301	])
302])
303
304dnl #
305dnl # ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_AVX512VBMI
306dnl #
307AC_DEFUN([ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_AVX512VBMI], [
308	AC_MSG_CHECKING([whether host toolchain supports AVX512VBMI])
309
310	AC_LINK_IFELSE([AC_LANG_SOURCE([
311	[
312		int main()
313		{
314			__asm__ __volatile__("vpermb %zmm0,%zmm1,%zmm2");
315			return (0);
316		}
317	]])], [
318		AC_MSG_RESULT([yes])
319		AC_DEFINE([HAVE_AVX512VBMI], 1, [Define if host toolchain supports AVX512VBMI])
320	], [
321		AC_MSG_RESULT([no])
322	])
323])
324
325dnl #
326dnl # ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_AVX512PF
327dnl #
328AC_DEFUN([ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_AVX512PF], [
329	AC_MSG_CHECKING([whether host toolchain supports AVX512PF])
330
331	AC_LINK_IFELSE([AC_LANG_SOURCE([
332	[
333		int main()
334		{
335			__asm__ __volatile__("vgatherpf0dps (%rsi,%zmm0,4){%k1}");
336			return (0);
337		}
338	]])], [
339		AC_MSG_RESULT([yes])
340		AC_DEFINE([HAVE_AVX512PF], 1, [Define if host toolchain supports AVX512PF])
341	], [
342		AC_MSG_RESULT([no])
343	])
344])
345
346dnl #
347dnl # ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_AVX512ER
348dnl #
349AC_DEFUN([ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_AVX512ER], [
350	AC_MSG_CHECKING([whether host toolchain supports AVX512ER])
351
352	AC_LINK_IFELSE([AC_LANG_SOURCE([
353	[
354		int main()
355		{
356			__asm__ __volatile__("vexp2pd %zmm0,%zmm1");
357			return (0);
358		}
359	]])], [
360		AC_MSG_RESULT([yes])
361		AC_DEFINE([HAVE_AVX512ER], 1, [Define if host toolchain supports AVX512ER])
362	], [
363		AC_MSG_RESULT([no])
364	])
365])
366
367dnl #
368dnl # ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_AVX512VL
369dnl #
370AC_DEFUN([ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_AVX512VL], [
371	AC_MSG_CHECKING([whether host toolchain supports AVX512VL])
372
373	AC_LINK_IFELSE([AC_LANG_SOURCE([
374	[
375		int main()
376		{
377			__asm__ __volatile__("vpabsq %zmm0,%zmm1");
378			return (0);
379		}
380	]])], [
381		AC_MSG_RESULT([yes])
382		AC_DEFINE([HAVE_AVX512VL], 1, [Define if host toolchain supports AVX512VL])
383	], [
384		AC_MSG_RESULT([no])
385	])
386])
387
388dnl #
389dnl # ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_AES
390dnl #
391AC_DEFUN([ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_AES], [
392	AC_MSG_CHECKING([whether host toolchain supports AES])
393
394	AC_LINK_IFELSE([AC_LANG_SOURCE([
395	[
396		int main()
397		{
398			__asm__ __volatile__("aesenc %xmm0, %xmm1");
399			return (0);
400		}
401	]])], [
402		AC_MSG_RESULT([yes])
403		AC_DEFINE([HAVE_AES], 1, [Define if host toolchain supports AES])
404	], [
405		AC_MSG_RESULT([no])
406	])
407])
408
409dnl #
410dnl # ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_PCLMULQDQ
411dnl #
412AC_DEFUN([ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_PCLMULQDQ], [
413	AC_MSG_CHECKING([whether host toolchain supports PCLMULQDQ])
414
415	AC_LINK_IFELSE([AC_LANG_SOURCE([
416	[
417		int main()
418		{
419			__asm__ __volatile__("pclmulqdq %0, %%xmm0, %%xmm1" :: "i"(0));
420			return (0);
421		}
422	]])], [
423		AC_MSG_RESULT([yes])
424		AC_DEFINE([HAVE_PCLMULQDQ], 1, [Define if host toolchain supports PCLMULQDQ])
425	], [
426		AC_MSG_RESULT([no])
427	])
428])
429
430dnl #
431dnl # ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_MOVBE
432dnl #
433AC_DEFUN([ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_MOVBE], [
434	AC_MSG_CHECKING([whether host toolchain supports MOVBE])
435
436	AC_LINK_IFELSE([AC_LANG_SOURCE([
437	[
438		int main()
439		{
440			__asm__ __volatile__("movbe 0(%eax), %eax");
441			return (0);
442		}
443	]])], [
444		AC_MSG_RESULT([yes])
445		AC_DEFINE([HAVE_MOVBE], 1, [Define if host toolchain supports MOVBE])
446	], [
447		AC_MSG_RESULT([no])
448	])
449])
450
451dnl #
452dnl # ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_VAES
453dnl #
454AC_DEFUN([ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_VAES], [
455	AC_MSG_CHECKING([whether host toolchain supports VAES])
456
457	AC_LINK_IFELSE([AC_LANG_SOURCE([
458	[
459		int main()
460		{
461			__asm__ __volatile__("vaesenc %ymm0, %ymm1, %ymm0");
462			return (0);
463		}
464	]])], [
465		AC_MSG_RESULT([yes])
466		AC_DEFINE([HAVE_VAES], 1, [Define if host toolchain supports VAES])
467	], [
468		AC_MSG_RESULT([no])
469	])
470])
471
472dnl #
473dnl # ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_VPCLMULQDQ
474dnl #
475AC_DEFUN([ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_VPCLMULQDQ], [
476	AC_MSG_CHECKING([whether host toolchain supports VPCLMULQDQ])
477
478	AC_LINK_IFELSE([AC_LANG_SOURCE([
479	[
480		int main()
481		{
482			__asm__ __volatile__("vpclmulqdq %0, %%ymm4, %%ymm3, %%ymm5" :: "i"(0));
483			return (0);
484		}
485	]])], [
486		AC_MSG_RESULT([yes])
487		AC_DEFINE([HAVE_VPCLMULQDQ], 1, [Define if host toolchain supports VPCLMULQDQ])
488	], [
489		AC_MSG_RESULT([no])
490	])
491])
492
493dnl #
494dnl # ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_XSAVE
495dnl #
496AC_DEFUN([ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_XSAVE], [
497	AC_MSG_CHECKING([whether host toolchain supports XSAVE])
498
499	AC_LINK_IFELSE([AC_LANG_SOURCE([
500	[
501		int main()
502		{
503		  char b[4096] __attribute__ ((aligned (64)));
504		  __asm__ __volatile__("xsave %[b]\n" : : [b] "m" (*b) : "memory");
505		  return (0);
506		}
507	]])], [
508		AC_MSG_RESULT([yes])
509		AC_DEFINE([HAVE_XSAVE], 1, [Define if host toolchain supports XSAVE])
510	], [
511		AC_MSG_RESULT([no])
512	])
513])
514
515dnl #
516dnl # ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_XSAVEOPT
517dnl #
518AC_DEFUN([ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_XSAVEOPT], [
519	AC_MSG_CHECKING([whether host toolchain supports XSAVEOPT])
520
521	AC_LINK_IFELSE([AC_LANG_SOURCE([
522	[
523		int main()
524		{
525		  char b[4096] __attribute__ ((aligned (64)));
526		  __asm__ __volatile__("xsaveopt %[b]\n" : : [b] "m" (*b) : "memory");
527		  return (0);
528		}
529	]])], [
530		AC_MSG_RESULT([yes])
531		AC_DEFINE([HAVE_XSAVEOPT], 1, [Define if host toolchain supports XSAVEOPT])
532	], [
533		AC_MSG_RESULT([no])
534	])
535])
536
537dnl #
538dnl # ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_XSAVES
539dnl #
540AC_DEFUN([ZFS_AC_CONFIG_TOOLCHAIN_CAN_BUILD_XSAVES], [
541	AC_MSG_CHECKING([whether host toolchain supports XSAVES])
542
543	AC_LINK_IFELSE([AC_LANG_SOURCE([
544	[
545		int main()
546		{
547		  char b[4096] __attribute__ ((aligned (64)));
548		  __asm__ __volatile__("xsaves %[b]\n" : : [b] "m" (*b) : "memory");
549		  return (0);
550		}
551	]])], [
552		AC_MSG_RESULT([yes])
553		AC_DEFINE([HAVE_XSAVES], 1, [Define if host toolchain supports XSAVES])
554	], [
555		AC_MSG_RESULT([no])
556	])
557])
558