Allow yaboot to load relocatable kernel
[yaboot.git] / lib / string.S
1 /*
2  *  string.S - 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 modify
7  *  it under the terms of the GNU General Public License as published by
8  *  the Free Software Foundation; either version 2 of the License, or
9  *  (at your option) any later version.
10  *
11  *  This program is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *  GNU General Public License for more details.
15  *
16  *  You should have received a copy of the GNU General Public License
17  *  along with this program; if not, write to the Free Software
18  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19  */
20
21 #include "asm/processor.h"
22 #include "asm/ppc_asm.tmpl"
23
24         .globl  strcpy
25 strcpy:
26         addi    r5,r3,-1
27         addi    r4,r4,-1
28 1:      lbzu    r0,1(r4)
29         cmpwi   0,r0,0
30         stbu    r0,1(r5)
31         bne     1b
32         blr
33
34         .globl  strncpy
35 strncpy:
36         cmpwi   0,r5,0
37         beqlr
38         mtctr   r5
39         addi    r6,r3,-1
40         addi    r4,r4,-1
41 1:      lbzu    r0,1(r4)
42         cmpwi   0,r0,0
43         stbu    r0,1(r6)
44         bdnzf   2,1b            /* dec ctr, branch if ctr != 0 && !cr0.eq */
45         blr
46
47         .globl  strcat
48 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         .globl  strcmp
62 strcmp:
63         addi    r5,r3,-1
64         addi    r4,r4,-1
65 1:      lbzu    r3,1(r5)
66         cmpwi   1,r3,0
67         lbzu    r0,1(r4)
68         subf.   r3,r0,r3
69         beqlr   1
70         beq     1b
71         blr
72
73         .globl  strncmp
74 strncmp:
75         cmpwi   0,r5,0
76         addi    r6,r3,-1
77         addi    r4,r4,-1
78         beqlr
79         mtctr   r5
80 1:      lbzu    r3,1(r6)
81         cmpwi   1,r3,0
82         lbzu    r0,1(r4)
83         subf.   r3,r0,r3
84         beqlr   1
85         bdnzt   2,1b            /* dec ctr, branch if ctr != 0 && cr0.eq */
86         blr
87
88         .globl  strlen
89 strlen:
90         addi    r4,r3,-1
91 1:      lbzu    r0,1(r4)
92         cmpwi   0,r0,0
93         bne     1b
94         subf    r3,r3,r4
95         blr
96
97         .globl  strchr
98 strchr:
99         addi    r3,r3,-1
100 1:      lbzu    r0,1(r3)
101         cmpw    0,r0,r4
102         cmpwi   1,r0,0
103         beqlr
104         bne     1,1b
105         li      r3,0
106         blr
107
108         .globl  strrchr
109 strrchr:
110         addi    r5,r3,-1
111         li      r3,0
112 1:      lbzu    r0,1(r5)
113         cmpwi   0,r0,0
114         cmpw    1,r0,r4
115         beqlr
116         bne     1,1b
117         mr      r3,r5
118         b       1b
119
120         .globl  memset
121 memset:
122         rlwimi  r4,r4,8,16,23
123         rlwimi  r4,r4,16,0,15
124         addi    r6,r3,-4
125         cmplwi  0,r5,4
126         blt     7f
127         stwu    r4,4(r6)
128         beqlr
129         andi.   r0,r6,3
130         add     r5,r0,r5
131         subf    r6,r0,r6
132         rlwinm  r0,r5,32-2,2,31
133         mtctr   r0
134         bdz     6f
135 1:      stwu    r4,4(r6)
136         bdnz    1b
137 6:      andi.   r5,r5,3
138 7:      cmpwi   0,r5,0
139         beqlr
140         mtctr   r5
141         addi    r6,r6,3
142 8:      stbu    r4,1(r6)
143         bdnz    8b
144         blr
145
146         .globl  bcopy
147 bcopy:
148         mr      r6,r3
149         mr      r3,r4
150         mr      r4,r6
151         b       memcpy
152
153         .globl __bzero
154 __bzero:
155         mr r5, r4
156         li r4, 0
157         b memset
158
159         .globl  memmove
160 memmove:
161         cmplw   0,r3,r4
162         bgt     backwards_memcpy
163         /* fall through */
164
165         .globl  memcpy
166 memcpy:
167         rlwinm. r7,r5,32-3,3,31         /* r0 = r5 >> 3 */
168         addi    r6,r3,-4
169         addi    r4,r4,-4
170         beq     2f                      /* if less than 8 bytes to do */
171         andi.   r0,r6,3                 /* get dest word aligned */
172         mtctr   r7
173         bne     5f
174 1:      lwz     r7,4(r4)
175         lwzu    r8,8(r4)
176         stw     r7,4(r6)
177         stwu    r8,8(r6)
178         bdnz    1b
179         andi.   r5,r5,7
180 2:      cmplwi  0,r5,4
181         blt     3f
182         lwzu    r0,4(r4)
183         addi    r5,r5,-4
184         stwu    r0,4(r6)
185 3:      cmpwi   0,r5,0
186         beqlr
187         mtctr   r5
188         addi    r4,r4,3
189         addi    r6,r6,3
190 4:      lbzu    r0,1(r4)
191         stbu    r0,1(r6)
192         bdnz    4b
193         blr
194 5:      subfic  r0,r0,4
195         mtctr   r0
196 6:      lbz     r7,4(r4)
197         addi    r4,r4,1
198         stb     r7,4(r6)
199         addi    r6,r6,1
200         bdnz    6b
201         subf    r5,r0,r5
202         rlwinm. r7,r5,32-3,3,31
203         beq     2b
204         mtctr   r7
205         b       1b
206
207         .globl  backwards_memcpy
208 backwards_memcpy:
209         rlwinm. r7,r5,32-3,3,31         /* r0 = r5 >> 3 */
210         add     r6,r3,r5
211         add     r4,r4,r5
212         beq     2f
213         andi.   r0,r6,3
214         mtctr   r7
215         bne     5f
216 1:      lwz     r7,-4(r4)
217         lwzu    r8,-8(r4)
218         stw     r7,-4(r6)
219         stwu    r8,-8(r6)
220         bdnz    1b
221         andi.   r5,r5,7
222 2:      cmplwi  0,r5,4
223         blt     3f
224         lwzu    r0,-4(r4)
225         subi    r5,r5,4
226         stwu    r0,-4(r6)
227 3:      cmpwi   0,r5,0
228         beqlr
229         mtctr   r5
230 4:      lbzu    r0,-1(r4)
231         stbu    r0,-1(r6)
232         bdnz    4b
233         blr
234 5:      mtctr   r0
235 6:      lbzu    r7,-1(r4)
236         stbu    r7,-1(r6)
237         bdnz    6b
238         subf    r5,r0,r5
239         rlwinm. r7,r5,32-3,3,31
240         beq     2b
241         mtctr   r7
242         b       1b
243
244         .globl  memcmp
245 memcmp:
246         cmpwi   0,r5,0
247         blelr
248         mtctr   r5
249         addi    r6,r3,-1
250         addi    r4,r4,-1
251 1:      lbzu    r3,1(r6)
252         lbzu    r0,1(r4)
253         subf.   r3,r0,r3
254         bdnzt   2,1b
255         blr