2005-04-17 02:20:36 +04:00
/ *
2006-10-04 01:01:26 +04:00
* linux/ a r c h / a l p h a / l i b / m e m s e t . S
2005-04-17 02:20:36 +04:00
*
* This i s a n e f f i c i e n t ( a n d 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 " m e m s e t ( ) "
* function f o r t h e a l p h a .
*
* ( C) C o p y r i g h t 1 9 9 6 L i n u s T o r v a l d s
*
* This r o u t i n e i s " m o r a l - w a r e " : y o u a r e f r e e t o u s e i t a n y w a y y o u w i s h , a n d
* the o n l y o b l i g a t i o n I p u t o n y o u i s a m o r a l o n e : i f y o u m a k e a n y i m p r o v e m e n t s
* to t h e r o u t i n e , p l e a s e s e n d m e y o u r i m p r o v e m e n t s f o r m e t o u s e s i m i l a r l y .
*
* The s c h e d u l i n g c o m m e n t s a r e a c c o r d i n g t o t h e E V 5 d o c u m e n t a t i o n ( a n d d o n e b y
* hand, s o t h e y m i g h t w e l l b e i n c o r r e c t , p l e a s e d o t e l l m e a b o u t 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
.globl memset
.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
and $ 1 7 ,2 5 5 ,$ 1 / * E 1 * /
insbl $ 1 7 ,1 ,$ 1 7 / * . . E 0 * /
bis $ 1 7 ,$ 1 ,$ 1 7 / * E 0 ( p - c l a t e n c y , n e x t c y c l e ) * /
sll $ 1 7 ,1 6 ,$ 1 / * E 1 ( p - c l a t e n c y , n e x t c y c l e ) * /
bis $ 1 7 ,$ 1 ,$ 1 7 / * E 0 ( p - c l a t e n c y , n e x t c y c l e ) * /
sll $ 1 7 ,3 2 ,$ 1 / * E 1 ( p - c l a t e n c y , n e x t c y c l e ) * /
bis $ 1 7 ,$ 1 ,$ 1 7 / * E 0 ( p - c l a t e n c y , n e x t c y c l e ) * /
ldq_ u $ 3 1 ,0 ( $ 3 0 ) / * . . E 1 * /
.align 5
__constant_c_memset :
addq $ 1 8 ,$ 1 6 ,$ 6 / * E 0 * /
bis $ 1 6 ,$ 1 6 ,$ 0 / * . . E 1 * /
xor $ 1 6 ,$ 6 ,$ 1 / * E 0 * /
ble $ 1 8 ,e n d / * . . E 1 * /
bic $ 1 ,7 ,$ 1 / * E 0 * /
beq $ 1 ,w i t h i n _ o n e _ q u a d / * . . E 1 ( n o t e E V 5 z e r o - l a t e n c y f o r w a r d i n g ) * /
and $ 1 6 ,7 ,$ 3 / * E 0 * /
beq $ 3 ,a l i g n e d / * . . E 1 ( n o t e E V 5 z e r o - l a t e n c y f o r w a r d i n g ) * /
ldq_ u $ 4 ,0 ( $ 1 6 ) / * E 0 * /
bis $ 1 6 ,$ 1 6 ,$ 5 / * . . E 1 * /
insql $ 1 7 ,$ 1 6 ,$ 2 / * E 0 * /
subq $ 3 ,8 ,$ 3 / * . . E 1 * /
addq $ 1 8 ,$ 3 ,$ 1 8 / * E 0 $ 1 8 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 / * . . E 1 ( a n d p o s s i b l e l o a d s t a l l ) * /
subq $ 1 6 ,$ 3 ,$ 1 6 / * E 0 $ 1 6 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 1 * /
bis $ 3 1 ,$ 3 1 ,$ 3 1 / * E 0 * /
ldq_ u $ 3 1 ,0 ( $ 3 0 ) / * . . E 1 * /
stq_ u $ 1 ,0 ( $ 5 ) / * E 0 * /
bis $ 3 1 ,$ 3 1 ,$ 3 1 / * . . E 1 * /
.align 4
aligned :
sra $ 1 8 ,3 ,$ 3 / * E 0 * /
and $ 1 8 ,7 ,$ 1 8 / * . . E 1 * /
bis $ 1 6 ,$ 1 6 ,$ 5 / * E 0 * /
beq $ 3 ,n o _ q u a d / * . . E 1 * /
.align 3
loop :
stq $ 1 7 ,0 ( $ 5 ) / * E 0 * /
subq $ 3 ,1 ,$ 3 / * . . E 1 * /
addq $ 5 ,8 ,$ 5 / * E 0 * /
bne $ 3 ,l o o p / * . . E 1 * /
no_quad :
bis $ 3 1 ,$ 3 1 ,$ 3 1 / * E 0 * /
beq $ 1 8 ,e n d / * . . E 1 * /
ldq $ 7 ,0 ( $ 5 ) / * E 0 * /
mskqh $ 7 ,$ 6 ,$ 2 / * . . E 1 ( a n d l o a d s t a l l ) * /
insqh $ 1 7 ,$ 6 ,$ 4 / * E 0 * /
bis $ 2 ,$ 4 ,$ 1 / * . . E 1 * /
stq $ 1 ,0 ( $ 5 ) / * E 0 * /
ret $ 3 1 ,( $ 2 6 ) ,1 / * . . E 1 * /
.align 3
within_one_quad :
ldq_ u $ 1 ,0 ( $ 1 6 ) / * E 0 * /
insql $ 1 7 ,$ 1 6 ,$ 2 / * E 1 * /
mskql $ 1 ,$ 1 6 ,$ 4 / * E 0 ( a f t e r l o a d s t a l l ) * /
bis $ 2 ,$ 4 ,$ 2 / * E 0 * /
mskql $ 2 ,$ 6 ,$ 4 / * E 0 * /
mskqh $ 1 ,$ 6 ,$ 2 / * . . E 1 * /
bis $ 2 ,$ 4 ,$ 1 / * E 0 * /
stq_ u $ 1 ,0 ( $ 1 6 ) / * E 0 * /
end :
ret $ 3 1 ,( $ 2 6 ) ,1 / * E 1 * /
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 )
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
.align 5
.ent __memsetw
__memsetw :
.prologue 0
inswl $ 1 7 ,0 ,$ 1 / * E 0 * /
inswl $ 1 7 ,2 ,$ 2 / * E 0 * /
inswl $ 1 7 ,4 ,$ 3 / * E 0 * /
or $ 1 ,$ 2 ,$ 1 / * . . E 1 * /
inswl $ 1 7 ,6 ,$ 4 / * E 0 * /
or $ 1 ,$ 3 ,$ 1 / * . . E 1 * /
or $ 1 ,$ 4 ,$ 1 7 / * E 0 * /
br _ _ c o n s t a n t _ c _ m e m s e t / * . . E 1 * /
.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 )