summaryrefslogtreecommitdiff
path: root/apps/codecs/demac/libdemac/predictor-cf.S
diff options
context:
space:
mode:
authorJens Arnold <amiconn@rockbox.org>2008-11-24 18:40:49 +0000
committerJens Arnold <amiconn@rockbox.org>2008-11-24 18:40:49 +0000
commit3761c0108cbfc6f88c4bf43fc13a38a2f7db0d6f (patch)
treea064992dc69635d60e7bc1cb106fc43c6a4e3a40 /apps/codecs/demac/libdemac/predictor-cf.S
parent66c0cf2eb17158eec9d0cd2553481a2caf86e611 (diff)
downloadrockbox-3761c0108cbfc6f88c4bf43fc13a38a2f7db0d6f.tar.gz
rockbox-3761c0108cbfc6f88c4bf43fc13a38a2f7db0d6f.zip
Branch optimisation in both C (giving hints to gcc - verified using -fprofile-arcs and gcov) and asm files. Biggest effect on coldfire (-c1000: +8%, -c2000: +5%), but ARM also profits a bit (less than 1% on ARM7TDMI, around 1% on ARM1136).
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@19199 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/codecs/demac/libdemac/predictor-cf.S')
-rw-r--r--apps/codecs/demac/libdemac/predictor-cf.S46
1 files changed, 20 insertions, 26 deletions
diff --git a/apps/codecs/demac/libdemac/predictor-cf.S b/apps/codecs/demac/libdemac/predictor-cf.S
index b12d0932b0..0a1ffe9ead 100644
--- a/apps/codecs/demac/libdemac/predictor-cf.S
+++ b/apps/codecs/demac/libdemac/predictor-cf.S
@@ -486,10 +486,18 @@ predictor_decode_stereo:
486 | %a3 = &p->historybuffer[PREDICTOR_HISTORY_SIZE] 486 | %a3 = &p->historybuffer[PREDICTOR_HISTORY_SIZE]
487 487
488 cmp.l %a3, %a5 488 cmp.l %a3, %a5
489 bne.s .endofloop 489 beq.s .move_hist | The history buffer is full, we need to do a memmove
490 490
491 | The history buffer is full, we need to do a memmove: 491 subq.l #1, (8,%sp) | decrease loop count
492 bne.w .loop
492 493
494.done:
495 move.l %a5, (%a6) | Save value of p->buf
496 movem.l (3*4,%sp), %d2-%d7/%a2-%a6
497 lea.l (14*4,%sp), %sp
498 rts
499
500.move_hist:
493 lea.l (historybuffer,%a6), %a3 501 lea.l (historybuffer,%a6), %a3
494 502
495 | dest = %a3 (p->historybuffer) 503 | dest = %a3 (p->historybuffer)
@@ -497,33 +505,19 @@ predictor_decode_stereo:
497 | n = 200 505 | n = 200
498 506
499 movem.l (%a5), %d0-%d7/%a0-%a1 | 40 bytes 507 movem.l (%a5), %d0-%d7/%a0-%a1 | 40 bytes
500 lea.l (40,%a5), %a5
501 movem.l %d0-%d7/%a0-%a1, (%a3) 508 movem.l %d0-%d7/%a0-%a1, (%a3)
502 lea.l (40,%a3), %a3 509 movem.l (40,%a5), %d0-%d7/%a0-%a1 | 40 bytes
503 movem.l (%a5), %d0-%d7/%a0-%a1 | 40 bytes 510 movem.l %d0-%d7/%a0-%a1, (40,%a3)
504 lea.l (40,%a5), %a5 511 movem.l (80,%a5), %d0-%d7/%a0-%a1 | 40 bytes
505 movem.l %d0-%d7/%a0-%a1, (%a3) 512 movem.l %d0-%d7/%a0-%a1, (80,%a3)
506 lea.l (40,%a3), %a3 513 movem.l (120,%a5), %d0-%d7/%a0-%a1 | 40 bytes
507 movem.l (%a5), %d0-%d7/%a0-%a1 | 40 bytes 514 movem.l %d0-%d7/%a0-%a1, (120,%a3)
508 lea.l (40,%a5), %a5 515 movem.l (160,%a5), %d0-%d7/%a0-%a1 | 40 bytes
509 movem.l %d0-%d7/%a0-%a1, (%a3) 516 movem.l %d0-%d7/%a0-%a1, (160,%a3)
510 lea.l (40,%a3), %a3
511 movem.l (%a5), %d0-%d7/%a0-%a1 | 40 bytes
512 lea.l (40,%a5), %a5
513 movem.l %d0-%d7/%a0-%a1, (%a3)
514 lea.l (40,%a3), %a3
515 movem.l (%a5), %d0-%d7/%a0-%a1 | 40 bytes
516 lea.l (40,%a5), %a5
517 movem.l %d0-%d7/%a0-%a1, (%a3)
518 lea.l (40,%a3), %a3
519 517
520 lea.l (historybuffer,%a6), %a5 | p->buf = &p->historybuffer[0] 518 move.l %a3, %a5 | p->buf = &p->historybuffer[0]
521 519
522.endofloop:
523 subq.l #1, (8,%sp) | decrease loop count 520 subq.l #1, (8,%sp) | decrease loop count
524 bne.w .loop 521 bne.w .loop
525 522
526 move.l %a5, (%a6) | Save value of p->buf 523 bra.s .done
527 movem.l (3*4,%sp), %d2-%d7/%a2-%a6
528 lea.l (14*4,%sp), %sp
529 rts