Home | History | Annotate | Download | only in lib
      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
     21 ENTRY(memcpy)
     22 memcopy:
     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
     34 word_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)
     40 byte_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)
     45 byte_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
     53 end_memcopy:
     54 	jmp	r14
     55 
     56 #else /* not CONFIG_ISA_DUAL_ISSUE */
     57 
     58 	.text
     59 ENTRY(memcpy)
     60 memcopy:
     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
     73 word_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
     80 byte_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
     87 end_memcopy:
     88 	jmp	r14
     89 
     90 #endif /* not CONFIG_ISA_DUAL_ISSUE */
     91 
     92 	.end
     93