2005-04-16 15:20:36 -07:00
/ *
* arch/ a l p h a / l i b / s t r r c h r . S
* Contributed b y R i c h a r d H e n d e r s o n ( r t h @tamu.edu)
*
* Return t h e a d d r e s s o f t h e l a s t o c c u r r e n c e o f a g i v e n c h a r a c t e r
* within a n u l l - t e r m i n a t e d s t r i n g , o r n u l l i f i t i s n o t f o u n d .
* /
2016-01-11 09:51:29 -05:00
# include < a s m / e x p o r t . h >
2005-04-16 15:20:36 -07:00
# include < a s m / r e g d e f . h >
.set noreorder
.set noat
.align 3
.ent strrchr
.globl strrchr
strrchr :
.frame sp, 0 , r a
.prologue 0
zapnot a1 , 1 , a1 # e 0 : z e r o e x t e n d o u r t e s t c h a r a c t e r
mov z e r o , t 6 # . . e 1 : t 6 i s l a s t m a t c h a l i g n e d a d d r
sll a1 , 8 , t 5 # e 0 : r e p l i c a t e o u r t e s t c h a r a c t e r
mov z e r o , t 8 # . . e 1 : t 8 i s l a s t m a t c h b y t e c o m p a r e m a s k
or t 5 , a1 , a1 # e 0 :
ldq_ u t 0 , 0 ( a0 ) # . . e 1 : l o a d f i r s t q u a d w o r d
sll a1 , 1 6 , t 5 # e 0 :
andnot a0 , 7 , v0 # . . e 1 : a l i g n s o u r c e a d d r
or t 5 , a1 , a1 # e 0 :
lda t 4 , - 1 # . . e 1 : b u i l d g a r b a g e m a s k
sll a1 , 3 2 , t 5 # e 0 :
cmpbge z e r o , t 0 , t 1 # . . e 1 : b i t s s e t i f f b y t e = = z e r o
mskqh t 4 , a0 , t 4 # e 0 :
or t 5 , a1 , a1 # . . e 1 : c h a r a c t e r r e p l i c a t i o n c o m p l e t e
xor t 0 , a1 , t 2 # e 0 : m a k e b y t e s = = c z e r o
cmpbge z e r o , t 4 , t 4 # . . e 1 : b i t s s e t i f f b y t e i s g a r b a g e
cmpbge z e r o , t 2 , t 3 # e 0 : b i t s s e t i f f b y t e = = c
andnot t 1 , t 4 , t 1 # . . e 1 : c l e a r g a r b a g e f r o m n u l l t e s t
andnot t 3 , t 4 , t 3 # e 0 : c l e a r g a r b a g e f r o m c h a r t e s t
bne t 1 , $ e o s # . . e 1 : d i d w e a l r e a d y h i t t h e t e r m i n a t o r ?
/* Character search main loop */
$ loop :
ldq t 0 , 8 ( v0 ) # e 0 : l o a d n e x t q u a d w o r d
cmovne t 3 , v0 , t 6 # . . e 1 : s a v e p r e v i o u s c o m p a r i s o n s m a t c h
cmovne t 3 , t 3 , t 8 # e 0 :
addq v0 , 8 , v0 # . . e 1 :
xor t 0 , a1 , t 2 # e 0 :
cmpbge z e r o , t 0 , t 1 # . . e 1 : b i t s s e t i f f b y t e = = z e r o
cmpbge z e r o , t 2 , t 3 # e 0 : b i t s s e t i f f b y t e = = c
beq t 1 , $ l o o p # . . e 1 : i f w e h a v n t s e e n a n u l l , l o o p
/* Mask out character matches after terminator */
$ eos :
negq t 1 , t 4 # e 0 : i s o l a t e f i r s t n u l l b y t e m a t c h
and t 1 , t 4 , t 4 # e 1 :
2011-03-30 22:57:33 -03:00
subq t 4 , 1 , t 5 # e 0 : b u i l d a m a s k o f t h e b y t e s u p t o . . .
2005-04-16 15:20:36 -07:00
or t 4 , t 5 , t 4 # e 1 : . . . a n d i n c l u d i n g t h e n u l l
and t 3 , t 4 , t 3 # e 0 : m a s k o u t c h a r m a t c h e s a f t e r n u l l
cmovne t 3 , t 3 , t 8 # . . e 1 : s a v e i t , i f m a t c h f o u n d
cmovne t 3 , v0 , t 6 # e 0 :
/* Locate the address of the last matched character */
/ * Retain t h e e a r l y e x i t f o r t h e e v4 - - t h e e v5 m i s p r e d i c t p e n a l t y
is 5 c y c l e s - - t h e s a m e a s j u s t f a l l i n g t h r o u g h . * /
beq t 8 , $ r e t n u l l # . . e 1 :
and t 8 , 0 x f0 , t 2 # e 0 : b i n a r y s e a r c h f o r t h e h i g h b i t s e t
cmovne t 2 , t 2 , t 8 # . . e 1 ( z d b )
cmovne t 2 , 4 , t 2 # e 0 :
and t 8 , 0 x c c , t 1 # . . e 1 :
cmovne t 1 , t 1 , t 8 # e 0 :
cmovne t 1 , 2 , t 1 # . . e 1 :
and t 8 , 0 x a a , t 0 # e 0 :
cmovne t 0 , 1 , t 0 # . . e 1 ( z d b )
addq t 2 , t 1 , t 1 # e 0 :
addq t 6 , t 0 , v0 # . . e 1 : a d d o u r a l i g n e d b a s e p t r t o t h e m i x
addq v0 , t 1 , v0 # e 0 :
ret # . . e 1 :
$ retnull :
mov z e r o , v0 # e 0 :
ret # . . e 1 :
.end strrchr
2016-01-11 09:51:29 -05:00
EXPORT_ S Y M B O L ( s t r r c h r )