diff options
Diffstat (limited to 'newlib/libc/machine/m68k/strlen.c')
-rw-r--r-- | newlib/libc/machine/m68k/strlen.c | 35 |
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 000000000..589a69751 --- /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; +} |