xref: /inferno-os/libkern/memmove-mips.s (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
1	TEXT	memmove(SB), $0
2
3	JMP	move
4
5	TEXT	memcpy(SB), $0
6move:
7	MOVW	R1, s1+0(FP)
8
9	MOVW	n+8(FP), R3		/* R3 is count */
10	MOVW	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	MOVW	s2+4(FP), R5		/* R5 is from-pointer */
16	ADDU	R3,R5, R7		/* R7 is end from-pointer */
17	ADDU	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	ADDU	$1, R5
47	MOVB	R8, 0(R4)
48	ADDU	$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	ADDU	$-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	ADDU	$16, R5
74	MOVW	R8, 8(R4)
75	MOVW	R9, 12(R4)
76	ADDU	$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	ADDU	$-3,R6, R3
85f5:
86	SGTU	R3,R4, R1
87	BEQ	R1, fout
88	MOVW	0(R5), R8
89	ADDU	$4, R5
90	MOVW	R8, 0(R4)
91	ADDU	$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	ADDU	$-15,R6, R3
103fun3:
104	SGTU	R3,R4, R1
105	BEQ	R1, fun4
106	MOVWL	0(R5), R8
107	MOVWR	3(R5), R8
108	MOVWL	4(R5), R9
109	MOVWR	7(R5), R9
110	MOVW	R8, 0(R4)
111	MOVWL	8(R5), R8
112	MOVWR	11(R5), R8
113	MOVW	R9, 4(R4)
114	MOVWL	12(R5), R9
115	MOVWR	15(R5), R9
116	ADDU	$16, R5
117	MOVW	R8, 8(R4)
118	MOVW	R9, 12(R4)
119	ADDU	$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	ADDU	$-3,R6, R3
128fun5:
129	SGTU	R3,R4, R1
130	BEQ	R1, fout
131	MOVWL	0(R5), R8
132	MOVWR	3(R5), R8
133	ADDU	$4, R5
134	MOVW	R8, 0(R4)
135	ADDU	$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	ADDU	$1, R5
145	MOVB	R8, 0(R4)
146	ADDU	$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	ADDU	$-1, R7
159	MOVB	R8, -1(R6)
160	ADDU	$-1, R6
161	JMP	b1
162
163b2:
164	AND	$3, R7, R1
165	BNE	R1, bun2
166
167	ADDU	$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	ADDU	$-16, R7
178	MOVW	R8, -12(R6)
179	MOVW	R9, -16(R6)
180	ADDU	$-16, R6
181	JMP	b3
182b4:
183	ADDU	$3,R5, R3
184b5:
185	SGTU	R7,R3, R1
186	BEQ	R1, bout
187	MOVW	-4(R7), R8
188	ADDU	$-4, R7
189	MOVW	R8, -4(R6)
190	ADDU	$-4, R6
191	JMP	b5
192
193bun2:
194	ADDU	$15,R5, R3
195bun3:
196	SGTU	R7,R3, R1
197	BEQ	R1, bun4
198	MOVWL	-4(R7), R8
199	MOVWR	-1(R7), R8
200	MOVWL	-8(R7), R9
201	MOVWR	-5(R7), R9
202	MOVW	R8, -4(R6)
203	MOVWL	-12(R7), R8
204	MOVWR	-9(R7), R8
205	MOVW	R9, -8(R6)
206	MOVWL	-16(R7), R9
207	MOVWR	-13(R7), R9
208	ADDU	$-16, R7
209	MOVW	R8, -12(R6)
210	MOVW	R9, -16(R6)
211	ADDU	$-16, R6
212	JMP	bun3
213
214bun4:
215	ADDU	$3,R5, R3
216bun5:
217	SGTU	R7,R3, R1
218	BEQ	R1, bout
219	MOVWL	-4(R7), R8
220	MOVWR	-1(R7), R8
221	ADDU	$-4, R7
222	MOVW	R8, -4(R6)
223	ADDU	$-4, R6
224	JMP	bun5
225
226bout:
227	BEQ	R7,R5, ret
228	MOVB	-1(R7), R8
229	ADDU	$-1, R7
230	MOVB	R8, -1(R6)
231	ADDU	$-1, R6
232	JMP	bout
233
234ret:
235	MOVW	s1+0(FP), R1
236	RET
237	END
238