Linux-2.6.12-rc2
[linux-3.10.git] / arch / h8300 / lib / memcpy.S
1 ;;; memcpy.S
2
3 #include <asm/linkage.h>
4
5 #if defined(__H8300H__) 
6         .h8300h
7 #endif
8 #if defined(__H8300S__) 
9         .h8300s
10 #endif
11
12         .text
13 .global SYMBOL_NAME(memcpy)
14
15 ;;; void *memcpy(void *to, void *from, size_t n)
16 SYMBOL_NAME_LABEL(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