linux/arch/m32r/lib/memcpy.S
<<
>>
Prefs
   1/*
   2 *  linux/arch/m32r/lib/memcpy.S
   3 *
   4 *  Copyright (C) 2001  Hiroyuki Kondo, and Hirokazu Takata
   5 *  Copyright (C) 2004  Hirokazu Takata
   6 *
   7 *  void *memcopy(void *dst, const void *src, int n);
   8 *
   9 *        dst: r0
  10 *        src: r1
  11 *        n  : r2
  12 */
  13
  14        .text
  15#include <linux/linkage.h>
  16#include <asm/assembler.h>
  17
  18#ifdef CONFIG_ISA_DUAL_ISSUE
  19
  20        .text
  21ENTRY(memcpy)
  22memcopy:
  23        mv      r4, r0              ||  mv      r7, r0
  24        or      r7, r1              ||  cmpz    r2
  25        jc      r14                 ||  cmpeq   r0, r1  ; return if r2=0
  26        jc      r14                                     ; return if r0=r1
  27
  28        and3    r7, r7, #3
  29        bnez    r7, byte_copy
  30        srl3    r3, r2, #2
  31        and3    r2, r2, #3
  32        beqz    r3, byte_copy
  33        addi    r4, #-4
  34word_copy:
  35        ld      r7, @r1+            ||  addi    r3, #-1
  36        st      r7, @+r4            ||  cmpz    r2
  37        bnez    r3, word_copy
  38        addi    r4, #4              ||  jc      r14     ; return if r2=0
  39#if defined(CONFIG_ISA_M32R2)
  40byte_copy:
  41        ldb     r7, @r1             ||  addi    r1, #1
  42        addi    r2, #-1             ||  stb     r7, @r4+
  43        bnez    r2, byte_copy
  44#elif defined(CONFIG_ISA_M32R)
  45byte_copy:
  46        ldb     r7, @r1             ||  addi    r1, #1
  47        addi    r2, #-1             ||  stb     r7, @r4
  48        addi    r4, #1
  49        bnez    r2, byte_copy
  50#else
  51#error unknown isa configuration
  52#endif
  53end_memcopy:
  54        jmp     r14
  55
  56#else /* not CONFIG_ISA_DUAL_ISSUE */
  57
  58        .text
  59ENTRY(memcpy)
  60memcopy:
  61        mv      r4, r0
  62        mv      r7, r0
  63        or      r7, r1
  64        beq     r0, r1, end_memcopy
  65        beqz    r2, end_memcopy
  66
  67        and3    r7, r7, #3
  68        bnez    r7, byte_copy
  69        srl3    r3, r2, #2
  70        and3    r2, r2, #3
  71        beqz    r3, byte_copy
  72        addi    r4, #-4
  73word_copy:
  74        ld      r7, @r1+
  75        addi    r3, #-1
  76        st      r7, @+r4
  77        bnez    r3, word_copy
  78        beqz    r2, end_memcopy
  79        addi    r4, #4
  80byte_copy:
  81        ldb     r7, @r1
  82        addi    r1, #1
  83        addi    r2, #-1
  84        stb     r7, @r4
  85        addi    r4, #1
  86        bnez    r2, byte_copy
  87end_memcopy:
  88        jmp     r14
  89
  90#endif /* not CONFIG_ISA_DUAL_ISSUE */
  91
  92        .end
  93
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.