]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blob - arch/h8300/lib/memcpy.S
b43: Fix memory leaks in b43_bus_dev_ssb_init and b43_bus_dev_bcma_init
[mirror_ubuntu-bionic-kernel.git] / arch / h8300 / lib / memcpy.S
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