2005-04-17 02:20:36 +04:00
/ *
* arch/ a l p h a / l i b / s t r n c p y . 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)
*
* Copy n o m o r e t h a n C O U N T b y t e s o f t h e n u l l - t e r m i n a t e d s t r i n g f r o m
* SRC t o D S T . I f S R C d o e s n o t c o v e r a l l o f C O U N T , t h e b a l a n c e i s
* zeroed.
*
* Or, r a t h e r , i f t h e k e r n e l c a r e d a b o u t t h a t w e i r d A N S I q u i r k . T h i s
* version h a s c r o p p e d t h a t b i t o ' n a s t i n e s s a s w e l l a s a s s u m i n g t h a t
* _ _ stxncpy i s i n r a n g e o f a b r a n c h .
* /
.set noat
.set noreorder
.text
.align 4
.globl strncpy
.ent strncpy
strncpy :
.frame $ 3 0 , 0 , $ 2 6
.prologue 0
mov $ 1 6 , $ 0 # s e t r e t u r n v a l u e n o w
beq $ 1 8 , $ z e r o l e n
unop
bsr $ 2 3 , _ _ s t x n c p y # d o t h e w o r k o f t h e c o p y
unop
bne $ 1 8 , $ m u l t i w o r d # d o w e h a v e f u l l w o r d s l e f t ?
subq $ 2 4 , 1 , $ 3 # n o p e
subq $ 2 7 , 1 , $ 4
or $ 3 , $ 2 4 , $ 3 # c l e a r t h e b i t s b e t w e e n t h e l a s t
or $ 4 , $ 2 7 , $ 4 # w r i t t e n b y t e a n d t h e l a s t b y t e i n C O U N T
2007-12-18 03:19:48 +03:00
andnot $ 3 , $ 4 , $ 4
2005-04-17 02:20:36 +04:00
zap $ 1 , $ 4 , $ 1
stq_ u $ 1 , 0 ( $ 1 6 )
ret
.align 4
$ multiword :
2006-04-25 13:45:19 +04:00
subq $ 2 7 , 1 , $ 2 # c l e a r t h e f i n a l b i t s i n t h e p r e v w o r d
or $ 2 , $ 2 7 , $ 2
2005-04-17 02:20:36 +04:00
zapnot $ 1 , $ 2 , $ 1
subq $ 1 8 , 1 , $ 1 8
stq_ u $ 1 , 0 ( $ 1 6 )
addq $ 1 6 , 8 , $ 1 6
unop
beq $ 1 8 , 1 f
nop
unop
nop
blbc $ 1 8 , 0 f
stq_ u $ 3 1 , 0 ( $ 1 6 ) # z e r o o n e w o r d
subq $ 1 8 , 1 , $ 1 8
addq $ 1 6 , 8 , $ 1 6
beq $ 1 8 , 1 f
0 : stq_ u $ 3 1 , 0 ( $ 1 6 ) # z e r o t w o w o r d s
subq $ 1 8 , 2 , $ 1 8
stq_ u $ 3 1 , 8 ( $ 1 6 )
addq $ 1 6 , 1 6 , $ 1 6
bne $ 1 8 , 0 b
1 : ldq_ u $ 1 , 0 ( $ 1 6 ) # c l e a r t h e l e a d i n g b i t s i n t h e f i n a l w o r d
2006-04-25 13:45:19 +04:00
subq $ 2 4 , 1 , $ 2
or $ 2 , $ 2 4 , $ 2
2005-04-17 02:20:36 +04:00
zap $ 1 , $ 2 , $ 1
stq_ u $ 1 , 0 ( $ 1 6 )
$ zerolen :
ret
.end strncpy