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