93 lines
		
	
	
	
		
			1.6 KiB
			
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
		
		
			
		
	
	
			93 lines
		
	
	
	
		
			1.6 KiB
			
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
|   | /* | ||
|  |  *  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 | ||
|  |  */ | ||
|  | 
 | ||
|  | 	.text | ||
|  | #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 |