From 72cfd6c468663a95962d2677c94d91d97b71f980 Mon Sep 17 00:00:00 2001 From: pkasting Date: Mon, 22 Jun 2015 19:33:49 -0700 Subject: [PATCH] Reland remaining bits of "Upconvert various types to int." Most of commit cb180976dd0e9672cde4523d87b5f4857478b5e9 (which reverted commit 83ad33a8aed1fb00e422b6abd33c3e8942821c24) was already re-landed. This relands the rest, including modifications by kwiberg to hopefully avoid regressing performance. In a subsequent change I will see if removing the int16_t cast in this modified version still causes perf problems. BUG=499241 TEST=none TBR=andrew Review URL: https://codereview.webrtc.org/1181693005 Cr-Commit-Position: refs/heads/master@{#9487} --- .../signal_processing/cross_correlation.c | 12 +++++++----- .../signal_processing/cross_correlation_mips.c | 4 ++-- .../signal_processing/cross_correlation_neon.c | 4 ++-- .../include/signal_processing_library.h | 16 ++++++++-------- 4 files changed, 19 insertions(+), 17 deletions(-) diff --git a/webrtc/common_audio/signal_processing/cross_correlation.c b/webrtc/common_audio/signal_processing/cross_correlation.c index 42000d608d..6c8f22c415 100644 --- a/webrtc/common_audio/signal_processing/cross_correlation.c +++ b/webrtc/common_audio/signal_processing/cross_correlation.c @@ -16,16 +16,18 @@ void WebRtcSpl_CrossCorrelationC(int32_t* cross_correlation, const int16_t* seq2, int16_t dim_seq, int16_t dim_cross_correlation, - int16_t right_shifts, - int16_t step_seq2) { + int right_shifts, + int step_seq2) { int i = 0, j = 0; for (i = 0; i < dim_cross_correlation; i++) { - *cross_correlation = 0; + int32_t corr = 0; /* Unrolling doesn't seem to improve performance. */ for (j = 0; j < dim_seq; j++) { - *cross_correlation += (seq1[j] * seq2[step_seq2 * i + j]) >> right_shifts; + // It's not clear why casting |right_shifts| here helps performance. + corr += (seq1[j] * seq2[j]) >> (int16_t)right_shifts; } - cross_correlation++; + seq2 += step_seq2; + *cross_correlation++ = corr; } } diff --git a/webrtc/common_audio/signal_processing/cross_correlation_mips.c b/webrtc/common_audio/signal_processing/cross_correlation_mips.c index 7d9a6c6442..ac3df6d0a1 100644 --- a/webrtc/common_audio/signal_processing/cross_correlation_mips.c +++ b/webrtc/common_audio/signal_processing/cross_correlation_mips.c @@ -15,8 +15,8 @@ void WebRtcSpl_CrossCorrelation_mips(int32_t* cross_correlation, const int16_t* seq2, int16_t dim_seq, int16_t dim_cross_correlation, - int16_t right_shifts, - int16_t step_seq2) { + int right_shifts, + int step_seq2) { int32_t t0 = 0, t1 = 0, t2 = 0, t3 = 0, sum = 0; int16_t *pseq2 = NULL; diff --git a/webrtc/common_audio/signal_processing/cross_correlation_neon.c b/webrtc/common_audio/signal_processing/cross_correlation_neon.c index c358c701af..9bf16cfb6b 100644 --- a/webrtc/common_audio/signal_processing/cross_correlation_neon.c +++ b/webrtc/common_audio/signal_processing/cross_correlation_neon.c @@ -74,8 +74,8 @@ void WebRtcSpl_CrossCorrelationNeon(int32_t* cross_correlation, const int16_t* seq2, int16_t dim_seq, int16_t dim_cross_correlation, - int16_t right_shifts, - int16_t step_seq2) { + int right_shifts, + int step_seq2) { int i = 0; for (i = 0; i < dim_cross_correlation; i++) { diff --git a/webrtc/common_audio/signal_processing/include/signal_processing_library.h b/webrtc/common_audio/signal_processing/include/signal_processing_library.h index f6ab352d85..24656b749f 100644 --- a/webrtc/common_audio/signal_processing/include/signal_processing_library.h +++ b/webrtc/common_audio/signal_processing/include/signal_processing_library.h @@ -542,24 +542,24 @@ typedef void (*CrossCorrelation)(int32_t* cross_correlation, const int16_t* seq2, int16_t dim_seq, int16_t dim_cross_correlation, - int16_t right_shifts, - int16_t step_seq2); + int right_shifts, + int step_seq2); extern CrossCorrelation WebRtcSpl_CrossCorrelation; void WebRtcSpl_CrossCorrelationC(int32_t* cross_correlation, const int16_t* seq1, const int16_t* seq2, int16_t dim_seq, int16_t dim_cross_correlation, - int16_t right_shifts, - int16_t step_seq2); + int right_shifts, + int step_seq2); #if (defined WEBRTC_DETECT_NEON) || (defined WEBRTC_HAS_NEON) void WebRtcSpl_CrossCorrelationNeon(int32_t* cross_correlation, const int16_t* seq1, const int16_t* seq2, int16_t dim_seq, int16_t dim_cross_correlation, - int16_t right_shifts, - int16_t step_seq2); + int right_shifts, + int step_seq2); #endif #if defined(MIPS32_LE) void WebRtcSpl_CrossCorrelation_mips(int32_t* cross_correlation, @@ -567,8 +567,8 @@ void WebRtcSpl_CrossCorrelation_mips(int32_t* cross_correlation, const int16_t* seq2, int16_t dim_seq, int16_t dim_cross_correlation, - int16_t right_shifts, - int16_t step_seq2); + int right_shifts, + int step_seq2); #endif // Creates (the first half of) a Hanning window. Size must be at least 1 and