diff options
Diffstat (limited to 'arch/powerpc/lib/memcpy_64.S')
| -rw-r--r-- | arch/powerpc/lib/memcpy_64.S | 28 | 
1 files changed, 23 insertions, 5 deletions
diff --git a/arch/powerpc/lib/memcpy_64.S b/arch/powerpc/lib/memcpy_64.S index d2bbbc8d7dc..32a06ec395d 100644 --- a/arch/powerpc/lib/memcpy_64.S +++ b/arch/powerpc/lib/memcpy_64.S @@ -10,12 +10,29 @@  #include <asm/ppc_asm.h>  	.align	7 -_GLOBAL(memcpy) +_GLOBAL_TOC(memcpy)  BEGIN_FTR_SECTION -	std	r3,48(r1)	/* save destination pointer for return value */ +#ifdef __LITTLE_ENDIAN__ +	cmpdi	cr7,r5,0 +#else +	std	r3,-STACKFRAMESIZE+STK_REG(R31)(r1)	/* save destination pointer for return value */ +#endif  FTR_SECTION_ELSE +#ifndef SELFTEST  	b	memcpy_power7 +#endif  ALT_FTR_SECTION_END_IFCLR(CPU_FTR_VMX_COPY) +#ifdef __LITTLE_ENDIAN__ +	/* dumb little-endian memcpy that will get replaced at runtime */ +	addi r9,r3,-1 +	addi r4,r4,-1 +	beqlr cr7 +	mtctr r5 +1:	lbzu r10,1(r4) +	stbu r10,1(r9) +	bdnz 1b +	blr +#else  	PPC_MTOCRF(0x01,r5)  	cmpldi	cr1,r5,16  	neg	r6,r3		# LS 3 bits = # bytes to 8-byte dest bdry @@ -71,7 +88,7 @@ END_FTR_SECTION_IFCLR(CPU_FTR_UNALIGNED_LD_STD)  2:	bf	cr7*4+3,3f  	lbz	r9,8(r4)  	stb	r9,0(r3) -3:	ld	r3,48(r1)	/* return dest pointer */ +3:	ld	r3,-STACKFRAMESIZE+STK_REG(R31)(r1)	/* return dest pointer */  	blr  .Lsrc_unaligned: @@ -154,7 +171,7 @@ END_FTR_SECTION_IFCLR(CPU_FTR_UNALIGNED_LD_STD)  2:	bf	cr7*4+3,3f  	rotldi	r9,r9,8  	stb	r9,0(r3) -3:	ld	r3,48(r1)	/* return dest pointer */ +3:	ld	r3,-STACKFRAMESIZE+STK_REG(R31)(r1)	/* return dest pointer */  	blr  .Ldst_unaligned: @@ -199,5 +216,6 @@ END_FTR_SECTION_IFCLR(CPU_FTR_UNALIGNED_LD_STD)  3:	bf	cr7*4+3,4f  	lbz	r0,0(r4)  	stb	r0,0(r3) -4:	ld	r3,48(r1)	/* return dest pointer */ +4:	ld	r3,-STACKFRAMESIZE+STK_REG(R31)(r1)	/* return dest pointer */  	blr +#endif  | 
