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