| Index: configure.ac
|
| diff --git a/configure.ac b/configure.ac
|
| index 0ba4a8076ad44544fd3003b77305e2c261d892cf..87cece9b606a6253c8c7403c6d232021dfd1c245 100644
|
| --- a/configure.ac
|
| +++ b/configure.ac
|
| @@ -189,11 +189,15 @@ AC_ARG_ENABLE([rtcd],
|
| [AS_HELP_STRING([--disable-rtcd], [Disable run-time CPU capabilities detection])],,
|
| [enable_rtcd=yes])
|
|
|
| +AC_ARG_ENABLE([intrinsics],
|
| + [AS_HELP_STRING([--enable-intrinsics], [Enable intrinsics optimizations for ARM(float) X86(fixed)])],,
|
| + [enable_intrinsics=no])
|
| +
|
| rtcd_support=no
|
| cpu_arm=no
|
|
|
| AS_IF([test x"${enable_asm}" = x"yes"],[
|
| - inline_optimization="No ASM for your platform, please send patches"
|
| + inline_optimization="No inline ASM for your platform, please send patches"
|
| case $host_cpu in
|
| arm*)
|
| dnl Currently we only have asm for fixed-point
|
| @@ -317,6 +321,14 @@ AS_IF([test x"${enable_asm}" = x"yes"],[
|
| [rtcd_support=ARM"$rtcd_support"],
|
| [rtcd_support="no"]
|
| )
|
| + AC_MSG_CHECKING([for apple style tools])
|
| + AC_PREPROC_IFELSE([AC_LANG_PROGRAM([
|
| +#ifndef __APPLE__
|
| +#error 1
|
| +#endif],[])],
|
| + [AC_MSG_RESULT([yes]); ARM2GNU_PARAMS="--apple"],
|
| + [AC_MSG_RESULT([no]); ARM2GNU_PARAMS=""])
|
| + AC_SUBST(ARM2GNU_PARAMS)
|
| ],
|
| [
|
| AC_MSG_WARN(
|
| @@ -331,11 +343,179 @@ AS_IF([test x"${enable_asm}" = x"yes"],[
|
| asm_optimization="disabled"
|
| ])
|
|
|
| -AM_CONDITIONAL([CPU_ARM], [test "$cpu_arm" = "yes"])
|
| AM_CONDITIONAL([OPUS_ARM_INLINE_ASM],
|
| - [test x"${inline_optimization:0:3}" = x"ARM"])
|
| + [test x"${inline_optimization%% *}" = x"ARM"])
|
| AM_CONDITIONAL([OPUS_ARM_EXTERNAL_ASM],
|
| - [test x"${asm_optimization:0:3}" = x"ARM"])
|
| + [test x"${asm_optimization%% *}" = x"ARM"])
|
| +
|
| +AM_CONDITIONAL([HAVE_SSE4_1], [false])
|
| +AM_CONDITIONAL([HAVE_SSE2], [false])
|
| +
|
| +AS_IF([test x"$enable_intrinsics" = x"yes"],[
|
| + case $host_cpu in
|
| + arm*)
|
| + cpu_arm=yes
|
| + AC_MSG_CHECKING(if compiler supports ARM NEON intrinsics)
|
| + save_CFLAGS="$CFLAGS"; CFLAGS="-mfpu=neon $CFLAGS"
|
| + AC_LINK_IFELSE(
|
| + [
|
| + AC_LANG_PROGRAM(
|
| + [[#include <arm_neon.h>
|
| + ]],
|
| + [[
|
| + static float32x4_t A[2], SUMM;
|
| + SUMM = vmlaq_f32(SUMM, A[0], A[1]);
|
| + ]]
|
| + )
|
| + ],[
|
| + OPUS_ARM_NEON_INTR=1
|
| + AC_MSG_RESULT([yes])
|
| + ],[
|
| + OPUS_ARM_NEON_INTR=0
|
| + AC_MSG_RESULT([no])
|
| + ]
|
| + )
|
| + CFLAGS="$save_CFLAGS"
|
| + #Now we know if compiler supports ARM neon intrinsics or not
|
| +
|
| + #Currently we only have intrinsic optimization for floating point
|
| + AS_IF([test x"$enable_float" = x"yes"],
|
| + [
|
| + AS_IF([test x"$OPUS_ARM_NEON_INTR" = x"1"],
|
| + [
|
| + AC_DEFINE([OPUS_ARM_NEON_INTR], 1, [Compiler supports ARMv7 Neon Intrinsics])
|
| + AS_IF([test x"enable_rtcd" != x""],
|
| + [rtcd_support="ARM (ARMv7_Neon_Intrinsics)"],[])
|
| + enable_intrinsics="$enable_intrinsics ARMv7_Neon_Intrinsics"
|
| + dnl Don't see why defining these is necessary to check features at runtime
|
| + AC_DEFINE([OPUS_ARM_MAY_HAVE_EDSP], 1, [Define if compiler support EDSP Instructions])
|
| + AC_DEFINE([OPUS_ARM_MAY_HAVE_MEDIA], 1, [Define if compiler support MEDIA Instructions])
|
| + AC_DEFINE([OPUS_ARM_MAY_HAVE_NEON], 1, [Define if compiler support NEON instructions])
|
| + ],
|
| + [
|
| + AC_MSG_WARN([Compiler does not support ARM intrinsics])
|
| + enable_intrinsics=no
|
| + ])
|
| + ], [
|
| + AC_MSG_WARN([Currently on have ARM intrinsics for float])
|
| + enable_intrinsics=no
|
| + ])
|
| + ;;
|
| + "i386" | "i686" | "x86_64")
|
| + AS_IF([test x"$enable_float" = x"no"],[
|
| + AS_IF([test x"$enable_rtcd" = x"yes"],[
|
| + get_cpuid_by_asm="no"
|
| + AC_MSG_CHECKING([Get CPU Info])
|
| + AC_LINK_IFELSE([AC_LANG_PROGRAM([[
|
| + #include <stdio.h>
|
| + ]],[[
|
| + unsigned int CPUInfo0;
|
| + unsigned int CPUInfo1;
|
| + unsigned int CPUInfo2;
|
| + unsigned int CPUInfo3;
|
| + unsigned int InfoType;
|
| + __asm__ __volatile__ (
|
| + "cpuid11":
|
| + "=a" (CPUInfo0),
|
| + "=b" (CPUInfo1),
|
| + "=c" (CPUInfo2),
|
| + "=d" (CPUInfo3) :
|
| + "a" (InfoType), "c" (0)
|
| + );
|
| + ]])],
|
| + [get_cpuid_by_asm="yes"
|
| + AC_MSG_RESULT([Inline Assembly])],
|
| + [AC_LINK_IFELSE([AC_LANG_PROGRAM([[
|
| + #include <cpuid.h>
|
| + ]],[[
|
| + unsigned int CPUInfo0;
|
| + unsigned int CPUInfo1;
|
| + unsigned int CPUInfo2;
|
| + unsigned int CPUInfo3;
|
| + unsigned int InfoType;
|
| + __get_cpuid(InfoType, &CPUInfo0, &CPUInfo1, &CPUInfo2, &CPUInfo3);
|
| + ]])],
|
| + [AC_MSG_RESULT([C method])],
|
| + [AC_MSG_ERROR([not support Get CPU Info, please disable intrinsics ])])])
|
| +
|
| + AC_MSG_CHECKING([sse4.1])
|
| + TMP_CFLAGS="$CFLAGS"
|
| + gcc -Q --help=target | grep "\-msse4.1 "
|
| + AS_IF([test x"$?" = x"0"],[
|
| + CFLAGS="$CFLAGS -msse4.1"
|
| + AC_CHECK_HEADER(xmmintrin.h, [], [AC_MSG_ERROR([Couldn't find xmmintrin.h])])
|
| + AC_CHECK_HEADER(emmintrin.h, [], [AC_MSG_ERROR([Couldn't find emmintrin.h])])
|
| + AC_CHECK_HEADER(smmintrin.h, [], [AC_MSG_ERROR([Couldn't find smmintrin.h])],[
|
| + #ifdef HAVE_XMMINSTRIN_H
|
| + #include <xmmintrin.h>
|
| + #endif
|
| + #ifdef HAVE_EMMINSTRIN_H
|
| + #include <emmintrin.h>
|
| + #endif
|
| + ])
|
| +
|
| + AC_LINK_IFELSE([AC_LANG_PROGRAM([[
|
| + #include <xmmintrin.h>
|
| + #include <emmintrin.h>
|
| + #include <smmintrin.h>
|
| + ]],[[
|
| + __m128i mtest = _mm_setzero_si128();
|
| + mtest = _mm_cmpeq_epi64(mtest, mtest);
|
| + ]])],
|
| + [AC_MSG_RESULT([yes])], [AC_MSG_ERROR([Compiler & linker failure for sse4.1, please disable intrinsics])])
|
| +
|
| + CFLAGS="$TMP_CFLAGS"
|
| + AC_DEFINE([OPUS_X86_MAY_HAVE_SSE4_1], [1], [For x86 sse4.1 instrinsics optimizations])
|
| + AC_DEFINE([OPUS_X86_MAY_HAVE_SSE2], [1], [For x86 sse2 instrinsics optimizations])
|
| + rtcd_support="x86 sse4.1"
|
| + AM_CONDITIONAL([HAVE_SSE4_1], [true])
|
| + AM_CONDITIONAL([HAVE_SSE2], [true])
|
| + AS_IF([test x"$get_cpuid_by_asm" = x"yes"],[AC_DEFINE([CPU_INFO_BY_ASM], [1], [Get CPU Info by asm method])],
|
| + [AC_DEFINE([CPU_INFO_BY_C], [1], [Get CPU Info by C method])])
|
| + ],[ ##### Else case for AS_IF([test x"$?" = x"0"])
|
| + gcc -Q --help=target | grep "\-msse2 "
|
| + AC_MSG_CHECKING([sse2])
|
| + AS_IF([test x"$?" = x"0"],[
|
| + AC_MSG_RESULT([yes])
|
| + CFLAGS="$CFLAGS -msse2"
|
| + AC_CHECK_HEADER(xmmintrin.h, [], [AC_MSG_ERROR([Couldn't find xmmintrin.h])])
|
| + AC_CHECK_HEADER(emmintrin.h, [], [AC_MSG_ERROR([Couldn't find emmintrin.h])])
|
| +
|
| + AC_LINK_IFELSE([AC_LANG_PROGRAM([[
|
| + #include <xmmintrin.h>
|
| + #include <emmintrin.h>
|
| + ]],[[
|
| + __m128i mtest = _mm_setzero_si128();
|
| + ]])],
|
| + [AC_MSG_RESULT([yes])], [AC_MSG_ERROR([Compiler & linker failure for sse2, please disable intrinsics])])
|
| +
|
| + CFLAGS="$TMP_CFLAGS"
|
| + AC_DEFINE([OPUS_X86_MAY_HAVE_SSE2], [1], [For x86 sse2 instrinsics optimize])
|
| + rtcd_support="x86 sse2"
|
| + AM_CONDITIONAL([HAVE_SSE2], [true])
|
| + AS_IF([test x"$get_cpuid_by_asm" = x"yes"],[AC_DEFINE([CPU_INFO_BY_ASM], [1], [Get CPU Info by asm method])],
|
| + [AC_DEFINE([CPU_INFO_BY_C], [1], [Get CPU Info by c method])])
|
| + ],[enable_intrinsics="no"]) #End of AS_IF([test x"$?" = x"0"]
|
| + ])
|
| + ], [
|
| + enable_intrinsics="no"
|
| + ]) ## End of AS_IF([test x"$enable_rtcd" = x"yes"]
|
| +],
|
| +[ ## Else case for AS_IF([test x"$enable_float" = x"no"]
|
| + AC_MSG_WARN([Disabling intrinsics .. x86 intrinsics only avail for fixed point])
|
| + enable_intrinsics="no"
|
| +]) ## End of AS_IF([test x"$enable_float" = x"no"]
|
| + ;;
|
| + *)
|
| + AC_MSG_WARN([No intrinsics support for your architecture])
|
| + enable_intrinsics="no"
|
| + ;;
|
| + esac
|
| +])
|
| +
|
| +AM_CONDITIONAL([CPU_ARM], [test "$cpu_arm" = "yes"])
|
| +AM_CONDITIONAL([OPUS_ARM_NEON_INTR],
|
| + [test x"$OPUS_ARM_NEON_INTR" = x"1"])
|
|
|
| AS_IF([test x"$enable_rtcd" = x"yes"],[
|
| AS_IF([test x"$rtcd_support" != x"no"],[
|
| @@ -443,6 +623,7 @@ AC_MSG_NOTICE([
|
| Fixed point debugging: ......... ${enable_fixed_point_debug}
|
| Inline Assembly Optimizations: . ${inline_optimization}
|
| External Assembly Optimizations: ${asm_optimization}
|
| + Intrinsics Optimizations.......: ${enable_intrinsics}
|
| Run-time CPU detection: ........ ${rtcd_support}
|
| Custom modes: .................. ${enable_custom_modes}
|
| Assertion checking: ............ ${enable_assertions}
|
|
|