/* $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)