Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.xiph.org/xiph/opus.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJean-Marc Valin <jmvalin@jmvalin.ca>2013-06-14 07:51:58 +0400
committerJean-Marc Valin <jmvalin@jmvalin.ca>2013-06-14 07:51:58 +0400
commit4e018b22bb1594daccb29cd6e92cca11809111d2 (patch)
tree69790771bf6109819b6e4767a54b74bd932e76c3 /celt/pitch.c
parent39cbc45828cdbb2a74e4bea44a399e3a5b0a4530 (diff)
SSE optimization of remove_doubling()
Should be trivial to adapt for Neon.
Diffstat (limited to 'celt/pitch.c')
-rw-r--r--celt/pitch.c21
1 files changed, 15 insertions, 6 deletions
diff --git a/celt/pitch.c b/celt/pitch.c
index f8115c2f..025f448d 100644
--- a/celt/pitch.c
+++ b/celt/pitch.c
@@ -394,6 +394,20 @@ void pitch_search(const opus_val16 * OPUS_RESTRICT x_lp, opus_val16 * OPUS_RESTR
RESTORE_STACK;
}
+#ifndef OVERRIDE_DUAL_INNER_PROD
+static opus_val32 dual_inner_prod(opus_val16 *x, opus_val16 *y1, opus_val16 *y2, int N)
+{
+ int i;
+ opus_val32 xy=0;
+ for (i=0;i<N;i++)
+ {
+ xy = MAC16_16(xy, x[i], y1[i]);
+ xy = MAC16_16(xy, x[i], y2[i]);
+ }
+ return xy;
+}
+#endif
+
static const int second_check[16] = {0, 0, 3, 2, 3, 2, 5, 2, 3, 2, 3, 2, 5, 2, 3, 2};
opus_val16 remove_doubling(opus_val16 *x, int maxperiod, int minperiod,
int N, int *T0_, int prev_period, opus_val16 prev_gain)
@@ -470,12 +484,7 @@ opus_val16 remove_doubling(opus_val16 *x, int maxperiod, int minperiod,
{
T1b = (2*second_check[k]*T0+k)/(2*k);
}
- xy=0;
- for (i=0;i<N;i++)
- {
- xy = MAC16_16(xy, x[i], x[i-T1]);
- xy = MAC16_16(xy, x[i], x[i-T1b]);
- }
+ xy = dual_inner_prod(x, &x[-T1], &x[-T1b], N);
yy = yy_lookup[T1] + yy_lookup[T1b];
#ifdef FIXED_POINT
{