From 07b7877809e27fed9f11eeb8d6ed92a369c38225 Mon Sep 17 00:00:00 2001 From: Nils Wallménius Date: Mon, 25 Jun 2007 20:21:37 +0000 Subject: 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 --- firmware/SOURCES | 2 +- firmware/target/coldfire/strlen-coldfire.S | 40 ++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 firmware/target/coldfire/strlen-coldfire.S diff --git a/firmware/SOURCES b/firmware/SOURCES index 2b948e7df4..c642196d5c 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 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 + -- cgit v1.2.3