xref: /plan9/sys/src/ape/lib/ap/sparc/memmove.s (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
1	TEXT	memmove(SB), $0
2	JMP	move
3
4	TEXT	memcpy(SB), $0
5move:
6
7/*
8 * performance:
9 * (tba)
10 */
11
12	MOVW	R7, s1+0(FP)
13	MOVW	n+8(FP), R9		/* R9 is count */
14	MOVW	R7, R10			/* R10 is to-pointer */
15	SUBCC	R0,R9, R0
16	BGE	ok
17	MOVW	0(R0), R0
18
19ok:
20	MOVW	s2+4(FP), R11		/* R11 is from-pointer */
21	ADD	R9,R11, R13		/* R13 is end from-pointer */
22	ADD	R9,R10, R12		/* R12 is end to-pointer */
23
24/*
25 * easiest test is copy backwards if
26 * destination string has higher mem address
27 */
28	SUBCC	R11,R10, R0
29	BGU	back
30
31/*
32 * if not at least 4 chars,
33 * dont even mess around.
34 * 3 chars to guarantee any
35 * rounding up to a word
36 * boundary and 4 characters
37 * to get at least maybe one
38 * full word store.
39 */
40	SUBCC	$4,R9, R0
41	BL	fout
42
43/*
44 * test if both pointers
45 * are similarly word aligned
46 */
47	XOR	R10,R11, R7
48	ANDCC	$3,R7, R0
49	BNE	fout
50
51/*
52 * byte at a time to word align
53 */
54f1:
55	ANDCC	$3,R10, R0
56	BE	f2
57	MOVB	0(R11), R16
58	ADD	$1, R11
59	MOVB	R16, 0(R10)
60	ADD	$1, R10
61	JMP	f1
62
63/*
64 * turn R9 into to-end pointer-15
65 * copy 16 at a time while theres room.
66 * R12 is smaller than R13 --
67 * there are problems if R13 is 0.
68 */
69f2:
70	SUB	$15,R12, R9
71f3:
72	SUBCC	R10,R9, R0
73	BLEU	f4
74	MOVW	0(R11), R16
75	MOVW	4(R11), R17
76	MOVW	R16, 0(R10)
77	MOVW	8(R11), R16
78	MOVW	R17, 4(R10)
79	MOVW	12(R11), R17
80	ADD	$16, R11
81	MOVW	R16, 8(R10)
82	MOVW	R17, 12(R10)
83	ADD	$16, R10
84	JMP	f3
85
86/*
87 * turn R9 into to-end pointer-3
88 * copy 4 at a time while theres room
89 */
90f4:
91	SUB	$3,R12, R9
92f5:
93	SUBCC	R10,R9, R0
94	BLEU	fout
95	MOVW	0(R11), R16
96	ADD	$4, R11
97	MOVW	R16, 0(R10)
98	ADD	$4, R10
99	JMP	f5
100
101/*
102 * last loop, copy byte at a time
103 */
104fout:
105	SUBCC	R11,R13, R0
106	BLEU	ret
107	MOVB	0(R11), R16
108	ADD	$1, R11
109	MOVB	R16, 0(R10)
110	ADD	$1, R10
111	JMP	fout
112
113/*
114 * whole thing repeated for backwards
115 */
116back:
117	SUBCC	$4,R9, R0
118	BL	bout
119
120	XOR	R12,R13, R7
121	ANDCC	$3,R7, R0
122	BNE	bout
123b1:
124	ANDCC	$3,R13, R0
125	BE	b2
126	MOVB	-1(R13), R16
127	SUB	$1, R13
128	MOVB	R16, -1(R12)
129	SUB	$1, R12
130	JMP	b1
131b2:
132	ADD	$15,R11, R9
133b3:
134	SUBCC	R9,R13, R0
135	BLEU	b4
136	MOVW	-4(R13), R16
137	MOVW	-8(R13), R17
138	MOVW	R16, -4(R12)
139	MOVW	-12(R13), R16
140	MOVW	R17, -8(R12)
141	MOVW	-16(R13), R17
142	SUB	$16, R13
143	MOVW	R16, -12(R12)
144	MOVW	R17, -16(R12)
145	SUB	$16, R12
146	JMP	b3
147b4:
148	ADD	$3,R11, R9
149b5:
150	SUBCC	R9,R13, R0
151	BLEU	bout
152	MOVW	-4(R13), R16
153	SUB	$4, R13
154	MOVW	R16, -4(R12)
155	SUB	$4, R12
156	JMP	b5
157
158bout:
159	SUBCC	R11,R13, R0
160	BLEU	ret
161	MOVB	-1(R13), R16
162	SUB	$1, R13
163	MOVB	R16, -1(R12)
164	SUB	$1, R12
165	JMP	bout
166
167ret:
168	MOVW	s1+0(FP), R7
169	RETURN
170