linux/arch/h8300/lib/memcpy.S
<<
>>
Prefs
   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