Commit | Line | Data |
---|---|---|
a71a29de YS |
1 | ;;; memcpy.S |
2 | ||
3 | #include <asm/linkage.h> | |
4 | ||
5 | #if defined(CONFIG_CPU_H8300H) | |
6 | .h8300h | |
7 | #endif | |
8 | #if defined(CONFIG_CPU_H8S) | |
9 | .h8300s | |
10 | #endif | |
11 | .text | |
12 | .global memcpy | |
13 | ||
14 | ;;; void *memcpy(void *to, void *from, size_t n) | |
15 | memcpy: | |
16 | mov.l er2,er2 | |
17 | bne 1f | |
18 | rts | |
19 | 1: | |
20 | ;; address check | |
21 | bld #0,r0l | |
22 | bxor #0,r1l | |
23 | bcs 4f | |
24 | mov.l er4,@-sp | |
25 | mov.l er0,@-sp | |
26 | btst #0,r0l | |
27 | beq 1f | |
28 | ;; (aligned even) odd address | |
29 | mov.b @er1,r3l | |
30 | mov.b r3l,@er0 | |
31 | adds #1,er1 | |
32 | adds #1,er0 | |
33 | dec.l #1,er2 | |
34 | beq 3f | |
35 | 1: | |
36 | ;; n < sizeof(unsigned long) check | |
37 | sub.l er4,er4 | |
38 | adds #4,er4 ; loop count check value | |
39 | cmp.l er4,er2 | |
40 | blo 2f | |
41 | ;; unsigned long copy | |
42 | 1: | |
43 | mov.l @er1,er3 | |
44 | mov.l er3,@er0 | |
45 | adds #4,er0 | |
46 | adds #4,er1 | |
47 | subs #4,er2 | |
48 | cmp.l er4,er2 | |
49 | bcc 1b | |
50 | ;; rest | |
51 | 2: | |
52 | mov.l er2,er2 | |
53 | beq 3f | |
54 | 1: | |
55 | mov.b @er1,r3l | |
56 | mov.b r3l,@er0 | |
57 | adds #1,er1 | |
58 | adds #1,er0 | |
59 | dec.l #1,er2 | |
60 | bne 1b | |
61 | 3: | |
62 | mov.l @sp+,er0 | |
63 | mov.l @sp+,er4 | |
64 | rts | |
65 | ||
66 | ;; odd <- even / even <- odd | |
67 | 4: | |
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 | |
74 | 1: | |
75 | eepmov.w | |
76 | mov.w r4,r4 | |
77 | bne 1b | |
78 | dec.w #1,e4 | |
79 | bpl 1b | |
80 | mov.l er1,er6 | |
81 | mov.l er2,er5 | |
82 | mov.l er3,er4 | |
83 | rts | |
84 | ||
85 | .end |