1
2
3
4
5
6
7
8
9 #include <linux/linkage.h>
10 #include <asm/asm.h>
11 #include <asm/export.h>
12
13 #define LO_MAGIC 0x01010101
14 #define HI_MAGIC 0x80808080
15
16 .text
17 ENTRY(strlen)
18 mov %o0, %o1
19 andcc %o0, 3, %g0
20 BRANCH32(be, pt, 9f)
21 sethi %hi(HI_MAGIC), %o4
22 ldub [%o0], %o5
23 BRANCH_REG_ZERO(pn, %o5, 11f)
24 add %o0, 1, %o0
25 andcc %o0, 3, %g0
26 BRANCH32(be, pn, 4f)
27 or %o4, %lo(HI_MAGIC), %o3
28 ldub [%o0], %o5
29 BRANCH_REG_ZERO(pn, %o5, 12f)
30 add %o0, 1, %o0
31 andcc %o0, 3, %g0
32 BRANCH32(be, pt, 5f)
33 sethi %hi(LO_MAGIC), %o4
34 ldub [%o0], %o5
35 BRANCH_REG_ZERO(pn, %o5, 13f)
36 add %o0, 1, %o0
37 BRANCH32(ba, pt, 8f)
38 or %o4, %lo(LO_MAGIC), %o2
39 9:
40 or %o4, %lo(HI_MAGIC), %o3
41 4:
42 sethi %hi(LO_MAGIC), %o4
43 5:
44 or %o4, %lo(LO_MAGIC), %o2
45 8:
46 ld [%o0], %o5
47 2:
48 sub %o5, %o2, %o4
49 andcc %o4, %o3, %g0
50 BRANCH32(be, pt, 8b)
51 add %o0, 4, %o0
52
53
54 srl %o5, 24, %g7
55 andcc %g7, 0xff, %g0
56 BRANCH32(be, pn, 1f)
57 add %o0, -4, %o4
58 srl %o5, 16, %g7
59 andcc %g7, 0xff, %g0
60 BRANCH32(be, pn, 1f)
61 add %o4, 1, %o4
62 srl %o5, 8, %g7
63 andcc %g7, 0xff, %g0
64 BRANCH32(be, pn, 1f)
65 add %o4, 1, %o4
66 andcc %o5, 0xff, %g0
67 BRANCH32_ANNUL(bne, pt, 2b)
68 ld [%o0], %o5
69 add %o4, 1, %o4
70 1:
71 retl
72 sub %o4, %o1, %o0
73 11:
74 retl
75 mov 0, %o0
76 12:
77 retl
78 mov 1, %o0
79 13:
80 retl
81 mov 2, %o0
82 ENDPROC(strlen)
83 EXPORT_SYMBOL(strlen)