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