fixes for host gcc 4.6.1
[zpugcc/jano.git] / toolchain / gcc / newlib / libc / machine / h8300 / memcpy.S
blob305e865df9aa55bc865c8991fb6c1fecb13d66a7
1 #include "setarch.h"
3 #include "defines.h"
5         .global _memcpy
6 _memcpy:
7 ;       MOVP    @(2/4,r7),A0P   ; dst
8 ;       MOVP    @(4/8,r7),A1P   ; src
9 ;       MOVP    @(6/12,r7),A2P  ; len
11         MOVP    A0P,A3P ; keep copy of final dst
12         ADDP    A2P,A0P ; point to end of dst
13         CMPP    A0P,A3P ; see if anything to do
14         beq     quit
16         ADDP    A2P,A1P ; point to end of src
18         ; lets see if we can do this in words
19         or      A0L,A2L ; or in the dst address
20         or      A3L,A2L ; or the length 
21         or      A1L,A2L ; or the src address
22         btst    #0,A2L  ; see if the lsb is zero
23         bne     byteloop
25 wordloop:
26 #ifdef __NORMAL_MODE__
27         sub     #2,A1P
28 #else
29         subs    #2,A1P          ; point to word
30 #endif
31         mov.w   @A1P,A2         ; get word
32         mov.w   A2,@-A0P        ; save word
33         CMPP    A0P,A3P         ; at the front again ?
34         bne     wordloop
35         rts
37 byteloop:
38 #ifdef __NORMAL_MODE__
39         sub     #1,A1P
40 #else
41         subs    #1,A1P          ; point to byte
42 #endif
43         mov.b   @A1P,A2L        ; get byte
44         mov.b   A2L,@-A0P       ; save byte
45         CMPP    A0P,A3P         ; at the front again ?
46         bne     byteloop
48         ; return with A0 pointing to dst
49 quit:   rts