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