Merge branch 'gup_flag-cleanups'
[cascardo/linux.git] / arch / sparc / lib / strlen.S
1 /* strlen.S: Sparc optimized strlen code
2  * Hand optimized from GNU libc's strlen
3  * Copyright (C) 1991,1996 Free Software Foundation
4  * Copyright (C) 1996,2008 David S. Miller (davem@davemloft.net)
5  * Copyright (C) 1996, 1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
6  */
7
8 #include <linux/linkage.h>
9 #include <asm/asm.h>
10 #include <asm/export.h>
11
12 #define LO_MAGIC 0x01010101
13 #define HI_MAGIC 0x80808080
14
15         .text
16 ENTRY(strlen)
17         mov     %o0, %o1
18         andcc   %o0, 3, %g0
19         BRANCH32(be, pt, 9f)
20          sethi  %hi(HI_MAGIC), %o4
21         ldub    [%o0], %o5
22         BRANCH_REG_ZERO(pn, %o5, 11f)
23          add    %o0, 1, %o0
24         andcc   %o0, 3, %g0
25         BRANCH32(be, pn, 4f)
26          or     %o4, %lo(HI_MAGIC), %o3
27         ldub    [%o0], %o5
28         BRANCH_REG_ZERO(pn, %o5, 12f)
29          add    %o0, 1, %o0
30         andcc   %o0, 3, %g0
31         BRANCH32(be, pt, 5f)
32          sethi  %hi(LO_MAGIC), %o4
33         ldub    [%o0], %o5
34         BRANCH_REG_ZERO(pn, %o5, 13f)
35          add    %o0, 1, %o0
36         BRANCH32(ba, pt, 8f)
37          or     %o4, %lo(LO_MAGIC), %o2
38 9:
39         or      %o4, %lo(HI_MAGIC), %o3
40 4:
41         sethi   %hi(LO_MAGIC), %o4
42 5:
43         or      %o4, %lo(LO_MAGIC), %o2
44 8:
45         ld      [%o0], %o5
46 2:
47         sub     %o5, %o2, %o4
48         andcc   %o4, %o3, %g0
49         BRANCH32(be, pt, 8b)
50          add    %o0, 4, %o0
51
52         /* Check every byte. */
53         srl     %o5, 24, %g7
54         andcc   %g7, 0xff, %g0
55         BRANCH32(be, pn, 1f)
56          add    %o0, -4, %o4
57         srl     %o5, 16, %g7
58         andcc   %g7, 0xff, %g0
59         BRANCH32(be, pn, 1f)
60          add    %o4, 1, %o4
61         srl     %o5, 8, %g7
62         andcc   %g7, 0xff, %g0
63         BRANCH32(be, pn, 1f)
64          add    %o4, 1, %o4
65         andcc   %o5, 0xff, %g0
66         BRANCH32_ANNUL(bne, pt, 2b)
67          ld     [%o0], %o5
68         add     %o4, 1, %o4
69 1:
70         retl
71          sub    %o4, %o1, %o0
72 11:
73         retl
74          mov    0, %o0
75 12:
76         retl
77          mov    1, %o0
78 13:
79         retl
80          mov    2, %o0
81 ENDPROC(strlen)
82 EXPORT_SYMBOL(strlen)