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#define r0	0
12#define r3	3
13#define r4	4
14#define r5	5
15#define r6	6
16#define r7	7
17#define r8	8
18
19	.globl	strlen
20strlen:
21	addi	r4,r3,-1
221:	lbzu	r0,1(r4)
23	cmpwi	0,r0,0
24	bne	1b
25	subf	r3,r3,r4
26	blr
27
28	.globl	memset
29memset:
30	rlwimi	r4,r4,8,16,23
31	rlwimi	r4,r4,16,0,15
32	addi	r6,r3,-4
33	cmplwi	0,r5,4
34	blt	7f
35	stwu	r4,4(r6)
36	beqlr
37	andi.	r0,r6,3
38	add	r5,r0,r5
39	subf	r6,r0,r6
40	rlwinm	r0,r5,32-2,2,31
41	mtctr	r0
42	bdz	6f
431:	stwu	r4,4(r6)
44	bdnz	1b
456:	andi.	r5,r5,3
467:	cmpwi	0,r5,0
47	beqlr
48	mtctr	r5
49	addi	r6,r6,3
508:	stbu	r4,1(r6)
51	bdnz	8b
52	blr
53
54	.globl	memmove
55memmove:
56	cmplw	0,r3,r4
57	bgt	backwards_memcpy
58	/* fall through */
59
60	.globl	memcpy
61memcpy:
62	rlwinm.	r7,r5,32-3,3,31		/* r0 = r5 >> 3 */
63	addi	r6,r3,-4
64	addi	r4,r4,-4
65	beq	2f			/* if less than 8 bytes to do */
66	andi.	r0,r6,3			/* get dest word aligned */
67	mtctr	r7
68	bne	5f
691:	lwz	r7,4(r4)
70	lwzu	r8,8(r4)
71	stw	r7,4(r6)
72	stwu	r8,8(r6)
73	bdnz	1b
74	andi.	r5,r5,7
752:	cmplwi	0,r5,4
76	blt	3f
77	lwzu	r0,4(r4)
78	addi	r5,r5,-4
79	stwu	r0,4(r6)
803:	cmpwi	0,r5,0
81	beqlr
82	mtctr	r5
83	addi	r4,r4,3
84	addi	r6,r6,3
854:	lbzu	r0,1(r4)
86	stbu	r0,1(r6)
87	bdnz	4b
88	blr
895:	subfic	r0,r0,4
90	mtctr	r0
916:	lbz	r7,4(r4)
92	addi	r4,r4,1
93	stb	r7,4(r6)
94	addi	r6,r6,1
95	bdnz	6b
96	subf	r5,r0,r5
97	rlwinm.	r7,r5,32-3,3,31
98	beq	2b
99	mtctr	r7
100	b	1b
101
102	.globl	backwards_memcpy
103backwards_memcpy:
104	rlwinm.	r7,r5,32-3,3,31		/* r0 = r5 >> 3 */
105	add	r6,r3,r5
106	add	r4,r4,r5
107	beq	2f
108	andi.	r0,r6,3
109	mtctr	r7
110	bne	5f
1111:	lwz	r7,-4(r4)
112	lwzu	r8,-8(r4)
113	stw	r7,-4(r6)
114	stwu	r8,-8(r6)
115	bdnz	1b
116	andi.	r5,r5,7
1172:	cmplwi	0,r5,4
118	blt	3f
119	lwzu	r0,-4(r4)
120	subi	r5,r5,4
121	stwu	r0,-4(r6)
1223:	cmpwi	0,r5,0
123	beqlr
124	mtctr	r5
1254:	lbzu	r0,-1(r4)
126	stbu	r0,-1(r6)
127	bdnz	4b
128	blr
1295:	mtctr	r0
1306:	lbzu	r7,-1(r4)
131	stbu	r7,-1(r6)
132	bdnz	6b
133	subf	r5,r0,r5
134	rlwinm.	r7,r5,32-3,3,31
135	beq	2b
136	mtctr	r7
137	b	1b
138
139	.globl	memcmp
140memcmp:
141	cmpwi	0,r5,0
142	blelr
143	mtctr	r5
144	addi	r6,r3,-1
145	addi	r4,r4,-1
1461:	lbzu	r3,1(r6)
147	lbzu	r0,1(r4)
148	subf.	r3,r0,r3
149	bdnzt	2,1b
150	blr
151