1# Copyright(c)'1994-2017 by The Givaro group
2# This file is part of Givaro.
3# Givaro is governed by the CeCILL-B license under French law
4# and abiding by the rules of distribution of free software.
5# see the COPYRIGHT file for more details.
6#
7# Author Clement Pernet
8#/
9
10AC_DEFUN([INSTR_SET],
11[
12        SIMD_CFLAGS=""
13        AS_ECHO("Detecting SIMD instruction set")
14
15        AC_ARG_ENABLE(sse,[AC_HELP_STRING([--disable-sse], [ disable SSE instruction set (enabled by default when available)])],[],[])
16        AC_ARG_ENABLE(sse2,[AC_HELP_STRING([--disable-sse2], [ disable SSE2 instruction set (enabled by default when available)])],[],[])
17        AC_ARG_ENABLE(sse3,[AC_HELP_STRING([--disable-sse3], [ disable SSE3 instruction set (enabled by default when available)])],[],[])
18        AC_ARG_ENABLE(ssse3,[AC_HELP_STRING([--disable-ssse3], [ disable SSSE3 instruction set (enabled by default when available)])],[],[])
19        AC_ARG_ENABLE(sse41,[AC_HELP_STRING([--disable-sse41], [ disable SSE4.1 instruction set (enabled by default when available)])],[],[])
20        AC_ARG_ENABLE(sse42,[AC_HELP_STRING([--disable-sse42], [ disable SSE4.2 instruction set (enabled by default when available)])],[],[])
21        AC_ARG_ENABLE(avx,[AC_HELP_STRING([--disable-avx], [ disable AVX instruction set (enabled by default when available)])],[],[])
22        AC_ARG_ENABLE(avx2,[AC_HELP_STRING([--disable-avx2], [ disable AVX2 instruction set (enabled by default when available)])],[],[])
23        AC_ARG_ENABLE(fma,[AC_HELP_STRING([--disable-fma], [ disable FMA instruction set (enabled by default when available)])],[],[])
24        AC_ARG_ENABLE(fma4,[AC_HELP_STRING([--disable-fma4], [ disable FMA4 instruction set (enabled by default when available)])],[],[])
25
26      BACKUP_CPPFLAGS=${CPPFLAGS}
27      CPPFLAGS=-I${srcdir}
28      AC_TRY_RUN([
29                        #include "macros/CodeChunk/instrset_detect.cpp"
30                        // increment by one to distinguish from compilation failure error code
31                        int main(){return instrset_detect()+1;}
32                ],[AS_ECHO("Using 80386 instruction set")],[
33                iset=$?
34                AS_IF([ test "$iset" -ge "2" -a "x$enable_sse" != "xno" ], [
35                        AS_ECHO("SSE enabled")
36                        SIMD_CFLAGS="${SIMD_CFLAGS} -msse"
37                        HAVE_SSE="yes"
38                ],[AS_ECHO("SSE disabled")])
39                AS_IF([ test "$iset" -ge "3" -a "x$enable_sse2" != "xno" ], [
40                        AS_ECHO("SSE2 enabled")
41                        SIMD_CFLAGS="${SIMD_CFLAGS} -msse2"
42                ],[AS_ECHO("SSE2 disabled")])
43                AS_IF([ test "$iset" -ge "4" -a "x$enable_sse3" != "xno" ], [
44                        AS_ECHO("SSE3 enabled")
45                        SIMD_CFLAGS="${SIMD_CFLAGS} -msse3"
46                ],[AS_ECHO("SSE3 disabled")])
47                AS_IF([ test "$iset" -ge "5" -a "x$enable_ssse3" != "xno" ], [
48                        AS_ECHO("SSSE3 enabled")
49                        SIMD_CFLAGS="${SIMD_CFLAGS} -mssse3"
50                ],[AS_ECHO("SSSE3 disabled")])
51                AS_IF([ test "$iset" -ge "6" -a "x$enable_sse41" != "xno" ], [
52                        AS_ECHO("SSE4.1 enabled")
53                        SIMD_CFLAGS="${SIMD_CFLAGS} -msse4.1"
54                ],[AS_ECHO("SSE4.1 disabled")])
55                AS_IF([ test "$iset" -ge "7" -a "x$enable_sse42" != "xno" ], [
56                        AS_ECHO("SSE4.2 enabled")
57                        SIMD_CFLAGS="${SIMD_CFLAGS} -msse4.2"
58                ],[AS_ECHO("SSE4.2 disabled")])
59                AS_IF([ test "$iset" -ge "8" -a "x$enable_avx" != "xno" ], [
60                        AS_ECHO("AVX enabled")
61                        SIMD_CFLAGS="${SIMD_CFLAGS} -mavx"
62                ],[AS_ECHO("AVX disabled")])
63                AS_IF([ test "$iset" -ge "9" -a "x$enable_avx2" != "xno" ], [
64                        AS_ECHO("AVX2 enabled")
65                        SIMD_CFLAGS="${SIMD_CFLAGS} -mavx2"
66                ],[AS_ECHO("AVX2 disabled")])
67        ])
68        AC_TRY_RUN([
69                        #include "macros/CodeChunk/instrset_detect.cpp"
70                        int main(){return !hasFMA3();}
71                   ],[
72                        AS_IF([ test "x$enable_fma" != "xno" ], [
73                                AS_ECHO("FMA3 enabled")
74                                SIMD_CFLAGS="${SIMD_CFLAGS} -mfma"
75                              ],[AS_ECHO("FMA3 disabled")])
76                ],[AS_ECHO("FMA3 disabled")])
77        AC_TRY_RUN([
78                        #include "macros/CodeChunk/instrset_detect.cpp"
79                        int main(){return !hasFMA4();}
80                   ],[
81                        AS_IF([ test "x$enable_fma4" != "xno" ], [
82                                AS_ECHO("FMA4 enabled")
83                                SIMD_CFLAGS="${SIMD_CFLAGS} -mfma4"
84                              ],[AS_ECHO("FMA4 disabled")])
85                ],[AS_ECHO("FMA4 disabled")])
86       CPPFLAGS=${BACKUP_CPPFLAGS}
87
88])
89