summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorcognet <cognet@FreeBSD.org>2005-10-03 14:21:49 +0000
committercognet <cognet@FreeBSD.org>2005-10-03 14:21:49 +0000
commitc1683d924885fc494086ce69137ceb379d89bb9c (patch)
treeecb38c9e6837c9c2f15aa56be5bdd96b31849685 /lib
parent6acbf223159bb428ad260ae6abb9741273c48266 (diff)
downloadFreeBSD-src-c1683d924885fc494086ce69137ceb379d89bb9c.zip
FreeBSD-src-c1683d924885fc494086ce69137ceb379d89bb9c.tar.gz
Add an asm version of strlen() for arm (how useful).
Diffstat (limited to 'lib')
-rw-r--r--lib/libc/arm/string/Makefile.inc2
-rw-r--r--lib/libc/arm/string/strlen.S77
2 files changed, 78 insertions, 1 deletions
diff --git a/lib/libc/arm/string/Makefile.inc b/lib/libc/arm/string/Makefile.inc
index 7b73e58..6658ce7 100644
--- a/lib/libc/arm/string/Makefile.inc
+++ b/lib/libc/arm/string/Makefile.inc
@@ -3,5 +3,5 @@
MDSRCS+=bcmp.c bcopy.S bzero.S ffs.S index.c memchr.c memcmp.S memcpy.S \
memmove.S memset.S rindex.c strcat.c strchr.c strcmp.S strcpy.c \
- strlen.c strncmp.S strrchr.c swab.c wcschr.c wcscmp.c wcslen.c \
+ strlen.S strncmp.S strrchr.c swab.c wcschr.c wcscmp.c wcslen.c \
wmemchr.c
diff --git a/lib/libc/arm/string/strlen.S b/lib/libc/arm/string/strlen.S
new file mode 100644
index 0000000..fa503e9
--- /dev/null
+++ b/lib/libc/arm/string/strlen.S
@@ -0,0 +1,77 @@
+/*-
+ * Copyright (c) 2005 Olivier Houchard
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <machine/asm.h>
+__FBSDID("$FreeBSD$");
+
+ENTRY(strlen)
+ mov r1, #0
+ /* Check that the pointer is aligned on 32 bits. */
+ ands r3, r0, #3
+ beq .Loop
+ sub r0, r0, r3
+ ldr r2, [r0]
+ add r0, r0, #4
+ cmp r3, #2
+ blt .Ldo_3
+ bgt .Ldo_1
+ /* So that the N bit is set. */
+ cmp r3, #0
+ b .Ldo_2
+
+.Loop:
+ ldr r2, [r0]
+ add r0, r0, #4
+#ifndef __ARMEB__
+ ands r3, r2, #0x000000ff
+#else
+ ands r3, r2, #0xff000000
+#endif
+ addne r1, r1, #1
+.Ldo_3:
+#ifndef __ARMEB__
+ andnes r3, r2, #0x0000ff00
+#else
+ andnes r3, r2, #0x00ff0000
+#endif
+ addne r1, r1, #1
+.Ldo_2:
+#ifndef __ARMEB__
+ andnes r3, r2, #0x00ff0000
+#else
+ andnes r3, r2, #0x0000ff00
+#endif
+ addne r1, r1, #1
+.Ldo_1:
+#ifndef __ARMEB__
+ andnes r3, r2, #0xff000000
+#else
+ andnes r3, r2, #0x000000ff
+#endif
+ addne r1, r1, #1
+ bne .Loop
+.Lexit:
+ mov r0, r1
+ RET
OpenPOWER on IntegriCloud