]> git.karo-electronics.de Git - karo-tx-linux.git/blob - arch/powerpc/lib/string.S
Merge branches 'acpi-osl', 'acpi-pad', 'acpi-video' and 'acpi-assorted'
[karo-tx-linux.git] / arch / powerpc / lib / string.S
1 /*
2  * String handling functions for PowerPC.
3  *
4  * Copyright (C) 1996 Paul Mackerras.
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version
9  * 2 of the License, or (at your option) any later version.
10  */
11 #include <asm/processor.h>
12 #include <asm/errno.h>
13 #include <asm/ppc_asm.h>
14
15         .section __ex_table,"a"
16         PPC_LONG_ALIGN
17         .text
18         
19 _GLOBAL(strcpy)
20         addi    r5,r3,-1
21         addi    r4,r4,-1
22 1:      lbzu    r0,1(r4)
23         cmpwi   0,r0,0
24         stbu    r0,1(r5)
25         bne     1b
26         blr
27
28 /* This clears out any unused part of the destination buffer,
29    just as the libc version does.  -- paulus */
30 _GLOBAL(strncpy)
31         PPC_LCMPI 0,r5,0
32         beqlr
33         mtctr   r5
34         addi    r6,r3,-1
35         addi    r4,r4,-1
36 1:      lbzu    r0,1(r4)
37         cmpwi   0,r0,0
38         stbu    r0,1(r6)
39         bdnzf   2,1b            /* dec ctr, branch if ctr != 0 && !cr0.eq */
40         bnelr                   /* if we didn't hit a null char, we're done */
41         mfctr   r5
42         PPC_LCMPI 0,r5,0        /* any space left in destination buffer? */
43         beqlr                   /* we know r0 == 0 here */
44 2:      stbu    r0,1(r6)        /* clear it out if so */
45         bdnz    2b
46         blr
47
48 _GLOBAL(strcat)
49         addi    r5,r3,-1
50         addi    r4,r4,-1
51 1:      lbzu    r0,1(r5)
52         cmpwi   0,r0,0
53         bne     1b
54         addi    r5,r5,-1
55 1:      lbzu    r0,1(r4)
56         cmpwi   0,r0,0
57         stbu    r0,1(r5)
58         bne     1b
59         blr
60
61 _GLOBAL(strcmp)
62         addi    r5,r3,-1
63         addi    r4,r4,-1
64 1:      lbzu    r3,1(r5)
65         cmpwi   1,r3,0
66         lbzu    r0,1(r4)
67         subf.   r3,r0,r3
68         beqlr   1
69         beq     1b
70         blr
71
72 _GLOBAL(strncmp)
73         PPC_LCMPI 0,r5,0
74         beq-    2f
75         mtctr   r5
76         addi    r5,r3,-1
77         addi    r4,r4,-1
78 1:      lbzu    r3,1(r5)
79         cmpwi   1,r3,0
80         lbzu    r0,1(r4)
81         subf.   r3,r0,r3
82         beqlr   1
83         bdnzt   eq,1b
84         blr
85 2:      li      r3,0
86         blr
87
88 _GLOBAL(strlen)
89         addi    r4,r3,-1
90 1:      lbzu    r0,1(r4)
91         cmpwi   0,r0,0
92         bne     1b
93         subf    r3,r3,r4
94         blr
95
96 #ifdef CONFIG_PPC32
97 _GLOBAL(memcmp)
98         PPC_LCMPI 0,r5,0
99         beq-    2f
100         mtctr   r5
101         addi    r6,r3,-1
102         addi    r4,r4,-1
103 1:      lbzu    r3,1(r6)
104         lbzu    r0,1(r4)
105         subf.   r3,r0,r3
106         bdnzt   2,1b
107         blr
108 2:      li      r3,0
109         blr
110 #endif
111
112 _GLOBAL(memchr)
113         PPC_LCMPI 0,r5,0
114         beq-    2f
115         mtctr   r5
116         addi    r3,r3,-1
117 1:      lbzu    r0,1(r3)
118         cmpw    0,r0,r4
119         bdnzf   2,1b
120         beqlr
121 2:      li      r3,0
122         blr
123
124 #ifdef CONFIG_PPC32
125 _GLOBAL(__clear_user)
126         addi    r6,r3,-4
127         li      r3,0
128         li      r5,0
129         cmplwi  0,r4,4
130         blt     7f
131         /* clear a single word */
132 11:     stwu    r5,4(r6)
133         beqlr
134         /* clear word sized chunks */
135         andi.   r0,r6,3
136         add     r4,r0,r4
137         subf    r6,r0,r6
138         srwi    r0,r4,2
139         andi.   r4,r4,3
140         mtctr   r0
141         bdz     7f
142 1:      stwu    r5,4(r6)
143         bdnz    1b
144         /* clear byte sized chunks */
145 7:      cmpwi   0,r4,0
146         beqlr
147         mtctr   r4
148         addi    r6,r6,3
149 8:      stbu    r5,1(r6)
150         bdnz    8b
151         blr
152 90:     mr      r3,r4
153         blr
154 91:     mfctr   r3
155         slwi    r3,r3,2
156         add     r3,r3,r4
157         blr
158 92:     mfctr   r3
159         blr
160
161         .section __ex_table,"a"
162         PPC_LONG        11b,90b
163         PPC_LONG        1b,91b
164         PPC_LONG        8b,92b
165         .text
166 #endif