linux/arch/h8300/lib/memcpy.S
<<
>>
Prefs
   1;;; SPDX-License-Identifier: GPL-2.0
   2;;; memcpy.S
   3
   4#include <asm/linkage.h>
   5
   6#if defined(CONFIG_CPU_H8300H)
   7        .h8300h
   8#endif
   9#if defined(CONFIG_CPU_H8S)
  10        .h8300s
  11#endif
  12        .text
  13.global memcpy
  14
  15;;; void *memcpy(void *to, void *from, size_t n)
  16memcpy:
  17        mov.l   er2,er2
  18        bne     1f
  19        rts
  201:
  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
  361:
  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
  431:
  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
  522:
  53        mov.l   er2,er2
  54        beq     3f
  551:
  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
  623:
  63        mov.l   @sp+,er0
  64        mov.l   @sp+,er4
  65        rts
  66
  67        ;; odd <- even / even <- odd
  684:
  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
  751:
  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
  85
  86        .end
  87