2005-04-17 02:20:36 +04:00
/ *
* arch/ a l p h a / l i b / e v6 - m e m s e t . S
*
* This i s a n e f f i c i e n t ( a n d r e l a t i v e l y s m a l l ) i m p l e m e n t a t i o n o f t h e C l i b r a r y
* " memset( ) " f u n c t i o n f o r t h e 2 1 2 6 4 i m p l e m e n t a t i o n o f A l p h a .
*
* 2 1 2 6 4 version c o n t r i b u t e d b y R i c k G o r t o n < r i c k . g o r t o n @alpha-processor.com>
*
* Much o f t h e i n f o r m a t i o n a b o u t 2 1 2 6 4 s c h e d u l i n g / c o d i n g c o m e s f r o m :
* Compiler W r i t e r ' s G u i d e f o r t h e A l p h a 2 1 2 6 4
* abbreviated a s ' C W G ' i n o t h e r c o m m e n t s h e r e
* ftp. d i g i t a l . c o m / p u b / D i g i t a l / i n f o / s e m i c o n d u c t o r / l i t e r a t u r e / d s c - l i b r a r y . h t m l
* Scheduling n o t a t i o n :
* E - e i t h e r c l u s t e r
* U - u p p e r s u b c l u s t e r ; U0 - subcluster U0; U1 - subcluster U1
* L - l o w e r s u b c l u s t e r ; L0 - subcluster L0; L1 - subcluster L1
* The a l g o r i t h m f o r t h e l e a d i n g a n d t r a i l i n g q u a d w o r d s r e m a i n s t h e s a m e ,
* however t h e l o o p h a s b e e n u n r o l l e d t o e n a b l e b e t t e r m e m o r y t h r o u g h p u t ,
* and t h e c o d e h a s b e e n r e p l i c a t e d f o r e a c h o f t h e e n t r y p o i n t s : _ _ m e m s e t
* and _ _ m e m s e t w t o p e r m i t b e t t e r s c h e d u l i n g t o e l i m i n a t e t h e s t a l l i n g
* encountered d u r i n g t h e m a s k r e p l i c a t i o n .
* A f u t u r e e n h a n c e m e n t m i g h t b e t o p u t i n a b y t e s t o r e l o o p f o r r e a l l y
* small ( s a y < 3 2 b y t e s ) m e m s e t ( ) s . W h e t h e r o r n o t t h a t c h a n g e w o u l d b e
* a w i n i n t h e k e r n e l w o u l d d e p e n d u p o n t h e c o n t e x t u a l u s a g e .
* WARNING : Maintaining t h i s i s g o i n g t o b e m o r e w o r k t h a n t h e a b o v e v e r s i o n ,
* as f i x e s w i l l n e e d t o b e m a d e i n m u l t i p l e p l a c e s . T h e p e r f o r m a n c e g a i n
* is w o r t h i t .
* /
2016-01-11 17:51:29 +03:00
# include < a s m / e x p o r t . h >
2005-04-17 02:20:36 +04:00
.set noat
.set noreorder
.text
2013-07-11 20:47:45 +04:00
.globl memset
2005-04-17 02:20:36 +04:00
.globl __memset
2013-07-11 20:47:45 +04:00
.globl ___memset
2005-04-17 02:20:36 +04:00
.globl __memsetw
.globl __constant_c_memset
2013-07-11 20:47:45 +04:00
.ent ___memset
2005-04-17 02:20:36 +04:00
.align 5
2013-07-11 20:47:45 +04:00
___memset :
2005-04-17 02:20:36 +04:00
.frame $ 3 0 , 0 , $ 2 6 , 0
.prologue 0
/ *
* Serious s t a l l i n g h a p p e n s . T h e o n l y w a y t o m i t i g a t e t h i s i s t o
* undertake a m a j o r r e - w r i t e t o i n t e r l e a v e t h e c o n s t a n t m a t e r i a l i z a t i o n
* with o t h e r p a r t s o f t h e f a l l - t h r o u g h c o d e . T h i s i s i m p o r t a n t , e v e n
* though i t m a k e s m a i n t e n a n c e t o u g h e r .
* Do t h i s l a t e r .
* /
and $ 1 7 ,2 5 5 ,$ 1 # E : 00000000000000 c h
insbl $ 1 7 ,1 ,$ 2 # U : 000000000000 c h00
bis $ 1 6 ,$ 1 6 ,$ 0 # E : r e t u r n v a l u e
ble $ 1 8 ,e n d _ b # U : z e r o l e n g t h r e q u e s t e d ?
addq $ 1 8 ,$ 1 6 ,$ 6 # E : m a x a d d r e s s t o w r i t e t o
bis $ 1 ,$ 2 ,$ 1 7 # E : 000000000000 c h c h
insbl $ 1 ,2 ,$ 3 # U : 0000000000 c h00 0 0
insbl $ 1 ,3 ,$ 4 # U : 00000000 c h00 0 0 0 0
or $ 3 ,$ 4 ,$ 3 # E : 00000000 c h c h00 0 0
inswl $ 1 7 ,4 ,$ 5 # U : 0000 c h c h00 0 0 0 0 0 0
xor $ 1 6 ,$ 6 ,$ 1 # E : w i l l c o m p l e t e w r i t e b e w i t h i n o n e q u a d w o r d ?
inswl $ 1 7 ,6 ,$ 2 # U : c h c h 000000000000
or $ 1 7 ,$ 3 ,$ 1 7 # E : 00000000 c h c h c h c h
or $ 2 ,$ 5 ,$ 2 # E : c h c h c h c h 00000000
bic $ 1 ,7 ,$ 1 # E : f i t w i t h i n a s i n g l e q u a d w o r d ?
and $ 1 6 ,7 ,$ 3 # E : T a r g e t a d d r m i s a l i g n m e n t
or $ 1 7 ,$ 2 ,$ 1 7 # E : c h c h c h c h c h c h c h c h
beq $ 1 ,w i t h i n _ q u a d _ b # U :
nop # E :
beq $ 3 ,a l i g n e d _ b # U : t a r g e t i s 0 m o d8
/ *
* Target a d d r e s s i s m i s a l i g n e d , a n d w o n ' t f i t w i t h i n a q u a d w o r d
* /
ldq_ u $ 4 ,0 ( $ 1 6 ) # L : F e t c h f i r s t p a r t i a l
bis $ 1 6 ,$ 1 6 ,$ 5 # E : S a v e t h e a d d r e s s
insql $ 1 7 ,$ 1 6 ,$ 2 # U : I n s e r t n e w b y t e s
subq $ 3 ,8 ,$ 3 # E : I n v e r t ( f o r a d d r e s s i n g u s e s )
addq $ 1 8 ,$ 3 ,$ 1 8 # E : $ 18 i s n e w c o u n t ( $ 3 i s n e g a t i v e )
mskql $ 4 ,$ 1 6 ,$ 4 # U : c l e a r r e l e v a n t p a r t s o f t h e q u a d
subq $ 1 6 ,$ 3 ,$ 1 6 # E : $ 16 i s n e w a l i g n e d d e s t i n a t i o n
bis $ 2 ,$ 4 ,$ 1 # E : F i n a l b y t e s
nop
stq_ u $ 1 ,0 ( $ 5 ) # L : S t o r e r e s u l t
nop
nop
.align 4
aligned_b :
/ *
* We a r e n o w g u a r a n t e e d t o b e q u a d a l i g n e d , w i t h a t l e a s t
* one p a r t i a l q u a d t o w r i t e .
* /
sra $ 1 8 ,3 ,$ 3 # U : N u m b e r o f r e m a i n i n g q u a d s t o w r i t e
and $ 1 8 ,7 ,$ 1 8 # E : N u m b e r o f t r a i l i n g b y t e s t o w r i t e
bis $ 1 6 ,$ 1 6 ,$ 5 # E : S a v e d e s t a d d r e s s
beq $ 3 ,n o _ q u a d _ b # U : t a i l s t u f f o n l y
/ *
* it' s w o r t h t h e e f f o r t t o u n r o l l t h i s a n d u s e w h64 i f p o s s i b l e
* Lifted a b u n c h o f c o d e f r o m c l e a r _ u s e r . S
* At t h i s p o i n t , e n t r y v a l u e s a r e :
* $ 1 6 Current d e s t i n a t i o n a d d r e s s
* $ 5 A c o p y o f $ 1 6
* $ 6 The m a x q u a d w o r d a d d r e s s t o w r i t e t o
* $ 1 8 Number t r a i l e r b y t e s
* $ 3 Number q u a d s t o w r i t e
* /
and $ 1 6 , 0 x3 f , $ 2 # E : F o r w a r d w o r k ( o n l y u s e f u l f o r u n r o l l e d l o o p )
subq $ 3 , 1 6 , $ 4 # E : O n l y t r y t o u n r o l l i f > 128 b y t e s
subq $ 2 , 0 x40 , $ 1 # E : b i a s c o u n t e r ( a l i g n i n g s t u f f 0 m o d64 )
blt $ 4 , l o o p _ b # U :
/ *
* We k n o w w e ' v e g o t a t l e a s t 1 6 q u a d s , m i n i m u m o f o n e t r i p
* through u n r o l l e d l o o p . D o a q u a d a t a t i m e t o g e t u s 0 m o d64
* aligned.
* /
nop # E :
nop # E :
nop # E :
beq $ 1 , $ b i g a l i g n _ b # U :
$ alignmod64_b :
stq $ 1 7 , 0 ( $ 5 ) # L :
subq $ 3 , 1 , $ 3 # E : F o r c o n s i s t e n c y l a t e r
addq $ 1 , 8 , $ 1 # E : I n c r e m e n t t o w a r d s z e r o f o r a l i g n m e n t
addq $ 5 , 8 , $ 4 # E : I n i t i a l w h 64 a d d r e s s ( f i l l e r i n s t r u c t i o n )
nop
nop
addq $ 5 , 8 , $ 5 # E : I n c a d d r e s s
blt $ 1 , $ a l i g n m o d64 _ b # U :
$ bigalign_b :
/ *
* $ 3 - number q u a d s l e f t t o g o
* $ 5 - target a d d r e s s ( a l i g n e d 0 m o d64 )
* $ 1 7 - mask o f s t u f f t o s t o r e
* Scratch r e g i s t e r s a v a i l a b l e : $ 7 , $ 2 , $ 4 , $ 1
* we k n o w t h a t w e ' l l b e t a k i n g a m i n i m u m o f o n e t r i p t h r o u g h
* CWG S e c t i o n 3 . 7 . 6 : d o n o t e x p e c t a s u s t a i n e d s t o r e r a t e o f > 1 / c y c l e
* Assumes t h e w h64 n e e d s t o b e f o r 2 t r i p s t h r o u g h t h e l o o p i n t h e f u t u r e
* The w h64 i s i s s u e d o n f o r t h e s t a r t i n g d e s t i n a t i o n a d d r e s s f o r t r i p + 2
* through t h e l o o p , a n d i f t h e r e a r e l e s s t h a n t w o t r i p s l e f t , t h e t a r g e t
* address w i l l b e f o r t h e c u r r e n t t r i p .
* /
$ do_wh64_b :
wh6 4 ( $ 4 ) # L 1 : m e m o r y s u b s y s t e m w r i t e h i n t
subq $ 3 , 2 4 , $ 2 # E : F o r d e t e r m i n i n g f u t u r e w h 64 a d d r e s s e s
stq $ 1 7 , 0 ( $ 5 ) # L :
nop # E :
addq $ 5 , 1 2 8 , $ 4 # E : s p e c u l a t i v e t a r g e t o f n e x t w h 64
stq $ 1 7 , 8 ( $ 5 ) # L :
stq $ 1 7 , 1 6 ( $ 5 ) # L :
addq $ 5 , 6 4 , $ 7 # E : F a l l b a c k a d d r e s s f o r w h 64 ( = = n e x t t r i p a d d r )
stq $ 1 7 , 2 4 ( $ 5 ) # L :
stq $ 1 7 , 3 2 ( $ 5 ) # L :
cmovlt $ 2 , $ 7 , $ 4 # E : L a t e n c y 2 , e x t r a m a p p i n g c y c l e
nop
stq $ 1 7 , 4 0 ( $ 5 ) # L :
stq $ 1 7 , 4 8 ( $ 5 ) # L :
subq $ 3 , 1 6 , $ 2 # E : R e p e a t t h e l o o p a t l e a s t o n c e m o r e ?
nop
stq $ 1 7 , 5 6 ( $ 5 ) # L :
addq $ 5 , 6 4 , $ 5 # E :
subq $ 3 , 8 , $ 3 # E :
bge $ 2 , $ d o _ w h64 _ b # U :
nop
nop
nop
beq $ 3 , n o _ q u a d _ b # U : M i g h t h a v e f i n i s h e d a l r e a d y
.align 4
/ *
* Simple l o o p f o r t r a i l i n g q u a d w o r d s , o r f o r s m a l l a m o u n t s
* of d a t a ( w h e r e w e c a n ' t u s e a n u n r o l l e d l o o p a n d w h64 )
* /
loop_b :
stq $ 1 7 ,0 ( $ 5 ) # L :
subq $ 3 ,1 ,$ 3 # E : D e c r e m e n t n u m b e r q u a d s l e f t
addq $ 5 ,8 ,$ 5 # E : I n c a d d r e s s
bne $ 3 ,l o o p _ b # U : m o r e ?
no_quad_b :
/ *
* Write 0 . . 7 t r a i l i n g b y t e s .
* /
nop # E :
beq $ 1 8 ,e n d _ b # U : A l l d o n e ?
ldq $ 7 ,0 ( $ 5 ) # L :
mskqh $ 7 ,$ 6 ,$ 2 # U : M a s k f i n a l q u a d
insqh $ 1 7 ,$ 6 ,$ 4 # U : N e w b i t s
bis $ 2 ,$ 4 ,$ 1 # E : P u t i t a l l t o g e t h e r
stq $ 1 ,0 ( $ 5 ) # L : A n d b a c k t o m e m o r y
ret $ 3 1 ,( $ 2 6 ) ,1 # L 0 :
within_quad_b :
ldq_ u $ 1 ,0 ( $ 1 6 ) # L :
insql $ 1 7 ,$ 1 6 ,$ 2 # U : N e w b i t s
mskql $ 1 ,$ 1 6 ,$ 4 # U : C l e a r o l d
bis $ 2 ,$ 4 ,$ 2 # E : N e w r e s u l t
mskql $ 2 ,$ 6 ,$ 4 # U :
mskqh $ 1 ,$ 6 ,$ 2 # U :
bis $ 2 ,$ 4 ,$ 1 # E :
stq_ u $ 1 ,0 ( $ 1 6 ) # L :
end_b :
nop
nop
nop
ret $ 3 1 ,( $ 2 6 ) ,1 # L 0 :
2013-07-11 20:47:45 +04:00
.end ___memset
2016-01-11 17:51:29 +03:00
EXPORT_ S Y M B O L ( _ _ _ m e m s e t )
2005-04-17 02:20:36 +04:00
/ *
* This i s t h e o r i g i n a l b o d y o f c o d e , p r i o r t o r e p l i c a t i o n a n d
* rescheduling. L e a v e i t h e r e , a s t h e r e m a y b e c a l l s t o t h i s
* entry p o i n t .
* /
.align 4
.ent __constant_c_memset
__constant_c_memset :
.frame $ 3 0 , 0 , $ 2 6 , 0
.prologue 0
addq $ 1 8 ,$ 1 6 ,$ 6 # E : m a x a d d r e s s t o w r i t e t o
bis $ 1 6 ,$ 1 6 ,$ 0 # E : r e t u r n v a l u e
xor $ 1 6 ,$ 6 ,$ 1 # E : w i l l c o m p l e t e w r i t e b e w i t h i n o n e q u a d w o r d ?
ble $ 1 8 ,e n d # U : z e r o l e n g t h r e q u e s t e d ?
bic $ 1 ,7 ,$ 1 # E : f i t w i t h i n a s i n g l e q u a d w o r d
beq $ 1 ,w i t h i n _ o n e _ q u a d # U :
and $ 1 6 ,7 ,$ 3 # E : T a r g e t a d d r m i s a l i g n m e n t
beq $ 3 ,a l i g n e d # U : t a r g e t i s 0 m o d8
/ *
* Target a d d r e s s i s m i s a l i g n e d , a n d w o n ' t f i t w i t h i n a q u a d w o r d
* /
ldq_ u $ 4 ,0 ( $ 1 6 ) # L : F e t c h f i r s t p a r t i a l
bis $ 1 6 ,$ 1 6 ,$ 5 # E : S a v e t h e a d d r e s s
insql $ 1 7 ,$ 1 6 ,$ 2 # U : I n s e r t n e w b y t e s
subq $ 3 ,8 ,$ 3 # E : I n v e r t ( f o r a d d r e s s i n g u s e s )
addq $ 1 8 ,$ 3 ,$ 1 8 # E : $ 18 i s n e w c o u n t ( $ 3 i s n e g a t i v e )
mskql $ 4 ,$ 1 6 ,$ 4 # U : c l e a r r e l e v a n t p a r t s o f t h e q u a d
subq $ 1 6 ,$ 3 ,$ 1 6 # E : $ 16 i s n e w a l i g n e d d e s t i n a t i o n
bis $ 2 ,$ 4 ,$ 1 # E : F i n a l b y t e s
nop
stq_ u $ 1 ,0 ( $ 5 ) # L : S t o r e r e s u l t
nop
nop
.align 4
aligned :
/ *
* We a r e n o w g u a r a n t e e d t o b e q u a d a l i g n e d , w i t h a t l e a s t
* one p a r t i a l q u a d t o w r i t e .
* /
sra $ 1 8 ,3 ,$ 3 # U : N u m b e r o f r e m a i n i n g q u a d s t o w r i t e
and $ 1 8 ,7 ,$ 1 8 # E : N u m b e r o f t r a i l i n g b y t e s t o w r i t e
bis $ 1 6 ,$ 1 6 ,$ 5 # E : S a v e d e s t a d d r e s s
beq $ 3 ,n o _ q u a d # U : t a i l s t u f f o n l y
/ *
* it' s w o r t h t h e e f f o r t t o u n r o l l t h i s a n d u s e w h64 i f p o s s i b l e
* Lifted a b u n c h o f c o d e f r o m c l e a r _ u s e r . S
* At t h i s p o i n t , e n t r y v a l u e s a r e :
* $ 1 6 Current d e s t i n a t i o n a d d r e s s
* $ 5 A c o p y o f $ 1 6
* $ 6 The m a x q u a d w o r d a d d r e s s t o w r i t e t o
* $ 1 8 Number t r a i l e r b y t e s
* $ 3 Number q u a d s t o w r i t e
* /
and $ 1 6 , 0 x3 f , $ 2 # E : F o r w a r d w o r k ( o n l y u s e f u l f o r u n r o l l e d l o o p )
subq $ 3 , 1 6 , $ 4 # E : O n l y t r y t o u n r o l l i f > 128 b y t e s
subq $ 2 , 0 x40 , $ 1 # E : b i a s c o u n t e r ( a l i g n i n g s t u f f 0 m o d64 )
blt $ 4 , l o o p # U :
/ *
* We k n o w w e ' v e g o t a t l e a s t 1 6 q u a d s , m i n i m u m o f o n e t r i p
* through u n r o l l e d l o o p . D o a q u a d a t a t i m e t o g e t u s 0 m o d64
* aligned.
* /
nop # E :
nop # E :
nop # E :
beq $ 1 , $ b i g a l i g n # U :
$ alignmod64 :
stq $ 1 7 , 0 ( $ 5 ) # L :
subq $ 3 , 1 , $ 3 # E : F o r c o n s i s t e n c y l a t e r
addq $ 1 , 8 , $ 1 # E : I n c r e m e n t t o w a r d s z e r o f o r a l i g n m e n t
addq $ 5 , 8 , $ 4 # E : I n i t i a l w h 64 a d d r e s s ( f i l l e r i n s t r u c t i o n )
nop
nop
addq $ 5 , 8 , $ 5 # E : I n c a d d r e s s
blt $ 1 , $ a l i g n m o d64 # U :
$ bigalign :
/ *
* $ 3 - number q u a d s l e f t t o g o
* $ 5 - target a d d r e s s ( a l i g n e d 0 m o d64 )
* $ 1 7 - mask o f s t u f f t o s t o r e
* Scratch r e g i s t e r s a v a i l a b l e : $ 7 , $ 2 , $ 4 , $ 1
* we k n o w t h a t w e ' l l b e t a k i n g a m i n i m u m o f o n e t r i p t h r o u g h
* CWG S e c t i o n 3 . 7 . 6 : d o n o t e x p e c t a s u s t a i n e d s t o r e r a t e o f > 1 / c y c l e
* Assumes t h e w h64 n e e d s t o b e f o r 2 t r i p s t h r o u g h t h e l o o p i n t h e f u t u r e
* The w h64 i s i s s u e d o n f o r t h e s t a r t i n g d e s t i n a t i o n a d d r e s s f o r t r i p + 2
* through t h e l o o p , a n d i f t h e r e a r e l e s s t h a n t w o t r i p s l e f t , t h e t a r g e t
* address w i l l b e f o r t h e c u r r e n t t r i p .
* /
$ do_wh64 :
wh6 4 ( $ 4 ) # L 1 : m e m o r y s u b s y s t e m w r i t e h i n t
subq $ 3 , 2 4 , $ 2 # E : F o r d e t e r m i n i n g f u t u r e w h 64 a d d r e s s e s
stq $ 1 7 , 0 ( $ 5 ) # L :
nop # E :
addq $ 5 , 1 2 8 , $ 4 # E : s p e c u l a t i v e t a r g e t o f n e x t w h 64
stq $ 1 7 , 8 ( $ 5 ) # L :
stq $ 1 7 , 1 6 ( $ 5 ) # L :
addq $ 5 , 6 4 , $ 7 # E : F a l l b a c k a d d r e s s f o r w h 64 ( = = n e x t t r i p a d d r )
stq $ 1 7 , 2 4 ( $ 5 ) # L :
stq $ 1 7 , 3 2 ( $ 5 ) # L :
cmovlt $ 2 , $ 7 , $ 4 # E : L a t e n c y 2 , e x t r a m a p p i n g c y c l e
nop
stq $ 1 7 , 4 0 ( $ 5 ) # L :
stq $ 1 7 , 4 8 ( $ 5 ) # L :
subq $ 3 , 1 6 , $ 2 # E : R e p e a t t h e l o o p a t l e a s t o n c e m o r e ?
nop
stq $ 1 7 , 5 6 ( $ 5 ) # L :
addq $ 5 , 6 4 , $ 5 # E :
subq $ 3 , 8 , $ 3 # E :
bge $ 2 , $ d o _ w h64 # U :
nop
nop
nop
beq $ 3 , n o _ q u a d # U : M i g h t h a v e f i n i s h e d a l r e a d y
.align 4
/ *
* Simple l o o p f o r t r a i l i n g q u a d w o r d s , o r f o r s m a l l a m o u n t s
* of d a t a ( w h e r e w e c a n ' t u s e a n u n r o l l e d l o o p a n d w h64 )
* /
loop :
stq $ 1 7 ,0 ( $ 5 ) # L :
subq $ 3 ,1 ,$ 3 # E : D e c r e m e n t n u m b e r q u a d s l e f t
addq $ 5 ,8 ,$ 5 # E : I n c a d d r e s s
bne $ 3 ,l o o p # U : m o r e ?
no_quad :
/ *
* Write 0 . . 7 t r a i l i n g b y t e s .
* /
nop # E :
beq $ 1 8 ,e n d # U : A l l d o n e ?
ldq $ 7 ,0 ( $ 5 ) # L :
mskqh $ 7 ,$ 6 ,$ 2 # U : M a s k f i n a l q u a d
insqh $ 1 7 ,$ 6 ,$ 4 # U : N e w b i t s
bis $ 2 ,$ 4 ,$ 1 # E : P u t i t a l l t o g e t h e r
stq $ 1 ,0 ( $ 5 ) # L : A n d b a c k t o m e m o r y
ret $ 3 1 ,( $ 2 6 ) ,1 # L 0 :
within_one_quad :
ldq_ u $ 1 ,0 ( $ 1 6 ) # L :
insql $ 1 7 ,$ 1 6 ,$ 2 # U : N e w b i t s
mskql $ 1 ,$ 1 6 ,$ 4 # U : C l e a r o l d
bis $ 2 ,$ 4 ,$ 2 # E : N e w r e s u l t
mskql $ 2 ,$ 6 ,$ 4 # U :
mskqh $ 1 ,$ 6 ,$ 2 # U :
bis $ 2 ,$ 4 ,$ 1 # E :
stq_ u $ 1 ,0 ( $ 1 6 ) # L :
end :
nop
nop
nop
ret $ 3 1 ,( $ 2 6 ) ,1 # L 0 :
.end __constant_c_memset
2016-01-11 17:51:29 +03:00
EXPORT_ S Y M B O L ( _ _ c o n s t a n t _ c _ m e m s e t )
2005-04-17 02:20:36 +04:00
/ *
* This i s a r e p l i c a n t o f t h e _ _ c o n s t a n t _ c _ m e m s e t c o d e , r e s c h e d u l e d
* to m a s k s t a l l s . N o t e t h a t e n t r y p o i n t n a m e s a l s o h a d t o c h a n g e
* /
.align 5
.ent __memsetw
__memsetw :
.frame $ 3 0 , 0 , $ 2 6 , 0
.prologue 0
inswl $ 1 7 ,0 ,$ 5 # U : 000000000000 c1 c2
inswl $ 1 7 ,2 ,$ 2 # U : 00000000 c1 c20 0 0 0
bis $ 1 6 ,$ 1 6 ,$ 0 # E : r e t u r n v a l u e
addq $ 1 8 ,$ 1 6 ,$ 6 # E : m a x a d d r e s s t o w r i t e t o
ble $ 1 8 , e n d _ w # U : z e r o l e n g t h r e q u e s t e d ?
inswl $ 1 7 ,4 ,$ 3 # U : 0000 c1 c20 0 0 0 0 0 0 0
inswl $ 1 7 ,6 ,$ 4 # U : c 1 c20 0 0 0 0 0 0 0 0 0 0 0
xor $ 1 6 ,$ 6 ,$ 1 # E : w i l l c o m p l e t e w r i t e b e w i t h i n o n e q u a d w o r d ?
or $ 2 ,$ 5 ,$ 2 # E : 00000000 c1 c2 c1 c2
or $ 3 ,$ 4 ,$ 1 7 # E : c 1 c2 c1 c20 0 0 0 0 0 0 0
bic $ 1 ,7 ,$ 1 # E : f i t w i t h i n a s i n g l e q u a d w o r d
and $ 1 6 ,7 ,$ 3 # E : T a r g e t a d d r m i s a l i g n m e n t
or $ 1 7 ,$ 2 ,$ 1 7 # E : c 1 c2 c1 c2 c1 c2 c1 c2
beq $ 1 ,w i t h i n _ q u a d _ w # U :
nop
beq $ 3 ,a l i g n e d _ w # U : t a r g e t i s 0 m o d8
/ *
* Target a d d r e s s i s m i s a l i g n e d , a n d w o n ' t f i t w i t h i n a q u a d w o r d
* /
ldq_ u $ 4 ,0 ( $ 1 6 ) # L : F e t c h f i r s t p a r t i a l
bis $ 1 6 ,$ 1 6 ,$ 5 # E : S a v e t h e a d d r e s s
insql $ 1 7 ,$ 1 6 ,$ 2 # U : I n s e r t n e w b y t e s
subq $ 3 ,8 ,$ 3 # E : I n v e r t ( f o r a d d r e s s i n g u s e s )
addq $ 1 8 ,$ 3 ,$ 1 8 # E : $ 18 i s n e w c o u n t ( $ 3 i s n e g a t i v e )
mskql $ 4 ,$ 1 6 ,$ 4 # U : c l e a r r e l e v a n t p a r t s o f t h e q u a d
subq $ 1 6 ,$ 3 ,$ 1 6 # E : $ 16 i s n e w a l i g n e d d e s t i n a t i o n
bis $ 2 ,$ 4 ,$ 1 # E : F i n a l b y t e s
nop
stq_ u $ 1 ,0 ( $ 5 ) # L : S t o r e r e s u l t
nop
nop
.align 4
aligned_w :
/ *
* We a r e n o w g u a r a n t e e d t o b e q u a d a l i g n e d , w i t h a t l e a s t
* one p a r t i a l q u a d t o w r i t e .
* /
sra $ 1 8 ,3 ,$ 3 # U : N u m b e r o f r e m a i n i n g q u a d s t o w r i t e
and $ 1 8 ,7 ,$ 1 8 # E : N u m b e r o f t r a i l i n g b y t e s t o w r i t e
bis $ 1 6 ,$ 1 6 ,$ 5 # E : S a v e d e s t a d d r e s s
beq $ 3 ,n o _ q u a d _ w # U : t a i l s t u f f o n l y
/ *
* it' s w o r t h t h e e f f o r t t o u n r o l l t h i s a n d u s e w h64 i f p o s s i b l e
* Lifted a b u n c h o f c o d e f r o m c l e a r _ u s e r . S
* At t h i s p o i n t , e n t r y v a l u e s a r e :
* $ 1 6 Current d e s t i n a t i o n a d d r e s s
* $ 5 A c o p y o f $ 1 6
* $ 6 The m a x q u a d w o r d a d d r e s s t o w r i t e t o
* $ 1 8 Number t r a i l e r b y t e s
* $ 3 Number q u a d s t o w r i t e
* /
and $ 1 6 , 0 x3 f , $ 2 # E : F o r w a r d w o r k ( o n l y u s e f u l f o r u n r o l l e d l o o p )
subq $ 3 , 1 6 , $ 4 # E : O n l y t r y t o u n r o l l i f > 128 b y t e s
subq $ 2 , 0 x40 , $ 1 # E : b i a s c o u n t e r ( a l i g n i n g s t u f f 0 m o d64 )
blt $ 4 , l o o p _ w # U :
/ *
* We k n o w w e ' v e g o t a t l e a s t 1 6 q u a d s , m i n i m u m o f o n e t r i p
* through u n r o l l e d l o o p . D o a q u a d a t a t i m e t o g e t u s 0 m o d64
* aligned.
* /
nop # E :
nop # E :
nop # E :
beq $ 1 , $ b i g a l i g n _ w # U :
$ alignmod64_w :
stq $ 1 7 , 0 ( $ 5 ) # L :
subq $ 3 , 1 , $ 3 # E : F o r c o n s i s t e n c y l a t e r
addq $ 1 , 8 , $ 1 # E : I n c r e m e n t t o w a r d s z e r o f o r a l i g n m e n t
addq $ 5 , 8 , $ 4 # E : I n i t i a l w h 64 a d d r e s s ( f i l l e r i n s t r u c t i o n )
nop
nop
addq $ 5 , 8 , $ 5 # E : I n c a d d r e s s
blt $ 1 , $ a l i g n m o d64 _ w # U :
$ bigalign_w :
/ *
* $ 3 - number q u a d s l e f t t o g o
* $ 5 - target a d d r e s s ( a l i g n e d 0 m o d64 )
* $ 1 7 - mask o f s t u f f t o s t o r e
* Scratch r e g i s t e r s a v a i l a b l e : $ 7 , $ 2 , $ 4 , $ 1
* we k n o w t h a t w e ' l l b e t a k i n g a m i n i m u m o f o n e t r i p t h r o u g h
* CWG S e c t i o n 3 . 7 . 6 : d o n o t e x p e c t a s u s t a i n e d s t o r e r a t e o f > 1 / c y c l e
* Assumes t h e w h64 n e e d s t o b e f o r 2 t r i p s t h r o u g h t h e l o o p i n t h e f u t u r e
* The w h64 i s i s s u e d o n f o r t h e s t a r t i n g d e s t i n a t i o n a d d r e s s f o r t r i p + 2
* through t h e l o o p , a n d i f t h e r e a r e l e s s t h a n t w o t r i p s l e f t , t h e t a r g e t
* address w i l l b e f o r t h e c u r r e n t t r i p .
* /
$ do_wh64_w :
wh6 4 ( $ 4 ) # L 1 : m e m o r y s u b s y s t e m w r i t e h i n t
subq $ 3 , 2 4 , $ 2 # E : F o r d e t e r m i n i n g f u t u r e w h 64 a d d r e s s e s
stq $ 1 7 , 0 ( $ 5 ) # L :
nop # E :
addq $ 5 , 1 2 8 , $ 4 # E : s p e c u l a t i v e t a r g e t o f n e x t w h 64
stq $ 1 7 , 8 ( $ 5 ) # L :
stq $ 1 7 , 1 6 ( $ 5 ) # L :
addq $ 5 , 6 4 , $ 7 # E : F a l l b a c k a d d r e s s f o r w h 64 ( = = n e x t t r i p a d d r )
stq $ 1 7 , 2 4 ( $ 5 ) # L :
stq $ 1 7 , 3 2 ( $ 5 ) # L :
cmovlt $ 2 , $ 7 , $ 4 # E : L a t e n c y 2 , e x t r a m a p p i n g c y c l e
nop
stq $ 1 7 , 4 0 ( $ 5 ) # L :
stq $ 1 7 , 4 8 ( $ 5 ) # L :
subq $ 3 , 1 6 , $ 2 # E : R e p e a t t h e l o o p a t l e a s t o n c e m o r e ?
nop
stq $ 1 7 , 5 6 ( $ 5 ) # L :
addq $ 5 , 6 4 , $ 5 # E :
subq $ 3 , 8 , $ 3 # E :
bge $ 2 , $ d o _ w h64 _ w # U :
nop
nop
nop
beq $ 3 , n o _ q u a d _ w # U : M i g h t h a v e f i n i s h e d a l r e a d y
.align 4
/ *
* Simple l o o p f o r t r a i l i n g q u a d w o r d s , o r f o r s m a l l a m o u n t s
* of d a t a ( w h e r e w e c a n ' t u s e a n u n r o l l e d l o o p a n d w h64 )
* /
loop_w :
stq $ 1 7 ,0 ( $ 5 ) # L :
subq $ 3 ,1 ,$ 3 # E : D e c r e m e n t n u m b e r q u a d s l e f t
addq $ 5 ,8 ,$ 5 # E : I n c a d d r e s s
bne $ 3 ,l o o p _ w # U : m o r e ?
no_quad_w :
/ *
* Write 0 . . 7 t r a i l i n g b y t e s .
* /
nop # E :
beq $ 1 8 ,e n d _ w # U : A l l d o n e ?
ldq $ 7 ,0 ( $ 5 ) # L :
mskqh $ 7 ,$ 6 ,$ 2 # U : M a s k f i n a l q u a d
insqh $ 1 7 ,$ 6 ,$ 4 # U : N e w b i t s
bis $ 2 ,$ 4 ,$ 1 # E : P u t i t a l l t o g e t h e r
stq $ 1 ,0 ( $ 5 ) # L : A n d b a c k t o m e m o r y
ret $ 3 1 ,( $ 2 6 ) ,1 # L 0 :
within_quad_w :
ldq_ u $ 1 ,0 ( $ 1 6 ) # L :
insql $ 1 7 ,$ 1 6 ,$ 2 # U : N e w b i t s
mskql $ 1 ,$ 1 6 ,$ 4 # U : C l e a r o l d
bis $ 2 ,$ 4 ,$ 2 # E : N e w r e s u l t
mskql $ 2 ,$ 6 ,$ 4 # U :
mskqh $ 1 ,$ 6 ,$ 2 # U :
bis $ 2 ,$ 4 ,$ 1 # E :
stq_ u $ 1 ,0 ( $ 1 6 ) # L :
end_w :
nop
nop
nop
ret $ 3 1 ,( $ 2 6 ) ,1 # L 0 :
.end __memsetw
2016-01-11 17:51:29 +03:00
EXPORT_ S Y M B O L ( _ _ m e m s e t w )
2005-04-17 02:20:36 +04:00
2013-07-11 20:47:45 +04:00
memset = _ _ _ m e m s e t
_ _ memset = _ _ _ m e m s e t
2016-01-11 17:51:29 +03:00
EXPORT_ S Y M B O L ( m e m s e t )
EXPORT_ S Y M B O L ( _ _ m e m s e t )