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