xref: /linux/arch/powerpc/lib/string.S (revision 2ba9268dd603d23e17643437b2246acb6844953b)
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 <asm/processor.h>
12#include <asm/errno.h>
13#include <asm/ppc_asm.h>
14
15	.section __ex_table,"a"
16	PPC_LONG_ALIGN
17	.text
18
19_GLOBAL(strcpy)
20	addi	r5,r3,-1
21	addi	r4,r4,-1
221:	lbzu	r0,1(r4)
23	cmpwi	0,r0,0
24	stbu	r0,1(r5)
25	bne	1b
26	blr
27
28/* This clears out any unused part of the destination buffer,
29   just as the libc version does.  -- paulus */
30_GLOBAL(strncpy)
31	PPC_LCMPI 0,r5,0
32	beqlr
33	mtctr	r5
34	addi	r6,r3,-1
35	addi	r4,r4,-1
361:	lbzu	r0,1(r4)
37	cmpwi	0,r0,0
38	stbu	r0,1(r6)
39	bdnzf	2,1b		/* dec ctr, branch if ctr != 0 && !cr0.eq */
40	bnelr			/* if we didn't hit a null char, we're done */
41	mfctr	r5
42	PPC_LCMPI 0,r5,0	/* any space left in destination buffer? */
43	beqlr			/* we know r0 == 0 here */
442:	stbu	r0,1(r6)	/* clear it out if so */
45	bdnz	2b
46	blr
47
48_GLOBAL(strcat)
49	addi	r5,r3,-1
50	addi	r4,r4,-1
511:	lbzu	r0,1(r5)
52	cmpwi	0,r0,0
53	bne	1b
54	addi	r5,r5,-1
551:	lbzu	r0,1(r4)
56	cmpwi	0,r0,0
57	stbu	r0,1(r5)
58	bne	1b
59	blr
60
61_GLOBAL(strcmp)
62	addi	r5,r3,-1
63	addi	r4,r4,-1
641:	lbzu	r3,1(r5)
65	cmpwi	1,r3,0
66	lbzu	r0,1(r4)
67	subf.	r3,r0,r3
68	beqlr	1
69	beq	1b
70	blr
71
72_GLOBAL(strncmp)
73	PPC_LCMPI 0,r5,0
74	beq-	2f
75	mtctr	r5
76	addi	r5,r3,-1
77	addi	r4,r4,-1
781:	lbzu	r3,1(r5)
79	cmpwi	1,r3,0
80	lbzu	r0,1(r4)
81	subf.	r3,r0,r3
82	beqlr	1
83	bdnzt	eq,1b
84	blr
852:	li	r3,0
86	blr
87
88_GLOBAL(strlen)
89	addi	r4,r3,-1
901:	lbzu	r0,1(r4)
91	cmpwi	0,r0,0
92	bne	1b
93	subf	r3,r3,r4
94	blr
95
96#ifdef CONFIG_PPC32
97_GLOBAL(memcmp)
98	PPC_LCMPI 0,r5,0
99	beq-	2f
100	mtctr	r5
101	addi	r6,r3,-1
102	addi	r4,r4,-1
1031:	lbzu	r3,1(r6)
104	lbzu	r0,1(r4)
105	subf.	r3,r0,r3
106	bdnzt	2,1b
107	blr
1082:	li	r3,0
109	blr
110#endif
111
112_GLOBAL(memchr)
113	PPC_LCMPI 0,r5,0
114	beq-	2f
115	mtctr	r5
116	addi	r3,r3,-1
1171:	lbzu	r0,1(r3)
118	cmpw	0,r0,r4
119	bdnzf	2,1b
120	beqlr
1212:	li	r3,0
122	blr
123
124#ifdef CONFIG_PPC32
125_GLOBAL(__clear_user)
126	addi	r6,r3,-4
127	li	r3,0
128	li	r5,0
129	cmplwi	0,r4,4
130	blt	7f
131	/* clear a single word */
13211:	stwu	r5,4(r6)
133	beqlr
134	/* clear word sized chunks */
135	andi.	r0,r6,3
136	add	r4,r0,r4
137	subf	r6,r0,r6
138	srwi	r0,r4,2
139	andi.	r4,r4,3
140	mtctr	r0
141	bdz	7f
1421:	stwu	r5,4(r6)
143	bdnz	1b
144	/* clear byte sized chunks */
1457:	cmpwi	0,r4,0
146	beqlr
147	mtctr	r4
148	addi	r6,r6,3
1498:	stbu	r5,1(r6)
150	bdnz	8b
151	blr
15290:	mr	r3,r4
153	blr
15491:	mfctr	r3
155	slwi	r3,r3,2
156	add	r3,r3,r4
157	blr
15892:	mfctr	r3
159	blr
160
161	.section __ex_table,"a"
162	PPC_LONG	11b,90b
163	PPC_LONG	1b,91b
164	PPC_LONG	8b,92b
165	.text
166#endif
167