2005-04-16 15:20:36 -07:00
/ * memcpy. S : S p a r c o p t i m i z e d m e m c p y a n d m e m m o v e c o d e
* Hand o p t i m i z e d f r o m G N U l i b c ' s m e m c p y a n d m e m m o v e
* Copyright ( C ) 1 9 9 1 ,1 9 9 6 F r e e S o f t w a r e F o u n d a t i o n
* Copyright ( C ) 1 9 9 5 L i n u s T o r v a l d s ( L i n u s . T o r v a l d s @helsinki.fi)
* Copyright ( C ) 1 9 9 6 D a v i d S . M i l l e r ( d a v e m @caip.rutgers.edu)
* Copyright ( C ) 1 9 9 6 E d d i e C . D o s t ( e c d @skynet.be)
* Copyright ( C ) 1 9 9 6 J a k u b J e l i n e k ( j j @sunsite.mff.cuni.cz)
* /
2011-10-19 15:15:58 -07:00
# define F U N C ( x ) \
2005-04-16 15:20:36 -07:00
.globl x; \
.type x,@function; \
2011-10-19 15:15:58 -07:00
.align 4 ; \
2005-04-16 15:20:36 -07:00
x :
/* 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 _ L A S T 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 ) \
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 ; \
std % t 0 , [ % d s t - ( o f f s e t ) - 0 x10 ] ; \
std % t 2 , [ % d s t - ( o f f s e t ) - 0 x08 ] ;
# 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 ] ;
/* Both these macros have to start with exactly the same insn */
# define R 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 x20 ] , % t 0 ; \
ldd [ % s r c - ( o f f s e t ) - 0 x18 ] , % 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 x08 ] , % t 6 ; \
st % t 0 , [ % d s t - ( o f f s e t ) - 0 x20 ] ; \
st % t 1 , [ % d s t - ( o f f s e t ) - 0 x1 c ] ; \
st % t 2 , [ % d s t - ( o f f s e t ) - 0 x18 ] ; \
st % t 3 , [ % d s t - ( o f f s e t ) - 0 x14 ] ; \
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 x0 c ] ; \
st % t 6 , [ % d s t - ( o f f s e t ) - 0 x08 ] ; \
st % t 7 , [ % d s t - ( o f f s e t ) - 0 x04 ] ;
# define R 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 x20 ] , % t 0 ; \
ldd [ % s r c - ( o f f s e t ) - 0 x18 ] , % 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 x08 ] , % t 6 ; \
std % t 0 , [ % d s t - ( o f f s e t ) - 0 x20 ] ; \
std % t 2 , [ % d s t - ( o f f s e t ) - 0 x18 ] ; \
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 x08 ] ;
# define R 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 x00 ] , % 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 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 ] ;
# define R 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 x00 ] , % 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 x00 ] ; \
stb % t 1 , [ % d s t + ( o f f s e t ) + 0 x01 ] ;
# define S M O V E _ 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 , p r e v , s h i l , s h i r , o f f s e t 2 ) \
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 ; \
srl % t 0 , s h i r , % t 5 ; \
srl % t 1 , s h i r , % t 6 ; \
sll % t 0 , s h i l , % t 0 ; \
or % t 5 , % p r e v , % t 5 ; \
sll % t 1 , s h i l , % p r e v ; \
or % t 6 , % t 0 , % t 0 ; \
srl % t 2 , s h i r , % t 1 ; \
srl % t 3 , s h i r , % t 6 ; \
sll % t 2 , s h i l , % t 2 ; \
or % t 1 , % p r e v , % t 1 ; \
std % t 4 , [ % d s t + ( o f f s e t ) + ( o f f s e t 2 ) - 0 x04 ] ; \
std % t 0 , [ % d s t + ( o f f s e t ) + ( o f f s e t 2 ) + 0 x04 ] ; \
sll % t 3 , s h i l , % p r e v ; \
or % t 6 , % t 2 , % t 4 ;
# define S M O V E _ 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 , p r e v , s h i l , s h i r , o f f s e t 2 ) \
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 ; \
srl % t 0 , s h i r , % t 4 ; \
srl % t 1 , s h i r , % t 5 ; \
sll % t 0 , s h i l , % t 6 ; \
or % t 4 , % p r e v , % t 0 ; \
sll % t 1 , s h i l , % p r e v ; \
or % t 5 , % t 6 , % t 1 ; \
srl % t 2 , s h i r , % t 4 ; \
srl % t 3 , s h i r , % t 5 ; \
sll % t 2 , s h i l , % t 6 ; \
or % t 4 , % p r e v , % t 2 ; \
sll % t 3 , s h i l , % p r e v ; \
or % t 5 , % t 6 , % t 3 ; \
std % t 0 , [ % d s t + ( o f f s e t ) + ( o f f s e t 2 ) + 0 x00 ] ; \
std % t 2 , [ % d s t + ( o f f s e t ) + ( o f f s e t 2 ) + 0 x08 ] ;
.text
.align 4
0 :
retl
nop ! O n l y b c o p y r e t u r n s h e r e a n d i t r e t u n s v o i d . . .
# ifdef _ _ K E R N E L _ _
FUNC( a m e m m o v e )
FUNC( _ _ m e m m o v e )
# endif
FUNC( m e m m o v e )
cmp % o 0 , % o 1
2011-10-19 15:31:55 -07:00
mov % o 0 , % g 7
2005-04-16 15:20:36 -07:00
bleu 9 f
sub % o 0 , % o 1 , % o 4
add % o 1 , % o 2 , % o 3
cmp % o 3 , % o 0
bleu 0 f
andcc % o 4 , 3 , % o 5
add % o 1 , % o 2 , % o 1
add % o 0 , % o 2 , % o 0
sub % o 1 , 1 , % o 1
sub % o 0 , 1 , % o 0
1 : /* reverse_bytes */
ldub [ % o 1 ] , % o 4
subcc % o 2 , 1 , % o 2
stb % o 4 , [ % o 0 ]
sub % o 1 , 1 , % o 1
bne 1 b
sub % o 0 , 1 , % o 0
retl
2011-10-19 15:31:55 -07:00
mov % g 7 , % o 0
2005-04-16 15:20:36 -07:00
/ * NOTE : This c o d e i s e x e c u t e d j u s t f o r t h e c a s e s ,
where % s r c ( = % o 1 ) & 3 i s ! = 0 .
We n e e d t o a l i g n i t t o 4 . S o , f o r ( % s r c & 3 )
1 we n e e d t o d o l d u b ,l d u h
2 lduh
3 just l d u b
so e v e n i f i t l o o k s w e i r d , t h e b r a n c h e s
are c o r r e c t h e r e . - j j
* /
78 : /* dword_align */
andcc % o 1 , 1 , % g 0
be 4 f
andcc % o 1 , 2 , % g 0
ldub [ % o 1 ] , % g 2
add % o 1 , 1 , % o 1
stb % g 2 , [ % o 0 ]
sub % o 2 , 1 , % o 2
bne 3 f
add % o 0 , 1 , % o 0
4 :
lduh [ % o 1 ] , % g 2
add % o 1 , 2 , % o 1
sth % g 2 , [ % o 0 ]
sub % o 2 , 2 , % o 2
b 3 f
add % o 0 , 2 , % o 0
FUNC( m e m c p y ) / * % o 0 =dst % o 1 =src % o 2 =len * /
sub % o 0 , % o 1 , % o 4
2011-10-19 15:31:55 -07:00
mov % o 0 , % g 7
2005-04-16 15:20:36 -07:00
9 :
andcc % o 4 , 3 , % o 5
0 :
bne 8 6 f
cmp % o 2 , 1 5
bleu 9 0 f
andcc % o 1 , 3 , % g 0
bne 7 8 b
3 :
andcc % o 1 , 4 , % g 0
be 2 f
mov % o 2 , % g 1
ld [ % o 1 ] , % o 4
sub % g 1 , 4 , % g 1
st % o 4 , [ % o 0 ]
add % o 1 , 4 , % o 1
add % o 0 , 4 , % o 0
2 :
2011-10-19 15:30:14 -07:00
andcc % g 1 , 0 x f f f f f f80 , % g 0
2005-04-16 15:20:36 -07:00
be 3 f
andcc % o 0 , 4 , % g 0
be 8 2 f + 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 )
2011-10-19 15:30:14 -07:00
sub % g 1 , 1 2 8 , % g 1
2005-04-16 15:20:36 -07:00
add % o 1 , 1 2 8 , % o 1
2011-10-19 15:30:14 -07:00
cmp % g 1 , 1 2 8
bge 5 b
2005-04-16 15:20:36 -07:00
add % o 0 , 1 2 8 , % o 0
3 :
2011-10-19 15:30:14 -07:00
andcc % g 1 , 0 x70 , % g 4
2005-04-16 15:20:36 -07:00
be 8 0 f
andcc % g 1 , 8 , % g 0
sethi % h i ( 8 0 f ) , % o 5
2011-10-19 15:30:14 -07:00
srl % g 4 , 1 , % o 4
add % g 4 , % o 4 , % o 4
add % o 1 , % g 4 , % o 1
2005-04-16 15:20:36 -07:00
sub % o 5 , % o 4 , % o 5
jmpl % o 5 + % l o ( 8 0 f ) , % g 0
2011-10-19 15:30:14 -07:00
add % o 0 , % g 4 , % o 0
2005-04-16 15:20:36 -07:00
79 : /* memcpy_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 )
80 : /* memcpy_table_end */
be 8 1 f
andcc % g 1 , 4 , % g 0
ldd [ % o 1 ] , % g 2
add % o 0 , 8 , % o 0
st % g 2 , [ % o 0 - 0 x08 ]
add % o 1 , 8 , % o 1
st % g 3 , [ % o 0 - 0 x04 ]
81 : /* memcpy_last7 */
be 1 f
andcc % g 1 , 2 , % g 0
ld [ % o 1 ] , % g 2
add % o 1 , 4 , % o 1
st % g 2 , [ % o 0 ]
add % o 0 , 4 , % o 0
1 :
be 1 f
andcc % g 1 , 1 , % g 0
lduh [ % o 1 ] , % g 2
add % o 1 , 2 , % o 1
sth % g 2 , [ % o 0 ]
add % o 0 , 2 , % o 0
1 :
be 1 f
nop
ldub [ % o 1 ] , % g 2
stb % g 2 , [ % o 0 ]
1 :
retl
2011-10-19 15:31:55 -07:00
mov % g 7 , % o 0
2005-04-16 15:20:36 -07:00
82 : /* 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 )
2011-10-19 15:30:14 -07:00
subcc % g 1 , 1 2 8 , % g 1
2005-04-16 15:20:36 -07:00
add % o 1 , 1 2 8 , % o 1
2011-10-19 15:30:14 -07:00
cmp % g 1 , 1 2 8
bge 8 2 b
2005-04-16 15:20:36 -07:00
add % o 0 , 1 2 8 , % o 0
2011-10-19 15:30:14 -07:00
andcc % g 1 , 0 x70 , % g 4
2005-04-16 15:20:36 -07:00
be 8 4 f
andcc % g 1 , 8 , % g 0
sethi % h i ( 8 4 f ) , % o 5
2011-10-19 15:30:14 -07:00
add % o 1 , % g 4 , % o 1
sub % o 5 , % g 4 , % o 5
2005-04-16 15:20:36 -07:00
jmpl % o 5 + % l o ( 8 4 f ) , % g 0
2011-10-19 15:30:14 -07:00
add % o 0 , % g 4 , % o 0
2005-04-16 15:20:36 -07:00
83 : /* amemcpy_table */
MOVE_ L A S T A L I G N C H U N K ( o 1 , o 0 , 0 x60 , g 2 , g 3 , g 4 , g 5 )
MOVE_ L A S T A L I G N C H U N K ( o 1 , o 0 , 0 x50 , g 2 , g 3 , g 4 , g 5 )
MOVE_ L A S T A L I G N C H U N K ( o 1 , o 0 , 0 x40 , g 2 , g 3 , g 4 , g 5 )
MOVE_ L A S T A L I G N C H U N K ( o 1 , o 0 , 0 x30 , g 2 , g 3 , g 4 , g 5 )
MOVE_ L A S T A L I G N C H U N K ( o 1 , o 0 , 0 x20 , g 2 , g 3 , g 4 , g 5 )
MOVE_ L A S T A L I G N C H U N K ( o 1 , o 0 , 0 x10 , g 2 , g 3 , g 4 , g 5 )
MOVE_ L A S T A L I G N C H U N K ( o 1 , o 0 , 0 x00 , g 2 , g 3 , g 4 , g 5 )
84 : /* amemcpy_table_end */
be 8 5 f
andcc % g 1 , 4 , % g 0
ldd [ % o 1 ] , % g 2
add % o 0 , 8 , % o 0
std % g 2 , [ % o 0 - 0 x08 ]
add % o 1 , 8 , % o 1
85 : /* amemcpy_last7 */
be 1 f
andcc % g 1 , 2 , % g 0
ld [ % o 1 ] , % g 2
add % o 1 , 4 , % o 1
st % g 2 , [ % o 0 ]
add % o 0 , 4 , % o 0
1 :
be 1 f
andcc % g 1 , 1 , % g 0
lduh [ % o 1 ] , % g 2
add % o 1 , 2 , % o 1
sth % g 2 , [ % o 0 ]
add % o 0 , 2 , % o 0
1 :
be 1 f
nop
ldub [ % o 1 ] , % g 2
stb % g 2 , [ % o 0 ]
1 :
retl
2011-10-19 15:31:55 -07:00
mov % g 7 , % o 0
2005-04-16 15:20:36 -07:00
86 : /* non_aligned */
cmp % o 2 , 6
bleu 8 8 f
2011-10-19 15:30:14 -07:00
nop
save % s p , - 9 6 , % s p
andcc % i 0 , 3 , % g 0
2005-04-16 15:20:36 -07:00
be 6 1 f
2011-10-19 15:30:14 -07:00
andcc % i 0 , 1 , % g 0
2005-04-16 15:20:36 -07:00
be 6 0 f
2011-10-19 15:30:14 -07:00
andcc % i 0 , 2 , % g 0
2005-04-16 15:20:36 -07:00
2011-10-19 15:30:14 -07:00
ldub [ % i 1 ] , % g 5
add % i 1 , 1 , % i 1
stb % g 5 , [ % i 0 ]
sub % i 2 , 1 , % i 2
2005-04-16 15:20:36 -07:00
bne 6 1 f
2011-10-19 15:30:14 -07:00
add % i 0 , 1 , % i 0
2005-04-16 15:20:36 -07:00
60 :
2011-10-19 15:30:14 -07:00
ldub [ % i 1 ] , % g 3
add % i 1 , 2 , % i 1
stb % g 3 , [ % i 0 ]
sub % i 2 , 2 , % i 2
ldub [ % i 1 - 1 ] , % g 3
add % i 0 , 2 , % i 0
stb % g 3 , [ % i 0 - 1 ]
2005-04-16 15:20:36 -07:00
61 :
2011-10-19 15:30:14 -07:00
and % i 1 , 3 , % g 2
and % i 2 , 0 x c , % g 3
and % i 1 , - 4 , % i 1
2005-04-16 15:20:36 -07:00
cmp % g 3 , 4
sll % g 2 , 3 , % g 4
mov 3 2 , % g 2
be 4 f
2011-10-19 15:30:14 -07:00
sub % g 2 , % g 4 , % l 0
2005-04-16 15:20:36 -07:00
blu 3 f
cmp % g 3 , 0 x8
be 2 f
2011-10-19 15:30:14 -07:00
srl % i 2 , 2 , % g 3
2005-04-16 15:20:36 -07:00
2011-10-19 15:30:14 -07:00
ld [ % i 1 ] , % i 3
add % i 0 , - 8 , % i 0
ld [ % i 1 + 4 ] , % i 4
2005-04-16 15:20:36 -07:00
b 8 f
add % g 3 , 1 , % g 3
2 :
2011-10-19 15:30:14 -07:00
ld [ % i 1 ] , % i 4
add % i 0 , - 1 2 , % i 0
ld [ % i 1 + 4 ] , % i 5
2005-04-16 15:20:36 -07:00
add % g 3 , 2 , % g 3
b 9 f
2011-10-19 15:30:14 -07:00
add % i 1 , - 4 , % i 1
2005-04-16 15:20:36 -07:00
3 :
2011-10-19 15:30:14 -07:00
ld [ % i 1 ] , % g 1
add % i 0 , - 4 , % i 0
ld [ % i 1 + 4 ] , % i 3
srl % i 2 , 2 , % g 3
2005-04-16 15:20:36 -07:00
b 7 f
2011-10-19 15:30:14 -07:00
add % i 1 , 4 , % i 1
2005-04-16 15:20:36 -07:00
4 :
2011-10-19 15:30:14 -07:00
ld [ % i 1 ] , % i 5
cmp % i 2 , 7
ld [ % i 1 + 4 ] , % g 1
srl % i 2 , 2 , % g 3
2005-04-16 15:20:36 -07:00
bleu 1 0 f
2011-10-19 15:30:14 -07:00
add % i 1 , 8 , % i 1
2005-04-16 15:20:36 -07:00
2011-10-19 15:30:14 -07:00
ld [ % i 1 ] , % i 3
2005-04-16 15:20:36 -07:00
add % g 3 , - 1 , % g 3
5 :
2011-10-19 15:30:14 -07:00
sll % i 5 , % g 4 , % g 2
srl % g 1 , % l 0 , % g 5
2005-04-16 15:20:36 -07:00
or % g 2 , % g 5 , % g 2
2011-10-19 15:30:14 -07:00
st % g 2 , [ % i 0 ]
2005-04-16 15:20:36 -07:00
7 :
2011-10-19 15:30:14 -07:00
ld [ % i 1 + 4 ] , % i 4
2005-04-16 15:20:36 -07:00
sll % g 1 , % g 4 , % g 2
2011-10-19 15:30:14 -07:00
srl % i 3 , % l 0 , % g 5
2005-04-16 15:20:36 -07:00
or % g 2 , % g 5 , % g 2
2011-10-19 15:30:14 -07:00
st % g 2 , [ % i 0 + 4 ]
2005-04-16 15:20:36 -07:00
8 :
2011-10-19 15:30:14 -07:00
ld [ % i 1 + 8 ] , % i 5
sll % i 3 , % g 4 , % g 2
srl % i 4 , % l 0 , % g 5
2005-04-16 15:20:36 -07:00
or % g 2 , % g 5 , % g 2
2011-10-19 15:30:14 -07:00
st % g 2 , [ % i 0 + 8 ]
2005-04-16 15:20:36 -07:00
9 :
2011-10-19 15:30:14 -07:00
ld [ % i 1 + 1 2 ] , % g 1
sll % i 4 , % g 4 , % g 2
srl % i 5 , % l 0 , % g 5
2005-04-16 15:20:36 -07:00
addcc % g 3 , - 4 , % g 3
or % g 2 , % g 5 , % g 2
2011-10-19 15:30:14 -07:00
add % i 1 , 1 6 , % i 1
st % g 2 , [ % i 0 + 1 2 ]
add % i 0 , 1 6 , % i 0
2005-04-16 15:20:36 -07:00
bne,a 5 b
2011-10-19 15:30:14 -07:00
ld [ % i 1 ] , % i 3
2005-04-16 15:20:36 -07:00
10 :
2011-10-19 15:30:14 -07:00
sll % i 5 , % g 4 , % g 2
srl % g 1 , % l 0 , % g 5
srl % l 0 , 3 , % g 3
2005-04-16 15:20:36 -07:00
or % g 2 , % g 5 , % g 2
2011-10-19 15:30:14 -07:00
sub % i 1 , % g 3 , % i 1
andcc % i 2 , 2 , % g 0
st % g 2 , [ % i 0 ]
2005-04-16 15:20:36 -07:00
be 1 f
2011-10-19 15:30:14 -07:00
andcc % i 2 , 1 , % g 0
ldub [ % i 1 ] , % g 2
add % i 1 , 2 , % i 1
stb % g 2 , [ % i 0 + 4 ]
add % i 0 , 2 , % i 0
ldub [ % i 1 - 1 ] , % g 2
stb % g 2 , [ % i 0 + 3 ]
2005-04-16 15:20:36 -07:00
1 :
be 1 f
nop
2011-10-19 15:30:14 -07:00
ldub [ % i 1 ] , % g 2
stb % g 2 , [ % i 0 + 4 ]
2005-04-16 15:20:36 -07:00
1 :
2011-10-19 15:30:14 -07:00
ret
2011-10-19 15:31:55 -07:00
restore % g 7 , % g 0 , % o 0
2005-04-16 15:20:36 -07:00
88 : /* short_end */
and % o 2 , 0 x e , % o 3
20 :
sethi % h i ( 8 9 f ) , % 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 ( 8 9 f ) , % g 0
andcc % o 2 , 1 , % g 0
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 )
89 : /* short_table_end */
be 1 f
nop
ldub [ % o 1 ] , % g 2
stb % g 2 , [ % o 0 ]
1 :
retl
2011-10-19 15:31:55 -07:00
mov % g 7 , % o 0
2005-04-16 15:20:36 -07:00
90 : /* short_aligned_end */
bne 8 8 b
andcc % o 2 , 8 , % g 0
be 1 f
andcc % o 2 , 4 , % g 0
ld [ % o 1 + 0 x00 ] , % g 2
ld [ % o 1 + 0 x04 ] , % g 3
add % o 1 , 8 , % o 1
st % g 2 , [ % o 0 + 0 x00 ]
st % g 3 , [ % o 0 + 0 x04 ]
add % o 0 , 8 , % o 0
1 :
b 8 1 b
mov % o 2 , % g 1