xref: /plan9/sys/src/libc/mips/memmove.s (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
13e12c5d1SDavid du Colombier	TEXT	memmove(SB), $0
23e12c5d1SDavid du Colombier
33e12c5d1SDavid du Colombier	JMP	move
43e12c5d1SDavid du Colombier
53e12c5d1SDavid du Colombier	TEXT	memcpy(SB), $0
63e12c5d1SDavid du Colombiermove:
73e12c5d1SDavid du Colombier	MOVW	R1, s1+0(FP)
83e12c5d1SDavid du Colombier
93e12c5d1SDavid du Colombier	MOVW	n+8(FP), R3		/* R3 is count */
103e12c5d1SDavid du Colombier	MOVW	R1, R4			/* R4 is to-pointer */
113e12c5d1SDavid du Colombier	SGT	R0, R3, R5
123e12c5d1SDavid du Colombier	BEQ	R5, ok
133e12c5d1SDavid du Colombier	MOVW	(R0), R0		/* abort if negative count */
143e12c5d1SDavid du Colombierok:
153e12c5d1SDavid du Colombier	MOVW	s2+4(FP), R5		/* R5 is from-pointer */
163e12c5d1SDavid du Colombier	ADDU	R3,R5, R7		/* R7 is end from-pointer */
173e12c5d1SDavid du Colombier	ADDU	R3,R4, R6		/* R6 is end to-pointer */
183e12c5d1SDavid du Colombier
193e12c5d1SDavid du Colombier/*
203e12c5d1SDavid du Colombier * easiest test is copy backwards if
213e12c5d1SDavid du Colombier * destination string has higher mem address
223e12c5d1SDavid du Colombier */
233e12c5d1SDavid du Colombier	SGT	$4,R3, R2
243e12c5d1SDavid du Colombier	SGTU	R4,R5, R1
253e12c5d1SDavid du Colombier	BNE	R1, back
263e12c5d1SDavid du Colombier
273e12c5d1SDavid du Colombier/*
283e12c5d1SDavid du Colombier * if not at least 4 chars,
29*219b2ee8SDavid du Colombier * don't even mess around.
303e12c5d1SDavid du Colombier * 3 chars to guarantee any
313e12c5d1SDavid du Colombier * rounding up to a word
323e12c5d1SDavid du Colombier * boundary and 4 characters
333e12c5d1SDavid du Colombier * to get at least maybe one
343e12c5d1SDavid du Colombier * full word store.
353e12c5d1SDavid du Colombier */
363e12c5d1SDavid du Colombier	BNE	R2, fout
373e12c5d1SDavid du Colombier
383e12c5d1SDavid du Colombier
393e12c5d1SDavid du Colombier/*
40*219b2ee8SDavid du Colombier * byte at a time to word align destination
413e12c5d1SDavid du Colombier */
423e12c5d1SDavid du Colombierf1:
433e12c5d1SDavid du Colombier	AND	$3,R4, R1
443e12c5d1SDavid du Colombier	BEQ	R1, f2
453e12c5d1SDavid du Colombier	MOVB	0(R5), R8
463e12c5d1SDavid du Colombier	ADDU	$1, R5
473e12c5d1SDavid du Colombier	MOVB	R8, 0(R4)
483e12c5d1SDavid du Colombier	ADDU	$1, R4
493e12c5d1SDavid du Colombier	JMP	f1
503e12c5d1SDavid du Colombier
513e12c5d1SDavid du Colombier/*
52*219b2ee8SDavid du Colombier * test if source is now word aligned
53*219b2ee8SDavid du Colombier */
54*219b2ee8SDavid du Colombierf2:
55*219b2ee8SDavid du Colombier	AND	$3, R5, R1
56*219b2ee8SDavid du Colombier	BNE	R1, fun2
57*219b2ee8SDavid du Colombier/*
583e12c5d1SDavid du Colombier * turn R3 into to-end pointer-15
593e12c5d1SDavid du Colombier * copy 16 at a time while theres room.
603e12c5d1SDavid du Colombier * R6 is smaller than R7 --
613e12c5d1SDavid du Colombier * there are problems if R7 is 0.
623e12c5d1SDavid du Colombier */
633e12c5d1SDavid du Colombier	ADDU	$-15,R6, R3
643e12c5d1SDavid du Colombierf3:
653e12c5d1SDavid du Colombier	SGTU	R3,R4, R1
663e12c5d1SDavid du Colombier	BEQ	R1, f4
673e12c5d1SDavid du Colombier	MOVW	0(R5), R8
683e12c5d1SDavid du Colombier	MOVW	4(R5), R9
693e12c5d1SDavid du Colombier	MOVW	R8, 0(R4)
703e12c5d1SDavid du Colombier	MOVW	8(R5), R8
713e12c5d1SDavid du Colombier	MOVW	R9, 4(R4)
723e12c5d1SDavid du Colombier	MOVW	12(R5), R9
733e12c5d1SDavid du Colombier	ADDU	$16, R5
743e12c5d1SDavid du Colombier	MOVW	R8, 8(R4)
753e12c5d1SDavid du Colombier	MOVW	R9, 12(R4)
763e12c5d1SDavid du Colombier	ADDU	$16, R4
773e12c5d1SDavid du Colombier	JMP	f3
783e12c5d1SDavid du Colombier
793e12c5d1SDavid du Colombier/*
803e12c5d1SDavid du Colombier * turn R3 into to-end pointer-3
813e12c5d1SDavid du Colombier * copy 4 at a time while theres room
823e12c5d1SDavid du Colombier */
833e12c5d1SDavid du Colombierf4:
843e12c5d1SDavid du Colombier	ADDU	$-3,R6, R3
853e12c5d1SDavid du Colombierf5:
863e12c5d1SDavid du Colombier	SGTU	R3,R4, R1
873e12c5d1SDavid du Colombier	BEQ	R1, fout
883e12c5d1SDavid du Colombier	MOVW	0(R5), R8
893e12c5d1SDavid du Colombier	ADDU	$4, R5
903e12c5d1SDavid du Colombier	MOVW	R8, 0(R4)
913e12c5d1SDavid du Colombier	ADDU	$4, R4
923e12c5d1SDavid du Colombier	JMP	f5
933e12c5d1SDavid du Colombier
943e12c5d1SDavid du Colombier/*
95*219b2ee8SDavid du Colombier * forward copy, unaligned
96*219b2ee8SDavid du Colombier * turn R3 into to-end pointer-15
97*219b2ee8SDavid du Colombier * copy 16 at a time while theres room.
98*219b2ee8SDavid du Colombier * R6 is smaller than R7 --
99*219b2ee8SDavid du Colombier * there are problems if R7 is 0.
100*219b2ee8SDavid du Colombier */
101*219b2ee8SDavid du Colombierfun2:
102*219b2ee8SDavid du Colombier	ADDU	$-15,R6, R3
103*219b2ee8SDavid du Colombierfun3:
104*219b2ee8SDavid du Colombier	SGTU	R3,R4, R1
105*219b2ee8SDavid du Colombier	BEQ	R1, fun4
106*219b2ee8SDavid du Colombier	MOVWL	0(R5), R8
107*219b2ee8SDavid du Colombier	MOVWR	3(R5), R8
108*219b2ee8SDavid du Colombier	MOVWL	4(R5), R9
109*219b2ee8SDavid du Colombier	MOVWR	7(R5), R9
110*219b2ee8SDavid du Colombier	MOVW	R8, 0(R4)
111*219b2ee8SDavid du Colombier	MOVWL	8(R5), R8
112*219b2ee8SDavid du Colombier	MOVWR	11(R5), R8
113*219b2ee8SDavid du Colombier	MOVW	R9, 4(R4)
114*219b2ee8SDavid du Colombier	MOVWL	12(R5), R9
115*219b2ee8SDavid du Colombier	MOVWR	15(R5), R9
116*219b2ee8SDavid du Colombier	ADDU	$16, R5
117*219b2ee8SDavid du Colombier	MOVW	R8, 8(R4)
118*219b2ee8SDavid du Colombier	MOVW	R9, 12(R4)
119*219b2ee8SDavid du Colombier	ADDU	$16, R4
120*219b2ee8SDavid du Colombier	JMP	fun3
121*219b2ee8SDavid du Colombier
122*219b2ee8SDavid du Colombier/*
123*219b2ee8SDavid du Colombier * turn R3 into to-end pointer-3
124*219b2ee8SDavid du Colombier * copy 4 at a time while theres room
125*219b2ee8SDavid du Colombier */
126*219b2ee8SDavid du Colombierfun4:
127*219b2ee8SDavid du Colombier	ADDU	$-3,R6, R3
128*219b2ee8SDavid du Colombierfun5:
129*219b2ee8SDavid du Colombier	SGTU	R3,R4, R1
130*219b2ee8SDavid du Colombier	BEQ	R1, fout
131*219b2ee8SDavid du Colombier	MOVWL	0(R5), R8
132*219b2ee8SDavid du Colombier	MOVWR	3(R5), R8
133*219b2ee8SDavid du Colombier	ADDU	$4, R5
134*219b2ee8SDavid du Colombier	MOVW	R8, 0(R4)
135*219b2ee8SDavid du Colombier	ADDU	$4, R4
136*219b2ee8SDavid du Colombier	JMP	fun5
137*219b2ee8SDavid du Colombier
138*219b2ee8SDavid du Colombier/*
1393e12c5d1SDavid du Colombier * last loop, copy byte at a time
1403e12c5d1SDavid du Colombier */
1413e12c5d1SDavid du Colombierfout:
1423e12c5d1SDavid du Colombier	BEQ	R7,R5, ret
1433e12c5d1SDavid du Colombier	MOVB	0(R5), R8
1443e12c5d1SDavid du Colombier	ADDU	$1, R5
1453e12c5d1SDavid du Colombier	MOVB	R8, 0(R4)
1463e12c5d1SDavid du Colombier	ADDU	$1, R4
1473e12c5d1SDavid du Colombier	JMP	fout
1483e12c5d1SDavid du Colombier
1493e12c5d1SDavid du Colombier/*
1503e12c5d1SDavid du Colombier * whole thing repeated for backwards
1513e12c5d1SDavid du Colombier */
1523e12c5d1SDavid du Colombierback:
1533e12c5d1SDavid du Colombier	BNE	R2, bout
1543e12c5d1SDavid du Colombierb1:
155*219b2ee8SDavid du Colombier	AND	$3,R6, R1
1563e12c5d1SDavid du Colombier	BEQ	R1, b2
1573e12c5d1SDavid du Colombier	MOVB	-1(R7), R8
1583e12c5d1SDavid du Colombier	ADDU	$-1, R7
1593e12c5d1SDavid du Colombier	MOVB	R8, -1(R6)
1603e12c5d1SDavid du Colombier	ADDU	$-1, R6
1613e12c5d1SDavid du Colombier	JMP	b1
162*219b2ee8SDavid du Colombier
1633e12c5d1SDavid du Colombierb2:
164*219b2ee8SDavid du Colombier	AND	$3, R7, R1
165*219b2ee8SDavid du Colombier	BNE	R1, bun2
166*219b2ee8SDavid du Colombier
1673e12c5d1SDavid du Colombier	ADDU	$15,R5, R3
1683e12c5d1SDavid du Colombierb3:
1693e12c5d1SDavid du Colombier	SGTU	R7,R3, R1
1703e12c5d1SDavid du Colombier	BEQ	R1, b4
1713e12c5d1SDavid du Colombier	MOVW	-4(R7), R8
1723e12c5d1SDavid du Colombier	MOVW	-8(R7), R9
1733e12c5d1SDavid du Colombier	MOVW	R8, -4(R6)
1743e12c5d1SDavid du Colombier	MOVW	-12(R7), R8
1753e12c5d1SDavid du Colombier	MOVW	R9, -8(R6)
1763e12c5d1SDavid du Colombier	MOVW	-16(R7), R9
1773e12c5d1SDavid du Colombier	ADDU	$-16, R7
1783e12c5d1SDavid du Colombier	MOVW	R8, -12(R6)
1793e12c5d1SDavid du Colombier	MOVW	R9, -16(R6)
1803e12c5d1SDavid du Colombier	ADDU	$-16, R6
1813e12c5d1SDavid du Colombier	JMP	b3
1823e12c5d1SDavid du Colombierb4:
1833e12c5d1SDavid du Colombier	ADDU	$3,R5, R3
1843e12c5d1SDavid du Colombierb5:
1853e12c5d1SDavid du Colombier	SGTU	R7,R3, R1
1863e12c5d1SDavid du Colombier	BEQ	R1, bout
1873e12c5d1SDavid du Colombier	MOVW	-4(R7), R8
1883e12c5d1SDavid du Colombier	ADDU	$-4, R7
1893e12c5d1SDavid du Colombier	MOVW	R8, -4(R6)
1903e12c5d1SDavid du Colombier	ADDU	$-4, R6
1913e12c5d1SDavid du Colombier	JMP	b5
1923e12c5d1SDavid du Colombier
193*219b2ee8SDavid du Colombierbun2:
194*219b2ee8SDavid du Colombier	ADDU	$15,R5, R3
195*219b2ee8SDavid du Colombierbun3:
196*219b2ee8SDavid du Colombier	SGTU	R7,R3, R1
197*219b2ee8SDavid du Colombier	BEQ	R1, bun4
198*219b2ee8SDavid du Colombier	MOVWL	-4(R7), R8
199*219b2ee8SDavid du Colombier	MOVWR	-1(R7), R8
200*219b2ee8SDavid du Colombier	MOVWL	-8(R7), R9
201*219b2ee8SDavid du Colombier	MOVWR	-5(R7), R9
202*219b2ee8SDavid du Colombier	MOVW	R8, -4(R6)
203*219b2ee8SDavid du Colombier	MOVWL	-12(R7), R8
204*219b2ee8SDavid du Colombier	MOVWR	-9(R7), R8
205*219b2ee8SDavid du Colombier	MOVW	R9, -8(R6)
206*219b2ee8SDavid du Colombier	MOVWL	-16(R7), R9
207*219b2ee8SDavid du Colombier	MOVWR	-13(R7), R9
208*219b2ee8SDavid du Colombier	ADDU	$-16, R7
209*219b2ee8SDavid du Colombier	MOVW	R8, -12(R6)
210*219b2ee8SDavid du Colombier	MOVW	R9, -16(R6)
211*219b2ee8SDavid du Colombier	ADDU	$-16, R6
212*219b2ee8SDavid du Colombier	JMP	bun3
213*219b2ee8SDavid du Colombier
214*219b2ee8SDavid du Colombierbun4:
215*219b2ee8SDavid du Colombier	ADDU	$3,R5, R3
216*219b2ee8SDavid du Colombierbun5:
217*219b2ee8SDavid du Colombier	SGTU	R7,R3, R1
218*219b2ee8SDavid du Colombier	BEQ	R1, bout
219*219b2ee8SDavid du Colombier	MOVWL	-4(R7), R8
220*219b2ee8SDavid du Colombier	MOVWR	-1(R7), R8
221*219b2ee8SDavid du Colombier	ADDU	$-4, R7
222*219b2ee8SDavid du Colombier	MOVW	R8, -4(R6)
223*219b2ee8SDavid du Colombier	ADDU	$-4, R6
224*219b2ee8SDavid du Colombier	JMP	bun5
225*219b2ee8SDavid du Colombier
2263e12c5d1SDavid du Colombierbout:
2273e12c5d1SDavid du Colombier	BEQ	R7,R5, ret
2283e12c5d1SDavid du Colombier	MOVB	-1(R7), R8
2293e12c5d1SDavid du Colombier	ADDU	$-1, R7
2303e12c5d1SDavid du Colombier	MOVB	R8, -1(R6)
2313e12c5d1SDavid du Colombier	ADDU	$-1, R6
2323e12c5d1SDavid du Colombier	JMP	bout
2333e12c5d1SDavid du Colombier
2343e12c5d1SDavid du Colombierret:
2353e12c5d1SDavid du Colombier	MOVW	s1+0(FP), R1
2363e12c5d1SDavid du Colombier	RET
2373e12c5d1SDavid du Colombier	END
238