diff options
author | Nils Wallménius <nils@rockbox.org> | 2007-06-25 20:21:37 +0000 |
---|---|---|
committer | Nils Wallménius <nils@rockbox.org> | 2007-06-25 20:21:37 +0000 |
commit | 07b7877809e27fed9f11eeb8d6ed92a369c38225 (patch) | |
tree | 22e06f206ab63908d31cc56819ed4fa4d54600b5 /firmware/target/coldfire | |
parent | dfa4e6406d7e4793b2bae189eb2fc1cab4506f6f (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.S | 40 |
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 + |