ref: 09b53529280fd132438d24d39dd0f1614318abfd
parent: 416611cfa127df360d6902794b36e426477061a0
author: Jean-Marc Valin <jmvalin@jmvalin.ca>
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);