xref: /plan9-contrib/sys/src/ape/lib/ap/spim64/memmove.s (revision 6c6e36e1134c52b146e9d71d8c7dc193994c0c4e)
1	TEXT	memmove(SB), $0
2
3	JMP	move
4
5	TEXT	memcpy(SB), $0
6move:
7	MOVV	R1, s1+0(FP)
8
9	MOVW	n+16(FP), R3		/* R3 is count */
10	MOVV	R1, R4			/* R4 is to-pointer */
11	SGT	R0, R3, R5
12	BEQ	R5, ok
13	MOVW	(R0), R0		/* abort if negative count */
14ok:
15	MOVV	s2+8(FP), R5	/* R5 is from-pointer */
16	ADDVU	R3,R5, R7		/* R7 is end from-pointer */
17	ADDVU	R3,R4, R6		/* R6 is end to-pointer */
18
19/*
20 * easiest test is copy backwards if
21 * destination string has higher mem address
22 */
23	SGT	$4,R3, R2
24	SGTU	R4,R5, R1
25	BNE	R1, back
26
27/*
28 * if not at least 4 chars,
29 * don't even mess around.
30 * 3 chars to guarantee any
31 * rounding up to a word
32 * boundary and 4 characters
33 * to get at least maybe one
34 * full word store.
35 */
36	BNE	R2, fout
37
38
39/*
40 * byte at a time to word align destination
41 */
42f1:
43	AND	$3,R4, R1
44	BEQ	R1, f2
45	MOVB	0(R5), R8
46	ADDVU	$1, R5
47	MOVB	R8, 0(R4)
48	ADDVU	$1, R4
49	JMP	f1
50
51/*
52 * test if source is now word aligned
53 */
54f2:
55	AND	$3, R5, R1
56	BNE	R1, fun2
57/*
58 * turn R3 into to-end pointer-15
59 * copy 16 at a time while theres room.
60 * R6 is smaller than R7 --
61 * there are problems if R7 is 0.
62 */
63	ADDVU	$-15,R6, R3
64f3:
65	SGTU	R3,R4, R1
66	BEQ	R1, f4
67	MOVW	0(R5), R8
68	MOVW	4(R5), R9
69	MOVW	R8, 0(R4)
70	MOVW	8(R5), R8
71	MOVW	R9, 4(R4)
72	MOVW	12(R5), R9
73	ADDVU	$16, R5
74	MOVW	R8, 8(R4)
75	MOVW	R9, 12(R4)
76	ADDVU	$16, R4
77	JMP	f3
78
79/*
80 * turn R3 into to-end pointer-3
81 * copy 4 at a time while theres room
82 */
83f4:
84	ADDVU	$-3,R6, R3
85f5:
86	SGTU	R3,R4, R1
87	BEQ	R1, fout
88	MOVW	0(R5), R8
89	ADDVU	$4, R5
90	MOVW	R8, 0(R4)
91	ADDVU	$4, R4
92	JMP	f5
93
94/*
95 * forward copy, unaligned
96 * turn R3 into to-end pointer-15
97 * copy 16 at a time while theres room.
98 * R6 is smaller than R7 --
99 * there are problems if R7 is 0.
100 */
101fun2:
102	ADDVU	$-15,R6, R3
103fun3:
104	SGTU	R3,R4, R1
105	BEQ	R1, fun4
106	MOVWR	0(R5), R8
107	MOVWL	3(R5), R8
108	MOVWR	4(R5), R9
109	MOVWL	7(R5), R9
110	MOVW	R8, 0(R4)
111	MOVWR	8(R5), R8
112	MOVWL	11(R5), R8
113	MOVW	R9, 4(R4)
114	MOVWR	12(R5), R9
115	MOVWL	15(R5), R9
116	ADDVU	$16, R5
117	MOVW	R8, 8(R4)
118	MOVW	R9, 12(R4)
119	ADDVU	$16, R4
120	JMP	fun3
121
122/*
123 * turn R3 into to-end pointer-3
124 * copy 4 at a time while theres room
125 */
126fun4:
127	ADDVU	$-3,R6, R3
128fun5:
129	SGTU	R3,R4, R1
130	BEQ	R1, fout
131	MOVWR	0(R5), R8
132	MOVWL	3(R5), R8
133	ADDVU	$4, R5
134	MOVW	R8, 0(R4)
135	ADDVU	$4, R4
136	JMP	fun5
137
138/*
139 * last loop, copy byte at a time
140 */
141fout:
142	BEQ	R7,R5, ret
143	MOVB	0(R5), R8
144	ADDVU	$1, R5
145	MOVB	R8, 0(R4)
146	ADDVU	$1, R4
147	JMP	fout
148
149/*
150 * whole thing repeated for backwards
151 */
152back:
153	BNE	R2, bout
154b1:
155	AND	$3,R6, R1
156	BEQ	R1, b2
157	MOVB	-1(R7), R8
158	ADDVU	$-1, R7
159	MOVB	R8, -1(R6)
160	ADDVU	$-1, R6
161	JMP	b1
162
163b2:
164	AND	$3, R7, R1
165	BNE	R1, bun2
166
167	ADDVU	$15,R5, R3
168b3:
169	SGTU	R7,R3, R1
170	BEQ	R1, b4
171	MOVW	-4(R7), R8
172	MOVW	-8(R7), R9
173	MOVW	R8, -4(R6)
174	MOVW	-12(R7), R8
175	MOVW	R9, -8(R6)
176	MOVW	-16(R7), R9
177	ADDVU	$-16, R7
178	MOVW	R8, -12(R6)
179	MOVW	R9, -16(R6)
180	ADDVU	$-16, R6
181	JMP	b3
182b4:
183	ADDVU	$3,R5, R3
184b5:
185	SGTU	R7,R3, R1
186	BEQ	R1, bout
187	MOVW	-4(R7), R8
188	ADDVU	$-4, R7
189	MOVW	R8, -4(R6)
190	ADDVU	$-4, R6
191	JMP	b5
192
193bun2:
194	ADDVU	$15,R5, R3
195bun3:
196	SGTU	R7,R3, R1
197	BEQ	R1, bun4
198	MOVWR	-4(R7), R8
199	MOVWL	-1(R7), R8
200	MOVWR	-8(R7), R9
201	MOVWL	-5(R7), R9
202	MOVW	R8, -4(R6)
203	MOVWR	-12(R7), R8
204	MOVWL	-9(R7), R8
205	MOVW	R9, -8(R6)
206	MOVWR	-16(R7), R9
207	MOVWL	-13(R7), R9
208	ADDVU	$-16, R7
209	MOVW	R8, -12(R6)
210	MOVW	R9, -16(R6)
211	ADDVU	$-16, R6
212	JMP	bun3
213
214bun4:
215	ADDVU	$3,R5, R3
216bun5:
217	SGTU	R7,R3, R1
218	BEQ	R1, bout
219	MOVWR	-4(R7), R8
220	MOVWL	-1(R7), R8
221	ADDVU	$-4, R7
222	MOVW	R8, -4(R6)
223	ADDVU	$-4, R6
224	JMP	bun5
225
226bout:
227	BEQ	R7,R5, ret
228	MOVB	-1(R7), R8
229	ADDVU	$-1, R7
230	MOVB	R8, -1(R6)
231	ADDVU	$-1, R6
232	JMP	bout
233
234ret:
235	MOVV	s1+0(FP), R1
236	RET
237	END
238