xref: /linux/arch/powerpc/boot/string.S (revision 079a028d6327e68cfa5d38b36123637b321c19a7)
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
253