1;;; memcpy.S
2
3#include <asm/linkage.h>
4
5
6 .h8300h
7#endif
8
9 .h8300s
10#endif
11 .text
12.global memcpy
13
14;;; void *memcpy(void *to, void *from, size_t n)
15memcpy:
16 mov.l er2,er2
17 bne 1f
18 rts
191:
20 ;; address check
21 bld
22 bxor
23 bcs 4f
24 mov.l er4,@-sp
25 mov.l er0,@-sp
26 btst
27 beq 1f
28 ;; (aligned even) odd address
29 mov.b @er1,r3l
30 mov.b r3l,@er0
31 adds
32 adds
33 dec.l
34 beq 3f
351:
36 ;; n < sizeof(unsigned long) check
37 sub.l er4,er4
38 adds
39 cmp.l er4,er2
40 blo 2f
41 ;; unsigned long copy
421:
43 mov.l @er1,er3
44 mov.l er3,@er0
45 adds
46 adds
47 subs
48 cmp.l er4,er2
49 bcc 1b
50 ;; rest
512:
52 mov.l er2,er2
53 beq 3f
541:
55 mov.b @er1,r3l
56 mov.b r3l,@er0
57 adds
58 adds
59 dec.l
60 bne 1b
613:
62 mov.l @sp+,er0
63 mov.l @sp+,er4
64 rts
65
66 ;; odd <- even / even <- odd
674:
68 mov.l er4,er3
69 mov.l er2,er4
70 mov.l er5,er2
71 mov.l er1,er5
72 mov.l er6,er1
73 mov.l er0,er6
741:
75 eepmov.w
76 mov.w r4,r4
77 bne 1b
78 dec.w
79 bpl 1b
80 mov.l er1,er6
81 mov.l er2,er5
82 mov.l er3,er4
83 rts
84
85 .end
86