From 6539b535ad08a13d654db3185d78a8f86a75f6a6 Mon Sep 17 00:00:00 2001 From: Michael Giacomelli Date: Sat, 18 Jul 2009 00:24:54 +0000 Subject: Optimize overlap_math by only doing shifting if theres gain, and moving the check for sign outside of the for loop. 3% speedup on PP5024. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@21940 a1c6a512-1295-4272-9138-f99709370657 --- apps/codecs/libcook/cook_fixpoint.h | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) (limited to 'apps') diff --git a/apps/codecs/libcook/cook_fixpoint.h b/apps/codecs/libcook/cook_fixpoint.h index c2ab9299c6..7e3db8563b 100644 --- a/apps/codecs/libcook/cook_fixpoint.h +++ b/apps/codecs/libcook/cook_fixpoint.h @@ -268,9 +268,20 @@ static inline void imlt_math(COOKContext *q, FIXP *in) static inline void overlap_math(COOKContext *q, int gain, FIXP buffer[]) { int i; - for(i=0 ; isamples_per_channel ; i++) { - q->mono_mdct_output[i] = - fixp_pow2(q->mono_mdct_output[i], gain) + buffer[i]; + if(LIKELY(gain == 0)){ + for(i=0 ; isamples_per_channel ; i++) { + q->mono_mdct_output[i] += buffer[i]; + } + + } else if (gain > 0){ + for(i=0 ; isamples_per_channel ; i++) { + q->mono_mdct_output[i] = (q->mono_mdct_output[i]<< gain) + buffer[i]; } + + } else { + for(i=0 ; isamples_per_channel ; i++) { + q->mono_mdct_output[i] = + (q->mono_mdct_output[i] >> -gain) + ((q->mono_mdct_output[i] >> (-gain-1)) & 1)+ buffer[i]; + } } } -- cgit v1.2.3