xref: /inferno-os/libkern/memmove-power.s (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
1#define	BDNZ	BC	16,0,
2	TEXT	memcpy(SB), $0
3	BR	move
4
5	TEXT	memmove(SB), $0
6move:
7
8/*
9 * performance:
10 * (tba)
11 */
12
13	MOVW	R3, s1+0(FP)
14	MOVW	n+8(FP), R9		/* R9 is count */
15	MOVW	R3, R10			/* R10 is to-pointer */
16	CMP	R9, $0
17	BEQ	ret
18	BLT	trap
19	MOVW	s2+4(FP), R11		/* R11 is from-pointer */
20
21/*
22 * if no more than 16 bytes, just use one lsw/stsw
23 */
24	CMP	R9, $16
25	BLE	fout
26
27	ADD	R9,R11, R13		/* R13 is end from-pointer */
28	ADD	R9,R10, R12		/* R12 is end to-pointer */
29
30/*
31 * easiest test is copy backwards if
32 * destination string has higher mem address
33 */
34	CMPU	R10, R11
35	BGT	back
36
37/*
38 * test if both pointers
39 * are similarly word aligned
40 */
41	XOR	R10,R11, R7
42	ANDCC	$3,R7
43	BNE	fbad
44
45/*
46 * move a few bytes to align pointers
47 */
48	ANDCC	$3,R10,R7
49	BEQ	f2
50	SUBC	R7, $4, R7
51	SUB	R7, R9
52	MOVW	R7, XER
53	LSW	(R11), R16
54	ADD	R7, R11
55	STSW	R16, (R10)
56	ADD	R7, R10
57
58/*
59 * turn R14 into doubleword count
60 * copy 16 bytes at a time while there's room.
61 */
62f2:
63	SRAWCC	$4, R9, R14
64	BLE	fout
65	MOVW	R14, CTR
66	SUB	$4, R11
67	SUB	$4, R10
68f3:
69	MOVWU	4(R11), R16
70	MOVWU	R16, 4(R10)
71	MOVWU	4(R11), R17
72	MOVWU	R17, 4(R10)
73	MOVWU	4(R11), R16
74	MOVWU	R16, 4(R10)
75	MOVWU	4(R11), R17
76	MOVWU	R17, 4(R10)
77	BDNZ	f3
78	RLWNMCC	$0, R9, $15, R9	/* residue */
79	BEQ	ret
80	ADD	$4, R11
81	ADD	$4, R10
82
83/*
84 * move up to 16 bytes through R16 .. R19; aligned and unaligned
85 */
86fout:
87	MOVW	R9, XER
88	LSW	(R11), R16
89	STSW	R16, (R10)
90	BR	ret
91
92/*
93 * loop for unaligned copy, then copy up to 15 remaining bytes
94 */
95fbad:
96	SRAWCC	$4, R9, R14
97	BLE	f6
98	MOVW	R14, CTR
99f5:
100	LSW	(R11), $16, R16
101	ADD	$16, R11
102	STSW	R16, $16, (R10)
103	ADD	$16, R10
104	BDNZ	f5
105	RLWNMCC	$0, R9, $15, R9	/* residue */
106	BEQ	ret
107f6:
108	MOVW	R9, XER
109	LSW	(R11), R16
110	STSW	R16, (R10)
111	BR	ret
112
113/*
114 * whole thing repeated for backwards
115 */
116back:
117	CMP	R9, $4
118	BLT	bout
119
120	XOR	R12,R13, R7
121	ANDCC	$3,R7
122	BNE	bout
123b1:
124	ANDCC	$3,R13, R7
125	BEQ	b2
126	MOVBZU	-1(R13), R16
127	MOVBZU	R16, -1(R12)
128	SUB	$1, R9
129	BR	b1
130b2:
131	SRAWCC	$4, R9, R14
132	BLE	b4
133	MOVW	R14, CTR
134b3:
135	MOVWU	-4(R13), R16
136	MOVWU	R16, -4(R12)
137	MOVWU	-4(R13), R17
138	MOVWU	R17, -4(R12)
139	MOVWU	-4(R13), R16
140	MOVWU	R16, -4(R12)
141	MOVWU	-4(R13), R17
142	MOVWU	R17, -4(R12)
143	BDNZ	b3
144	RLWNMCC	$0, R9, $15, R9	/* residue */
145	BEQ	ret
146b4:
147	SRAWCC	$2, R9, R14
148	BLE	bout
149	MOVW	R14, CTR
150b5:
151	MOVWU	-4(R13), R16
152	MOVWU	R16, -4(R12)
153	BDNZ	b5
154	RLWNMCC	$0, R9, $3, R9	/* residue */
155	BEQ	ret
156
157bout:
158	CMPU	R13, R11
159	BLE	ret
160	MOVBZU	-1(R13), R16
161	MOVBZU	R16, -1(R12)
162	BR	bout
163
164trap:
165/*	MOVW	$0, R0	*/
166	MOVW	R0, 0(R0)
167
168ret:
169	MOVW	s1+0(FP), R3
170	RETURN
171