6c6b9b24ca07359617782d34ba29804008cfdb67
[yaboot.git] / 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/ppc_asm.tmpl"
13
14         .globl  strcpy
15 strcpy:
16         addi    r5,r3,-1
17         addi    r4,r4,-1
18 1:      lbzu    r0,1(r4)
19         cmpwi   0,r0,0
20         stbu    r0,1(r5)
21         bne     1b
22         blr
23
24         .globl  strncpy
25 strncpy:
26         cmpwi   0,r5,0
27         beqlr
28         mtctr   r5
29         addi    r6,r3,-1
30         addi    r4,r4,-1
31 1:      lbzu    r0,1(r4)
32         cmpwi   0,r0,0
33         stbu    r0,1(r6)
34         bdnzf   2,1b            /* dec ctr, branch if ctr != 0 && !cr0.eq */
35         blr
36
37         .globl  strcat
38 strcat:
39         addi    r5,r3,-1
40         addi    r4,r4,-1
41 1:      lbzu    r0,1(r5)
42         cmpwi   0,r0,0
43         bne     1b
44         addi    r5,r5,-1
45 1:      lbzu    r0,1(r4)
46         cmpwi   0,r0,0
47         stbu    r0,1(r5)
48         bne     1b
49         blr
50
51         .globl  strcmp
52 strcmp:
53         addi    r5,r3,-1
54         addi    r4,r4,-1
55 1:      lbzu    r3,1(r5)
56         cmpwi   1,r3,0
57         lbzu    r0,1(r4)
58         subf.   r3,r0,r3
59         beqlr   1
60         beq     1b
61         blr
62
63         .globl  strncmp
64 strncmp:
65         cmpwi   0,r5,0
66         addi    r6,r3,-1
67         addi    r4,r4,-1
68         beqlr
69         mtctr   r5
70 1:      lbzu    r3,1(r6)
71         cmpwi   1,r3,0
72         lbzu    r0,1(r4)
73         subf.   r3,r0,r3
74         beqlr   1
75         bdnzt   2,1b            /* dec ctr, branch if ctr != 0 && cr0.eq */
76         blr
77
78         .globl  strlen
79 strlen:
80         addi    r4,r3,-1
81 1:      lbzu    r0,1(r4)
82         cmpwi   0,r0,0
83         bne     1b
84         subf    r3,r3,r4
85         blr
86
87         .globl  strchr
88 strchr:
89         addi    r3,r3,-1
90 1:      lbzu    r0,1(r3)
91         cmpw    0,r0,r4
92         cmpwi   1,r0,0
93         beqlr
94         bne     1,1b
95         li      r3,0
96         blr
97
98         .globl  strrchr
99 strrchr:
100         addi    r5,r3,-1
101         li      r3,0
102 1:      lbzu    r0,1(r5)
103         cmpwi   0,r0,0
104         cmpw    1,r0,r4
105         beqlr
106         bne     1,1b
107         mr      r3,r5
108         b       1b
109
110         .globl  memset
111 memset:
112         rlwimi  r4,r4,8,16,23
113         rlwimi  r4,r4,16,0,15
114         addi    r6,r3,-4
115         cmplwi  0,r5,4
116         blt     7f
117         stwu    r4,4(r6)
118         beqlr
119         andi.   r0,r6,3
120         add     r5,r0,r5
121         subf    r6,r0,r6
122         rlwinm  r0,r5,32-2,2,31
123         mtctr   r0
124         bdz     6f
125 1:      stwu    r4,4(r6)
126         bdnz    1b
127 6:      andi.   r5,r5,3
128 7:      cmpwi   0,r5,0
129         beqlr
130         mtctr   r5
131         addi    r6,r6,3
132 8:      stbu    r4,1(r6)
133         bdnz    8b
134         blr
135
136         .globl  bcopy
137 bcopy:
138         mr      r6,r3
139         mr      r3,r4
140         mr      r4,r6
141         b       memcpy
142
143         .globl __bzero
144 __bzero:
145         mr r5, r4
146         li r4, 0
147         b memset
148
149         .globl  memmove
150 memmove:
151         cmplw   0,r3,r4
152         bgt     backwards_memcpy
153         /* fall through */
154
155         .globl  memcpy
156 memcpy:
157         rlwinm. r7,r5,32-3,3,31         /* r0 = r5 >> 3 */
158         addi    r6,r3,-4
159         addi    r4,r4,-4
160         beq     2f                      /* if less than 8 bytes to do */
161         andi.   r0,r6,3                 /* get dest word aligned */
162         mtctr   r7
163         bne     5f
164 1:      lwz     r7,4(r4)
165         lwzu    r8,8(r4)
166         stw     r7,4(r6)
167         stwu    r8,8(r6)
168         bdnz    1b
169         andi.   r5,r5,7
170 2:      cmplwi  0,r5,4
171         blt     3f
172         lwzu    r0,4(r4)
173         addi    r5,r5,-4
174         stwu    r0,4(r6)
175 3:      cmpwi   0,r5,0
176         beqlr
177         mtctr   r5
178         addi    r4,r4,3
179         addi    r6,r6,3
180 4:      lbzu    r0,1(r4)
181         stbu    r0,1(r6)
182         bdnz    4b
183         blr
184 5:      subfic  r0,r0,4
185         mtctr   r0
186 6:      lbz     r7,4(r4)
187         addi    r4,r4,1
188         stb     r7,4(r6)
189         addi    r6,r6,1
190         bdnz    6b
191         subf    r5,r0,r5
192         rlwinm. r7,r5,32-3,3,31
193         beq     2b
194         mtctr   r7
195         b       1b
196
197         .globl  backwards_memcpy
198 backwards_memcpy:
199         rlwinm. r7,r5,32-3,3,31         /* r0 = r5 >> 3 */
200         add     r6,r3,r5
201         add     r4,r4,r5
202         beq     2f
203         andi.   r0,r6,3
204         mtctr   r7
205         bne     5f
206 1:      lwz     r7,-4(r4)
207         lwzu    r8,-8(r4)
208         stw     r7,-4(r6)
209         stwu    r8,-8(r6)
210         bdnz    1b
211         andi.   r5,r5,7
212 2:      cmplwi  0,r5,4
213         blt     3f
214         lwzu    r0,-4(r4)
215         subi    r5,r5,4
216         stwu    r0,-4(r6)
217 3:      cmpwi   0,r5,0
218         beqlr
219         mtctr   r5
220 4:      lbzu    r0,-1(r4)
221         stbu    r0,-1(r6)
222         bdnz    4b
223         blr
224 5:      mtctr   r0
225 6:      lbzu    r7,-1(r4)
226         stbu    r7,-1(r6)
227         bdnz    6b
228         subf    r5,r0,r5
229         rlwinm. r7,r5,32-3,3,31
230         beq     2b
231         mtctr   r7
232         b       1b
233
234         .globl  memcmp
235 memcmp:
236         cmpwi   0,r5,0
237         blelr
238         mtctr   r5
239         addi    r6,r3,-1
240         addi    r4,r4,-1
241 1:      lbzu    r3,1(r6)
242         lbzu    r0,1(r4)
243         subf.   r3,r0,r3
244         bdnzt   2,1b
245         blr