]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blob - arch/h8300/lib/memcpy.S
UBUNTU: Ubuntu-4.15.0-96.97
[mirror_ubuntu-bionic-kernel.git] / arch / h8300 / lib / memcpy.S
1 ;;; SPDX-License-Identifier: GPL-2.0
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