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