summaryrefslogtreecommitdiff
path: root/firmware/target/coldfire
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 /firmware/target/coldfire
parentdfa4e6406d7e4793b2bae189eb2fc1cab4506f6f (diff)
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
Diffstat (limited to 'firmware/target/coldfire')
-rw-r--r--firmware/target/coldfire/strlen-coldfire.S40
1 files changed, 40 insertions, 0 deletions
diff --git a/firmware/target/coldfire/strlen-coldfire.S b/firmware/target/coldfire/strlen-coldfire.S
new file mode 100644
index 0000000000..9be42a5864
--- /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
+