xref: /linux/arch/powerpc/lib/mem_64.S (revision e5c86679d5e864947a52fb31e45a425dea3e7fa9)
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(memset)
17	neg	r0,r3
18	rlwimi	r4,r4,8,16,23
19	andi.	r0,r0,7			/* # bytes to be 8-byte aligned */
20	rlwimi	r4,r4,16,0,15
21	cmplw	cr1,r5,r0		/* do we get that far? */
22	rldimi	r4,r4,32,0
23	PPC_MTOCRF(1,r0)
24	mr	r6,r3
25	blt	cr1,8f
26	beq+	3f			/* if already 8-byte aligned */
27	subf	r5,r0,r5
28	bf	31,1f
29	stb	r4,0(r6)
30	addi	r6,r6,1
311:	bf	30,2f
32	sth	r4,0(r6)
33	addi	r6,r6,2
342:	bf	29,3f
35	stw	r4,0(r6)
36	addi	r6,r6,4
373:	srdi.	r0,r5,6
38	clrldi	r5,r5,58
39	mtctr	r0
40	beq	5f
41	.balign 16
424:	std	r4,0(r6)
43	std	r4,8(r6)
44	std	r4,16(r6)
45	std	r4,24(r6)
46	std	r4,32(r6)
47	std	r4,40(r6)
48	std	r4,48(r6)
49	std	r4,56(r6)
50	addi	r6,r6,64
51	bdnz	4b
525:	srwi.	r0,r5,3
53	clrlwi	r5,r5,29
54	PPC_MTOCRF(1,r0)
55	beq	8f
56	bf	29,6f
57	std	r4,0(r6)
58	std	r4,8(r6)
59	std	r4,16(r6)
60	std	r4,24(r6)
61	addi	r6,r6,32
626:	bf	30,7f
63	std	r4,0(r6)
64	std	r4,8(r6)
65	addi	r6,r6,16
667:	bf	31,8f
67	std	r4,0(r6)
68	addi	r6,r6,8
698:	cmpwi	r5,0
70	PPC_MTOCRF(1,r5)
71	beqlr+
72	bf	29,9f
73	stw	r4,0(r6)
74	addi	r6,r6,4
759:	bf	30,10f
76	sth	r4,0(r6)
77	addi	r6,r6,2
7810:	bflr	31
79	stb	r4,0(r6)
80	blr
81EXPORT_SYMBOL(memset)
82
83_GLOBAL_TOC(memmove)
84	cmplw	0,r3,r4
85	bgt	backwards_memcpy
86	b	memcpy
87
88_GLOBAL(backwards_memcpy)
89	rlwinm.	r7,r5,32-3,3,31		/* r0 = r5 >> 3 */
90	add	r6,r3,r5
91	add	r4,r4,r5
92	beq	2f
93	andi.	r0,r6,3
94	mtctr	r7
95	bne	5f
96	.balign 16
971:	lwz	r7,-4(r4)
98	lwzu	r8,-8(r4)
99	stw	r7,-4(r6)
100	stwu	r8,-8(r6)
101	bdnz	1b
102	andi.	r5,r5,7
1032:	cmplwi	0,r5,4
104	blt	3f
105	lwzu	r0,-4(r4)
106	subi	r5,r5,4
107	stwu	r0,-4(r6)
1083:	cmpwi	0,r5,0
109	beqlr
110	mtctr	r5
1114:	lbzu	r0,-1(r4)
112	stbu	r0,-1(r6)
113	bdnz	4b
114	blr
1155:	mtctr	r0
1166:	lbzu	r7,-1(r4)
117	stbu	r7,-1(r6)
118	bdnz	6b
119	subf	r5,r0,r5
120	rlwinm.	r7,r5,32-3,3,31
121	beq	2b
122	mtctr	r7
123	b	1b
124EXPORT_SYMBOL(memmove)
125