-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmemmove-int.S
100 lines (87 loc) · 1.63 KB
/
memmove-int.S
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
/*
============================================================================
Name : memmove-int.S
Author : hev <[email protected]>
Copyright : Copyright (c) 2023 hev
Description : Memmove INT
============================================================================
*/
#include "regdef.h"
.text
/*
* void *memmove(void *dst, const void *src, size_t n)
*
* a0: dst
* a1: src
* a2: n
*/
.align 6
.global memmove
memmove:
blt a0, a1, memcpy
sltui t0, a2, 25
bnez t0, __memcpy_small
add.d a3, a1, a2
add.d a2, a0, a2
ld.d a6, a1, 0
ld.d a7, a3, -8
/* align up destination address */
andi t1, a2, 7
sub.d a3, a3, t1
sub.d a5, a2, t1
addi.d a4, a1, 64
bgeu a4, a3, .Llt64
/* copy 64 bytes at a time */
.Lloop64:
ld.d t0, a3, -8
ld.d t1, a3, -16
ld.d t2, a3, -24
ld.d t3, a3, -32
ld.d t4, a3, -40
ld.d t5, a3, -48
ld.d t6, a3, -56
ld.d t7, a3, -64
addi.d a3, a3, -64
st.d t0, a5, -8
st.d t1, a5, -16
st.d t2, a5, -24
st.d t3, a5, -32
st.d t4, a5, -40
st.d t5, a5, -48
st.d t6, a5, -56
st.d t7, a5, -64
addi.d a5, a5, -64
bltu a4, a3, .Lloop64
/* copy the remaining bytes */
.Llt64:
addi.d a4, a1, 32
bgeu a4, a3, .Llt32
ld.d t0, a3, -8
ld.d t1, a3, -16
ld.d t2, a3, -24
ld.d t3, a3, -32
addi.d a3, a3, -32
st.d t0, a5, -8
st.d t1, a5, -16
st.d t2, a5, -24
st.d t3, a5, -32
addi.d a5, a5, -32
.Llt32:
addi.d a4, a1, 16
bgeu a4, a3, .Llt16
ld.d t0, a3, -8
ld.d t1, a3, -16
addi.d a3, a3, -16
st.d t0, a5, -8
st.d t1, a5, -16
addi.d a5, a5, -16
.Llt16:
addi.d a4, a1, 8
bgeu a4, a3, .Llt8
ld.d t0, a3, -8
st.d t0, a5, -8
.Llt8:
st.d a6, a0, 0
st.d a7, a2, -8
/* return */
jr ra