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