2012-09-27 08:11:01 +04:00
/ * NG4 m e m c p y . S : N i a g a r a - 4 o p t i m i z e d m e m c p y .
*
* Copyright ( C ) 2 0 1 2 D a v i d S . M i l l e r ( d a v e m @davemloft.net)
* /
# ifdef _ _ K E R N E L _ _
# include < a s m / v i s a s m . h >
# include < a s m / a s i . h >
# define G L O B A L _ S P A R E % g 7
# else
# define A S I _ B L K _ I N I T _ Q U A D _ L D D _ P 0 x e 2
# define F P R S _ F E F 0 x04
/ * On T 4 i t i s v e r y e x p e n s i v e t o a c c e s s A S R s l i k e % f p r s a n d
* % asi, a v o i d i n g a r e a d o r a w r i t e c a n s a v e ~ 5 0 c y c l e s .
* /
# define F P U _ E N T E R \
rd % f p r s , % o 5 ; \
andcc % o 5 , F P R S _ F E F , % g 0 ; \
be,a ,p n % i c c , 9 9 9 f ; \
wr % g 0 , F P R S _ F E F , % f p r s ; \
999 :
# ifdef M E M C P Y _ D E B U G
# define V I S E n t r y H a l f F P U _ E N T E R ; \
clr % g 1 ; clr %g2; clr %g3; clr %g5; subcc %g0, %g0, %g0;
# define V I S E x i t H a l f a n d % o 5 , F P R S _ F E F , % o 5 ; wr %o5, 0x0, %fprs
# else
# define V I S E n t r y H a l f F P U _ E N T E R
# define V I S E x i t H a l f a n d % o 5 , F P R S _ F E F , % o 5 ; wr %o5, 0x0, %fprs
# endif
# define G L O B A L _ S P A R E % g 5
# endif
# ifndef S T O R E _ A S I
# ifndef S I M U L A T E _ N I A G A R A _ O N _ N O N _ N I A G A R A
# define S T O R E _ A S I A S I _ B L K _ I N I T _ Q U A D _ L D D _ P
# else
# define S T O R E _ A S I 0 x80 / * A S I _ P * /
# endif
# endif
# ifndef E X _ L D
# define E X _ L D ( x ) x
# endif
# ifndef E X _ S T
# define E X _ S T ( x ) x
# endif
# ifndef E X _ R E T V A L
# define E X _ R E T V A L ( x ) x
# endif
# ifndef L O A D
# define L O A D ( t y p e ,a d d r ,d e s t ) t y p e [ a d d r ] , d e s t
# endif
# ifndef S T O R E
# ifndef M E M C P Y _ D E B U G
# define S T O R E ( t y p e ,s r c ,a d d r ) t y p e s r c , [ a d d r ]
# else
# define S T O R E ( t y p e ,s r c ,a d d r ) t y p e ## a s r c , [ a d d r ] % a s i
# endif
# endif
# ifndef S T O R E _ I N I T
# define S T O R E _ I N I T ( s r c ,a d d r ) s t x a s r c , [ a d d r ] S T O R E _ A S I
# endif
# ifndef F U N C _ N A M E
# define F U N C _ N A M E N G 4 m e m c p y
# endif
# ifndef P R E A M B L E
# define P R E A M B L E
# endif
# ifndef X C C
# define X C C x c c
# endif
.register % g2 ,#s c r a t c h
.register % g3 ,#s c r a t c h
.text
.align 64
.globl FUNC_NAME
.type FUNC_ N A M E ,#f u n c t i o n
FUNC_NAME : /* %o0=dst, %o1=src, %o2=len */
# ifdef M E M C P Y _ D E B U G
wr % g 0 , 0 x80 , % a s i
# endif
srlx % o 2 , 3 1 , % g 2
cmp % g 2 , 0
tne % X C C , 5
PREAMBLE
mov % o 0 , % o 3
brz,p n % o 2 , . L e x i t
cmp % o 2 , 3
ble,p n % i c c , . L t i n y
cmp % o 2 , 1 9
ble,p n % i c c , . L s m a l l
or % o 0 , % o 1 , % g 2
cmp % o 2 , 1 2 8
bl,p n % i c c , . L m e d i u m
nop
.Llarge : /* len >= 0x80 */
/* First get dest 8 byte aligned. */
sub % g 0 , % o 0 , % g 1
and % g 1 , 0 x7 , % g 1
brz,p t % g 1 , 5 1 f
sub % o 2 , % g 1 , % o 2
2012-09-29 00:08:22 +04:00
2012-09-27 08:11:01 +04:00
1 : EX_ L D ( L O A D ( l d u b , % o 1 + 0 x00 , % g 2 ) )
add % o 1 , 1 , % o 1
subcc % g 1 , 1 , % g 1
add % o 0 , 1 , % o 0
bne,p t % i c c , 1 b
EX_ S T ( S T O R E ( s t b , % g 2 , % o 0 - 0 x01 ) )
51 : LOAD( p r e f e t c h , % o 1 + 0 x04 0 , #n _ r e a d s _ s t r o n g )
LOAD( p r e f e t c h , % o 1 + 0 x08 0 , #n _ r e a d s _ s t r o n g )
LOAD( p r e f e t c h , % o 1 + 0 x0 c0 , #n _ r e a d s _ s t r o n g )
LOAD( p r e f e t c h , % o 1 + 0 x10 0 , #n _ r e a d s _ s t r o n g )
LOAD( p r e f e t c h , % o 1 + 0 x14 0 , #n _ r e a d s _ s t r o n g )
LOAD( p r e f e t c h , % o 1 + 0 x18 0 , #n _ r e a d s _ s t r o n g )
LOAD( p r e f e t c h , % o 1 + 0 x1 c0 , #n _ r e a d s _ s t r o n g )
LOAD( p r e f e t c h , % o 1 + 0 x20 0 , #n _ r e a d s _ s t r o n g )
/ * Check i f w e c a n u s e t h e s t r a i g h t f u l l y a l i g n e d
* loop, o r w e r e q u i r e t h e a l i g n a d d r / f a l i g n d a t a v a r i a n t .
* /
andcc % o 1 , 0 x7 , % o 5
bne,p n % i c c , . L l a r g e _ s r c _ u n a l i g n e d
sub % g 0 , % o 0 , % g 1
/ * Legitimize t h e u s e o f i n i t i a l i z i n g s t o r e s b y g e t t i n g d e s t
* to b e 6 4 - b y t e a l i g n e d .
* /
and % g 1 , 0 x3 f , % g 1
brz,p t % g 1 , . L l a r g e _ a l i g n e d
sub % o 2 , % g 1 , % o 2
2012-09-29 00:08:22 +04:00
2012-09-27 08:11:01 +04:00
1 : EX_ L D ( L O A D ( l d x , % o 1 + 0 x00 , % g 2 ) )
add % o 1 , 8 , % o 1
subcc % g 1 , 8 , % g 1
add % o 0 , 8 , % o 0
bne,p t % i c c , 1 b
EX_ S T ( S T O R E ( s t x , % g 2 , % o 0 - 0 x08 ) )
.Llarge_aligned :
/* len >= 0x80 && src 8-byte aligned && dest 8-byte aligned */
andn % o 2 , 0 x3 f , % o 4
sub % o 2 , % o 4 , % o 2
1 : EX_ L D ( L O A D ( l d x , % o 1 + 0 x00 , % g 1 ) )
add % o 1 , 0 x40 , % o 1
EX_ L D ( L O A D ( l d x , % o 1 - 0 x38 , % g 2 ) )
subcc % o 4 , 0 x40 , % o 4
EX_ L D ( L O A D ( l d x , % o 1 - 0 x30 , % g 3 ) )
EX_ L D ( L O A D ( l d x , % o 1 - 0 x28 , G L O B A L _ S P A R E ) )
EX_ L D ( L O A D ( l d x , % o 1 - 0 x20 , % o 5 ) )
EX_ S T ( S T O R E _ I N I T ( % g 1 , % o 0 ) )
add % o 0 , 0 x08 , % o 0
EX_ S T ( S T O R E _ I N I T ( % g 2 , % o 0 ) )
add % o 0 , 0 x08 , % o 0
EX_ L D ( L O A D ( l d x , % o 1 - 0 x18 , % g 2 ) )
EX_ S T ( S T O R E _ I N I T ( % g 3 , % o 0 ) )
add % o 0 , 0 x08 , % o 0
EX_ L D ( L O A D ( l d x , % o 1 - 0 x10 , % g 3 ) )
EX_ S T ( S T O R E _ I N I T ( G L O B A L _ S P A R E , % o 0 ) )
add % o 0 , 0 x08 , % o 0
EX_ L D ( L O A D ( l d x , % o 1 - 0 x08 , G L O B A L _ S P A R E ) )
EX_ S T ( S T O R E _ I N I T ( % o 5 , % o 0 ) )
add % o 0 , 0 x08 , % o 0
EX_ S T ( S T O R E _ I N I T ( % g 2 , % o 0 ) )
add % o 0 , 0 x08 , % o 0
EX_ S T ( S T O R E _ I N I T ( % g 3 , % o 0 ) )
add % o 0 , 0 x08 , % o 0
EX_ S T ( S T O R E _ I N I T ( G L O B A L _ S P A R E , % o 0 ) )
add % o 0 , 0 x08 , % o 0
bne,p t % i c c , 1 b
LOAD( p r e f e t c h , % o 1 + 0 x20 0 , #n _ r e a d s _ s t r o n g )
membar #S t o r e L o a d | # S t o r e S t o r e
brz,p n % o 2 , . L e x i t
cmp % o 2 , 1 9
ble,p n % i c c , . L s m a l l _ u n a l i g n e d
nop
ba,a ,p t % i c c , . L m e d i u m _ n o p r e f e t c h
.Lexit : retl
mov E X _ R E T V A L ( % o 3 ) , % o 0
.Llarge_src_unaligned :
andn % o 2 , 0 x3 f , % o 4
sub % o 2 , % o 4 , % o 2
VISEntryHalf
alignaddr % o 1 , % g 0 , % g 1
add % o 1 , % o 4 , % o 1
EX_ L D ( L O A D ( l d d , % g 1 + 0 x00 , % f0 ) )
1 : EX_ L D ( L O A D ( l d d , % g 1 + 0 x08 , % f2 ) )
subcc % o 4 , 0 x40 , % o 4
EX_ L D ( L O A D ( l d d , % g 1 + 0 x10 , % f4 ) )
EX_ L D ( L O A D ( l d d , % g 1 + 0 x18 , % f6 ) )
EX_ L D ( L O A D ( l d d , % g 1 + 0 x20 , % f8 ) )
EX_ L D ( L O A D ( l d d , % g 1 + 0 x28 , % f10 ) )
EX_ L D ( L O A D ( l d d , % g 1 + 0 x30 , % f12 ) )
EX_ L D ( L O A D ( l d d , % g 1 + 0 x38 , % f14 ) )
faligndata % f0 , % f2 , % f16
EX_ L D ( L O A D ( l d d , % g 1 + 0 x40 , % f0 ) )
faligndata % f2 , % f4 , % f18
add % g 1 , 0 x40 , % g 1
faligndata % f4 , % f6 , % f20
faligndata % f6 , % f8 , % f22
faligndata % f8 , % f10 , % f24
faligndata % f10 , % f12 , % f26
faligndata % f12 , % f14 , % f28
faligndata % f14 , % f0 , % f30
EX_ S T ( S T O R E ( s t d , % f16 , % o 0 + 0 x00 ) )
EX_ S T ( S T O R E ( s t d , % f18 , % o 0 + 0 x08 ) )
EX_ S T ( S T O R E ( s t d , % f20 , % o 0 + 0 x10 ) )
EX_ S T ( S T O R E ( s t d , % f22 , % o 0 + 0 x18 ) )
EX_ S T ( S T O R E ( s t d , % f24 , % o 0 + 0 x20 ) )
EX_ S T ( S T O R E ( s t d , % f26 , % o 0 + 0 x28 ) )
EX_ S T ( S T O R E ( s t d , % f28 , % o 0 + 0 x30 ) )
EX_ S T ( S T O R E ( s t d , % f30 , % o 0 + 0 x38 ) )
add % o 0 , 0 x40 , % o 0
bne,p t % i c c , 1 b
LOAD( p r e f e t c h , % g 1 + 0 x20 0 , #n _ r e a d s _ s t r o n g )
VISExitHalf
brz,p n % o 2 , . L e x i t
cmp % o 2 , 1 9
ble,p n % i c c , . L s m a l l _ u n a l i g n e d
nop
ba,a ,p t % i c c , . L m e d i u m _ u n a l i g n e d
.Lmedium :
LOAD( p r e f e t c h , % o 1 + 0 x40 , #n _ r e a d s _ s t r o n g )
andcc % g 2 , 0 x7 , % g 0
bne,p n % i c c , . L m e d i u m _ u n a l i g n e d
nop
.Lmedium_noprefetch :
andncc % o 2 , 0 x20 - 1 , % o 5
be,p n % i c c , 2 f
sub % o 2 , % o 5 , % o 2
1 : EX_ L D ( L O A D ( l d x , % o 1 + 0 x00 , % g 1 ) )
EX_ L D ( L O A D ( l d x , % o 1 + 0 x08 , % g 2 ) )
EX_ L D ( L O A D ( l d x , % o 1 + 0 x10 , G L O B A L _ S P A R E ) )
EX_ L D ( L O A D ( l d x , % o 1 + 0 x18 , % o 4 ) )
add % o 1 , 0 x20 , % o 1
subcc % o 5 , 0 x20 , % o 5
EX_ S T ( S T O R E ( s t x , % g 1 , % o 0 + 0 x00 ) )
EX_ S T ( S T O R E ( s t x , % g 2 , % o 0 + 0 x08 ) )
EX_ S T ( S T O R E ( s t x , G L O B A L _ S P A R E , % o 0 + 0 x10 ) )
EX_ S T ( S T O R E ( s t x , % o 4 , % o 0 + 0 x18 ) )
bne,p t % i c c , 1 b
add % o 0 , 0 x20 , % o 0
2 : andcc % o 2 , 0 x18 , % o 5
be,p t % i c c , 3 f
sub % o 2 , % o 5 , % o 2
1 : EX_ L D ( L O A D ( l d x , % o 1 + 0 x00 , % g 1 ) )
add % o 1 , 0 x08 , % o 1
add % o 0 , 0 x08 , % o 0
subcc % o 5 , 0 x08 , % o 5
bne,p t % i c c , 1 b
EX_ S T ( S T O R E ( s t x , % g 1 , % o 0 - 0 x08 ) )
3 : brz,p t % o 2 , . L e x i t
cmp % o 2 , 0 x04
bl,p n % i c c , . L t i n y
nop
EX_ L D ( L O A D ( l d u w , % o 1 + 0 x00 , % g 1 ) )
add % o 1 , 0 x04 , % o 1
add % o 0 , 0 x04 , % o 0
subcc % o 2 , 0 x04 , % o 2
bne,p n % i c c , . L t i n y
EX_ S T ( S T O R E ( s t w , % g 1 , % o 0 - 0 x04 ) )
ba,a ,p t % i c c , . L e x i t
.Lmedium_unaligned :
/* First get dest 8 byte aligned. */
sub % g 0 , % o 0 , % g 1
and % g 1 , 0 x7 , % g 1
brz,p t % g 1 , 2 f
sub % o 2 , % g 1 , % o 2
2012-09-29 00:08:22 +04:00
2012-09-27 08:11:01 +04:00
1 : EX_ L D ( L O A D ( l d u b , % o 1 + 0 x00 , % g 2 ) )
add % o 1 , 1 , % o 1
subcc % g 1 , 1 , % g 1
add % o 0 , 1 , % o 0
bne,p t % i c c , 1 b
EX_ S T ( S T O R E ( s t b , % g 2 , % o 0 - 0 x01 ) )
2 :
and % o 1 , 0 x7 , % g 1
brz,p n % g 1 , . L m e d i u m _ n o p r e f e t c h
sll % g 1 , 3 , % g 1
mov 6 4 , % g 2
sub % g 2 , % g 1 , % g 2
andn % o 1 , 0 x7 , % o 1
EX_ L D ( L O A D ( l d x , % o 1 + 0 x00 , % o 4 ) )
sllx % o 4 , % g 1 , % o 4
andn % o 2 , 0 x08 - 1 , % o 5
sub % o 2 , % o 5 , % o 2
1 : EX_ L D ( L O A D ( l d x , % o 1 + 0 x08 , % g 3 ) )
add % o 1 , 0 x08 , % o 1
subcc % o 5 , 0 x08 , % o 5
srlx % g 3 , % g 2 , G L O B A L _ S P A R E
or G L O B A L _ S P A R E , % o 4 , G L O B A L _ S P A R E
EX_ S T ( S T O R E ( s t x , G L O B A L _ S P A R E , % o 0 + 0 x00 ) )
add % o 0 , 0 x08 , % o 0
bne,p t % i c c , 1 b
sllx % g 3 , % g 1 , % o 4
srl % g 1 , 3 , % g 1
add % o 1 , % g 1 , % o 1
brz,p n % o 2 , . L e x i t
nop
ba,p t % i c c , . L s m a l l _ u n a l i g n e d
.Ltiny :
EX_ L D ( L O A D ( l d u b , % o 1 + 0 x00 , % g 1 ) )
subcc % o 2 , 1 , % o 2
be,p n % i c c , . L e x i t
EX_ S T ( S T O R E ( s t b , % g 1 , % o 0 + 0 x00 ) )
EX_ L D ( L O A D ( l d u b , % o 1 + 0 x01 , % g 1 ) )
subcc % o 2 , 1 , % o 2
be,p n % i c c , . L e x i t
EX_ S T ( S T O R E ( s t b , % g 1 , % o 0 + 0 x01 ) )
EX_ L D ( L O A D ( l d u b , % o 1 + 0 x02 , % g 1 ) )
ba,p t % i c c , . L e x i t
EX_ S T ( S T O R E ( s t b , % g 1 , % o 0 + 0 x02 ) )
.Lsmall :
andcc % g 2 , 0 x3 , % g 0
bne,p n % i c c , . L s m a l l _ u n a l i g n e d
andn % o 2 , 0 x4 - 1 , % o 5
sub % o 2 , % o 5 , % o 2
1 :
EX_ L D ( L O A D ( l d u w , % o 1 + 0 x00 , % g 1 ) )
add % o 1 , 0 x04 , % o 1
subcc % o 5 , 0 x04 , % o 5
add % o 0 , 0 x04 , % o 0
bne,p t % i c c , 1 b
EX_ S T ( S T O R E ( s t w , % g 1 , % o 0 - 0 x04 ) )
brz,p t % o 2 , . L e x i t
nop
ba,a ,p t % i c c , . L t i n y
.Lsmall_unaligned :
1 : EX_ L D ( L O A D ( l d u b , % o 1 + 0 x00 , % g 1 ) )
add % o 1 , 1 , % o 1
add % o 0 , 1 , % o 0
subcc % o 2 , 1 , % o 2
bne,p t % i c c , 1 b
EX_ S T ( S T O R E ( s t b , % g 1 , % o 0 - 0 x01 ) )
ba,a ,p t % i c c , . L e x i t
.size FUNC_ N A M E , . - F U N C _ N A M E