]>
Commit | Line | Data |
---|---|---|
b2441318 | 1 | ;;; SPDX-License-Identifier: GPL-2.0 |
a71a29de YS |
2 | ;;; memcpy.S |
3 | ||
4 | #include <asm/linkage.h> | |
5 | ||
6 | #if defined(CONFIG_CPU_H8300H) | |
7 | .h8300h | |
8 | #endif | |
9 | #if defined(CONFIG_CPU_H8S) | |
10 | .h8300s | |
11 | #endif | |
12 | .text | |
13 | .global memcpy | |
14 | ||
15 | ;;; void *memcpy(void *to, void *from, size_t n) | |
16 | 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 | .end |