2005-04-16 15:20:36 -07:00
/ *
* arch/ a l p h a / l i b / s t r n c a t . 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)
*
* Append n o m o r e t h a n C O U N T c h a r a c t e r s f r o m t h e n u l l - t e r m i n a t e d s t r i n g S R C
* to t h e n u l l - t e r m i n a t e d s t r i n g D S T . A l w a y s n u l l - t e r m i n a t e t h e n e w D S T .
*
* This d i f f e r s s l i g h t l y f r o m t h e s e m a n t i c s i n l i b c i n t h a t w e n e v e r w r i t e
* past c o u n t , w h e r e a s l i b c m a y w r i t e t o c o u n t + 1 . T h i s f o l l o w s t h e g e n e r i c
* implementation i n l i b / s t r i n g . c a n d i s , I M H O , m o r e s e n s i b l e .
* /
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
.text
.align 3
.globl strncat
.ent strncat
strncat :
.frame $ 3 0 , 0 , $ 2 6
.prologue 0
mov $ 1 6 , $ 0 # s e t u p r e t u r n v a l u e
beq $ 1 8 , $ z e r o c o u n t
/* Find the end of the string. */
ldq_ u $ 1 , 0 ( $ 1 6 ) # l o a d f i r s t q u a d w o r d ( $ 16 m a y b e m i s a l i g n e d )
lda $ 2 , - 1 ( $ 3 1 )
insqh $ 2 , $ 1 6 , $ 2
andnot $ 1 6 , 7 , $ 1 6
or $ 2 , $ 1 , $ 1
cmpbge $ 3 1 , $ 1 , $ 2 # b i t s s e t i f f b y t e = = 0
bne $ 2 , $ f o u n d
$ loop : ldq $ 1 , 8 ( $ 1 6 )
addq $ 1 6 , 8 , $ 1 6
cmpbge $ 3 1 , $ 1 , $ 2
beq $ 2 , $ l o o p
$ found : negq $ 2 , $ 3 # c l e a r a l l b u t l e a s t s e t b i t
and $ 2 , $ 3 , $ 2
and $ 2 , 0 x f0 , $ 3 # b i n a r y s e a r c h f o r t h a t s e t b i t
and $ 2 , 0 x c c , $ 4
and $ 2 , 0 x a a , $ 5
cmovne $ 3 , 4 , $ 3
cmovne $ 4 , 2 , $ 4
cmovne $ 5 , 1 , $ 5
addq $ 3 , $ 4 , $ 3
addq $ 1 6 , $ 5 , $ 1 6
addq $ 1 6 , $ 3 , $ 1 6
/* Now do the append. */
bsr $ 2 3 , _ _ s t x n c p y
/* Worry about the null termination. */
zapnot $ 1 , $ 2 7 , $ 2 # w a s l a s t b y t e a n u l l ?
bne $ 2 , 0 f
ret
0 : cmplt $ 2 7 , $ 2 4 , $ 2 # d i d w e f i l l t h e b u f f e r c o m p l e t e l y ?
or $ 2 , $ 1 8 , $ 2
bne $ 2 , 2 f
and $ 2 4 , 0 x80 , $ 2 # n o z e r o n e x t b y t e
bne $ 2 , 1 f
/* Here there are bytes left in the current word. Clear one. */
addq $ 2 4 , $ 2 4 , $ 2 4 # e n d - o f - c o u n t b i t < < = 1
2 : zap $ 1 , $ 2 4 , $ 1
stq_ u $ 1 , 0 ( $ 1 6 )
ret
1 : /* Here we must read the next DST word and clear the first byte. */
ldq_ u $ 1 , 8 ( $ 1 6 )
zap $ 1 , 1 , $ 1
stq_ u $ 1 , 8 ( $ 1 6 )
$ zerocount :
ret
.end strncat
2016-01-11 09:51:29 -05:00
EXPORT_ S Y M B O L ( s t r n c a t )