summaryrefslogtreecommitdiff
path: root/apps/plugins/lib/grey_coldfire.S
diff options
context:
space:
mode:
authorJens Arnold <amiconn@rockbox.org>2008-03-02 17:05:00 +0000
committerJens Arnold <amiconn@rockbox.org>2008-03-02 17:05:00 +0000
commit52e1f815994413aa6068b13367ca0d04d9246182 (patch)
treeebae13e1b8e1931eac2faf7920ccbd6d4f0690d1 /apps/plugins/lib/grey_coldfire.S
parent1509faf618641a5dd1e8b33e0c1617dc521aa27c (diff)
downloadrockbox-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-xapps/plugins/lib/grey_coldfire.S128
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