summaryrefslogtreecommitdiff
path: root/apps/codecs/Tremor/floor1.c
diff options
context:
space:
mode:
authorMagnus Holmgren <magnushol@gmail.com>2005-12-28 20:42:24 +0000
committerMagnus Holmgren <magnushol@gmail.com>2005-12-28 20:42:24 +0000
commit41cea75095e6dcd17cff2f57c07553c0ec2a298e (patch)
tree4acd38bc18a591b53526ef4e9948b360e69031c7 /apps/codecs/Tremor/floor1.c
parent074999ded3b7f41ef25167b06b0c618306ed9d5e (diff)
downloadrockbox-41cea75095e6dcd17cff2f57c07553c0ec2a298e.tar.gz
rockbox-41cea75095e6dcd17cff2f57c07553c0ec2a298e.zip
Vorbis optimizations from Brandon Low (part of patch 1387611). Reduces cpu boost ratio on a test track by about 6 percentage points. Also fixes broken simulator playback caused by my previous Tremor commit.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@8291 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/codecs/Tremor/floor1.c')
-rw-r--r--apps/codecs/Tremor/floor1.c34
1 files changed, 19 insertions, 15 deletions
diff --git a/apps/codecs/Tremor/floor1.c b/apps/codecs/Tremor/floor1.c
index e01b08cd11..14515c27e6 100644
--- a/apps/codecs/Tremor/floor1.c
+++ b/apps/codecs/Tremor/floor1.c
@@ -197,17 +197,19 @@ static vorbis_look_floor *floor1_look(vorbis_dsp_state *vd,vorbis_info_mode *mi,
197static int render_point(int x0,int x1,int y0,int y1,int x){ 197static int render_point(int x0,int x1,int y0,int y1,int x){
198 y0&=0x7fff; /* mask off flag */ 198 y0&=0x7fff; /* mask off flag */
199 y1&=0x7fff; 199 y1&=0x7fff;
200 200#if defined(CPU_COLDFIRE) && !defined(SIMULATOR)
201 { 201 asm volatile ("sub.l %[x0],%[x];"
202 int dy=y1-y0; 202 "sub.l %[y0],%[y1];"
203 int adx=x1-x0; 203 "sub.l %[x0],%[x1];"
204 int ady=abs(dy); 204 "muls.l %[y1],%[x];"
205 int err=ady*(x-x0); 205 "divs.l %[x1],%[x];"
206 206 "add.l %[y0],%[x];"
207 int off=err/adx; 207 : [x] "+d" (x), [x1] "+d" (x1), [y1] "+d" (y1)
208 if(dy<0)return(y0-off); 208 : [x0] "r" (x0), [y0] "r" (y0) );
209 return(y0+off); 209 return x;
210 } 210#else
211 return y0+((y1-y0)*(x-x0))/(x1-x0);
212#endif
211} 213}
212 214
213#ifdef _LOW_ACCURACY_ 215#ifdef _LOW_ACCURACY_
@@ -217,7 +219,7 @@ static int render_point(int x0,int x1,int y0,int y1,int x){
217#endif 219#endif
218 220
219/* keep the floor lookup table in fast IRAM */ 221/* keep the floor lookup table in fast IRAM */
220static ogg_int32_t FLOOR_fromdB_LOOKUP[256] IDATA_ATTR = { 222static const ogg_int32_t FLOOR_fromdB_LOOKUP[256] ICONST_ATTR = {
221 XdB(0x000000e5), XdB(0x000000f4), XdB(0x00000103), XdB(0x00000114), 223 XdB(0x000000e5), XdB(0x000000f4), XdB(0x00000103), XdB(0x00000114),
222 XdB(0x00000126), XdB(0x00000139), XdB(0x0000014e), XdB(0x00000163), 224 XdB(0x00000126), XdB(0x00000139), XdB(0x0000014e), XdB(0x00000163),
223 XdB(0x0000017a), XdB(0x00000193), XdB(0x000001ad), XdB(0x000001c9), 225 XdB(0x0000017a), XdB(0x00000193), XdB(0x000001ad), XdB(0x000001c9),
@@ -283,7 +285,7 @@ static ogg_int32_t FLOOR_fromdB_LOOKUP[256] IDATA_ATTR = {
283 XdB(0x52606733), XdB(0x57bad899), XdB(0x5d6e593a), XdB(0x6380b298), 285 XdB(0x52606733), XdB(0x57bad899), XdB(0x5d6e593a), XdB(0x6380b298),
284 XdB(0x69f80e9a), XdB(0x70dafda8), XdB(0x78307d76), XdB(0x7fffffff), 286 XdB(0x69f80e9a), XdB(0x70dafda8), XdB(0x78307d76), XdB(0x7fffffff),
285}; 287};
286 288
287static void render_line(int x0,register int x1,int y0,int y1,ogg_int32_t *d){ 289static void render_line(int x0,register int x1,int y0,int y1,ogg_int32_t *d){
288 int dy=y1-y0; 290 int dy=y1-y0;
289 register int x=x0; 291 register int x=x0;
@@ -310,6 +312,7 @@ static void render_line(int x0,register int x1,int y0,int y1,ogg_int32_t *d){
310 } 312 }
311} 313}
312 314
315static void *floor1_inverse1(vorbis_block *vb,vorbis_look_floor *in) ICODE_ATTR;
313static void *floor1_inverse1(vorbis_block *vb,vorbis_look_floor *in){ 316static void *floor1_inverse1(vorbis_block *vb,vorbis_look_floor *in){
314 vorbis_look_floor1 *look=(vorbis_look_floor1 *)in; 317 vorbis_look_floor1 *look=(vorbis_look_floor1 *)in;
315 vorbis_info_floor1 *info=look->vi; 318 vorbis_info_floor1 *info=look->vi;
@@ -387,7 +390,6 @@ static void *floor1_inverse1(vorbis_block *vb,vorbis_look_floor *in){
387 }else{ 390 }else{
388 fit_value[i]=predicted|0x8000; 391 fit_value[i]=predicted|0x8000;
389 } 392 }
390
391 } 393 }
392 394
393 return(fit_value); 395 return(fit_value);
@@ -397,6 +399,8 @@ static void *floor1_inverse1(vorbis_block *vb,vorbis_look_floor *in){
397} 399}
398 400
399static int floor1_inverse2(vorbis_block *vb,vorbis_look_floor *in,void *memo, 401static int floor1_inverse2(vorbis_block *vb,vorbis_look_floor *in,void *memo,
402 ogg_int32_t *out) ICODE_ATTR;
403static int floor1_inverse2(vorbis_block *vb,vorbis_look_floor *in,void *memo,
400 ogg_int32_t *out){ 404 ogg_int32_t *out){
401 vorbis_look_floor1 *look=(vorbis_look_floor1 *)in; 405 vorbis_look_floor1 *look=(vorbis_look_floor1 *)in;
402 vorbis_info_floor1 *info=look->vi; 406 vorbis_info_floor1 *info=look->vi;
@@ -433,7 +437,7 @@ static int floor1_inverse2(vorbis_block *vb,vorbis_look_floor *in,void *memo,
433} 437}
434 438
435/* export hooks */ 439/* export hooks */
436vorbis_func_floor floor1_exportbundle = { 440const vorbis_func_floor floor1_exportbundle ICONST_ATTR = {
437 &floor1_unpack,&floor1_look,&floor1_free_info, 441 &floor1_unpack,&floor1_look,&floor1_free_info,
438 &floor1_free_look,&floor1_inverse1,&floor1_inverse2 442 &floor1_free_look,&floor1_inverse1,&floor1_inverse2
439}; 443};