2005-04-17 02:20:36 +04:00
/ * copy_ u s e r . S : S p a r c o p t i m i z e d c o p y _ f r o m _ u s e r a n d c o p y _ t o _ u s e r c o d e .
*
* Copyright( C ) 1 9 9 5 L i n u s T o r v a l d s
* Copyright( C ) 1 9 9 6 D a v i d S . M i l l e r
* Copyright( C ) 1 9 9 6 E d d i e C . D o s t
* Copyright( C ) 1 9 9 6 ,1 9 9 8 J a k u b J e l i n e k
*
* derived f r o m :
* e- m a i l b e t w e e n D a v i d a n d E d d i e .
*
* Returns 0 i f s u c c e s s f u l , o t h e r w i s e c o u n t o f b y t e s n o t c o p i e d y e t
* /
# include < a s m / p t r a c e . h >
# include < a s m / a s m m a c r o . h >
# include < a s m / p a g e . h >
2006-09-28 06:43:02 +04:00
# include < a s m / t h r e a d _ i n f o . h >
2005-04-17 02:20:36 +04:00
/* Work around cpp -rob */
# define A L L O C #a l l o c
# define E X E C I N S T R #e x e c i n s t r
# define E X ( x ,y ,a ,b ) \
98 : x,y ; \
.section .fixup , ALLOC,E X E C I N S T R ; \
.align 4 ; \
99 : ba f i x u p r e t l ; \
a, b , % g 3 ; \
.section _ _ ex_ t a b l e ,A L L O C ; \
.align 4 ; \
.word 9 8 b, 9 9 b ; \
.text ; \
.align 4
# define E X 2 ( x ,y ,c ,d ,e ,a ,b ) \
98 : x,y ; \
.section .fixup , ALLOC,E X E C I N S T R ; \
.align 4 ; \
99 : c, d , e ; \
ba f i x u p r e t l ; \
a, b , % g 3 ; \
.section _ _ ex_ t a b l e ,A L L O C ; \
.align 4 ; \
.word 9 8 b, 9 9 b ; \
.text ; \
.align 4
# define E X O 2 ( x ,y ) \
98 : x, y ; \
.section _ _ ex_ t a b l e ,A L L O C ; \
.align 4 ; \
.word 9 8 b, 9 7 f ; \
.text ; \
.align 4
# define E X T ( s t a r t ,e n d ,h a n d l e r ) \
.section _ _ ex_ t a b l e ,A L L O C ; \
.align 4 ; \
.word start, 0 , e n d , h a n d l e r ; \
.text ; \
.align 4
/ * Please d o n o t c h a n g e f o l l o w i n g m a c r o s u n l e s s y o u c h a n g e l o g i c u s e d
* in . f i x u p a t t h e e n d o f t h i s f i l e a s w e l l
* /
/* Both these macros have to start with exactly the same insn */
# define M O V E _ B I G C H U N K ( s r c , d s t , o f f s e t , t 0 , t 1 , t 2 , t 3 , t 4 , t 5 , t 6 , t 7 ) \
ldd [ % s r c + ( o f f s e t ) + 0 x00 ] , % t 0 ; \
ldd [ % s r c + ( o f f s e t ) + 0 x08 ] , % t 2 ; \
ldd [ % s r c + ( o f f s e t ) + 0 x10 ] , % t 4 ; \
ldd [ % s r c + ( o f f s e t ) + 0 x18 ] , % t 6 ; \
st % t 0 , [ % d s t + ( o f f s e t ) + 0 x00 ] ; \
st % t 1 , [ % d s t + ( o f f s e t ) + 0 x04 ] ; \
st % t 2 , [ % d s t + ( o f f s e t ) + 0 x08 ] ; \
st % t 3 , [ % d s t + ( o f f s e t ) + 0 x0 c ] ; \
st % t 4 , [ % d s t + ( o f f s e t ) + 0 x10 ] ; \
st % t 5 , [ % d s t + ( o f f s e t ) + 0 x14 ] ; \
st % t 6 , [ % d s t + ( o f f s e t ) + 0 x18 ] ; \
st % t 7 , [ % d s t + ( o f f s e t ) + 0 x1 c ] ;
# define M O V E _ B I G A L I G N C H U N K ( s r c , d s t , o f f s e t , t 0 , t 1 , t 2 , t 3 , t 4 , t 5 , t 6 , t 7 ) \
ldd [ % s r c + ( o f f s e t ) + 0 x00 ] , % t 0 ; \
ldd [ % s r c + ( o f f s e t ) + 0 x08 ] , % t 2 ; \
ldd [ % s r c + ( o f f s e t ) + 0 x10 ] , % t 4 ; \
ldd [ % s r c + ( o f f s e t ) + 0 x18 ] , % t 6 ; \
std % t 0 , [ % d s t + ( o f f s e t ) + 0 x00 ] ; \
std % t 2 , [ % d s t + ( o f f s e t ) + 0 x08 ] ; \
std % t 4 , [ % d s t + ( o f f s e t ) + 0 x10 ] ; \
std % t 6 , [ % d s t + ( o f f s e t ) + 0 x18 ] ;
# define M O V E _ L A S T C H U N K ( s r c , d s t , o f f s e t , t 0 , t 1 , t 2 , t 3 ) \
ldd [ % s r c - ( o f f s e t ) - 0 x10 ] , % t 0 ; \
ldd [ % s r c - ( o f f s e t ) - 0 x08 ] , % t 2 ; \
st % t 0 , [ % d s t - ( o f f s e t ) - 0 x10 ] ; \
st % t 1 , [ % d s t - ( o f f s e t ) - 0 x0 c ] ; \
st % t 2 , [ % d s t - ( o f f s e t ) - 0 x08 ] ; \
st % t 3 , [ % d s t - ( o f f s e t ) - 0 x04 ] ;
# define M O V E _ H A L F C H U N K ( s r c , d s t , o f f s e t , t 0 , t 1 , t 2 , t 3 ) \
lduh [ % s r c + ( o f f s e t ) + 0 x00 ] , % t 0 ; \
lduh [ % s r c + ( o f f s e t ) + 0 x02 ] , % t 1 ; \
lduh [ % s r c + ( o f f s e t ) + 0 x04 ] , % t 2 ; \
lduh [ % s r c + ( o f f s e t ) + 0 x06 ] , % t 3 ; \
sth % t 0 , [ % d s t + ( o f f s e t ) + 0 x00 ] ; \
sth % t 1 , [ % d s t + ( o f f s e t ) + 0 x02 ] ; \
sth % t 2 , [ % d s t + ( o f f s e t ) + 0 x04 ] ; \
sth % t 3 , [ % d s t + ( o f f s e t ) + 0 x06 ] ;
# define M O V E _ S H O R T C H U N K ( s r c , d s t , o f f s e t , t 0 , t 1 ) \
ldub [ % s r c - ( o f f s e t ) - 0 x02 ] , % t 0 ; \
ldub [ % s r c - ( o f f s e t ) - 0 x01 ] , % t 1 ; \
stb % t 0 , [ % d s t - ( o f f s e t ) - 0 x02 ] ; \
stb % t 1 , [ % d s t - ( o f f s e t ) - 0 x01 ] ;
.text
.align 4
.globl __copy_user_begin
__copy_user_begin :
.globl __copy_user
dword_align :
andcc % o 1 , 1 , % g 0
be 4 f
andcc % o 1 , 2 , % g 0
EXO2 ( l d u b [ % o 1 ] , % g 2 )
add % o 1 , 1 , % o 1
EXO2 ( s t b % g 2 , [ % o 0 ] )
sub % o 2 , 1 , % o 2
bne 3 f
add % o 0 , 1 , % o 0
EXO2 ( l d u h [ % o 1 ] , % g 2 )
add % o 1 , 2 , % o 1
EXO2 ( s t h % g 2 , [ % o 0 ] )
sub % o 2 , 2 , % o 2
b 3 f
add % o 0 , 2 , % o 0
4 :
EXO2 ( l d u h [ % o 1 ] , % g 2 )
add % o 1 , 2 , % o 1
EXO2 ( s t h % g 2 , [ % o 0 ] )
sub % o 2 , 2 , % o 2
b 3 f
add % o 0 , 2 , % o 0
__copy_user : /* %o0=dst %o1=src %o2=len */
xor % o 0 , % o 1 , % o 4
1 :
andcc % o 4 , 3 , % o 5
2 :
bne c a n n o t _ o p t i m i z e
cmp % o 2 , 1 5
bleu s h o r t _ a l i g n e d _ e n d
andcc % o 1 , 3 , % g 0
bne d w o r d _ a l i g n
3 :
andcc % o 1 , 4 , % g 0
be 2 f
mov % o 2 , % g 1
EXO2 ( l d [ % o 1 ] , % o 4 )
sub % g 1 , 4 , % g 1
EXO2 ( s t % o 4 , [ % o 0 ] )
add % o 1 , 4 , % o 1
add % o 0 , 4 , % o 0
2 :
andcc % g 1 , 0 x f f f f f f80 , % g 7
be 3 f
andcc % o 0 , 4 , % g 0
be l d d _ s t d + 4
5 :
MOVE_ B I G C H U N K ( o 1 , o 0 , 0 x00 , o 2 , o 3 , o 4 , o 5 , g 2 , g 3 , g 4 , g 5 )
MOVE_ B I G C H U N K ( o 1 , o 0 , 0 x20 , o 2 , o 3 , o 4 , o 5 , g 2 , g 3 , g 4 , g 5 )
MOVE_ B I G C H U N K ( o 1 , o 0 , 0 x40 , o 2 , o 3 , o 4 , o 5 , g 2 , g 3 , g 4 , g 5 )
MOVE_ B I G C H U N K ( o 1 , o 0 , 0 x60 , o 2 , o 3 , o 4 , o 5 , g 2 , g 3 , g 4 , g 5 )
80 :
EXT( 5 b , 8 0 b , 5 0 f )
subcc % g 7 , 1 2 8 , % g 7
add % o 1 , 1 2 8 , % o 1
bne 5 b
add % o 0 , 1 2 8 , % o 0
3 :
andcc % g 1 , 0 x70 , % g 7
be c o p y _ u s e r _ t a b l e _ e n d
andcc % g 1 , 8 , % g 0
sethi % h i ( c o p y _ u s e r _ t a b l e _ e n d ) , % o 5
srl % g 7 , 1 , % o 4
add % g 7 , % o 4 , % o 4
add % o 1 , % g 7 , % o 1
sub % o 5 , % o 4 , % o 5
jmpl % o 5 + % l o ( c o p y _ u s e r _ t a b l e _ e n d ) , % g 0
add % o 0 , % g 7 , % o 0
copy_user_table :
MOVE_ L A S T C H U N K ( o 1 , o 0 , 0 x60 , g 2 , g 3 , g 4 , g 5 )
MOVE_ L A S T C H U N K ( o 1 , o 0 , 0 x50 , g 2 , g 3 , g 4 , g 5 )
MOVE_ L A S T C H U N K ( o 1 , o 0 , 0 x40 , g 2 , g 3 , g 4 , g 5 )
MOVE_ L A S T C H U N K ( o 1 , o 0 , 0 x30 , g 2 , g 3 , g 4 , g 5 )
MOVE_ L A S T C H U N K ( o 1 , o 0 , 0 x20 , g 2 , g 3 , g 4 , g 5 )
MOVE_ L A S T C H U N K ( o 1 , o 0 , 0 x10 , g 2 , g 3 , g 4 , g 5 )
MOVE_ L A S T C H U N K ( o 1 , o 0 , 0 x00 , g 2 , g 3 , g 4 , g 5 )
copy_user_table_end :
EXT( c o p y _ u s e r _ t a b l e , c o p y _ u s e r _ t a b l e _ e n d , 5 1 f )
be c o p y _ u s e r _ l a s t 7
andcc % g 1 , 4 , % g 0
EX( l d d [ % o 1 ] , % g 2 , a n d % g 1 , 0 x f )
add % o 0 , 8 , % o 0
add % o 1 , 8 , % o 1
EX( s t % g 2 , [ % o 0 - 0 x08 ] , a n d % g 1 , 0 x f )
EX2 ( s t % g 3 , [ % o 0 - 0 x04 ] , a n d % g 1 , 0 x f , % g 1 , s u b % g 1 , 4 )
copy_user_last7 :
be 1 f
andcc % g 1 , 2 , % g 0
EX( l d [ % o 1 ] , % g 2 , a n d % g 1 , 7 )
add % o 1 , 4 , % o 1
EX( s t % g 2 , [ % o 0 ] , a n d % g 1 , 7 )
add % o 0 , 4 , % o 0
1 :
be 1 f
andcc % g 1 , 1 , % g 0
EX( l d u h [ % o 1 ] , % g 2 , a n d % g 1 , 3 )
add % o 1 , 2 , % o 1
EX( s t h % g 2 , [ % o 0 ] , a n d % g 1 , 3 )
add % o 0 , 2 , % o 0
1 :
be 1 f
nop
EX( l d u b [ % o 1 ] , % g 2 , a d d % g 0 , 1 )
EX( s t b % g 2 , [ % o 0 ] , a d d % g 0 , 1 )
1 :
retl
clr % o 0
ldd_std :
MOVE_ B I G A L I G N C H U N K ( o 1 , o 0 , 0 x00 , o 2 , o 3 , o 4 , o 5 , g 2 , g 3 , g 4 , g 5 )
MOVE_ B I G A L I G N C H U N K ( o 1 , o 0 , 0 x20 , o 2 , o 3 , o 4 , o 5 , g 2 , g 3 , g 4 , g 5 )
MOVE_ B I G A L I G N C H U N K ( o 1 , o 0 , 0 x40 , o 2 , o 3 , o 4 , o 5 , g 2 , g 3 , g 4 , g 5 )
MOVE_ B I G A L I G N C H U N K ( o 1 , o 0 , 0 x60 , o 2 , o 3 , o 4 , o 5 , g 2 , g 3 , g 4 , g 5 )
81 :
EXT( l d d _ s t d , 8 1 b , 5 2 f )
subcc % g 7 , 1 2 8 , % g 7
add % o 1 , 1 2 8 , % o 1
bne l d d _ s t d
add % o 0 , 1 2 8 , % o 0
andcc % g 1 , 0 x70 , % g 7
be c o p y _ u s e r _ t a b l e _ e n d
andcc % g 1 , 8 , % g 0
sethi % h i ( c o p y _ u s e r _ t a b l e _ e n d ) , % o 5
srl % g 7 , 1 , % o 4
add % g 7 , % o 4 , % o 4
add % o 1 , % g 7 , % o 1
sub % o 5 , % o 4 , % o 5
jmpl % o 5 + % l o ( c o p y _ u s e r _ t a b l e _ e n d ) , % g 0
add % o 0 , % g 7 , % o 0
cannot_optimize :
bleu s h o r t _ e n d
cmp % o 5 , 2
bne b y t e _ c h u n k
and % o 2 , 0 x f f f f f f f0 , % o 3
andcc % o 1 , 1 , % g 0
be 1 0 f
nop
EXO2 ( l d u b [ % o 1 ] , % g 2 )
add % o 1 , 1 , % o 1
EXO2 ( s t b % g 2 , [ % o 0 ] )
sub % o 2 , 1 , % o 2
andcc % o 2 , 0 x f f f f f f f0 , % o 3
be s h o r t _ e n d
add % o 0 , 1 , % o 0
10 :
MOVE_ H A L F C H U N K ( o 1 , o 0 , 0 x00 , g 2 , g 3 , g 4 , g 5 )
MOVE_ H A L F C H U N K ( o 1 , o 0 , 0 x08 , g 2 , g 3 , g 4 , g 5 )
82 :
EXT( 1 0 b , 8 2 b , 5 3 f )
subcc % o 3 , 0 x10 , % o 3
add % o 1 , 0 x10 , % o 1
bne 1 0 b
add % o 0 , 0 x10 , % o 0
b 2 f
and % o 2 , 0 x e , % o 3
byte_chunk :
MOVE_ S H O R T C H U N K ( o 1 , o 0 , - 0 x02 , g 2 , g 3 )
MOVE_ S H O R T C H U N K ( o 1 , o 0 , - 0 x04 , g 2 , g 3 )
MOVE_ S H O R T C H U N K ( o 1 , o 0 , - 0 x06 , g 2 , g 3 )
MOVE_ S H O R T C H U N K ( o 1 , o 0 , - 0 x08 , g 2 , g 3 )
MOVE_ S H O R T C H U N K ( o 1 , o 0 , - 0 x0 a , g 2 , g 3 )
MOVE_ S H O R T C H U N K ( o 1 , o 0 , - 0 x0 c , g 2 , g 3 )
MOVE_ S H O R T C H U N K ( o 1 , o 0 , - 0 x0 e , g 2 , g 3 )
MOVE_ S H O R T C H U N K ( o 1 , o 0 , - 0 x10 , g 2 , g 3 )
83 :
EXT( b y t e _ c h u n k , 8 3 b , 5 4 f )
subcc % o 3 , 0 x10 , % o 3
add % o 1 , 0 x10 , % o 1
bne b y t e _ c h u n k
add % o 0 , 0 x10 , % o 0
short_end :
and % o 2 , 0 x e , % o 3
2 :
sethi % h i ( s h o r t _ t a b l e _ e n d ) , % o 5
sll % o 3 , 3 , % o 4
add % o 0 , % o 3 , % o 0
sub % o 5 , % o 4 , % o 5
add % o 1 , % o 3 , % o 1
jmpl % o 5 + % l o ( s h o r t _ t a b l e _ e n d ) , % g 0
andcc % o 2 , 1 , % g 0
84 :
MOVE_ S H O R T C H U N K ( o 1 , o 0 , 0 x0 c , g 2 , g 3 )
MOVE_ S H O R T C H U N K ( o 1 , o 0 , 0 x0 a , g 2 , g 3 )
MOVE_ S H O R T C H U N K ( o 1 , o 0 , 0 x08 , g 2 , g 3 )
MOVE_ S H O R T C H U N K ( o 1 , o 0 , 0 x06 , g 2 , g 3 )
MOVE_ S H O R T C H U N K ( o 1 , o 0 , 0 x04 , g 2 , g 3 )
MOVE_ S H O R T C H U N K ( o 1 , o 0 , 0 x02 , g 2 , g 3 )
MOVE_ S H O R T C H U N K ( o 1 , o 0 , 0 x00 , g 2 , g 3 )
short_table_end :
EXT( 8 4 b , s h o r t _ t a b l e _ e n d , 5 5 f )
be 1 f
nop
EX( l d u b [ % o 1 ] , % g 2 , a d d % g 0 , 1 )
EX( s t b % g 2 , [ % o 0 ] , a d d % g 0 , 1 )
1 :
retl
clr % o 0
short_aligned_end :
bne s h o r t _ e n d
andcc % o 2 , 8 , % g 0
be 1 f
andcc % o 2 , 4 , % g 0
EXO2 ( l d [ % o 1 + 0 x00 ] , % g 2 )
EXO2 ( l d [ % o 1 + 0 x04 ] , % g 3 )
add % o 1 , 8 , % o 1
EXO2 ( s t % g 2 , [ % o 0 + 0 x00 ] )
EX( s t % g 3 , [ % o 0 + 0 x04 ] , s u b % o 2 , 4 )
add % o 0 , 8 , % o 0
1 :
b c o p y _ u s e r _ l a s t 7
mov % o 2 , % g 1
.section .fixup , # alloc,#e x e c i n s t r
.align 4
97 :
mov % o 2 , % g 3
fixupretl :
sethi % h i ( P A G E _ O F F S E T ) , % g 1
cmp % o 0 , % g 1
blu 1 f
cmp % o 1 , % g 1
bgeu 1 f
2006-09-28 06:43:02 +04:00
ld [ % g 6 + T I _ P R E E M P T ] , % g 1
cmp % g 1 , 0
bne 1 f
2005-04-17 02:20:36 +04:00
nop
save % s p , - 6 4 , % s p
mov % i 0 , % o 0
call _ _ b z e r o
mov % g 3 , % o 1
restore
1 : retl
mov % g 3 , % o 0
/* exception routine sets %g2 to (broken_insn - first_insn)>>2 */
50 :
/ * This m a g i c c o u n t s h o w m a n y b y t e s a r e l e f t w h e n c r a s h i n M O V E _ B I G C H U N K
* happens. T h i s i s d e r i v e d f r o m t h e a m o u n t l d d r e a d s , s t s t o r e s , e t c .
* x = g 2 % 1 2 ;
* g3 = g 1 + g 7 - ( ( g 2 / 1 2 ) * 3 2 + ( x < 4 ) ? 0 : ( x - 4 ) * 4 ) ;
* o0 + = ( g 2 / 1 2 ) * 3 2 ;
* /
cmp % g 2 , 1 2
add % o 0 , % g 7 , % o 0
bcs 1 f
cmp % g 2 , 2 4
bcs 2 f
cmp % g 2 , 3 6
bcs 3 f
nop
sub % g 2 , 1 2 , % g 2
sub % g 7 , 3 2 , % g 7
3 : sub % g 2 , 1 2 , % g 2
sub % g 7 , 3 2 , % g 7
2 : sub % g 2 , 1 2 , % g 2
sub % g 7 , 3 2 , % g 7
1 : cmp % g 2 , 4
bcs,a 6 0 f
clr % g 2
sub % g 2 , 4 , % g 2
sll % g 2 , 2 , % g 2
60 : and % g 1 , 0 x7 f , % g 3
sub % o 0 , % g 7 , % o 0
add % g 3 , % g 7 , % g 3
ba f i x u p r e t l
sub % g 3 , % g 2 , % g 3
51 :
/ * i = 4 1 - g 2 ; j = i % 6;
* g3 = ( g 1 & 1 5 ) + ( i / 6 ) * 1 6 + ( j < 4 ) ? ( j + 1 ) * 4 : 1 6 ;
* o0 - = ( i / 6 ) * 1 6 + 1 6 ;
* /
neg % g 2
and % g 1 , 0 x f , % g 1
add % g 2 , 4 1 , % g 2
add % o 0 , % g 1 , % o 0
1 : cmp % g 2 , 6
bcs,a 2 f
cmp % g 2 , 4
add % g 1 , 1 6 , % g 1
b 1 b
sub % g 2 , 6 , % g 2
2 : bcc,a 2 f
mov 1 6 , % g 2
inc % g 2
sll % g 2 , 2 , % g 2
2 : add % g 1 , % g 2 , % g 3
ba f i x u p r e t l
sub % o 0 , % g 3 , % o 0
52 :
/ * g3 = g 1 + g 7 - ( g 2 / 8 ) * 3 2 + ( g 2 & 4 ) ? ( g 2 & 3 ) * 8 : 0 ;
o0 + = ( g 2 / 8 ) * 3 2 * /
andn % g 2 , 7 , % g 4
add % o 0 , % g 7 , % o 0
andcc % g 2 , 4 , % g 0
and % g 2 , 3 , % g 2
sll % g 4 , 2 , % g 4
sll % g 2 , 3 , % g 2
bne 6 0 b
sub % g 7 , % g 4 , % g 7
ba 6 0 b
clr % g 2
53 :
/ * g3 = o 3 + ( o 2 & 1 5 ) - ( g 2 & 8 ) - ( g 2 & 4 ) ? ( g 2 & 3 ) * 2 : 0 ;
o0 + = ( g 2 & 8 ) * /
and % g 2 , 3 , % g 4
andcc % g 2 , 4 , % g 0
and % g 2 , 8 , % g 2
sll % g 4 , 1 , % g 4
be 1 f
add % o 0 , % g 2 , % o 0
add % g 2 , % g 4 , % g 2
1 : and % o 2 , 0 x f , % g 3
add % g 3 , % o 3 , % g 3
ba f i x u p r e t l
sub % g 3 , % g 2 , % g 3
54 :
/ * g3 = o 3 + ( o 2 & 1 5 ) - ( g 2 / 4 ) * 2 - ( g 2 & 2 ) ? ( g 2 & 1 ) : 0 ;
o0 + = ( g 2 / 4 ) * 2 * /
srl % g 2 , 2 , % o 4
and % g 2 , 1 , % o 5
srl % g 2 , 1 , % g 2
add % o 4 , % o 4 , % o 4
and % o 5 , % g 2 , % o 5
and % o 2 , 0 x f , % o 2
add % o 0 , % o 4 , % o 0
sub % o 3 , % o 5 , % o 3
sub % o 2 , % o 4 , % o 2
ba f i x u p r e t l
add % o 2 , % o 3 , % g 3
55 :
/ * i = 2 7 - g 2 ;
g3 = ( o 2 & 1 ) + i / 4 * 2 + ! ( i & 3 ) ;
o0 - = i / 4 * 2 + 1 * /
neg % g 2
and % o 2 , 1 , % o 2
add % g 2 , 2 7 , % g 2
srl % g 2 , 2 , % o 5
andcc % g 2 , 3 , % g 0
mov 1 , % g 2
add % o 5 , % o 5 , % o 5
be,a 1 f
clr % g 2
1 : add % g 2 , % o 5 , % g 3
sub % o 0 , % g 3 , % o 0
ba f i x u p r e t l
add % g 3 , % o 2 , % g 3
.globl __copy_user_end
__copy_user_end :