]> git.ipfire.org Git - people/ms/u-boot.git/blob - arch/ppc/lib/ppcstring.S
Move lib_$ARCH directories to arch/$ARCH/lib
[people/ms/u-boot.git] / arch / ppc / 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