xref: /plan9-contrib/sys/src/ape/lib/ap/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 * test if both pointers
40*12b1df16SDavid du Colombier * are similarly word aligned
41*12b1df16SDavid du Colombier */
42*12b1df16SDavid du Colombier	XOR	R4,R5, R1
43*12b1df16SDavid du Colombier	AND	$3, R1
44*12b1df16SDavid du Colombier	BNE	R1, fout
45*12b1df16SDavid du Colombier
46*12b1df16SDavid du Colombier/*
47*12b1df16SDavid du Colombier * byte at a time to word align
48*12b1df16SDavid du Colombier */
49*12b1df16SDavid du Colombierf1:
50*12b1df16SDavid du Colombier	AND	$3,R4, R1
51*12b1df16SDavid du Colombier	BEQ	R1, f2
52*12b1df16SDavid du Colombier	MOVB	0(R5), R8
53*12b1df16SDavid du Colombier	ADDU	$1, R5
54*12b1df16SDavid du Colombier	MOVB	R8, 0(R4)
55*12b1df16SDavid du Colombier	ADDU	$1, R4
56*12b1df16SDavid du Colombier	JMP	f1
57*12b1df16SDavid du Colombier
58*12b1df16SDavid du Colombier/*
59*12b1df16SDavid du Colombier * turn R3 into to-end pointer-15
60*12b1df16SDavid du Colombier * copy 16 at a time while theres room.
61*12b1df16SDavid du Colombier * R6 is smaller than R7 --
62*12b1df16SDavid du Colombier * there are problems if R7 is 0.
63*12b1df16SDavid du Colombier */
64*12b1df16SDavid du Colombierf2:
65*12b1df16SDavid du Colombier	ADDU	$-15,R6, R3
66*12b1df16SDavid du Colombierf3:
67*12b1df16SDavid du Colombier	SGTU	R3,R4, R1
68*12b1df16SDavid du Colombier	BEQ	R1, f4
69*12b1df16SDavid du Colombier	MOVW	0(R5), R8
70*12b1df16SDavid du Colombier	MOVW	4(R5), R9
71*12b1df16SDavid du Colombier	MOVW	R8, 0(R4)
72*12b1df16SDavid du Colombier	MOVW	8(R5), R8
73*12b1df16SDavid du Colombier	MOVW	R9, 4(R4)
74*12b1df16SDavid du Colombier	MOVW	12(R5), R9
75*12b1df16SDavid du Colombier	ADDU	$16, R5
76*12b1df16SDavid du Colombier	MOVW	R8, 8(R4)
77*12b1df16SDavid du Colombier	MOVW	R9, 12(R4)
78*12b1df16SDavid du Colombier	ADDU	$16, R4
79*12b1df16SDavid du Colombier	JMP	f3
80*12b1df16SDavid du Colombier
81*12b1df16SDavid du Colombier/*
82*12b1df16SDavid du Colombier * turn R3 into to-end pointer-3
83*12b1df16SDavid du Colombier * copy 4 at a time while theres room
84*12b1df16SDavid du Colombier */
85*12b1df16SDavid du Colombierf4:
86*12b1df16SDavid du Colombier	ADDU	$-3,R6, R3
87*12b1df16SDavid du Colombierf5:
88*12b1df16SDavid du Colombier	SGTU	R3,R4, R1
89*12b1df16SDavid du Colombier	BEQ	R1, fout
90*12b1df16SDavid du Colombier	MOVW	0(R5), R8
91*12b1df16SDavid du Colombier	ADDU	$4, R5
92*12b1df16SDavid du Colombier	MOVW	R8, 0(R4)
93*12b1df16SDavid du Colombier	ADDU	$4, R4
94*12b1df16SDavid du Colombier	JMP	f5
95*12b1df16SDavid du Colombier
96*12b1df16SDavid du Colombier/*
97*12b1df16SDavid du Colombier * last loop, copy byte at a time
98*12b1df16SDavid du Colombier */
99*12b1df16SDavid du Colombierfout:
100*12b1df16SDavid du Colombier	BEQ	R7,R5, ret
101*12b1df16SDavid du Colombier	MOVB	0(R5), R8
102*12b1df16SDavid du Colombier	ADDU	$1, R5
103*12b1df16SDavid du Colombier	MOVB	R8, 0(R4)
104*12b1df16SDavid du Colombier	ADDU	$1, R4
105*12b1df16SDavid du Colombier	JMP	fout
106*12b1df16SDavid du Colombier
107*12b1df16SDavid du Colombier/*
108*12b1df16SDavid du Colombier * whole thing repeated for backwards
109*12b1df16SDavid du Colombier */
110*12b1df16SDavid du Colombierback:
111*12b1df16SDavid du Colombier	BNE	R2, bout
112*12b1df16SDavid du Colombier	XOR	R6,R7, R1
113*12b1df16SDavid du Colombier	AND	$3, R1
114*12b1df16SDavid du Colombier	BNE	R1, bout
115*12b1df16SDavid du Colombierb1:
116*12b1df16SDavid du Colombier	AND	$3,R7, R1
117*12b1df16SDavid du Colombier	BEQ	R1, b2
118*12b1df16SDavid du Colombier	MOVB	-1(R7), R8
119*12b1df16SDavid du Colombier	ADDU	$-1, R7
120*12b1df16SDavid du Colombier	MOVB	R8, -1(R6)
121*12b1df16SDavid du Colombier	ADDU	$-1, R6
122*12b1df16SDavid du Colombier	JMP	b1
123*12b1df16SDavid du Colombierb2:
124*12b1df16SDavid du Colombier	ADDU	$15,R5, R3
125*12b1df16SDavid du Colombierb3:
126*12b1df16SDavid du Colombier	SGTU	R7,R3, R1
127*12b1df16SDavid du Colombier	BEQ	R1, b4
128*12b1df16SDavid du Colombier	MOVW	-4(R7), R8
129*12b1df16SDavid du Colombier	MOVW	-8(R7), R9
130*12b1df16SDavid du Colombier	MOVW	R8, -4(R6)
131*12b1df16SDavid du Colombier	MOVW	-12(R7), R8
132*12b1df16SDavid du Colombier	MOVW	R9, -8(R6)
133*12b1df16SDavid du Colombier	MOVW	-16(R7), R9
134*12b1df16SDavid du Colombier	ADDU	$-16, R7
135*12b1df16SDavid du Colombier	MOVW	R8, -12(R6)
136*12b1df16SDavid du Colombier	MOVW	R9, -16(R6)
137*12b1df16SDavid du Colombier	ADDU	$-16, R6
138*12b1df16SDavid du Colombier	JMP	b3
139*12b1df16SDavid du Colombierb4:
140*12b1df16SDavid du Colombier	ADDU	$3,R5, R3
141*12b1df16SDavid du Colombierb5:
142*12b1df16SDavid du Colombier	SGTU	R7,R3, R1
143*12b1df16SDavid du Colombier	BEQ	R1, bout
144*12b1df16SDavid du Colombier	MOVW	-4(R7), R8
145*12b1df16SDavid du Colombier	ADDU	$-4, R7
146*12b1df16SDavid du Colombier	MOVW	R8, -4(R6)
147*12b1df16SDavid du Colombier	ADDU	$-4, R6
148*12b1df16SDavid du Colombier	JMP	b5
149*12b1df16SDavid du Colombier
150*12b1df16SDavid du Colombierbout:
151*12b1df16SDavid du Colombier	BEQ	R7,R5, ret
152*12b1df16SDavid du Colombier	MOVB	-1(R7), R8
153*12b1df16SDavid du Colombier	ADDU	$-1, R7
154*12b1df16SDavid du Colombier	MOVB	R8, -1(R6)
155*12b1df16SDavid du Colombier	ADDU	$-1, R6
156*12b1df16SDavid du Colombier	JMP	bout
157*12b1df16SDavid du Colombier
158*12b1df16SDavid du Colombierret:
159*12b1df16SDavid du Colombier	MOVW	s1+0(FP), R1
160*12b1df16SDavid du Colombier	RET
161*12b1df16SDavid du Colombier	END
162