shithub: opus

Download patch

ref: e806d6a74129c70d2849cf621968f905149c21e1
parent: c7bbc3e31fa67da78a41868576672ef01f888ae1
author: Jean-Marc Valin <jmvalin@jmvalin.ca>
date: Sat Aug 6 11:49:55 EDT 2016

Making signx[] an int in alg_quant() and removes unnecessary sign copying

No measurable speed change.

--- a/celt/vq.c
+++ b/celt/vq.c
@@ -163,7 +163,7 @@
 {
    VARDECL(celt_norm, y);
    VARDECL(int, iy);
-   VARDECL(opus_val16, signx);
+   VARDECL(int, signx);
    int i, j;
    int pulsesLeft;
    opus_val32 sum;
@@ -177,7 +177,7 @@
 
    ALLOC(y, N, celt_norm);
    ALLOC(iy, N, int);
-   ALLOC(signx, N, opus_val16);
+   ALLOC(signx, N, int);
 
    exp_rotation(X, N, 1, B, K, spread);
 
@@ -184,9 +184,8 @@
    /* Get rid of the sign */
    sum = 0;
    j=0; do {
-      /* OPT: Make sure the following two lines result in conditional moves
-         rather than branches. */
-      signx[j] = X[j]>0 ? 1 : -1;
+      signx[j] = X[j]<0;
+      /* OPT: Make sure the compiler doesn't use a branch on ABS16(). */
       X[j] = ABS16(X[j]);
       iy[j] = 0;
       y[j] = 0;
@@ -318,10 +317,10 @@
    /* Put the original sign back */
    j=0;
    do {
-      X[j] = MULT16_16(signx[j],X[j]);
-      /* OPT: Make sure your compiler uses a conditional move here rather than
-         a branch. */
-      iy[j] = signx[j] < 0 ? -iy[j] : iy[j];
+      /*iy[j] = signx[j] ? -iy[j] : iy[j];*/
+      /* OPT: The is more likely to be compiled without a branch than the code above
+         but has the same performance otherwise. */
+      iy[j] = (iy[j]^-signx[j]) + signx[j];
    } while (++j<N);
    encode_pulses(iy, N, K, enc);