summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNils Wallménius <nils@rockbox.org>2007-06-25 20:21:37 +0000
committerNils Wallménius <nils@rockbox.org>2007-06-25 20:21:37 +0000
commit07b7877809e27fed9f11eeb8d6ed92a369c38225 (patch)
tree22e06f206ab63908d31cc56819ed4fa4d54600b5
parentdfa4e6406d7e4793b2bae189eb2fc1cab4506f6f (diff)
downloadrockbox-07b7877809e27fed9f11eeb8d6ed92a369c38225.zip
rockbox-07b7877809e27fed9f11eeb8d6ed92a369c38225.tar.gz
rockbox-07b7877809e27fed9f11eeb8d6ed92a369c38225.tar.bz2
rockbox-07b7877809e27fed9f11eeb8d6ed92a369c38225.tar.xz
Simple coldfire assembly strlen() function, 20-25% faster than the c
version. Move function out of iram as it turns out that makes it slightly faster. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@13713 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--firmware/SOURCES2
-rw-r--r--firmware/target/coldfire/strlen-coldfire.S40
2 files changed, 41 insertions, 1 deletions
diff --git a/firmware/SOURCES b/firmware/SOURCES
index 2b948e7..c642196 100644
--- a/firmware/SOURCES
+++ b/firmware/SOURCES
@@ -250,13 +250,13 @@ target/sh/system-sh.c
#elif defined(CPU_COLDFIRE)
-common/strlen.c
#ifndef SIMULATOR
target/coldfire/crt0.S
target/coldfire/memcpy-coldfire.S
target/coldfire/memmove-coldfire.S
target/coldfire/memset-coldfire.S
target/coldfire/memswap128-coldfire.S
+target/coldfire/strlen-coldfire.S
#if defined(HAVE_LCD_COLOR) \
|| defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_PIXELFORMAT == VERTICAL_INTERLEAVED)
target/coldfire/memset16-coldfire.S
diff --git a/firmware/target/coldfire/strlen-coldfire.S b/firmware/target/coldfire/strlen-coldfire.S
new file mode 100644
index 0000000..9be42a5
--- /dev/null
+++ b/firmware/target/coldfire/strlen-coldfire.S
@@ -0,0 +1,40 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id $
+ *
+ * Copyright (C) 2007 Nils Wallménius
+ *
+ * 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.
+ *
+ ****************************************************************************/
+
+/* size_t strlen(const char *str) */
+
+ .section .text,"ax",@progbits
+ .align 2
+ .globl strlen
+ .type strlen, @function
+
+strlen:
+ move.l 4(%sp),%a0 /* %a0 = *str */
+ move.l %a0,%d0 /* %d0 = start address */
+
+ 1:
+ tst.b (%a0)+ /* test if %a0 == 0 and increment */
+ bne.b 1b /* if the test was false repeat */
+
+ sub.l %d0,%a0 /* how many times did we repeat? */
+ move.l %a0,%d0
+ subq.l #1,%d0 /* %d0 is 1 too large due to the last increment */
+ rts
+ .size strlen, .-strlen
+