xref: /openbmc/u-boot/arch/powerpc/lib/ppcstring.S (revision 23ff8633)
1/*
2 * String handling functions for PowerPC.
3 *
4 * Copyright (C) 1996 Paul Mackerras.
5 *
6 * SPDX-License-Identifier:	GPL-2.0+
7 */
8#include <ppc_asm.tmpl>
9#include <asm/errno.h>
10
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	strncpy
22strncpy:
23	cmpwi	0,r5,0
24	beqlr
25	mtctr	r5
26	addi	r6,r3,-1
27	addi	r4,r4,-1
281:	lbzu	r0,1(r4)
29	cmpwi	0,r0,0
30	stbu	r0,1(r6)
31	bdnzf	2,1b		/* dec ctr, branch if ctr != 0 && !cr0.eq */
32	blr
33
34	.globl	strcat
35strcat:
36	addi	r5,r3,-1
37	addi	r4,r4,-1
381:	lbzu	r0,1(r5)
39	cmpwi	0,r0,0
40	bne	1b
41	addi	r5,r5,-1
421:	lbzu	r0,1(r4)
43	cmpwi	0,r0,0
44	stbu	r0,1(r5)
45	bne	1b
46	blr
47
48	.globl	strcmp
49strcmp:
50	addi	r5,r3,-1
51	addi	r4,r4,-1
521:	lbzu	r3,1(r5)
53	cmpwi	1,r3,0
54	lbzu	r0,1(r4)
55	subf.	r3,r0,r3
56	beqlr	1
57	beq	1b
58	blr
59
60	.globl	strlen
61strlen:
62	addi	r4,r3,-1
631:	lbzu	r0,1(r4)
64	cmpwi	0,r0,0
65	bne	1b
66	subf	r3,r3,r4
67	blr
68
69	.globl	memset
70memset:
71	rlwimi	r4,r4,8,16,23
72	rlwimi	r4,r4,16,0,15
73	addi	r6,r3,-4
74	cmplwi	0,r5,4
75	blt	7f
76	stwu	r4,4(r6)
77	beqlr
78	andi.	r0,r6,3
79	add	r5,r0,r5
80	subf	r6,r0,r6
81	rlwinm	r0,r5,32-2,2,31
82	mtctr	r0
83	bdz	6f
841:	stwu	r4,4(r6)
85	bdnz	1b
866:	andi.	r5,r5,3
877:	cmpwi	0,r5,0
88	beqlr
89	mtctr	r5
90	addi	r6,r6,3
918:	stbu	r4,1(r6)
92	bdnz	8b
93	blr
94
95	.globl	bcopy
96bcopy:
97	mr	r6,r3
98	mr	r3,r4
99	mr	r4,r6
100	b	memcpy
101
102	.globl	memmove
103memmove:
104	cmplw	0,r3,r4
105	bgt	backwards_memcpy
106	/* fall through */
107
108	.globl	memcpy
109memcpy:
110	rlwinm.	r7,r5,32-3,3,31		/* r0 = r5 >> 3 */
111	addi	r6,r3,-4
112	addi	r4,r4,-4
113	beq	2f			/* if less than 8 bytes to do */
114	andi.	r0,r6,3			/* get dest word aligned */
115	mtctr	r7
116	bne	5f
1171:	lwz	r7,4(r4)
118	lwzu	r8,8(r4)
119	stw	r7,4(r6)
120	stwu	r8,8(r6)
121	bdnz	1b
122	andi.	r5,r5,7
1232:	cmplwi	0,r5,4
124	blt	3f
125	lwzu	r0,4(r4)
126	addi	r5,r5,-4
127	stwu	r0,4(r6)
1283:	cmpwi	0,r5,0
129	beqlr
130	mtctr	r5
131	addi	r4,r4,3
132	addi	r6,r6,3
1334:	lbzu	r0,1(r4)
134	stbu	r0,1(r6)
135	bdnz	4b
136	blr
1375:	subfic	r0,r0,4
138	mtctr	r0
1396:	lbz	r7,4(r4)
140	addi	r4,r4,1
141	stb	r7,4(r6)
142	addi	r6,r6,1
143	bdnz	6b
144	subf	r5,r0,r5
145	rlwinm.	r7,r5,32-3,3,31
146	beq	2b
147	mtctr	r7
148	b	1b
149
150	.globl	backwards_memcpy
151backwards_memcpy:
152	rlwinm.	r7,r5,32-3,3,31		/* r0 = r5 >> 3 */
153	add	r6,r3,r5
154	add	r4,r4,r5
155	beq	2f
156	andi.	r0,r6,3
157	mtctr	r7
158	bne	5f
1591:	lwz	r7,-4(r4)
160	lwzu	r8,-8(r4)
161	stw	r7,-4(r6)
162	stwu	r8,-8(r6)
163	bdnz	1b
164	andi.	r5,r5,7
1652:	cmplwi	0,r5,4
166	blt	3f
167	lwzu	r0,-4(r4)
168	subi	r5,r5,4
169	stwu	r0,-4(r6)
1703:	cmpwi	0,r5,0
171	beqlr
172	mtctr	r5
1734:	lbzu	r0,-1(r4)
174	stbu	r0,-1(r6)
175	bdnz	4b
176	blr
1775:	mtctr	r0
1786:	lbzu	r7,-1(r4)
179	stbu	r7,-1(r6)
180	bdnz	6b
181	subf	r5,r0,r5
182	rlwinm.	r7,r5,32-3,3,31
183	beq	2b
184	mtctr	r7
185	b	1b
186
187	.globl	memcmp
188memcmp:
189	cmpwi	0,r5,0
190	ble-	2f
191	mtctr	r5
192	addi	r6,r3,-1
193	addi	r4,r4,-1
1941:	lbzu	r3,1(r6)
195	lbzu	r0,1(r4)
196	subf.	r3,r0,r3
197	bdnzt	2,1b
198	blr
1992:	li	r3,0
200	blr
201
202	.global	memchr
203memchr:
204	cmpwi	0,r5,0
205	ble-	2f
206	mtctr	r5
207	addi	r3,r3,-1
2081:	lbzu	r0,1(r3)
209	cmpw	0,r0,r4
210	bdnzf	2,1b
211	beqlr
2122:	li	r3,0
213	blr
214