xref: /linux/arch/powerpc/lib/string.S (revision 905e46acd3272d04566fec49afbd7ad9e2ed9ae3)
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#include <asm/export.h>
15
16	.text
17
18/* This clears out any unused part of the destination buffer,
19   just as the libc version does.  -- paulus */
20_GLOBAL(strncpy)
21	PPC_LCMPI 0,r5,0
22	beqlr
23	mtctr	r5
24	addi	r6,r3,-1
25	addi	r4,r4,-1
26	.balign 16
271:	lbzu	r0,1(r4)
28	cmpwi	0,r0,0
29	stbu	r0,1(r6)
30	bdnzf	2,1b		/* dec ctr, branch if ctr != 0 && !cr0.eq */
31	bnelr			/* if we didn't hit a null char, we're done */
32	mfctr	r5
33	PPC_LCMPI 0,r5,0	/* any space left in destination buffer? */
34	beqlr			/* we know r0 == 0 here */
352:	stbu	r0,1(r6)	/* clear it out if so */
36	bdnz	2b
37	blr
38EXPORT_SYMBOL(strncpy)
39
40_GLOBAL(strncmp)
41	PPC_LCMPI 0,r5,0
42	beq-	2f
43	mtctr	r5
44	addi	r5,r3,-1
45	addi	r4,r4,-1
46	.balign 16
471:	lbzu	r3,1(r5)
48	cmpwi	1,r3,0
49	lbzu	r0,1(r4)
50	subf.	r3,r0,r3
51	beqlr	1
52	bdnzt	eq,1b
53	blr
542:	li	r3,0
55	blr
56EXPORT_SYMBOL(strncmp)
57
58#ifdef CONFIG_PPC32
59_GLOBAL(memcmp)
60	PPC_LCMPI 0,r5,0
61	beq-	2f
62	mtctr	r5
63	addi	r6,r3,-1
64	addi	r4,r4,-1
651:	lbzu	r3,1(r6)
66	lbzu	r0,1(r4)
67	subf.	r3,r0,r3
68	bdnzt	2,1b
69	blr
702:	li	r3,0
71	blr
72EXPORT_SYMBOL(memcmp)
73#endif
74
75_GLOBAL(memchr)
76	PPC_LCMPI 0,r5,0
77	beq-	2f
78	mtctr	r5
79	addi	r3,r3,-1
80	.balign 16
811:	lbzu	r0,1(r3)
82	cmpw	0,r0,r4
83	bdnzf	2,1b
84	beqlr
852:	li	r3,0
86	blr
87EXPORT_SYMBOL(memchr)
88
89#ifdef CONFIG_PPC32
90_GLOBAL(__clear_user)
91	addi	r6,r3,-4
92	li	r3,0
93	li	r5,0
94	cmplwi	0,r4,4
95	blt	7f
96	/* clear a single word */
9711:	stwu	r5,4(r6)
98	beqlr
99	/* clear word sized chunks */
100	andi.	r0,r6,3
101	add	r4,r0,r4
102	subf	r6,r0,r6
103	srwi	r0,r4,2
104	andi.	r4,r4,3
105	mtctr	r0
106	bdz	7f
1071:	stwu	r5,4(r6)
108	bdnz	1b
109	/* clear byte sized chunks */
1107:	cmpwi	0,r4,0
111	beqlr
112	mtctr	r4
113	addi	r6,r6,3
1148:	stbu	r5,1(r6)
115	bdnz	8b
116	blr
11790:	mr	r3,r4
118	blr
11991:	mfctr	r3
120	slwi	r3,r3,2
121	add	r3,r3,r4
122	blr
12392:	mfctr	r3
124	blr
125
126	EX_TABLE(11b, 90b)
127	EX_TABLE(1b, 91b)
128	EX_TABLE(8b, 92b)
129
130EXPORT_SYMBOL(__clear_user)
131#endif
132