changeset 11709:6f9b4c452130 libavcodec

Optimize decoding high freqs. this is 10-20cpu cycles faster on duron (whole is about 50-60 cpu cylses) I wonder why gcc isnt doing this on its own ...
author michael
date Tue, 11 May 2010 21:10:55 +0000
parents 8d2e66ba12cf
children 8e3a3bc4fb24
files mpegaudiodec.c
diffstat 1 files changed, 12 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/mpegaudiodec.c	Tue May 11 20:33:48 2010 +0000
+++ b/mpegaudiodec.c	Tue May 11 21:10:55 2010 +0000
@@ -1535,14 +1535,22 @@
         g->sb_hybrid[s_index+3]= 0;
         while(code){
             static const int idxtab[16]={3,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0};
-            INTFLOAT v;
+            int v;
             int pos= s_index+idxtab[code];
             code ^= 8>>idxtab[code];
-            v = RENAME(exp_table)[ exponents[pos] ];
-//            v = RENAME(exp_table)[ (exponents[pos]&3) ] >> FFMIN(0 - (exponents[pos]>>2), 31);
-            if(get_bits1(&s->gb)) //FIXME try to flip the sign bit in int32_t, same above
+/* Following is a optimized code for
+            INTFLOAT v = RENAME(exp_table)[ exponents[pos] ];
+            if(get_bits1(&s->gb))
                 v = -v;
             g->sb_hybrid[pos] = v;
+*/
+#if CONFIG_FLOAT
+            v = AV_RN32A(RENAME(exp_table)+exponents[pos]) ^ (get_bits1(&s->gb)<<31);
+            AV_WN32A(g->sb_hybrid+pos, v);
+#else
+            v= -get_bits1(&s->gb);
+            g->sb_hybrid[pos] = (RENAME(exp_table)[ exponents[pos] ] ^ v) - v;
+#endif
         }
         s_index+=4;
     }