From 98454ed26512886b897fee0544fac40a0b694912 Mon Sep 17 00:00:00 2001 From: Arun Raghavan Date: Thu, 15 Oct 2015 12:51:03 +0530 Subject: [PATCH] build: Add architecture checks for x86 and ARM On x86, SSE optimisations are always compiled in, and used based on runtime checks. On ARM, we try to autodetect NEON support (with an option of runtime detection). This has not been build-tested on ARM yet. This leaves MIPS to be done. --- configure.ac | 51 +++++++++++++++- webrtc/common_audio/Makefile.am | 65 +++++++++++++-------- webrtc/modules/audio_processing/Makefile.am | 39 ++++++++----- 3 files changed, 113 insertions(+), 42 deletions(-) diff --git a/configure.ac b/configure.ac index 6e2fdc2..e386a59 100644 --- a/configure.ac +++ b/configure.ac @@ -7,10 +7,14 @@ AC_SUBST(LIBWEBRTC_AUDIO_PROCESSING_VERSION_INFO, [0:0:0]) AM_SILENT_RULES([yes]) +# Set up the host_* variables +AC_CANONICAL_HOST + AC_PROG_CC AC_PROG_CXX AC_PROG_LIBTOOL AC_PROG_INSTALL +AM_PROG_AS AC_LANG_C AC_LANG_CPLUSPLUS @@ -53,8 +57,51 @@ AS_CASE(["${host}"], ) AC_SUBST(PLATFORM_CFLAGS) -COMMON_CFLAGS="-DWEBRTC_AUDIO_PROCESSING_ONLY_BUILD ${PLATFORM_CFLAGS} ${OS_CFLAGS} -DNDEBUG -I\$(top_srcdir)" -COMMON_CXXFLAGS="-std=c++11 -DWEBRTC_AUDIO_PROCESSING_ONLY_BUILD ${PLATFORM_CFLAGS} ${OS_CFLAGS} -DNDEBUG -I\$(top_srcdir)" +AS_CASE(["${host_cpu}"], + [i?86|x86_64], + [ + HAVE_X86=1 + ], + [armv7*|armv8*], + [ + HAVE_ARM=1 + HAVE_ARMV7=1 + ], + [arm*], + [ + HAVE_ARM=1 + ] + # FIXME: Add MIPS support, see webrtc/BUILD.gn for defines +) +AM_CONDITIONAL(HAVE_X86, [test "x${HAVE_X86}" = "x1"]) +AM_CONDITIONAL(HAVE_ARM, [test "x${HAVE_ARM}" = "x1"]) +AM_CONDITIONAL(HAVE_ARMV7, [test "x${HAVE_ARMV7}" = "x1"]) + +# Borrowed from pulseaudio's configure.ac +AC_ARG_ENABLE([neon], + AS_HELP_STRING([--enable-neon], [Enable NEON optimisations on ARM CPUs that support it (yes|no|auto|runtime)])) + +AS_IF([test "x$enable_neon" != "xno"], + AS_IF([test "x$enable_neon" != "xruntime"], + [ + save_CFLAGS="$CFLAGS"; CFLAGS="-mfpu=neon $CFLAGS" + AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM([[#include ]], [])], + [ + HAVE_NEON=1 + ARCH_CFLAGS="-mfpu=neon" + ]) + CFLAGS="$save_CFLAGS" + ], + [ + HAVE_NEON=1 + ARCH_CFLAGS="-mfpu=neon -DWEBRTC_DETECT_NEON" + ]) +) +AM_CONDITIONAL([HAVE_NEON], [test "x$HAVE_NEON" = "x1"]) + +COMMON_CFLAGS="-DWEBRTC_AUDIO_PROCESSING_ONLY_BUILD ${PLATFORM_CFLAGS} ${OS_CFLAGS} ${ARCH_CFLAGS} -DNDEBUG -I\$(top_srcdir)" +COMMON_CXXFLAGS="-std=c++11 -DWEBRTC_AUDIO_PROCESSING_ONLY_BUILD ${PLATFORM_CFLAGS} ${OS_CFLAGS} ${ARCH_CFLAGS} -DNDEBUG -I\$(top_srcdir)" AC_SUBST([COMMON_CFLAGS]) AC_SUBST([COMMON_CXXFLAGS]) diff --git a/webrtc/common_audio/Makefile.am b/webrtc/common_audio/Makefile.am index 709bf71..9b0bac9 100644 --- a/webrtc/common_audio/Makefile.am +++ b/webrtc/common_audio/Makefile.am @@ -11,7 +11,6 @@ libcommon_audio_la_SOURCES = resampler/include/push_resampler.h \ resampler/push_sinc_resampler.cc \ resampler/resampler.cc \ resampler/sinc_resampler.cc \ - resampler/sinc_resampler_sse.cc \ resampler/sinusoidal_linear_chirp_source.cc \ signal_processing/include/real_fft.h \ signal_processing/include/signal_processing_library.h \ @@ -78,8 +77,6 @@ libcommon_audio_la_SOURCES = resampler/include/push_resampler.h \ fft4g.h \ fir_filter.cc \ fir_filter.h \ - fir_filter_sse.cc \ - fir_filter_sse.h \ lapped_transform.cc \ lapped_transform.h \ real_fourier.cc \ @@ -98,28 +95,46 @@ libcommon_audio_la_SOURCES = resampler/include/push_resampler.h \ window_generator.h \ window_generator.cc +if HAVE_X86 +libcommon_audio_la_SOURCES += \ + resampler/sinc_resampler_sse.cc \ + fir_filter_sse.cc \ + fir_filter_sse.h +endif + +if HAVE_ARM +libcommon_audio_la_SOURCES += \ + signal_processing/complex_bit_reverse_arm.S \ + signal_processing/spl_sqrt_floor_arm.S +endif + +if HAVE_ARMV7 +libcommon_audio_la_SOURCES += \ + signal_processing/filter_ar_fast_q12_armv7.S +endif + +if HAVE_NEON +libcommon_audio_la_SOURCES += \ + resampler/sinc_resampler_neon.cc \ + signal_processing/cross_correlation_neon.c \ + signal_processing/downsample_fast_neon.c \ + signal_processing/min_max_operations_neon.c \ + fir_filter_neon.cc \ + fir_filter_neon.h +endif + libcommon_audio_la_CFLAGS = $(AM_CFLAGS) $(COMMON_CFLAGS) libcommon_audio_la_CXXFLAGS = $(AM_CXXFLAGS) $(COMMON_CXXFLAGS) -EXTRA_DIST = BUILD.gn - -# FIXME: -# x86 - resampler/sinc_resampler_sse.cc -# fir_filter_sse.cc -# ARM - signal_processing/complex_bit_reverse_arm.S -# signal_processing/spl_sqrt_floor_arm.S -# ARM7 - signal_processing/filter_ar_fast_q12_armv7.S -# NEON - resampler/sinc_resampler_neon.cc \ -# signal_processing/cross_correlation_neon.c -# signal_processing/downsample_fast_neon.c -# signal_processing/min_max_operations_neon.c -# fir_filter_neon.c -# MIPS - signal_processing/complex_bit_reverse_mips.c -# signal_processing/complex_fft_mips.c -# signal_processing/cross_correlation_mips.c -# signal_processing/downsample_fast_mips.c -# signal_processing/filter_ar_fast_q12_mips.c -# signal_processing/min_max_operations_mips.c -# signal_processing/resample_by_2_mips.c -# signal_processing/spl_sqrt_floor_mips.c -# signal_processing/vector_scaling_operations_mips.c +# FIXME: The MIPS optimisations need to be hooked up once we have the +# autotools conditionals in place +EXTRA_DIST = BUILD.gn \ + signal_processing/complex_bit_reverse_mips.c \ + signal_processing/complex_fft_mips.c \ + signal_processing/cross_correlation_mips.c \ + signal_processing/downsample_fast_mips.c \ + signal_processing/filter_ar_fast_q12_mips.c \ + signal_processing/min_max_operations_mips.c \ + signal_processing/resample_by_2_mips.c \ + signal_processing/spl_sqrt_floor_mips.c \ + signal_processing/vector_scaling_operations_mips.c diff --git a/webrtc/modules/audio_processing/Makefile.am b/webrtc/modules/audio_processing/Makefile.am index f9b4ac7..48defd7 100644 --- a/webrtc/modules/audio_processing/Makefile.am +++ b/webrtc/modules/audio_processing/Makefile.am @@ -6,10 +6,8 @@ libwebrtc_audio_processing_la_SOURCES = include/audio_processing.h \ aec/aec_core.c \ aec/aec_core.h \ aec/aec_core_internal.h \ - aec/aec_core_sse2.c \ aec/aec_rdft.c \ aec/aec_rdft.h \ - aec/aec_rdft_sse2.c \ aec/aec_resampler.c \ aec/aec_resampler.h \ aec/echo_cancellation.c \ @@ -130,6 +128,10 @@ libwebrtc_audio_processing_la_SOURCES += \ ns/nsx_core.c \ ns/nsx_core.h \ ns/nsx_core_c.c +if HAVE_NEON +libwebrtc_audio_processing_la_SOURCES += \ + ns/nsx_core_neon.c +endif else COMMON_CFLAGS += -DWEBRTC_NS_FLOAT=1 COMMON_CXXFLAGS += -DWEBRTC_NS_FLOAT=1 @@ -142,6 +144,19 @@ libwebrtc_audio_processing_la_SOURCES += \ ns/windows_private.h endif +if HAVE_X86 +libwebrtc_audio_processing_la_SOURCES += \ + aec/aec_core_sse2.c \ + aec/aec_rdft_sse2.c +endif + +if HAVE_NEON +libwebrtc_audio_processing_la_SOURCES += \ + aec/aec_core_neon.c \ + aec/aec_rdft_neon.c \ + aecm/aecm_core_neon.c +endif + libwebrtc_audio_processing_la_CFLAGS = $(AM_CFLAGS) $(COMMON_CFLAGS) libwebrtc_audio_processing_la_CXXFLAGS = $(AM_CXXFLAGS) $(COMMON_CXXFLAGS) @@ -152,16 +167,10 @@ libwebrtc_audio_processing_la_LIBADD = $(top_builddir)/webrtc/libwebrtc.la \ $(top_builddir)/webrtc/modules/audio_coding/libaudio_coding.la libwebrtc_audio_processing_la_LDFLAGS = $(AM_LDFLAGS) -version-info $(LIBWEBRTC_AUDIO_PROCESSING_VERSION_INFO) -EXTRA_DIST = BUILD.gn - -# FIXME: -# x86: aec/aec_core_sse2.c -# aec/aec_rdft_sse2.c -# NEON: aec/aec_core_neon.c -# aec/aec_rdft_neon.c -# aecm/aecm_core_neon.c -# ns/nsx_core_neon.c -# MIPS: aec/aec_core_mips.c -# aec/aec_rdft_neon.c -# aecm/aecm_core_mips.c -# ns/nsx_core_mips.c +# FIXME: The MIPS optimisations need to be hooked up once we have the +# autotools conditionals in place +EXTRA_DIST = BUILD.gn \ + aec/aec_core_mips.c \ + aec/aec_rdft_neon.c \ + aecm/aecm_core_mips.c \ + ns/nsx_core_mips.c