1#include <picolibc.h> 2 3! Entry: arg0: string start address 4! Exit: result: length 5! 6/* Copyright 2002 SuperH Ltd. */ 7 8#include "asm.h" 9 10ENTRY(strlen) 11 12#if __SHMEDIA__ 13 14 ldlo.q r2,0,r3 15 ptabs/l r18,tr0 16 pta/l loop,tr1 17 andi r2,-8,r0 18 shlli r2,3,r1 19 mcmpeq.b r3,r63,r3 20 SHHI r3,r1,r4 21 beqi/u r4,0,tr1 // loop 22#ifdef __LITTLE_ENDIAN__ 23 movi -1,r2 24 addi r3,-1,r4 25 msad.ubq r3,r4,r2 26#else 27 shlri r3,1,r3 28 nsb r3,r3 29 shlri r3,3,r2 30#endif 31 blink tr0,r63 32 33loop: 34 ldlo.q r0,8,r3 35 addi r0,8,r0 36 ldlo.q r0,8,r63 37 mcmpeq.b r3,r63,r3 38 beqi/l r3,0,tr1 // loop 39 sub r0,r2,r2 40#ifdef __LITTLE_ENDIAN__ 41 addi r3,-1,r4 42 addi r2,-1,r2 43 msad.ubq r3,r4,r2 44#else 45 shlri r3,1,r3 46 nsb r3,r3 47 shlri r3,3,r3 48 add r2,r3,r2 49#endif 50 blink tr0,r63 51 52#else /* ! __SHMEDIA__, i.e. SH 1..4 / SHcompact */ 53 54#ifdef __SH5__ 55#define STR_INIT r2 56#define STR_ORIG r0 57#define STR_COPY STR_ORIG 58#define MASK r1 59#define TMP r3 60#define RESULT r2 61! r0,r1,r3: clobbered 62#else 63#define STR_INIT r4 64#define STR_ORIG STR_INIT 65#define STR_COPY STR 66#define MASK r1 67#define TMP r3 68#define RESULT r0 69! r1,r3: clobbered 70#endif 71#define STR RESULT 72 73 mov #3,MASK 74 and STR_INIT,MASK 75 tst MASK,MASK 76 SL(bf, L_char_loop, mov STR_INIT, STR_COPY) 77L_word_loop: 78 mov.l @STR+,TMP 79 cmp/str MASK,TMP 80 bf L_word_loop 81 add #-4,STR 82L_char_loop: 83 mov.b @STR+,TMP 84 tst TMP,TMP 85 bf L_char_loop 86 add #-1,STR 87 rts 88 sub STR_ORIG,STR 89#endif /* ! __SHMEDIA__ */ 90