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