shithub: opus

Download patch

ref: 09b53529280fd132438d24d39dd0f1614318abfd
parent: 416611cfa127df360d6902794b36e426477061a0
author: Jean-Marc Valin <[email protected]>
date: Fri Aug 5 20:06:48 EDT 2016

Getting gcc to use cmovs rather than branches in alg_quant()

Speeds up CELT encoding by around 5% on x86

--- a/celt/vq.c
+++ b/celt/vq.c
@@ -185,12 +185,10 @@
    /* Get rid of the sign */
    sum = 0;
    j=0; do {
-      if (X[j]>0)
-         signx[j]=1;
-      else {
-         signx[j]=-1;
-         X[j]=-X[j];
-      }
+      /* OPT: Make sure the following two lines result in conditional moves
+         rather than branches. */
+      signx[j] = X[j]>0 ? 1 : -1;
+      X[j] = ABS16(X[j]);
       iy[j] = 0;
       y[j] = 0;
    } while (++j<N);
@@ -306,8 +304,9 @@
    j=0;
    do {
       X[j] = MULT16_16(signx[j],X[j]);
-      if (signx[j] < 0)
-         iy[j] = -iy[j];
+      /* OPT: Make sure your compiler uses a conditional move here rather than
+         a branch. */
+      iy[j] = signx[j] < 0 ? -iy[j] : iy[j];
    } while (++j<N);
    encode_pulses(iy, N, K, enc);