]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - arch/powerpc/lib/ppcstring.S
Merge branch 'master' of git://git.denx.de/u-boot-arm
[karo-tx-uboot.git] / arch / powerpc / lib / ppcstring.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 <ppc_asm.tmpl>
12 #include <asm/errno.h>
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  strlen
64 strlen:
65         addi    r4,r3,-1
66 1:      lbzu    r0,1(r4)
67         cmpwi   0,r0,0
68         bne     1b
69         subf    r3,r3,r4
70         blr
71
72         .globl  memset
73 memset:
74         rlwimi  r4,r4,8,16,23
75         rlwimi  r4,r4,16,0,15
76         addi    r6,r3,-4
77         cmplwi  0,r5,4
78         blt     7f
79         stwu    r4,4(r6)
80         beqlr
81         andi.   r0,r6,3
82         add     r5,r0,r5
83         subf    r6,r0,r6
84         rlwinm  r0,r5,32-2,2,31
85         mtctr   r0
86         bdz     6f
87 1:      stwu    r4,4(r6)
88         bdnz    1b
89 6:      andi.   r5,r5,3
90 7:      cmpwi   0,r5,0
91         beqlr
92         mtctr   r5
93         addi    r6,r6,3
94 8:      stbu    r4,1(r6)
95         bdnz    8b
96         blr
97
98         .globl  bcopy
99 bcopy:
100         mr      r6,r3
101         mr      r3,r4
102         mr      r4,r6
103         b       memcpy
104
105         .globl  memmove
106 memmove:
107         cmplw   0,r3,r4
108         bgt     backwards_memcpy
109         /* fall through */
110
111         .globl  memcpy
112 memcpy:
113         rlwinm. r7,r5,32-3,3,31         /* r0 = r5 >> 3 */
114         addi    r6,r3,-4
115         addi    r4,r4,-4
116         beq     2f                      /* if less than 8 bytes to do */
117         andi.   r0,r6,3                 /* get dest word aligned */
118         mtctr   r7
119         bne     5f
120 1:      lwz     r7,4(r4)
121         lwzu    r8,8(r4)
122         stw     r7,4(r6)
123         stwu    r8,8(r6)
124         bdnz    1b
125         andi.   r5,r5,7
126 2:      cmplwi  0,r5,4
127         blt     3f
128         lwzu    r0,4(r4)
129         addi    r5,r5,-4
130         stwu    r0,4(r6)
131 3:      cmpwi   0,r5,0
132         beqlr
133         mtctr   r5
134         addi    r4,r4,3
135         addi    r6,r6,3
136 4:      lbzu    r0,1(r4)
137         stbu    r0,1(r6)
138         bdnz    4b
139         blr
140 5:      subfic  r0,r0,4
141         mtctr   r0
142 6:      lbz     r7,4(r4)
143         addi    r4,r4,1
144         stb     r7,4(r6)
145         addi    r6,r6,1
146         bdnz    6b
147         subf    r5,r0,r5
148         rlwinm. r7,r5,32-3,3,31
149         beq     2b
150         mtctr   r7
151         b       1b
152
153         .globl  backwards_memcpy
154 backwards_memcpy:
155         rlwinm. r7,r5,32-3,3,31         /* r0 = r5 >> 3 */
156         add     r6,r3,r5
157         add     r4,r4,r5
158         beq     2f
159         andi.   r0,r6,3
160         mtctr   r7
161         bne     5f
162 1:      lwz     r7,-4(r4)
163         lwzu    r8,-8(r4)
164         stw     r7,-4(r6)
165         stwu    r8,-8(r6)
166         bdnz    1b
167         andi.   r5,r5,7
168 2:      cmplwi  0,r5,4
169         blt     3f
170         lwzu    r0,-4(r4)
171         subi    r5,r5,4
172         stwu    r0,-4(r6)
173 3:      cmpwi   0,r5,0
174         beqlr
175         mtctr   r5
176 4:      lbzu    r0,-1(r4)
177         stbu    r0,-1(r6)
178         bdnz    4b
179         blr
180 5:      mtctr   r0
181 6:      lbzu    r7,-1(r4)
182         stbu    r7,-1(r6)
183         bdnz    6b
184         subf    r5,r0,r5
185         rlwinm. r7,r5,32-3,3,31
186         beq     2b
187         mtctr   r7
188         b       1b
189
190         .globl  memcmp
191 memcmp:
192         cmpwi   0,r5,0
193         ble-    2f
194         mtctr   r5
195         addi    r6,r3,-1
196         addi    r4,r4,-1
197 1:      lbzu    r3,1(r6)
198         lbzu    r0,1(r4)
199         subf.   r3,r0,r3
200         bdnzt   2,1b
201         blr
202 2:      li      r3,0
203         blr
204
205         .global memchr
206 memchr:
207         cmpwi   0,r5,0
208         ble-    2f
209         mtctr   r5
210         addi    r3,r3,-1
211 1:      lbzu    r0,1(r3)
212         cmpw    0,r0,r4
213         bdnzf   2,1b
214         beqlr
215 2:      li      r3,0
216         blr