Commit | Line | Data |
---|---|---|
d2912cb1 | 1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
5210d1e6 VG |
2 | /* |
3 | * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com) | |
5210d1e6 VG |
4 | */ |
5 | ||
ec7ac6af | 6 | #include <linux/linkage.h> |
5210d1e6 | 7 | |
86effd0d | 8 | ENTRY_CFI(strlen) |
5210d1e6 VG |
9 | or r3,r0,7 |
10 | ld r2,[r3,-7] | |
11 | ld.a r6,[r3,-3] | |
12 | mov r4,0x01010101 | |
13 | ; uses long immediate | |
14 | #ifdef __LITTLE_ENDIAN__ | |
15 | asl_s r1,r0,3 | |
16 | btst_s r0,2 | |
17 | asl r7,r4,r1 | |
18 | ror r5,r4 | |
19 | sub r1,r2,r7 | |
20 | bic_s r1,r1,r2 | |
21 | mov.eq r7,r4 | |
22 | sub r12,r6,r7 | |
23 | bic r12,r12,r6 | |
24 | or.eq r12,r12,r1 | |
25 | and r12,r12,r5 | |
26 | brne r12,0,.Learly_end | |
27 | #else /* BIG ENDIAN */ | |
28 | ror r5,r4 | |
29 | btst_s r0,2 | |
30 | mov_s r1,31 | |
31 | sub3 r7,r1,r0 | |
32 | sub r1,r2,r4 | |
33 | bic_s r1,r1,r2 | |
34 | bmsk r1,r1,r7 | |
35 | sub r12,r6,r4 | |
36 | bic r12,r12,r6 | |
37 | bmsk.ne r12,r12,r7 | |
38 | or.eq r12,r12,r1 | |
39 | and r12,r12,r5 | |
40 | brne r12,0,.Learly_end | |
41 | #endif /* ENDIAN */ | |
42 | ||
43 | .Loop: | |
44 | ld_s r2,[r3,4] | |
45 | ld.a r6,[r3,8] | |
46 | ; stall for load result | |
47 | sub r1,r2,r4 | |
48 | bic_s r1,r1,r2 | |
49 | sub r12,r6,r4 | |
50 | bic r12,r12,r6 | |
51 | or r12,r12,r1 | |
52 | and r12,r12,r5 | |
53 | breq r12,0,.Loop | |
54 | .Lend: | |
55 | and.f r1,r1,r5 | |
56 | sub.ne r3,r3,4 | |
57 | mov.eq r1,r12 | |
58 | #ifdef __LITTLE_ENDIAN__ | |
59 | sub_s r2,r1,1 | |
60 | bic_s r2,r2,r1 | |
61 | norm r1,r2 | |
62 | sub_s r0,r0,3 | |
63 | lsr_s r1,r1,3 | |
64 | sub r0,r3,r0 | |
65 | j_s.d [blink] | |
66 | sub r0,r0,r1 | |
67 | #else /* BIG ENDIAN */ | |
68 | lsr_s r1,r1,7 | |
69 | mov.eq r2,r6 | |
70 | bic_s r1,r1,r2 | |
71 | norm r1,r1 | |
72 | sub r0,r3,r0 | |
73 | lsr_s r1,r1,3 | |
74 | j_s.d [blink] | |
75 | add r0,r0,r1 | |
76 | #endif /* ENDIAN */ | |
77 | .Learly_end: | |
78 | b.d .Lend | |
79 | sub_s.ne r1,r1,r1 | |
86effd0d | 80 | END_CFI(strlen) |