2005-06-23 22:01:20 -07:00
/ *
* arch/ x t e n s a / l i b / h a l / m e m c o p y . S - - C o r e H A L l i b r a r y f u n c t i o n s
* xthal_ m e m c p y a n d x t h a l _ b c o p y
*
* This f i l e i s s u b j e c t t o t h e t e r m s a n d c o n d i t i o n s o f t h e G N U G e n e r a l P u b l i c
* License. S e e t h e f i l e " C O P Y I N G " i n t h e m a i n d i r e c t o r y o f t h i s a r c h i v e
* for m o r e d e t a i l s .
*
* Copyright ( C ) 2 0 0 2 - 2 0 0 5 T e n s i l i c a I n c .
* /
2008-11-06 06:40:46 -08:00
# include < v a r i a n t / c o r e . h >
2005-06-23 22:01:20 -07:00
.macro src_b r, w0 , w1
# ifdef _ _ X T E N S A _ E B _ _
src \ r , \ w0 , \ w1
# else
src \ r , \ w1 , \ w0
# endif
.endm
.macro ssa8 r
# ifdef _ _ X T E N S A _ E B _ _
ssa8 b \ r
# else
ssa8 l \ r
# endif
.endm
/ *
* void * m e m c p y ( v o i d * d s t , c o n s t v o i d * s r c , s i z e _ t l e n ) ;
* void * m e m m o v e ( v o i d * d s t , c o n s t v o i d * s r c , s i z e _ t l e n ) ;
* void * b c o p y ( c o n s t v o i d * s r c , v o i d * d s t , s i z e _ t l e n ) ;
*
* This f u n c t i o n i s i n t e n d e d t o d o t h e s a m e t h i n g a s t h e s t a n d a r d
* library f u n c t i o n m e m c p y ( ) ( o r b c o p y ( ) ) f o r m o s t c a s e s .
* However, w h e r e t h e s o u r c e a n d / o r d e s t i n a t i o n r e f e r e n c e s
* an i n s t r u c t i o n R A M o r R O M o r a d a t a R A M o r R O M , t h a t
* source a n d / o r d e s t i n a t i o n w i l l a l w a y s b e a c c e s s e d w i t h
* 3 2 - bit l o a d a n d s t o r e i n s t r u c t i o n s ( a s r e q u i r e d f o r t h e s e
* types o f d e v i c e s ) .
*
* ! ! ! ! ! ! ! XTFIXME :
* ! ! ! ! ! ! ! Handling o f I R A M / I R O M h a s n o t y e t
* ! ! ! ! ! ! ! been i m p l e m e n t e d .
*
* The b c o p y v e r s i o n i s p r o v i d e d h e r e t o a v o i d t h e o v e r h e a d
* of a n e x t r a c a l l , f o r c a l l e r s t h a t r e q u i r e t h i s c o n v e n t i o n .
*
* The ( g e n e r a l c a s e ) a l g o r i t h m i s a s f o l l o w s :
* If d e s t i n a t i o n i s u n a l i g n e d , a l i g n i t b y c o n d i t i o n a l l y
* copying 1 a n d 2 b y t e s .
* If s o u r c e i s a l i g n e d ,
* do 1 6 b y t e s w i t h a l o o p , a n d t h e n f i n i s h u p w i t h
* 8 , 4 , 2 , and 1 b y t e c o p i e s c o n d i t i o n a l o n t h e l e n g t h ;
* else ( i f s o u r c e i s u n a l i g n e d ) ,
* do t h e s a m e , b u t u s e S R C t o a l i g n t h e s o u r c e d a t a .
* This c o d e t r i e s t o u s e f a l l - t h r o u g h b r a n c h e s f o r t h e c o m m o n
* case o f a l i g n e d s o u r c e a n d d e s t i n a t i o n a n d m u l t i p l e
* of 4 ( o r 8 ) l e n g t h .
*
* Register u s e :
* a0 / r e t u r n a d d r e s s
* a1 / s t a c k p o i n t e r
* a2 / r e t u r n v a l u e
* a3 / s r c
* a4 / l e n g t h
* a5 / d s t
* a6 / t m p
* a7 / t m p
* a8 / t m p
* a9 / t m p
* a1 0 / t m p
* a1 1 / t m p
* /
.text
.align 4
.global bcopy
.type bcopy,@function
bcopy :
entry s p , 1 6 # m i n i m a l s t a c k f r a m e
# a2 =src , a3 =dst , a4 =len
mov a5 , a3 # c o p y d s t s o t h a t a 2 i s r e t u r n v a l u e
mov a3 , a2
mov a2 , a5
j . L c o m m o n # g o t o c o m m o n c o d e f o r m e m c p y + b c o p y
/ *
* Byte b y b y t e c o p y
* /
.align 4
.byte 0 # 1 mod 4 a l i g n m e n t f o r L O O P N E Z
# ( 0 mod 4 a l i g n m e n t f o r L B E G )
.Lbytecopy :
# if X C H A L _ H A V E _ L O O P S
loopnez a4 , . L b y t e c o p y d o n e
# else / * ! X C H A L _ H A V E _ L O O P S * /
beqz a4 , . L b y t e c o p y d o n e
add a7 , a3 , a4 # a 7 = e n d a d d r e s s f o r s o u r c e
# endif / * ! X C H A L _ H A V E _ L O O P S * /
.Lnextbyte :
l8 u i a6 , a3 , 0
addi a3 , a3 , 1
s8 i a6 , a5 , 0
addi a5 , a5 , 1
# if ! X C H A L _ H A V E _ L O O P S
blt a3 , a7 , . L n e x t b y t e
# endif / * ! X C H A L _ H A V E _ L O O P S * /
.Lbytecopydone :
retw
/ *
* Destination i s u n a l i g n e d
* /
.align 4
.Ldst1mod2 : # dst i s o n l y b y t e a l i g n e d
_ bltui a4 , 7 , . L b y t e c o p y # d o s h o r t c o p i e s b y t e b y b y t e
# copy 1 b y t e
l8 u i a6 , a3 , 0
addi a3 , a3 , 1
addi a4 , a4 , - 1
s8 i a6 , a5 , 0
addi a5 , a5 , 1
_ bbci. l a5 , 1 , . L d s t a l i g n e d # i f d s t i s n o w a l i g n e d , t h e n
# return t o m a i n a l g o r i t h m
.Ldst2mod4 : # dst 1 6 - b i t a l i g n e d
# copy 2 b y t e s
_ bltui a4 , 6 , . L b y t e c o p y # d o s h o r t c o p i e s b y t e b y b y t e
l8 u i a6 , a3 , 0
l8 u i a7 , a3 , 1
addi a3 , a3 , 2
addi a4 , a4 , - 2
s8 i a6 , a5 , 0
s8 i a7 , a5 , 1
addi a5 , a5 , 2
j . L d s t a l i g n e d # d s t i s n o w a l i g n e d , r e t u r n t o m a i n a l g o r i t h m
.align 4
.global memcpy
.type memcpy,@function
memcpy :
.global memmove
.type memmove,@function
memmove :
entry s p , 1 6 # m i n i m a l s t a c k f r a m e
# a2 / d s t , a3 / s r c , a4 / l e n
mov a5 , a2 # c o p y d s t s o t h a t a 2 i s r e t u r n v a l u e
.Lcommon :
_ bbsi. l a2 , 0 , . L d s t 1 m o d2 # i f d s t i s 1 m o d 2
_ bbsi. l a2 , 1 , . L d s t 2 m o d4 # i f d s t i s 2 m o d 4
.Ldstaligned : # return h e r e f r o m . L d s t ? m o d ? o n c e d s t i s a l i g n e d
srli a7 , a4 , 4 # n u m b e r o f l o o p i t e r a t i o n s w i t h 16 B
# per i t e r a t i o n
movi a8 , 3 # i f s o u r c e i s n o t a l i g n e d ,
_ bany a3 , a8 , . L s r c u n a l i g n e d # t h e n u s e s h i f t i n g c o p y
/ *
* Destination a n d s o u r c e a r e w o r d - a l i g n e d , u s e w o r d c o p y .
* /
# copy 1 6 b y t e s p e r i t e r a t i o n f o r w o r d - a l i g n e d d s t a n d w o r d - a l i g n e d s r c
# if X C H A L _ H A V E _ L O O P S
loopnez a7 , . L o o p1 d o n e
# else / * ! X C H A L _ H A V E _ L O O P S * /
beqz a7 , . L o o p1 d o n e
slli a8 , a7 , 4
add a8 , a8 , a3 # a 8 = e n d o f l a s t 1 6 B s o u r c e c h u n k
# endif / * ! X C H A L _ H A V E _ L O O P S * /
.Loop1 :
l3 2 i a6 , a3 , 0
l3 2 i a7 , a3 , 4
s3 2 i a6 , a5 , 0
l3 2 i a6 , a3 , 8
s3 2 i a7 , a5 , 4
l3 2 i a7 , a3 , 1 2
s3 2 i a6 , a5 , 8
addi a3 , a3 , 1 6
s3 2 i a7 , a5 , 1 2
addi a5 , a5 , 1 6
# if ! X C H A L _ H A V E _ L O O P S
blt a3 , a8 , . L o o p1
# endif / * ! X C H A L _ H A V E _ L O O P S * /
.Loop1done :
bbci. l a4 , 3 , . L 2
# copy 8 b y t e s
l3 2 i a6 , a3 , 0
l3 2 i a7 , a3 , 4
addi a3 , a3 , 8
s3 2 i a6 , a5 , 0
s3 2 i a7 , a5 , 4
addi a5 , a5 , 8
.L2 :
bbsi. l a4 , 2 , . L 3
bbsi. l a4 , 1 , . L 4
bbsi. l a4 , 0 , . L 5
retw
.L3 :
# copy 4 b y t e s
l3 2 i a6 , a3 , 0
addi a3 , a3 , 4
s3 2 i a6 , a5 , 0
addi a5 , a5 , 4
bbsi. l a4 , 1 , . L 4
bbsi. l a4 , 0 , . L 5
retw
.L4 :
# copy 2 b y t e s
l1 6 u i a6 , a3 , 0
addi a3 , a3 , 2
s1 6 i a6 , a5 , 0
addi a5 , a5 , 2
bbsi. l a4 , 0 , . L 5
retw
.L5 :
# copy 1 b y t e
l8 u i a6 , a3 , 0
s8 i a6 , a5 , 0
retw
/ *
* Destination i s a l i g n e d , S o u r c e i s u n a l i g n e d
* /
.align 4
.Lsrcunaligned :
_ beqz a4 , . L d o n e # a v o i d l o a d i n g a n y t h i n g f o r z e r o - l e n g t h c o p i e s
# copy 1 6 b y t e s p e r i t e r a t i o n f o r w o r d - a l i g n e d d s t a n d u n a l i g n e d s r c
ssa8 a3 # s e t s h i f t a m o u n t f r o m b y t e o f f s e t
# define S I M _ C H E C K S _ A L I G N M E N T 1 / * s e t t o 1 w h e n r u n n i n g o n I S S ( s i m u l a t o r ) w i t h t h e
lint o r f e r r e t c l i e n t , o r 0 t o s a v e a f e w c y c l e s * /
# if X C H A L _ U N A L I G N E D _ L O A D _ E X C E P T I O N | | S I M _ C H E C K S _ A L I G N M E N T
and a11 , a3 , a8 # s a v e u n a l i g n m e n t o f f s e t f o r b e l o w
sub a3 , a3 , a11 # a l i g n a 3
# endif
l3 2 i a6 , a3 , 0 # l o a d f i r s t w o r d
# if X C H A L _ H A V E _ L O O P S
loopnez a7 , . L o o p2 d o n e
# else / * ! X C H A L _ H A V E _ L O O P S * /
beqz a7 , . L o o p2 d o n e
slli a10 , a7 , 4
add a10 , a10 , a3 # a 10 = e n d o f l a s t 1 6 B s o u r c e c h u n k
# endif / * ! X C H A L _ H A V E _ L O O P S * /
.Loop2 :
l3 2 i a7 , a3 , 4
l3 2 i a8 , a3 , 8
src_ b a6 , a6 , a7
s3 2 i a6 , a5 , 0
l3 2 i a9 , a3 , 1 2
src_ b a7 , a7 , a8
s3 2 i a7 , a5 , 4
l3 2 i a6 , a3 , 1 6
src_ b a8 , a8 , a9
s3 2 i a8 , a5 , 8
addi a3 , a3 , 1 6
src_ b a9 , a9 , a6
s3 2 i a9 , a5 , 1 2
addi a5 , a5 , 1 6
# if ! X C H A L _ H A V E _ L O O P S
blt a3 , a10 , . L o o p2
# endif / * ! X C H A L _ H A V E _ L O O P S * /
.Loop2done :
bbci. l a4 , 3 , . L 1 2
# copy 8 b y t e s
l3 2 i a7 , a3 , 4
l3 2 i a8 , a3 , 8
src_ b a6 , a6 , a7
s3 2 i a6 , a5 , 0
addi a3 , a3 , 8
src_ b a7 , a7 , a8
s3 2 i a7 , a5 , 4
addi a5 , a5 , 8
mov a6 , a8
.L12 :
bbci. l a4 , 2 , . L 1 3
# copy 4 b y t e s
l3 2 i a7 , a3 , 4
addi a3 , a3 , 4
src_ b a6 , a6 , a7
s3 2 i a6 , a5 , 0
addi a5 , a5 , 4
mov a6 , a7
.L13 :
# if X C H A L _ U N A L I G N E D _ L O A D _ E X C E P T I O N | | S I M _ C H E C K S _ A L I G N M E N T
add a3 , a3 , a11 # r e a d j u s t a 3 w i t h c o r r e c t m i s a l i g n m e n t
# endif
bbsi. l a4 , 1 , . L 1 4
bbsi. l a4 , 0 , . L 1 5
.Ldone : retw
.L14 :
# copy 2 b y t e s
l8 u i a6 , a3 , 0
l8 u i a7 , a3 , 1
addi a3 , a3 , 2
s8 i a6 , a5 , 0
s8 i a7 , a5 , 1
addi a5 , a5 , 2
bbsi. l a4 , 0 , . L 1 5
retw
.L15 :
# copy 1 b y t e
l8 u i a6 , a3 , 0
s8 i a6 , a5 , 0
retw
/ *
* Local V a r i a b l e s :
* mode : fundamental
* comment- s t a r t : " # "
* comment- s t a r t - s k i p : " # * "
* End :
* /