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
							 |