* add p cc
[mascara-docs.git] / i386 / linux / linux-2.3.21 / arch / sparc64 / lib / strlen_user.S
blob04d5e53db2b5b1f1add7c35ebd6cbd293d2b0560
1 /* strlen_user.S: Sparc64 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,1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
9  */
11 #include <asm/asi.h>
13 #define LO_MAGIC 0x01010101
14 #define HI_MAGIC 0x80808080
16         .align 4
17         .global __strlen_user
18 __strlen_user:
19         mov     %o0, %o1
20         andcc   %o0, 3, %g0
21         be,pt   %icc, 9f
22          sethi  %hi(HI_MAGIC), %o4
23 10:     lduba   [%o0] %asi, %o5
24         brz,pn  %o5, 21f
25          add    %o0, 1, %o0
26         andcc   %o0, 3, %g0
27         be,pn   %icc, 4f
28          or     %o4, %lo(HI_MAGIC), %o3
29 11:     lduba   [%o0] %asi, %o5
30         brz,pn  %o5, 22f
31          add    %o0, 1, %o0
32         andcc   %o0, 3, %g0
33         be,pt   %icc, 13f
34          srl    %o3, 7, %o2
35 12:     lduba   [%o0] %asi, %o5
36         brz,pn  %o5, 23f
37          add    %o0, 1, %o0
38         ba,pt   %icc, 2f
39 15:      lda    [%o0] %asi, %o5
40 9:      or      %o4, %lo(HI_MAGIC), %o3
41 4:      srl     %o3, 7, %o2
42 13:     lda     [%o0] %asi, %o5
43 2:      sub     %o5, %o2, %o4
44         andcc   %o4, %o3, %g0
45         be,pt   %icc, 13b
46          add    %o0, 4, %o0
48         /* Check every byte. */
49         srl     %o5, 24, %g5
50         andcc   %g5, 0xff, %g0
51         be,pn   %icc, 1f
52          add    %o0, -3, %o4
53         srl     %o5, 16, %g5
54         andcc   %g5, 0xff, %g0
55         be,pn   %icc, 1f
56          add    %o4, 1, %o4
57         srl     %o5, 8, %g5
58         andcc   %g5, 0xff, %g0
59         be,pn   %icc, 1f
60          add    %o4, 1, %o4
61         andcc   %o5, 0xff, %g0
62         bne,a,pt %icc, 2b
63 14:      lda    [%o0] %asi, %o5
64         add     %o4, 1, %o4
65 1:      retl
66          sub    %o4, %o1, %o0
67 21:     retl
68          mov    1, %o0
69 22:     retl
70          mov    2, %o0
71 23:     retl
72          mov    3, %o0
74         .section .fixup,#alloc,#execinstr
75         .align  4
76 30:
77         retl
78          clr    %o0
80         .section __ex_table,#alloc
81         .align  4
83         .word   10b, 30b
84         .word   11b, 30b
85         .word   12b, 30b
86         .word   15b, 30b
87         .word   13b, 30b
88         .word   14b, 30b