diff options
| author | Jens Arnold <amiconn@rockbox.org> | 2008-03-02 17:05:00 +0000 |
|---|---|---|
| committer | Jens Arnold <amiconn@rockbox.org> | 2008-03-02 17:05:00 +0000 |
| commit | 52e1f815994413aa6068b13367ca0d04d9246182 (patch) | |
| tree | ebae13e1b8e1931eac2faf7920ccbd6d4f0690d1 /apps/plugins/lib/grey_coldfire.S | |
| parent | 1509faf618641a5dd1e8b33e0c1617dc521aa27c (diff) | |
| download | rockbox-52e1f815994413aa6068b13367ca0d04d9246182.zip rockbox-52e1f815994413aa6068b13367ca0d04d9246182.tar.gz rockbox-52e1f815994413aa6068b13367ca0d04d9246182.tar.bz2 rockbox-52e1f815994413aa6068b13367ca0d04d9246182.tar.xz | |
Greyscale library: Assembler optimised update for coldfire, ~73% speedup when using IRAM, ~35% speedup without IRAM. Slight optimisation for other targets as well.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@16482 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/plugins/lib/grey_coldfire.S')
| -rwxr-xr-x | apps/plugins/lib/grey_coldfire.S | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/apps/plugins/lib/grey_coldfire.S b/apps/plugins/lib/grey_coldfire.S new file mode 100755 index 0000000..cf66ca6 --- /dev/null +++ b/apps/plugins/lib/grey_coldfire.S @@ -0,0 +1,128 @@ +/*************************************************************************** +* __________ __ ___. +* Open \______ \ ____ ____ | | _\_ |__ _______ ___ +* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / +* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < +* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ +* \/ \/ \/ \/ \/ +* $Id: grey_draw.c 16080 2008-01-13 18:39:09Z amiconn $ +* +* New greyscale framework +* Coldfire assembler routines +* +* This is a generic framework to display 129 shades of grey on low-depth +* bitmap LCDs (Archos b&w, Iriver & Ipod 4-grey) within plugins. +* +* Copyright (C) 2008 Jens Arnold +* +* All files in this archive are subject to the GNU General Public License. +* See the file COPYING in the source tree root for full license agreement. +* +* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +* KIND, either express or implied. +* +****************************************************************************/ + +#include "config.h" +/* Plugins should not normally do this, but we need to check a macro, and + * plugin.h would confuse the assembler. */ + + .text + .global _grey_line1 + .type _grey_line1, @function + +#if (LCD_PIXELFORMAT == VERTICAL_PACKING) && (LCD_DEPTH == 2) + +/**************************************************************************** + * void _grey_line1(int width, + * unsigned char *dst, + * const unsigned char *src, + * const unsigned char *lut); + */ + +_grey_line1: + lea.l (-2*4, %sp), %sp + movem.l %d2/%a2, (%sp) + movem.l (2*4+4, %sp), %d2/%a0-%a2 + clr.l %d0 + + move.l %a1, %d1 + and.l #1, %d1 + beq.s .p1_h_end + + move.b (%a1)+, %d0 + move.b (%d0.l, %a2), (%a0) + addq.l #4, %a0 + subq.l #1, %d2 +.p1_h_end: + + cmp.l #2, %d2 + blo.s .p2_t_end + move.l %a1, %d1 + and.l #2, %d1 + beq.s .p2_h_end + + move.w (%a1)+, %d1 + move.w %d1, %d0 + lsr.l #8, %d0 + move.b (%d0.l, %a2), (%a0) + addq.l #4, %a0 + move.b %d1, %d0 + move.b (%d0.l, %a2), (%a0) + addq.l #4, %a0 + subq.l #2, %d2 +.p2_h_end: + + subq.l #4, %d2 + blo.s .p4_end + +.p4_loop: + move.l (%a1)+, %d1 + swap %d1 + move.w %d1, %d0 + lsr.l #8, %d0 + move.b (%d0.l, %a2), (%a0) + addq.l #4, %a0 + move.b %d1, %d0 + move.b (%d0.l, %a2), (%a0) + addq.l #4, %a0 + swap %d1 + move.w %d1, %d0 + lsr.l #8, %d0 + move.b (%d0.l, %a2), (%a0) + addq.l #4, %a0 + move.b %d1, %d0 + move.b (%d0.l, %a2), (%a0) + addq.l #4, %a0 + subq.l #4, %d2 + bhs.s .p4_loop + +.p4_end: + addq.l #4, %d2 + cmp.l #2, %d2 + blo.s .p2_t_end + + move.w (%a1)+, %d1 + move.w %d1, %d0 + lsr.l #8, %d0 + move.b (%d0.l, %a2), (%a0) + addq.l #4, %a0 + move.b %d1, %d0 + move.b (%d0.l, %a2), (%a0) + addq.l #4, %a0 + subq.l #2, %d2 +.p2_t_end: + + tst.l %d2 + beq.s .p1_t_end + + move.b (%a1)+, %d0 + move.b (%d0.l, %a2), (%a0) +.p1_t_end: + + movem.l (%sp), %d2/%a2 + lea.l (2*4, %sp), %sp + rts + .size _grey_line1, . - _grey_line1 + +#endif |