projects/linux·blob master · refs

252 lines · 3.3 KiB

1/* SPDX-License-Identifier: GPL-2.0-or-later */
2/*
3 * Copyright (C) Paul Mackerras 1997.
4 *
5 * NOTE: this code runs in 32 bit mode and is packaged as ELF32.
6 */
7
8#include "ppc_asm.h"
9
10 .text
11 .globl strcpy
12strcpy:
13 addi r5,r3,-1
14 addi r4,r4,-1
151: lbzu r0,1(r4)
16 cmpwi 0,r0,0
17 stbu r0,1(r5)
18 bne 1b
19 blr
20
21 .globl strcat
22strcat:
23 addi r5,r3,-1
24 addi r4,r4,-1
251: lbzu r0,1(r5)
26 cmpwi 0,r0,0
27 bne 1b
28 addi r5,r5,-1
291: lbzu r0,1(r4)
30 cmpwi 0,r0,0
31 stbu r0,1(r5)
32 bne 1b
33 blr
34
35 .globl strchr
36strchr:
37 addi r3,r3,-1
381: lbzu r0,1(r3)
39 cmpw 0,r0,r4
40 beqlr
41 cmpwi 0,r0,0
42 bne 1b
43 li r3,0
44 blr
45
46 .globl strcmp
47strcmp:
48 addi r5,r3,-1
49 addi r4,r4,-1
501: lbzu r3,1(r5)
51 cmpwi 1,r3,0
52 lbzu r0,1(r4)
53 subf. r3,r0,r3
54 beqlr 1
55 beq 1b
56 blr
57
58 .globl strncmp
59strncmp:
60 mtctr r5
61 addi r5,r3,-1
62 addi r4,r4,-1
631: lbzu r3,1(r5)
64 cmpwi 1,r3,0
65 lbzu r0,1(r4)
66 subf. r3,r0,r3
67 beqlr 1
68 bdnzt eq,1b
69 blr
70
71 .globl strlen
72strlen:
73 addi r4,r3,-1
741: lbzu r0,1(r4)
75 cmpwi 0,r0,0
76 bne 1b
77 subf r3,r3,r4
78 blr
79
80 .globl memset
81memset:
82 rlwimi r4,r4,8,16,23
83 rlwimi r4,r4,16,0,15
84 addi r6,r3,-4
85 cmplwi 0,r5,4
86 blt 7f
87 stwu r4,4(r6)
88 beqlr
89 andi. r0,r6,3
90 add r5,r0,r5
91 subf r6,r0,r6
92 rlwinm r0,r5,32-2,2,31
93 mtctr r0
94 bdz 6f
951: stwu r4,4(r6)
96 bdnz 1b
976: andi. r5,r5,3
987: cmpwi 0,r5,0
99 beqlr
100 mtctr r5
101 addi r6,r6,3
1028: stbu r4,1(r6)
103 bdnz 8b
104 blr
105
106 .globl memmove
107memmove:
108 cmplw 0,r3,r4
109 bgt backwards_memcpy
110 /* fall through */
111
112 .globl memcpy
113memcpy:
114 rlwinm. r7,r5,32-3,3,31 /* r7 = r5 >> 3 */
115 addi r6,r3,-4
116 addi r4,r4,-4
117 beq 3f /* if less than 8 bytes to do */
118 andi. r0,r6,3 /* get dest word aligned */
119 mtctr r7
120 bne 5f
121 andi. r0,r4,3 /* check src word aligned too */
122 bne 3f
1231: lwz r7,4(r4)
124 lwzu r8,8(r4)
125 stw r7,4(r6)
126 stwu r8,8(r6)
127 bdnz 1b
128 andi. r5,r5,7
1292: cmplwi 0,r5,4
130 blt 3f
131 lwzu r0,4(r4)
132 addi r5,r5,-4
133 stwu r0,4(r6)
1343: cmpwi 0,r5,0
135 beqlr
136 mtctr r5
137 addi r4,r4,3
138 addi r6,r6,3
1394: lbzu r0,1(r4)
140 stbu r0,1(r6)
141 bdnz 4b
142 blr
1435: subfic r0,r0,4
144 cmpw cr1,r0,r5
145 add r7,r0,r4
146 andi. r7,r7,3 /* will source be word-aligned too? */
147 ble cr1,3b
148 bne 3b /* do byte-by-byte if not */
149 mtctr r0
1506: lbz r7,4(r4)
151 addi r4,r4,1
152 stb r7,4(r6)
153 addi r6,r6,1
154 bdnz 6b
155 subf r5,r0,r5
156 rlwinm. r7,r5,32-3,3,31
157 beq 2b
158 mtctr r7
159 b 1b
160
161 .globl backwards_memcpy
162backwards_memcpy:
163 rlwinm. r7,r5,32-3,3,31 /* r7 = r5 >> 3 */
164 add r6,r3,r5
165 add r4,r4,r5
166 beq 3f
167 andi. r0,r6,3
168 mtctr r7
169 bne 5f
170 andi. r0,r4,3
171 bne 3f
1721: lwz r7,-4(r4)
173 lwzu r8,-8(r4)
174 stw r7,-4(r6)
175 stwu r8,-8(r6)
176 bdnz 1b
177 andi. r5,r5,7
1782: cmplwi 0,r5,4
179 blt 3f
180 lwzu r0,-4(r4)
181 subi r5,r5,4
182 stwu r0,-4(r6)
1833: cmpwi 0,r5,0
184 beqlr
185 mtctr r5
1864: lbzu r0,-1(r4)
187 stbu r0,-1(r6)
188 bdnz 4b
189 blr
1905: cmpw cr1,r0,r5
191 subf r7,r0,r4
192 andi. r7,r7,3
193 ble cr1,3b
194 bne 3b
195 mtctr r0
1966: lbzu r7,-1(r4)
197 stbu r7,-1(r6)
198 bdnz 6b
199 subf r5,r0,r5
200 rlwinm. r7,r5,32-3,3,31
201 beq 2b
202 mtctr r7
203 b 1b
204
205 .globl memchr
206memchr:
207 cmpwi 0,r5,0
208 blelr
209 mtctr r5
210 addi r3,r3,-1
2111: lbzu r0,1(r3)
212 cmpw r0,r4
213 beqlr
214 bdnz 1b
215 li r3,0
216 blr
217
218 .globl memcmp
219memcmp:
220 cmpwi 0,r5,0
221 ble 2f
222 mtctr r5
223 addi r6,r3,-1
224 addi r4,r4,-1
2251: lbzu r3,1(r6)
226 lbzu r0,1(r4)
227 subf. r3,r0,r3
228 bdnzt 2,1b
229 blr
2302: li r3,0
231 blr
232
233
234/*
235 * Flush the dcache and invalidate the icache for a range of addresses.
236 *
237 * flush_cache(addr, len)
238 */
239 .global flush_cache
240flush_cache:
241 addi 4,4,0x1f /* len = (len + 0x1f) / 0x20 */
242 rlwinm. 4,4,27,5,31
243 mtctr 4
244 beqlr
2451: dcbf 0,3
246 icbi 0,3
247 addi 3,3,0x20
248 bdnz 1b
249 sync
250 isync
251 blr
252