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: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
e93704e446
Коммит
ee841d0aff
|
@ -3,19 +3,19 @@
|
||||||
* Copyright (C) 1999, 2000, 2004 David S. Miller (davem@redhat.com)
|
* Copyright (C) 1999, 2000, 2004 David S. Miller (davem@redhat.com)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define EX_LD(x) \
|
#define EX_LD(x,y) \
|
||||||
98: x; \
|
98: x; \
|
||||||
.section __ex_table,"a";\
|
.section __ex_table,"a";\
|
||||||
.align 4; \
|
.align 4; \
|
||||||
.word 98b, __retl_mone; \
|
.word 98b, y; \
|
||||||
.text; \
|
.text; \
|
||||||
.align 4;
|
.align 4;
|
||||||
|
|
||||||
#define EX_LD_FP(x) \
|
#define EX_LD_FP(x,y) \
|
||||||
98: x; \
|
98: x; \
|
||||||
.section __ex_table,"a";\
|
.section __ex_table,"a";\
|
||||||
.align 4; \
|
.align 4; \
|
||||||
.word 98b, __retl_mone_fp;\
|
.word 98b, y##_fp; \
|
||||||
.text; \
|
.text; \
|
||||||
.align 4;
|
.align 4;
|
||||||
|
|
||||||
|
|
|
@ -3,19 +3,19 @@
|
||||||
* Copyright (C) 1999, 2000, 2004 David S. Miller (davem@redhat.com)
|
* Copyright (C) 1999, 2000, 2004 David S. Miller (davem@redhat.com)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define EX_ST(x) \
|
#define EX_ST(x,y) \
|
||||||
98: x; \
|
98: x; \
|
||||||
.section __ex_table,"a";\
|
.section __ex_table,"a";\
|
||||||
.align 4; \
|
.align 4; \
|
||||||
.word 98b, __retl_mone; \
|
.word 98b, y; \
|
||||||
.text; \
|
.text; \
|
||||||
.align 4;
|
.align 4;
|
||||||
|
|
||||||
#define EX_ST_FP(x) \
|
#define EX_ST_FP(x,y) \
|
||||||
98: x; \
|
98: x; \
|
||||||
.section __ex_table,"a";\
|
.section __ex_table,"a";\
|
||||||
.align 4; \
|
.align 4; \
|
||||||
.word 98b, __retl_mone_fp;\
|
.word 98b, y##_fp; \
|
||||||
.text; \
|
.text; \
|
||||||
.align 4;
|
.align 4;
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef __KERNEL__
|
#ifdef __KERNEL__
|
||||||
|
#include <linux/linkage.h>
|
||||||
#include <asm/visasm.h>
|
#include <asm/visasm.h>
|
||||||
#include <asm/asi.h>
|
#include <asm/asi.h>
|
||||||
#define GLOBAL_SPARE %g7
|
#define GLOBAL_SPARE %g7
|
||||||
|
@ -22,21 +23,17 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef EX_LD
|
#ifndef EX_LD
|
||||||
#define EX_LD(x) x
|
#define EX_LD(x,y) x
|
||||||
#endif
|
#endif
|
||||||
#ifndef EX_LD_FP
|
#ifndef EX_LD_FP
|
||||||
#define EX_LD_FP(x) x
|
#define EX_LD_FP(x,y) x
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef EX_ST
|
#ifndef EX_ST
|
||||||
#define EX_ST(x) x
|
#define EX_ST(x,y) x
|
||||||
#endif
|
#endif
|
||||||
#ifndef EX_ST_FP
|
#ifndef EX_ST_FP
|
||||||
#define EX_ST_FP(x) x
|
#define EX_ST_FP(x,y) x
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef EX_RETVAL
|
|
||||||
#define EX_RETVAL(x) x
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef LOAD
|
#ifndef LOAD
|
||||||
|
@ -77,6 +74,87 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
.text
|
.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
|
.align 64
|
||||||
|
|
||||||
/* The cheetah's flexible spine, oversized liver, enlarged heart,
|
/* 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
|
and %g2, 0x38, %g2
|
||||||
|
|
||||||
1: subcc %g1, 0x1, %g1
|
1: subcc %g1, 0x1, %g1
|
||||||
EX_LD_FP(LOAD(ldub, %o1 + 0x00, %o3))
|
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))
|
EX_ST_FP(STORE(stb, %o3, %o1 + GLOBAL_SPARE), U3_retl_o2_plus_g2_plus_g1_plus_1)
|
||||||
bgu,pt %XCC, 1b
|
bgu,pt %XCC, 1b
|
||||||
add %o1, 0x1, %o1
|
add %o1, 0x1, %o1
|
||||||
|
|
||||||
|
@ -138,20 +216,20 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
|
||||||
be,pt %icc, 3f
|
be,pt %icc, 3f
|
||||||
alignaddr %o1, %g0, %o1
|
alignaddr %o1, %g0, %o1
|
||||||
|
|
||||||
EX_LD_FP(LOAD(ldd, %o1, %f4))
|
EX_LD_FP(LOAD(ldd, %o1, %f4), U3_retl_o2_plus_g2)
|
||||||
1: EX_LD_FP(LOAD(ldd, %o1 + 0x8, %f6))
|
1: EX_LD_FP(LOAD(ldd, %o1 + 0x8, %f6), U3_retl_o2_plus_g2)
|
||||||
add %o1, 0x8, %o1
|
add %o1, 0x8, %o1
|
||||||
subcc %g2, 0x8, %g2
|
subcc %g2, 0x8, %g2
|
||||||
faligndata %f4, %f6, %f0
|
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
|
be,pn %icc, 3f
|
||||||
add %o0, 0x8, %o0
|
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
|
add %o1, 0x8, %o1
|
||||||
subcc %g2, 0x8, %g2
|
subcc %g2, 0x8, %g2
|
||||||
faligndata %f6, %f4, %f2
|
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
|
bne,pt %icc, 1b
|
||||||
add %o0, 0x8, %o0
|
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 + 0x080, #one_read)
|
||||||
LOAD(prefetch, %o1 + 0x0c0, #one_read)
|
LOAD(prefetch, %o1 + 0x0c0, #one_read)
|
||||||
LOAD(prefetch, %o1 + 0x100, #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)
|
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)
|
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)
|
LOAD(prefetch, %o1 + 0x1c0, #one_read)
|
||||||
faligndata %f0, %f2, %f16
|
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
|
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
|
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
|
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
|
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
|
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
|
subcc GLOBAL_SPARE, 0x80, GLOBAL_SPARE
|
||||||
add %o1, 0x40, %o1
|
add %o1, 0x40, %o1
|
||||||
|
@ -190,26 +268,26 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
|
||||||
|
|
||||||
.align 64
|
.align 64
|
||||||
1:
|
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
|
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
|
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_0x80)
|
||||||
EX_LD_FP(LOAD(ldd, %o1 + 0x018, %f6))
|
EX_LD_FP(LOAD(ldd, %o1 + 0x018, %f6), U3_retl_o2_plus_o3_sll_6_plus_0x40)
|
||||||
faligndata %f0, %f2, %f16
|
faligndata %f0, %f2, %f16
|
||||||
add %o0, 0x40, %o0
|
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
|
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
|
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
|
subcc %o3, 0x01, %o3
|
||||||
faligndata %f6, %f8, %f22
|
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
|
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)
|
LOAD(prefetch, %o1 + 0x1c0, #one_read)
|
||||||
faligndata %f10, %f12, %f26
|
faligndata %f10, %f12, %f26
|
||||||
bg,pt %XCC, 1b
|
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. */
|
/* Finally we copy the last full 64-byte block. */
|
||||||
2:
|
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
|
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
|
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_0x80)
|
||||||
EX_LD_FP(LOAD(ldd, %o1 + 0x018, %f6))
|
EX_LD_FP(LOAD(ldd, %o1 + 0x018, %f6), U3_retl_o2_plus_o3_sll_6_plus_0x40)
|
||||||
faligndata %f0, %f2, %f16
|
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
|
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
|
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
|
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
|
faligndata %f8, %f10, %f24
|
||||||
cmp %g1, 0
|
cmp %g1, 0
|
||||||
be,pt %XCC, 1f
|
be,pt %XCC, 1f
|
||||||
add %o0, 0x40, %o0
|
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
|
1: faligndata %f10, %f12, %f26
|
||||||
faligndata %f12, %f14, %f28
|
faligndata %f12, %f14, %f28
|
||||||
faligndata %f14, %f0, %f30
|
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 %o0, 0x40, %o0
|
||||||
add %o1, 0x40, %o1
|
add %o1, 0x40, %o1
|
||||||
membar #Sync
|
membar #Sync
|
||||||
|
@ -259,20 +337,20 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
|
||||||
|
|
||||||
sub %o2, %g2, %o2
|
sub %o2, %g2, %o2
|
||||||
be,a,pt %XCC, 1f
|
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
|
add %o1, 0x8, %o1
|
||||||
subcc %g2, 0x8, %g2
|
subcc %g2, 0x8, %g2
|
||||||
faligndata %f0, %f2, %f8
|
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
|
be,pn %XCC, 2f
|
||||||
add %o0, 0x8, %o0
|
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
|
add %o1, 0x8, %o1
|
||||||
subcc %g2, 0x8, %g2
|
subcc %g2, 0x8, %g2
|
||||||
faligndata %f2, %f0, %f8
|
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
|
bne,pn %XCC, 1b
|
||||||
add %o0, 0x8, %o0
|
add %o0, 0x8, %o0
|
||||||
|
|
||||||
|
@ -292,30 +370,33 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
|
||||||
andcc %o2, 0x8, %g0
|
andcc %o2, 0x8, %g0
|
||||||
be,pt %icc, 1f
|
be,pt %icc, 1f
|
||||||
nop
|
nop
|
||||||
EX_LD(LOAD(ldx, %o1, %o5))
|
EX_LD(LOAD(ldx, %o1, %o5), U3_retl_o2)
|
||||||
EX_ST(STORE(stx, %o5, %o1 + %o3))
|
EX_ST(STORE(stx, %o5, %o1 + %o3), U3_retl_o2)
|
||||||
add %o1, 0x8, %o1
|
add %o1, 0x8, %o1
|
||||||
|
sub %o2, 8, %o2
|
||||||
|
|
||||||
1: andcc %o2, 0x4, %g0
|
1: andcc %o2, 0x4, %g0
|
||||||
be,pt %icc, 1f
|
be,pt %icc, 1f
|
||||||
nop
|
nop
|
||||||
EX_LD(LOAD(lduw, %o1, %o5))
|
EX_LD(LOAD(lduw, %o1, %o5), U3_retl_o2)
|
||||||
EX_ST(STORE(stw, %o5, %o1 + %o3))
|
EX_ST(STORE(stw, %o5, %o1 + %o3), U3_retl_o2)
|
||||||
add %o1, 0x4, %o1
|
add %o1, 0x4, %o1
|
||||||
|
sub %o2, 4, %o2
|
||||||
|
|
||||||
1: andcc %o2, 0x2, %g0
|
1: andcc %o2, 0x2, %g0
|
||||||
be,pt %icc, 1f
|
be,pt %icc, 1f
|
||||||
nop
|
nop
|
||||||
EX_LD(LOAD(lduh, %o1, %o5))
|
EX_LD(LOAD(lduh, %o1, %o5), U3_retl_o2)
|
||||||
EX_ST(STORE(sth, %o5, %o1 + %o3))
|
EX_ST(STORE(sth, %o5, %o1 + %o3), U3_retl_o2)
|
||||||
add %o1, 0x2, %o1
|
add %o1, 0x2, %o1
|
||||||
|
sub %o2, 2, %o2
|
||||||
|
|
||||||
1: andcc %o2, 0x1, %g0
|
1: andcc %o2, 0x1, %g0
|
||||||
be,pt %icc, 85f
|
be,pt %icc, 85f
|
||||||
nop
|
nop
|
||||||
EX_LD(LOAD(ldub, %o1, %o5))
|
EX_LD(LOAD(ldub, %o1, %o5), U3_retl_o2)
|
||||||
ba,pt %xcc, 85f
|
ba,pt %xcc, 85f
|
||||||
EX_ST(STORE(stb, %o5, %o1 + %o3))
|
EX_ST(STORE(stb, %o5, %o1 + %o3), U3_retl_o2)
|
||||||
|
|
||||||
.align 64
|
.align 64
|
||||||
70: /* 16 < len <= 64 */
|
70: /* 16 < len <= 64 */
|
||||||
|
@ -326,26 +407,26 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
|
||||||
andn %o2, 0xf, GLOBAL_SPARE
|
andn %o2, 0xf, GLOBAL_SPARE
|
||||||
and %o2, 0xf, %o2
|
and %o2, 0xf, %o2
|
||||||
1: subcc GLOBAL_SPARE, 0x10, GLOBAL_SPARE
|
1: subcc GLOBAL_SPARE, 0x10, GLOBAL_SPARE
|
||||||
EX_LD(LOAD(ldx, %o1 + 0x00, %o5))
|
EX_LD(LOAD(ldx, %o1 + 0x00, %o5), U3_retl_o2_plus_GS_plus_0x10)
|
||||||
EX_LD(LOAD(ldx, %o1 + 0x08, %g1))
|
EX_LD(LOAD(ldx, %o1 + 0x08, %g1), U3_retl_o2_plus_GS_plus_0x10)
|
||||||
EX_ST(STORE(stx, %o5, %o1 + %o3))
|
EX_ST(STORE(stx, %o5, %o1 + %o3), U3_retl_o2_plus_GS_plus_0x10)
|
||||||
add %o1, 0x8, %o1
|
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
|
bgu,pt %XCC, 1b
|
||||||
add %o1, 0x8, %o1
|
add %o1, 0x8, %o1
|
||||||
73: andcc %o2, 0x8, %g0
|
73: andcc %o2, 0x8, %g0
|
||||||
be,pt %XCC, 1f
|
be,pt %XCC, 1f
|
||||||
nop
|
nop
|
||||||
sub %o2, 0x8, %o2
|
sub %o2, 0x8, %o2
|
||||||
EX_LD(LOAD(ldx, %o1, %o5))
|
EX_LD(LOAD(ldx, %o1, %o5), U3_retl_o2_plus_8)
|
||||||
EX_ST(STORE(stx, %o5, %o1 + %o3))
|
EX_ST(STORE(stx, %o5, %o1 + %o3), U3_retl_o2_plus_8)
|
||||||
add %o1, 0x8, %o1
|
add %o1, 0x8, %o1
|
||||||
1: andcc %o2, 0x4, %g0
|
1: andcc %o2, 0x4, %g0
|
||||||
be,pt %XCC, 1f
|
be,pt %XCC, 1f
|
||||||
nop
|
nop
|
||||||
sub %o2, 0x4, %o2
|
sub %o2, 0x4, %o2
|
||||||
EX_LD(LOAD(lduw, %o1, %o5))
|
EX_LD(LOAD(lduw, %o1, %o5), U3_retl_o2_plus_4)
|
||||||
EX_ST(STORE(stw, %o5, %o1 + %o3))
|
EX_ST(STORE(stw, %o5, %o1 + %o3), U3_retl_o2_plus_4)
|
||||||
add %o1, 0x4, %o1
|
add %o1, 0x4, %o1
|
||||||
1: cmp %o2, 0
|
1: cmp %o2, 0
|
||||||
be,pt %XCC, 85f
|
be,pt %XCC, 85f
|
||||||
|
@ -361,8 +442,8 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
|
||||||
sub %o2, %g1, %o2
|
sub %o2, %g1, %o2
|
||||||
|
|
||||||
1: subcc %g1, 1, %g1
|
1: subcc %g1, 1, %g1
|
||||||
EX_LD(LOAD(ldub, %o1, %o5))
|
EX_LD(LOAD(ldub, %o1, %o5), U3_retl_o2_plus_g1_plus_1)
|
||||||
EX_ST(STORE(stb, %o5, %o1 + %o3))
|
EX_ST(STORE(stb, %o5, %o1 + %o3), U3_retl_o2_plus_g1_plus_1)
|
||||||
bgu,pt %icc, 1b
|
bgu,pt %icc, 1b
|
||||||
add %o1, 1, %o1
|
add %o1, 1, %o1
|
||||||
|
|
||||||
|
@ -378,16 +459,16 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
|
||||||
|
|
||||||
8: mov 64, %o3
|
8: mov 64, %o3
|
||||||
andn %o1, 0x7, %o1
|
andn %o1, 0x7, %o1
|
||||||
EX_LD(LOAD(ldx, %o1, %g2))
|
EX_LD(LOAD(ldx, %o1, %g2), U3_retl_o2)
|
||||||
sub %o3, %g1, %o3
|
sub %o3, %g1, %o3
|
||||||
andn %o2, 0x7, GLOBAL_SPARE
|
andn %o2, 0x7, GLOBAL_SPARE
|
||||||
sllx %g2, %g1, %g2
|
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
|
subcc GLOBAL_SPARE, 0x8, GLOBAL_SPARE
|
||||||
add %o1, 0x8, %o1
|
add %o1, 0x8, %o1
|
||||||
srlx %g3, %o3, %o5
|
srlx %g3, %o3, %o5
|
||||||
or %o5, %g2, %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
|
add %o0, 0x8, %o0
|
||||||
bgu,pt %icc, 1b
|
bgu,pt %icc, 1b
|
||||||
sllx %g3, %g1, %g2
|
sllx %g3, %g1, %g2
|
||||||
|
@ -407,8 +488,8 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
|
||||||
|
|
||||||
1:
|
1:
|
||||||
subcc %o2, 4, %o2
|
subcc %o2, 4, %o2
|
||||||
EX_LD(LOAD(lduw, %o1, %g1))
|
EX_LD(LOAD(lduw, %o1, %g1), U3_retl_o2_plus_4)
|
||||||
EX_ST(STORE(stw, %g1, %o1 + %o3))
|
EX_ST(STORE(stw, %g1, %o1 + %o3), U3_retl_o2_plus_4)
|
||||||
bgu,pt %XCC, 1b
|
bgu,pt %XCC, 1b
|
||||||
add %o1, 4, %o1
|
add %o1, 4, %o1
|
||||||
|
|
||||||
|
@ -418,8 +499,8 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
|
||||||
.align 32
|
.align 32
|
||||||
90:
|
90:
|
||||||
subcc %o2, 1, %o2
|
subcc %o2, 1, %o2
|
||||||
EX_LD(LOAD(ldub, %o1, %g1))
|
EX_LD(LOAD(ldub, %o1, %g1), U3_retl_o2_plus_1)
|
||||||
EX_ST(STORE(stb, %g1, %o1 + %o3))
|
EX_ST(STORE(stb, %g1, %o1 + %o3), U3_retl_o2_plus_1)
|
||||||
bgu,pt %XCC, 90b
|
bgu,pt %XCC, 90b
|
||||||
add %o1, 1, %o1
|
add %o1, 1, %o1
|
||||||
retl
|
retl
|
||||||
|
|
Загрузка…
Ссылка в новой задаче