This commit was manufactured by cvs2svn to create branch 'vserver'.
[linux-2.6.git] / arch / m32r / lib / memcpy.S
diff --git a/arch/m32r/lib/memcpy.S b/arch/m32r/lib/memcpy.S
new file mode 100644 (file)
index 0000000..800898a
--- /dev/null
@@ -0,0 +1,95 @@
+/*
+ *  linux/arch/m32r/lib/memcpy.S
+ *
+ *  Copyright (C) 2001  Hiroyuki Kondo, and Hirokazu Takata
+ *  Copyright (C) 2004  Hirokazu Takata
+ *
+ *  void *memcopy(void *dst, const void *src, int n);
+ *
+ *        dst: r0
+ *        src: r1
+ *        n  : r2
+ */
+/* $Id$ */
+
+
+       .text
+#include <linux/config.h>
+#include <linux/linkage.h>
+#include <asm/assembler.h>
+
+#ifdef CONFIG_ISA_DUAL_ISSUE
+
+       .text
+ENTRY(memcpy)
+memcopy:
+       mv      r4, r0              ||  mv      r7, r0
+       or      r7, r1              ||  cmpz    r2
+       jc      r14                 ||  cmpeq   r0, r1  ; return if r2=0
+       jc      r14                                     ; return if r0=r1
+
+       and3    r7, r7, #3
+       bnez    r7, byte_copy
+       srl3    r3, r2, #2
+       and3    r2, r2, #3
+       beqz    r3, byte_copy
+       addi    r4, #-4
+word_copy:
+       ld      r7, @r1+            ||  addi    r3, #-1
+       st      r7, @+r4            ||  cmpz    r2
+       bnez    r3, word_copy
+       addi    r4, #4              ||  jc      r14     ; return if r2=0
+#if defined(CONFIG_ISA_M32R2)
+byte_copy:
+       ldb     r7, @r1             ||  addi    r1, #1
+       addi    r2, #-1             ||  stb     r7, @r4+
+       bnez    r2, byte_copy
+#elif defined(CONFIG_ISA_M32R)
+byte_copy:
+       ldb     r7, @r1             ||  addi    r1, #1
+       addi    r2, #-1             ||  stb     r7, @r4
+       addi    r4, #1
+       bnez    r2, byte_copy
+#else
+#error unknown isa configuration
+#endif
+end_memcopy:
+       jmp     r14
+
+#else /* not CONFIG_ISA_DUAL_ISSUE */
+
+       .text
+ENTRY(memcpy)
+memcopy:
+       mv      r4, r0
+       mv      r7, r0
+       or      r7, r1
+       beq     r0, r1, end_memcopy
+       beqz    r2, end_memcopy
+
+       and3    r7, r7, #3
+       bnez    r7, byte_copy
+       srl3    r3, r2, #2
+       and3    r2, r2, #3
+       beqz    r3, byte_copy
+       addi    r4, #-4
+word_copy:
+       ld      r7, @r1+
+       addi    r3, #-1
+       st      r7, @+r4
+       bnez    r3, word_copy
+       beqz    r2, end_memcopy
+       addi    r4, #4
+byte_copy:
+       ldb     r7, @r1
+       addi    r1, #1
+       addi    r2, #-1
+       stb     r7, @r4
+       addi    r4, #1
+       bnez    r2, byte_copy
+end_memcopy:
+       jmp     r14
+
+#endif /* not CONFIG_ISA_DUAL_ISSUE */
+
+       .end