179 lines
		
	
	
	
		
			3.1 KiB
			
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
		
		
			
		
	
	
			179 lines
		
	
	
	
		
			3.1 KiB
			
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
|   | /* | ||
|  |  *  linux/arch/m32r/lib/memset.S | ||
|  |  * | ||
|  |  *  Copyright (C) 2001,2002  Hiroyuki Kondo, and Hirokazu Takata | ||
|  |  *  Copyright (C) 2004  Hirokazu Takata | ||
|  |  * | ||
|  |  *  void *memset(void *dst, int val, int len);
 | ||
|  |  * | ||
|  |  *        dst: r0 | ||
|  |  *        val: r1 | ||
|  |  *        len: r2 | ||
|  |  *        ret: r0 | ||
|  |  * | ||
|  |  */ | ||
|  | 
 | ||
|  | 	.text | ||
|  | 	.global	memset
 | ||
|  | 
 | ||
|  | #ifdef CONFIG_ISA_DUAL_ISSUE | ||
|  | 
 | ||
|  | 	.align 4
 | ||
|  | memset: | ||
|  | 	mv      r4, r0		    ||	cmpz	r2 | ||
|  | 	jc	r14 | ||
|  | 	cmpui	r2, #16 | ||
|  | 	bnc	qword_align_check | ||
|  | 	cmpui	r2, #4 | ||
|  | 	bc	byte_set | ||
|  | word_align_check:			/* len >= 4 */ | ||
|  | 	and3	r3, r4, #3 | ||
|  | 	beqz	r3, word_set | ||
|  | 	addi	r3, #-4 | ||
|  | 	neg	r3, r3			/* r3 = -(r3 - 4) */ | ||
|  | align_word: | ||
|  | 	stb	r1, @r4		    ||	addi	r4, #1
 | ||
|  | 	addi	r2, #-1		    ||	addi	r3, #-1 | ||
|  | 	bnez	r3, align_word | ||
|  | 	cmpui	r2, #4 | ||
|  | 	bc	byte_set | ||
|  | word_set: | ||
|  | 	and3	r1, r1, #0x00ff		/* r1: abababab <-- ??????ab */ | ||
|  | 	sll3	r3, r1, #8 | ||
|  | 	or	r1, r3		    ||	addi	r4, #-4 | ||
|  | 	sll3	r3, r1, #16 | ||
|  | 	or	r1, r3		    ||	addi	r2, #-4 | ||
|  | word_set_loop: | ||
|  | 	st	r1, @+r4	    ||	addi	r2, #-4
 | ||
|  | 	bgtz	r2, word_set_loop | ||
|  | 	bnez	r2, byte_set_wrap | ||
|  | 	st	r1, @+r4
 | ||
|  | 	jmp	r14 | ||
|  | 
 | ||
|  | qword_align_check:			/* len >= 16 */ | ||
|  | 	and3	r3, r4, #15 | ||
|  | 	bnez	r3, word_align_check | ||
|  | qword_set: | ||
|  | 	and3	r1, r1, #0x00ff		/* r1: abababab <-- ??????ab */ | ||
|  | 	sll3	r3, r1, #8 | ||
|  | 	or	r1, r3		    ||	addi	r4, #-4 | ||
|  | 	sll3	r3, r1, #16 | ||
|  | 	or	r1, r3		    ||	ldi	r5, #16 | ||
|  | qword_set_loop: | ||
|  | 	ld	r3, @(4,r4)		/* cache line allocate */
 | ||
|  | 	st	r1, @+r4	    ||	addi	r2, #-16
 | ||
|  | 	st	r1, @+r4	    ||	cmpu	r2, r5
 | ||
|  | 	st	r1, @+r4
 | ||
|  | 	st	r1, @+r4
 | ||
|  | 	bnc	qword_set_loop	    ||  cmpz	r2 | ||
|  | 	jc	r14 | ||
|  | set_remainder: | ||
|  | 	cmpui	r2, #4 | ||
|  | 	bc	byte_set_wrap1 | ||
|  | 	addi	r2, #-4 | ||
|  | 	bra	word_set_loop | ||
|  | 
 | ||
|  | byte_set_wrap: | ||
|  | 	addi	r2, #4 | ||
|  | 	cmpz	r2 | ||
|  | 	jc	r14 | ||
|  | byte_set_wrap1: | ||
|  | 	addi	r4, #4 | ||
|  | #if defined(CONFIG_ISA_M32R2) | ||
|  | byte_set: | ||
|  | 	addi	r2, #-1		    ||	stb	r1, @r4+
 | ||
|  | 	bnez	r2, byte_set | ||
|  | #elif defined(CONFIG_ISA_M32R) | ||
|  | byte_set: | ||
|  | 	addi	r2, #-1		    ||	stb	r1, @r4
 | ||
|  | 	addi	r4, #1 | ||
|  | 	bnez	r2, byte_set | ||
|  | #else | ||
|  | #error unknown isa configuration | ||
|  | #endif | ||
|  | end_memset: | ||
|  | 	jmp	r14 | ||
|  | 
 | ||
|  | #else /* not CONFIG_ISA_DUAL_ISSUE */ | ||
|  | 
 | ||
|  | 	.align 4
 | ||
|  | memset: | ||
|  | 	mv      r4, r0 | ||
|  | 	beqz	r2, end_memset | ||
|  | 	cmpui	r2, #16 | ||
|  | 	bnc	qword_align_check | ||
|  | 	cmpui	r2, #4 | ||
|  | 	bc	byte_set | ||
|  | word_align_check:			/* len >= 4 */ | ||
|  | 	and3	r3, r4, #3 | ||
|  | 	beqz	r3, word_set | ||
|  | 	addi	r3, #-4 | ||
|  | 	neg	r3, r3			/* r3 = -(r3 - 4) */ | ||
|  | align_word: | ||
|  | 	stb	r1, @r4
 | ||
|  | 	addi	r4, #1 | ||
|  | 	addi	r2, #-1 | ||
|  | 	addi	r3, #-1 | ||
|  | 	bnez	r3, align_word | ||
|  | 	cmpui	r2, #4 | ||
|  | 	bc	byte_set | ||
|  | word_set: | ||
|  | 	and3	r1, r1, #0x00ff		/* r1: abababab <-- ??????ab */ | ||
|  | 	sll3	r3, r1, #8 | ||
|  | 	or	r1, r3 | ||
|  | 	sll3	r3, r1, #16 | ||
|  | 	or	r1, r3 | ||
|  | 	addi	r2, #-4 | ||
|  | 	addi	r4, #-4 | ||
|  | word_set_loop: | ||
|  | 	st	r1, @+r4
 | ||
|  | 	addi	r2, #-4 | ||
|  | 	bgtz    r2, word_set_loop | ||
|  | 	bnez	r2, byte_set_wrap | ||
|  | 	st	r1, @+r4
 | ||
|  | 	jmp	r14 | ||
|  | 
 | ||
|  | qword_align_check:			/* len >= 16 */ | ||
|  | 	and3	r3, r4, #15 | ||
|  | 	bnez	r3, word_align_check | ||
|  | qword_set: | ||
|  | 	and3	r1, r1, #0x00ff		/* r1: abababab <-- ??????ab */ | ||
|  | 	sll3	r3, r1, #8 | ||
|  | 	or	r1, r3 | ||
|  | 	sll3	r3, r1, #16 | ||
|  | 	or	r1, r3 | ||
|  | 	addi	r4, #-4 | ||
|  | qword_set_loop: | ||
|  | 	ld	r3, @(4,r4)		/* cache line allocate */
 | ||
|  | 	addi	r2, #-16 | ||
|  | 	st	r1, @+r4
 | ||
|  | 	st	r1, @+r4
 | ||
|  | 	cmpui	r2, #16 | ||
|  | 	st	r1, @+r4
 | ||
|  | 	st	r1, @+r4
 | ||
|  | 	bnc	qword_set_loop | ||
|  | 	bnez	r2, set_remainder | ||
|  | 	jmp	r14 | ||
|  | set_remainder: | ||
|  | 	cmpui	r2, #4 | ||
|  | 	bc	byte_set_wrap1 | ||
|  | 	addi	r2, #-4 | ||
|  | 	bra	word_set_loop | ||
|  | 
 | ||
|  | byte_set_wrap: | ||
|  | 	addi	r2, #4 | ||
|  | 	beqz	r2, end_memset | ||
|  | byte_set_wrap1: | ||
|  | 	addi	r4, #4 | ||
|  | byte_set: | ||
|  | 	addi	r2, #-1 | ||
|  | 	stb	r1, @r4
 | ||
|  | 	addi	r4, #1 | ||
|  | 	bnez	r2, byte_set | ||
|  | end_memset: | ||
|  | 	jmp	r14 | ||
|  | 
 | ||
|  | #endif /* not CONFIG_ISA_DUAL_ISSUE */ | ||
|  | 
 | ||
|  | 	.end |