xref: /aosp_15_r20/external/libopus/configure.ac (revision a58d3d2adb790c104798cd88c8a3aff4fa8b82cc)
1*a58d3d2aSXin Lidnl Process this file with autoconf to produce a configure script. -*-m4-*-
2*a58d3d2aSXin Li
3*a58d3d2aSXin Lidnl The package_version file will be automatically synced to the git revision
4*a58d3d2aSXin Lidnl by the update_version script when configured in the repository, but will
5*a58d3d2aSXin Lidnl remain constant in tarball releases unless it is manually edited.
6*a58d3d2aSXin Lim4_define([CURRENT_VERSION],
7*a58d3d2aSXin Li          m4_esyscmd([ ./update_version 2>/dev/null || true
8*a58d3d2aSXin Li                       if test -e package_version; then
9*a58d3d2aSXin Li                           . ./package_version
10*a58d3d2aSXin Li                           printf "$PACKAGE_VERSION"
11*a58d3d2aSXin Li                       else
12*a58d3d2aSXin Li                           printf "unknown"
13*a58d3d2aSXin Li                       fi ]))
14*a58d3d2aSXin Li
15*a58d3d2aSXin LiAC_INIT([opus],[CURRENT_VERSION],[[email protected]])
16*a58d3d2aSXin Li
17*a58d3d2aSXin LiAC_CONFIG_SRCDIR(src/opus_encoder.c)
18*a58d3d2aSXin LiAC_CONFIG_MACRO_DIR([m4])
19*a58d3d2aSXin Li
20*a58d3d2aSXin Lidnl enable silent rules on automake 1.11 and later
21*a58d3d2aSXin Lim4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
22*a58d3d2aSXin Li
23*a58d3d2aSXin Li# For libtool.
24*a58d3d2aSXin Lidnl Please update these for releases.
25*a58d3d2aSXin LiOPUS_LT_CURRENT=10
26*a58d3d2aSXin LiOPUS_LT_REVISION=0
27*a58d3d2aSXin LiOPUS_LT_AGE=10
28*a58d3d2aSXin Li
29*a58d3d2aSXin LiAC_SUBST(OPUS_LT_CURRENT)
30*a58d3d2aSXin LiAC_SUBST(OPUS_LT_REVISION)
31*a58d3d2aSXin LiAC_SUBST(OPUS_LT_AGE)
32*a58d3d2aSXin Li
33*a58d3d2aSXin LiAM_INIT_AUTOMAKE([no-define])
34*a58d3d2aSXin LiAM_MAINTAINER_MODE([enable])
35*a58d3d2aSXin Li
36*a58d3d2aSXin LiAC_CANONICAL_HOST
37*a58d3d2aSXin LiAC_MINGW32
38*a58d3d2aSXin LiAM_PROG_LIBTOOL
39*a58d3d2aSXin LiAM_PROG_CC_C_O
40*a58d3d2aSXin Li
41*a58d3d2aSXin LiAC_PROG_CC_C99
42*a58d3d2aSXin LiAC_C_CONST
43*a58d3d2aSXin LiAC_C_INLINE
44*a58d3d2aSXin Li
45*a58d3d2aSXin LiAM_PROG_AS
46*a58d3d2aSXin Li
47*a58d3d2aSXin LiAC_DEFINE([OPUS_BUILD], [], [This is a build of OPUS])
48*a58d3d2aSXin Li
49*a58d3d2aSXin Li#Use a hacked up version of autoconf's AC_C_RESTRICT because it's not
50*a58d3d2aSXin Li#strong enough a test to detect old buggy versions of GCC (e.g. 2.95.3)
51*a58d3d2aSXin Li#Note: Both this and the test for variable-size arrays below are also
52*a58d3d2aSXin Li#      done by AC_PROG_CC_C99, but not thoroughly enough apparently.
53*a58d3d2aSXin LiAC_CACHE_CHECK([for C/C++ restrict keyword], ac_cv_c_restrict,
54*a58d3d2aSXin Li  [ac_cv_c_restrict=no
55*a58d3d2aSXin Li   # The order here caters to the fact that C++ does not require restrict.
56*a58d3d2aSXin Li   for ac_kw in __restrict __restrict__ _Restrict restrict; do
57*a58d3d2aSXin Li     AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
58*a58d3d2aSXin Li      [[typedef int * int_ptr;
59*a58d3d2aSXin Li        int foo (int_ptr $ac_kw ip, int * $ac_kw baz[]) {
60*a58d3d2aSXin Li        return ip[0];
61*a58d3d2aSXin Li       }]],
62*a58d3d2aSXin Li      [[int s[1];
63*a58d3d2aSXin Li        int * $ac_kw t = s;
64*a58d3d2aSXin Li        t[0] = 0;
65*a58d3d2aSXin Li        return foo(t, (void *)0)]])],
66*a58d3d2aSXin Li      [ac_cv_c_restrict=$ac_kw])
67*a58d3d2aSXin Li     test "$ac_cv_c_restrict" != no && break
68*a58d3d2aSXin Li   done
69*a58d3d2aSXin Li  ])
70*a58d3d2aSXin Li
71*a58d3d2aSXin LiAH_VERBATIM([restrict],
72*a58d3d2aSXin Li[/* Define to the equivalent of the C99 'restrict' keyword, or to
73*a58d3d2aSXin Li   nothing if this is not supported.  Do not define if restrict is
74*a58d3d2aSXin Li   supported directly.  */
75*a58d3d2aSXin Li#undef restrict
76*a58d3d2aSXin Li/* Work around a bug in Sun C++: it does not support _Restrict or
77*a58d3d2aSXin Li   __restrict__, even though the corresponding Sun C compiler ends up with
78*a58d3d2aSXin Li   "#define restrict _Restrict" or "#define restrict __restrict__" in the
79*a58d3d2aSXin Li   previous line.  Perhaps some future version of Sun C++ will work with
80*a58d3d2aSXin Li   restrict; if so, hopefully it defines __RESTRICT like Sun C does.  */
81*a58d3d2aSXin Li#if defined __SUNPRO_CC && !defined __RESTRICT
82*a58d3d2aSXin Li# define _Restrict
83*a58d3d2aSXin Li# define __restrict__
84*a58d3d2aSXin Li#endif])
85*a58d3d2aSXin Li
86*a58d3d2aSXin Licase $ac_cv_c_restrict in
87*a58d3d2aSXin Li   restrict) ;;
88*a58d3d2aSXin Li   no) AC_DEFINE([restrict], []) ;;
89*a58d3d2aSXin Li   *)  AC_DEFINE_UNQUOTED([restrict], [$ac_cv_c_restrict]) ;;
90*a58d3d2aSXin Liesac
91*a58d3d2aSXin Li
92*a58d3d2aSXin LiAC_MSG_CHECKING(for C99 variable-size arrays)
93*a58d3d2aSXin LiAC_COMPILE_IFELSE([AC_LANG_PROGRAM([],
94*a58d3d2aSXin Li                   [[static int x; char a[++x]; a[sizeof a - 1] = 0; int N; return a[0];]])],
95*a58d3d2aSXin Li    [ has_var_arrays=yes
96*a58d3d2aSXin Li      use_alloca="no (using var arrays)"
97*a58d3d2aSXin Li      AC_DEFINE([VAR_ARRAYS], [1], [Use C99 variable-size arrays])
98*a58d3d2aSXin Li    ],[
99*a58d3d2aSXin Li      has_var_arrays=no
100*a58d3d2aSXin Li    ])
101*a58d3d2aSXin LiAC_MSG_RESULT([$has_var_arrays])
102*a58d3d2aSXin Li
103*a58d3d2aSXin LiAS_IF([test "$has_var_arrays" = "no"],
104*a58d3d2aSXin Li  [
105*a58d3d2aSXin Li   AC_CHECK_HEADERS([alloca.h])
106*a58d3d2aSXin Li   AC_MSG_CHECKING(for alloca)
107*a58d3d2aSXin Li   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <alloca.h>]],
108*a58d3d2aSXin Li                                      [[int foo=10; int *array = alloca(foo);]])],
109*a58d3d2aSXin Li     [ use_alloca=yes;
110*a58d3d2aSXin Li       AC_DEFINE([USE_ALLOCA], [], [Make use of alloca])
111*a58d3d2aSXin Li     ],[
112*a58d3d2aSXin Li       use_alloca=no
113*a58d3d2aSXin Li     ])
114*a58d3d2aSXin Li   AC_MSG_RESULT([$use_alloca])
115*a58d3d2aSXin Li  ])
116*a58d3d2aSXin Li
117*a58d3d2aSXin LiLT_LIB_M
118*a58d3d2aSXin Li
119*a58d3d2aSXin LiAC_ARG_ENABLE([fixed-point],
120*a58d3d2aSXin Li    [AS_HELP_STRING([--enable-fixed-point],
121*a58d3d2aSXin Li                    [compile without floating point (for machines without a fast enough FPU)])],,
122*a58d3d2aSXin Li    [enable_fixed_point=no])
123*a58d3d2aSXin Li
124*a58d3d2aSXin LiAS_IF([test "$enable_fixed_point" = "yes"],[
125*a58d3d2aSXin Li  enable_float="no"
126*a58d3d2aSXin Li  AC_DEFINE([FIXED_POINT], [1], [Compile as fixed-point (for machines without a fast enough FPU)])
127*a58d3d2aSXin Li  PC_BUILD="fixed-point"
128*a58d3d2aSXin Li],[
129*a58d3d2aSXin Li  enable_float="yes";
130*a58d3d2aSXin Li  PC_BUILD="floating-point"
131*a58d3d2aSXin Li])
132*a58d3d2aSXin Li
133*a58d3d2aSXin LiAM_CONDITIONAL([FIXED_POINT], [test "$enable_fixed_point" = "yes"])
134*a58d3d2aSXin Li
135*a58d3d2aSXin LiAC_ARG_ENABLE([fixed-point-debug],
136*a58d3d2aSXin Li    [AS_HELP_STRING([--enable-fixed-point-debug], [debug fixed-point implementation])],,
137*a58d3d2aSXin Li    [enable_fixed_point_debug=no])
138*a58d3d2aSXin Li
139*a58d3d2aSXin LiAS_IF([test "$enable_fixed_point_debug" = "yes"],[
140*a58d3d2aSXin Li  AC_DEFINE([FIXED_DEBUG], [1], [Debug fixed-point implementation])
141*a58d3d2aSXin Li])
142*a58d3d2aSXin Li
143*a58d3d2aSXin LiAC_ARG_ENABLE([float_api],
144*a58d3d2aSXin Li    [AS_HELP_STRING([--disable-float-api],
145*a58d3d2aSXin Li                    [compile without the floating point API (for machines with no float library)])],,
146*a58d3d2aSXin Li    [enable_float_api=yes])
147*a58d3d2aSXin Li
148*a58d3d2aSXin LiAM_CONDITIONAL([DISABLE_FLOAT_API], [test "$enable_float_api" = "no"])
149*a58d3d2aSXin Li
150*a58d3d2aSXin LiAS_IF([test "$enable_float_api" = "no"],[
151*a58d3d2aSXin Li  AC_DEFINE([DISABLE_FLOAT_API], [1], [Do not build the float API])
152*a58d3d2aSXin Li])
153*a58d3d2aSXin Li
154*a58d3d2aSXin LiAC_ARG_ENABLE([custom-modes],
155*a58d3d2aSXin Li    [AS_HELP_STRING([--enable-custom-modes], [enable non-Opus modes, e.g. 44.1 kHz & 2^n frames])],,
156*a58d3d2aSXin Li    [enable_custom_modes=no])
157*a58d3d2aSXin Li
158*a58d3d2aSXin LiAS_IF([test "$enable_custom_modes" = "yes"],[
159*a58d3d2aSXin Li  AC_DEFINE([CUSTOM_MODES], [1], [Custom modes])
160*a58d3d2aSXin Li  PC_BUILD="$PC_BUILD, custom modes"
161*a58d3d2aSXin Li])
162*a58d3d2aSXin Li
163*a58d3d2aSXin LiAM_CONDITIONAL([CUSTOM_MODES], [test "$enable_custom_modes" = "yes"])
164*a58d3d2aSXin Li
165*a58d3d2aSXin LiAC_ARG_ENABLE([dred],
166*a58d3d2aSXin Li    [AS_HELP_STRING([--enable-dred], [Use Deep REDundancy (DRED)])],,
167*a58d3d2aSXin Li    [enable_dred=no])
168*a58d3d2aSXin Li
169*a58d3d2aSXin LiAS_IF([test "$enable_dred" = "yes"],[
170*a58d3d2aSXin Li  AC_DEFINE([ENABLE_DRED], [1], [DRED])
171*a58d3d2aSXin Li])
172*a58d3d2aSXin LiAM_CONDITIONAL([ENABLE_DRED], [test "$enable_dred" = "yes"])
173*a58d3d2aSXin Li
174*a58d3d2aSXin LiAC_ARG_ENABLE([deep-plc],
175*a58d3d2aSXin Li    [AS_HELP_STRING([--enable-deep-plc], [Use deep PLC for SILK])],,
176*a58d3d2aSXin Li    [enable_deep_plc=no])
177*a58d3d2aSXin Li
178*a58d3d2aSXin LiAS_IF([test "$enable_deep_plc" = "yes" || test "$enable_dred" = "yes" || test "$enable_osce" = "yes" || test "$enable_osce_training_data" = "yes"],[
179*a58d3d2aSXin Li  AC_DEFINE([ENABLE_DEEP_PLC], [1], [Deep PLC])
180*a58d3d2aSXin Li])
181*a58d3d2aSXin LiAM_CONDITIONAL([ENABLE_DEEP_PLC], [test "$enable_deep_plc" = "yes" || test "$enable_dred" = "yes" || test "$enable_osce" = "yes" || test "$enable_osce_training_data" = "yes"])
182*a58d3d2aSXin Li
183*a58d3d2aSXin LiAC_ARG_ENABLE([lossgen],
184*a58d3d2aSXin Li    [AS_HELP_STRING([--enable-lossgen], [Build opus_demo with packet loss simulator])],,
185*a58d3d2aSXin Li    [enable_lossgen=no])
186*a58d3d2aSXin Li
187*a58d3d2aSXin LiAS_IF([test "$enable_lossgen" = "yes"],[
188*a58d3d2aSXin Li  AC_DEFINE([ENABLE_LOSSGEN], [1], [LOSSGEN])
189*a58d3d2aSXin Li])
190*a58d3d2aSXin LiAM_CONDITIONAL([ENABLE_LOSSGEN], [test "$enable_lossgen" = "yes"])
191*a58d3d2aSXin Li
192*a58d3d2aSXin Lihas_float_approx=no
193*a58d3d2aSXin Licase "$host_cpu" in
194*a58d3d2aSXin Lii[[3456]]86 | x86_64 | arm* | aarch64* | powerpc64 | powerpc32 | ia64)
195*a58d3d2aSXin Li  has_float_approx=yes
196*a58d3d2aSXin Li  ;;
197*a58d3d2aSXin Liesac
198*a58d3d2aSXin Li
199*a58d3d2aSXin LiAC_ARG_ENABLE([float-approx],
200*a58d3d2aSXin Li    [AS_HELP_STRING([--enable-float-approx], [enable fast approximations for floating point])],
201*a58d3d2aSXin Li    [if test "$enable_float_approx" = "yes"; then
202*a58d3d2aSXin Li       AC_WARN([Floating point approximations are not supported on all platforms.])
203*a58d3d2aSXin Li     fi
204*a58d3d2aSXin Li    ],
205*a58d3d2aSXin Li    [enable_float_approx=$has_float_approx])
206*a58d3d2aSXin Li
207*a58d3d2aSXin LiAS_IF([test "$enable_float_approx" = "yes"],[
208*a58d3d2aSXin Li  AC_DEFINE([FLOAT_APPROX], [1], [Float approximations])
209*a58d3d2aSXin Li])
210*a58d3d2aSXin Li
211*a58d3d2aSXin LiAC_ARG_ENABLE([asm],
212*a58d3d2aSXin Li    [AS_HELP_STRING([--disable-asm], [Disable assembly optimizations])],,
213*a58d3d2aSXin Li    [enable_asm=yes])
214*a58d3d2aSXin Li
215*a58d3d2aSXin LiAC_ARG_ENABLE([rtcd],
216*a58d3d2aSXin Li    [AS_HELP_STRING([--disable-rtcd], [Disable run-time CPU capabilities detection])],,
217*a58d3d2aSXin Li    [enable_rtcd=yes])
218*a58d3d2aSXin Li
219*a58d3d2aSXin LiAC_ARG_ENABLE([intrinsics],
220*a58d3d2aSXin Li    [AS_HELP_STRING([--disable-intrinsics], [Disable intrinsics optimizations])],,
221*a58d3d2aSXin Li    [enable_intrinsics=yes])
222*a58d3d2aSXin Li
223*a58d3d2aSXin Lirtcd_support=no
224*a58d3d2aSXin Licpu_arm=no
225*a58d3d2aSXin Licpu_x86=no
226*a58d3d2aSXin Li
227*a58d3d2aSXin LiAS_IF([test x"${enable_asm}" = x"yes"],[
228*a58d3d2aSXin Li    inline_optimization="No inline ASM for your platform, please send patches"
229*a58d3d2aSXin Li    case $host_cpu in
230*a58d3d2aSXin Li      arm*)
231*a58d3d2aSXin Li        dnl Currently we only have asm for fixed-point
232*a58d3d2aSXin Li        #AS_IF([test "$enable_float" != "yes"],[
233*a58d3d2aSXin Li            cpu_arm=yes
234*a58d3d2aSXin Li            AC_DEFINE([OPUS_ARM_ASM], [],  [Make use of ARM asm optimization])
235*a58d3d2aSXin Li            AS_GCC_INLINE_ASSEMBLY(
236*a58d3d2aSXin Li                [inline_optimization="ARM"],
237*a58d3d2aSXin Li                [inline_optimization="disabled"]
238*a58d3d2aSXin Li            )
239*a58d3d2aSXin Li            AS_ASM_ARM_EDSP([OPUS_ARM_INLINE_EDSP=1],[OPUS_ARM_INLINE_EDSP=0])
240*a58d3d2aSXin Li            AS_ASM_ARM_MEDIA([OPUS_ARM_INLINE_MEDIA=1],
241*a58d3d2aSXin Li                [OPUS_ARM_INLINE_MEDIA=0])
242*a58d3d2aSXin Li            AS_ASM_ARM_NEON([OPUS_ARM_INLINE_NEON=1],[OPUS_ARM_INLINE_NEON=0])
243*a58d3d2aSXin Li            AS_IF([test x"$inline_optimization" = x"ARM"],[
244*a58d3d2aSXin Li                AM_CONDITIONAL([OPUS_ARM_INLINE_ASM],[true])
245*a58d3d2aSXin Li                AC_DEFINE([OPUS_ARM_INLINE_ASM], 1,
246*a58d3d2aSXin Li                    [Use generic ARMv4 inline asm optimizations])
247*a58d3d2aSXin Li                AS_IF([test x"$OPUS_ARM_INLINE_EDSP" = x"1"],[
248*a58d3d2aSXin Li                    AC_DEFINE([OPUS_ARM_INLINE_EDSP], [1],
249*a58d3d2aSXin Li                        [Use ARMv5E inline asm optimizations])
250*a58d3d2aSXin Li                    inline_optimization="$inline_optimization (EDSP)"
251*a58d3d2aSXin Li                ])
252*a58d3d2aSXin Li                AS_IF([test x"$OPUS_ARM_INLINE_MEDIA" = x"1"],[
253*a58d3d2aSXin Li                    AC_DEFINE([OPUS_ARM_INLINE_MEDIA], [1],
254*a58d3d2aSXin Li                        [Use ARMv6 inline asm optimizations])
255*a58d3d2aSXin Li                    inline_optimization="$inline_optimization (Media)"
256*a58d3d2aSXin Li                ])
257*a58d3d2aSXin Li                AS_IF([test x"$OPUS_ARM_INLINE_NEON" = x"1"],[
258*a58d3d2aSXin Li                    AC_DEFINE([OPUS_ARM_INLINE_NEON], 1,
259*a58d3d2aSXin Li                        [Use ARM NEON inline asm optimizations])
260*a58d3d2aSXin Li                    inline_optimization="$inline_optimization (NEON)"
261*a58d3d2aSXin Li                ])
262*a58d3d2aSXin Li            ])
263*a58d3d2aSXin Li            dnl We need Perl to translate RVCT-syntax asm to gas syntax.
264*a58d3d2aSXin Li            AC_CHECK_PROG([HAVE_PERL], perl, yes, no)
265*a58d3d2aSXin Li            AS_IF([test x"$HAVE_PERL" = x"yes"],[
266*a58d3d2aSXin Li                AM_CONDITIONAL([OPUS_ARM_EXTERNAL_ASM],[true])
267*a58d3d2aSXin Li                asm_optimization="ARM"
268*a58d3d2aSXin Li                AS_IF([test x"$OPUS_ARM_INLINE_EDSP" = x"1"], [
269*a58d3d2aSXin Li                    OPUS_ARM_PRESUME_EDSP=1
270*a58d3d2aSXin Li                    OPUS_ARM_MAY_HAVE_EDSP=1
271*a58d3d2aSXin Li                ],
272*a58d3d2aSXin Li                [
273*a58d3d2aSXin Li                    OPUS_ARM_PRESUME_EDSP=0
274*a58d3d2aSXin Li                    OPUS_ARM_MAY_HAVE_EDSP=0
275*a58d3d2aSXin Li                ])
276*a58d3d2aSXin Li                AS_IF([test x"$OPUS_ARM_INLINE_MEDIA" = x"1"], [
277*a58d3d2aSXin Li                    OPUS_ARM_PRESUME_MEDIA=1
278*a58d3d2aSXin Li                    OPUS_ARM_MAY_HAVE_MEDIA=1
279*a58d3d2aSXin Li                ],
280*a58d3d2aSXin Li                [
281*a58d3d2aSXin Li                    OPUS_ARM_PRESUME_MEDIA=0
282*a58d3d2aSXin Li                    OPUS_ARM_MAY_HAVE_MEDIA=0
283*a58d3d2aSXin Li                ])
284*a58d3d2aSXin Li                AS_IF([test x"$OPUS_ARM_INLINE_NEON" = x"1"], [
285*a58d3d2aSXin Li                    OPUS_ARM_PRESUME_NEON=1
286*a58d3d2aSXin Li                    OPUS_ARM_MAY_HAVE_NEON=1
287*a58d3d2aSXin Li                ],
288*a58d3d2aSXin Li                [
289*a58d3d2aSXin Li                    OPUS_ARM_PRESUME_NEON=0
290*a58d3d2aSXin Li                    OPUS_ARM_MAY_HAVE_NEON=0
291*a58d3d2aSXin Li                ])
292*a58d3d2aSXin Li                AS_IF([test x"$enable_rtcd" = x"yes"],[
293*a58d3d2aSXin Li                    AS_IF([test x"$OPUS_ARM_MAY_HAVE_EDSP" != x"1"],[
294*a58d3d2aSXin Li                        AC_MSG_NOTICE(
295*a58d3d2aSXin Li                          [Trying to force-enable armv5e EDSP instructions...])
296*a58d3d2aSXin Li                        AS_ASM_ARM_EDSP_FORCE([OPUS_ARM_MAY_HAVE_EDSP=1])
297*a58d3d2aSXin Li                    ])
298*a58d3d2aSXin Li                    AS_IF([test x"$OPUS_ARM_MAY_HAVE_MEDIA" != x"1"],[
299*a58d3d2aSXin Li                        AC_MSG_NOTICE(
300*a58d3d2aSXin Li                          [Trying to force-enable ARMv6 media instructions...])
301*a58d3d2aSXin Li                        AS_ASM_ARM_MEDIA_FORCE([OPUS_ARM_MAY_HAVE_MEDIA=1])
302*a58d3d2aSXin Li                    ])
303*a58d3d2aSXin Li                    AS_IF([test x"$OPUS_ARM_MAY_HAVE_NEON" != x"1"],[
304*a58d3d2aSXin Li                        AC_MSG_NOTICE(
305*a58d3d2aSXin Li                          [Trying to force-enable NEON instructions...])
306*a58d3d2aSXin Li                        AS_ASM_ARM_NEON_FORCE([OPUS_ARM_MAY_HAVE_NEON=1])
307*a58d3d2aSXin Li                    ])
308*a58d3d2aSXin Li                ])
309*a58d3d2aSXin Li                rtcd_support=
310*a58d3d2aSXin Li                AS_IF([test x"$OPUS_ARM_MAY_HAVE_EDSP" = x"1"],[
311*a58d3d2aSXin Li                    AC_DEFINE(OPUS_ARM_MAY_HAVE_EDSP, 1,
312*a58d3d2aSXin Li                        [Define if assembler supports EDSP instructions])
313*a58d3d2aSXin Li                    AS_IF([test x"$OPUS_ARM_PRESUME_EDSP" = x"1"],[
314*a58d3d2aSXin Li                        AC_DEFINE(OPUS_ARM_PRESUME_EDSP, 1,
315*a58d3d2aSXin Li                          [Define if binary requires EDSP instruction support])
316*a58d3d2aSXin Li                        asm_optimization="$asm_optimization (EDSP)"
317*a58d3d2aSXin Li                    ],
318*a58d3d2aSXin Li                        [rtcd_support="$rtcd_support (EDSP)"]
319*a58d3d2aSXin Li                    )
320*a58d3d2aSXin Li                ])
321*a58d3d2aSXin Li                AC_SUBST(OPUS_ARM_MAY_HAVE_EDSP)
322*a58d3d2aSXin Li                AS_IF([test x"$OPUS_ARM_MAY_HAVE_MEDIA" = x"1"],[
323*a58d3d2aSXin Li                    AC_DEFINE(OPUS_ARM_MAY_HAVE_MEDIA, 1,
324*a58d3d2aSXin Li                      [Define if assembler supports ARMv6 media instructions])
325*a58d3d2aSXin Li                    AS_IF([test x"$OPUS_ARM_PRESUME_MEDIA" = x"1"],[
326*a58d3d2aSXin Li                        AC_DEFINE(OPUS_ARM_PRESUME_MEDIA, 1,
327*a58d3d2aSXin Li                          [Define if binary requires ARMv6 media instruction support])
328*a58d3d2aSXin Li                        asm_optimization="$asm_optimization (Media)"
329*a58d3d2aSXin Li                    ],
330*a58d3d2aSXin Li                        [rtcd_support="$rtcd_support (Media)"]
331*a58d3d2aSXin Li                    )
332*a58d3d2aSXin Li                ])
333*a58d3d2aSXin Li                AC_SUBST(OPUS_ARM_MAY_HAVE_MEDIA)
334*a58d3d2aSXin Li                AS_IF([test x"$OPUS_ARM_MAY_HAVE_NEON" = x"1"],[
335*a58d3d2aSXin Li                    AC_DEFINE(OPUS_ARM_MAY_HAVE_NEON, 1,
336*a58d3d2aSXin Li                      [Define if compiler supports NEON instructions])
337*a58d3d2aSXin Li                    AS_IF([test x"$OPUS_ARM_PRESUME_NEON" = x"1"], [
338*a58d3d2aSXin Li                        AC_DEFINE(OPUS_ARM_PRESUME_NEON, 1,
339*a58d3d2aSXin Li                          [Define if binary requires NEON instruction support])
340*a58d3d2aSXin Li                        asm_optimization="$asm_optimization (NEON)"
341*a58d3d2aSXin Li                    ],
342*a58d3d2aSXin Li                        [rtcd_support="$rtcd_support (NEON)"]
343*a58d3d2aSXin Li                    )
344*a58d3d2aSXin Li                ])
345*a58d3d2aSXin Li                AC_SUBST(OPUS_ARM_MAY_HAVE_NEON)
346*a58d3d2aSXin Li                AS_IF([test x"$OPUS_ARM_MAY_HAVE_DOTPROD" = x"1"],[
347*a58d3d2aSXin Li                    AC_DEFINE(OPUS_ARM_MAY_HAVE_DOTPROD, 1,
348*a58d3d2aSXin Li                      [Define if compiler supports DOTPROD instructions])
349*a58d3d2aSXin Li                    AS_IF([test x"$OPUS_ARM_PRESUME_DOTPROD" = x"1"], [
350*a58d3d2aSXin Li                        AC_DEFINE(OPUS_ARM_PRESUME_DOTPROD, 1,
351*a58d3d2aSXin Li                          [Define if binary requires DOTPROD instruction support])
352*a58d3d2aSXin Li                        asm_optimization="$asm_optimization (DOTPROD)"
353*a58d3d2aSXin Li                    ],
354*a58d3d2aSXin Li                        [rtcd_support="$rtcd_support (DOTPROD)"]
355*a58d3d2aSXin Li                    )
356*a58d3d2aSXin Li                ])
357*a58d3d2aSXin Li                AC_SUBST(OPUS_ARM_MAY_HAVE_DOTPROD)
358*a58d3d2aSXin Li                dnl Make sure turning on RTCD gets us at least one
359*a58d3d2aSXin Li                dnl instruction set.
360*a58d3d2aSXin Li                AS_IF([test x"$rtcd_support" != x""],
361*a58d3d2aSXin Li                    [rtcd_support=ARM"$rtcd_support"],
362*a58d3d2aSXin Li                    [rtcd_support="no"]
363*a58d3d2aSXin Li                )
364*a58d3d2aSXin Li                AC_MSG_CHECKING([for apple style tools])
365*a58d3d2aSXin Li                AC_PREPROC_IFELSE([AC_LANG_PROGRAM([
366*a58d3d2aSXin Li#ifndef __APPLE__
367*a58d3d2aSXin Li#error 1
368*a58d3d2aSXin Li#endif],[])],
369*a58d3d2aSXin Li                    [AC_MSG_RESULT([yes]); ARM2GNU_PARAMS="--apple"],
370*a58d3d2aSXin Li                    [AC_MSG_RESULT([no]); ARM2GNU_PARAMS=""])
371*a58d3d2aSXin Li                AC_SUBST(ARM2GNU_PARAMS)
372*a58d3d2aSXin Li            ],
373*a58d3d2aSXin Li            [
374*a58d3d2aSXin Li                AC_MSG_WARN(
375*a58d3d2aSXin Li                  [*** ARM assembly requires perl -- disabling optimizations])
376*a58d3d2aSXin Li                asm_optimization="(missing perl dependency for ARM)"
377*a58d3d2aSXin Li            ])
378*a58d3d2aSXin Li        #])
379*a58d3d2aSXin Li        ;;
380*a58d3d2aSXin Li    esac
381*a58d3d2aSXin Li],[
382*a58d3d2aSXin Li   inline_optimization="disabled"
383*a58d3d2aSXin Li   asm_optimization="disabled"
384*a58d3d2aSXin Li])
385*a58d3d2aSXin Li
386*a58d3d2aSXin LiAM_CONDITIONAL([OPUS_ARM_INLINE_ASM],
387*a58d3d2aSXin Li    [test x"${inline_optimization%% *}" = x"ARM"])
388*a58d3d2aSXin LiAM_CONDITIONAL([OPUS_ARM_EXTERNAL_ASM],
389*a58d3d2aSXin Li    [test x"${asm_optimization%% *}" = x"ARM"])
390*a58d3d2aSXin Li
391*a58d3d2aSXin LiAM_CONDITIONAL([HAVE_SSE], [false])
392*a58d3d2aSXin LiAM_CONDITIONAL([HAVE_SSE2], [false])
393*a58d3d2aSXin LiAM_CONDITIONAL([HAVE_SSE4_1], [false])
394*a58d3d2aSXin LiAM_CONDITIONAL([HAVE_AVX2], [false])
395*a58d3d2aSXin Li
396*a58d3d2aSXin Lim4_define([DEFAULT_X86_SSE_CFLAGS], [-msse])
397*a58d3d2aSXin Lim4_define([DEFAULT_X86_SSE2_CFLAGS], [-msse2])
398*a58d3d2aSXin Lim4_define([DEFAULT_X86_SSE4_1_CFLAGS], [-msse4.1])
399*a58d3d2aSXin Lim4_define([DEFAULT_X86_AVX2_CFLAGS], [-mavx -mfma -mavx2])
400*a58d3d2aSXin Lim4_define([DEFAULT_ARM_NEON_INTR_CFLAGS], [-mfpu=neon])
401*a58d3d2aSXin Lim4_define([DEFAULT_ARM_DOTPROD_INTR_CFLAGS], ["-march=armv8.2-a+dotprod"])
402*a58d3d2aSXin Li# With GCC on ARM32 softfp architectures (e.g. Android, or older Ubuntu) you need to specify
403*a58d3d2aSXin Li# -mfloat-abi=softfp for -mfpu=neon to work.  However, on ARM32 hardfp architectures (e.g. newer Ubuntu),
404*a58d3d2aSXin Li# this option will break things.
405*a58d3d2aSXin Li
406*a58d3d2aSXin Li# As a heuristic, if host matches arm*eabi* but not arm*hf*, it's probably soft-float.
407*a58d3d2aSXin Lim4_define([DEFAULT_ARM_NEON_SOFTFP_INTR_CFLAGS], [-mfpu=neon -mfloat-abi=softfp])
408*a58d3d2aSXin Li
409*a58d3d2aSXin LiAS_CASE([$host],
410*a58d3d2aSXin Li        [arm*hf*], [AS_VAR_SET([RESOLVED_DEFAULT_ARM_NEON_INTR_CFLAGS], "DEFAULT_ARM_NEON_INTR_CFLAGS")],
411*a58d3d2aSXin Li        [arm*eabi*], [AS_VAR_SET([RESOLVED_DEFAULT_ARM_NEON_INTR_CFLAGS], "DEFAULT_ARM_NEON_SOFTFP_INTR_CFLAGS")],
412*a58d3d2aSXin Li        [AS_VAR_SET([RESOLVED_DEFAULT_ARM_NEON_INTR_CFLAGS], "DEFAULT_ARM_NEON_INTR_CFLAGS")])
413*a58d3d2aSXin Li
414*a58d3d2aSXin LiAC_ARG_VAR([X86_SSE_CFLAGS], [C compiler flags to compile SSE intrinsics @<:@default=]DEFAULT_X86_SSE_CFLAGS[@:>@])
415*a58d3d2aSXin LiAC_ARG_VAR([X86_SSE2_CFLAGS], [C compiler flags to compile SSE2 intrinsics @<:@default=]DEFAULT_X86_SSE2_CFLAGS[@:>@])
416*a58d3d2aSXin LiAC_ARG_VAR([X86_SSE4_1_CFLAGS], [C compiler flags to compile SSE4.1 intrinsics @<:@default=]DEFAULT_X86_SSE4_1_CFLAGS[@:>@])
417*a58d3d2aSXin LiAC_ARG_VAR([X86_AVX2_CFLAGS], [C compiler flags to compile AVX2 intrinsics @<:@default=]DEFAULT_X86_AVX2_CFLAGS[@:>@])
418*a58d3d2aSXin LiAC_ARG_VAR([ARM_NEON_INTR_CFLAGS], [C compiler flags to compile ARM NEON intrinsics @<:@default=]DEFAULT_ARM_NEON_INTR_CFLAGS / DEFAULT_ARM_NEON_SOFTFP_INTR_CFLAGS[@:>@])
419*a58d3d2aSXin LiAC_ARG_VAR([ARM_DOTPROD_INTR_CFLAGS], [C compiler flags to compile ARM DOTPROD intrinsics @<:@default=]DEFAULT_ARM_DOTPROD_INTR_CFLAGS[@:>@])
420*a58d3d2aSXin Li
421*a58d3d2aSXin LiAS_VAR_SET_IF([X86_SSE_CFLAGS], [], [AS_VAR_SET([X86_SSE_CFLAGS], "DEFAULT_X86_SSE_CFLAGS")])
422*a58d3d2aSXin LiAS_VAR_SET_IF([X86_SSE2_CFLAGS], [], [AS_VAR_SET([X86_SSE2_CFLAGS], "DEFAULT_X86_SSE2_CFLAGS")])
423*a58d3d2aSXin LiAS_VAR_SET_IF([X86_SSE4_1_CFLAGS], [], [AS_VAR_SET([X86_SSE4_1_CFLAGS], "DEFAULT_X86_SSE4_1_CFLAGS")])
424*a58d3d2aSXin LiAS_VAR_SET_IF([X86_AVX2_CFLAGS], [], [AS_VAR_SET([X86_AVX2_CFLAGS], "DEFAULT_X86_AVX2_CFLAGS")])
425*a58d3d2aSXin LiAS_VAR_SET_IF([ARM_NEON_INTR_CFLAGS], [], [AS_VAR_SET([ARM_NEON_INTR_CFLAGS], ["$RESOLVED_DEFAULT_ARM_NEON_INTR_CFLAGS"])])
426*a58d3d2aSXin LiAS_VAR_SET_IF([ARM_DOTPROD_INTR_CFLAGS], [], [AS_VAR_SET([ARM_DOTPROD_INTR_CFLAGS], ["DEFAULT_ARM_DOTPROD_INTR_CFLAGS"])])
427*a58d3d2aSXin Li
428*a58d3d2aSXin LiAC_DEFUN([OPUS_PATH_NE10],
429*a58d3d2aSXin Li   [
430*a58d3d2aSXin Li      AC_ARG_WITH(NE10,
431*a58d3d2aSXin Li                  AC_HELP_STRING([--with-NE10=PFX],[Prefix where libNE10 is installed (optional)]),
432*a58d3d2aSXin Li                  NE10_prefix="$withval", NE10_prefix="")
433*a58d3d2aSXin Li      AC_ARG_WITH(NE10-libraries,
434*a58d3d2aSXin Li                  AC_HELP_STRING([--with-NE10-libraries=DIR],
435*a58d3d2aSXin Li                        [Directory where libNE10 library is installed (optional)]),
436*a58d3d2aSXin Li                  NE10_libraries="$withval", NE10_libraries="")
437*a58d3d2aSXin Li      AC_ARG_WITH(NE10-includes,
438*a58d3d2aSXin Li                  AC_HELP_STRING([--with-NE10-includes=DIR],
439*a58d3d2aSXin Li                                 [Directory where libNE10 header files are installed (optional)]),
440*a58d3d2aSXin Li                  NE10_includes="$withval", NE10_includes="")
441*a58d3d2aSXin Li
442*a58d3d2aSXin Li      if test "x$NE10_libraries" != "x" ; then
443*a58d3d2aSXin Li         NE10_LIBS="-L$NE10_libraries"
444*a58d3d2aSXin Li      elif test "x$NE10_prefix" = "xno" || test "x$NE10_prefix" = "xyes" ; then
445*a58d3d2aSXin Li         NE10_LIBS=""
446*a58d3d2aSXin Li      elif test "x$NE10_prefix" != "x" ; then
447*a58d3d2aSXin Li         NE10_LIBS="-L$NE10_prefix/lib"
448*a58d3d2aSXin Li      elif test "x$prefix" != "xNONE" ; then
449*a58d3d2aSXin Li         NE10_LIBS="-L$prefix/lib"
450*a58d3d2aSXin Li      fi
451*a58d3d2aSXin Li
452*a58d3d2aSXin Li      if test "x$NE10_prefix" != "xno" ; then
453*a58d3d2aSXin Li         NE10_LIBS="$NE10_LIBS -lNE10"
454*a58d3d2aSXin Li      fi
455*a58d3d2aSXin Li
456*a58d3d2aSXin Li      if test "x$NE10_includes" != "x" ; then
457*a58d3d2aSXin Li         NE10_CFLAGS="-I$NE10_includes"
458*a58d3d2aSXin Li      elif test "x$NE10_prefix" = "xno" || test "x$NE10_prefix" = "xyes" ; then
459*a58d3d2aSXin Li         NE10_CFLAGS=""
460*a58d3d2aSXin Li      elif test "x$NE10_prefix" != "x" ; then
461*a58d3d2aSXin Li         NE10_CFLAGS="-I$NE10_prefix/include"
462*a58d3d2aSXin Li      elif test "x$prefix" != "xNONE"; then
463*a58d3d2aSXin Li         NE10_CFLAGS="-I$prefix/include"
464*a58d3d2aSXin Li      fi
465*a58d3d2aSXin Li
466*a58d3d2aSXin Li      AC_MSG_CHECKING(for NE10)
467*a58d3d2aSXin Li      save_CFLAGS="$CFLAGS"; CFLAGS="$CFLAGS $NE10_CFLAGS"
468*a58d3d2aSXin Li      save_LIBS="$LIBS"; LIBS="$LIBS $NE10_LIBS $LIBM"
469*a58d3d2aSXin Li      AC_LINK_IFELSE(
470*a58d3d2aSXin Li         [
471*a58d3d2aSXin Li            AC_LANG_PROGRAM(
472*a58d3d2aSXin Li               [[#include <NE10_dsp.h>
473*a58d3d2aSXin Li               ]],
474*a58d3d2aSXin Li               [[
475*a58d3d2aSXin Li                  ne10_fft_cfg_float32_t cfg;
476*a58d3d2aSXin Li                  cfg = ne10_fft_alloc_c2c_float32_neon(480);
477*a58d3d2aSXin Li               ]]
478*a58d3d2aSXin Li            )
479*a58d3d2aSXin Li         ],[
480*a58d3d2aSXin Li            HAVE_ARM_NE10=1
481*a58d3d2aSXin Li            AC_MSG_RESULT([yes])
482*a58d3d2aSXin Li         ],[
483*a58d3d2aSXin Li            HAVE_ARM_NE10=0
484*a58d3d2aSXin Li            AC_MSG_RESULT([no])
485*a58d3d2aSXin Li            NE10_CFLAGS=""
486*a58d3d2aSXin Li            NE10_LIBS=""
487*a58d3d2aSXin Li         ]
488*a58d3d2aSXin Li      )
489*a58d3d2aSXin Li      CFLAGS="$save_CFLAGS"; LIBS="$save_LIBS"
490*a58d3d2aSXin Li      #Now we know if libNE10 is installed or not
491*a58d3d2aSXin Li      AS_IF([test x"$HAVE_ARM_NE10" = x"1"],
492*a58d3d2aSXin Li         [
493*a58d3d2aSXin Li            AC_DEFINE([HAVE_ARM_NE10], 1, [NE10 library is installed on host. Make sure it is on target!])
494*a58d3d2aSXin Li            AC_SUBST(HAVE_ARM_NE10)
495*a58d3d2aSXin Li            AC_SUBST(NE10_CFLAGS)
496*a58d3d2aSXin Li            AC_SUBST(NE10_LIBS)
497*a58d3d2aSXin Li         ]
498*a58d3d2aSXin Li      )
499*a58d3d2aSXin Li   ]
500*a58d3d2aSXin Li)
501*a58d3d2aSXin Li
502*a58d3d2aSXin LiAS_IF([test x"$enable_intrinsics" = x"yes"],[
503*a58d3d2aSXin Li   intrinsics_support=""
504*a58d3d2aSXin Li   AS_CASE([$host_cpu],
505*a58d3d2aSXin Li   [arm*|aarch64*],
506*a58d3d2aSXin Li   [
507*a58d3d2aSXin Li      cpu_arm=yes
508*a58d3d2aSXin Li      OPUS_CHECK_INTRINSICS(
509*a58d3d2aSXin Li         [ARM Neon],
510*a58d3d2aSXin Li         [$ARM_NEON_INTR_CFLAGS],
511*a58d3d2aSXin Li         [OPUS_ARM_MAY_HAVE_NEON_INTR],
512*a58d3d2aSXin Li         [OPUS_ARM_PRESUME_NEON_INTR],
513*a58d3d2aSXin Li         [[#include <arm_neon.h>
514*a58d3d2aSXin Li         ]],
515*a58d3d2aSXin Li         [[
516*a58d3d2aSXin Li            static float32x4_t A0, A1, SUMM;
517*a58d3d2aSXin Li            SUMM = vmlaq_f32(SUMM, A0, A1);
518*a58d3d2aSXin Li            return (int)vgetq_lane_f32(SUMM, 0);
519*a58d3d2aSXin Li         ]]
520*a58d3d2aSXin Li      )
521*a58d3d2aSXin Li      AS_IF([test x"$OPUS_ARM_MAY_HAVE_NEON_INTR" = x"1" && test x"$OPUS_ARM_PRESUME_NEON_INTR" != x"1"],
522*a58d3d2aSXin Li          [
523*a58d3d2aSXin Li             OPUS_ARM_NEON_INTR_CFLAGS="$ARM_NEON_INTR_CFLAGS"
524*a58d3d2aSXin Li             AC_SUBST([OPUS_ARM_NEON_INTR_CFLAGS])
525*a58d3d2aSXin Li          ]
526*a58d3d2aSXin Li      )
527*a58d3d2aSXin Li
528*a58d3d2aSXin Li      AS_IF([test x"$OPUS_ARM_MAY_HAVE_NEON_INTR" = x"1"],
529*a58d3d2aSXin Li      [
530*a58d3d2aSXin Li         AC_DEFINE([OPUS_ARM_MAY_HAVE_NEON_INTR], 1, [Compiler supports ARMv7/Aarch64 Neon Intrinsics])
531*a58d3d2aSXin Li         intrinsics_support="$intrinsics_support (NEON)"
532*a58d3d2aSXin Li
533*a58d3d2aSXin Li         AS_IF([test x"$enable_rtcd" != x"no" && test x"$OPUS_ARM_PRESUME_NEON_INTR" != x"1"],
534*a58d3d2aSXin Li            [AS_IF([test x"$rtcd_support" = x"no"],
535*a58d3d2aSXin Li               [rtcd_support="ARM (NEON Intrinsics)"],
536*a58d3d2aSXin Li               [rtcd_support="$rtcd_support (NEON Intrinsics)"])])
537*a58d3d2aSXin Li
538*a58d3d2aSXin Li         AS_IF([test x"$OPUS_ARM_PRESUME_NEON_INTR" = x"1"],
539*a58d3d2aSXin Li            [AC_DEFINE([OPUS_ARM_PRESUME_NEON_INTR], 1, [Define if binary requires NEON intrinsics support])])
540*a58d3d2aSXin Li
541*a58d3d2aSXin Li         OPUS_PATH_NE10()
542*a58d3d2aSXin Li         AS_IF([test x"$NE10_LIBS" != x""],
543*a58d3d2aSXin Li         [
544*a58d3d2aSXin Li              intrinsics_support="$intrinsics_support (NE10)"
545*a58d3d2aSXin Li              AS_IF([test x"enable_rtcd" != x"" \
546*a58d3d2aSXin Li               && test x"$OPUS_ARM_PRESUME_NEON_INTR" != x"1"],
547*a58d3d2aSXin Li                 [rtcd_support="$rtcd_support (NE10)"])
548*a58d3d2aSXin Li         ])
549*a58d3d2aSXin Li
550*a58d3d2aSXin Li         OPUS_CHECK_INTRINSICS(
551*a58d3d2aSXin Li            [Aarch64 Neon],
552*a58d3d2aSXin Li            [$ARM_NEON_INTR_CFLAGS],
553*a58d3d2aSXin Li            [OPUS_ARM_MAY_HAVE_AARCH64_NEON_INTR],
554*a58d3d2aSXin Li            [OPUS_ARM_PRESUME_AARCH64_NEON_INTR],
555*a58d3d2aSXin Li            [[#include <arm_neon.h>
556*a58d3d2aSXin Li            ]],
557*a58d3d2aSXin Li            [[
558*a58d3d2aSXin Li               static int32_t IN;
559*a58d3d2aSXin Li               static int16_t OUT;
560*a58d3d2aSXin Li               OUT = vqmovns_s32(IN);
561*a58d3d2aSXin Li            ]]
562*a58d3d2aSXin Li         )
563*a58d3d2aSXin Li
564*a58d3d2aSXin Li         AS_IF([test x"$OPUS_ARM_PRESUME_AARCH64_NEON_INTR" = x"1"],
565*a58d3d2aSXin Li         [
566*a58d3d2aSXin Li            AC_DEFINE([OPUS_ARM_PRESUME_AARCH64_NEON_INTR], 1, [Define if binary requires Aarch64 Neon Intrinsics])
567*a58d3d2aSXin Li            intrinsics_support="$intrinsics_support (NEON [Aarch64])"
568*a58d3d2aSXin Li         ])
569*a58d3d2aSXin Li
570*a58d3d2aSXin Li         OPUS_CHECK_INTRINSICS(
571*a58d3d2aSXin Li            [Aarch64 dotprod],
572*a58d3d2aSXin Li	    [$ARM_DOTPROD_INTR_CFLAGS],
573*a58d3d2aSXin Li            [OPUS_ARM_MAY_HAVE_DOTPROD],
574*a58d3d2aSXin Li            [OPUS_ARM_PRESUME_DOTPROD],
575*a58d3d2aSXin Li            [[#include <arm_neon.h>
576*a58d3d2aSXin Li            ]],
577*a58d3d2aSXin Li            [[
578*a58d3d2aSXin Li               static int32x4_t acc;
579*a58d3d2aSXin Li               static int8x16_t a, b;
580*a58d3d2aSXin Li               acc = vdotq_s32(acc, a, b);
581*a58d3d2aSXin Li            ]]
582*a58d3d2aSXin Li         )
583*a58d3d2aSXin Li         AS_IF([test x"$OPUS_ARM_MAY_HAVE_DOTPROD" = x"1" && test x"$OPUS_ARM_PRESUME_DOTPROD" != x"1"],
584*a58d3d2aSXin Li             [
585*a58d3d2aSXin Li                OPUS_ARM_DOTPROD_INTR_CFLAGS="$ARM_NEON_DOTPROD_CFLAGS"
586*a58d3d2aSXin Li                AC_SUBST([OPUS_ARM_DOTPROD_INTR_CFLAGS])
587*a58d3d2aSXin Li             ]
588*a58d3d2aSXin Li         )
589*a58d3d2aSXin Li
590*a58d3d2aSXin Li         AS_IF([test x"$OPUS_ARM_MAY_HAVE_DOTPROD" = x"1"],
591*a58d3d2aSXin Li             [
592*a58d3d2aSXin Li                AC_DEFINE([OPUS_ARM_MAY_HAVE_DOTPROD], 1, [Compiler supports Aarch64 DOTPROD Intrinsics])
593*a58d3d2aSXin Li                intrinsics_support="$intrinsics_support (DOTPROD)"
594*a58d3d2aSXin Li
595*a58d3d2aSXin Li                AS_IF([test x"$OPUS_ARM_PRESUME_DOTPROD" = x"1"],
596*a58d3d2aSXin Li                [
597*a58d3d2aSXin Li                   AC_DEFINE([OPUS_ARM_PRESUME_DOTPROD], 1, [Define if binary requires Aarch64 dotprod Intrinsics])
598*a58d3d2aSXin Li                   intrinsics_support="$intrinsics_support (DOTPROD [Aarch64])"
599*a58d3d2aSXin Li                ])
600*a58d3d2aSXin Li
601*a58d3d2aSXin Li                AS_IF([test x"$enable_rtcd" != x"no" && test x"$OPUS_ARM_PRESUME_DOTPROD" != x"1"],
602*a58d3d2aSXin Li                   [AS_IF([test x"$rtcd_support" = x"no"],
603*a58d3d2aSXin Li                      [rtcd_support="ARM (DOTPROD Intrinsics)"],
604*a58d3d2aSXin Li                      [rtcd_support="$rtcd_support (DOTPROD Intrinsics)"])])
605*a58d3d2aSXin Li
606*a58d3d2aSXin Li             ]
607*a58d3d2aSXin Li         )
608*a58d3d2aSXin Li
609*a58d3d2aSXin Li
610*a58d3d2aSXin Li         AS_IF([test x"$intrinsics_support" = x""],
611*a58d3d2aSXin Li            [intrinsics_support=no],
612*a58d3d2aSXin Li            [intrinsics_support="ARM$intrinsics_support"])
613*a58d3d2aSXin Li      ],
614*a58d3d2aSXin Li      [
615*a58d3d2aSXin Li         AC_MSG_WARN([Compiler does not support ARM intrinsics])
616*a58d3d2aSXin Li         intrinsics_support=no
617*a58d3d2aSXin Li      ])
618*a58d3d2aSXin Li   ],
619*a58d3d2aSXin Li   [i?86|x86_64],
620*a58d3d2aSXin Li   [
621*a58d3d2aSXin Li      cpu_x86=yes
622*a58d3d2aSXin Li      OPUS_CHECK_INTRINSICS(
623*a58d3d2aSXin Li         [SSE],
624*a58d3d2aSXin Li         [$X86_SSE_CFLAGS],
625*a58d3d2aSXin Li         [OPUS_X86_MAY_HAVE_SSE],
626*a58d3d2aSXin Li         [OPUS_X86_PRESUME_SSE],
627*a58d3d2aSXin Li         [[#include <xmmintrin.h>
628*a58d3d2aSXin Li           #include <time.h>
629*a58d3d2aSXin Li         ]],
630*a58d3d2aSXin Li         [[
631*a58d3d2aSXin Li             __m128 mtest;
632*a58d3d2aSXin Li             mtest = _mm_set1_ps((float)time(NULL));
633*a58d3d2aSXin Li             mtest = _mm_mul_ps(mtest, mtest);
634*a58d3d2aSXin Li             return _mm_cvtss_si32(mtest);
635*a58d3d2aSXin Li         ]]
636*a58d3d2aSXin Li      )
637*a58d3d2aSXin Li      AS_IF([test x"$OPUS_X86_MAY_HAVE_SSE" = x"1" && test x"$OPUS_X86_PRESUME_SSE" != x"1"],
638*a58d3d2aSXin Li          [
639*a58d3d2aSXin Li             OPUS_X86_SSE_CFLAGS="$X86_SSE_CFLAGS"
640*a58d3d2aSXin Li             AC_SUBST([OPUS_X86_SSE_CFLAGS])
641*a58d3d2aSXin Li          ]
642*a58d3d2aSXin Li      )
643*a58d3d2aSXin Li      OPUS_CHECK_INTRINSICS(
644*a58d3d2aSXin Li         [SSE2],
645*a58d3d2aSXin Li         [$X86_SSE2_CFLAGS],
646*a58d3d2aSXin Li         [OPUS_X86_MAY_HAVE_SSE2],
647*a58d3d2aSXin Li         [OPUS_X86_PRESUME_SSE2],
648*a58d3d2aSXin Li         [[#include <emmintrin.h>
649*a58d3d2aSXin Li           #include <time.h>
650*a58d3d2aSXin Li         ]],
651*a58d3d2aSXin Li         [[
652*a58d3d2aSXin Li            __m128i mtest;
653*a58d3d2aSXin Li            mtest = _mm_set1_epi32((int)time(NULL));
654*a58d3d2aSXin Li            mtest = _mm_mul_epu32(mtest, mtest);
655*a58d3d2aSXin Li            return _mm_cvtsi128_si32(mtest);
656*a58d3d2aSXin Li         ]]
657*a58d3d2aSXin Li      )
658*a58d3d2aSXin Li      AS_IF([test x"$OPUS_X86_MAY_HAVE_SSE2" = x"1" && test x"$OPUS_X86_PRESUME_SSE2" != x"1"],
659*a58d3d2aSXin Li          [
660*a58d3d2aSXin Li             OPUS_X86_SSE2_CFLAGS="$X86_SSE2_CFLAGS"
661*a58d3d2aSXin Li             AC_SUBST([OPUS_X86_SSE2_CFLAGS])
662*a58d3d2aSXin Li          ]
663*a58d3d2aSXin Li      )
664*a58d3d2aSXin Li      OPUS_CHECK_INTRINSICS(
665*a58d3d2aSXin Li         [SSE4.1],
666*a58d3d2aSXin Li         [$X86_SSE4_1_CFLAGS],
667*a58d3d2aSXin Li         [OPUS_X86_MAY_HAVE_SSE4_1],
668*a58d3d2aSXin Li         [OPUS_X86_PRESUME_SSE4_1],
669*a58d3d2aSXin Li         [[#include <smmintrin.h>
670*a58d3d2aSXin Li           #include <time.h>
671*a58d3d2aSXin Li         ]],
672*a58d3d2aSXin Li         [[
673*a58d3d2aSXin Li            __m128i mtest;
674*a58d3d2aSXin Li            mtest = _mm_set1_epi32((int)time(NULL));
675*a58d3d2aSXin Li            mtest = _mm_mul_epi32(mtest, mtest);
676*a58d3d2aSXin Li            return _mm_cvtsi128_si32(mtest);
677*a58d3d2aSXin Li         ]]
678*a58d3d2aSXin Li      )
679*a58d3d2aSXin Li      AS_IF([test x"$OPUS_X86_MAY_HAVE_SSE4_1" = x"1" && test x"$OPUS_X86_PRESUME_SSE4_1" != x"1"],
680*a58d3d2aSXin Li          [
681*a58d3d2aSXin Li             OPUS_X86_SSE4_1_CFLAGS="$X86_SSE4_1_CFLAGS"
682*a58d3d2aSXin Li             AC_SUBST([OPUS_X86_SSE4_1_CFLAGS])
683*a58d3d2aSXin Li          ]
684*a58d3d2aSXin Li      )
685*a58d3d2aSXin Li      OPUS_CHECK_INTRINSICS(
686*a58d3d2aSXin Li         [AVX2],
687*a58d3d2aSXin Li         [$X86_AVX2_CFLAGS],
688*a58d3d2aSXin Li         [OPUS_X86_MAY_HAVE_AVX2],
689*a58d3d2aSXin Li         [OPUS_X86_PRESUME_AVX2],
690*a58d3d2aSXin Li         [[#include <immintrin.h>
691*a58d3d2aSXin Li           #include <time.h>
692*a58d3d2aSXin Li         ]],
693*a58d3d2aSXin Li         [[
694*a58d3d2aSXin Li             unsigned char utest[[16]] = {1};
695*a58d3d2aSXin Li             __m256 mtest;
696*a58d3d2aSXin Li             __m256i mtest1;
697*a58d3d2aSXin Li             __m256i mtest2;
698*a58d3d2aSXin Li             mtest = _mm256_set1_ps((float)time(NULL));
699*a58d3d2aSXin Li             mtest = _mm256_fmadd_ps(mtest, mtest, mtest);
700*a58d3d2aSXin Li             mtest1 = _mm256_set_m128i(_mm_loadu_si64(utest), _mm_loadu_si64(utest));
701*a58d3d2aSXin Li             mtest2 =
702*a58d3d2aSXin Li              _mm256_cvtepi16_epi32(_mm_loadu_si128((__m128i_u *)utest));
703*a58d3d2aSXin Li             return _mm256_extract_epi16(_mm256_xor_si256(
704*a58d3d2aSXin Li              _mm256_xor_si256(mtest1, mtest2), _mm256_cvttps_epi32(mtest)), 0);
705*a58d3d2aSXin Li         ]]
706*a58d3d2aSXin Li      )
707*a58d3d2aSXin Li      AS_IF([test x"$OPUS_X86_MAY_HAVE_AVX2" = x"1" && test x"$OPUS_X86_PRESUME_AVX2" != x"1"],
708*a58d3d2aSXin Li          [
709*a58d3d2aSXin Li             OPUS_X86_AVX2_CFLAGS="$X86_AVX2_CFLAGS"
710*a58d3d2aSXin Li             AC_SUBST([OPUS_X86_AVX2_CFLAGS])
711*a58d3d2aSXin Li          ]
712*a58d3d2aSXin Li      )
713*a58d3d2aSXin Li         AS_IF([test x"$rtcd_support" = x"no"], [rtcd_support=""])
714*a58d3d2aSXin Li         AS_IF([test x"$OPUS_X86_MAY_HAVE_SSE" = x"1"],
715*a58d3d2aSXin Li         [
716*a58d3d2aSXin Li            AC_DEFINE([OPUS_X86_MAY_HAVE_SSE], 1, [Compiler supports X86 SSE Intrinsics])
717*a58d3d2aSXin Li            intrinsics_support="$intrinsics_support SSE"
718*a58d3d2aSXin Li
719*a58d3d2aSXin Li            AS_IF([test x"$OPUS_X86_PRESUME_SSE" = x"1"],
720*a58d3d2aSXin Li               [AC_DEFINE([OPUS_X86_PRESUME_SSE], 1, [Define if binary requires SSE intrinsics support])],
721*a58d3d2aSXin Li               [rtcd_support="$rtcd_support SSE"])
722*a58d3d2aSXin Li         ],
723*a58d3d2aSXin Li         [
724*a58d3d2aSXin Li            AC_MSG_WARN([Compiler does not support SSE intrinsics])
725*a58d3d2aSXin Li         ])
726*a58d3d2aSXin Li
727*a58d3d2aSXin Li         AS_IF([test x"$OPUS_X86_MAY_HAVE_SSE2" = x"1"],
728*a58d3d2aSXin Li         [
729*a58d3d2aSXin Li            AC_DEFINE([OPUS_X86_MAY_HAVE_SSE2], 1, [Compiler supports X86 SSE2 Intrinsics])
730*a58d3d2aSXin Li            intrinsics_support="$intrinsics_support SSE2"
731*a58d3d2aSXin Li
732*a58d3d2aSXin Li            AS_IF([test x"$OPUS_X86_PRESUME_SSE2" = x"1"],
733*a58d3d2aSXin Li               [AC_DEFINE([OPUS_X86_PRESUME_SSE2], 1, [Define if binary requires SSE2 intrinsics support])],
734*a58d3d2aSXin Li               [rtcd_support="$rtcd_support SSE2"])
735*a58d3d2aSXin Li         ],
736*a58d3d2aSXin Li         [
737*a58d3d2aSXin Li            AC_MSG_WARN([Compiler does not support SSE2 intrinsics])
738*a58d3d2aSXin Li         ])
739*a58d3d2aSXin Li
740*a58d3d2aSXin Li         AS_IF([test x"$OPUS_X86_MAY_HAVE_SSE4_1" = x"1"],
741*a58d3d2aSXin Li         [
742*a58d3d2aSXin Li            AC_DEFINE([OPUS_X86_MAY_HAVE_SSE4_1], 1, [Compiler supports X86 SSE4.1 Intrinsics])
743*a58d3d2aSXin Li            intrinsics_support="$intrinsics_support SSE4.1"
744*a58d3d2aSXin Li
745*a58d3d2aSXin Li            AS_IF([test x"$OPUS_X86_PRESUME_SSE4_1" = x"1"],
746*a58d3d2aSXin Li               [AC_DEFINE([OPUS_X86_PRESUME_SSE4_1], 1, [Define if binary requires SSE4.1 intrinsics support])],
747*a58d3d2aSXin Li               [rtcd_support="$rtcd_support SSE4.1"])
748*a58d3d2aSXin Li         ],
749*a58d3d2aSXin Li         [
750*a58d3d2aSXin Li            AC_MSG_WARN([Compiler does not support SSE4.1 intrinsics])
751*a58d3d2aSXin Li         ])
752*a58d3d2aSXin Li         AS_IF([test x"$OPUS_X86_MAY_HAVE_AVX2" = x"1"],
753*a58d3d2aSXin Li         [
754*a58d3d2aSXin Li            AC_DEFINE([OPUS_X86_MAY_HAVE_AVX2], 1, [Compiler supports X86 AVX2 Intrinsics])
755*a58d3d2aSXin Li            intrinsics_support="$intrinsics_support AVX2"
756*a58d3d2aSXin Li
757*a58d3d2aSXin Li            AS_IF([test x"$OPUS_X86_PRESUME_AVX2" = x"1"],
758*a58d3d2aSXin Li               [AC_DEFINE([OPUS_X86_PRESUME_AVX2], 1, [Define if binary requires AVX2 intrinsics support])],
759*a58d3d2aSXin Li               [rtcd_support="$rtcd_support AVX2"])
760*a58d3d2aSXin Li         ],
761*a58d3d2aSXin Li         [
762*a58d3d2aSXin Li            AC_MSG_WARN([Compiler does not support AVX2 intrinsics])
763*a58d3d2aSXin Li         ])
764*a58d3d2aSXin Li
765*a58d3d2aSXin Li         AS_IF([test x"$intrinsics_support" = x""],
766*a58d3d2aSXin Li            [intrinsics_support=no],
767*a58d3d2aSXin Li            [intrinsics_support="x86$intrinsics_support"]
768*a58d3d2aSXin Li         )
769*a58d3d2aSXin Li         AS_IF([test x"$rtcd_support" = x""],
770*a58d3d2aSXin Li            [rtcd_support=no],
771*a58d3d2aSXin Li            [rtcd_support="x86$rtcd_support"],
772*a58d3d2aSXin Li        )
773*a58d3d2aSXin Li
774*a58d3d2aSXin Li    AS_IF([test x"$enable_rtcd" = x"yes" && test x"$rtcd_support" != x""],[
775*a58d3d2aSXin Li            get_cpuid_by_asm="no"
776*a58d3d2aSXin Li            AC_MSG_CHECKING([How to get X86 CPU Info])
777*a58d3d2aSXin Li            AC_LINK_IFELSE([AC_LANG_PROGRAM([[
778*a58d3d2aSXin Li                 #include <stdio.h>
779*a58d3d2aSXin Li            ]],[[
780*a58d3d2aSXin Li                 unsigned int CPUInfo0;
781*a58d3d2aSXin Li                 unsigned int CPUInfo1;
782*a58d3d2aSXin Li                 unsigned int CPUInfo2;
783*a58d3d2aSXin Li                 unsigned int CPUInfo3;
784*a58d3d2aSXin Li                 unsigned int InfoType;
785*a58d3d2aSXin Li                #if defined(__i386__) && defined(__PIC__)
786*a58d3d2aSXin Li                 __asm__ __volatile__ (
787*a58d3d2aSXin Li                 "xchg %%ebx, %1\n"
788*a58d3d2aSXin Li                 "cpuid\n"
789*a58d3d2aSXin Li                 "xchg %%ebx, %1\n":
790*a58d3d2aSXin Li                 "=a" (CPUInfo0),
791*a58d3d2aSXin Li                 "=r" (CPUInfo1),
792*a58d3d2aSXin Li                 "=c" (CPUInfo2),
793*a58d3d2aSXin Li                 "=d" (CPUInfo3) :
794*a58d3d2aSXin Li                 "a" (InfoType), "c" (0)
795*a58d3d2aSXin Li                );
796*a58d3d2aSXin Li               #else
797*a58d3d2aSXin Li                 __asm__ __volatile__ (
798*a58d3d2aSXin Li                 "cpuid":
799*a58d3d2aSXin Li                 "=a" (CPUInfo0),
800*a58d3d2aSXin Li                 "=b" (CPUInfo1),
801*a58d3d2aSXin Li                 "=c" (CPUInfo2),
802*a58d3d2aSXin Li                 "=d" (CPUInfo3) :
803*a58d3d2aSXin Li                 "a" (InfoType), "c" (0)
804*a58d3d2aSXin Li                );
805*a58d3d2aSXin Li               #endif
806*a58d3d2aSXin Li            ]])],
807*a58d3d2aSXin Li            [get_cpuid_by_asm="yes"
808*a58d3d2aSXin Li             AC_MSG_RESULT([Inline Assembly])
809*a58d3d2aSXin Li                 AC_DEFINE([CPU_INFO_BY_ASM], [1], [Get CPU Info by asm method])],
810*a58d3d2aSXin Li             [AC_LINK_IFELSE([AC_LANG_PROGRAM([[
811*a58d3d2aSXin Li                 #include <cpuid.h>
812*a58d3d2aSXin Li            ]],[[
813*a58d3d2aSXin Li                 unsigned int CPUInfo0;
814*a58d3d2aSXin Li                 unsigned int CPUInfo1;
815*a58d3d2aSXin Li                 unsigned int CPUInfo2;
816*a58d3d2aSXin Li                 unsigned int CPUInfo3;
817*a58d3d2aSXin Li                 unsigned int InfoType;
818*a58d3d2aSXin Li                 __get_cpuid_count(InfoType, 0, &CPUInfo0, &CPUInfo1, &CPUInfo2, &CPUInfo3);
819*a58d3d2aSXin Li            ]])],
820*a58d3d2aSXin Li            [AC_MSG_RESULT([C method])
821*a58d3d2aSXin Li                 AC_DEFINE([CPU_INFO_BY_C], [1], [Get CPU Info by c method])],
822*a58d3d2aSXin Li            [AC_MSG_ERROR([no supported Get CPU Info method, please disable run-time CPU capabilities detection or intrinsics])])])])
823*a58d3d2aSXin Li   ],
824*a58d3d2aSXin Li   [
825*a58d3d2aSXin Li      AC_MSG_WARN([No intrinsics support for your architecture])
826*a58d3d2aSXin Li      intrinsics_support="no"
827*a58d3d2aSXin Li   ])
828*a58d3d2aSXin Li],
829*a58d3d2aSXin Li[
830*a58d3d2aSXin Li   intrinsics_support="no"
831*a58d3d2aSXin Li])
832*a58d3d2aSXin Li
833*a58d3d2aSXin LiAM_CONDITIONAL([CPU_ARM], [test "$cpu_arm" = "yes"])
834*a58d3d2aSXin LiAM_CONDITIONAL([HAVE_ARM_DOTPROD],
835*a58d3d2aSXin Li    [test x"$OPUS_ARM_MAY_HAVE_DOTPROD" = x"1"])
836*a58d3d2aSXin LiAM_CONDITIONAL([HAVE_ARM_NEON_INTR],
837*a58d3d2aSXin Li    [test x"$OPUS_ARM_MAY_HAVE_NEON_INTR" = x"1"])
838*a58d3d2aSXin LiAM_CONDITIONAL([HAVE_ARM_NE10],
839*a58d3d2aSXin Li    [test x"$HAVE_ARM_NE10" = x"1"])
840*a58d3d2aSXin LiAM_CONDITIONAL([CPU_X86], [test "$cpu_x86" = "yes"])
841*a58d3d2aSXin LiAM_CONDITIONAL([HAVE_SSE],
842*a58d3d2aSXin Li    [test x"$OPUS_X86_MAY_HAVE_SSE" = x"1"])
843*a58d3d2aSXin LiAM_CONDITIONAL([HAVE_SSE2],
844*a58d3d2aSXin Li    [test x"$OPUS_X86_MAY_HAVE_SSE2" = x"1"])
845*a58d3d2aSXin LiAM_CONDITIONAL([HAVE_SSE4_1],
846*a58d3d2aSXin Li    [test x"$OPUS_X86_MAY_HAVE_SSE4_1" = x"1"])
847*a58d3d2aSXin LiAM_CONDITIONAL([HAVE_AVX2],
848*a58d3d2aSXin Li    [test x"$OPUS_X86_MAY_HAVE_AVX2" = x"1"])
849*a58d3d2aSXin Li
850*a58d3d2aSXin LiAM_CONDITIONAL([HAVE_RTCD],
851*a58d3d2aSXin Li [test x"$enable_rtcd" = x"yes" -a x"$rtcd_support" != x"no"])
852*a58d3d2aSXin LiAS_IF([test x"$enable_rtcd" = x"yes"],[
853*a58d3d2aSXin Li    AS_IF([test x"$rtcd_support" != x"no"],[
854*a58d3d2aSXin Li        AC_DEFINE([OPUS_HAVE_RTCD], [1],
855*a58d3d2aSXin Li            [Use run-time CPU capabilities detection])
856*a58d3d2aSXin Li        OPUS_HAVE_RTCD=1
857*a58d3d2aSXin Li        AC_SUBST(OPUS_HAVE_RTCD)
858*a58d3d2aSXin Li    ])
859*a58d3d2aSXin Li],[
860*a58d3d2aSXin Li    rtcd_support="disabled"
861*a58d3d2aSXin Li])
862*a58d3d2aSXin Li
863*a58d3d2aSXin LiAC_ARG_ENABLE([assertions],
864*a58d3d2aSXin Li    [AS_HELP_STRING([--enable-assertions],[enable additional software error checking])],,
865*a58d3d2aSXin Li    [enable_assertions=no])
866*a58d3d2aSXin Li
867*a58d3d2aSXin LiAS_IF([test "$enable_assertions" = "yes"], [
868*a58d3d2aSXin Li  AC_DEFINE([ENABLE_ASSERTIONS], [1], [Assertions])
869*a58d3d2aSXin Li])
870*a58d3d2aSXin Li
871*a58d3d2aSXin LiAC_ARG_ENABLE([hardening],
872*a58d3d2aSXin Li    [AS_HELP_STRING([--disable-hardening],[disable run-time checks that are cheap and safe for use in production])],,
873*a58d3d2aSXin Li    [enable_hardening=yes])
874*a58d3d2aSXin Li
875*a58d3d2aSXin LiAS_IF([test "$enable_hardening" = "yes"], [
876*a58d3d2aSXin Li  AC_DEFINE([ENABLE_HARDENING], [1], [Hardening])
877*a58d3d2aSXin Li])
878*a58d3d2aSXin Li
879*a58d3d2aSXin LiAC_ARG_ENABLE([fuzzing],
880*a58d3d2aSXin Li	      [AS_HELP_STRING([--enable-fuzzing],[causes the encoder to make random decisions (do not use in production)])],,
881*a58d3d2aSXin Li    [enable_fuzzing=no])
882*a58d3d2aSXin Li
883*a58d3d2aSXin LiAS_IF([test "$enable_fuzzing" = "yes"], [
884*a58d3d2aSXin Li  AC_DEFINE([FUZZING], [1], [Fuzzing])
885*a58d3d2aSXin Li])
886*a58d3d2aSXin Li
887*a58d3d2aSXin LiAC_ARG_ENABLE([check-asm],
888*a58d3d2aSXin Li    [AS_HELP_STRING([--enable-check-asm],
889*a58d3d2aSXin Li                    [enable bit-exactness checks between optimized and c implementations])],,
890*a58d3d2aSXin Li    [enable_check_asm=no])
891*a58d3d2aSXin Li
892*a58d3d2aSXin LiAS_IF([test "$enable_check_asm" = "yes"], [
893*a58d3d2aSXin Li  AC_DEFINE([OPUS_CHECK_ASM], [1], [Run bit-exactness checks between optimized and c implementations])
894*a58d3d2aSXin Li])
895*a58d3d2aSXin Li
896*a58d3d2aSXin LiAC_ARG_ENABLE([doc],
897*a58d3d2aSXin Li    [AS_HELP_STRING([--disable-doc], [Do not build API documentation])],,
898*a58d3d2aSXin Li    [enable_doc=yes])
899*a58d3d2aSXin Li
900*a58d3d2aSXin LiAS_IF([test "$enable_doc" = "yes"], [
901*a58d3d2aSXin Li  AC_CHECK_PROG(HAVE_DOXYGEN, [doxygen], [yes], [no])
902*a58d3d2aSXin Li  AC_CHECK_PROG(HAVE_DOT, [dot], [yes], [no])
903*a58d3d2aSXin Li],[
904*a58d3d2aSXin Li  HAVE_DOXYGEN=no
905*a58d3d2aSXin Li])
906*a58d3d2aSXin Li
907*a58d3d2aSXin LiAC_ARG_ENABLE([dot-product],
908*a58d3d2aSXin Li	      AS_HELP_STRING([--disable-dot-product], [Disable dot product implementation]),,
909*a58d3d2aSXin Li  enable_dot_product=yes)
910*a58d3d2aSXin Li
911*a58d3d2aSXin LiAS_IF([test "$enable_dot_product" = "no"], [
912*a58d3d2aSXin Li       AC_DEFINE([DISABLE_DOT_PROD], [1], [Disable dot product instructions])
913*a58d3d2aSXin Li])
914*a58d3d2aSXin Li
915*a58d3d2aSXin LiAC_ARG_ENABLE([dnn-debug-float],
916*a58d3d2aSXin Li	      AS_HELP_STRING([--enable-dnn-debug-float], [Use floating-point DNN computation everywhere]),,
917*a58d3d2aSXin Li  enable_dnn_debug_float=no)
918*a58d3d2aSXin Li
919*a58d3d2aSXin LiAS_IF([test "$enable_dnn_debug_float" = "no"], [
920*a58d3d2aSXin Li       AC_DEFINE([DISABLE_DEBUG_FLOAT], [1], [Disable DNN debug float])
921*a58d3d2aSXin Li])
922*a58d3d2aSXin Li
923*a58d3d2aSXin LiAC_ARG_ENABLE([osce-training-data],
924*a58d3d2aSXin Li  AS_HELP_STRING([--enable-osce-training-data], [enables feature output for SILK enhancement]),,
925*a58d3d2aSXin Li  [enable_osc_training_data=no]
926*a58d3d2aSXin Li)
927*a58d3d2aSXin Li
928*a58d3d2aSXin LiAS_IF([test "$enable_osce_training_data" = "yes"], [
929*a58d3d2aSXin Li       AC_DEFINE([ENABLE_OSCE_TRAINING_DATA], [1], [Enable dumping of OSCE training data])
930*a58d3d2aSXin Li])
931*a58d3d2aSXin Li
932*a58d3d2aSXin LiAC_MSG_CHECKING([argument osce training data])
933*a58d3d2aSXin LiAS_IF([test "$enable_osce_training_data" = "yes"], [
934*a58d3d2aSXin Li       AC_MSG_RESULT([yes])
935*a58d3d2aSXin Li], [AC_MSG_RESULT([no])])
936*a58d3d2aSXin Li
937*a58d3d2aSXin LiAC_ARG_ENABLE([osce],
938*a58d3d2aSXin Li  AS_HELP_STRING([--enable-osce], [enables speech coding enhancement]),,
939*a58d3d2aSXin Li  [enable_osce=no]
940*a58d3d2aSXin Li)
941*a58d3d2aSXin Li
942*a58d3d2aSXin LiAS_IF([test "$enable_osce" = "yes" || test "$enable_osce_training_data" = "yes"], [
943*a58d3d2aSXin Li       AC_DEFINE([ENABLE_OSCE], [1], [Enable Opus Speech Coding Enhancement])
944*a58d3d2aSXin Li])
945*a58d3d2aSXin Li
946*a58d3d2aSXin LiAM_CONDITIONAL([ENABLE_OSCE], [test "$enable_osce" = "yes" || test "$enable_osce_training_data" = "yes"])
947*a58d3d2aSXin Li
948*a58d3d2aSXin LiAM_CONDITIONAL([HAVE_DOXYGEN], [test "$HAVE_DOXYGEN" = "yes"])
949*a58d3d2aSXin Li
950*a58d3d2aSXin LiAC_ARG_ENABLE([extra-programs],
951*a58d3d2aSXin Li    [AS_HELP_STRING([--disable-extra-programs], [Do not build extra programs (demo and tests)])],,
952*a58d3d2aSXin Li    [enable_extra_programs=yes])
953*a58d3d2aSXin Li
954*a58d3d2aSXin LiAM_CONDITIONAL([EXTRA_PROGRAMS], [test "$enable_extra_programs" = "yes"])
955*a58d3d2aSXin Li
956*a58d3d2aSXin Li
957*a58d3d2aSXin LiAC_ARG_ENABLE([rfc8251],
958*a58d3d2aSXin Li	      AS_HELP_STRING([--disable-rfc8251], [Disable bitstream fixes from RFC 8251]),,
959*a58d3d2aSXin Li  [enable_rfc8251=yes])
960*a58d3d2aSXin Li
961*a58d3d2aSXin LiAS_IF([test "$enable_rfc8251" = "no"], [
962*a58d3d2aSXin Li       AC_DEFINE([DISABLE_UPDATE_DRAFT], [1], [Disable bitstream fixes from RFC 8251])
963*a58d3d2aSXin Li])
964*a58d3d2aSXin Li
965*a58d3d2aSXin Li
966*a58d3d2aSXin Lisaved_CFLAGS="$CFLAGS"
967*a58d3d2aSXin LiCFLAGS="$CFLAGS -fvisibility=hidden"
968*a58d3d2aSXin LiAC_MSG_CHECKING([if ${CC} supports -fvisibility=hidden])
969*a58d3d2aSXin LiAC_COMPILE_IFELSE([AC_LANG_SOURCE([[char foo;]])],
970*a58d3d2aSXin Li    [ AC_MSG_RESULT([yes]) ],
971*a58d3d2aSXin Li    [ AC_MSG_RESULT([no])
972*a58d3d2aSXin Li      CFLAGS="$saved_CFLAGS"
973*a58d3d2aSXin Li    ])
974*a58d3d2aSXin Li
975*a58d3d2aSXin Lion_x86=no
976*a58d3d2aSXin Licase "$host_cpu" in
977*a58d3d2aSXin Lii[[3456]]86 | x86_64)
978*a58d3d2aSXin Li  on_x86=yes
979*a58d3d2aSXin Li  ;;
980*a58d3d2aSXin Liesac
981*a58d3d2aSXin Li
982*a58d3d2aSXin Lion_windows=no
983*a58d3d2aSXin Licase $host in
984*a58d3d2aSXin Li*cygwin*|*mingw*)
985*a58d3d2aSXin Li  on_windows=yes
986*a58d3d2aSXin Li  ;;
987*a58d3d2aSXin Liesac
988*a58d3d2aSXin Li
989*a58d3d2aSXin Lidnl Enable stack-protector-all only on x86 where it's well supported.
990*a58d3d2aSXin Lidnl on some platforms it causes crashes. Hopefully the OS's default's
991*a58d3d2aSXin Lidnl include this on platforms that work but have been missed here.
992*a58d3d2aSXin LiAC_ARG_ENABLE([stack-protector],
993*a58d3d2aSXin Li    [AS_HELP_STRING([--disable-stack-protector],[Disable compiler stack hardening])],,
994*a58d3d2aSXin Li    [
995*a58d3d2aSXin Li      AS_IF([test "$ac_cv_c_compiler_gnu" = "yes" && test "$on_x86" = "yes" && test "$on_windows" = "no"],
996*a58d3d2aSXin Li            [enable_stack_protector=yes],[enable_stack_protector=no])
997*a58d3d2aSXin Li    ])
998*a58d3d2aSXin Li
999*a58d3d2aSXin LiAS_IF([test "$enable_stack_protector" = "yes"],
1000*a58d3d2aSXin Li [
1001*a58d3d2aSXin Li  saved_CFLAGS="$CFLAGS"
1002*a58d3d2aSXin Li  CFLAGS="$CFLAGS -fstack-protector-strong"
1003*a58d3d2aSXin Li  AC_MSG_CHECKING([if ${CC} supports -fstack-protector-strong])
1004*a58d3d2aSXin Li  AC_LINK_IFELSE([AC_LANG_PROGRAM([],[[char foo;]])],
1005*a58d3d2aSXin Li    [ AC_MSG_RESULT([yes]) ],
1006*a58d3d2aSXin Li    [
1007*a58d3d2aSXin Li      AC_MSG_RESULT([no])
1008*a58d3d2aSXin Li      enable_stack_protector=no
1009*a58d3d2aSXin Li      CFLAGS="$saved_CFLAGS"
1010*a58d3d2aSXin Li    ])
1011*a58d3d2aSXin Li ])
1012*a58d3d2aSXin Li
1013*a58d3d2aSXin LiAS_IF([test x$ac_cv_c_compiler_gnu = xyes],
1014*a58d3d2aSXin Li    [AX_ADD_FORTIFY_SOURCE]
1015*a58d3d2aSXin Li)
1016*a58d3d2aSXin Li
1017*a58d3d2aSXin LiCFLAGS="$CFLAGS -W"
1018*a58d3d2aSXin Li
1019*a58d3d2aSXin Liwarn_CFLAGS="-Wall -Wextra -Wcast-align -Wnested-externs -Wshadow -Wstrict-prototypes"
1020*a58d3d2aSXin Lisaved_CFLAGS="$CFLAGS"
1021*a58d3d2aSXin LiCFLAGS="$CFLAGS $warn_CFLAGS"
1022*a58d3d2aSXin LiAC_MSG_CHECKING([if ${CC} supports ${warn_CFLAGS}])
1023*a58d3d2aSXin LiAC_COMPILE_IFELSE([AC_LANG_SOURCE([[char foo;]])],
1024*a58d3d2aSXin Li    [ AC_MSG_RESULT([yes]) ],
1025*a58d3d2aSXin Li    [ AC_MSG_RESULT([no])
1026*a58d3d2aSXin Li      CFLAGS="$saved_CFLAGS"
1027*a58d3d2aSXin Li    ])
1028*a58d3d2aSXin Li
1029*a58d3d2aSXin Lisaved_LIBS="$LIBS"
1030*a58d3d2aSXin LiLIBS="$LIBS $LIBM"
1031*a58d3d2aSXin LiAC_CHECK_FUNCS([lrintf])
1032*a58d3d2aSXin LiAC_CHECK_FUNCS([lrint])
1033*a58d3d2aSXin LiLIBS="$saved_LIBS"
1034*a58d3d2aSXin Li
1035*a58d3d2aSXin LiAC_CHECK_FUNCS([__malloc_hook])
1036*a58d3d2aSXin Li
1037*a58d3d2aSXin LiAC_SUBST([PC_BUILD])
1038*a58d3d2aSXin Li
1039*a58d3d2aSXin LiAC_CONFIG_FILES([
1040*a58d3d2aSXin Li    Makefile
1041*a58d3d2aSXin Li    opus.pc
1042*a58d3d2aSXin Li    opus-uninstalled.pc
1043*a58d3d2aSXin Li    celt/arm/armopts.s
1044*a58d3d2aSXin Li    doc/Makefile
1045*a58d3d2aSXin Li    doc/Doxyfile
1046*a58d3d2aSXin Li])
1047*a58d3d2aSXin LiAC_CONFIG_HEADERS([config.h])
1048*a58d3d2aSXin Li
1049*a58d3d2aSXin LiAC_OUTPUT
1050*a58d3d2aSXin Li
1051*a58d3d2aSXin LiAC_MSG_NOTICE([
1052*a58d3d2aSXin Li------------------------------------------------------------------------
1053*a58d3d2aSXin Li  $PACKAGE_NAME $PACKAGE_VERSION:  Automatic configuration OK.
1054*a58d3d2aSXin Li
1055*a58d3d2aSXin Li    Compiler support:
1056*a58d3d2aSXin Li
1057*a58d3d2aSXin Li      C99 var arrays: ................ ${has_var_arrays}
1058*a58d3d2aSXin Li      C99 lrintf: .................... ${ac_cv_func_lrintf}
1059*a58d3d2aSXin Li      Use alloca: .................... ${use_alloca}
1060*a58d3d2aSXin Li
1061*a58d3d2aSXin Li    General configuration:
1062*a58d3d2aSXin Li
1063*a58d3d2aSXin Li      Floating point support: ........ ${enable_float}
1064*a58d3d2aSXin Li      Fast float approximations: ..... ${enable_float_approx}
1065*a58d3d2aSXin Li      Fixed point debugging: ......... ${enable_fixed_point_debug}
1066*a58d3d2aSXin Li      Inline Assembly Optimizations: . ${inline_optimization}
1067*a58d3d2aSXin Li      External Assembly Optimizations: ${asm_optimization}
1068*a58d3d2aSXin Li      Intrinsics Optimizations: ...... ${intrinsics_support}
1069*a58d3d2aSXin Li      Run-time CPU detection: ........ ${rtcd_support}
1070*a58d3d2aSXin Li      Custom modes: .................. ${enable_custom_modes}
1071*a58d3d2aSXin Li      Assertion checking: ............ ${enable_assertions}
1072*a58d3d2aSXin Li      Hardening: ..................... ${enable_hardening}
1073*a58d3d2aSXin Li      Fuzzing: ....................... ${enable_fuzzing}
1074*a58d3d2aSXin Li      Check ASM: ..................... ${enable_check_asm}
1075*a58d3d2aSXin Li
1076*a58d3d2aSXin Li      API documentation: ............. ${enable_doc}
1077*a58d3d2aSXin Li      Extra programs: ................ ${enable_extra_programs}
1078*a58d3d2aSXin Li------------------------------------------------------------------------
1079*a58d3d2aSXin Li
1080*a58d3d2aSXin Li Type "make; make install" to compile and install
1081*a58d3d2aSXin Li Type "make check" to run the test suite
1082*a58d3d2aSXin Li])
1083*a58d3d2aSXin Li
1084