2017-08-07 17:52:51 -06:00
/ *
* M7memcpy : Optimized S P A R C M 7 m e m c p y
*
* Copyright ( c ) 2 0 1 6 , O r a c l e a n d / o r i t s a f f i l i a t e s . A l l r i g h t s r e s e r v e d .
* /
.file " M7 m e m c p y . S "
/ *
* memcpy( s1 , s2 , l e n )
*
* Copy s2 t o s1 , a l w a y s c o p y n b y t e s .
* Note : this C c o d e d o e s n o t w o r k f o r o v e r l a p p e d c o p i e s .
*
* Fast a s s e m b l e r l a n g u a g e v e r s i o n o f t h e f o l l o w i n g C - p r o g r a m f o r m e m c p y
* which r e p r e s e n t s t h e ` s t a n d a r d ' f o r t h e C - l i b r a r y .
*
* void *
* memcpy( v o i d * s , c o n s t v o i d * s0 , s i z e _ t n )
* {
* if ( n ! = 0 ) {
* char * s1 = s ;
* const c h a r * s2 = s0 ;
* do {
* * s1 + + = * s2 + + ;
* } while ( - - n ! = 0 ) ;
* }
* return ( s ) ;
* }
*
*
* SPARC T 7 / M 7 F l o w :
*
* if ( c o u n t < S M A L L _ M A X ) {
* if c o u n t < S H O R T C O P Y ( S H O R T C O P Y =3 )
* copy b y t e s ; exit with dst addr
* if s r c & d s t a l i g n e d o n w o r d b o u n d a r y b u t n o t l o n g w o r d b o u n d a r y ,
* copy w i t h l d w / s t w ; branch to finish_up
* if s r c & d s t a l i g n e d o n l o n g w o r d b o u n d a r y
* copy w i t h l d x / s t x ; branch to finish_up
* if s r c & d s t n o t a l i g n e d a n d l e n g t h < = S H O R T C H E C K ( S H O R T C H E C K =14 )
* copy b y t e s ; exit with dst addr
* move e n o u g h b y t e s t o g e t s r c t o w o r d b o u n d a r y
* if d s t n o w o n w o r d b o u n d a r y
* move_words :
* copy w o r d s ; branch to finish_up
* if d s t n o w o n h a l f w o r d b o u n d a r y
* load w o r d s , s h i f t h a l f w o r d s , s t o r e w o r d s ; branch to finish_up
* if d s t o n b y t e 1
* load w o r d s , s h i f t 3 b y t e s , s t o r e w o r d s ; branch to finish_up
* if d s t o n b y t e 3
* load w o r d s , s h i f t 1 b y t e , s t o r e w o r d s ; branch to finish_up
* finish_up :
* copy b y t e s ; exit with dst addr
* } else { M o r e t h a n S M A L L _ M A X b y t e s
* move b y t e s u n t i l d s t i s o n l o n g w o r d b o u n d a r y
* if( s r c i s o n l o n g w o r d b o u n d a r y ) {
* if ( c o u n t < M E D _ M A X ) {
* finish_long : src/ d s t a l i g n e d o n 8 b y t e s
* copy w i t h l d x / s t x i n 8 - w a y u n r o l l e d l o o p ;
* copy f i n a l 0 - 6 3 b y t e s ; exit with dst addr
* } else { s r c / d s t a l i g n e d ; count > MED_MAX
* align d s t o n 6 4 b y t e b o u n d a r y ; for main data movement:
* prefetch s r c d a t a t o L 2 c a c h e ; let HW prefetch move data to L1 cache
* Use B I S ( b l o c k i n i t i a l i z i n g s t o r e ) t o a v o i d c o p y i n g s t o r e c a c h e
* lines f r o m m e m o r y . B u t p r e - s t o r e f i r s t e l e m e n t o f e a c h c a c h e l i n e
* ST_ C H U N K l i n e s i n a d v a n c e o f t h e r e s t o f t h a t c a c h e l i n e . T h a t
* gives t i m e f o r r e p l a c e m e n t c a c h e l i n e s t o b e w r i t t e n b a c k w i t h o u t
* excess S T Q a n d M i s s B u f f e r f i l l i n g . R e p e a t u n t i l n e a r t h e e n d ,
* then f i n i s h u p s t o r i n g b e f o r e g o i n g t o f i n i s h _ l o n g .
* }
* } else { s r c / d s t n o t a l i g n e d o n 8 b y t e s
* if s r c i s w o r d a l i g n e d a n d c o u n t < M E D _ W M A X
* move w o r d s i n 8 - w a y u n r o l l e d l o o p
* move f i n a l 0 - 3 1 b y t e s ; exit with dst addr
* if c o u n t < M E D _ U M A X
* use a l i g n a d d r / f a l i g n d a t a c o m b i n e d w i t h l d d / s t d i n 8 - w a y
* unrolled l o o p t o m o v e d a t a .
* go t o u n a l i g n _ d o n e
* else
* setup a l i g n a d d r f o r f a l i g n d a t a i n s t r u c t i o n s
* align d s t o n 6 4 b y t e b o u n d a r y ; prefetch src data to L1 cache
* loadx8 , f a l i g n , b l o c k - s t o r e , p r e f e t c h l o o p
* ( only u s e b l o c k - i n i t - s t o r e w h e n s r c / d s t o n 8 b y t e b o u n d a r i e s . )
* unalign_done :
* move r e m a i n i n g b y t e s f o r u n a l i g n e d c a s e s . e x i t w i t h d s t a d d r .
* }
*
* /
# include < a s m / v i s a s m . h >
# include < a s m / a s i . h >
# if ! d e f i n e d ( E X _ L D ) & & ! d e f i n e d ( E X _ S T )
# define N O N _ U S E R _ C O P Y
# endif
# ifndef E X _ L D
2017-08-07 17:52:52 -06:00
# define E X _ L D ( x ,y ) x
2017-08-07 17:52:51 -06:00
# endif
# ifndef E X _ L D _ F P
2017-08-07 17:52:52 -06:00
# define E X _ L D _ F P ( x ,y ) x
2017-08-07 17:52:51 -06:00
# endif
# ifndef E X _ S T
2017-08-07 17:52:52 -06:00
# define E X _ S T ( x ,y ) x
2017-08-07 17:52:51 -06:00
# endif
# ifndef E X _ S T _ F P
2017-08-07 17:52:52 -06:00
# define E X _ S T _ F P ( x ,y ) x
2017-08-07 17:52:51 -06:00
# 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
# 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 ]
# endif
/ *
* ASI_ B L K _ I N I T _ Q U A D _ L D D _ P / A S I _ B L K _ I N I T _ Q U A D _ L D D _ S m a r k s t h e c a c h e
* line a s " l e a s t r e c e n t l y u s e d " w h i c h m e a n s i f m a n y t h r e a d s a r e
* active, i t h a s a h i g h p r o b a b i l i t y o f b e i n g p u s h e d o u t o f t h e c a c h e
* between t h e f i r s t i n i t i a l i z i n g s t o r e a n d t h e f i n a l s t o r e s .
* Thus, w e u s e A S I _ S T _ B L K I N I T _ M R U _ P / A S I _ S T _ B L K I N I T _ M R U _ S w h i c h
* marks t h e c a c h e l i n e a s " m o s t r e c e n t l y u s e d " f o r a l l
* but t h e l a s t c a c h e l i n e
* /
# 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 S T O R E _ M R U _ 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 _ M R U _ A S I A S I _ S T _ B L K I N I T _ M R U _ P
# else
# define S T O R E _ M R U _ A S I 0 x80 / * A S I _ P * /
# 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 S T O R E _ I N I T _ M R U
# define S T O R E _ I N I T _ M R U ( s r c ,a d d r ) s t x a s r c , [ a d d r ] S T O R E _ M R U _ A S I
# endif
# ifndef F U N C _ N A M E
# define F U N C _ N A M E M 7 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
# define B L O C K _ S I Z E 6 4
# define S H O R T C O P Y 3
# define S H O R T C H E C K 1 4
# define S H O R T _ L O N G 6 4 / * m a x c o p y f o r s h o r t l o n g w o r d - a l i g n e d c a s e * /
/* must be at least 64 */
# define S M A L L _ M A X 1 2 8
# define M E D _ U M A X 1 0 2 4 / * m a x c o p y f o r m e d i u m u n - a l i g n e d c a s e * /
# define M E D _ W M A X 1 0 2 4 / * m a x c o p y f o r m e d i u m w o r d - a l i g n e d c a s e * /
# define M E D _ M A X 1 0 2 4 / * m a x c o p y f o r m e d i u m l o n g w o r d - a l i g n e d c a s e * /
# define S T _ C H U N K 2 4 / * S T _ C H U N K - b l o c k o f v a l u e s f o r B I S S t o r e * /
# define A L I G N _ P R E 2 4 / * d i s t a n c e f o r a l i g n e d p r e f e t c h l o o p * /
.register % g2 ,#s c r a t c h
.section " .text "
.global FUNC_NAME
.type FUNC_ N A M E , #f u n c t i o n
.align 16
FUNC_NAME :
srlx % o 2 , 3 1 , % g 2
cmp % g 2 , 0
tne % x c c , 5
PREAMBLE
mov % o 0 , % g 1 ! s a v e % o 0
brz,p n % o 2 , . L s m a l l x
cmp % o 2 , 3
ble,p n % i c c , . L t i n y _ c p
cmp % o 2 , 1 9
ble,p n % i c c , . L s m a l l _ c p
or % o 0 , % o 1 , % g 2
cmp % o 2 , S M A L L _ M A X
bl,p n % i c c , . L m e d i u m _ c p
nop
.Lmedium :
neg % o 0 , % o 5
andcc % o 5 , 7 , % o 5 ! b y t e s t i l l D S T 8 b y t e a l i g n e d
brz,p t % o 5 , . L d s t _ a l i g n e d _ o n _ 8
! % o5 h a s t h e b y t e s t o b e w r i t t e n i n p a r t i a l s t o r e .
sub % o 2 , % o 5 , % o 2
sub % o 1 , % o 0 , % o 1 ! % o 1 g e t s t h e d i f f e r e n c e
7 : ! dst a l i g n i n g l o o p
add % o 1 , % o 0 , % o 4
2017-08-07 17:52:52 -06:00
EX_ L D ( L O A D ( l d u b , % o 4 , % o 4 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 ) ! l o a d o n e b y t e
2017-08-07 17:52:51 -06:00
subcc % o 5 , 1 , % o 5
2017-08-07 17:52:52 -06:00
EX_ S T ( S T O R E ( s t b , % o 4 , % o 0 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 _ p l u s _ 1 )
2017-08-07 17:52:51 -06:00
bgu,p t % x c c , 7 b
add % o 0 , 1 , % o 0 ! a d v a n c e d s t
add % o 1 , % o 0 , % o 1 ! r e s t o r e % o 1
.Ldst_aligned_on_8 :
andcc % o 1 , 7 , % o 5
brnz,p t % o 5 , . L s r c _ d s t _ u n a l i g n e d _ o n _ 8
nop
.Lsrc_dst_aligned_on_8 :
! check i f w e a r e c o p y i n g M E D _ M A X o r m o r e b y t e s
set M E D _ M A X , % o 3
cmp % o 2 , % o 3 ! l i m i t t o s t o r e b u f f e r s i z e
bgu,p n % x c c , . L l a r g e _ a l i g n 8 _ c o p y
nop
/ *
* Special c a s e f o r h a n d l i n g w h e n s r c a n d d e s t a r e b o t h l o n g w o r d a l i g n e d
* and t o t a l d a t a t o m o v e i s l e s s t h a n M E D _ M A X b y t e s
* /
.Lmedlong :
subcc % o 2 , 6 3 , % o 2 ! a d j u s t l e n g t h t o a l l o w c c t e s t
ble,p n % x c c , . L m e d l 6 3 ! s k i p b i g l o o p i f l e s s t h a n 6 4 b y t e s
nop
.Lmedl64 :
2017-08-07 17:52:52 -06:00
EX_ L D ( L O A D ( l d x , % o 1 , % o 4 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 6 3 ) ! l o a d
2017-08-07 17:52:51 -06:00
subcc % o 2 , 6 4 , % o 2 ! d e c r e m e n t l e n g t h c o u n t
2017-08-07 17:52:52 -06:00
EX_ S T ( S T O R E ( s t x , % o 4 , % o 0 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 6 3 _ 6 4 ) ! a n d s t o r e
EX_ L D ( L O A D ( l d x , % o 1 + 8 , % o 3 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 6 3 _ 5 6 ) ! a b l o c k o f 6 4
EX_ S T ( S T O R E ( s t x , % o 3 , % o 0 + 8 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 6 3 _ 5 6 )
EX_ L D ( L O A D ( l d x , % o 1 + 1 6 , % o 4 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 6 3 _ 4 8 )
EX_ S T ( S T O R E ( s t x , % o 4 , % o 0 + 1 6 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 6 3 _ 4 8 )
EX_ L D ( L O A D ( l d x , % o 1 + 2 4 , % o 3 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 6 3 _ 4 0 )
EX_ S T ( S T O R E ( s t x , % o 3 , % o 0 + 2 4 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 6 3 _ 4 0 )
EX_ L D ( L O A D ( l d x , % o 1 + 3 2 , % o 4 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 6 3 _ 3 2 ) ! l o a d a n d s t o r e
EX_ S T ( S T O R E ( s t x , % o 4 , % o 0 + 3 2 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 6 3 _ 3 2 )
EX_ L D ( L O A D ( l d x , % o 1 + 4 0 , % o 3 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 6 3 _ 2 4 ) ! a b l o c k o f 6 4
2017-08-07 17:52:51 -06:00
add % o 1 , 6 4 , % o 1 ! i n c r e a s e s r c p t r b y 6 4
2017-08-07 17:52:52 -06:00
EX_ S T ( S T O R E ( s t x , % o 3 , % o 0 + 4 0 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 6 3 _ 2 4 )
EX_ L D ( L O A D ( l d x , % o 1 - 1 6 , % o 4 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 6 3 _ 1 6 )
2017-08-07 17:52:51 -06:00
add % o 0 , 6 4 , % o 0 ! i n c r e a s e d s t p t r b y 6 4
2017-08-07 17:52:52 -06:00
EX_ S T ( S T O R E ( s t x , % o 4 , % o 0 - 1 6 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 6 3 _ 1 6 )
EX_ L D ( L O A D ( l d x , % o 1 - 8 , % o 3 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 6 3 _ 8 )
2017-08-07 17:52:51 -06:00
bgu,p t % x c c , . L m e d l 6 4 ! r e p e a t i f a t l e a s t 6 4 b y t e s l e f t
2017-08-07 17:52:52 -06:00
EX_ S T ( S T O R E ( s t x , % o 3 , % o 0 - 8 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 6 3 _ 8 )
2017-08-07 17:52:51 -06:00
.Lmedl63 :
addcc % o 2 , 3 2 , % o 2 ! a d j u s t r e m a i n i n g c o u n t
ble,p t % x c c , . L m e d l 3 1 ! t o s k i p i f 3 1 o r f e w e r b y t e s l e f t
nop
2017-08-07 17:52:52 -06:00
EX_ L D ( L O A D ( l d x , % o 1 , % o 4 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 3 1 ) ! l o a d
2017-08-07 17:52:51 -06:00
sub % o 2 , 3 2 , % o 2 ! d e c r e m e n t l e n g t h c o u n t
2017-08-07 17:52:52 -06:00
EX_ S T ( S T O R E ( s t x , % o 4 , % o 0 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 3 1 _ 3 2 ) ! a n d s t o r e
EX_ L D ( L O A D ( l d x , % o 1 + 8 , % o 3 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 3 1 _ 2 4 ) ! a b l o c k o f 3 2
2017-08-07 17:52:51 -06:00
add % o 1 , 3 2 , % o 1 ! i n c r e a s e s r c p t r b y 3 2
2017-08-07 17:52:52 -06:00
EX_ S T ( S T O R E ( s t x , % o 3 , % o 0 + 8 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 3 1 _ 2 4 )
EX_ L D ( L O A D ( l d x , % o 1 - 1 6 , % o 4 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 3 1 _ 1 6 )
2017-08-07 17:52:51 -06:00
add % o 0 , 3 2 , % o 0 ! i n c r e a s e d s t p t r b y 3 2
2017-08-07 17:52:52 -06:00
EX_ S T ( S T O R E ( s t x , % o 4 , % o 0 - 1 6 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 3 1 _ 1 6 )
EX_ L D ( L O A D ( l d x , % o 1 - 8 , % o 3 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 3 1 _ 8 )
EX_ S T ( S T O R E ( s t x , % o 3 , % o 0 - 8 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 3 1 _ 8 )
2017-08-07 17:52:51 -06:00
.Lmedl31 :
addcc % o 2 , 1 6 , % o 2 ! a d j u s t r e m a i n i n g c o u n t
ble,p t % x c c , . L m e d l 1 5 ! s k i p i f 1 5 o r f e w e r b y t e s l e f t
nop !
2017-08-07 17:52:52 -06:00
EX_ L D ( L O A D ( l d x , % o 1 , % o 4 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 1 5 )
2017-08-07 17:52:51 -06:00
add % o 1 , 1 6 , % o 1 ! i n c r e a s e s r c p t r b y 1 6
2017-08-07 17:52:52 -06:00
EX_ S T ( S T O R E ( s t x , % o 4 , % o 0 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 1 5 )
2017-08-07 17:52:51 -06:00
sub % o 2 , 1 6 , % o 2 ! d e c r e a s e c o u n t b y 1 6
2017-08-07 17:52:52 -06:00
EX_ L D ( L O A D ( l d x , % o 1 - 8 , % o 3 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 1 5 _ 8 )
2017-08-07 17:52:51 -06:00
add % o 0 , 1 6 , % o 0 ! i n c r e a s e d s t p t r b y 1 6
2017-08-07 17:52:52 -06:00
EX_ S T ( S T O R E ( s t x , % o 3 , % o 0 - 8 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 1 5 _ 8 )
2017-08-07 17:52:51 -06:00
.Lmedl15 :
addcc % o 2 , 1 5 , % o 2 ! r e s t o r e c o u n t
bz,p t % x c c , . L s m a l l x ! e x i t i f f i n i s h e d
cmp % o 2 , 8
blt,p t % x c c , . L m e d w7 ! s k i p i f 7 o r f e w e r b y t e s l e f t
tst % o 2
2017-08-07 17:52:52 -06:00
EX_ L D ( L O A D ( l d x , % o 1 , % o 4 ) , m e m c p y _ r e t l _ o 2 ) ! l o a d 8 b y t e s
2017-08-07 17:52:51 -06:00
add % o 1 , 8 , % o 1 ! i n c r e a s e s r c p t r b y 8
add % o 0 , 8 , % o 0 ! i n c r e a s e d s t p t r b y 8
subcc % o 2 , 8 , % o 2 ! d e c r e a s e c o u n t b y 8
bnz,p n % x c c , . L m e d w7
2017-08-07 17:52:52 -06:00
EX_ S T ( S T O R E ( s t x , % o 4 , % o 0 - 8 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 8 ) ! a n d s t o r e 8
2017-08-07 17:52:51 -06:00
retl
mov E X _ R E T V A L ( % g 1 ) , % o 0 ! r e s t o r e % o 0
.align 16
.Lsrc_dst_unaligned_on_8 :
! DST i s 8 - b y t e a l i g n e d , s r c i s n o t
2 :
andcc % o 1 , 0 x3 , % o 5 ! t e s t w o r d a l i g n m e n t
bnz,p t % x c c , . L u n a l i g n s e t u p ! b r a n c h t o s k i p i f n o t w o r d a l i g n e d
nop
/ *
* Handle a l l c a s e s w h e r e s r c a n d d e s t a r e a l i g n e d o n w o r d
* boundaries. U s e u n r o l l e d l o o p s f o r b e t t e r p e r f o r m a n c e .
* This o p t i o n w i n s o v e r s t a n d a r d l a r g e d a t a m o v e w h e n
* source a n d d e s t i n a t i o n i s i n c a c h e f o r . L m e d i u m
* to s h o r t d a t a m o v e s .
* /
set M E D _ W M A X , % o 3
cmp % o 2 , % o 3 ! l i m i t t o s t o r e b u f f e r s i z e
bge,p t % x c c , . L u n a l i g n r e j o i n ! o t h e r w i s e r e j o i n m a i n l o o p
nop
subcc % o 2 , 3 1 , % o 2 ! a d j u s t l e n g t h t o a l l o w c c t e s t
! for e n d o f l o o p
ble,p t % x c c , . L m e d w31 ! s k i p b i g l o o p i f l e s s t h a n 1 6
.Lmedw32 :
2017-08-07 17:52:52 -06:00
EX_ L D ( L O A D ( l d , % o 1 , % o 4 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 3 1 ) ! m o v e a b l o c k o f 3 2
2017-08-07 17:52:51 -06:00
sllx % o 4 , 3 2 , % o 5
2017-08-07 17:52:52 -06:00
EX_ L D ( L O A D ( l d , % o 1 + 4 , % o 4 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 3 1 )
2017-08-07 17:52:51 -06:00
or % o 4 , % o 5 , % o 5
2017-08-07 17:52:52 -06:00
EX_ S T ( S T O R E ( s t x , % o 5 , % o 0 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 3 1 )
2017-08-07 17:52:51 -06:00
subcc % o 2 , 3 2 , % o 2 ! d e c r e m e n t l e n g t h c o u n t
2017-08-07 17:52:52 -06:00
EX_ L D ( L O A D ( l d , % o 1 + 8 , % o 4 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 3 1 _ 2 4 )
2017-08-07 17:52:51 -06:00
sllx % o 4 , 3 2 , % o 5
2017-08-07 17:52:52 -06:00
EX_ L D ( L O A D ( l d , % o 1 + 1 2 , % o 4 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 3 1 _ 2 4 )
2017-08-07 17:52:51 -06:00
or % o 4 , % o 5 , % o 5
2017-08-07 17:52:52 -06:00
EX_ S T ( S T O R E ( s t x , % o 5 , % o 0 + 8 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 3 1 _ 2 4 )
2017-08-07 17:52:51 -06:00
add % o 1 , 3 2 , % o 1 ! i n c r e a s e s r c p t r b y 3 2
2017-08-07 17:52:52 -06:00
EX_ L D ( L O A D ( l d , % o 1 - 1 6 , % o 4 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 3 1 _ 1 6 )
2017-08-07 17:52:51 -06:00
sllx % o 4 , 3 2 , % o 5
2017-08-07 17:52:52 -06:00
EX_ L D ( L O A D ( l d , % o 1 - 1 2 , % o 4 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 3 1 _ 1 6 )
2017-08-07 17:52:51 -06:00
or % o 4 , % o 5 , % o 5
2017-08-07 17:52:52 -06:00
EX_ S T ( S T O R E ( s t x , % o 5 , % o 0 + 1 6 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 3 1 _ 1 6 )
2017-08-07 17:52:51 -06:00
add % o 0 , 3 2 , % o 0 ! i n c r e a s e d s t p t r b y 3 2
2017-08-07 17:52:52 -06:00
EX_ L D ( L O A D ( l d , % o 1 - 8 , % o 4 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 3 1 _ 8 )
2017-08-07 17:52:51 -06:00
sllx % o 4 , 3 2 , % o 5
2017-08-07 17:52:52 -06:00
EX_ L D ( L O A D ( l d , % o 1 - 4 , % o 4 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 3 1 _ 8 )
2017-08-07 17:52:51 -06:00
or % o 4 , % o 5 , % o 5
bgu,p t % x c c , . L m e d w32 ! r e p e a t i f a t l e a s t 3 2 b y t e s l e f t
2017-08-07 17:52:52 -06:00
EX_ S T ( S T O R E ( s t x , % o 5 , % o 0 - 8 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 3 1 _ 8 )
2017-08-07 17:52:51 -06:00
.Lmedw31 :
addcc % o 2 , 3 1 , % o 2 ! r e s t o r e c o u n t
bz,p t % x c c , . L s m a l l x ! e x i t i f f i n i s h e d
nop
cmp % o 2 , 1 6
blt,p t % x c c , . L m e d w15
nop
2017-08-07 17:52:52 -06:00
EX_ L D ( L O A D ( l d , % o 1 , % o 4 ) , m e m c p y _ r e t l _ o 2 ) ! m o v e a b l o c k o f 1 6 b y t e s
2017-08-07 17:52:51 -06:00
sllx % o 4 , 3 2 , % o 5
subcc % o 2 , 1 6 , % o 2 ! d e c r e m e n t l e n g t h c o u n t
2017-08-07 17:52:52 -06:00
EX_ L D ( L O A D ( l d , % o 1 + 4 , % o 4 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 1 6 )
2017-08-07 17:52:51 -06:00
or % o 4 , % o 5 , % o 5
2017-08-07 17:52:52 -06:00
EX_ S T ( S T O R E ( s t x , % o 5 , % o 0 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 1 6 )
2017-08-07 17:52:51 -06:00
add % o 1 , 1 6 , % o 1 ! i n c r e a s e s r c p t r b y 1 6
2017-08-07 17:52:52 -06:00
EX_ L D ( L O A D ( l d , % o 1 - 8 , % o 4 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 8 )
2017-08-07 17:52:51 -06:00
add % o 0 , 1 6 , % o 0 ! i n c r e a s e d s t p t r b y 1 6
sllx % o 4 , 3 2 , % o 5
2017-08-07 17:52:52 -06:00
EX_ L D ( L O A D ( l d , % o 1 - 4 , % o 4 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 8 )
2017-08-07 17:52:51 -06:00
or % o 4 , % o 5 , % o 5
2017-08-07 17:52:52 -06:00
EX_ S T ( S T O R E ( s t x , % o 5 , % o 0 - 8 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 8 )
2017-08-07 17:52:51 -06:00
.Lmedw15 :
bz,p t % x c c , . L s m a l l x ! e x i t i f f i n i s h e d
cmp % o 2 , 8
blt,p n % x c c , . L m e d w7 ! s k i p i f 7 o r f e w e r b y t e s l e f t
tst % o 2
2017-08-07 17:52:52 -06:00
EX_ L D ( L O A D ( l d , % o 1 , % o 4 ) , m e m c p y _ r e t l _ o 2 ) ! l o a d 4 b y t e s
2017-08-07 17:52:51 -06:00
subcc % o 2 , 8 , % o 2 ! d e c r e a s e c o u n t b y 8
2017-08-07 17:52:52 -06:00
EX_ S T ( S T O R E ( s t w , % o 4 , % o 0 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 8 ) ! a n d s t o r e 4 b y t e s
2017-08-07 17:52:51 -06:00
add % o 1 , 8 , % o 1 ! i n c r e a s e s r c p t r b y 8
2017-08-07 17:52:52 -06:00
EX_ L D ( L O A D ( l d , % o 1 - 4 , % o 3 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 4 ) ! l o a d 4 b y t e s
2017-08-07 17:52:51 -06:00
add % o 0 , 8 , % o 0 ! i n c r e a s e d s t p t r b y 8
2017-08-07 17:52:52 -06:00
EX_ S T ( S T O R E ( s t w , % o 3 , % o 0 - 4 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 4 ) ! a n d s t o r e 4 b y t e s
2017-08-07 17:52:51 -06:00
bz,p t % x c c , . L s m a l l x ! e x i t i f f i n i s h e d
.Lmedw7 : ! count i s g e 1 , l e s s t h a n 8
cmp % o 2 , 4 ! c h e c k f o r 4 b y t e s l e f t
blt,p n % x c c , . L s m a l l l e f t 3 ! s k i p i f 3 o r f e w e r b y t e s l e f t
nop !
2017-08-07 17:52:52 -06:00
EX_ L D ( L O A D ( l d , % o 1 , % o 4 ) , m e m c p y _ r e t l _ o 2 ) ! l o a d 4 b y t e s
2017-08-07 17:52:51 -06:00
add % o 1 , 4 , % o 1 ! i n c r e a s e s r c p t r b y 4
add % o 0 , 4 , % o 0 ! i n c r e a s e d s t p t r b y 4
subcc % o 2 , 4 , % o 2 ! d e c r e a s e c o u n t b y 4
bnz . L s m a l l l e f t 3
2017-08-07 17:52:52 -06:00
EX_ S T ( S T O R E ( s t w , % o 4 , % o 0 - 4 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 4 ) ! a n d s t o r e 4 b y t e s
2017-08-07 17:52:51 -06:00
retl
mov E X _ R E T V A L ( % g 1 ) , % o 0
.align 16
.Llarge_align8_copy : ! Src a n d d s t s h a r e 8 b y t e a l i g n m e n t
! align d s t t o 6 4 b y t e b o u n d a r y
andcc % o 0 , 0 x3 f , % o 3 ! % o 3 = = 0 m e a n s d s t i s 6 4 b y t e a l i g n e d
brz,p n % o 3 , . L a l i g n e d _ t o _ 6 4
andcc % o 0 , 8 , % o 3 ! o d d l o n g w o r d s t o m o v e ?
brz,p t % o 3 , . L a l i g n e d _ t o _ 1 6
nop
2017-08-07 17:52:52 -06:00
EX_ L D ( L O A D ( l d x , % o 1 , % o 4 ) , m e m c p y _ r e t l _ o 2 )
2017-08-07 17:52:51 -06:00
sub % o 2 , 8 , % o 2
add % o 1 , 8 , % o 1 ! i n c r e m e n t s r c p t r
add % o 0 , 8 , % o 0 ! i n c r e m e n t d s t p t r
2017-08-07 17:52:52 -06:00
EX_ S T ( S T O R E ( s t x , % o 4 , % o 0 - 8 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 8 )
2017-08-07 17:52:51 -06:00
.Laligned_to_16 :
andcc % o 0 , 1 6 , % o 3 ! p a i r o f l o n g w o r d s t o m o v e ?
brz,p t % o 3 , . L a l i g n e d _ t o _ 3 2
nop
2017-08-07 17:52:52 -06:00
EX_ L D ( L O A D ( l d x , % o 1 , % o 4 ) , m e m c p y _ r e t l _ o 2 )
2017-08-07 17:52:51 -06:00
sub % o 2 , 1 6 , % o 2
2017-08-07 17:52:52 -06:00
EX_ S T ( S T O R E ( s t x , % o 4 , % o 0 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 1 6 )
2017-08-07 17:52:51 -06:00
add % o 1 , 1 6 , % o 1 ! i n c r e m e n t s r c p t r
2017-08-07 17:52:52 -06:00
EX_ L D ( L O A D ( l d x , % o 1 - 8 , % o 4 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 8 )
2017-08-07 17:52:51 -06:00
add % o 0 , 1 6 , % o 0 ! i n c r e m e n t d s t p t r
2017-08-07 17:52:52 -06:00
EX_ S T ( S T O R E ( s t x , % o 4 , % o 0 - 8 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 8 )
2017-08-07 17:52:51 -06:00
.Laligned_to_32 :
andcc % o 0 , 3 2 , % o 3 ! f o u r l o n g w o r d s t o m o v e ?
brz,p t % o 3 , . L a l i g n e d _ t o _ 6 4
nop
2017-08-07 17:52:52 -06:00
EX_ L D ( L O A D ( l d x , % o 1 , % o 4 ) , m e m c p y _ r e t l _ o 2 )
2017-08-07 17:52:51 -06:00
sub % o 2 , 3 2 , % o 2
2017-08-07 17:52:52 -06:00
EX_ S T ( S T O R E ( s t x , % o 4 , % o 0 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 3 2 )
EX_ L D ( L O A D ( l d x , % o 1 + 8 , % o 4 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 2 4 )
EX_ S T ( S T O R E ( s t x , % o 4 , % o 0 + 8 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 2 4 )
EX_ L D ( L O A D ( l d x , % o 1 + 1 6 , % o 4 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 1 6 )
EX_ S T ( S T O R E ( s t x , % o 4 , % o 0 + 1 6 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 1 6 )
2017-08-07 17:52:51 -06:00
add % o 1 , 3 2 , % o 1 ! i n c r e m e n t s r c p t r
2017-08-07 17:52:52 -06:00
EX_ L D ( L O A D ( l d x , % o 1 - 8 , % o 4 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 8 )
2017-08-07 17:52:51 -06:00
add % o 0 , 3 2 , % o 0 ! i n c r e m e n t d s t p t r
2017-08-07 17:52:52 -06:00
EX_ S T ( S T O R E ( s t x , % o 4 , % o 0 - 8 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 8 )
2017-08-07 17:52:51 -06:00
.Laligned_to_64 :
!
! Using b l o c k i n i t s t o r e ( B I S ) i n s t r u c t i o n s t o a v o i d f e t c h i n g c a c h e
! lines f r o m m e m o r y . U s e S T _ C H U N K s t o r e s t o f i r s t e l e m e n t o f e a c h c a c h e
! line ( s i m i l a r t o p r e f e t c h i n g ) t o a v o i d o v e r f i l l i n g S T Q o r m i s s b u f f e r s .
! Gives e x i s t i n g c a c h e l i n e s t i m e t o b e m o v e d o u t o f L 1 / L 2 / L 3 c a c h e .
! Initial s t o r e s u s i n g M R U v e r s i o n o f B I S t o k e e p c a c h e l i n e i n
! cache u n t i l w e a r e r e a d y t o s t o r e f i n a l e l e m e n t o f c a c h e l i n e .
! Then s t o r e l a s t e l e m e n t u s i n g t h e L R U v e r s i o n o f B I S .
!
andn % o 2 , 0 x3 f , % o 5 ! % o 5 i s m u l t i p l e o f b l o c k s i z e
and % o 2 , 0 x3 f , % o 2 ! r e s i d u e b y t e s i n % o 2
!
! We u s e S T O R E _ M R U _ A S I f o r t h e f i r s t s e v e n s t o r e s t o e a c h c a c h e l i n e
! followed b y S T O R E _ A S I ( m a r k a s L R U ) f o r t h e l a s t s t o r e . T h a t
! mixed a p p r o a c h r e d u c e s t h e p r o b a b i l i t y t h a t t h e c a c h e l i n e i s r e m o v e d
! before w e f i n i s h s e t t i n g i t , w h i l e m i n i m i z i n g t h e e f f e c t s o n
! other c a c h e d v a l u e s d u r i n g a l a r g e m e m c p y
!
! ST_ C H U N K b a t c h e s u p i n i t i a l B I S o p e r a t i o n s f o r s e v e r a l c a c h e l i n e s
! to a l l o w m u l t i p l e r e q u e s t s t o n o t b e b l o c k e d b y o v e r f l o w i n g t h e
! the s t o r e m i s s b u f f e r . T h e n t h e m a t c h i n g s t o r e s f o r a l l t h o s e
! BIS o p e r a t i o n s a r e e x e c u t e d .
!
sub % o 0 , 8 , % o 0 ! a d j u s t % o 0 f o r A S I a l i g n m e n t
.Lalign_loop :
cmp % o 5 , S T _ C H U N K * 6 4
blu,p t % x c c , . L a l i g n _ l o o p _ f i n
mov S T _ C H U N K ,% o 3
.Lalign_loop_start :
prefetch [ % o 1 + ( A L I G N _ P R E * B L O C K _ S I Z E ) ] , 2 1
subcc % o 3 , 1 , % o 3
2017-08-07 17:52:52 -06:00
EX_ L D ( L O A D ( l d x , % o 1 , % o 4 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 )
2017-08-07 17:52:51 -06:00
add % o 1 , 6 4 , % o 1
add % o 0 , 8 , % o 0
2017-08-07 17:52:52 -06:00
EX_ S T ( S T O R E _ I N I T _ M R U ( % o 4 , % o 0 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 )
2017-08-07 17:52:51 -06:00
bgu % x c c ,. L a l i g n _ l o o p _ s t a r t
add % o 0 , 5 6 , % o 0
mov S T _ C H U N K ,% o 3
sllx % o 3 , 6 , % o 4 ! S T _ C H U N K * 6 4
sub % o 1 , % o 4 , % o 1 ! r e s e t % o 1
sub % o 0 , % o 4 , % o 0 ! r e s e t % o 0
.Lalign_loop_rest :
2017-08-07 17:52:52 -06:00
EX_ L D ( L O A D ( l d x , % o 1 + 8 , % o 4 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 )
2017-08-07 17:52:51 -06:00
add % o 0 , 1 6 , % o 0
2017-08-07 17:52:52 -06:00
EX_ S T ( S T O R E _ I N I T _ M R U ( % o 4 , % o 0 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 )
EX_ L D ( L O A D ( l d x , % o 1 + 1 6 , % o 4 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 )
2017-08-07 17:52:51 -06:00
add % o 0 , 8 , % o 0
2017-08-07 17:52:52 -06:00
EX_ S T ( S T O R E _ I N I T _ M R U ( % o 4 , % o 0 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 )
2017-08-07 17:52:51 -06:00
subcc % o 3 , 1 , % o 3
2017-08-07 17:52:52 -06:00
EX_ L D ( L O A D ( l d x , % o 1 + 2 4 , % o 4 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 )
2017-08-07 17:52:51 -06:00
add % o 0 , 8 , % o 0
2017-08-07 17:52:52 -06:00
EX_ S T ( S T O R E _ I N I T _ M R U ( % o 4 , % o 0 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 )
EX_ L D ( L O A D ( l d x , % o 1 + 3 2 , % o 4 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 )
2017-08-07 17:52:51 -06:00
add % o 0 , 8 , % o 0
2017-08-07 17:52:52 -06:00
EX_ S T ( S T O R E _ I N I T _ M R U ( % o 4 , % o 0 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 )
EX_ L D ( L O A D ( l d x , % o 1 + 4 0 , % o 4 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 )
2017-08-07 17:52:51 -06:00
add % o 0 , 8 , % o 0
2017-08-07 17:52:52 -06:00
EX_ S T ( S T O R E _ I N I T _ M R U ( % o 4 , % o 0 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 )
EX_ L D ( L O A D ( l d x , % o 1 + 4 8 , % o 4 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 )
2017-08-07 17:52:51 -06:00
add % o 1 , 6 4 , % o 1
add % o 0 , 8 , % o 0
2017-08-07 17:52:52 -06:00
EX_ S T ( S T O R E _ I N I T _ M R U ( % o 4 , % o 0 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 )
2017-08-07 17:52:51 -06:00
add % o 0 , 8 , % o 0
2017-08-07 17:52:52 -06:00
EX_ L D ( L O A D ( l d x , % o 1 - 8 , % o 4 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 )
2017-08-07 17:52:51 -06:00
sub % o 5 , 6 4 , % o 5
bgu % x c c ,. L a l i g n _ l o o p _ r e s t
! mark c a c h e l i n e a s L R U
2017-08-07 17:52:52 -06:00
EX_ S T ( S T O R E _ I N I T ( % o 4 , % o 0 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 _ p l u s _ 6 4 )
2017-08-07 17:52:51 -06:00
cmp % o 5 , S T _ C H U N K * 6 4
bgu,p t % x c c , . L a l i g n _ l o o p _ s t a r t
mov S T _ C H U N K ,% o 3
cmp % o 5 , 0
beq . L a l i g n _ d o n e
nop
.Lalign_loop_fin :
2017-08-07 17:52:52 -06:00
EX_ L D ( L O A D ( l d x , % o 1 , % o 4 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 )
EX_ S T ( S T O R E ( s t x , % o 4 , % o 0 + 8 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 )
EX_ L D ( L O A D ( l d x , % o 1 + 8 , % o 4 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 )
EX_ S T ( S T O R E ( s t x , % o 4 , % o 0 + 8 + 8 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 )
EX_ L D ( L O A D ( l d x , % o 1 + 1 6 , % o 4 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 )
EX_ S T ( S T O R E ( s t x , % o 4 , % o 0 + 8 + 1 6 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 )
2017-08-07 17:52:51 -06:00
subcc % o 5 , 6 4 , % o 5
2017-08-07 17:52:52 -06:00
EX_ L D ( L O A D ( l d x , % o 1 + 2 4 , % o 4 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 _ 6 4 )
EX_ S T ( S T O R E ( s t x , % o 4 , % o 0 + 8 + 2 4 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 _ 6 4 )
EX_ L D ( L O A D ( l d x , % o 1 + 3 2 , % o 4 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 _ 6 4 )
EX_ S T ( S T O R E ( s t x , % o 4 , % o 0 + 8 + 3 2 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 _ 6 4 )
EX_ L D ( L O A D ( l d x , % o 1 + 4 0 , % o 4 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 _ 6 4 )
EX_ S T ( S T O R E ( s t x , % o 4 , % o 0 + 8 + 4 0 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 _ 6 4 )
EX_ L D ( L O A D ( l d x , % o 1 + 4 8 , % o 4 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 _ 6 4 )
2017-08-07 17:52:51 -06:00
add % o 1 , 6 4 , % o 1
2017-08-07 17:52:52 -06:00
EX_ S T ( S T O R E ( s t x , % o 4 , % o 0 + 8 + 4 8 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 _ 6 4 )
2017-08-07 17:52:51 -06:00
add % o 0 , 6 4 , % o 0
2017-08-07 17:52:52 -06:00
EX_ L D ( L O A D ( l d x , % o 1 - 8 , % o 4 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 _ 6 4 )
2017-08-07 17:52:51 -06:00
bgu % x c c ,. L a l i g n _ l o o p _ f i n
2017-08-07 17:52:52 -06:00
EX_ S T ( S T O R E ( s t x , % o 4 , % o 0 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 _ 6 4 )
2017-08-07 17:52:51 -06:00
.Lalign_done :
add % o 0 , 8 , % o 0 ! r e s t o r e % o 0 f r o m A S I a l i g n m e n t
membar #S t o r e S t o r e
sub % o 2 , 6 3 , % o 2 ! a d j u s t l e n g t h t o a l l o w c c t e s t
ba . L m e d l 6 3 ! i n . L m e d l 6 3
nop
.align 16
! Dst i s o n 8 b y t e b o u n d a r y ; src is not; remaining count > SMALL_MAX
.Lunalignsetup :
.Lunalignrejoin :
mov % g 1 , % o 3 ! s a v e % g 1 a s V I S E n t r y H a l f c l o b b e r s i t
# ifdef N O N _ U S E R _ C O P Y
VISEntryHalfFast( . L m e d i u m _ v i s _ e n t r y _ f a i l _ c p )
# else
VISEntryHalf
# endif
mov % o 3 , % g 1 ! r e s t o r e % g 1
set M E D _ U M A X , % o 3
cmp % o 2 , % o 3 ! c h e c k f o r . L m e d i u m u n a l i g n e d l i m i t
bge,p t % x c c ,. L u n a l i g n _ l a r g e
prefetch [ % o 1 + ( 4 * B L O C K _ S I Z E ) ] , 2 0
andn % o 2 , 0 x3 f , % o 5 ! % o 5 i s m u l t i p l e o f b l o c k s i z e
and % o 2 , 0 x3 f , % o 2 ! r e s i d u e b y t e s i n % o 2
cmp % o 2 , 8 ! I n s u r e w e d o n o t l o a d b e y o n d
bgt . L u n a l i g n _ a d j u s t ! e n d o f s o u r c e b u f f e r
andn % o 1 , 0 x7 , % o 4 ! % o 4 h a s l o n g w o r d a l i g n e d s r c a d d r e s s
add % o 2 , 6 4 , % o 2 ! a d j u s t t o l e a v e l o o p
sub % o 5 , 6 4 , % o 5 ! e a r l y i f n e c e s s a r y
.Lunalign_adjust :
alignaddr % o 1 , % g 0 , % g 0 ! g e n e r a t e % g s r
add % o 1 , % o 5 , % o 1 ! a d v a n c e % o 1 t o a f t e r b l o c k s
2017-08-07 17:52:52 -06:00
EX_ L D _ F P ( L O A D ( l d d , % o 4 , % f0 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 )
2017-08-07 17:52:51 -06:00
.Lunalign_loop :
2017-08-07 17:52:52 -06:00
EX_ L D _ F P ( L O A D ( l d d , % o 4 + 8 , % f2 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 )
2017-08-07 17:52:51 -06:00
faligndata % f0 , % f2 , % f16
2017-08-07 17:52:52 -06:00
EX_ L D _ F P ( L O A D ( l d d , % o 4 + 1 6 , % f4 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 )
2017-08-07 17:52:51 -06:00
subcc % o 5 , B L O C K _ S I Z E , % o 5
2017-08-07 17:52:52 -06:00
EX_ S T _ F P ( S T O R E ( s t d , % f16 , % o 0 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 _ p l u s _ 6 4 )
2017-08-07 17:52:51 -06:00
faligndata % f2 , % f4 , % f18
2017-08-07 17:52:52 -06:00
EX_ L D _ F P ( L O A D ( l d d , % o 4 + 2 4 , % f6 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 _ p l u s _ 5 6 )
EX_ S T _ F P ( S T O R E ( s t d , % f18 , % o 0 + 8 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 _ p l u s _ 5 6 )
2017-08-07 17:52:51 -06:00
faligndata % f4 , % f6 , % f20
2017-08-07 17:52:52 -06:00
EX_ L D _ F P ( L O A D ( l d d , % o 4 + 3 2 , % f8 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 _ p l u s _ 4 8 )
EX_ S T _ F P ( S T O R E ( s t d , % f20 , % o 0 + 1 6 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 _ p l u s _ 4 8 )
2017-08-07 17:52:51 -06:00
faligndata % f6 , % f8 , % f22
2017-08-07 17:52:52 -06:00
EX_ L D _ F P ( L O A D ( l d d , % o 4 + 4 0 , % f10 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 _ p l u s _ 4 0 )
EX_ S T _ F P ( S T O R E ( s t d , % f22 , % o 0 + 2 4 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 _ p l u s _ 4 0 )
2017-08-07 17:52:51 -06:00
faligndata % f8 , % f10 , % f24
2017-08-07 17:52:52 -06:00
EX_ L D _ F P ( L O A D ( l d d , % o 4 + 4 8 , % f12 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 _ p l u s _ 3 2 )
EX_ S T _ F P ( S T O R E ( s t d , % f24 , % o 0 + 3 2 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 _ p l u s _ 3 2 )
2017-08-07 17:52:51 -06:00
faligndata % f10 , % f12 , % f26
2017-08-07 17:52:52 -06:00
EX_ L D _ F P ( L O A D ( l d d , % o 4 + 5 6 , % f14 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 _ p l u s _ 2 4 )
2017-08-07 17:52:51 -06:00
add % o 4 , B L O C K _ S I Z E , % o 4
2017-08-07 17:52:52 -06:00
EX_ S T _ F P ( S T O R E ( s t d , % f26 , % o 0 + 4 0 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 _ p l u s _ 2 4 )
2017-08-07 17:52:51 -06:00
faligndata % f12 , % f14 , % f28
2017-08-07 17:52:52 -06:00
EX_ L D _ F P ( L O A D ( l d d , % o 4 , % f0 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 _ p l u s _ 1 6 )
EX_ S T _ F P ( S T O R E ( s t d , % f28 , % o 0 + 4 8 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 _ p l u s _ 1 6 )
2017-08-07 17:52:51 -06:00
faligndata % f14 , % f0 , % f30
2017-08-07 17:52:52 -06:00
EX_ S T _ F P ( S T O R E ( s t d , % f30 , % o 0 + 5 6 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 _ p l u s _ 8 )
2017-08-07 17:52:51 -06:00
add % o 0 , B L O C K _ S I Z E , % o 0
bgu,p t % x c c , . L u n a l i g n _ l o o p
prefetch [ % o 4 + ( 5 * B L O C K _ S I Z E ) ] , 2 0
ba . L u n a l i g n _ d o n e
nop
.Lunalign_large :
andcc % o 0 , 0 x3 f , % o 3 ! i s d s t 6 4 - b y t e b l o c k a l i g n e d ?
bz % x c c , . L u n a l i g n s r c
sub % o 3 , 6 4 , % o 3 ! % o 3 w i l l b e m u l t i p l e o f 8
neg % o 3 ! b y t e s u n t i l d e s t i s 6 4 b y t e a l i g n e d
sub % o 2 , % o 3 , % o 2 ! u p d a t e c n t w i t h b y t e s t o b e m o v e d
! Move b y t e s a c c o r d i n g t o s o u r c e a l i g n m e n t
andcc % o 1 , 0 x1 , % o 5
bnz % x c c , . L u n a l i g n b y t e ! c h e c k f o r b y t e a l i g n m e n t
nop
andcc % o 1 , 2 , % o 5 ! c h e c k f o r h a l f w o r d a l i g n m e n t
bnz % x c c , . L u n a l i g n h a l f
nop
! Src i s w o r d a l i g n e d
.Lunalignword :
2017-08-07 17:52:52 -06:00
EX_ L D _ F P ( L O A D ( l d , % o 1 , % o 4 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 3 ) ! l o a d 4 b y t e s
2017-08-07 17:52:51 -06:00
add % o 1 , 8 , % o 1 ! i n c r e a s e s r c p t r b y 8
2017-08-07 17:52:52 -06:00
EX_ S T _ F P ( S T O R E ( s t w , % o 4 , % o 0 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 3 ) ! a n d s t o r e 4
2017-08-07 17:52:51 -06:00
subcc % o 3 , 8 , % o 3 ! d e c r e a s e c o u n t b y 8
2017-08-07 17:52:52 -06:00
EX_ L D _ F P ( L O A D ( l d , % o 1 - 4 , % o 4 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 3 _ p l u s _ 4 ) ! l o a d 4
2017-08-07 17:52:51 -06:00
add % o 0 , 8 , % o 0 ! i n c r e a s e d s t p t r b y 8
bnz % x c c , . L u n a l i g n w o r d
2017-08-07 17:52:52 -06:00
EX_ S T _ F P ( S T O R E ( s t w , % o 4 , % o 0 - 4 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 3 _ p l u s _ 4 )
2017-08-07 17:52:51 -06:00
ba . L u n a l i g n s r c
nop
! Src i s h a l f - w o r d a l i g n e d
.Lunalignhalf :
2017-08-07 17:52:52 -06:00
EX_ L D _ F P ( L O A D ( l d u h , % o 1 , % o 4 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 3 ) ! l o a d 2 b y t e s
2017-08-07 17:52:51 -06:00
sllx % o 4 , 3 2 , % o 5 ! s h i f t l e f t
2017-08-07 17:52:52 -06:00
EX_ L D _ F P ( L O A D ( l d u w , % o 1 + 2 , % o 4 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 3 )
2017-08-07 17:52:51 -06:00
or % o 4 , % o 5 , % o 5
sllx % o 5 , 1 6 , % o 5
2017-08-07 17:52:52 -06:00
EX_ L D _ F P ( L O A D ( l d u h , % o 1 + 6 , % o 4 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 3 )
2017-08-07 17:52:51 -06:00
or % o 4 , % o 5 , % o 5
2017-08-07 17:52:52 -06:00
EX_ S T _ F P ( S T O R E ( s t x , % o 5 , % o 0 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 3 )
2017-08-07 17:52:51 -06:00
add % o 1 , 8 , % o 1
subcc % o 3 , 8 , % o 3
bnz % x c c , . L u n a l i g n h a l f
add % o 0 , 8 , % o 0
ba . L u n a l i g n s r c
nop
! Src i s B y t e a l i g n e d
.Lunalignbyte :
sub % o 0 , % o 1 , % o 0 ! s h a r e p o i n t e r a d v a n c e
.Lunalignbyte_loop :
2017-08-07 17:52:52 -06:00
EX_ L D _ F P ( L O A D ( l d u b , % o 1 , % o 4 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 3 )
2017-08-07 17:52:51 -06:00
sllx % o 4 , 5 6 , % o 5
2017-08-07 17:52:52 -06:00
EX_ L D _ F P ( L O A D ( l d u h , % o 1 + 1 , % o 4 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 3 )
2017-08-07 17:52:51 -06:00
sllx % o 4 , 4 0 , % o 4
or % o 4 , % o 5 , % o 5
2017-08-07 17:52:52 -06:00
EX_ L D _ F P ( L O A D ( l d u h , % o 1 + 3 , % o 4 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 3 )
2017-08-07 17:52:51 -06:00
sllx % o 4 , 2 4 , % o 4
or % o 4 , % o 5 , % o 5
2017-08-07 17:52:52 -06:00
EX_ L D _ F P ( L O A D ( l d u h , % o 1 + 5 , % o 4 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 3 )
2017-08-07 17:52:51 -06:00
sllx % o 4 , 8 , % o 4
or % o 4 , % o 5 , % o 5
2017-08-07 17:52:52 -06:00
EX_ L D _ F P ( L O A D ( l d u b , % o 1 + 7 , % o 4 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 3 )
2017-08-07 17:52:51 -06:00
or % o 4 , % o 5 , % o 5
add % o 0 , % o 1 , % o 0
2017-08-07 17:52:52 -06:00
EX_ S T _ F P ( S T O R E ( s t x , % o 5 , % o 0 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 3 )
2017-08-07 17:52:51 -06:00
sub % o 0 , % o 1 , % o 0
subcc % o 3 , 8 , % o 3
bnz % x c c , . L u n a l i g n b y t e _ l o o p
add % o 1 , 8 , % o 1
add % o 0 ,% o 1 , % o 0 ! r e s t o r e p o i n t e r
! Destination i s n o w b l o c k ( 6 4 b y t e a l i g n e d )
.Lunalignsrc :
andn % o 2 , 0 x3 f , % o 5 ! % o 5 i s m u l t i p l e o f b l o c k s i z e
and % o 2 , 0 x3 f , % o 2 ! r e s i d u e b y t e s i n % o 2
add % o 2 , 6 4 , % o 2 ! I n s u r e w e d o n o t l o a d b e y o n d
sub % o 5 , 6 4 , % o 5 ! e n d o f s o u r c e b u f f e r
andn % o 1 , 0 x7 , % o 4 ! % o 4 h a s l o n g w o r d a l i g n e d s r c a d d r e s s
alignaddr % o 1 , % g 0 , % g 0 ! g e n e r a t e % g s r
add % o 1 , % o 5 , % o 1 ! a d v a n c e % o 1 t o a f t e r b l o c k s
2017-08-07 17:52:52 -06:00
EX_ L D _ F P ( L O A D ( l d d , % o 4 , % f14 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 )
2017-08-07 17:52:51 -06:00
add % o 4 , 8 , % o 4
.Lunalign_sloop :
2017-08-07 17:52:52 -06:00
EX_ L D _ F P ( L O A D ( l d d , % o 4 , % f16 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 )
2017-08-07 17:52:51 -06:00
faligndata % f14 , % f16 , % f0
2017-08-07 17:52:52 -06:00
EX_ L D _ F P ( L O A D ( l d d , % o 4 + 8 , % f18 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 )
2017-08-07 17:52:51 -06:00
faligndata % f16 , % f18 , % f2
2017-08-07 17:52:52 -06:00
EX_ L D _ F P ( L O A D ( l d d , % o 4 + 1 6 , % f20 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 )
2017-08-07 17:52:51 -06:00
faligndata % f18 , % f20 , % f4
2017-08-07 17:52:52 -06:00
EX_ S T _ F P ( S T O R E ( s t d , % f0 , % o 0 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 )
2017-08-07 17:52:51 -06:00
subcc % o 5 , 6 4 , % o 5
2017-08-07 17:52:52 -06:00
EX_ L D _ F P ( L O A D ( l d d , % o 4 + 2 4 , % f22 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 _ p l u s _ 5 6 )
2017-08-07 17:52:51 -06:00
faligndata % f20 , % f22 , % f6
2017-08-07 17:52:52 -06:00
EX_ S T _ F P ( S T O R E ( s t d , % f2 , % o 0 + 8 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 _ p l u s _ 5 6 )
EX_ L D _ F P ( L O A D ( l d d , % o 4 + 3 2 , % f24 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 _ p l u s _ 4 8 )
2017-08-07 17:52:51 -06:00
faligndata % f22 , % f24 , % f8
2017-08-07 17:52:52 -06:00
EX_ S T _ F P ( S T O R E ( s t d , % f4 , % o 0 + 1 6 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 _ p l u s _ 4 8 )
EX_ L D _ F P ( L O A D ( l d d , % o 4 + 4 0 , % f26 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 _ p l u s _ 4 0 )
2017-08-07 17:52:51 -06:00
faligndata % f24 , % f26 , % f10
2017-08-07 17:52:52 -06:00
EX_ S T _ F P ( S T O R E ( s t d , % f6 , % o 0 + 2 4 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 _ p l u s _ 4 0 )
EX_ L D _ F P ( L O A D ( l d d , % o 4 + 4 8 , % f28 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 _ p l u s _ 4 0 )
2017-08-07 17:52:51 -06:00
faligndata % f26 , % f28 , % f12
2017-08-07 17:52:52 -06:00
EX_ S T _ F P ( S T O R E ( s t d , % f8 , % o 0 + 3 2 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 _ p l u s _ 4 0 )
2017-08-07 17:52:51 -06:00
add % o 4 , 6 4 , % o 4
2017-08-07 17:52:52 -06:00
EX_ L D _ F P ( L O A D ( l d d , % o 4 - 8 , % f30 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 _ p l u s _ 4 0 )
2017-08-07 17:52:51 -06:00
faligndata % f28 , % f30 , % f14
2017-08-07 17:52:52 -06:00
EX_ S T _ F P ( S T O R E ( s t d , % f10 , % o 0 + 4 0 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 _ p l u s _ 4 0 )
EX_ S T _ F P ( S T O R E ( s t d , % f12 , % o 0 + 4 8 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 _ p l u s _ 4 0 )
2017-08-07 17:52:51 -06:00
add % o 0 , 6 4 , % o 0
2017-08-07 17:52:52 -06:00
EX_ S T _ F P ( S T O R E ( s t d , % f14 , % o 0 - 8 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 _ p l u s _ 4 0 )
2017-08-07 17:52:51 -06:00
fsrc2 % f30 , % f14
bgu,p t % x c c , . L u n a l i g n _ s l o o p
prefetch [ % o 4 + ( 8 * B L O C K _ S I Z E ) ] , 2 0
.Lunalign_done :
! Handle t r a i l i n g b y t e s , 6 4 t o 1 2 7
! Dest l o n g w o r d a l i g n e d , S r c n o t l o n g w o r d a l i g n e d
cmp % o 2 , 1 5
bleu % x c c , . L u n a l i g n _ s h o r t
andn % o 2 , 0 x7 , % o 5 ! % o 5 i s m u l t i p l e o f 8
and % o 2 , 0 x7 , % o 2 ! r e s i d u e b y t e s i n % o 2
add % o 2 , 8 , % o 2
sub % o 5 , 8 , % o 5 ! i n s u r e w e d o n o t l o a d p a s t e n d o f s r c
andn % o 1 , 0 x7 , % o 4 ! % o 4 h a s l o n g w o r d a l i g n e d s r c a d d r e s s
add % o 1 , % o 5 , % o 1 ! a d v a n c e % o 1 t o a f t e r m u l t i p l e o f 8
2017-08-07 17:52:52 -06:00
EX_ L D _ F P ( L O A D ( l d d , % o 4 , % f0 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 ) ! f e t c h p a r t i a l w o r d
2017-08-07 17:52:51 -06:00
.Lunalign_by8 :
2017-08-07 17:52:52 -06:00
EX_ L D _ F P ( L O A D ( l d d , % o 4 + 8 , % f2 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 )
2017-08-07 17:52:51 -06:00
add % o 4 , 8 , % o 4
faligndata % f0 , % f2 , % f16
subcc % o 5 , 8 , % o 5
2017-08-07 17:52:52 -06:00
EX_ S T _ F P ( S T O R E ( s t d , % f16 , % o 0 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 )
2017-08-07 17:52:51 -06:00
fsrc2 % f2 , % f0
bgu,p t % x c c , . L u n a l i g n _ b y 8
add % o 0 , 8 , % o 0
.Lunalign_short :
# ifdef N O N _ U S E R _ C O P Y
VISExitHalfFast
# else
VISExitHalf
# endif
ba . L s m a l l r e s t
nop
/ *
* This i s a s p e c i a l c a s e o f n e s t e d m e m c p y . T h i s c a n h a p p e n w h e n k e r n e l
* calls u n a l i g n e d m e m c p y b a c k t o b a c k w i t h o u t s a v i n g F P r e g i s t e r s . W e n e e d
* traps( c o n t e x t s w i t c h ) t o s a v e / r e s t o r e F P r e g i s t e r s . I f t h e k e r n e l c a l l s
* memcpy w i t h o u t t h i s t r a p s e q u e n c e w e w i l l h i t F P c o r r u p t i o n . L e t ' s u s e
* the n o r m a l i n t e g e r l o a d / s t o r e m e t h o d i n t h i s c a s e .
* /
# ifdef N O N _ U S E R _ C O P Y
.Lmedium_vis_entry_fail_cp :
or % o 0 , % o 1 , % g 2
# endif
.Lmedium_cp :
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 % x c c , . L m e d i u m _ u n a l i g n e d _ c p
nop
.Lmedium_noprefetch_cp :
andncc % o 2 , 0 x20 - 1 , % o 5
be,p n % x c c , 2 f
sub % o 2 , % o 5 , % o 2
2017-08-07 17:52:52 -06:00
1 : EX_ L D ( L O A D ( l d x , % o 1 + 0 x00 , % o 3 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 )
EX_ L D ( L O A D ( l d x , % o 1 + 0 x08 , % g 2 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 )
EX_ L D ( L O A D ( l d x , % o 1 + 0 x10 , % g 7 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 )
EX_ L D ( L O A D ( l d x , % o 1 + 0 x18 , % o 4 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 )
2017-08-07 17:52:51 -06:00
add % o 1 , 0 x20 , % o 1
subcc % o 5 , 0 x20 , % o 5
2017-08-07 17:52:52 -06:00
EX_ S T ( S T O R E ( s t x , % o 3 , % o 0 + 0 x00 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 _ p l u s _ 3 2 )
EX_ S T ( S T O R E ( s t x , % g 2 , % o 0 + 0 x08 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 _ p l u s _ 2 4 )
EX_ S T ( S T O R E ( s t x , % g 7 , % o 0 + 0 x10 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 _ p l u s _ 2 4 )
EX_ S T ( S T O R E ( s t x , % o 4 , % o 0 + 0 x18 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 _ p l u s _ 8 )
2017-08-07 17:52:51 -06:00
bne,p t % x c c , 1 b
add % o 0 , 0 x20 , % o 0
2 : andcc % o 2 , 0 x18 , % o 5
be,p t % x c c , 3 f
sub % o 2 , % o 5 , % o 2
2017-08-07 17:52:52 -06:00
1 : EX_ L D ( L O A D ( l d x , % o 1 + 0 x00 , % o 3 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 )
2017-08-07 17:52:51 -06:00
add % o 1 , 0 x08 , % o 1
add % o 0 , 0 x08 , % o 0
subcc % o 5 , 0 x08 , % o 5
bne,p t % x c c , 1 b
2017-08-07 17:52:52 -06:00
EX_ S T ( S T O R E ( s t x , % o 3 , % o 0 - 0 x08 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 _ p l u s _ 8 )
2017-08-07 17:52:51 -06:00
3 : brz,p t % o 2 , . L e x i t _ c p
cmp % o 2 , 0 x04
bl,p n % x c c , . L t i n y _ c p
nop
2017-08-07 17:52:52 -06:00
EX_ L D ( L O A D ( l d u w , % o 1 + 0 x00 , % o 3 ) , m e m c p y _ r e t l _ o 2 )
2017-08-07 17:52:51 -06:00
add % o 1 , 0 x04 , % o 1
add % o 0 , 0 x04 , % o 0
subcc % o 2 , 0 x04 , % o 2
bne,p n % x c c , . L t i n y _ c p
2017-08-07 17:52:52 -06:00
EX_ S T ( S T O R E ( s t w , % o 3 , % o 0 - 0 x04 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 4 )
2017-08-07 17:52:51 -06:00
ba,a ,p t % x c c , . L e x i t _ c p
.Lmedium_unaligned_cp :
/* First get dest 8 byte aligned. */
sub % g 0 , % o 0 , % o 3
and % o 3 , 0 x7 , % o 3
brz,p t % o 3 , 2 f
sub % o 2 , % o 3 , % o 2
2017-08-07 17:52:52 -06:00
1 : EX_ L D ( L O A D ( l d u b , % o 1 + 0 x00 , % g 2 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ g 1 )
2017-08-07 17:52:51 -06:00
add % o 1 , 1 , % o 1
subcc % o 3 , 1 , % o 3
add % o 0 , 1 , % o 0
bne,p t % x c c , 1 b
2017-08-07 17:52:52 -06:00
EX_ S T ( S T O R E ( s t b , % g 2 , % o 0 - 0 x01 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ g 1 _ p l u s _ 1 )
2017-08-07 17:52:51 -06:00
2 :
and % o 1 , 0 x7 , % o 3
brz,p n % o 3 , . L m e d i u m _ n o p r e f e t c h _ c p
sll % o 3 , 3 , % o 3
mov 6 4 , % g 2
sub % g 2 , % o 3 , % g 2
andn % o 1 , 0 x7 , % o 1
2017-08-07 17:52:52 -06:00
EX_ L D ( L O A D ( l d x , % o 1 + 0 x00 , % o 4 ) , m e m c p y _ r e t l _ o 2 )
2017-08-07 17:52:51 -06:00
sllx % o 4 , % o 3 , % o 4
andn % o 2 , 0 x08 - 1 , % o 5
sub % o 2 , % o 5 , % o 2
2017-08-07 17:52:52 -06:00
1 : EX_ L D ( L O A D ( l d x , % o 1 + 0 x08 , % g 3 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 )
2017-08-07 17:52:51 -06:00
add % o 1 , 0 x08 , % o 1
subcc % o 5 , 0 x08 , % o 5
srlx % g 3 , % g 2 , % g 7
or % g 7 , % o 4 , % g 7
2017-08-07 17:52:52 -06:00
EX_ S T ( S T O R E ( s t x , % g 7 , % o 0 + 0 x00 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 _ p l u s _ 8 )
2017-08-07 17:52:51 -06:00
add % o 0 , 0 x08 , % o 0
bne,p t % x c c , 1 b
sllx % g 3 , % o 3 , % o 4
srl % o 3 , 3 , % o 3
add % o 1 , % o 3 , % o 1
brz,p n % o 2 , . L e x i t _ c p
nop
ba,p t % x c c , . L s m a l l _ u n a l i g n e d _ c p
.Ltiny_cp :
2017-08-07 17:52:52 -06:00
EX_ L D ( L O A D ( l d u b , % o 1 + 0 x00 , % o 3 ) , m e m c p y _ r e t l _ o 2 )
2017-08-07 17:52:51 -06:00
subcc % o 2 , 1 , % o 2
be,p n % x c c , . L e x i t _ c p
2017-08-07 17:52:52 -06:00
EX_ S T ( S T O R E ( s t b , % o 3 , % o 0 + 0 x00 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 1 )
EX_ L D ( L O A D ( l d u b , % o 1 + 0 x01 , % o 3 ) , m e m c p y _ r e t l _ o 2 )
2017-08-07 17:52:51 -06:00
subcc % o 2 , 1 , % o 2
be,p n % x c c , . L e x i t _ c p
2017-08-07 17:52:52 -06:00
EX_ S T ( S T O R E ( s t b , % o 3 , % o 0 + 0 x01 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 1 )
EX_ L D ( L O A D ( l d u b , % o 1 + 0 x02 , % o 3 ) , m e m c p y _ r e t l _ o 2 )
2017-08-07 17:52:51 -06:00
ba,p t % x c c , . L e x i t _ c p
2017-08-07 17:52:52 -06:00
EX_ S T ( S T O R E ( s t b , % o 3 , % o 0 + 0 x02 ) , m e m c p y _ r e t l _ o 2 )
2017-08-07 17:52:51 -06:00
.Lsmall_cp :
andcc % g 2 , 0 x3 , % g 0
bne,p n % x c c , . L s m a l l _ u n a l i g n e d _ c p
andn % o 2 , 0 x4 - 1 , % o 5
sub % o 2 , % o 5 , % o 2
1 :
2017-08-07 17:52:52 -06:00
EX_ L D ( L O A D ( l d u w , % o 1 + 0 x00 , % o 3 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 )
2017-08-07 17:52:51 -06:00
add % o 1 , 0 x04 , % o 1
subcc % o 5 , 0 x04 , % o 5
add % o 0 , 0 x04 , % o 0
bne,p t % x c c , 1 b
2017-08-07 17:52:52 -06:00
EX_ S T ( S T O R E ( s t w , % o 3 , % o 0 - 0 x04 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ o 5 _ p l u s _ 4 )
2017-08-07 17:52:51 -06:00
brz,p t % o 2 , . L e x i t _ c p
nop
ba,a ,p t % x c c , . L t i n y _ c p
.Lsmall_unaligned_cp :
2017-08-07 17:52:52 -06:00
1 : EX_ L D ( L O A D ( l d u b , % o 1 + 0 x00 , % o 3 ) , m e m c p y _ r e t l _ o 2 )
2017-08-07 17:52:51 -06:00
add % o 1 , 1 , % o 1
add % o 0 , 1 , % o 0
subcc % o 2 , 1 , % o 2
bne,p t % x c c , 1 b
2017-08-07 17:52:52 -06:00
EX_ S T ( S T O R E ( s t b , % o 3 , % o 0 - 0 x01 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 1 )
2017-08-07 17:52:51 -06:00
ba,a ,p t % x c c , . L e x i t _ c p
.Lsmallrest :
tst % o 2
bz,p t % x c c , . L s m a l l x
cmp % o 2 , 4
blt,p n % x c c , . L s m a l l l e f t 3
nop
sub % o 2 , 3 , % o 2
.Lsmallnotalign4 :
2017-08-07 17:52:52 -06:00
EX_ L D ( L O A D ( l d u b , % o 1 , % o 3 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 3 ) ! r e a d b y t e
2017-08-07 17:52:51 -06:00
subcc % o 2 , 4 , % o 2 ! r e d u c e c o u n t b y 4
2017-08-07 17:52:52 -06:00
EX_ S T ( S T O R E ( s t b , % o 3 , % o 0 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 7 ) ! w r i t e b y t e & r e p e a t
EX_ L D ( L O A D ( l d u b , % o 1 + 1 , % o 3 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 6 ) ! f o r t o t a l o f 4
2017-08-07 17:52:51 -06:00
add % o 1 , 4 , % o 1 ! a d v a n c e S R C b y 4
2017-08-07 17:52:52 -06:00
EX_ S T ( S T O R E ( s t b , % o 3 , % o 0 + 1 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 6 )
EX_ L D ( L O A D ( l d u b , % o 1 - 2 , % o 3 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 5 )
2017-08-07 17:52:51 -06:00
add % o 0 , 4 , % o 0 ! a d v a n c e D S T b y 4
2017-08-07 17:52:52 -06:00
EX_ S T ( S T O R E ( s t b , % o 3 , % o 0 - 2 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 5 )
EX_ L D ( L O A D ( l d u b , % o 1 - 1 , % o 3 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 4 )
2017-08-07 17:52:51 -06:00
bgu,p t % x c c , . L s m a l l n o t a l i g n 4 ! l o o p t i l 3 o r f e w e r b y t e s r e m a i n
2017-08-07 17:52:52 -06:00
EX_ S T ( S T O R E ( s t b , % o 3 , % o 0 - 1 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 4 )
2017-08-07 17:52:51 -06:00
addcc % o 2 , 3 , % o 2 ! r e s t o r e c o u n t
bz,p t % x c c , . L s m a l l x
.Lsmallleft3 : ! 1 , 2 , or 3 b y t e s r e m a i n
subcc % o 2 , 1 , % o 2
2017-08-07 17:52:52 -06:00
EX_ L D ( L O A D ( l d u b , % o 1 , % o 3 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 1 ) ! l o a d o n e b y t e
2017-08-07 17:52:51 -06:00
bz,p t % x c c , . L s m a l l x
2017-08-07 17:52:52 -06:00
EX_ S T ( S T O R E ( s t b , % o 3 , % o 0 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 1 ) ! s t o r e o n e b y t e
EX_ L D ( L O A D ( l d u b , % o 1 + 1 , % o 3 ) , m e m c p y _ r e t l _ o 2 ) ! l o a d s e c o n d b y t e
2017-08-07 17:52:51 -06:00
subcc % o 2 , 1 , % o 2
bz,p t % x c c , . L s m a l l x
2017-08-07 17:52:52 -06:00
EX_ S T ( S T O R E ( s t b , % o 3 , % o 0 + 1 ) , m e m c p y _ r e t l _ o 2 _ p l u s _ 1 ) ! s t o r e s e c o n d b y t e
EX_ L D ( L O A D ( l d u b , % o 1 + 2 , % o 3 ) , m e m c p y _ r e t l _ o 2 ) ! l o a d t h i r d b y t e
EX_ S T ( S T O R E ( s t b , % o 3 , % o 0 + 2 ) , m e m c p y _ r e t l _ o 2 ) ! s t o r e t h i r d b y t e
2017-08-07 17:52:51 -06:00
.Lsmallx :
retl
mov E X _ R E T V A L ( % g 1 ) , % o 0
.Lsmallfin :
tst % o 2
bnz,p n % x c c , . L s m a l l l e f t 3
nop
retl
mov E X _ R E T V A L ( % g 1 ) , % o 0 ! r e s t o r e % o 0
.Lexit_cp :
retl
mov E X _ R E T V A L ( % g 1 ) , % o 0
.size FUNC_ N A M E , . - F U N C _ N A M E