1;;; SPDX-License-Identifier: GPL-2.0
2;;; memcpy.S
3
4#include <asm/linkage.h>
5
6
7 .h8300h
8#endif
9
10 .h8300s
11#endif
12 .text
13.global memcpy
14
15;;; void *memcpy(void *to, void *from, size_t n)
16memcpy:
17 mov.l er2,er2
18 bne 1f
19 rts
201:
21 ;; address check
22 bld
23 bxor
24 bcs 4f
25 mov.l er4,@-sp
26 mov.l er0,@-sp
27 btst
28 beq 1f
29 ;; (aligned even) odd address
30 mov.b @er1,r3l
31 mov.b r3l,@er0
32 adds
33 adds
34 dec.l
35 beq 3f
361:
37 ;; n < sizeof(unsigned long) check
38 sub.l er4,er4
39 adds
40 cmp.l er4,er2
41 blo 2f
42 ;; unsigned long copy
431:
44 mov.l @er1,er3
45 mov.l er3,@er0
46 adds
47 adds
48 subs
49 cmp.l er4,er2
50 bcc 1b
51 ;; rest
522:
53 mov.l er2,er2
54 beq 3f
551:
56 mov.b @er1,r3l
57 mov.b r3l,@er0
58 adds
59 adds
60 dec.l
61 bne 1b
623:
63 mov.l @sp+,er0
64 mov.l @sp+,er4
65 rts
66
67 ;; odd <- even / even <- odd
684:
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
751:
76 eepmov.w
77 mov.w r4,r4
78 bne 1b
79 dec.w
80 bpl 1b
81 mov.l er1,er6
82 mov.l er2,er5
83 mov.l er3,er4
84 rts
85
86 .end
87