xref: /rk3399_rockchip-uboot/arch/powerpc/lib/ppcstring.S (revision 1a4596601fd395f3afb8f82f3f840c5e00bdd57a)
1a47a12beSStefan Roese/*
2a47a12beSStefan Roese * String handling functions for PowerPC.
3a47a12beSStefan Roese *
4a47a12beSStefan Roese * Copyright (C) 1996 Paul Mackerras.
5a47a12beSStefan Roese *
6*1a459660SWolfgang Denk * SPDX-License-Identifier:	GPL-2.0+
7a47a12beSStefan Roese */
8a47a12beSStefan Roese#include <ppc_asm.tmpl>
9a47a12beSStefan Roese#include <asm/errno.h>
10a47a12beSStefan Roese
11a47a12beSStefan Roese	.globl	strcpy
12a47a12beSStefan Roesestrcpy:
13a47a12beSStefan Roese	addi	r5,r3,-1
14a47a12beSStefan Roese	addi	r4,r4,-1
15a47a12beSStefan Roese1:	lbzu	r0,1(r4)
16a47a12beSStefan Roese	cmpwi	0,r0,0
17a47a12beSStefan Roese	stbu	r0,1(r5)
18a47a12beSStefan Roese	bne	1b
19a47a12beSStefan Roese	blr
20a47a12beSStefan Roese
21a47a12beSStefan Roese	.globl	strncpy
22a47a12beSStefan Roesestrncpy:
23a47a12beSStefan Roese	cmpwi	0,r5,0
24a47a12beSStefan Roese	beqlr
25a47a12beSStefan Roese	mtctr	r5
26a47a12beSStefan Roese	addi	r6,r3,-1
27a47a12beSStefan Roese	addi	r4,r4,-1
28a47a12beSStefan Roese1:	lbzu	r0,1(r4)
29a47a12beSStefan Roese	cmpwi	0,r0,0
30a47a12beSStefan Roese	stbu	r0,1(r6)
31a47a12beSStefan Roese	bdnzf	2,1b		/* dec ctr, branch if ctr != 0 && !cr0.eq */
32a47a12beSStefan Roese	blr
33a47a12beSStefan Roese
34a47a12beSStefan Roese	.globl	strcat
35a47a12beSStefan Roesestrcat:
36a47a12beSStefan Roese	addi	r5,r3,-1
37a47a12beSStefan Roese	addi	r4,r4,-1
38a47a12beSStefan Roese1:	lbzu	r0,1(r5)
39a47a12beSStefan Roese	cmpwi	0,r0,0
40a47a12beSStefan Roese	bne	1b
41a47a12beSStefan Roese	addi	r5,r5,-1
42a47a12beSStefan Roese1:	lbzu	r0,1(r4)
43a47a12beSStefan Roese	cmpwi	0,r0,0
44a47a12beSStefan Roese	stbu	r0,1(r5)
45a47a12beSStefan Roese	bne	1b
46a47a12beSStefan Roese	blr
47a47a12beSStefan Roese
48a47a12beSStefan Roese	.globl	strcmp
49a47a12beSStefan Roesestrcmp:
50a47a12beSStefan Roese	addi	r5,r3,-1
51a47a12beSStefan Roese	addi	r4,r4,-1
52a47a12beSStefan Roese1:	lbzu	r3,1(r5)
53a47a12beSStefan Roese	cmpwi	1,r3,0
54a47a12beSStefan Roese	lbzu	r0,1(r4)
55a47a12beSStefan Roese	subf.	r3,r0,r3
56a47a12beSStefan Roese	beqlr	1
57a47a12beSStefan Roese	beq	1b
58a47a12beSStefan Roese	blr
59a47a12beSStefan Roese
60a47a12beSStefan Roese	.globl	strlen
61a47a12beSStefan Roesestrlen:
62a47a12beSStefan Roese	addi	r4,r3,-1
63a47a12beSStefan Roese1:	lbzu	r0,1(r4)
64a47a12beSStefan Roese	cmpwi	0,r0,0
65a47a12beSStefan Roese	bne	1b
66a47a12beSStefan Roese	subf	r3,r3,r4
67a47a12beSStefan Roese	blr
68a47a12beSStefan Roese
69a47a12beSStefan Roese	.globl	memset
70a47a12beSStefan Roesememset:
71a47a12beSStefan Roese	rlwimi	r4,r4,8,16,23
72a47a12beSStefan Roese	rlwimi	r4,r4,16,0,15
73a47a12beSStefan Roese	addi	r6,r3,-4
74a47a12beSStefan Roese	cmplwi	0,r5,4
75a47a12beSStefan Roese	blt	7f
76a47a12beSStefan Roese	stwu	r4,4(r6)
77a47a12beSStefan Roese	beqlr
78a47a12beSStefan Roese	andi.	r0,r6,3
79a47a12beSStefan Roese	add	r5,r0,r5
80a47a12beSStefan Roese	subf	r6,r0,r6
81a47a12beSStefan Roese	rlwinm	r0,r5,32-2,2,31
82a47a12beSStefan Roese	mtctr	r0
83a47a12beSStefan Roese	bdz	6f
84a47a12beSStefan Roese1:	stwu	r4,4(r6)
85a47a12beSStefan Roese	bdnz	1b
86a47a12beSStefan Roese6:	andi.	r5,r5,3
87a47a12beSStefan Roese7:	cmpwi	0,r5,0
88a47a12beSStefan Roese	beqlr
89a47a12beSStefan Roese	mtctr	r5
90a47a12beSStefan Roese	addi	r6,r6,3
91a47a12beSStefan Roese8:	stbu	r4,1(r6)
92a47a12beSStefan Roese	bdnz	8b
93a47a12beSStefan Roese	blr
94a47a12beSStefan Roese
95a47a12beSStefan Roese	.globl	bcopy
96a47a12beSStefan Roesebcopy:
97a47a12beSStefan Roese	mr	r6,r3
98a47a12beSStefan Roese	mr	r3,r4
99a47a12beSStefan Roese	mr	r4,r6
100a47a12beSStefan Roese	b	memcpy
101a47a12beSStefan Roese
102a47a12beSStefan Roese	.globl	memmove
103a47a12beSStefan Roesememmove:
104a47a12beSStefan Roese	cmplw	0,r3,r4
105a47a12beSStefan Roese	bgt	backwards_memcpy
106a47a12beSStefan Roese	/* fall through */
107a47a12beSStefan Roese
108a47a12beSStefan Roese	.globl	memcpy
109a47a12beSStefan Roesememcpy:
110a47a12beSStefan Roese	rlwinm.	r7,r5,32-3,3,31		/* r0 = r5 >> 3 */
111a47a12beSStefan Roese	addi	r6,r3,-4
112a47a12beSStefan Roese	addi	r4,r4,-4
113a47a12beSStefan Roese	beq	2f			/* if less than 8 bytes to do */
114a47a12beSStefan Roese	andi.	r0,r6,3			/* get dest word aligned */
115a47a12beSStefan Roese	mtctr	r7
116a47a12beSStefan Roese	bne	5f
117a47a12beSStefan Roese1:	lwz	r7,4(r4)
118a47a12beSStefan Roese	lwzu	r8,8(r4)
119a47a12beSStefan Roese	stw	r7,4(r6)
120a47a12beSStefan Roese	stwu	r8,8(r6)
121a47a12beSStefan Roese	bdnz	1b
122a47a12beSStefan Roese	andi.	r5,r5,7
123a47a12beSStefan Roese2:	cmplwi	0,r5,4
124a47a12beSStefan Roese	blt	3f
125a47a12beSStefan Roese	lwzu	r0,4(r4)
126a47a12beSStefan Roese	addi	r5,r5,-4
127a47a12beSStefan Roese	stwu	r0,4(r6)
128a47a12beSStefan Roese3:	cmpwi	0,r5,0
129a47a12beSStefan Roese	beqlr
130a47a12beSStefan Roese	mtctr	r5
131a47a12beSStefan Roese	addi	r4,r4,3
132a47a12beSStefan Roese	addi	r6,r6,3
133a47a12beSStefan Roese4:	lbzu	r0,1(r4)
134a47a12beSStefan Roese	stbu	r0,1(r6)
135a47a12beSStefan Roese	bdnz	4b
136a47a12beSStefan Roese	blr
137a47a12beSStefan Roese5:	subfic	r0,r0,4
138a47a12beSStefan Roese	mtctr	r0
139a47a12beSStefan Roese6:	lbz	r7,4(r4)
140a47a12beSStefan Roese	addi	r4,r4,1
141a47a12beSStefan Roese	stb	r7,4(r6)
142a47a12beSStefan Roese	addi	r6,r6,1
143a47a12beSStefan Roese	bdnz	6b
144a47a12beSStefan Roese	subf	r5,r0,r5
145a47a12beSStefan Roese	rlwinm.	r7,r5,32-3,3,31
146a47a12beSStefan Roese	beq	2b
147a47a12beSStefan Roese	mtctr	r7
148a47a12beSStefan Roese	b	1b
149a47a12beSStefan Roese
150a47a12beSStefan Roese	.globl	backwards_memcpy
151a47a12beSStefan Roesebackwards_memcpy:
152a47a12beSStefan Roese	rlwinm.	r7,r5,32-3,3,31		/* r0 = r5 >> 3 */
153a47a12beSStefan Roese	add	r6,r3,r5
154a47a12beSStefan Roese	add	r4,r4,r5
155a47a12beSStefan Roese	beq	2f
156a47a12beSStefan Roese	andi.	r0,r6,3
157a47a12beSStefan Roese	mtctr	r7
158a47a12beSStefan Roese	bne	5f
159a47a12beSStefan Roese1:	lwz	r7,-4(r4)
160a47a12beSStefan Roese	lwzu	r8,-8(r4)
161a47a12beSStefan Roese	stw	r7,-4(r6)
162a47a12beSStefan Roese	stwu	r8,-8(r6)
163a47a12beSStefan Roese	bdnz	1b
164a47a12beSStefan Roese	andi.	r5,r5,7
165a47a12beSStefan Roese2:	cmplwi	0,r5,4
166a47a12beSStefan Roese	blt	3f
167a47a12beSStefan Roese	lwzu	r0,-4(r4)
168a47a12beSStefan Roese	subi	r5,r5,4
169a47a12beSStefan Roese	stwu	r0,-4(r6)
170a47a12beSStefan Roese3:	cmpwi	0,r5,0
171a47a12beSStefan Roese	beqlr
172a47a12beSStefan Roese	mtctr	r5
173a47a12beSStefan Roese4:	lbzu	r0,-1(r4)
174a47a12beSStefan Roese	stbu	r0,-1(r6)
175a47a12beSStefan Roese	bdnz	4b
176a47a12beSStefan Roese	blr
177a47a12beSStefan Roese5:	mtctr	r0
178a47a12beSStefan Roese6:	lbzu	r7,-1(r4)
179a47a12beSStefan Roese	stbu	r7,-1(r6)
180a47a12beSStefan Roese	bdnz	6b
181a47a12beSStefan Roese	subf	r5,r0,r5
182a47a12beSStefan Roese	rlwinm.	r7,r5,32-3,3,31
183a47a12beSStefan Roese	beq	2b
184a47a12beSStefan Roese	mtctr	r7
185a47a12beSStefan Roese	b	1b
186a47a12beSStefan Roese
187a47a12beSStefan Roese	.globl	memcmp
188a47a12beSStefan Roesememcmp:
189a47a12beSStefan Roese	cmpwi	0,r5,0
190a47a12beSStefan Roese	ble-	2f
191a47a12beSStefan Roese	mtctr	r5
192a47a12beSStefan Roese	addi	r6,r3,-1
193a47a12beSStefan Roese	addi	r4,r4,-1
194a47a12beSStefan Roese1:	lbzu	r3,1(r6)
195a47a12beSStefan Roese	lbzu	r0,1(r4)
196a47a12beSStefan Roese	subf.	r3,r0,r3
197a47a12beSStefan Roese	bdnzt	2,1b
198a47a12beSStefan Roese	blr
199a47a12beSStefan Roese2:	li	r3,0
200a47a12beSStefan Roese	blr
201a47a12beSStefan Roese
202a47a12beSStefan Roese	.global	memchr
203a47a12beSStefan Roesememchr:
204a47a12beSStefan Roese	cmpwi	0,r5,0
205a47a12beSStefan Roese	ble-	2f
206a47a12beSStefan Roese	mtctr	r5
207a47a12beSStefan Roese	addi	r3,r3,-1
208a47a12beSStefan Roese1:	lbzu	r0,1(r3)
209a47a12beSStefan Roese	cmpw	0,r0,r4
210a47a12beSStefan Roese	bdnzf	2,1b
211a47a12beSStefan Roese	beqlr
212a47a12beSStefan Roese2:	li	r3,0
213a47a12beSStefan Roese	blr
214