2006-03-06 03:41:56 +03:00
/ * NGmemcpy. S : N i a g a r a o p t i m i z e d m e m c p y .
*
* Copyright ( C ) 2 0 0 6 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 / a s i . h >
2006-02-11 21:30:41 +03:00
# include < a s m / t h r e a d _ i n f o . h >
2006-03-06 03:41:56 +03:00
# define G L O B A L _ S P A R E % g 7
2006-02-11 21:30:41 +03:00
# define R E S T O R E _ A S I ( T M P ) \
ldub [ % g 6 + T I _ C U R R E N T _ D S ] , T M P ; \
wr T M P , 0 x0 , % a s i ;
2006-03-06 03:41:56 +03:00
# else
# define G L O B A L _ S P A R E % g 5
2006-02-11 21:30:41 +03:00
# define R E S T O R E _ A S I ( T M P ) \
wr % g 0 , A S I _ P N F , % a s i
2006-03-06 03:41:56 +03:00
# endif
# ifndef S T O R E _ A S I
# 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
# 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
# ifndef M E M C P Y _ D E B U G
# 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
# else
# define L O A D ( t y p e ,a d d r ,d e s t ) t y p e ## a [ a d d r ] 0x80 , d e s t
# endif
# endif
# ifndef L O A D _ T W I N
# define L O A D _ T W I N ( a d d r _ r e g ,d e s t 0 ,d e s t 1 ) \
ldda [ a d d r _ r e g ] A S I _ B L K _ I N I T _ Q U A D _ L D D _ P , d e s t 0
# 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
# 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 ] % a s i
# endif
# ifndef F U N C _ N A M E
# define F U N C _ N A M E N G 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 */
srlx % o 2 , 3 1 , % g 2
cmp % g 2 , 0
tne % x c c , 5
PREAMBLE
mov % o 0 , G L O B A L _ S P A R E
cmp % o 2 , 0
be,p n % X C C , 8 5 f
or % o 0 , % o 1 , % o 3
cmp % o 2 , 1 6
blu,a ,p n % X C C , 8 0 f
or % o 3 , % o 2 , % o 3
/ * 2 blocks ( 1 2 8 b y t e s ) i s t h e m i n i m u m w e c a n d o t h e b l o c k
* copy w i t h . W e n e e d t o e n s u r e t h a t w e ' l l i t e r a t e a t l e a s t
* once i n t h e b l o c k c o p y l o o p . A t w o r s t w e ' l l n e e d t o a l i g n
* the d e s t i n a t i o n t o a 6 4 - b y t e b o u n d a r y w h i c h c a n c h e w u p
* to ( 6 4 - 1 ) b y t e s f r o m t h e l e n g t h b e f o r e w e p e r f o r m t h e
* block c o p y l o o p .
* /
cmp % o 2 , ( 2 * 6 4 )
blu,p t % X C C , 7 0 f
andcc % o 3 , 0 x7 , % g 0
/ * % o0 : dst
* % o1 : src
* % o2 : len ( k n o w n t o b e > = 1 2 8 )
*
* The b l o c k c o p y l o o p s w i l l u s e % o 4 / % o 5 ,% g 2 / % g 3 a s
* temporaries w h i l e c o p y i n g t h e d a t a .
* /
LOAD( p r e f e t c h , % o 1 , #o n e _ r e a d )
wr % g 0 , S T O R E _ A S I , % a s i
/* Align destination on 64-byte boundary. */
andcc % o 0 , ( 6 4 - 1 ) , % o 4
be,p t % X C C , 2 f
sub % o 4 , 6 4 , % o 4
sub % g 0 , % o 4 , % o 4 ! b y t e s t o a l i g n d s t
sub % o 2 , % o 4 , % o 2
1 : subcc % o 4 , 1 , % o 4
EX_ L D ( L O A D ( l d u b , % o 1 , % g 1 ) )
EX_ S T ( S T O R E ( s t b , % g 1 , % o 0 ) )
add % o 1 , 1 , % o 1
bne,p t % X C C , 1 b
add % o 0 , 1 , % o 0
/ * If t h e s o u r c e i s o n a 1 6 - b y t e b o u n d a r y w e c a n d o
* the d i r e c t b l o c k c o p y l o o p . I f i t i s 8 - b y t e a l i g n e d
* we c a n d o t h e 1 6 - b y t e l o a d s o f f s e t b y - 8 b y t e s a n d t h e
* init s t o r e s o f f s e t b y o n e r e g i s t e r .
*
* If t h e s o u r c e i s n o t e v e n 8 - b y t e a l i g n e d , w e n e e d t o d o
* shifting a n d m a s k i n g ( b a s i c a l l y i n t e g e r f a l i g n d a t a ) .
*
* The c a r e f u l b i t w i t h i n i t s t o r e s i s t h a t i f w e s t o r e
* to a n y p a r t o f t h e c a c h e l i n e w e h a v e t o s t o r e t h e w h o l e
* cacheline e l s e w e c a n e n d u p w i t h c o r r u p t L 2 c a c h e l i n e
* contents. S i n c e t h e l o o p w o r k s o n 6 4 - b y t e s o f 6 4 - b y t e
* aligned s t o r e d a t a a t a t i m e , t h i s i s e a s y t o e n s u r e .
* /
2 :
andcc % o 1 , ( 1 6 - 1 ) , % o 4
andn % o 2 , ( 6 4 - 1 ) , % g 1 ! b l o c k c o p y l o o p i t e r a t o r
sub % o 2 , % g 1 , % o 2 ! f i n a l s u b - b l o c k c o p y b y t e s
be,p t % X C C , 5 0 f
cmp % o 4 , 8
be,a ,p t % X C C , 1 0 f
sub % o 1 , 0 x8 , % o 1
/* Neither 8-byte nor 16-byte aligned, shift and mask. */
mov % g 1 , % o 4
and % o 1 , 0 x7 , % g 1
sll % g 1 , 3 , % g 1
mov 6 4 , % o 3
andn % o 1 , 0 x7 , % o 1
EX_ L D ( L O A D ( l d x , % o 1 , % g 2 ) )
sub % o 3 , % g 1 , % o 3
sllx % g 2 , % g 1 , % g 2
# define S W I V E L _ O N E _ D W O R D ( S R C , T M P 1 , T M P 2 , P R E _ V A L , P R E _ S H I F T , P O S T _ S H I F T , D S T ) \
EX_ L D ( L O A D ( l d x , S R C , T M P 1 ) ) ; \
srlx T M P 1 , P R E _ S H I F T , T M P 2 ; \
or T M P 2 , P R E _ V A L , T M P 2 ; \
EX_ S T ( S T O R E _ I N I T ( T M P 2 , D S T ) ) ; \
sllx T M P 1 , P O S T _ S H I F T , P R E _ V A L ;
1 : add % o 1 , 0 x8 , % o 1
SWIVEL_ O N E _ D W O R D ( % o 1 , % g 3 , % o 5 , % g 2 , % o 3 , % g 1 , % o 0 + 0 x00 )
add % o 1 , 0 x8 , % o 1
SWIVEL_ O N E _ D W O R D ( % o 1 , % g 3 , % o 5 , % g 2 , % o 3 , % g 1 , % o 0 + 0 x08 )
add % o 1 , 0 x8 , % o 1
SWIVEL_ O N E _ D W O R D ( % o 1 , % g 3 , % o 5 , % g 2 , % o 3 , % g 1 , % o 0 + 0 x10 )
add % o 1 , 0 x8 , % o 1
SWIVEL_ O N E _ D W O R D ( % o 1 , % g 3 , % o 5 , % g 2 , % o 3 , % g 1 , % o 0 + 0 x18 )
add % o 1 , 3 2 , % o 1
LOAD( p r e f e t c h , % o 1 , #o n e _ r e a d )
sub % o 1 , 3 2 - 8 , % o 1
SWIVEL_ O N E _ D W O R D ( % o 1 , % g 3 , % o 5 , % g 2 , % o 3 , % g 1 , % o 0 + 0 x20 )
add % o 1 , 8 , % o 1
SWIVEL_ O N E _ D W O R D ( % o 1 , % g 3 , % o 5 , % g 2 , % o 3 , % g 1 , % o 0 + 0 x28 )
add % o 1 , 8 , % o 1
SWIVEL_ O N E _ D W O R D ( % o 1 , % g 3 , % o 5 , % g 2 , % o 3 , % g 1 , % o 0 + 0 x30 )
add % o 1 , 8 , % o 1
SWIVEL_ O N E _ D W O R D ( % o 1 , % g 3 , % o 5 , % g 2 , % o 3 , % g 1 , % o 0 + 0 x38 )
subcc % o 4 , 6 4 , % o 4
bne,p t % X C C , 1 b
add % o 0 , 6 4 , % o 0
# undef S W I V E L _ O N E _ D W O R D
srl % g 1 , 3 , % g 1
ba,p t % X C C , 6 0 f
add % o 1 , % g 1 , % o 1
10 : / * Destination i s 6 4 - b y t e a l i g n e d , s o u r c e w a s o n l y 8 - b y t e
* aligned b u t i t h a s b e e n s u b t r a c t e d b y 8 a n d w e p e r f o r m
* one t w i n l o a d a h e a d , t h e n a d d 8 b a c k i n t o s o u r c e w h e n
* we f i n i s h t h e l o o p .
* /
EX_ L D ( L O A D _ T W I N ( % o 1 , % o 4 , % o 5 ) )
1 : add % o 1 , 1 6 , % o 1
EX_ L D ( L O A D _ T W I N ( % o 1 , % g 2 , % g 3 ) )
add % o 1 , 1 6 + 3 2 , % o 1
LOAD( p r e f e t c h , % o 1 , #o n e _ r e a d )
sub % o 1 , 3 2 , % o 1
EX_ S T ( S T O R E _ I N I T ( % o 5 , % o 0 + 0 x00 ) ) ! i n i t i a l i z e s c a c h e l i n e
EX_ S T ( S T O R E _ I N I T ( % g 2 , % o 0 + 0 x08 ) )
EX_ L D ( L O A D _ T W I N ( % o 1 , % o 4 , % o 5 ) )
add % o 1 , 1 6 , % o 1
EX_ S T ( S T O R E _ I N I T ( % g 3 , % o 0 + 0 x10 ) )
EX_ S T ( S T O R E _ I N I T ( % o 4 , % o 0 + 0 x18 ) )
EX_ L D ( L O A D _ T W I N ( % o 1 , % g 2 , % g 3 ) )
add % o 1 , 1 6 , % o 1
EX_ S T ( S T O R E _ I N I T ( % o 5 , % o 0 + 0 x20 ) )
EX_ S T ( S T O R E _ I N I T ( % g 2 , % o 0 + 0 x28 ) )
EX_ L D ( L O A D _ T W I N ( % o 1 , % o 4 , % o 5 ) )
EX_ S T ( S T O R E _ I N I T ( % g 3 , % o 0 + 0 x30 ) )
EX_ S T ( S T O R E _ I N I T ( % o 4 , % o 0 + 0 x38 ) )
subcc % g 1 , 6 4 , % g 1
bne,p t % X C C , 1 b
add % o 0 , 6 4 , % o 0
ba,p t % X C C , 6 0 f
add % o 1 , 0 x8 , % o 1
50 : / * Destination i s 6 4 - b y t e a l i g n e d , a n d s o u r c e i s 1 6 - b y t e
* aligned.
* /
1 : EX_ L D ( L O A D _ T W I N ( % o 1 , % o 4 , % o 5 ) )
add % o 1 , 1 6 , % o 1
EX_ L D ( L O A D _ T W I N ( % o 1 , % g 2 , % g 3 ) )
add % o 1 , 1 6 + 3 2 , % o 1
LOAD( p r e f e t c h , % o 1 , #o n e _ r e a d )
sub % o 1 , 3 2 , % o 1
EX_ S T ( S T O R E _ I N I T ( % o 4 , % o 0 + 0 x00 ) ) ! i n i t i a l i z e s c a c h e l i n e
EX_ S T ( S T O R E _ I N I T ( % o 5 , % o 0 + 0 x08 ) )
EX_ L D ( L O A D _ T W I N ( % o 1 , % o 4 , % o 5 ) )
add % o 1 , 1 6 , % o 1
EX_ S T ( S T O R E _ I N I T ( % g 2 , % o 0 + 0 x10 ) )
EX_ S T ( S T O R E _ I N I T ( % g 3 , % o 0 + 0 x18 ) )
EX_ L D ( L O A D _ T W I N ( % o 1 , % g 2 , % g 3 ) )
add % o 1 , 1 6 , % o 1
EX_ S T ( S T O R E _ I N I T ( % o 4 , % o 0 + 0 x20 ) )
EX_ S T ( S T O R E _ I N I T ( % o 5 , % o 0 + 0 x28 ) )
EX_ S T ( S T O R E _ I N I T ( % g 2 , % o 0 + 0 x30 ) )
EX_ S T ( S T O R E _ I N I T ( % g 3 , % o 0 + 0 x38 ) )
subcc % g 1 , 6 4 , % g 1
bne,p t % X C C , 1 b
add % o 0 , 6 4 , % o 0
/* fall through */
60 :
2007-03-19 23:27:33 +03:00
membar #S y n c
2006-03-06 03:41:56 +03:00
/ * % o2 c o n t a i n s a n y f i n a l b y t e s s t i l l n e e d e d t o b e c o p i e d
* over. I f a n y t h i n g i s l e f t , w e c o p y i t o n e b y t e a t a t i m e .
* /
2006-02-11 21:30:41 +03:00
RESTORE_ A S I ( % o 3 )
2006-03-06 03:41:56 +03:00
brz,p t % o 2 , 8 5 f
sub % o 0 , % o 1 , % o 3
ba,a ,p t % X C C , 9 0 f
.align 64
70 : /* 16 < len <= 64 */
bne,p n % X C C , 7 5 f
sub % o 0 , % o 1 , % o 3
72 :
andn % o 2 , 0 x f , % o 4
and % o 2 , 0 x f , % o 2
1 : subcc % o 4 , 0 x10 , % o 4
EX_ L D ( L O A D ( l d x , % o 1 , % o 5 ) )
add % o 1 , 0 x08 , % o 1
EX_ L D ( L O A D ( l d x , % o 1 , % g 1 ) )
sub % o 1 , 0 x08 , % o 1
EX_ S T ( S T O R E ( s t x , % o 5 , % o 1 + % o 3 ) )
add % o 1 , 0 x8 , % o 1
EX_ S T ( S T O R E ( s t x , % g 1 , % o 1 + % o 3 ) )
bgu,p t % X C C , 1 b
add % o 1 , 0 x8 , % o 1
73 : andcc % o 2 , 0 x8 , % g 0
be,p t % X C C , 1 f
nop
sub % o 2 , 0 x8 , % o 2
EX_ L D ( L O A D ( l d x , % o 1 , % o 5 ) )
EX_ S T ( S T O R E ( s t x , % o 5 , % o 1 + % o 3 ) )
add % o 1 , 0 x8 , % o 1
1 : andcc % o 2 , 0 x4 , % g 0
be,p t % X C C , 1 f
nop
sub % o 2 , 0 x4 , % o 2
EX_ L D ( L O A D ( l d u w , % o 1 , % o 5 ) )
EX_ S T ( S T O R E ( s t w , % o 5 , % o 1 + % o 3 ) )
add % o 1 , 0 x4 , % o 1
1 : cmp % o 2 , 0
be,p t % X C C , 8 5 f
nop
ba,p t % x c c , 9 0 f
nop
75 :
andcc % o 0 , 0 x7 , % g 1
sub % g 1 , 0 x8 , % g 1
be,p n % i c c , 2 f
sub % g 0 , % g 1 , % g 1
sub % o 2 , % g 1 , % o 2
1 : subcc % g 1 , 1 , % g 1
EX_ L D ( L O A D ( l d u b , % o 1 , % o 5 ) )
EX_ S T ( S T O R E ( s t b , % o 5 , % o 1 + % o 3 ) )
bgu,p t % i c c , 1 b
add % o 1 , 1 , % o 1
2 : add % o 1 , % o 3 , % o 0
andcc % o 1 , 0 x7 , % g 1
bne,p t % i c c , 8 f
sll % g 1 , 3 , % g 1
cmp % o 2 , 1 6
bgeu,p t % i c c , 7 2 b
nop
ba,a ,p t % x c c , 7 3 b
8 : mov 6 4 , % o 3
andn % o 1 , 0 x7 , % o 1
EX_ L D ( L O A D ( l d x , % o 1 , % g 2 ) )
sub % o 3 , % g 1 , % o 3
andn % o 2 , 0 x7 , % o 4
sllx % g 2 , % g 1 , % g 2
1 : add % o 1 , 0 x8 , % o 1
EX_ L D ( L O A D ( l d x , % o 1 , % g 3 ) )
subcc % o 4 , 0 x8 , % o 4
srlx % g 3 , % o 3 , % o 5
or % o 5 , % g 2 , % o 5
EX_ S T ( S T O R E ( s t x , % o 5 , % o 0 ) )
add % o 0 , 0 x8 , % o 0
bgu,p t % i c c , 1 b
sllx % g 3 , % g 1 , % g 2
srl % g 1 , 3 , % g 1
andcc % o 2 , 0 x7 , % o 2
be,p n % i c c , 8 5 f
add % o 1 , % g 1 , % o 1
ba,p t % x c c , 9 0 f
sub % o 0 , % o 1 , % o 3
.align 64
80 : /* 0 < len <= 16 */
andcc % o 3 , 0 x3 , % g 0
bne,p n % X C C , 9 0 f
sub % o 0 , % o 1 , % o 3
1 :
subcc % o 2 , 4 , % o 2
EX_ L D ( L O A D ( l d u w , % o 1 , % g 1 ) )
EX_ S T ( S T O R E ( s t w , % g 1 , % o 1 + % o 3 ) )
bgu,p t % X C C , 1 b
add % o 1 , 4 , % o 1
85 : retl
mov E X _ R E T V A L ( G L O B A L _ S P A R E ) , % o 0
.align 32
90 :
subcc % o 2 , 1 , % o 2
EX_ L D ( L O A D ( l d u b , % o 1 , % g 1 ) )
EX_ S T ( S T O R E ( s t b , % g 1 , % o 1 + % o 3 ) )
bgu,p t % X C C , 9 0 b
add % o 1 , 1 , % o 1
retl
mov E X _ R E T V A L ( G L O B A L _ S P A R E ) , % o 0
.size FUNC_ N A M E , . - F U N C _ N A M E