summaryrefslogtreecommitdiff
path: root/newlib/libc/machine/m68k/strlen.c
diff options
context:
space:
mode:
Diffstat (limited to 'newlib/libc/machine/m68k/strlen.c')
-rw-r--r--newlib/libc/machine/m68k/strlen.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/newlib/libc/machine/m68k/strlen.c b/newlib/libc/machine/m68k/strlen.c
new file mode 100644
index 00000000000..589a697517b
--- /dev/null
+++ b/newlib/libc/machine/m68k/strlen.c
@@ -0,0 +1,35 @@
+/*
+ * C library strlen routine
+ *
+ * This routine has been optimized for the CPU32+.
+ * It should run on all 68k machines.
+ *
+ * W. Eric Norum
+ * Saskatchewan Accelerator Laboratory
+ * University of Saskatchewan
+ * Saskatoon, Saskatchewan, CANADA
+ * eric@skatter.usask.ca
+ */
+
+#include <string.h>
+
+/*
+ * Test bytes using CPU32+ loop mode if possible.
+ */
+size_t
+strlen (const char *str)
+{
+ unsigned int n = ~0;
+ const char *cp = str;
+
+ asm volatile ("1:\n"
+ "\ttst.b (%0)+\n"
+#if defined(__mcpu32__)
+ "\tdbeq %1,1b\n"
+#endif
+ "\tbne.b 1b\n" :
+ "=a" (cp), "=d" (n) :
+ "0" (cp), "1" (n) :
+ "cc");
+ return (cp - str) - 1;
+}