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