xref: /inferno-os/libkern/memmove-sparc.s (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
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 8 chars,
33 * dont even mess around.
34 * 7 chars to guarantee any
35 * rounding up to a word
36 * boundary and 8 characters
37 * to get at least maybe one
38 * full word store.
39 */
40	SUBCC	$8,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	$7,R7, R0
49	BNE	fout
50
51/*
52 * byte at a time to double align
53 */
54f1:
55	ANDCC	$7,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	MOVD	0(R11), R16
75	MOVD	R16, 0(R10)
76	MOVD	8(R11), R16
77	ADD	$16, R11
78	MOVD	R16, 8(R10)
79	ADD	$16, R10
80	JMP	f3
81
82/*
83 * turn R9 into to-end pointer-3
84 * copy 4 at a time while theres room
85 */
86f4:
87	SUB	$3,R12, R9
88f5:
89	SUBCC	R10,R9, R0
90	BLEU	fout
91	MOVW	0(R11), R16
92	ADD	$4, R11
93	MOVW	R16, 0(R10)
94	ADD	$4, R10
95	JMP	f5
96
97/*
98 * last loop, copy byte at a time
99 */
100fout:
101	SUBCC	R11,R13, R0
102	BLEU	ret
103	MOVB	0(R11), R16
104	ADD	$1, R11
105	MOVB	R16, 0(R10)
106	ADD	$1, R10
107	JMP	fout
108
109/*
110 * whole thing repeated for backwards
111 */
112back:
113	SUBCC	$8,R9, R0
114	BL	bout
115
116	XOR	R12,R13, R7
117	ANDCC	$7,R7, R0
118	BNE	bout
119b1:
120	ANDCC	$7,R13, R0
121	BE	b2
122	MOVB	-1(R13), R16
123	SUB	$1, R13
124	MOVB	R16, -1(R12)
125	SUB	$1, R12
126	JMP	b1
127b2:
128	ADD	$15,R11, R9
129b3:
130	SUBCC	R9,R13, R0
131	BLEU	b4
132
133	MOVD	-8(R13), R16
134	MOVD	R16, -8(R12)
135	MOVD	-16(R13), R16
136	SUB	$16, R13
137	MOVD	R16, -16(R12);
138	SUB	$16, R12
139	JMP	b3
140b4:
141	ADD	$3,R11, R9
142b5:
143	SUBCC	R9,R13, R0
144	BLEU	bout
145	MOVW	-4(R13), R16
146	SUB	$4, R13
147	MOVW	R16, -4(R12)
148	SUB	$4, R12
149	JMP	b5
150
151bout:
152	SUBCC	R11,R13, R0
153	BLEU	ret
154	MOVB	-1(R13), R16
155	SUB	$1, R13
156	MOVB	R16, -1(R12)
157	SUB	$1, R12
158	JMP	bout
159
160ret:
161	MOVW	s1+0(FP), R7
162	RETURN
163