xref: /rk3399_rockchip-uboot/arch/powerpc/lib/ppcstring.S (revision 1221ce459d04a428f8880f58581f671b736c3c27)
1a47a12beSStefan Roese/*
2a47a12beSStefan Roese * String handling functions for PowerPC.
3a47a12beSStefan Roese *
4a47a12beSStefan Roese * Copyright (C) 1996 Paul Mackerras.
5a47a12beSStefan Roese *
61a459660SWolfgang Denk * SPDX-License-Identifier:	GPL-2.0+
7a47a12beSStefan Roese */
8a47a12beSStefan Roese#include <ppc_asm.tmpl>
9*1221ce45SMasahiro Yamada#include <linux/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	memmove
96a47a12beSStefan Roesememmove:
97a47a12beSStefan Roese	cmplw	0,r3,r4
98a47a12beSStefan Roese	bgt	backwards_memcpy
99a47a12beSStefan Roese	/* fall through */
100a47a12beSStefan Roese
101a47a12beSStefan Roese	.globl	memcpy
102a47a12beSStefan Roesememcpy:
103a47a12beSStefan Roese	rlwinm.	r7,r5,32-3,3,31		/* r0 = r5 >> 3 */
104a47a12beSStefan Roese	addi	r6,r3,-4
105a47a12beSStefan Roese	addi	r4,r4,-4
106a47a12beSStefan Roese	beq	2f			/* if less than 8 bytes to do */
107a47a12beSStefan Roese	andi.	r0,r6,3			/* get dest word aligned */
108a47a12beSStefan Roese	mtctr	r7
109a47a12beSStefan Roese	bne	5f
110a47a12beSStefan Roese1:	lwz	r7,4(r4)
111a47a12beSStefan Roese	lwzu	r8,8(r4)
112a47a12beSStefan Roese	stw	r7,4(r6)
113a47a12beSStefan Roese	stwu	r8,8(r6)
114a47a12beSStefan Roese	bdnz	1b
115a47a12beSStefan Roese	andi.	r5,r5,7
116a47a12beSStefan Roese2:	cmplwi	0,r5,4
117a47a12beSStefan Roese	blt	3f
118a47a12beSStefan Roese	lwzu	r0,4(r4)
119a47a12beSStefan Roese	addi	r5,r5,-4
120a47a12beSStefan Roese	stwu	r0,4(r6)
121a47a12beSStefan Roese3:	cmpwi	0,r5,0
122a47a12beSStefan Roese	beqlr
123a47a12beSStefan Roese	mtctr	r5
124a47a12beSStefan Roese	addi	r4,r4,3
125a47a12beSStefan Roese	addi	r6,r6,3
126a47a12beSStefan Roese4:	lbzu	r0,1(r4)
127a47a12beSStefan Roese	stbu	r0,1(r6)
128a47a12beSStefan Roese	bdnz	4b
129a47a12beSStefan Roese	blr
130a47a12beSStefan Roese5:	subfic	r0,r0,4
131a47a12beSStefan Roese	mtctr	r0
132a47a12beSStefan Roese6:	lbz	r7,4(r4)
133a47a12beSStefan Roese	addi	r4,r4,1
134a47a12beSStefan Roese	stb	r7,4(r6)
135a47a12beSStefan Roese	addi	r6,r6,1
136a47a12beSStefan Roese	bdnz	6b
137a47a12beSStefan Roese	subf	r5,r0,r5
138a47a12beSStefan Roese	rlwinm.	r7,r5,32-3,3,31
139a47a12beSStefan Roese	beq	2b
140a47a12beSStefan Roese	mtctr	r7
141a47a12beSStefan Roese	b	1b
142a47a12beSStefan Roese
143a47a12beSStefan Roese	.globl	backwards_memcpy
144a47a12beSStefan Roesebackwards_memcpy:
145a47a12beSStefan Roese	rlwinm.	r7,r5,32-3,3,31		/* r0 = r5 >> 3 */
146a47a12beSStefan Roese	add	r6,r3,r5
147a47a12beSStefan Roese	add	r4,r4,r5
148a47a12beSStefan Roese	beq	2f
149a47a12beSStefan Roese	andi.	r0,r6,3
150a47a12beSStefan Roese	mtctr	r7
151a47a12beSStefan Roese	bne	5f
152a47a12beSStefan Roese1:	lwz	r7,-4(r4)
153a47a12beSStefan Roese	lwzu	r8,-8(r4)
154a47a12beSStefan Roese	stw	r7,-4(r6)
155a47a12beSStefan Roese	stwu	r8,-8(r6)
156a47a12beSStefan Roese	bdnz	1b
157a47a12beSStefan Roese	andi.	r5,r5,7
158a47a12beSStefan Roese2:	cmplwi	0,r5,4
159a47a12beSStefan Roese	blt	3f
160a47a12beSStefan Roese	lwzu	r0,-4(r4)
161a47a12beSStefan Roese	subi	r5,r5,4
162a47a12beSStefan Roese	stwu	r0,-4(r6)
163a47a12beSStefan Roese3:	cmpwi	0,r5,0
164a47a12beSStefan Roese	beqlr
165a47a12beSStefan Roese	mtctr	r5
166a47a12beSStefan Roese4:	lbzu	r0,-1(r4)
167a47a12beSStefan Roese	stbu	r0,-1(r6)
168a47a12beSStefan Roese	bdnz	4b
169a47a12beSStefan Roese	blr
170a47a12beSStefan Roese5:	mtctr	r0
171a47a12beSStefan Roese6:	lbzu	r7,-1(r4)
172a47a12beSStefan Roese	stbu	r7,-1(r6)
173a47a12beSStefan Roese	bdnz	6b
174a47a12beSStefan Roese	subf	r5,r0,r5
175a47a12beSStefan Roese	rlwinm.	r7,r5,32-3,3,31
176a47a12beSStefan Roese	beq	2b
177a47a12beSStefan Roese	mtctr	r7
178a47a12beSStefan Roese	b	1b
179a47a12beSStefan Roese
180a47a12beSStefan Roese	.globl	memcmp
181a47a12beSStefan Roesememcmp:
182a47a12beSStefan Roese	cmpwi	0,r5,0
183a47a12beSStefan Roese	ble-	2f
184a47a12beSStefan Roese	mtctr	r5
185a47a12beSStefan Roese	addi	r6,r3,-1
186a47a12beSStefan Roese	addi	r4,r4,-1
187a47a12beSStefan Roese1:	lbzu	r3,1(r6)
188a47a12beSStefan Roese	lbzu	r0,1(r4)
189a47a12beSStefan Roese	subf.	r3,r0,r3
190a47a12beSStefan Roese	bdnzt	2,1b
191a47a12beSStefan Roese	blr
192a47a12beSStefan Roese2:	li	r3,0
193a47a12beSStefan Roese	blr
194a47a12beSStefan Roese
195a47a12beSStefan Roese	.global	memchr
196a47a12beSStefan Roesememchr:
197a47a12beSStefan Roese	cmpwi	0,r5,0
198a47a12beSStefan Roese	ble-	2f
199a47a12beSStefan Roese	mtctr	r5
200a47a12beSStefan Roese	addi	r3,r3,-1
201a47a12beSStefan Roese1:	lbzu	r0,1(r3)
202a47a12beSStefan Roese	cmpw	0,r0,r4
203a47a12beSStefan Roese	bdnzf	2,1b
204a47a12beSStefan Roese	beqlr
205a47a12beSStefan Roese2:	li	r3,0
206a47a12beSStefan Roese	blr
207