b.liu | e958203 | 2025-04-17 19:18:16 +0800 | [diff] [blame^] | 1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
2 | /* | ||||
3 | * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com) | ||||
4 | */ | ||||
5 | |||||
6 | #include <linux/linkage.h> | ||||
7 | |||||
8 | ENTRY_CFI(strlen) | ||||
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 | ||||
80 | END_CFI(strlen) |