2005-04-17 02:20:36 +04:00
/ *
* arch/ a l p h a / l i b / e v6 - m e m c h r . S
*
* 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>
*
* Finds c h a r a c t e r s i n a m e m o r y a r e a . O p t i m i z e d f o r t h e A l p h a :
*
* - memory a c c e s s e d a s a l i g n e d q u a d w o r d s o n l y
* - uses c m p b g e t o c o m p a r e 8 b y t e s i n p a r a l l e l
* - does b i n a r y s e a r c h t o f i n d 0 b y t e i n l a s t
* quadword ( H A K M E M n e e d e d 1 2 i n s t r u c t i o n s t o
* do t h i s i n s t e a d o f t h e 9 i n s t r u c t i o n s t h a t
* binary s e a r c h n e e d s ) .
*
* For c o r r e c t n e s s c o n s i d e r t h a t :
*
* - only m i n i m u m n u m b e r o f q u a d w o r d s m a y b e a c c e s s e d
* - the t h i r d a r g u m e n t i s a n u n s i g n e d l o n g
*
* 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
* Try n o t t o c h a n g e t h e a c t u a l a l g o r i t h m i f p o s s i b l e f o r c o n s i s t e n c y .
* /
.set noreorder
.set noat
.align 4
.globl memchr
.ent memchr
memchr :
.frame $ 3 0 , 0 , $ 2 6 , 0
.prologue 0
# Hack - - i f s o m e o n e p a s s e s i n ( s i z e _ t ) - 1 , h o p i n g t o j u s t
# search t i l t h e e n d o f t h e a d d r e s s s p a c e , w e w i l l o v e r f l o w
# below w h e n w e f i n d t h e a d d r e s s o f t h e l a s t b y t e . G i v e n
# that w e w i l l n e v e r h a v e a 5 6 - b i t a d d r e s s s p a c e , c r o p p i n g
# the l e n g t h i s t h e e a s i e s t w a y t o a v o i d t r o u b l e .
zap $ 1 8 , 0 x80 , $ 5 # U : B o u n d l e n g t h
beq $ 1 8 , $ n o t _ f o u n d # U :
ldq_ u $ 1 , 0 ( $ 1 6 ) # L : l o a d f i r s t q u a d w o r d L a t e n c y = 3
and $ 1 7 , 0 x f f , $ 1 7 # E : L L U U : 00000000000000 c h
insbl $ 1 7 , 1 , $ 2 # U : 000000000000 c h00
cmpult $ 1 8 , 9 , $ 4 # E : s m a l l ( < 1 q u a d ) s t r i n g ?
or $ 2 , $ 1 7 , $ 1 7 # E : 000000000000 c h c h
lda $ 3 , - 1 ( $ 3 1 ) # E : U L L U
sll $ 1 7 , 1 6 , $ 2 # U : 00000000 c h c h00 0 0
addq $ 1 6 , $ 5 , $ 5 # E : M a x s e a r c h a d d r e s s
or $ 2 , $ 1 7 , $ 1 7 # E : 00000000 c h c h c h c h
sll $ 1 7 , 3 2 , $ 2 # U : U L L U : c h c h c h c h 00000000
or $ 2 , $ 1 7 , $ 1 7 # E : c h c h c h c h c h c h c h c h
extql $ 1 , $ 1 6 , $ 7 # U : $ 7 i s u p p e r b i t s
beq $ 4 , $ f i r s t _ q u a d # U :
ldq_ u $ 6 , - 1 ( $ 5 ) # L : L U U L : e i g h t o r l e s s b y t e s t o s e a r c h L a t e n c y = 3
extqh $ 6 , $ 1 6 , $ 6 # U : 2 c y c l e s t a l l f o r $ 6
mov $ 1 6 , $ 0 # E :
nop # E :
or $ 7 , $ 6 , $ 1 # E : L U L U $ 1 = q u a d w o r d s t a r t i n g a t $ 1 6
# Deal w i t h t h e c a s e w h e r e a t m o s t 8 b y t e s r e m a i n t o b e s e a r c h e d
# in $ 1 . E . g . :
# $ 1 8 = 6
# $ 1 = ? ? ? ? c6 c5 c4 c3 c2 c1
$ last_quad :
negq $ 1 8 , $ 6 # E :
xor $ 1 7 , $ 1 , $ 1 # E :
srl $ 3 , $ 6 , $ 6 # U : $ 6 = m a s k o f $ 1 8 b i t s s e t
cmpbge $ 3 1 , $ 1 , $ 2 # E : L U L U
nop
nop
and $ 2 , $ 6 , $ 2 # E :
beq $ 2 , $ n o t _ f o u n d # U : U L U L
$ found_it :
2006-03-26 13:39:01 +04:00
# ifdef C O N F I G _ A L P H A _ E V 6 7
2005-04-17 02:20:36 +04:00
/ *
* Since w e a r e g u a r a n t e e d t o h a v e s e t o n e o f t h e b i t s , w e d o n ' t
* have t o w o r r y a b o u t c o m i n g b a c k w i t h a 0 x40 o u t o f c t t z . . .
* /
cttz $ 2 , $ 3 # U 0 :
addq $ 0 , $ 3 , $ 0 # E : A l l d o n e
nop # E :
ret # L 0 : L U L U
# else
/ *
* Slow a n d c l u n k y . I t c a n p r o b a b l y b e i m p r o v e d .
* An e x e r c i s e l e f t f o r o t h e r s .
* /
negq $ 2 , $ 3 # E :
and $ 2 , $ 3 , $ 2 # E :
and $ 2 , 0 x0 f , $ 1 # E :
addq $ 0 , 4 , $ 3 # E :
cmoveq $ 1 , $ 3 , $ 0 # E : L a t e n c y 2 , e x t r a m a p c y c l e
nop # E : k e e p w i t h c m o v
and $ 2 , 0 x33 , $ 1 # E :
addq $ 0 , 2 , $ 3 # E : U L U L : 2 c y c l e s t a l l o n $ 0
cmoveq $ 1 , $ 3 , $ 0 # E : L a t e n c y 2 , e x t r a m a p c y c l e
nop # E : k e e p w i t h c m o v
and $ 2 , 0 x55 , $ 1 # E :
addq $ 0 , 1 , $ 3 # E : U L U L : 2 c y c l e s t a l l o n $ 0
cmoveq $ 1 , $ 3 , $ 0 # E : L a t e n c y 2 , e x t r a m a p c y c l e
nop
nop
ret # L 0 : L U L U
# endif
# Deal w i t h t h e c a s e w h e r e $ 1 8 > 8 b y t e s r e m a i n t o b e
# searched. $ 1 6 m a y n o t b e a l i g n e d .
.align 4
$ first_quad :
andnot $ 1 6 , 0 x7 , $ 0 # E :
insqh $ 3 , $ 1 6 , $ 2 # U : $ 2 = 0 0 0 0 f f f f f f f f f f f f ( $ 1 6 < 0 : 2 > f f )
xor $ 1 , $ 1 7 , $ 1 # E :
or $ 1 , $ 2 , $ 1 # E : U L U L $ 1 = = = = =ffffffffffff
cmpbge $ 3 1 , $ 1 , $ 2 # E :
bne $ 2 , $ f o u n d _ i t # U :
# At l e a s t o n e b y t e l e f t t o p r o c e s s .
ldq $ 1 , 8 ( $ 0 ) # L :
subq $ 5 , 1 , $ 1 8 # E : U L U L
addq $ 0 , 8 , $ 0 # E :
# Make $ 1 8 p o i n t t o l a s t q u a d t o b e a c c e s s e d ( t h e
# last q u a d m a y o r m a y n o t b e p a r t i a l ) .
andnot $ 1 8 , 0 x7 , $ 1 8 # E :
cmpult $ 0 , $ 1 8 , $ 2 # E :
beq $ 2 , $ f i n a l # U : U L U L
# At l e a s t t w o q u a d s r e m a i n t o b e a c c e s s e d .
subq $ 1 8 , $ 0 , $ 4 # E : $ 4 < - n r q u a d s t o b e p r o c e s s e d
and $ 4 , 8 , $ 4 # E : o d d n u m b e r o f q u a d s ?
bne $ 4 , $ o d d _ q u a d _ c o u n t # U :
# At l e a s t t h r e e q u a d s r e m a i n t o b e a c c e s s e d
mov $ 1 , $ 4 # E : L U L U : m o v e p r e f e t c h e d v a l u e t o c o r r e c t r e g
.align 4
$ unrolled_loop :
ldq $ 1 , 8 ( $ 0 ) # L : p r e f e t c h $ 1
xor $ 1 7 , $ 4 , $ 2 # E :
cmpbge $ 3 1 , $ 2 , $ 2 # E :
bne $ 2 , $ f o u n d _ i t # U : U L U L
addq $ 0 , 8 , $ 0 # E :
nop # E :
nop # E :
nop # E :
$ odd_quad_count :
xor $ 1 7 , $ 1 , $ 2 # E :
ldq $ 4 , 8 ( $ 0 ) # L : p r e f e t c h $ 4
cmpbge $ 3 1 , $ 2 , $ 2 # E :
addq $ 0 , 8 , $ 6 # E :
bne $ 2 , $ f o u n d _ i t # U :
cmpult $ 6 , $ 1 8 , $ 6 # E :
addq $ 0 , 8 , $ 0 # E :
nop # E :
bne $ 6 , $ u n r o l l e d _ l o o p # U :
mov $ 4 , $ 1 # E : m o v e p r e f e t c h e d v a l u e i n t o $ 1
nop # E :
nop # E :
$ final : subq $ 5 , $ 0 , $ 1 8 # E : $ 18 < - n u m b e r o f b y t e s l e f t t o d o
nop # E :
nop # E :
bne $ 1 8 , $ l a s t _ q u a d # U :
$ not_found :
mov $ 3 1 , $ 0 # E :
nop # E :
nop # E :
ret # L 0 :
.end memchr