From e806d6a74129c70d2849cf621968f905149c21e1 Mon Sep 17 00:00:00 2001 From: Jean-Marc Valin Date: Sat, 6 Aug 2016 15:49:55 -0400 Subject: Making signx[] an int in alg_quant() and removes unnecessary sign copying No measurable speed change. --- celt/vq.c | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) (limited to 'celt/vq.c') diff --git a/celt/vq.c b/celt/vq.c index b64e604e..e6895952 100644 --- a/celt/vq.c +++ b/celt/vq.c @@ -163,7 +163,7 @@ unsigned alg_quant(celt_norm *X, int N, int K, int spread, int B, ec_enc *enc, { VARDECL(celt_norm, y); VARDECL(int, iy); - VARDECL(opus_val16, signx); + VARDECL(int, signx); int i, j; int pulsesLeft; opus_val32 sum; @@ -177,16 +177,15 @@ unsigned alg_quant(celt_norm *X, int N, int K, int spread, int B, ec_enc *enc, 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); /* 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 @@ unsigned alg_quant(celt_norm *X, int N, int K, int spread, int B, ec_enc *enc, /* 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