Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/h8300/lib/memcpy.S
10817 views
1
;;; memcpy.S
2
3
#include <asm/linkage.h>
4
5
#if defined(__H8300H__)
6
.h8300h
7
#endif
8
#if defined(__H8300S__)
9
.h8300s
10
#endif
11
12
.text
13
.global SYMBOL_NAME(memcpy)
14
15
;;; void *memcpy(void *to, void *from, size_t n)
16
SYMBOL_NAME_LABEL(memcpy)
17
mov.l er2,er2
18
bne 1f
19
rts
20
1:
21
;; address check
22
bld #0,r0l
23
bxor #0,r1l
24
bcs 4f
25
mov.l er4,@-sp
26
mov.l er0,@-sp
27
btst #0,r0l
28
beq 1f
29
;; (aligned even) odd address
30
mov.b @er1,r3l
31
mov.b r3l,@er0
32
adds #1,er1
33
adds #1,er0
34
dec.l #1,er2
35
beq 3f
36
1:
37
;; n < sizeof(unsigned long) check
38
sub.l er4,er4
39
adds #4,er4 ; loop count check value
40
cmp.l er4,er2
41
blo 2f
42
;; unsigned long copy
43
1:
44
mov.l @er1,er3
45
mov.l er3,@er0
46
adds #4,er0
47
adds #4,er1
48
subs #4,er2
49
cmp.l er4,er2
50
bcc 1b
51
;; rest
52
2:
53
mov.l er2,er2
54
beq 3f
55
1:
56
mov.b @er1,r3l
57
mov.b r3l,@er0
58
adds #1,er1
59
adds #1,er0
60
dec.l #1,er2
61
bne 1b
62
3:
63
mov.l @sp+,er0
64
mov.l @sp+,er4
65
rts
66
67
;; odd <- even / even <- odd
68
4:
69
mov.l er4,er3
70
mov.l er2,er4
71
mov.l er5,er2
72
mov.l er1,er5
73
mov.l er6,er1
74
mov.l er0,er6
75
1:
76
eepmov.w
77
mov.w r4,r4
78
bne 1b
79
dec.w #1,e4
80
bpl 1b
81
mov.l er1,er6
82
mov.l er2,er5
83
mov.l er3,er4
84
rts
85
86