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