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