Remove redundant test in od_ec_decode_bool_q15().
authorNathan E. Egge <negge@dgql.org>
Fri, 9 Sep 2016 18:21:56 +0000 (14:21 -0400)
committerNathan E. Egge <negge@dgql.org>
Fri, 9 Sep 2016 19:37:44 +0000 (15:37 -0400)
Using a test that decodes 100M random binary symbols, making this change
 produced a speed up of 8.81% with gcc-4.9.3 and 3.71% with clang-3.7.1,
 both compiled with -O2.

src/entdec.c

index 00bf119..c6b9484 100644 (file)
@@ -230,6 +230,7 @@ int od_ec_decode_bool_q15_(od_ec_dec *dec, unsigned fz OD_ACC_STR) {
   od_ec_window dif;
   od_ec_window vw;
   unsigned r;
+  unsigned r_new;
   unsigned v;
   int ret;
   OD_ASSERT(0 < fz);
@@ -240,10 +241,14 @@ int od_ec_decode_bool_q15_(od_ec_dec *dec, unsigned fz OD_ACC_STR) {
   OD_ASSERT(32768U <= r);
   v = fz * (uint32_t)r >> 15;
   vw = (od_ec_window)v << (OD_EC_WINDOW_SIZE - 16);
-  ret = dif >= vw;
-  if (ret) dif -= vw;
-  r = ret ? r - v : v;
-  return od_ec_dec_normalize(dec, dif, r, ret, acc_str);
+  ret = 0;
+  r_new = v;
+  if (dif >= vw) {
+    r_new = r - v;
+    dif -= vw;
+    ret = 1;
+  }
+  return od_ec_dec_normalize(dec, dif, r_new, ret, acc_str);
 }
 
 /*Decodes a symbol given a cumulative distribution function (CDF) table.