2005-04-16 15:20:36 -07:00
/ *
* arch/ a l p h a / l i b / e v6 - c o p y _ u s e r . S
*
* 2 1 2 6 4 version c o n t r i b u t e d b y R i c k G o r t o n < r i c k . g o r t o n @alpha-processor.com>
*
* Copy t o / f r o m u s e r s p a c e , h a n d l i n g e x c e p t i o n s a s w e g o . . T h i s
* isn' t e x a c t l y p r e t t y .
*
* This i s e s s e n t i a l l y t h e s a m e a s " m e m c p y ( ) " , b u t w i t h a f e w t w i s t s .
* Notably, w e h a v e t o m a k e s u r e t h a t $ 0 i s a l w a y s u p - t o - d a t e a n d
* contains t h e r i g h t " b y t e s l e f t t o c o p y " v a l u e ( a n d t h a t i t i s u p d a t e d
* only _ a f t e r _ a s u c c e s s f u l c o p y ) . T h e r e i s a l s o s o m e r a t h e r m i n o r
* exception s e t u p s t u f f . .
*
* NOTE! T h i s i s n o t d i r e c t l y C - c a l l a b l e , b e c a u s e t h e c a l l i n g s e m a n t i c s a r e
* different :
*
* Inputs :
* length i n $ 0
* destination a d d r e s s i n $ 6
* source a d d r e s s i n $ 7
* return a d d r e s s i n $ 2 8
*
* Outputs :
* bytes l e f t t o c o p y i n $ 0
*
* Clobbers :
* $ 1 , $ 2 , $ 3 , $ 4 , $ 5 , $ 6 , $ 7
*
* Much o f t h e i n f o r m a t i o n a b o u t 2 1 2 6 4 s c h e d u l i n g / c o d i n g c o m e s f r o m :
* Compiler W r i t e r ' s G u i d e f o r t h e A l p h a 2 1 2 6 4
* abbreviated a s ' C W G ' i n o t h e r c o m m e n t s h e r e
* ftp. d i g i t a l . c o m / p u b / D i g i t a l / i n f o / s e m i c o n d u c t o r / l i t e r a t u r e / d s c - l i b r a r y . h t m l
* Scheduling n o t a t i o n :
* E - e i t h e r c l u s t e r
* U - u p p e r s u b c l u s t e r ; U0 - subcluster U0; U1 - subcluster U1
* L - l o w e r s u b c l u s t e r ; L0 - subcluster L0; L1 - subcluster L1
* /
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
/* Allow an exception for an insn; exit if we get one. */
# define E X I ( x ,y . . . ) \
99 : x,## y ; \
.section _ _ ex_ t a b l e ," a " ; \
.long 99b - . ; \
lda $ 3 1 , $ e x i t i n - 9 9 b ( $ 3 1 ) ; \
.previous
# define E X O ( x ,y . . . ) \
99 : x,## y ; \
.section _ _ ex_ t a b l e ," a " ; \
.long 99b - . ; \
lda $ 3 1 , $ e x i t o u t - 9 9 b ( $ 3 1 ) ; \
.previous
.set noat
.align 4
.globl __copy_user
.ent __copy_user
# Pipeline i n f o : S l o t t i n g & C o m m e n t s
__copy_user :
.prologue 0
subq $ 0 , 3 2 , $ 1 # . . E . . . . : I s t h i s g o i n g t o b e a s m a l l c o p y ?
beq $ 0 , $ z e r o l e n g t h # U . . . . . . : U L U L
and $ 6 ,7 ,$ 3 # . . . . . . E : i s l e a d i n g d e s t m i s a l i g n m e n t
ble $ 1 , $ o n e b y t e l o o p # . . . . U . . : 1 s t b r a n c h : s m a l l a m o u n t o f d a t a
beq $ 3 , $ d e s t a l i g n e d # . . U . . . . : 2 n d ( o n e c y c l e f e t c h e r s t a l l )
subq $ 3 , 8 , $ 3 # E . . . . . . : L U U L : t r i p c o u n t e r
/ *
* The f e t c h e r s t a l l a l s o h i d e s t h e 1 c y c l e c r o s s - c l u s t e r s t a l l f o r $ 3 ( L - - > U )
* This l o o p a l i g n s t h e d e s t i n a t i o n a b y t e a t a t i m e
* We k n o w w e h a v e a t l e a s t o n e t r i p t h r o u g h t h i s l o o p
* /
$ aligndest :
EXI( l d b u $ 1 ,0 ( $ 7 ) ) # . . . . . . L : K e e p l o a d s s e p a r a t e f r o m s t o r e s
addq $ 6 ,1 ,$ 6 # . . . . E . . : S e c t i o n 3.8 i n t h e C W G
addq $ 3 ,1 ,$ 3 # . . E . . . . :
nop # E . . . . . . : U L U L
/ *
* the - 1 i s t o c o m p e n s a t e f o r t h e i n c ( $ 6 ) d o n e i n a p r e v i o u s q u a d p a c k
* which a l l o w s u s z e r o d e p e n d e n c i e s w i t h i n e i t h e r q u a d p a c k i n t h e l o o p
* /
EXO( s t b $ 1 ,- 1 ( $ 6 ) ) # . . . . . . L :
addq $ 7 ,1 ,$ 7 # . . . . E . . : S e c t i o n 3.8 i n t h e C W G
subq $ 0 ,1 ,$ 0 # . . E . . . . :
bne $ 3 , $ a l i g n d e s t # U . . . . . . : U L U L
/ *
* If w e f e l l t h r o u g h i n t o h e r e , w e h a v e a m i n i m u m o f 3 3 - 7 b y t e s
* If w e a r r i v e d v i a b r a n c h , w e h a v e a m i n i m u m o f 3 2 b y t e s
* /
$ destaligned :
and $ 7 ,7 ,$ 1 # . . . . . . E : C h e c k _ c u r r e n t _ s o u r c e a l i g n m e n t
bic $ 0 ,7 ,$ 4 # . . . . E . . : n u m b e r b y t e s a s a q u a d w o r d l o o p
EXI( l d q _ u $ 3 ,0 ( $ 7 ) ) # . . L . . . . : F o r w a r d f e t c h f o r f a l l t h r o u g h c o d e
beq $ 1 ,$ q u a d a l i g n e d # U . . . . . . : U L U L
/ *
* In t h e w o r s t c a s e , w e ' v e j u s t e x e c u t e d a n l d q _ u h e r e f r o m 0 ( $ 7 )
* and w e ' l l r e p e a t i t o n c e i f w e t a k e t h e b r a n c h
* /
/* Misaligned quadword loop - not unrolled. Leave it that way. */
$ misquad :
EXI( l d q _ u $ 2 ,8 ( $ 7 ) ) # . . . . . . L :
subq $ 4 ,8 ,$ 4 # . . . . E . . :
extql $ 3 ,$ 7 ,$ 3 # . . U . . . . :
extqh $ 2 ,$ 7 ,$ 1 # U . . . . . . : U U L L
bis $ 3 ,$ 1 ,$ 1 # . . . . . . E :
EXO( s t q $ 1 ,0 ( $ 6 ) ) # . . . . L . . :
addq $ 7 ,8 ,$ 7 # . . E . . . . :
subq $ 0 ,8 ,$ 0 # E . . . . . . : U L L U
addq $ 6 ,8 ,$ 6 # . . . . . . E :
bis $ 2 ,$ 2 ,$ 3 # . . . . E . . :
nop # . . E . . . . :
bne $ 4 ,$ m i s q u a d # U . . . . . . : U L U L
nop # . . . . . . E
nop # . . . . E . .
nop # . . E . . . .
beq $ 0 ,$ z e r o l e n g t h # U . . . . . . : U L U L
/* We know we have at least one trip through the byte loop */
EXI ( l d b u $ 2 ,0 ( $ 7 ) ) # . . . . . . L : N o l o a d s i n t h e s a m e q u a d
addq $ 6 ,1 ,$ 6 # . . . . E . . : a s t h e s t o r e ( S e c t i o n 3.8 i n C W G )
nop # . . E . . . . :
br $ 3 1 , $ d i r t y e n t r y # L 0 . . . . . . : L U U L
/* Do the trailing byte loop load, then hop into the store part of the loop */
/ *
* A m i n i m u m o f ( 3 3 - 7 ) b y t e s t o d o a q u a d a t a t i m e .
* Based u p o n t h e u s a g e c o n t e x t , i t ' s w o r t h t h e e f f o r t t o u n r o l l t h i s l o o p
* $ 0 - number o f b y t e s t o b e m o v e d
* $ 4 - number o f b y t e s t o m o v e a s q u a d w o r d s
* $ 6 is c u r r e n t d e s t i n a t i o n a d d r e s s
* $ 7 is c u r r e n t s o u r c e a d d r e s s
* /
$ quadaligned :
subq $ 4 , 3 2 , $ 2 # . . . . . . E : d o n o t u n r o l l f o r s m a l l s t u f f
nop # . . . . E . .
nop # . . E . . . .
blt $ 2 , $ o n e q u a d # U . . . . . . : U L U L
/ *
* There i s a s i g n i f i c a n t a s s u m p t i o n h e r e t h a t t h e s o u r c e a n d d e s t i n a t i o n
* addresses d i f f e r b y m o r e t h a n 3 2 b y t e s . I n t h i s p a r t i c u l a r c a s e , a
* sparsity o f r e g i s t e r s f u r t h e r b o u n d s t h i s t o b e a m i n i m u m o f 8 b y t e s .
* But i f t h i s i s n ' t m e t , t h e n t h e o u t p u t r e s u l t w i l l b e i n c o r r e c t .
* Furthermore, d u e t o a l a c k o f a v a i l a b l e r e g i s t e r s , w e r e a l l y c a n ' t
* unroll t h i s t o b e a n 8 x l o o p ( w h i c h w o u l d e n a b l e u s t o u s e t h e w h64
* instruction m e m o r y h i n t i n s t r u c t i o n ) .
* /
$ unroll4 :
EXI( l d q $ 1 ,0 ( $ 7 ) ) # . . . . . . L
EXI( l d q $ 2 ,8 ( $ 7 ) ) # . . . . L . .
subq $ 4 ,3 2 ,$ 4 # . . E . . . .
nop # E . . . . . . : U U L L
addq $ 7 ,1 6 ,$ 7 # . . . . . . E
EXO( s t q $ 1 ,0 ( $ 6 ) ) # . . . . L . .
EXO( s t q $ 2 ,8 ( $ 6 ) ) # . . L . . . .
subq $ 0 ,1 6 ,$ 0 # E . . . . . . : U L L U
addq $ 6 ,1 6 ,$ 6 # . . . . . . E
EXI( l d q $ 1 ,0 ( $ 7 ) ) # . . . . L . .
EXI( l d q $ 2 ,8 ( $ 7 ) ) # . . L . . . .
subq $ 4 , 3 2 , $ 3 # E . . . . . . : U U L L : i s t h e r e e n o u g h f o r a n o t h e r t r i p ?
EXO( s t q $ 1 ,0 ( $ 6 ) ) # . . . . . . L
EXO( s t q $ 2 ,8 ( $ 6 ) ) # . . . . L . .
subq $ 0 ,1 6 ,$ 0 # . . E . . . .
addq $ 7 ,1 6 ,$ 7 # E . . . . . . : U L L U
nop # . . . . . . E
nop # . . . . E . .
addq $ 6 ,1 6 ,$ 6 # . . E . . . .
bgt $ 3 ,$ u n r o l l 4 # U . . . . . . : U L U L
nop
nop
nop
beq $ 4 , $ n o q u a d s
$ onequad :
EXI( l d q $ 1 ,0 ( $ 7 ) )
subq $ 4 ,8 ,$ 4
addq $ 7 ,8 ,$ 7
nop
EXO( s t q $ 1 ,0 ( $ 6 ) )
subq $ 0 ,8 ,$ 0
addq $ 6 ,8 ,$ 6
bne $ 4 ,$ o n e q u a d
$ noquads :
nop
nop
nop
beq $ 0 ,$ z e r o l e n g t h
/ *
* For s m a l l c o p i e s ( o r t h e t a i l o f a l a r g e r c o p y ) , d o a v e r y s i m p l e b y t e l o o p .
* There' s n o p o i n t i n d o i n g a l o t o f c o m p l e x a l i g n m e n t c a l c u l a t i o n s t o t r y t o
* to q u a d w o r d s t u f f f o r a s m a l l a m o u n t o f d a t a .
* $ 0 - remaining n u m b e r o f b y t e s l e f t t o c o p y
* $ 6 - current d e s t a d d r
* $ 7 - current s o u r c e a d d r
* /
$ onebyteloop :
EXI ( l d b u $ 2 ,0 ( $ 7 ) ) # . . . . . . L : N o l o a d s i n t h e s a m e q u a d
addq $ 6 ,1 ,$ 6 # . . . . E . . : a s t h e s t o r e ( S e c t i o n 3.8 i n C W G )
nop # . . E . . . . :
nop # E . . . . . . : U L U L
$ dirtyentry :
/ *
* the - 1 i s t o c o m p e n s a t e f o r t h e i n c ( $ 6 ) d o n e i n a p r e v i o u s q u a d p a c k
* which a l l o w s u s z e r o d e p e n d e n c i e s w i t h i n e i t h e r q u a d p a c k i n t h e l o o p
* /
EXO ( s t b $ 2 ,- 1 ( $ 6 ) ) # . . . . . . L :
addq $ 7 ,1 ,$ 7 # . . . . E . . : q u a d p a c k a s t h e l o a d
subq $ 0 ,1 ,$ 0 # . . E . . . . : c h a n g e c o u n t _ a f t e r _ c o p y
bgt $ 0 ,$ o n e b y t e l o o p # U . . . . . . : U L U L
$ zerolength :
2016-09-10 16:21:34 -04:00
$ exitin :
2005-04-16 15:20:36 -07:00
$ exitout : # Destination f o r e x c e p t i o n r e c o v e r y ( ? )
nop # . . . . . . E
nop # . . . . E . .
nop # . . E . . . .
ret $ 3 1 ,( $ 2 8 ) ,1 # L 0 . . . . . . : L U L U
.end __copy_user
2016-01-11 09:51:29 -05:00
EXPORT_ S Y M B O L ( _ _ c o p y _ u s e r )