diff options
| author | Giuseppe Cavallaro <peppe.cavallaro@st.com> | 2009-06-18 10:40:32 +0200 |
|---|---|---|
| committer | Carmelo Amoroso <carmelo.amoroso@st.com> | 2009-09-27 09:59:02 +0200 |
| commit | b7c4dd7d71f97279f325a4e5aa387c84e8ca0485 (patch) | |
| tree | 5c22954779b0a62e1397c1602bc75d17bc2a2cdf /libc | |
| parent | 905c5ab688ad9a5cff7e014884ed6e995cee51ca (diff) | |
| download | uClibc-alpine-b7c4dd7d71f97279f325a4e5aa387c84e8ca0485.tar.bz2 uClibc-alpine-b7c4dd7d71f97279f325a4e5aa387c84e8ca0485.tar.xz | |
sh: add assembly strlen from Kernel
Faster assembly implementation of strlen taken from Linux kernel.
Adapted to uClibc.
Signed-off-by: Giuseppe Cavallaro <peppe.cavallaro@st.com>
Signed-off-by: Carmelo Amoroso <carmelo.amoroso@st.com>
Diffstat (limited to 'libc')
| -rw-r--r-- | libc/string/sh/strlen.S | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/libc/string/sh/strlen.S b/libc/string/sh/strlen.S new file mode 100644 index 000000000..1ccecc17b --- /dev/null +++ b/libc/string/sh/strlen.S @@ -0,0 +1,75 @@ +/* $Id: strlen.S,v 1.2 2001/06/29 14:07:15 gniibe Exp $ + * + * "strlen" implementation of SuperH + * + * Copyright (C) 1999 Kaz Kojima + * + * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. + */ + +/* size_t strlen (const char *s) */ + +#include <sysdep.h> +#include <endian.h> + +ENTRY(strlen) + mov r4,r0 + and #3,r0 + tst r0,r0 + bt/s 1f + mov #0,r2 + + add #-1,r0 + shll2 r0 + shll r0 + braf r0 + nop + + mov.b @r4+,r1 + tst r1,r1 + bt 8f + add #1,r2 + + mov.b @r4+,r1 + tst r1,r1 + bt 8f + add #1,r2 + + mov.b @r4+,r1 + tst r1,r1 + bt 8f + add #1,r2 + +1: + mov #0,r3 +2: + mov.l @r4+,r1 + cmp/str r3,r1 + bf/s 2b + add #4,r2 + + add #-4,r2 +#ifndef __LITTLE_ENDIAN__ + swap.b r1,r1 + swap.w r1,r1 + swap.b r1,r1 +#endif + extu.b r1,r0 + tst r0,r0 + bt/s 8f + shlr8 r1 + add #1,r2 + extu.b r1,r0 + tst r0,r0 + bt/s 8f + shlr8 r1 + add #1,r2 + extu.b r1,r0 + tst r0,r0 + bt 8f + add #1,r2 +8: + rts + mov r2,r0 +END(strlen) +libc_hidden_def (strlen) |
