Pull unaligned-snsc_event into release branch
[linux-2.6] / 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 David S. Miller (davem@caip.rutgers.edu)
5  * Copyright (C) 1996 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
6  */
7
8 #define LO_MAGIC 0x01010101
9 #define HI_MAGIC 0x80808080
10
11 0:
12         ldub    [%o0], %o5
13         cmp     %o5, 0
14         be      1f
15          add    %o0, 1, %o0
16         andcc   %o0, 3, %g0
17         be      4f
18          or     %o4, %lo(HI_MAGIC), %o3
19         ldub    [%o0], %o5
20         cmp     %o5, 0
21         be      2f
22          add    %o0, 1, %o0
23         andcc   %o0, 3, %g0
24         be      5f
25          sethi  %hi(LO_MAGIC), %o4
26         ldub    [%o0], %o5
27         cmp     %o5, 0
28         be      3f
29          add    %o0, 1, %o0
30         b       8f
31          or     %o4, %lo(LO_MAGIC), %o2
32 1:
33         retl
34          mov    0, %o0
35 2:
36         retl
37          mov    1, %o0
38 3:
39         retl
40          mov    2, %o0
41
42         .align 4
43         .global strlen
44 strlen:
45         mov     %o0, %o1
46         andcc   %o0, 3, %g0
47         bne     0b
48          sethi  %hi(HI_MAGIC), %o4
49         or      %o4, %lo(HI_MAGIC), %o3
50 4:
51         sethi   %hi(LO_MAGIC), %o4
52 5:
53         or      %o4, %lo(LO_MAGIC), %o2
54 8:
55         ld      [%o0], %o5
56 2:
57         sub     %o5, %o2, %o4
58         andcc   %o4, %o3, %g0
59         be      8b
60          add    %o0, 4, %o0
61
62         /* Check every byte. */
63         srl     %o5, 24, %g5
64         andcc   %g5, 0xff, %g0
65         be      1f
66          add    %o0, -4, %o4
67         srl     %o5, 16, %g5
68         andcc   %g5, 0xff, %g0
69         be      1f
70          add    %o4, 1, %o4
71         srl     %o5, 8, %g5
72         andcc   %g5, 0xff, %g0
73         be      1f
74          add    %o4, 1, %o4
75         andcc   %o5, 0xff, %g0
76         bne,a   2b
77          ld     [%o0], %o5
78         add     %o4, 1, %o4
79 1:
80         retl
81          sub    %o4, %o1, %o0