Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ee841d0a authored by David S. Miller's avatar David S. Miller
Browse files

sparc64: Convert U3copy_{from,to}_user to accurate exception reporting.



Report the exact number of bytes which have not been successfully
copied when an exception occurs, using the running remaining length.

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent e93704e4
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -3,19 +3,19 @@
 * Copyright (C) 1999, 2000, 2004 David S. Miller (davem@redhat.com)
 */

#define EX_LD(x)		\
#define EX_LD(x,y)		\
98:	x;			\
	.section __ex_table,"a";\
	.align 4;		\
	.word 98b, __retl_mone;	\
	.word 98b, y;		\
	.text;			\
	.align 4;

#define EX_LD_FP(x)		\
#define EX_LD_FP(x,y)		\
98:	x;			\
	.section __ex_table,"a";\
	.align 4;		\
	.word 98b, __retl_mone_fp;\
	.word 98b, y##_fp;	\
	.text;			\
	.align 4;

+4 −4
Original line number Diff line number Diff line
@@ -3,19 +3,19 @@
 * Copyright (C) 1999, 2000, 2004 David S. Miller (davem@redhat.com)
 */

#define EX_ST(x)		\
#define EX_ST(x,y)		\
98:	x;			\
	.section __ex_table,"a";\
	.align 4;		\
	.word 98b, __retl_mone;	\
	.word 98b, y;		\
	.text;			\
	.align 4;

#define EX_ST_FP(x)		\
#define EX_ST_FP(x,y)		\
98:	x;			\
	.section __ex_table,"a";\
	.align 4;		\
	.word 98b, __retl_mone_fp;\
	.word 98b, y##_fp;	\
	.text;			\
	.align 4;

+154 −73
Original line number Diff line number Diff line
@@ -4,6 +4,7 @@
 */

#ifdef __KERNEL__
#include <linux/linkage.h>
#include <asm/visasm.h>
#include <asm/asi.h>
#define GLOBAL_SPARE	%g7
@@ -22,21 +23,17 @@
#endif

#ifndef EX_LD
#define EX_LD(x)	x
#define EX_LD(x,y)	x
#endif
#ifndef EX_LD_FP
#define EX_LD_FP(x)	x
#define EX_LD_FP(x,y)	x
#endif

#ifndef EX_ST
#define EX_ST(x)	x
#define EX_ST(x,y)	x
#endif
#ifndef EX_ST_FP
#define EX_ST_FP(x)	x
#endif

#ifndef EX_RETVAL
#define EX_RETVAL(x)	x
#define EX_ST_FP(x,y)	x
#endif

#ifndef LOAD
@@ -77,6 +74,87 @@
	 */

	.text
#ifndef EX_RETVAL
#define EX_RETVAL(x)	x
__restore_fp:
	VISExitHalf
	retl
	 nop
ENTRY(U3_retl_o2_plus_g2_plus_g1_plus_1_fp)
	add	%g1, 1, %g1
	add	%g2, %g1, %g2
	ba,pt	%xcc, __restore_fp
	 add	%o2, %g2, %o0
ENDPROC(U3_retl_o2_plus_g2_plus_g1_plus_1_fp)
ENTRY(U3_retl_o2_plus_g2_fp)
	ba,pt	%xcc, __restore_fp
	 add	%o2, %g2, %o0
ENDPROC(U3_retl_o2_plus_g2_fp)
ENTRY(U3_retl_o2_plus_g2_plus_8_fp)
	add	%g2, 8, %g2
	ba,pt	%xcc, __restore_fp
	 add	%o2, %g2, %o0
ENDPROC(U3_retl_o2_plus_g2_plus_8_fp)
ENTRY(U3_retl_o2)
	retl
	 mov	%o2, %o0
ENDPROC(U3_retl_o2)
ENTRY(U3_retl_o2_plus_1)
	retl
	 add	%o2, 1, %o0
ENDPROC(U3_retl_o2_plus_1)
ENTRY(U3_retl_o2_plus_4)
	retl
	 add	%o2, 4, %o0
ENDPROC(U3_retl_o2_plus_4)
ENTRY(U3_retl_o2_plus_8)
	retl
	 add	%o2, 8, %o0
ENDPROC(U3_retl_o2_plus_8)
ENTRY(U3_retl_o2_plus_g1_plus_1)
	add	%g1, 1, %g1
	retl
	 add	%o2, %g1, %o0
ENDPROC(U3_retl_o2_plus_g1_plus_1)
ENTRY(U3_retl_o2_fp)
	ba,pt	%xcc, __restore_fp
	 mov	%o2, %o0
ENDPROC(U3_retl_o2_fp)
ENTRY(U3_retl_o2_plus_o3_sll_6_plus_0x80_fp)
	sll	%o3, 6, %o3
	add	%o3, 0x80, %o3
	ba,pt	%xcc, __restore_fp
	 add	%o2, %o3, %o0
ENDPROC(U3_retl_o2_plus_o3_sll_6_plus_0x80_fp)
ENTRY(U3_retl_o2_plus_o3_sll_6_plus_0x40_fp)
	sll	%o3, 6, %o3
	add	%o3, 0x40, %o3
	ba,pt	%xcc, __restore_fp
	 add	%o2, %o3, %o0
ENDPROC(U3_retl_o2_plus_o3_sll_6_plus_0x40_fp)
ENTRY(U3_retl_o2_plus_GS_plus_0x10)
	add	GLOBAL_SPARE, 0x10, GLOBAL_SPARE
	retl
	 add	%o2, GLOBAL_SPARE, %o0
ENDPROC(U3_retl_o2_plus_GS_plus_0x10)
ENTRY(U3_retl_o2_plus_GS_plus_0x08)
	add	GLOBAL_SPARE, 0x08, GLOBAL_SPARE
	retl
	 add	%o2, GLOBAL_SPARE, %o0
ENDPROC(U3_retl_o2_plus_GS_plus_0x08)
ENTRY(U3_retl_o2_and_7_plus_GS)
	and	%o2, 7, %o2
	retl
	 add	%o2, GLOBAL_SPARE, %o2
ENDPROC(U3_retl_o2_and_7_plus_GS)
ENTRY(U3_retl_o2_and_7_plus_GS_plus_8)
	add	GLOBAL_SPARE, 8, GLOBAL_SPARE
	and	%o2, 7, %o2
	retl
	 add	%o2, GLOBAL_SPARE, %o2
ENDPROC(U3_retl_o2_and_7_plus_GS_plus_8)
#endif

	.align		64

	/* The cheetah's flexible spine, oversized liver, enlarged heart,
@@ -126,8 +204,8 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
	 and		%g2, 0x38, %g2

1:	subcc		%g1, 0x1, %g1
	EX_LD_FP(LOAD(ldub, %o1 + 0x00, %o3))
	EX_ST_FP(STORE(stb, %o3, %o1 + GLOBAL_SPARE))
	EX_LD_FP(LOAD(ldub, %o1 + 0x00, %o3), U3_retl_o2_plus_g2_plus_g1_plus_1)
	EX_ST_FP(STORE(stb, %o3, %o1 + GLOBAL_SPARE), U3_retl_o2_plus_g2_plus_g1_plus_1)
	bgu,pt		%XCC, 1b
	 add		%o1, 0x1, %o1

@@ -138,20 +216,20 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
	be,pt		%icc, 3f
	 alignaddr	%o1, %g0, %o1

	EX_LD_FP(LOAD(ldd, %o1, %f4))
1:	EX_LD_FP(LOAD(ldd, %o1 + 0x8, %f6))
	EX_LD_FP(LOAD(ldd, %o1, %f4), U3_retl_o2_plus_g2)
1:	EX_LD_FP(LOAD(ldd, %o1 + 0x8, %f6), U3_retl_o2_plus_g2)
	add		%o1, 0x8, %o1
	subcc		%g2, 0x8, %g2
	faligndata	%f4, %f6, %f0
	EX_ST_FP(STORE(std, %f0, %o0))
	EX_ST_FP(STORE(std, %f0, %o0), U3_retl_o2_plus_g2_plus_8)
	be,pn		%icc, 3f
	 add		%o0, 0x8, %o0

	EX_LD_FP(LOAD(ldd, %o1 + 0x8, %f4))
	EX_LD_FP(LOAD(ldd, %o1 + 0x8, %f4), U3_retl_o2_plus_g2)
	add		%o1, 0x8, %o1
	subcc		%g2, 0x8, %g2
	faligndata	%f6, %f4, %f2
	EX_ST_FP(STORE(std, %f2, %o0))
	EX_ST_FP(STORE(std, %f2, %o0), U3_retl_o2_plus_g2_plus_8)
	bne,pt		%icc, 1b
	 add		%o0, 0x8, %o0

@@ -161,25 +239,25 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
	LOAD(prefetch, %o1 + 0x080, #one_read)
	LOAD(prefetch, %o1 + 0x0c0, #one_read)
	LOAD(prefetch, %o1 + 0x100, #one_read)
	EX_LD_FP(LOAD(ldd, %o1 + 0x000, %f0))
	EX_LD_FP(LOAD(ldd, %o1 + 0x000, %f0), U3_retl_o2)
	LOAD(prefetch, %o1 + 0x140, #one_read)
	EX_LD_FP(LOAD(ldd, %o1 + 0x008, %f2))
	EX_LD_FP(LOAD(ldd, %o1 + 0x008, %f2), U3_retl_o2)
	LOAD(prefetch, %o1 + 0x180, #one_read)
	EX_LD_FP(LOAD(ldd, %o1 + 0x010, %f4))
	EX_LD_FP(LOAD(ldd, %o1 + 0x010, %f4), U3_retl_o2)
	LOAD(prefetch, %o1 + 0x1c0, #one_read)
	faligndata	%f0, %f2, %f16
	EX_LD_FP(LOAD(ldd, %o1 + 0x018, %f6))
	EX_LD_FP(LOAD(ldd, %o1 + 0x018, %f6), U3_retl_o2)
	faligndata	%f2, %f4, %f18
	EX_LD_FP(LOAD(ldd, %o1 + 0x020, %f8))
	EX_LD_FP(LOAD(ldd, %o1 + 0x020, %f8), U3_retl_o2)
	faligndata	%f4, %f6, %f20
	EX_LD_FP(LOAD(ldd, %o1 + 0x028, %f10))
	EX_LD_FP(LOAD(ldd, %o1 + 0x028, %f10), U3_retl_o2)
	faligndata	%f6, %f8, %f22

	EX_LD_FP(LOAD(ldd, %o1 + 0x030, %f12))
	EX_LD_FP(LOAD(ldd, %o1 + 0x030, %f12), U3_retl_o2)
	faligndata	%f8, %f10, %f24
	EX_LD_FP(LOAD(ldd, %o1 + 0x038, %f14))
	EX_LD_FP(LOAD(ldd, %o1 + 0x038, %f14), U3_retl_o2)
	faligndata	%f10, %f12, %f26
	EX_LD_FP(LOAD(ldd, %o1 + 0x040, %f0))
	EX_LD_FP(LOAD(ldd, %o1 + 0x040, %f0), U3_retl_o2)

	subcc		GLOBAL_SPARE, 0x80, GLOBAL_SPARE
	add		%o1, 0x40, %o1
@@ -190,26 +268,26 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */

	.align		64
1:
	EX_LD_FP(LOAD(ldd, %o1 + 0x008, %f2))
	EX_LD_FP(LOAD(ldd, %o1 + 0x008, %f2), U3_retl_o2_plus_o3_sll_6_plus_0x80)
	faligndata	%f12, %f14, %f28
	EX_LD_FP(LOAD(ldd, %o1 + 0x010, %f4))
	EX_LD_FP(LOAD(ldd, %o1 + 0x010, %f4), U3_retl_o2_plus_o3_sll_6_plus_0x80)
	faligndata	%f14, %f0, %f30
	EX_ST_FP(STORE_BLK(%f16, %o0))
	EX_LD_FP(LOAD(ldd, %o1 + 0x018, %f6))
	EX_ST_FP(STORE_BLK(%f16, %o0), U3_retl_o2_plus_o3_sll_6_plus_0x80)
	EX_LD_FP(LOAD(ldd, %o1 + 0x018, %f6), U3_retl_o2_plus_o3_sll_6_plus_0x40)
	faligndata	%f0, %f2, %f16
	add		%o0, 0x40, %o0

	EX_LD_FP(LOAD(ldd, %o1 + 0x020, %f8))
	EX_LD_FP(LOAD(ldd, %o1 + 0x020, %f8), U3_retl_o2_plus_o3_sll_6_plus_0x40)
	faligndata	%f2, %f4, %f18
	EX_LD_FP(LOAD(ldd, %o1 + 0x028, %f10))
	EX_LD_FP(LOAD(ldd, %o1 + 0x028, %f10), U3_retl_o2_plus_o3_sll_6_plus_0x40)
	faligndata	%f4, %f6, %f20
	EX_LD_FP(LOAD(ldd, %o1 + 0x030, %f12))
	EX_LD_FP(LOAD(ldd, %o1 + 0x030, %f12), U3_retl_o2_plus_o3_sll_6_plus_0x40)
	subcc		%o3, 0x01, %o3
	faligndata	%f6, %f8, %f22
	EX_LD_FP(LOAD(ldd, %o1 + 0x038, %f14))
	EX_LD_FP(LOAD(ldd, %o1 + 0x038, %f14), U3_retl_o2_plus_o3_sll_6_plus_0x80)

	faligndata	%f8, %f10, %f24
	EX_LD_FP(LOAD(ldd, %o1 + 0x040, %f0))
	EX_LD_FP(LOAD(ldd, %o1 + 0x040, %f0), U3_retl_o2_plus_o3_sll_6_plus_0x80)
	LOAD(prefetch, %o1 + 0x1c0, #one_read)
	faligndata	%f10, %f12, %f26
	bg,pt		%XCC, 1b
@@ -217,29 +295,29 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */

	/* Finally we copy the last full 64-byte block. */
2:
	EX_LD_FP(LOAD(ldd, %o1 + 0x008, %f2))
	EX_LD_FP(LOAD(ldd, %o1 + 0x008, %f2), U3_retl_o2_plus_o3_sll_6_plus_0x80)
	faligndata	%f12, %f14, %f28
	EX_LD_FP(LOAD(ldd, %o1 + 0x010, %f4))
	EX_LD_FP(LOAD(ldd, %o1 + 0x010, %f4), U3_retl_o2_plus_o3_sll_6_plus_0x80)
	faligndata	%f14, %f0, %f30
	EX_ST_FP(STORE_BLK(%f16, %o0))
	EX_LD_FP(LOAD(ldd, %o1 + 0x018, %f6))
	EX_ST_FP(STORE_BLK(%f16, %o0), U3_retl_o2_plus_o3_sll_6_plus_0x80)
	EX_LD_FP(LOAD(ldd, %o1 + 0x018, %f6), U3_retl_o2_plus_o3_sll_6_plus_0x40)
	faligndata	%f0, %f2, %f16
	EX_LD_FP(LOAD(ldd, %o1 + 0x020, %f8))
	EX_LD_FP(LOAD(ldd, %o1 + 0x020, %f8), U3_retl_o2_plus_o3_sll_6_plus_0x40)
	faligndata	%f2, %f4, %f18
	EX_LD_FP(LOAD(ldd, %o1 + 0x028, %f10))
	EX_LD_FP(LOAD(ldd, %o1 + 0x028, %f10), U3_retl_o2_plus_o3_sll_6_plus_0x40)
	faligndata	%f4, %f6, %f20
	EX_LD_FP(LOAD(ldd, %o1 + 0x030, %f12))
	EX_LD_FP(LOAD(ldd, %o1 + 0x030, %f12), U3_retl_o2_plus_o3_sll_6_plus_0x40)
	faligndata	%f6, %f8, %f22
	EX_LD_FP(LOAD(ldd, %o1 + 0x038, %f14))
	EX_LD_FP(LOAD(ldd, %o1 + 0x038, %f14), U3_retl_o2_plus_o3_sll_6_plus_0x40)
	faligndata	%f8, %f10, %f24
	cmp		%g1, 0
	be,pt		%XCC, 1f
	 add		%o0, 0x40, %o0
	EX_LD_FP(LOAD(ldd, %o1 + 0x040, %f0))
	EX_LD_FP(LOAD(ldd, %o1 + 0x040, %f0), U3_retl_o2_plus_o3_sll_6_plus_0x40)
1:	faligndata	%f10, %f12, %f26
	faligndata	%f12, %f14, %f28
	faligndata	%f14, %f0, %f30
	EX_ST_FP(STORE_BLK(%f16, %o0))
	EX_ST_FP(STORE_BLK(%f16, %o0), U3_retl_o2_plus_o3_sll_6_plus_0x40)
	add		%o0, 0x40, %o0
	add		%o1, 0x40, %o1
	membar		#Sync
@@ -259,20 +337,20 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */

	sub		%o2, %g2, %o2
	be,a,pt		%XCC, 1f
	 EX_LD_FP(LOAD(ldd, %o1 + 0x00, %f0))
	 EX_LD_FP(LOAD(ldd, %o1 + 0x00, %f0), U3_retl_o2_plus_g2)

1:	EX_LD_FP(LOAD(ldd, %o1 + 0x08, %f2))
1:	EX_LD_FP(LOAD(ldd, %o1 + 0x08, %f2), U3_retl_o2_plus_g2)
	add		%o1, 0x8, %o1
	subcc		%g2, 0x8, %g2
	faligndata	%f0, %f2, %f8
	EX_ST_FP(STORE(std, %f8, %o0))
	EX_ST_FP(STORE(std, %f8, %o0), U3_retl_o2_plus_g2_plus_8)
	be,pn		%XCC, 2f
	 add		%o0, 0x8, %o0
	EX_LD_FP(LOAD(ldd, %o1 + 0x08, %f0))
	EX_LD_FP(LOAD(ldd, %o1 + 0x08, %f0), U3_retl_o2_plus_g2)
	add		%o1, 0x8, %o1
	subcc		%g2, 0x8, %g2
	faligndata	%f2, %f0, %f8
	EX_ST_FP(STORE(std, %f8, %o0))
	EX_ST_FP(STORE(std, %f8, %o0), U3_retl_o2_plus_g2_plus_8)
	bne,pn		%XCC, 1b
	 add		%o0, 0x8, %o0

@@ -292,30 +370,33 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
	 andcc		%o2, 0x8, %g0
	be,pt		%icc, 1f
	 nop
	EX_LD(LOAD(ldx, %o1, %o5))
	EX_ST(STORE(stx, %o5, %o1 + %o3))
	EX_LD(LOAD(ldx, %o1, %o5), U3_retl_o2)
	EX_ST(STORE(stx, %o5, %o1 + %o3), U3_retl_o2)
	add		%o1, 0x8, %o1
	sub		%o2, 8, %o2

1:	andcc		%o2, 0x4, %g0
	be,pt		%icc, 1f
	 nop
	EX_LD(LOAD(lduw, %o1, %o5))
	EX_ST(STORE(stw, %o5, %o1 + %o3))
	EX_LD(LOAD(lduw, %o1, %o5), U3_retl_o2)
	EX_ST(STORE(stw, %o5, %o1 + %o3), U3_retl_o2)
	add		%o1, 0x4, %o1
	sub		%o2, 4, %o2

1:	andcc		%o2, 0x2, %g0
	be,pt		%icc, 1f
	 nop
	EX_LD(LOAD(lduh, %o1, %o5))
	EX_ST(STORE(sth, %o5, %o1 + %o3))
	EX_LD(LOAD(lduh, %o1, %o5), U3_retl_o2)
	EX_ST(STORE(sth, %o5, %o1 + %o3), U3_retl_o2)
	add		%o1, 0x2, %o1
	sub		%o2, 2, %o2

1:	andcc		%o2, 0x1, %g0
	be,pt		%icc, 85f
	 nop
	EX_LD(LOAD(ldub, %o1, %o5))
	EX_LD(LOAD(ldub, %o1, %o5), U3_retl_o2)
	ba,pt		%xcc, 85f
	 EX_ST(STORE(stb, %o5, %o1 + %o3))
	 EX_ST(STORE(stb, %o5, %o1 + %o3), U3_retl_o2)

	.align		64
70: /* 16 < len <= 64 */
@@ -326,26 +407,26 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
	andn		%o2, 0xf, GLOBAL_SPARE
	and		%o2, 0xf, %o2
1:	subcc		GLOBAL_SPARE, 0x10, GLOBAL_SPARE
	EX_LD(LOAD(ldx, %o1 + 0x00, %o5))
	EX_LD(LOAD(ldx, %o1 + 0x08, %g1))
	EX_ST(STORE(stx, %o5, %o1 + %o3))
	EX_LD(LOAD(ldx, %o1 + 0x00, %o5), U3_retl_o2_plus_GS_plus_0x10)
	EX_LD(LOAD(ldx, %o1 + 0x08, %g1), U3_retl_o2_plus_GS_plus_0x10)
	EX_ST(STORE(stx, %o5, %o1 + %o3), U3_retl_o2_plus_GS_plus_0x10)
	add		%o1, 0x8, %o1
	EX_ST(STORE(stx, %g1, %o1 + %o3))
	EX_ST(STORE(stx, %g1, %o1 + %o3), U3_retl_o2_plus_GS_plus_0x08)
	bgu,pt		%XCC, 1b
	 add		%o1, 0x8, %o1
73:	andcc		%o2, 0x8, %g0
	be,pt		%XCC, 1f
	 nop
	sub		%o2, 0x8, %o2
	EX_LD(LOAD(ldx, %o1, %o5))
	EX_ST(STORE(stx, %o5, %o1 + %o3))
	EX_LD(LOAD(ldx, %o1, %o5), U3_retl_o2_plus_8)
	EX_ST(STORE(stx, %o5, %o1 + %o3), U3_retl_o2_plus_8)
	add		%o1, 0x8, %o1
1:	andcc		%o2, 0x4, %g0
	be,pt		%XCC, 1f
	 nop
	sub		%o2, 0x4, %o2
	EX_LD(LOAD(lduw, %o1, %o5))
	EX_ST(STORE(stw, %o5, %o1 + %o3))
	EX_LD(LOAD(lduw, %o1, %o5), U3_retl_o2_plus_4)
	EX_ST(STORE(stw, %o5, %o1 + %o3), U3_retl_o2_plus_4)
	add		%o1, 0x4, %o1
1:	cmp		%o2, 0
	be,pt		%XCC, 85f
@@ -361,8 +442,8 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
	sub		%o2, %g1, %o2

1:	subcc		%g1, 1, %g1
	EX_LD(LOAD(ldub, %o1, %o5))
	EX_ST(STORE(stb, %o5, %o1 + %o3))
	EX_LD(LOAD(ldub, %o1, %o5), U3_retl_o2_plus_g1_plus_1)
	EX_ST(STORE(stb, %o5, %o1 + %o3), U3_retl_o2_plus_g1_plus_1)
	bgu,pt		%icc, 1b
	 add		%o1, 1, %o1

@@ -378,16 +459,16 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */

8:	mov		64, %o3
	andn		%o1, 0x7, %o1
	EX_LD(LOAD(ldx, %o1, %g2))
	EX_LD(LOAD(ldx, %o1, %g2), U3_retl_o2)
	sub		%o3, %g1, %o3
	andn		%o2, 0x7, GLOBAL_SPARE
	sllx		%g2, %g1, %g2
1:	EX_LD(LOAD(ldx, %o1 + 0x8, %g3))
1:	EX_LD(LOAD(ldx, %o1 + 0x8, %g3), U3_retl_o2_and_7_plus_GS)
	subcc		GLOBAL_SPARE, 0x8, GLOBAL_SPARE
	add		%o1, 0x8, %o1
	srlx		%g3, %o3, %o5
	or		%o5, %g2, %o5
	EX_ST(STORE(stx, %o5, %o0))
	EX_ST(STORE(stx, %o5, %o0), U3_retl_o2_and_7_plus_GS_plus_8)
	add		%o0, 0x8, %o0
	bgu,pt		%icc, 1b
	 sllx		%g3, %g1, %g2
@@ -407,8 +488,8 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */

1:
	subcc		%o2, 4, %o2
	EX_LD(LOAD(lduw, %o1, %g1))
	EX_ST(STORE(stw, %g1, %o1 + %o3))
	EX_LD(LOAD(lduw, %o1, %g1), U3_retl_o2_plus_4)
	EX_ST(STORE(stw, %g1, %o1 + %o3), U3_retl_o2_plus_4)
	bgu,pt		%XCC, 1b
	 add		%o1, 4, %o1

@@ -418,8 +499,8 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
	.align		32
90:
	subcc		%o2, 1, %o2
	EX_LD(LOAD(ldub, %o1, %g1))
	EX_ST(STORE(stb, %g1, %o1 + %o3))
	EX_LD(LOAD(ldub, %o1, %g1), U3_retl_o2_plus_1)
	EX_ST(STORE(stb, %g1, %o1 + %o3), U3_retl_o2_plus_1)
	bgu,pt		%XCC, 90b
	 add		%o1, 1, %o1
	retl