2005-04-16 16:20:36 -06:00
|
|
|
/* $Id: strlen.S,v 1.2 2001/06/29 14:07:15 gniibe Exp $
|
|
|
|
*
|
|
|
|
* "strlen" implementation of SuperH
|
|
|
|
*
|
|
|
|
* Copyright (C) 1999 Kaz Kojima
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* size_t strlen (const char *s) */
|
|
|
|
|
|
|
|
#include <linux/linkage.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
|
2010-05-23 14:02:06 -06:00
|
|
|
add #1,r2
|
2005-04-16 16:20:36 -06:00
|
|
|
|
|
|
|
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
|