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
15strcpy:
16	addi	r5,r3,-1
17	addi	r4,r4,-1
181:	lbzu	r0,1(r4)
19	cmpwi	0,r0,0
20	stbu	r0,1(r5)
21	bne	1b
22	blr
23
24	.globl	strncpy
25strncpy:
26	cmpwi	0,r5,0
27	beqlr
28	mtctr	r5
29	addi	r6,r3,-1
30	addi	r4,r4,-1
311:	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
38strcat:
39	addi	r5,r3,-1
40	addi	r4,r4,-1
411:	lbzu	r0,1(r5)
42	cmpwi	0,r0,0
43	bne	1b
44	addi	r5,r5,-1
451:	lbzu	r0,1(r4)
46	cmpwi	0,r0,0
47	stbu	r0,1(r5)
48	bne	1b
49	blr
50
51	.globl	strlen
52strlen:
53	addi	r4,r3,-1
541:	lbzu	r0,1(r4)
55	cmpwi	0,r0,0
56	bne	1b
57	subf	r3,r3,r4
58	blr
59
60	.globl	memset
61memset:
62	rlwimi	r4,r4,8,16,23
63	rlwimi	r4,r4,16,0,15
64	addi	r6,r3,-4
65	cmplwi	0,r5,4
66	blt	7f
67	stwu	r4,4(r6)
68	beqlr
69	andi.	r0,r6,3
70	add	r5,r0,r5
71	subf	r6,r0,r6
72	rlwinm	r0,r5,32-2,2,31
73	mtctr	r0
74	bdz	6f
751:	stwu	r4,4(r6)
76	bdnz	1b
776:	andi.	r5,r5,3
787:	cmpwi	0,r5,0
79	beqlr
80	mtctr	r5
81	addi	r6,r6,3
828:	stbu	r4,1(r6)
83	bdnz	8b
84	blr
85
86	.globl	bcopy
87bcopy:
88	mr	r6,r3
89	mr	r3,r4
90	mr	r4,r6
91	b	memcpy
92
93	.globl	memmove
94memmove:
95	cmplw	0,r3,r4
96	bgt	backwards_memcpy
97	/* fall through */
98
99	.globl	memcpy
100memcpy:
101	rlwinm.	r7,r5,32-3,3,31		/* r0 = r5 >> 3 */
102	addi	r6,r3,-4
103	addi	r4,r4,-4
104	beq	2f			/* if less than 8 bytes to do */
105	andi.	r0,r6,3			/* get dest word aligned */
106	mtctr	r7
107	bne	5f
1081:	lwz	r7,4(r4)
109	lwzu	r8,8(r4)
110	stw	r7,4(r6)
111	stwu	r8,8(r6)
112	bdnz	1b
113	andi.	r5,r5,7
1142:	cmplwi	0,r5,4
115	blt	3f
116	lwzu	r0,4(r4)
117	addi	r5,r5,-4
118	stwu	r0,4(r6)
1193:	cmpwi	0,r5,0
120	beqlr
121	mtctr	r5
122	addi	r4,r4,3
123	addi	r6,r6,3
1244:	lbzu	r0,1(r4)
125	stbu	r0,1(r6)
126	bdnz	4b
127	blr
1285:	subfic	r0,r0,4
129	mtctr	r0
1306:	lbz	r7,4(r4)
131	addi	r4,r4,1
132	stb	r7,4(r6)
133	addi	r6,r6,1
134	bdnz	6b
135	subf	r5,r0,r5
136	rlwinm.	r7,r5,32-3,3,31
137	beq	2b
138	mtctr	r7
139	b	1b
140
141	.globl	backwards_memcpy
142backwards_memcpy:
143	rlwinm.	r7,r5,32-3,3,31		/* r0 = r5 >> 3 */
144	add	r6,r3,r5
145	add	r4,r4,r5
146	beq	2f
147	andi.	r0,r6,3
148	mtctr	r7
149	bne	5f
1501:	lwz	r7,-4(r4)
151	lwzu	r8,-8(r4)
152	stw	r7,-4(r6)
153	stwu	r8,-8(r6)
154	bdnz	1b
155	andi.	r5,r5,7
1562:	cmplwi	0,r5,4
157	blt	3f
158	lwzu	r0,-4(r4)
159	subi	r5,r5,4
160	stwu	r0,-4(r6)
1613:	cmpwi	0,r5,0
162	beqlr
163	mtctr	r5
1644:	lbzu	r0,-1(r4)
165	stbu	r0,-1(r6)
166	bdnz	4b
167	blr
1685:	mtctr	r0
1696:	lbzu	r7,-1(r4)
170	stbu	r7,-1(r6)
171	bdnz	6b
172	subf	r5,r0,r5
173	rlwinm.	r7,r5,32-3,3,31
174	beq	2b
175	mtctr	r7
176	b	1b
177
178	.globl	memcmp
179memcmp:
180	cmpwi	0,r5,0
181	ble-	2f
182	mtctr	r5
183	addi	r6,r3,-1
184	addi	r4,r4,-1
1851:	lbzu	r3,1(r6)
186	lbzu	r0,1(r4)
187	subf.	r3,r0,r3
188	bdnzt	2,1b
189	blr
1902:	li	r3,0
191	blr
192
193	.global	memchr
194memchr:
195	cmpwi	0,r5,0
196	ble-	2f
197	mtctr	r5
198	addi	r3,r3,-1
1991:	lbzu	r0,1(r3)
200	cmpw	0,r0,r4
201	bdnzf	2,1b
202	beqlr
2032:	li	r3,0
204	blr
205