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) 15memcpy: 16 mov.l er2,er2 17 bne 1f 18 rts 191: 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 351: 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 421: 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 512: 52 mov.l er2,er2 53 beq 3f 541: 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 613: 62 mov.l @sp+,er0 63 mov.l @sp+,er4 64 rts 65 66 ;; odd <- even / even <- odd 674: 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 741: 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 86