mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	MIPS: lib: memset: Add MIPS R6 support
MIPS R6 dropped the unaligned load and store instructions so we need to re-write this part of the code for R6 to store one byte at a time. Signed-off-by: Leonid Yegoshin <Leonid.Yegoshin@imgtec.com> Signed-off-by: Markos Chandras <markos.chandras@imgtec.com>
This commit is contained in:
		
							parent
							
								
									b0ce4bd535
								
							
						
					
					
						commit
						8c56208aff
					
				
					 1 changed files with 47 additions and 0 deletions
				
			
		| 
						 | 
				
			
			@ -111,6 +111,7 @@
 | 
			
		|||
	.set		at
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef CONFIG_CPU_MIPSR6
 | 
			
		||||
	R10KCBARRIER(0(ra))
 | 
			
		||||
#ifdef __MIPSEB__
 | 
			
		||||
	EX(LONG_S_L, a1, (a0), .Lfirst_fixup\@)	/* make word/dword aligned */
 | 
			
		||||
| 
						 | 
				
			
			@ -120,6 +121,30 @@
 | 
			
		|||
	PTR_SUBU	a0, t0			/* long align ptr */
 | 
			
		||||
	PTR_ADDU	a2, t0			/* correct size */
 | 
			
		||||
 | 
			
		||||
#else /* CONFIG_CPU_MIPSR6 */
 | 
			
		||||
#define STORE_BYTE(N)				\
 | 
			
		||||
	EX(sb, a1, N(a0), .Lbyte_fixup\@);	\
 | 
			
		||||
	beqz		t0, 0f;			\
 | 
			
		||||
	PTR_ADDU	t0, 1;
 | 
			
		||||
 | 
			
		||||
	PTR_ADDU	a2, t0			/* correct size */
 | 
			
		||||
	PTR_ADDU	t0, 1
 | 
			
		||||
	STORE_BYTE(0)
 | 
			
		||||
	STORE_BYTE(1)
 | 
			
		||||
#if LONGSIZE == 4
 | 
			
		||||
	EX(sb, a1, 2(a0), .Lbyte_fixup\@)
 | 
			
		||||
#else
 | 
			
		||||
	STORE_BYTE(2)
 | 
			
		||||
	STORE_BYTE(3)
 | 
			
		||||
	STORE_BYTE(4)
 | 
			
		||||
	STORE_BYTE(5)
 | 
			
		||||
	EX(sb, a1, 6(a0), .Lbyte_fixup\@)
 | 
			
		||||
#endif
 | 
			
		||||
0:
 | 
			
		||||
	ori		a0, STORMASK
 | 
			
		||||
	xori		a0, STORMASK
 | 
			
		||||
	PTR_ADDIU	a0, STORSIZE
 | 
			
		||||
#endif /* CONFIG_CPU_MIPSR6 */
 | 
			
		||||
1:	ori		t1, a2, 0x3f		/* # of full blocks */
 | 
			
		||||
	xori		t1, 0x3f
 | 
			
		||||
	beqz		t1, .Lmemset_partial\@	/* no block to fill */
 | 
			
		||||
| 
						 | 
				
			
			@ -159,6 +184,7 @@
 | 
			
		|||
	andi		a2, STORMASK		/* At most one long to go */
 | 
			
		||||
 | 
			
		||||
	beqz		a2, 1f
 | 
			
		||||
#ifndef CONFIG_CPU_MIPSR6
 | 
			
		||||
	PTR_ADDU	a0, a2			/* What's left */
 | 
			
		||||
	R10KCBARRIER(0(ra))
 | 
			
		||||
#ifdef __MIPSEB__
 | 
			
		||||
| 
						 | 
				
			
			@ -166,6 +192,22 @@
 | 
			
		|||
#else
 | 
			
		||||
	EX(LONG_S_L, a1, -1(a0), .Llast_fixup\@)
 | 
			
		||||
#endif
 | 
			
		||||
#else
 | 
			
		||||
	PTR_SUBU	t0, $0, a2
 | 
			
		||||
	PTR_ADDIU	t0, 1
 | 
			
		||||
	STORE_BYTE(0)
 | 
			
		||||
	STORE_BYTE(1)
 | 
			
		||||
#if LONGSIZE == 4
 | 
			
		||||
	EX(sb, a1, 2(a0), .Lbyte_fixup\@)
 | 
			
		||||
#else
 | 
			
		||||
	STORE_BYTE(2)
 | 
			
		||||
	STORE_BYTE(3)
 | 
			
		||||
	STORE_BYTE(4)
 | 
			
		||||
	STORE_BYTE(5)
 | 
			
		||||
	EX(sb, a1, 6(a0), .Lbyte_fixup\@)
 | 
			
		||||
#endif
 | 
			
		||||
0:
 | 
			
		||||
#endif
 | 
			
		||||
1:	jr		ra
 | 
			
		||||
	move		a2, zero
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -186,6 +228,11 @@
 | 
			
		|||
	.hidden __memset
 | 
			
		||||
	.endif
 | 
			
		||||
 | 
			
		||||
.Lbyte_fixup\@:
 | 
			
		||||
	PTR_SUBU	a2, $0, t0
 | 
			
		||||
	jr		ra
 | 
			
		||||
	 PTR_ADDIU	a2, 1
 | 
			
		||||
 | 
			
		||||
.Lfirst_fixup\@:
 | 
			
		||||
	jr	ra
 | 
			
		||||
	nop
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue