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