| ! Entry: arg0: string start address |
| ! Exit: result: length |
| ! |
| ! Copyright 2002 SuperH Ltd. |
| |
| #include "asm.h" |
| |
| ENTRY(strlen) |
| |
| #if __SHMEDIA__ |
| |
| ldlo.q r2,0,r3 |
| ptabs/l r18,tr0 |
| pta/l loop,tr1 |
| andi r2,-8,r0 |
| shlli r2,3,r1 |
| mcmpeq.b r3,r63,r3 |
| SHHI r3,r1,r4 |
| beqi/u r4,0,tr1 // loop |
| #ifdef __LITTLE_ENDIAN__ |
| movi -1,r2 |
| addi r3,-1,r4 |
| msad.ubq r3,r4,r2 |
| #else |
| shlri r3,1,r3 |
| nsb r3,r3 |
| shlri r3,3,r2 |
| #endif |
| blink tr0,r63 |
| |
| loop: |
| ldlo.q r0,8,r3 |
| addi r0,8,r0 |
| ldlo.q r0,8,r63 |
| mcmpeq.b r3,r63,r3 |
| beqi/l r3,0,tr1 // loop |
| sub r0,r2,r2 |
| #ifdef __LITTLE_ENDIAN__ |
| addi r3,-1,r4 |
| addi r2,-1,r2 |
| msad.ubq r3,r4,r2 |
| #else |
| shlri r3,1,r3 |
| nsb r3,r3 |
| shlri r3,3,r3 |
| add r2,r3,r2 |
| #endif |
| blink tr0,r63 |
| |
| #else /* ! __SHMEDIA__, i.e. SH 1..4 / SHcompact */ |
| |
| #ifdef __SH5__ |
| #define STR_INIT r2 |
| #define STR_ORIG r0 |
| #define STR_COPY STR_ORIG |
| #define MASK r1 |
| #define TMP r3 |
| #define RESULT r2 |
| ! r0,r1,r3: clobbered |
| #else |
| #define STR_INIT r4 |
| #define STR_ORIG STR_INIT |
| #define STR_COPY STR |
| #define MASK r1 |
| #define TMP r3 |
| #define RESULT r0 |
| ! r1,r3: clobbered |
| #endif |
| #define STR RESULT |
| |
| mov #3,MASK |
| and STR_INIT,MASK |
| tst MASK,MASK |
| SL(bf, L_char_loop, mov STR_INIT, STR_COPY) |
| L_word_loop: |
| mov.l @STR+,TMP |
| cmp/str MASK,TMP |
| bf L_word_loop |
| add #-4,STR |
| L_char_loop: |
| mov.b @STR+,TMP |
| tst TMP,TMP |
| bf L_char_loop |
| add #-1,STR |
| rts |
| sub STR_ORIG,STR |
| #endif /* ! __SHMEDIA__ */ |