2008-05-20 03:53:02 +04:00
/ *
2005-04-17 02:20:36 +04:00
* mul. S : T h i s r o u t i n e w a s t a k e n f r o m g l i b c - 1 . 0 9 a n d i s c o v e r e d
* by t h e G N U L i b r a r y G e n e r a l P u b l i c L i c e n s e V e r s i o n 2 .
* /
/ *
* Signed m u l t i p l y , f r o m A p p e n d i x E o f t h e S p a r c V e r s i o n 8
* Architecture M a n u a l .
* /
/ *
* Returns % o 0 * % o 1 i n % o 1 % o 0 ( i . e . , % o 1 h o l d s t h e u p p e r 3 2 b i t s o f
* the 6 4 - b i t p r o d u c t ) .
*
* This c o d e o p t i m i z e s s h o r t ( l e s s t h a n 1 3 - b i t ) m u l t i p l i e s .
* /
.globl .mul
2005-09-12 07:14:07 +04:00
.globl _Mul
2005-04-17 02:20:36 +04:00
.mul :
2005-09-12 07:14:07 +04:00
_Mul : /* needed for export */
2005-04-17 02:20:36 +04:00
mov % o 0 , % y ! m u l t i p l i e r - > Y
andncc % o 0 , 0 x f f f , % g 0 ! t e s t b i t s 1 2 . . 3 1
be L m u l _ s h o r t w a y ! i f z e r o , c a n d o i t t h e s h o r t w a y
andcc % g 0 , % g 0 , % o 4 ! z e r o t h e p a r t i a l p r o d u c t a n d c l e a r N a n d V
/ *
* Long m u l t i p l y . 3 2 s t e p s , f o l l o w e d b y a f i n a l s h i f t s t e p .
* /
mulscc % o 4 , % o 1 , % o 4 ! 1
mulscc % o 4 , % o 1 , % o 4 ! 2
mulscc % o 4 , % o 1 , % o 4 ! 3
mulscc % o 4 , % o 1 , % o 4 ! 4
mulscc % o 4 , % o 1 , % o 4 ! 5
mulscc % o 4 , % o 1 , % o 4 ! 6
mulscc % o 4 , % o 1 , % o 4 ! 7
mulscc % o 4 , % o 1 , % o 4 ! 8
mulscc % o 4 , % o 1 , % o 4 ! 9
mulscc % o 4 , % o 1 , % o 4 ! 1 0
mulscc % o 4 , % o 1 , % o 4 ! 1 1
mulscc % o 4 , % o 1 , % o 4 ! 1 2
mulscc % o 4 , % o 1 , % o 4 ! 1 3
mulscc % o 4 , % o 1 , % o 4 ! 1 4
mulscc % o 4 , % o 1 , % o 4 ! 1 5
mulscc % o 4 , % o 1 , % o 4 ! 1 6
mulscc % o 4 , % o 1 , % o 4 ! 1 7
mulscc % o 4 , % o 1 , % o 4 ! 1 8
mulscc % o 4 , % o 1 , % o 4 ! 1 9
mulscc % o 4 , % o 1 , % o 4 ! 2 0
mulscc % o 4 , % o 1 , % o 4 ! 2 1
mulscc % o 4 , % o 1 , % o 4 ! 2 2
mulscc % o 4 , % o 1 , % o 4 ! 2 3
mulscc % o 4 , % o 1 , % o 4 ! 2 4
mulscc % o 4 , % o 1 , % o 4 ! 2 5
mulscc % o 4 , % o 1 , % o 4 ! 2 6
mulscc % o 4 , % o 1 , % o 4 ! 2 7
mulscc % o 4 , % o 1 , % o 4 ! 2 8
mulscc % o 4 , % o 1 , % o 4 ! 2 9
mulscc % o 4 , % o 1 , % o 4 ! 3 0
mulscc % o 4 , % o 1 , % o 4 ! 3 1
mulscc % o 4 , % o 1 , % o 4 ! 3 2
mulscc % o 4 , % g 0 , % o 4 ! f i n a l s h i f t
! If % o 0 w a s n e g a t i v e , t h e r e s u l t i s
! ( % o0 * % o 1 ) + ( % o 1 < < 3 2 ) )
! We f i x t h a t h e r e .
# if 0
tst % o 0
bge 1 f
rd % y , % o 0
! % o0 w a s i n d e e d n e g a t i v e ; fix upper 32 bits of result by subtracting
! % o1 ( i . e . , r e t u r n % o 4 - % o 1 i n % o 1 ) .
retl
sub % o 4 , % o 1 , % o 1
1 :
retl
mov % o 4 , % o 1
# else
/* Faster code adapted from tege@sics.se's code for umul.S. */
sra % o 0 , 3 1 , % o 2 ! m a k e m a s k f r o m s i g n b i t
and % o 1 , % o 2 , % o 2 ! % o 2 = 0 o r % o 1 , d e p e n d i n g o n s i g n o f % o 0
rd % y , % o 0 ! g e t l o w e r h a l f o f p r o d u c t
retl
sub % o 4 , % o 2 , % o 1 ! s u b t r a c t c o m p e n s a t i o n
! and p u t u p p e r h a l f i n p l a c e
# endif
Lmul_shortway :
/ *
* Short m u l t i p l y . 1 2 s t e p s , f o l l o w e d b y a f i n a l s h i f t s t e p .
* The r e s u l t i n g b i t s a r e o f f b y 1 2 a n d ( 3 2 - 1 2 ) = 2 0 b i t p o s i t i o n s ,
* but t h e r e i s n o p r o b l e m w i t h % o 0 b e i n g n e g a t i v e ( u n l i k e a b o v e ) .
* /
mulscc % o 4 , % o 1 , % o 4 ! 1
mulscc % o 4 , % o 1 , % o 4 ! 2
mulscc % o 4 , % o 1 , % o 4 ! 3
mulscc % o 4 , % o 1 , % o 4 ! 4
mulscc % o 4 , % o 1 , % o 4 ! 5
mulscc % o 4 , % o 1 , % o 4 ! 6
mulscc % o 4 , % o 1 , % o 4 ! 7
mulscc % o 4 , % o 1 , % o 4 ! 8
mulscc % o 4 , % o 1 , % o 4 ! 9
mulscc % o 4 , % o 1 , % o 4 ! 1 0
mulscc % o 4 , % o 1 , % o 4 ! 1 1
mulscc % o 4 , % o 1 , % o 4 ! 1 2
mulscc % o 4 , % g 0 , % o 4 ! f i n a l s h i f t
/ *
* % o4 h a s 2 0 o f t h e b i t s t h a t s h o u l d b e i n t h e l o w p a r t o f t h e
* result; %y has the bottom 12 (as %y's top 12). That is:
*
* % o4 % y
* + - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - +
* | - 1 2 - | - 2 0 - | - 1 2 - | - 2 0 - |
* + - - - - - - ( - - - - - - - - - + - - - - - - ) - - - - - - - - - +
* - - hi- - - - - - l o w - p a r t - - - -
*
* The u p p e r 1 2 b i t s o f % o 4 s h o u l d b e s i g n - e x t e n d e d t o f o r m t h e
* high p a r t o f t h e p r o d u c t ( i . e . , h i g h p a r t = % o 4 > > 2 0 ) .
* /
rd % y , % o 5
sll % o 4 , 1 2 , % o 0 ! s h i f t m i d d l e b i t s l e f t 1 2
srl % o 5 , 2 0 , % o 5 ! s h i f t l o w b i t s r i g h t 2 0 , z e r o f i l l a t l e f t
or % o 5 , % o 0 , % o 0 ! c o n s t r u c t l o w p a r t o f r e s u l t
retl
sra % o 4 , 2 0 , % o 1 ! . . . a n d e x t r a c t h i g h p a r t o f r e s u l t
.globl .mul_patch
.mul_patch :
smul % o 0 , % o 1 , % o 0
retl
rd % y , % o 1
nop