xref: /linux/arch/powerpc/lib/mem_64.S (revision 4f58e6dceb0e44ca8f21568ed81e1df24e55964c)
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_GLOBAL(memset)
16	neg	r0,r3
17	rlwimi	r4,r4,8,16,23
18	andi.	r0,r0,7			/* # bytes to be 8-byte aligned */
19	rlwimi	r4,r4,16,0,15
20	cmplw	cr1,r5,r0		/* do we get that far? */
21	rldimi	r4,r4,32,0
22	PPC_MTOCRF(1,r0)
23	mr	r6,r3
24	blt	cr1,8f
25	beq+	3f			/* if already 8-byte aligned */
26	subf	r5,r0,r5
27	bf	31,1f
28	stb	r4,0(r6)
29	addi	r6,r6,1
301:	bf	30,2f
31	sth	r4,0(r6)
32	addi	r6,r6,2
332:	bf	29,3f
34	stw	r4,0(r6)
35	addi	r6,r6,4
363:	srdi.	r0,r5,6
37	clrldi	r5,r5,58
38	mtctr	r0
39	beq	5f
40	.balign 16
414:	std	r4,0(r6)
42	std	r4,8(r6)
43	std	r4,16(r6)
44	std	r4,24(r6)
45	std	r4,32(r6)
46	std	r4,40(r6)
47	std	r4,48(r6)
48	std	r4,56(r6)
49	addi	r6,r6,64
50	bdnz	4b
515:	srwi.	r0,r5,3
52	clrlwi	r5,r5,29
53	PPC_MTOCRF(1,r0)
54	beq	8f
55	bf	29,6f
56	std	r4,0(r6)
57	std	r4,8(r6)
58	std	r4,16(r6)
59	std	r4,24(r6)
60	addi	r6,r6,32
616:	bf	30,7f
62	std	r4,0(r6)
63	std	r4,8(r6)
64	addi	r6,r6,16
657:	bf	31,8f
66	std	r4,0(r6)
67	addi	r6,r6,8
688:	cmpwi	r5,0
69	PPC_MTOCRF(1,r5)
70	beqlr+
71	bf	29,9f
72	stw	r4,0(r6)
73	addi	r6,r6,4
749:	bf	30,10f
75	sth	r4,0(r6)
76	addi	r6,r6,2
7710:	bflr	31
78	stb	r4,0(r6)
79	blr
80
81_GLOBAL_TOC(memmove)
82	cmplw	0,r3,r4
83	bgt	backwards_memcpy
84	b	memcpy
85
86_GLOBAL(backwards_memcpy)
87	rlwinm.	r7,r5,32-3,3,31		/* r0 = r5 >> 3 */
88	add	r6,r3,r5
89	add	r4,r4,r5
90	beq	2f
91	andi.	r0,r6,3
92	mtctr	r7
93	bne	5f
94	.balign 16
951:	lwz	r7,-4(r4)
96	lwzu	r8,-8(r4)
97	stw	r7,-4(r6)
98	stwu	r8,-8(r6)
99	bdnz	1b
100	andi.	r5,r5,7
1012:	cmplwi	0,r5,4
102	blt	3f
103	lwzu	r0,-4(r4)
104	subi	r5,r5,4
105	stwu	r0,-4(r6)
1063:	cmpwi	0,r5,0
107	beqlr
108	mtctr	r5
1094:	lbzu	r0,-1(r4)
110	stbu	r0,-1(r6)
111	bdnz	4b
112	blr
1135:	mtctr	r0
1146:	lbzu	r7,-1(r4)
115	stbu	r7,-1(r6)
116	bdnz	6b
117	subf	r5,r0,r5
118	rlwinm.	r7,r5,32-3,3,31
119	beq	2b
120	mtctr	r7
121	b	1b
122