/* SPDX-License-Identifier: GPL-2.0 */ | |
/* $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 | |
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 |