xref: /plan9-contrib/sys/src/libc/riscv/memmove.s (revision ce95e1b3727b9cb1c223ffbed69aff21a8ced255)
1
2	TEXT	memcpy(SB), $-4
3	TEXT	memmove(SB), $-4
4	MOVW	R8, s1+0(FP)
5
6	MOVW	n+8(FP), R9	/* count */
7	BEQ	R9, return
8	BGT	R9, ok
9	MOVW	$0, R9
10ok:
11	MOVW	s1+0(FP), R11	/* dest pointer */
12	MOVW	s2+4(FP), R10	/* source pointer */
13
14	BLTU	R11, R10, back
15
16/*
17 * byte-at-a-time forward copy to
18 * get source (R10) aligned.
19 */
20f1:
21	AND	$3, R10, R8
22	BEQ	R8, f2
23	SUB	$1, R9
24	BLT	R9, return
25	MOVB	(R10), R8
26	MOVB	R8, (R11)
27	ADD	$1, R10
28	ADD	$1, R11
29	JMP	f1
30
31/*
32 * check that dest is aligned
33 * if not, just go byte-at-a-time
34 */
35f2:
36	AND	$3, R11, R8
37	BEQ	R8, f3
38	SUB	$1, R9
39	BLT	R9, return
40	JMP	f5
41/*
42 * quad-long-at-a-time forward copy
43 */
44f3:
45	SUB	$16, R9
46	BLT	R9, f4
47	MOVW	0(R10), R12
48	MOVW	4(R10), R13
49	MOVW	8(R10), R14
50	MOVW	12(R10), R15
51	MOVW	R12, 0(R11)
52	MOVW	R13, 4(R11)
53	MOVW	R14, 8(R11)
54	MOVW	R15, 12(R11)
55	ADD	$16, R10
56	ADD	$16, R11
57	JMP	f3
58
59/*
60 * cleanup byte-at-a-time
61 */
62f4:
63	ADD	$15, R9
64	BLT	R9, return
65f5:
66	MOVB	(R10), R8
67	MOVB	R8, (R11)
68	ADD	$1, R10
69	ADD	$1, R11
70	SUB	$1, R9
71	BGE	R9, f5
72	JMP	return
73
74return:
75	MOVW	s1+0(FP),R8
76	RET
77
78/*
79 * everything the same, but
80 * copy backwards
81 */
82back:
83	ADD	R9, R10
84	ADD	R9, R11
85
86/*
87 * byte-at-a-time backward copy to
88 * get source (R10) aligned.
89 */
90b1:
91	AND	$3, R10, R8
92	BEQ	R8, b2
93	SUB	$1, R9
94	BLT	R9, return
95	SUB	$1, R10
96	SUB	$1, R11
97	MOVB	(R10), R8
98	MOVB	R8, (R11)
99	JMP	b1
100
101/*
102 * check that dest is aligned
103 * if not, just go byte-at-a-time
104 */
105b2:
106	AND	$3, R11, R8
107	BEQ	R8, b3
108	SUB	$1, R9
109	BLT	R9, return
110	JMP	b5
111/*
112 * quad-long-at-a-time backward copy
113 */
114b3:
115	SUB	$16, R9
116	BLT	R9, b4
117	SUB	$16, R10
118	SUB	$16, R11
119	MOVW	0(R10), R12
120	MOVW	4(R10), R13
121	MOVW	8(R10), R14
122	MOVW	12(R10), R15
123	MOVW	R12, 0(R11)
124	MOVW	R13, 4(R11)
125	MOVW	R14, 8(R11)
126	MOVW	R15, 12(R11)
127	JMP	b3
128
129/*
130 * cleanup byte-at-a-time backward
131 */
132b4:
133	ADD	$15, R9
134	BLT	R9, return
135b5:
136	SUB	$1, R10
137	SUB	$1, R11
138	MOVB	(R10), R8
139	MOVB	R8, (R11)
140	SUB	$1, R9
141	BGE	R9, b5
142	JMP	return
143