Linux 2.6.22-rc3
[linux-2.6/next.git] / arch / sparc / lib / strlen_user.S
blob8c8a371df3c9cea2e8ee4a0beabd683c08d24f78
1 /* strlen_user.S: Sparc optimized strlen_user code
2  *
3  * Return length of string in userspace including terminating 0
4  * or 0 for error
5  *
6  * Copyright (C) 1991,1996 Free Software Foundation
7  * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
8  * Copyright (C) 1996 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
9  */
11 #define LO_MAGIC 0x01010101
12 #define HI_MAGIC 0x80808080
14 10:
15         ldub    [%o0], %o5
16         cmp     %o5, 0
17         be      1f
18          add    %o0, 1, %o0
19         andcc   %o0, 3, %g0
20         be      4f
21          or     %o4, %lo(HI_MAGIC), %o3
22 11:
23         ldub    [%o0], %o5
24         cmp     %o5, 0
25         be      2f
26          add    %o0, 1, %o0
27         andcc   %o0, 3, %g0
28         be      5f
29          sethi  %hi(LO_MAGIC), %o4
30 12:
31         ldub    [%o0], %o5
32         cmp     %o5, 0
33         be      3f
34          add    %o0, 1, %o0
35         b       13f
36          or     %o4, %lo(LO_MAGIC), %o2
38         retl
39          mov    1, %o0
41         retl
42          mov    2, %o0
44         retl
45          mov    3, %o0
47         .align 4
48         .global __strlen_user, __strnlen_user
49 __strlen_user:
50         sethi   %hi(32768), %o1
51 __strnlen_user:
52         mov     %o1, %g1
53         mov     %o0, %o1
54         andcc   %o0, 3, %g0
55         bne     10b
56          sethi  %hi(HI_MAGIC), %o4
57         or      %o4, %lo(HI_MAGIC), %o3
59         sethi   %hi(LO_MAGIC), %o4
61         or      %o4, %lo(LO_MAGIC), %o2
62 13:
63         ld      [%o0], %o5
65         sub     %o5, %o2, %o4
66         andcc   %o4, %o3, %g0
67         bne     82f
68          add    %o0, 4, %o0
69         sub     %o0, %o1, %g2
70 81:     cmp     %g2, %g1
71         blu     13b
72          mov    %o0, %o4
73         ba,a    1f
75         /* Check every byte. */
76 82:     srl     %o5, 24, %g5
77         andcc   %g5, 0xff, %g0
78         be      1f
79          add    %o0, -3, %o4
80         srl     %o5, 16, %g5
81         andcc   %g5, 0xff, %g0
82         be      1f
83          add    %o4, 1, %o4
84         srl     %o5, 8, %g5
85         andcc   %g5, 0xff, %g0
86         be      1f
87          add    %o4, 1, %o4
88         andcc   %o5, 0xff, %g0
89         bne     81b
90          sub    %o0, %o1, %g2
92         add     %o4, 1, %o4
94         retl
95          sub    %o4, %o1, %o0
97         .section .fixup,#alloc,#execinstr
98         .align  4
100         retl
101          clr    %o0
103         .section __ex_table,#alloc
104         .align  4
106         .word   10b, 9b
107         .word   11b, 9b
108         .word   12b, 9b
109         .word   13b, 9b