xref: /linux/arch/powerpc/lib/mem_64.S (revision 307797159ac25fe5a2048bf5c6a5718298edca57)
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_GLOBAL(__memset16)
17	rlwimi	r4,r4,16,0,15
18	/* fall through */
19
20_GLOBAL(__memset32)
21	rldimi	r4,r4,32,0
22	/* fall through */
23
24_GLOBAL(__memset64)
25	neg	r0,r3
26	andi.	r0,r0,7
27	cmplw	cr1,r5,r0
28	b	.Lms
29EXPORT_SYMBOL(__memset16)
30EXPORT_SYMBOL(__memset32)
31EXPORT_SYMBOL(__memset64)
32
33_GLOBAL(memset)
34	neg	r0,r3
35	rlwimi	r4,r4,8,16,23
36	andi.	r0,r0,7			/* # bytes to be 8-byte aligned */
37	rlwimi	r4,r4,16,0,15
38	cmplw	cr1,r5,r0		/* do we get that far? */
39	rldimi	r4,r4,32,0
40.Lms:	PPC_MTOCRF(1,r0)
41	mr	r6,r3
42	blt	cr1,8f
43	beq+	3f			/* if already 8-byte aligned */
44	subf	r5,r0,r5
45	bf	31,1f
46	stb	r4,0(r6)
47	addi	r6,r6,1
481:	bf	30,2f
49	sth	r4,0(r6)
50	addi	r6,r6,2
512:	bf	29,3f
52	stw	r4,0(r6)
53	addi	r6,r6,4
543:	srdi.	r0,r5,6
55	clrldi	r5,r5,58
56	mtctr	r0
57	beq	5f
58	.balign 16
594:	std	r4,0(r6)
60	std	r4,8(r6)
61	std	r4,16(r6)
62	std	r4,24(r6)
63	std	r4,32(r6)
64	std	r4,40(r6)
65	std	r4,48(r6)
66	std	r4,56(r6)
67	addi	r6,r6,64
68	bdnz	4b
695:	srwi.	r0,r5,3
70	clrlwi	r5,r5,29
71	PPC_MTOCRF(1,r0)
72	beq	8f
73	bf	29,6f
74	std	r4,0(r6)
75	std	r4,8(r6)
76	std	r4,16(r6)
77	std	r4,24(r6)
78	addi	r6,r6,32
796:	bf	30,7f
80	std	r4,0(r6)
81	std	r4,8(r6)
82	addi	r6,r6,16
837:	bf	31,8f
84	std	r4,0(r6)
85	addi	r6,r6,8
868:	cmpwi	r5,0
87	PPC_MTOCRF(1,r5)
88	beqlr+
89	bf	29,9f
90	stw	r4,0(r6)
91	addi	r6,r6,4
929:	bf	30,10f
93	sth	r4,0(r6)
94	addi	r6,r6,2
9510:	bflr	31
96	stb	r4,0(r6)
97	blr
98EXPORT_SYMBOL(memset)
99
100_GLOBAL_TOC(memmove)
101	cmplw	0,r3,r4
102	bgt	backwards_memcpy
103	b	memcpy
104
105_GLOBAL(backwards_memcpy)
106	rlwinm.	r7,r5,32-3,3,31		/* r0 = r5 >> 3 */
107	add	r6,r3,r5
108	add	r4,r4,r5
109	beq	2f
110	andi.	r0,r6,3
111	mtctr	r7
112	bne	5f
113	.balign 16
1141:	lwz	r7,-4(r4)
115	lwzu	r8,-8(r4)
116	stw	r7,-4(r6)
117	stwu	r8,-8(r6)
118	bdnz	1b
119	andi.	r5,r5,7
1202:	cmplwi	0,r5,4
121	blt	3f
122	lwzu	r0,-4(r4)
123	subi	r5,r5,4
124	stwu	r0,-4(r6)
1253:	cmpwi	0,r5,0
126	beqlr
127	mtctr	r5
1284:	lbzu	r0,-1(r4)
129	stbu	r0,-1(r6)
130	bdnz	4b
131	blr
1325:	mtctr	r0
1336:	lbzu	r7,-1(r4)
134	stbu	r7,-1(r6)
135	bdnz	6b
136	subf	r5,r0,r5
137	rlwinm.	r7,r5,32-3,3,31
138	beq	2b
139	mtctr	r7
140	b	1b
141EXPORT_SYMBOL(memmove)
142