From aca5939dfc4bd649c415564af4d3f98d84f6dbb9 Mon Sep 17 00:00:00 2001 From: "bjornv@webrtc.org" Date: Wed, 28 May 2014 08:45:04 +0000 Subject: [PATCH] common_audio/signal_processing: Fixes arm compilation issues with gcc 4.8 In r6240 gcc was rolled from 4.6 to 4.8 changing the behavior on arm. The output of ComplexFFT differs causing both AECM and NS to perform worse. Looking at issues on gcc it says that there could be a memory shuffling/optimization despite using volatile affecting the output. Splitting the three instructions in one call into two separate calls makes the compiler take proper actions resulting in correct outputs. BUG=3370,3395 TESTED=trybots R=kwiberg@webrtc.org Review URL: https://webrtc-codereview.appspot.com/21549004 git-svn-id: http://webrtc.googlecode.com/svn/trunk@6261 4adac7df-926f-26a2-2b94-8c16560cd09d --- webrtc/common_audio/signal_processing/complex_fft.c | 10 +++++----- .../signal_processing/real_fft_unittest.cc | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/webrtc/common_audio/signal_processing/complex_fft.c b/webrtc/common_audio/signal_processing/complex_fft.c index 2e8eb323c..a026b70b0 100644 --- a/webrtc/common_audio/signal_processing/complex_fft.c +++ b/webrtc/common_audio/signal_processing/complex_fft.c @@ -115,18 +115,18 @@ int WebRtcSpl_ComplexFFT(int16_t frfi[], int stages, int mode) j = i + l; #ifdef WEBRTC_ARCH_ARM_V7 - __asm __volatile( + __asm __volatile( "pkhbt %[frfi_r], %[frfi_even], %[frfi_odd], lsl #16\n\t" "smlsd %[tr32], %[wri], %[frfi_r], %[cfftrnd]\n\t" - "smladx %[ti32], %[wri], %[frfi_r], %[cfftrnd]\n\t" :[frfi_r]"+r"(frfi_r), - [tr32]"=r"(tr32), - [ti32]"=r"(ti32) + [tr32]"=r"(tr32) :[frfi_even]"r"((int32_t)frfi[2*j]), [frfi_odd]"r"((int32_t)frfi[2*j +1]), [wri]"r"(wri), [cfftrnd]"r"(CFFTRND) - ); + ); + __asm __volatile("smladx %0, %1, %2, %3\n\t" : "=r"(ti32) : + "r"(wri), "r"(frfi_r), "r"(CFFTRND)); #else tr32 = WEBRTC_SPL_MUL_16_16(wr, frfi[2 * j]) diff --git a/webrtc/common_audio/signal_processing/real_fft_unittest.cc b/webrtc/common_audio/signal_processing/real_fft_unittest.cc index 75472e322..9bd35cd68 100644 --- a/webrtc/common_audio/signal_processing/real_fft_unittest.cc +++ b/webrtc/common_audio/signal_processing/real_fft_unittest.cc @@ -49,7 +49,7 @@ TEST_F(RealFFTTest, CreateFailsOnBadInput) { EXPECT_TRUE(fft == NULL); } -TEST_F(RealFFTTest, DISABLED_ON_ANDROID(RealAndComplexMatch)) { +TEST_F(RealFFTTest, RealAndComplexMatch) { int i = 0; int j = 0; int16_t real_fft_time[kTimeDataLength] = {0};