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