 478b8fecda
			
		
	
	
	478b8fecda
	
	
	
		
			
			o Renamed files in sparc64 to <name>_64.S when identical to sparc32 files. o iomap.c were equal for sparc32 and sparc64 o adjusted sparc/Makefile now we have only one lib/ Signed-off-by: Sam Ravnborg <sam@ravnborg.org> Signed-off-by: David S. Miller <davem@davemloft.net>
		
			
				
	
	
		
			121 lines
		
	
	
	
		
			1.9 KiB
			
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			121 lines
		
	
	
	
		
			1.9 KiB
			
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| /* GENmemcpy.S: Generic sparc64 memcpy.
 | |
|  *
 | |
|  * Copyright (C) 2007 David S. Miller (davem@davemloft.net)
 | |
|  */
 | |
| 
 | |
| #ifdef __KERNEL__
 | |
| #define GLOBAL_SPARE	%g7
 | |
| #else
 | |
| #define GLOBAL_SPARE	%g5
 | |
| #endif
 | |
| 
 | |
| #ifndef EX_LD
 | |
| #define EX_LD(x)	x
 | |
| #endif
 | |
| 
 | |
| #ifndef EX_ST
 | |
| #define EX_ST(x)	x
 | |
| #endif
 | |
| 
 | |
| #ifndef EX_RETVAL
 | |
| #define EX_RETVAL(x)	x
 | |
| #endif
 | |
| 
 | |
| #ifndef LOAD
 | |
| #define LOAD(type,addr,dest)	type [addr], dest
 | |
| #endif
 | |
| 
 | |
| #ifndef STORE
 | |
| #define STORE(type,src,addr)	type src, [addr]
 | |
| #endif
 | |
| 
 | |
| #ifndef FUNC_NAME
 | |
| #define FUNC_NAME	GENmemcpy
 | |
| #endif
 | |
| 
 | |
| #ifndef PREAMBLE
 | |
| #define PREAMBLE
 | |
| #endif
 | |
| 
 | |
| #ifndef XCC
 | |
| #define XCC xcc
 | |
| #endif
 | |
| 
 | |
| 	.register	%g2,#scratch
 | |
| 	.register	%g3,#scratch
 | |
| 
 | |
| 	.text
 | |
| 	.align		64
 | |
| 
 | |
| 	.globl	FUNC_NAME
 | |
| 	.type	FUNC_NAME,#function
 | |
| FUNC_NAME:	/* %o0=dst, %o1=src, %o2=len */
 | |
| 	srlx		%o2, 31, %g2
 | |
| 	cmp		%g2, 0
 | |
| 	tne		%XCC, 5
 | |
| 	PREAMBLE
 | |
| 	mov		%o0, GLOBAL_SPARE
 | |
| 
 | |
| 	cmp		%o2, 0
 | |
| 	be,pn		%XCC, 85f
 | |
| 	 or		%o0, %o1, %o3
 | |
| 	cmp		%o2, 16
 | |
| 	blu,a,pn	%XCC, 80f
 | |
| 	 or		%o3, %o2, %o3
 | |
| 
 | |
| 	xor		%o0, %o1, %o4
 | |
| 	andcc		%o4, 0x7, %g0
 | |
| 	bne,a,pn	%XCC, 90f
 | |
| 	 sub		%o0, %o1, %o3
 | |
| 
 | |
| 	and		%o0, 0x7, %o4
 | |
| 	sub		%o4, 0x8, %o4
 | |
| 	sub		%g0, %o4, %o4
 | |
| 	sub		%o2, %o4, %o2
 | |
| 1:	subcc		%o4, 1, %o4
 | |
| 	EX_LD(LOAD(ldub, %o1, %g1))
 | |
| 	EX_ST(STORE(stb, %g1, %o0))
 | |
| 	add		%o1, 1, %o1
 | |
| 	bne,pt		%XCC, 1b
 | |
| 	add		%o0, 1, %o0
 | |
| 
 | |
| 	andn		%o2, 0x7, %g1
 | |
| 	sub		%o2, %g1, %o2
 | |
| 1:	subcc		%g1, 0x8, %g1
 | |
| 	EX_LD(LOAD(ldx, %o1, %g2))
 | |
| 	EX_ST(STORE(stx, %g2, %o0))
 | |
| 	add		%o1, 0x8, %o1
 | |
| 	bne,pt		%XCC, 1b
 | |
| 	 add		%o0, 0x8, %o0
 | |
| 
 | |
| 	brz,pt		%o2, 85f
 | |
| 	 sub		%o0, %o1, %o3
 | |
| 	ba,a,pt		%XCC, 90f
 | |
| 
 | |
| 	.align		64
 | |
| 80: /* 0 < len <= 16 */
 | |
| 	andcc		%o3, 0x3, %g0
 | |
| 	bne,pn		%XCC, 90f
 | |
| 	 sub		%o0, %o1, %o3
 | |
| 
 | |
| 1:
 | |
| 	subcc		%o2, 4, %o2
 | |
| 	EX_LD(LOAD(lduw, %o1, %g1))
 | |
| 	EX_ST(STORE(stw, %g1, %o1 + %o3))
 | |
| 	bgu,pt		%XCC, 1b
 | |
| 	 add		%o1, 4, %o1
 | |
| 
 | |
| 85:	retl
 | |
| 	 mov		EX_RETVAL(GLOBAL_SPARE), %o0
 | |
| 
 | |
| 	.align		32
 | |
| 90:
 | |
| 	subcc		%o2, 1, %o2
 | |
| 	EX_LD(LOAD(ldub, %o1, %g1))
 | |
| 	EX_ST(STORE(stb, %g1, %o1 + %o3))
 | |
| 	bgu,pt		%XCC, 90b
 | |
| 	 add		%o1, 1, %o1
 | |
| 	retl
 | |
| 	 mov		EX_RETVAL(GLOBAL_SPARE), %o0
 | |
| 
 | |
| 	.size		FUNC_NAME, .-FUNC_NAME
 |