2005-04-17 02:20:36 +04:00
|
| bindec. s a 3 . 4 1 / 3 / 9 1
|
| bindec
|
| Description :
| Converts a n i n p u t i n e x t e n d e d p r e c i s i o n f o r m a t
| to b c d f o r m a t .
|
| Input :
| a0 p o i n t s t o t h e i n p u t e x t e n d e d p r e c i s i o n v a l u e
| value i n m e m o r y ; d0 contains the k-factor sign-extended
| to 3 2 - b i t s . T h e i n p u t m a y b e e i t h e r n o r m a l i z e d ,
| unnormalized, o r d e n o r m a l i z e d .
|
| Output : result i n t h e F P _ S C R 1 s p a c e o n t h e s t a c k .
|
| Saves a n d M o d i f i e s : D 2 - D 7 ,A 2 ,F P 2
|
| Algorithm :
|
| A1 . S e t R M a n d s i z e e x t ; Set SIGMA = sign of input.
| The k - f a c t o r i s s a v e d f o r u s e i n d7 . C l e a r t h e
| BINDEC_ F L G f o r s e p a r a t i n g n o r m a l i z e d / d e n o r m a l i z e d
| input. I f i n p u t i s u n n o r m a l i z e d o r d e n o r m a l i z e d ,
| normalize i t .
|
| A2 . S e t X = a b s ( i n p u t ) .
|
| A3 . C o m p u t e I L O G .
| ILOG i s t h e l o g b a s e 1 0 o f t h e i n p u t v a l u e . I t i s
| approximated b y a d d i n g e + 0 . f w h e n t h e o r i g i n a l
| value i s v i e w e d a s 2 ^ ^ e * 1 . f i n e x t e n d e d p r e c i s i o n .
| This v a l u e i s s t o r e d i n d6 .
|
| A4 . C l r I N E X b i t .
| The o p e r a t i o n i n A 3 a b o v e m a y h a v e s e t I N E X 2 .
|
| A5 . S e t I C T R = 0 ;
| ICTR i s a f l a g u s e d i n A 1 3 . I t m u s t b e s e t b e f o r e t h e
| loop e n t r y A 6 .
|
| A6 . C a l c u l a t e L E N .
| LEN i s t h e n u m b e r o f d i g i t s t o b e d i s p l a y e d . T h e
| k- f a c t o r c a n d i c t a t e e i t h e r t h e t o t a l n u m b e r o f d i g i t s ,
| if i t i s a p o s i t i v e n u m b e r , o r t h e n u m b e r o f d i g i t s
| after t h e d e c i m a l p o i n t w h i c h a r e t o b e i n c l u d e d a s
| significant. S e e t h e 6 8 8 8 2 m a n u a l f o r e x a m p l e s .
| If L E N i s c o m p u t e d t o b e g r e a t e r t h a n 1 7 , s e t O P E R R i n
| USER_ F P S R . L E N i s s t o r e d i n d4 .
|
| A7 . C a l c u l a t e S C A L E .
| SCALE i s e q u a l t o 1 0 ^ I S C A L E , w h e r e I S C A L E i s t h e n u m b e r
| of d e c i m a l p l a c e s n e e d e d t o i n s u r e L E N i n t e g e r d i g i t s
| in t h e o u t p u t b e f o r e c o n v e r s i o n t o b c d . L A M B D A i s t h e
| sign o f I S C A L E , u s e d i n A 9 . F p1 c o n t a i n s
| 1 0 ^ ^ ( abs( I S C A L E ) ) u s i n g a r o u n d i n g m o d e w h i c h i s a
| function o f t h e o r i g i n a l r o u n d i n g m o d e a n d t h e s i g n s
| of I S C A L E a n d X . A t a b l e i s g i v e n i n t h e c o d e .
|
| A8 . C l r I N E X ; Force RZ.
| The o p e r a t i o n i n A 3 a b o v e m a y h a v e s e t I N E X 2 .
| RZ m o d e i s f o r c e d f o r t h e s c a l i n g o p e r a t i o n t o i n s u r e
| only o n e r o u n d i n g e r r o r . T h e g r s b i t s a r e c o l l e c t e d i n
| the I N E X f l a g f o r u s e i n A 1 0 .
|
| A9 . S c a l e X - > Y .
| The m a n t i s s a i s s c a l e d t o t h e d e s i r e d n u m b e r o f
| significant d i g i t s . T h e e x c e s s d i g i t s a r e c o l l e c t e d
| in I N E X 2 .
|
| A1 0 . O r i n I N E X .
| If I N E X i s s e t , r o u n d e r r o r o c c u r r e d . T h i s i s
| compensated f o r b y ' o r - i n g ' i n t h e I N E X 2 f l a g t o
| the l s b o f Y .
|
| A1 1 . R e s t o r e o r i g i n a l F P C R ; set size ext.
| Perform F I N T o p e r a t i o n i n t h e u s e r ' s r o u n d i n g m o d e .
| Keep t h e s i z e t o e x t e n d e d .
|
| A1 2 . C a l c u l a t e Y I N T = F I N T ( Y ) a c c o r d i n g t o u s e r ' s r o u n d i n g
| mode. T h e F P S P r o u t i n e s i n t d0 i s u s e d . T h e o u t p u t
| is i n f p0 .
|
| A1 3 . C h e c k f o r L E N d i g i t s .
| If t h e i n t o p e r a t i o n r e s u l t s i n m o r e t h a n L E N d i g i t s ,
| or l e s s t h a n L E N - 1 d i g i t s , a d j u s t I L O G a n d r e p e a t f r o m
| A6 . T h i s t e s t o c c u r s o n l y o n t h e f i r s t p a s s . I f t h e
| result i s e x a c t l y 1 0 ^ L E N , d e c r e m e n t I L O G a n d d i v i d e
| the m a n t i s s a b y 1 0 .
|
| A1 4 . C o n v e r t t h e m a n t i s s a t o b c d .
| The b i n s t r r o u t i n e i s u s e d t o c o n v e r t t h e L E N d i g i t
| mantissa t o b c d i n m e m o r y . T h e i n p u t t o b i n s t r i s
| to b e a f r a c t i o n ; i.e. (mantissa)/10^LEN and adjusted
| such t h a t t h e d e c i m a l p o i n t i s t o t h e l e f t o f b i t 6 3 .
| The b c d d i g i t s a r e s t o r e d i n t h e c o r r e c t p o s i t i o n i n
| the f i n a l s t r i n g a r e a i n m e m o r y .
|
| A1 5 . C o n v e r t t h e e x p o n e n t t o b c d .
| As i n A 1 4 a b o v e , t h e e x p i s c o n v e r t e d t o b c d a n d t h e
| digits a r e s t o r e d i n t h e f i n a l s t r i n g .
| Test t h e l e n g t h o f t h e f i n a l e x p o n e n t s t r i n g . I f t h e
| length i s 4 , s e t o p e r r .
|
| A1 6 . W r i t e s i g n b i t s t o f i n a l s t r i n g .
|
| Implementation N o t e s :
|
| The r e g i s t e r s a r e u s e d a s f o l l o w s :
|
| d0 : scratch; LEN input to binstr
| d1 : scratch
| d2 : upper 3 2 - b i t s o f m a n t i s s a f o r b i n s t r
| d3 : scratch;lower 32-bits of mantissa for binstr
| d4 : LEN
| d5 : LAMBDA/ I C T R
| d6 : ILOG
| d7 : k- f a c t o r
| a0 : ptr f o r o r i g i n a l o p e r a n d / f i n a l r e s u l t
| a1 : scratch p o i n t e r
| a2 : pointer t o F P _ X ; abs(original value) in ext
| fp0 : scratch
| fp1 : scratch
| fp2 : scratch
| F_SCR1 :
| F_SCR2 :
| L_SCR1 :
| L_SCR2 :
| Copyright ( C ) M o t o r o l a , I n c . 1 9 9 0
| All R i g h t s R e s e r v e d
|
2006-02-12 04:55:48 +03:00
| For d e t a i l s o n t h e l i c e n s e f o r t h i s f i l e , p l e a s e s e e t h e
| file, R E A D M E , i n t h i s s a m e d i r e c t o r y .
2005-04-17 02:20:36 +04:00
| BINDEC i d n t 2 ,1 | M o t o r o l a 0 4 0 F l o a t i n g P o i n t S o f t w a r e P a c k a g e
# include " f p s p . h "
| section 8
| Constants i n e x t e n d e d p r e c i s i o n
LOG2 : .long 0x3FFD0000 , 0 x9 A 2 0 9 A 8 4 ,0 x F B C F F 7 9 8 ,0 x00 0 0 0 0 0 0
LOG2UP1 : .long 0x3FFD0000 , 0 x9 A 2 0 9 A 8 4 ,0 x F B C F F 7 9 9 ,0 x00 0 0 0 0 0 0
| Constants i n s i n g l e p r e c i s i o n
FONE : .long 0x3F800000 , 0 x0 0 0 0 0 0 0 0 ,0 x00 0 0 0 0 0 0 ,0 x00 0 0 0 0 0 0
FTWO : .long 0x40000000 , 0 x0 0 0 0 0 0 0 0 ,0 x00 0 0 0 0 0 0 ,0 x00 0 0 0 0 0 0
FTEN : .long 0x41200000 , 0 x0 0 0 0 0 0 0 0 ,0 x00 0 0 0 0 0 0 ,0 x00 0 0 0 0 0 0
F4933 : .long 0x459A2800 , 0 x0 0 0 0 0 0 0 0 ,0 x00 0 0 0 0 0 0 ,0 x00 0 0 0 0 0 0
RBDTBL : .byte 0 , 0 , 0 , 0
.byte 3 , 3 , 2 , 2
.byte 3 , 2 , 2 , 3
.byte 2 , 3 , 3 , 2
| xref b i n s t r
| xref s i n t d o
| xref p t e n r n ,p t e n r m ,p t e n r p
.global bindec
.global sc_mul
bindec :
moveml % d2 - % d7 / % a2 ,- ( % a7 )
fmovemx % f p0 - % f p2 ,- ( % a7 )
| A1 . S e t R M a n d s i z e e x t . S e t S I G M A = s i g n i n p u t ;
| The k - f a c t o r i s s a v e d f o r u s e i n d7 . C l e a r B I N D E C _ F L G f o r
| separating n o r m a l i z e d / d e n o r m a l i z e d i n p u t . I f t h e i n p u t
| is a d e n o r m a l i z e d n u m b e r , s e t t h e B I N D E C _ F L G m e m o r y w o r d
| to s i g n a l d e n o r m . I f t h e i n p u t i s u n n o r m a l i z e d , n o r m a l i z e
| the i n p u t a n d t e s t f o r d e n o r m a l i z e d r e s u l t .
|
fmovel #r m _ m o d e , % F P C R | s e t R M a n d e x t
movel ( % a0 ) ,L _ S C R 2 ( % a6 ) | s a v e e x p o n e n t f o r s i g n c h e c k
movel % d0 ,% d7 | m o v e k - f a c t o r t o d7
clrb B I N D E C _ F L G ( % a6 ) | c l r n o r m / d e n o r m f l a g
movew S T A G ( % a6 ) ,% d0 | g e t s t a g
andiw #0xe000 ,% d0 | i s o l a t e s t a g b i t s
beq A 2 _ s t r | i f z e r o , i n p u t i s n o r m
|
| Normalize t h e d e n o r m
|
un_de_norm :
movew ( % a0 ) ,% d0
andiw #0x7fff ,% d0 | s t r i p s i g n o f n o r m a l i z e d e x p
movel 4 ( % a0 ) ,% d1
movel 8 ( % a0 ) ,% d2
norm_loop :
subw #1 ,% d0
lsll #1 ,% d2
roxll #1 ,% d1
tstl % d1
bges n o r m _ l o o p
|
| Test i f t h e n o r m a l i z e d i n p u t i s d e n o r m a l i z e d
|
tstw % d0
bgts p o s _ e x p | i f g r e a t e r t h a n z e r o , i t i s a n o r m
st B I N D E C _ F L G ( % a6 ) | s e t f l a g f o r d e n o r m
pos_exp :
andiw #0x7fff ,% d0 | s t r i p s i g n o f n o r m a l i z e d e x p
movew % d0 ,( % a0 )
movel % d1 ,4 ( % a0 )
movel % d2 ,8 ( % a0 )
| A2 . S e t X = a b s ( i n p u t ) .
|
A2_str :
movel ( % a0 ) ,F P _ S C R 2 ( % a6 ) | m o v e i n p u t t o w o r k s p a c e
movel 4 ( % a0 ) ,F P _ S C R 2 + 4 ( % a6 ) | m o v e i n p u t t o w o r k s p a c e
movel 8 ( % a0 ) ,F P _ S C R 2 + 8 ( % a6 ) | m o v e i n p u t t o w o r k s p a c e
andil #0x7fffffff ,F P _ S C R 2 ( % a6 ) | c r e a t e a b s ( X )
| A3 . C o m p u t e I L O G .
| ILOG i s t h e l o g b a s e 1 0 o f t h e i n p u t v a l u e . I t i s a p p r o x -
| imated b y a d d i n g e + 0 . f w h e n t h e o r i g i n a l v a l u e i s v i e w e d
| as 2 ^ ^ e * 1 . f i n e x t e n d e d p r e c i s i o n . T h i s v a l u e i s s t o r e d
| in d6 .
|
| Register u s a g e :
| Input/ O u t p u t
| d0 : k- f a c t o r / e x p o n e n t
| d2 : x/ x
| d3 : x/ x
| d4 : x/ x
| d5 : x/ x
| d6 : x/ I L O G
| d7 : k- f a c t o r / U n c h a n g e d
| a0 : ptr f o r o r i g i n a l o p e r a n d / f i n a l r e s u l t
| a1 : x/ x
| a2 : x/ x
| fp0 : x/ f l o a t ( I L O G )
| fp1 : x/ x
| fp2 : x/ x
| F_SCR1 : x/ x
| F_SCR2 : Abs( X ) / A b s ( X ) w i t h $ 3 f f f e x p o n e n t
| L_SCR1 : x/ x
| L_SCR2 : first w o r d o f X p a c k e d / U n c h a n g e d
tstb B I N D E C _ F L G ( % a6 ) | c h e c k f o r d e n o r m
beqs A 3 _ c o n t | i f c l r , c o n t i n u e w i t h n o r m
movel #- 4933 ,% d6 | f o r c e I L O G = - 4 9 3 3
bras A 4 _ s t r
A3_cont :
movew F P _ S C R 2 ( % a6 ) ,% d0 | m o v e e x p t o d0
movew #0x3fff ,F P _ S C R 2 ( % a6 ) | r e p l a c e e x p o n e n t w i t h 0 x3 f f f
fmovex F P _ S C R 2 ( % a6 ) ,% f p0 | n o w f p0 h a s 1 . f
subw #0x3fff ,% d0 | s t r i p o f f b i a s
faddw % d0 ,% f p0 | a d d i n e x p
fsubs F O N E ,% f p0 | s u b t r a c t o f f 1 . 0
fbge p o s _ r e s | i f p o s , b r a n c h
fmulx L O G 2 U P 1 ,% f p0 | i f n e g , m u l b y L O G 2 U P 1
fmovel % f p0 ,% d6 | p u t I L O G i n d6 a s a l w o r d
bras A 4 _ s t r | g o m o v e o u t I L O G
pos_res :
fmulx L O G 2 ,% f p0 | i f p o s , m u l b y L O G 2
fmovel % f p0 ,% d6 | p u t I L O G i n d6 a s a l w o r d
| A4 . C l r I N E X b i t .
| The o p e r a t i o n i n A 3 a b o v e m a y h a v e s e t I N E X 2 .
A4_str :
fmovel #0 ,% F P S R | z e r o a l l o f f p s r - n o t h i n g n e e d e d
| A5 . S e t I C T R = 0 ;
| ICTR i s a f l a g u s e d i n A 1 3 . I t m u s t b e s e t b e f o r e t h e
| loop e n t r y A 6 . T h e l o w e r w o r d o f d5 i s u s e d f o r I C T R .
clrw % d5 | c l e a r I C T R
| A6 . C a l c u l a t e L E N .
| LEN i s t h e n u m b e r o f d i g i t s t o b e d i s p l a y e d . T h e k - f a c t o r
| can d i c t a t e e i t h e r t h e t o t a l n u m b e r o f d i g i t s , i f i t i s
| a p o s i t i v e n u m b e r , o r t h e n u m b e r o f d i g i t s a f t e r t h e
| original d e c i m a l p o i n t w h i c h a r e t o b e i n c l u d e d a s
| significant. S e e t h e 6 8 8 8 2 m a n u a l f o r e x a m p l e s .
| If L E N i s c o m p u t e d t o b e g r e a t e r t h a n 1 7 , s e t O P E R R i n
| USER_ F P S R . L E N i s s t o r e d i n d4 .
|
| Register u s a g e :
| Input/ O u t p u t
| d0 : exponent/ U n c h a n g e d
| d2 : x/ x / s c r a t c h
| d3 : x/ x
| d4 : exc p i c t u r e / L E N
| d5 : ICTR/ U n c h a n g e d
| d6 : ILOG/ U n c h a n g e d
| d7 : k- f a c t o r / U n c h a n g e d
| a0 : ptr f o r o r i g i n a l o p e r a n d / f i n a l r e s u l t
| a1 : x/ x
| a2 : x/ x
| fp0 : float( I L O G ) / U n c h a n g e d
| fp1 : x/ x
| fp2 : x/ x
| F_SCR1 : x/ x
| F_SCR2 : Abs( X ) w i t h $ 3 f f f e x p o n e n t / U n c h a n g e d
| L_SCR1 : x/ x
| L_SCR2 : first w o r d o f X p a c k e d / U n c h a n g e d
A6_str :
tstl % d7 | b r a n c h o n s i g n o f k
bles k _ n e g | i f k < = 0 , L E N = I L O G + 1 - k
movel % d7 ,% d4 | i f k > 0 , L E N = k
bras l e n _ c k | s k i p t o L E N c h e c k
k_neg :
movel % d6 ,% d4 | f i r s t l o a d I L O G t o d4
subl % d7 ,% d4 | s u b t r a c t o f f k
addql #1 ,% d4 | a d d i n t h e 1
len_ck :
tstl % d4 | L E N c h e c k : b r a n c h o n s i g n o f L E N
bles L E N _ n g | i f n e g , s e t L E N = 1
cmpl #17 ,% d4 | t e s t i f L E N > 1 7
bles A 7 _ s t r | i f n o t , f o r g e t i t
movel #17 ,% d4 | s e t m a x L E N = 1 7
tstl % d7 | i f n e g a t i v e , n e v e r s e t O P E R R
bles A 7 _ s t r | i f p o s i t i v e , c o n t i n u e
orl #o p a o p _ m a s k , U S E R _ F P S R ( % a 6 ) | s e t O P E R R & A I O P i n U S E R _ F P S R
bras A 7 _ s t r | f i n i s h e d h e r e
LEN_ng :
moveql #1 ,% d4 | m i n L E N i s 1
| A7 . C a l c u l a t e S C A L E .
| SCALE i s e q u a l t o 1 0 ^ I S C A L E , w h e r e I S C A L E i s t h e n u m b e r
| of d e c i m a l p l a c e s n e e d e d t o i n s u r e L E N i n t e g e r d i g i t s
| in t h e o u t p u t b e f o r e c o n v e r s i o n t o b c d . L A M B D A i s t h e s i g n
| of I S C A L E , u s e d i n A 9 . F p1 c o n t a i n s 1 0 ^ ^ ( a b s ( I S C A L E ) ) u s i n g
| the r o u n d i n g m o d e a s g i v e n i n t h e f o l l o w i n g t a b l e ( s e e
| Coonen, p . 7 . 2 3 a s r e f . ; however, the SCALE variable is
| of o p p o s i t e s i g n i n b i n d e c . s a f r o m C o o n e n ) .
|
| Initial U S E
| FPCR[ 6 : 5 ] L A M B D A S I G N ( X ) F P C R [ 6 : 5 ]
| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| RN 0 0 0 0 0 0 / 0 R N
| RN 0 0 0 1 0 0 / 0 R N
| RN 0 0 1 0 0 0 / 0 R N
| RN 0 0 1 1 0 0 / 0 R N
| RZ 0 1 0 0 1 1 / 3 R P
| RZ 0 1 0 1 1 1 / 3 R P
| RZ 0 1 1 0 1 0 / 2 R M
| RZ 0 1 1 1 1 0 / 2 R M
| RM 1 0 0 0 1 1 / 3 R P
| RM 1 0 0 1 1 0 / 2 R M
| RM 1 0 1 0 1 0 / 2 R M
| RM 1 0 1 1 1 1 / 3 R P
| RP 1 1 0 0 1 0 / 2 R M
| RP 1 1 0 1 1 1 / 3 R P
| RP 1 1 1 0 1 1 / 3 R P
| RP 1 1 1 1 1 0 / 2 R M
|
| Register u s a g e :
| Input/ O u t p u t
| d0 : exponent/ s c r a t c h - f i n a l i s 0
| d2 : x/ 0 o r 2 4 f o r A 9
| d3 : x/ s c r a t c h - o f f s e t p t r i n t o P T E N R M a r r a y
| d4 : LEN/ U n c h a n g e d
| d5 : 0 / ICTR : LAMBDA
| d6 : ILOG/ I L O G o r k i f ( ( k < =0 ) & ( I L O G < k ) )
| d7 : k- f a c t o r / U n c h a n g e d
| a0 : ptr f o r o r i g i n a l o p e r a n d / f i n a l r e s u l t
| a1 : x/ p t r t o P T E N R M a r r a y
| a2 : x/ x
| fp0 : float( I L O G ) / U n c h a n g e d
| fp1 : x/ 1 0 ^ I S C A L E
| fp2 : x/ x
| F_SCR1 : x/ x
| F_SCR2 : Abs( X ) w i t h $ 3 f f f e x p o n e n t / U n c h a n g e d
| L_SCR1 : x/ x
| L_SCR2 : first w o r d o f X p a c k e d / U n c h a n g e d
A7_str :
tstl % d7 | t e s t s i g n o f k
bgts k _ p o s | i f p o s a n d > 0 , s k i p t h i s
cmpl % d6 ,% d7 | t e s t k - I L O G
blts k _ p o s | i f I L O G > = k , s k i p t h i s
movel % d7 ,% d6 | i f ( ( k < 0 ) & ( I L O G < k ) ) I L O G = k
k_pos :
movel % d6 ,% d0 | c a l c I L O G + 1 - L E N i n d0
addql #1 ,% d0 | a d d t h e 1
subl % d4 ,% d0 | s u b o f f L E N
swap % d5 | u s e u p p e r w o r d o f d5 f o r L A M B D A
clrw % d5 | s e t i t z e r o i n i t i a l l y
clrw % d2 | s e t u p d2 f o r v e r y s m a l l c a s e
tstl % d0 | t e s t s i g n o f I S C A L E
bges i s c a l e | i f p o s , s k i p n e x t i n s t
addqw #1 ,% d5 | i f n e g , s e t L A M B D A t r u e
cmpl #0xffffecd4 ,% d0 | t e s t i s c a l e < = - 4 9 0 8
bgts n o _ i n f | i f f a l s e , s k i p r e s t
addil #24 ,% d0 | a d d i n 2 4 t o i s c a l e
movel #24 ,% d2 | p u t 2 4 i n d2 f o r A 9
no_inf :
negl % d0 | a n d t a k e a b s o f I S C A L E
iscale :
fmoves F O N E ,% f p1 | i n i t f p1 t o 1
bfextu U S E R _ F P C R ( % a6 ) { #26 : #2 } ,% d1 | g e t i n i t i a l r m o d e b i t s
lslw #1 ,% d1 | p u t t h e m i n b i t s 2 : 1
addw % d5 ,% d1 | a d d i n L A M B D A
lslw #1 ,% d1 | p u t t h e m i n b i t s 3 : 1
tstl L _ S C R 2 ( % a6 ) | t e s t s i g n o f o r i g i n a l x
bges x _ p o s | i f p o s , d o n ' t s e t b i t 0
addql #1 ,% d1 | i f n e g , s e t b i t 0
x_pos :
leal R B D T B L ,% a2 | l o a d r b d t b l b a s e
moveb ( % a2 ,% d1 ) ,% d3 | l o a d d3 w i t h n e w r m o d e
lsll #4 ,% d3 | p u t b i t s i n p r o p e r p o s i t i o n
fmovel % d3 ,% f p c r | l o a d b i t s i n t o f p u
lsrl #4 ,% d3 | p u t b i t s i n p r o p e r p o s i t i o n
tstb % d3 | d e c o d e n e w r m o d e f o r p t e n t a b l e
bnes n o t _ r n | i f z e r o , i t i s R N
leal P T E N R N ,% a1 | l o a d a1 w i t h R N t a b l e b a s e
bras r m o d e | e x i t d e c o d e
not_rn :
lsrb #1 ,% d3 | g e t l s b i n c a r r y
bccs n o t _ r p | i f c a r r y c l e a r , i t i s R M
leal P T E N R P ,% a1 | l o a d a1 w i t h R P t a b l e b a s e
bras r m o d e | e x i t d e c o d e
not_rp :
leal P T E N R M ,% a1 | l o a d a1 w i t h R M t a b l e b a s e
rmode :
clrl % d3 | c l r t a b l e i n d e x
e_loop :
lsrl #1 ,% d0 | s h i f t n e x t b i t i n t o c a r r y
bccs e _ n e x t | i f z e r o , s k i p t h e m u l
fmulx ( % a1 ,% d3 ) ,% f p1 | m u l b y 1 0 * * ( d3 _ b i t _ n o )
e_next :
addl #12 ,% d3 | i n c d3 t o n e x t p w r t e n t a b l e e n t r y
tstl % d0 | t e s t i f I S C A L E i s z e r o
bnes e _ l o o p | i f n o t , l o o p
| A8 . C l r I N E X ; Force RZ.
| The o p e r a t i o n i n A 3 a b o v e m a y h a v e s e t I N E X 2 .
| RZ m o d e i s f o r c e d f o r t h e s c a l i n g o p e r a t i o n t o i n s u r e
| only o n e r o u n d i n g e r r o r . T h e g r s b i t s a r e c o l l e c t e d i n
| the I N E X f l a g f o r u s e i n A 1 0 .
|
| Register u s a g e :
| Input/ O u t p u t
fmovel #0 ,% F P S R | c l r I N E X
fmovel #r z _ m o d e , % F P C R | s e t R Z r o u n d i n g m o d e
| A9 . S c a l e X - > Y .
| The m a n t i s s a i s s c a l e d t o t h e d e s i r e d n u m b e r o f s i g n i f i c a n t
| digits. T h e e x c e s s d i g i t s a r e c o l l e c t e d i n I N E X 2 . I f m u l ,
| Check d2 f o r e x c e s s 1 0 e x p o n e n t i a l v a l u e . I f n o t z e r o ,
| the i s c a l e v a l u e w o u l d h a v e c a u s e d t h e p w r t e n c a l c u l a t i o n
| to o v e r f l o w . O n l y a n e g a t i v e i s c a l e c a n c a u s e t h i s , s o
| multiply b y 1 0 ^ ( d2 ) , w h i c h i s n o w o n l y a l l o w e d t o b e 2 4 ,
| with a m u l t i p l y b y 1 0 ^ 8 a n d 1 0 ^ 1 6 , w h i c h i s e x a c t s i n c e
| 1 0 ^ 2 4 is e x a c t . I f t h e i n p u t w a s d e n o r m a l i z e d , w e m u s t
| create a b u s y s t a c k f r a m e w i t h t h e m u l c o m m a n d a n d t h e
| two o p e r a n d s , a n d a l l o w t h e f p u t o c o m p l e t e t h e m u l t i p l y .
|
| Register u s a g e :
| Input/ O u t p u t
| d0 : FPCR w i t h R Z m o d e / U n c h a n g e d
| d2 : 0 or 2 4 / u n c h a n g e d
| d3 : x/ x
| d4 : LEN/ U n c h a n g e d
| d5 : ICTR : LAMBDA
| d6 : ILOG/ U n c h a n g e d
| d7 : k- f a c t o r / U n c h a n g e d
| a0 : ptr f o r o r i g i n a l o p e r a n d / f i n a l r e s u l t
| a1 : ptr t o P T E N R M a r r a y / U n c h a n g e d
| a2 : x/ x
| fp0 : float( I L O G ) / X a d j u s t e d f o r S C A L E ( Y )
| fp1 : 1 0 ^ ISCALE/ U n c h a n g e d
| fp2 : x/ x
| F_SCR1 : x/ x
| F_SCR2 : Abs( X ) w i t h $ 3 f f f e x p o n e n t / U n c h a n g e d
| L_SCR1 : x/ x
| L_SCR2 : first w o r d o f X p a c k e d / U n c h a n g e d
A9_str :
fmovex ( % a0 ) ,% f p0 | l o a d X f r o m m e m o r y
fabsx % f p0 | u s e a b s ( X )
tstw % d5 | L A M B D A i s i n l o w e r w o r d o f d5
bne s c _ m u l | i f n e g ( L A M B D A = 1 ) , s c a l e b y m u l
fdivx % f p1 ,% f p0 | c a l c u l a t e X / S C A L E - > Y t o f p0
bras A 1 0 _ s t | b r a n c h t o A 1 0
sc_mul :
tstb B I N D E C _ F L G ( % a6 ) | c h e c k f o r d e n o r m
beqs A 9 _ n o r m | i f n o r m , c o n t i n u e w i t h m u l
fmovemx % f p1 - % f p1 ,- ( % a7 ) | l o a d E T E M P w i t h 1 0 ^ I S C A L E
movel 8 ( % a0 ) ,- ( % a7 ) | l o a d F P T E M P w i t h i n p u t a r g
movel 4 ( % a0 ) ,- ( % a7 )
movel ( % a0 ) ,- ( % a7 )
movel #18 ,% d3 | l o a d c o u n t f o r b u s y s t a c k
A9_loop :
clrl - ( % a7 ) | c l e a r l w o r d o n s t a c k
dbf % d3 ,A 9 _ l o o p
moveb V E R _ T M P ( % a6 ) ,( % a7 ) | w r i t e c u r r e n t v e r s i o n n u m b e r
moveb #B U S Y _ S I Z E - 4 ,1 ( % a7 ) | w r i t e c u r r e n t b u s y s i z e
moveb #0x10 ,0 x44 ( % a7 ) | s e t f c e f p t e [ 1 5 ] b i t
movew #0x0023 ,0 x40 ( % a7 ) | l o a d c m d r e g 1 b w i t h m u l c o m m a n d
moveb #0xfe ,0 x8 ( % a7 ) | l o a d a l l 1 s t o c u s a v e p c
frestore ( % a7 ) + | r e s t o r e f r a m e t o f p u f o r c o m p l e t i o n
fmulx 3 6 ( % a1 ) ,% f p0 | m u l t i p l y f p0 b y 1 0 ^ 8
fmulx 4 8 ( % a1 ) ,% f p0 | m u l t i p l y f p0 b y 1 0 ^ 1 6
bras A 1 0 _ s t
A9_norm :
tstw % d2 | t e s t f o r s m a l l e x p c a s e
beqs A 9 _ c o n | i f z e r o , c o n t i n u e a s n o r m a l
fmulx 3 6 ( % a1 ) ,% f p0 | m u l t i p l y f p0 b y 1 0 ^ 8
fmulx 4 8 ( % a1 ) ,% f p0 | m u l t i p l y f p0 b y 1 0 ^ 1 6
A9_con :
fmulx % f p1 ,% f p0 | c a l c u l a t e X * S C A L E - > Y t o f p0
| A1 0 . O r i n I N E X .
| If I N E X i s s e t , r o u n d e r r o r o c c u r r e d . T h i s i s c o m p e n s a t e d
| for b y ' o r - i n g ' i n t h e I N E X 2 f l a g t o t h e l s b o f Y .
|
| Register u s a g e :
| Input/ O u t p u t
| d0 : FPCR w i t h R Z m o d e / F P S R w i t h I N E X 2 i s o l a t e d
| d2 : x/ x
| d3 : x/ x
| d4 : LEN/ U n c h a n g e d
| d5 : ICTR : LAMBDA
| d6 : ILOG/ U n c h a n g e d
| d7 : k- f a c t o r / U n c h a n g e d
| a0 : ptr f o r o r i g i n a l o p e r a n d / f i n a l r e s u l t
| a1 : ptr t o P T E N x x a r r a y / U n c h a n g e d
| a2 : x/ p t r t o F P _ S C R 2 ( a6 )
| fp0 : Y/ Y w i t h l s b a d j u s t e d
| fp1 : 1 0 ^ ISCALE/ U n c h a n g e d
| fp2 : x/ x
A10_st :
fmovel % F P S R ,% d0 | g e t F P S R
fmovex % f p0 ,F P _ S C R 2 ( % a6 ) | m o v e Y t o m e m o r y
leal F P _ S C R 2 ( % a6 ) ,% a2 | l o a d a2 w i t h p t r t o F P _ S C R 2
btstl #9 ,% d0 | c h e c k i f I N E X 2 s e t
beqs A 1 1 _ s t | i f c l e a r , s k i p r e s t
oril #1 ,8 ( % a2 ) | o r i n 1 t o l s b o f m a n t i s s a
fmovex F P _ S C R 2 ( % a6 ) ,% f p0 | w r i t e a d j u s t e d Y b a c k t o f p u
| A1 1 . R e s t o r e o r i g i n a l F P C R ; set size ext.
| Perform F I N T o p e r a t i o n i n t h e u s e r ' s r o u n d i n g m o d e . K e e p
| the s i z e t o e x t e n d e d . T h e s i n t d o e n t r y p o i n t i n t h e s i n t
| routine e x p e c t s t h e F P C R v a l u e t o b e i n U S E R _ F P C R f o r
| mode a n d p r e c i s i o n . T h e o r i g i n a l F P C R i s s a v e d i n L _ S C R 1 .
A11_st :
movel U S E R _ F P C R ( % a6 ) ,L _ S C R 1 ( % a6 ) | s a v e i t f o r l a t e r
andil #0x00000030 ,U S E R _ F P C R ( % a6 ) | s e t s i z e t o e x t ,
| ;block exceptions
| A1 2 . C a l c u l a t e Y I N T = F I N T ( Y ) a c c o r d i n g t o u s e r ' s r o u n d i n g m o d e .
| The F P S P r o u t i n e s i n t d0 i s u s e d . T h e o u t p u t i s i n f p0 .
|
| Register u s a g e :
| Input/ O u t p u t
| d0 : FPSR w i t h A I N E X c l e a r e d / F P C R w i t h s i z e s e t t o e x t
| d2 : x/ x / s c r a t c h
| d3 : x/ x
| d4 : LEN/ U n c h a n g e d
| d5 : ICTR : LAMBDA/ U n c h a n g e d
| d6 : ILOG/ U n c h a n g e d
| d7 : k- f a c t o r / U n c h a n g e d
| a0 : ptr f o r o r i g i n a l o p e r a n d / s r c p t r f o r s i n t d o
| a1 : ptr t o P T E N x x a r r a y / U n c h a n g e d
| a2 : ptr t o F P _ S C R 2 ( a6 ) / U n c h a n g e d
| a6 : temp p o i n t e r t o F P _ S C R 2 ( a6 ) - o r i g v a l u e s a v e d a n d r e s t o r e d
| fp0 : Y/ Y I N T
| fp1 : 1 0 ^ ISCALE/ U n c h a n g e d
| fp2 : x/ x
| F_SCR1 : x/ x
| F_SCR2 : Y a d j u s t e d f o r i n e x / Y w i t h o r i g i n a l e x p o n e n t
| L_SCR1 : x/ o r i g i n a l U S E R _ F P C R
| L_SCR2 : first w o r d o f X p a c k e d / U n c h a n g e d
A12_st :
moveml % d0 - % d1 / % a0 - % a1 ,- ( % a7 ) | s a v e r e g s u s e d b y s i n t d0
movel L _ S C R 1 ( % a6 ) ,- ( % a7 )
movel L _ S C R 2 ( % a6 ) ,- ( % a7 )
leal F P _ S C R 2 ( % a6 ) ,% a0 | a0 i s p t r t o F _ S C R 2 ( a6 )
fmovex % f p0 ,( % a0 ) | m o v e Y t o m e m o r y a t F P _ S C R 2 ( a6 )
tstl L _ S C R 2 ( % a6 ) | t e s t s i g n o f o r i g i n a l o p e r a n d
bges d o _ f i n t | i f p o s , u s e Y
orl #0x80000000 ,( % a0 ) | i f n e g , u s e - Y
do_fint :
movel U S E R _ F P S R ( % a6 ) ,- ( % a7 )
bsr s i n t d o | s i n t r o u t i n e r e t u r n s i n t i n f p0
moveb ( % a7 ) ,U S E R _ F P S R ( % a6 )
addl #4 ,% a7
movel ( % a7 ) + ,L _ S C R 2 ( % a6 )
movel ( % a7 ) + ,L _ S C R 1 ( % a6 )
moveml ( % a7 ) + ,% d0 - % d1 / % a0 - % a1 | r e s t o r e r e g s u s e d b y s i n t
movel L _ S C R 2 ( % a6 ) ,F P _ S C R 2 ( % a6 ) | r e s t o r e o r i g i n a l e x p o n e n t
movel L _ S C R 1 ( % a6 ) ,U S E R _ F P C R ( % a6 ) | r e s t o r e u s e r ' s F P C R
| A1 3 . C h e c k f o r L E N d i g i t s .
| If t h e i n t o p e r a t i o n r e s u l t s i n m o r e t h a n L E N d i g i t s ,
| or l e s s t h a n L E N - 1 d i g i t s , a d j u s t I L O G a n d r e p e a t f r o m
| A6 . T h i s t e s t o c c u r s o n l y o n t h e f i r s t p a s s . I f t h e
| result i s e x a c t l y 1 0 ^ L E N , d e c r e m e n t I L O G a n d d i v i d e
| the m a n t i s s a b y 1 0 . T h e c a l c u l a t i o n o f 1 0 ^ L E N c a n n o t
2011-03-31 05:57:33 +04:00
| be i n e x a c t , s i n c e a l l p o w e r s o f t e n u p t o 1 0 ^ 2 7 a r e e x a c t
2005-04-17 02:20:36 +04:00
| in e x t e n d e d p r e c i s i o n , s o t h e u s e o f a p r e v i o u s p o w e r - o f - t e n
| table w i l l i n t r o d u c e n o e r r o r .
|
|
| Register u s a g e :
| Input/ O u t p u t
| d0 : FPCR w i t h s i z e s e t t o e x t / s c r a t c h f i n a l = 0
| d2 : x/ x
| d3 : x/ s c r a t c h f i n a l = x
| d4 : LEN/ L E N a d j u s t e d
| d5 : ICTR : LAMBDA/ L A M B D A : I C T R
| d6 : ILOG/ I L O G a d j u s t e d
| d7 : k- f a c t o r / U n c h a n g e d
| a0 : pointer i n t o m e m o r y f o r p a c k e d b c d s t r i n g f o r m a t i o n
| a1 : ptr t o P T E N x x a r r a y / U n c h a n g e d
| a2 : ptr t o F P _ S C R 2 ( a6 ) / U n c h a n g e d
| fp0 : int p o r t i o n o f Y / a b s ( Y I N T ) a d j u s t e d
| fp1 : 1 0 ^ ISCALE/ U n c h a n g e d
| fp2 : x/ 1 0 ^ L E N
| F_SCR1 : x/ x
| F_SCR2 : Y w i t h o r i g i n a l e x p o n e n t / U n c h a n g e d
| L_SCR1 : original U S E R _ F P C R / U n c h a n g e d
| L_SCR2 : first w o r d o f X p a c k e d / U n c h a n g e d
A13_st :
swap % d5 | p u t I C T R i n l o w e r w o r d o f d5
tstw % d5 | c h e c k i f I C T R = 0
bne n o t _ z r | i f n o n - z e r o , g o t o s e c o n d t e s t
|
| Compute 1 0 ^ ( L E N - 1 )
|
fmoves F O N E ,% f p2 | i n i t f p2 t o 1 . 0
movel % d4 ,% d0 | p u t L E N i n d0
subql #1 ,% d0 | d0 = L E N - 1
clrl % d3 | c l r t a b l e i n d e x
l_loop :
lsrl #1 ,% d0 | s h i f t n e x t b i t i n t o c a r r y
bccs l _ n e x t | i f z e r o , s k i p t h e m u l
fmulx ( % a1 ,% d3 ) ,% f p2 | m u l b y 1 0 * * ( d3 _ b i t _ n o )
l_next :
addl #12 ,% d3 | i n c d3 t o n e x t p w r t e n t a b l e e n t r y
tstl % d0 | t e s t i f L E N i s z e r o
bnes l _ l o o p | i f n o t , l o o p
|
| 1 0 ^ LEN- 1 i s c o m p u t e d f o r t h i s t e s t a n d A 1 4 . I f t h e i n p u t w a s
| denormalized, c h e c k o n l y t h e c a s e i n w h i c h Y I N T > 1 0 ^ L E N .
|
tstb B I N D E C _ F L G ( % a6 ) | c h e c k i f i n p u t w a s n o r m
beqs A 1 3 _ c o n | i f n o r m , c o n t i n u e w i t h c h e c k i n g
fabsx % f p0 | t a k e a b s o f Y I N T
bra t e s t _ 2
|
| Compare a b s ( Y I N T ) t o 1 0 ^ ( L E N - 1 ) a n d 1 0 ^ L E N
|
A13_con :
fabsx % f p0 | t a k e a b s o f Y I N T
fcmpx % f p2 ,% f p0 | c o m p a r e a b s ( Y I N T ) w i t h 1 0 ^ ( L E N - 1 )
fbge t e s t _ 2 | i f g r e a t e r , d o n e x t t e s t
subql #1 ,% d6 | s u b t r a c t 1 f r o m I L O G
movew #1 ,% d5 | s e t I C T R
fmovel #r m _ m o d e , % F P C R | s e t r m o d e t o R M
fmuls F T E N ,% f p2 | c o m p u t e 1 0 ^ L E N
bra A 6 _ s t r | r e t u r n t o A 6 a n d r e c o m p u t e Y I N T
test_2 :
fmuls F T E N ,% f p2 | c o m p u t e 1 0 ^ L E N
fcmpx % f p2 ,% f p0 | c o m p a r e a b s ( Y I N T ) w i t h 1 0 ^ L E N
fblt A 1 4 _ s t | i f l e s s , a l l i s o k , g o t o A 1 4
fbgt f i x _ e x | i f g r e a t e r , f i x a n d r e d o
fdivs F T E N ,% f p0 | i f e q u a l , d i v i d e b y 1 0
addql #1 ,% d6 | a n d i n c I L O G
bras A 1 4 _ s t | a n d c o n t i n u e e l s e w h e r e
fix_ex :
addql #1 ,% d6 | i n c r e m e n t I L O G b y 1
movew #1 ,% d5 | s e t I C T R
fmovel #r m _ m o d e , % F P C R | s e t r m o d e t o R M
bra A 6 _ s t r | r e t u r n t o A 6 a n d r e c o m p u t e Y I N T
|
| Since I C T R < > 0 , w e h a v e a l r e a d y b e e n t h r o u g h o n e a d j u s t m e n t ,
| and s h o u l d n ' t h a v e a n o t h e r ; this is to check if abs(YINT) = 10^LEN
| 1 0 ^ LEN i s a g a i n c o m p u t e d u s i n g w h a t e v e r t a b l e i s i n a1 s i n c e t h e
| value c a l c u l a t e d c a n n o t b e i n e x a c t .
|
not_zr :
fmoves F O N E ,% f p2 | i n i t f p2 t o 1 . 0
movel % d4 ,% d0 | p u t L E N i n d0
clrl % d3 | c l r t a b l e i n d e x
z_loop :
lsrl #1 ,% d0 | s h i f t n e x t b i t i n t o c a r r y
bccs z _ n e x t | i f z e r o , s k i p t h e m u l
fmulx ( % a1 ,% d3 ) ,% f p2 | m u l b y 1 0 * * ( d3 _ b i t _ n o )
z_next :
addl #12 ,% d3 | i n c d3 t o n e x t p w r t e n t a b l e e n t r y
tstl % d0 | t e s t i f L E N i s z e r o
bnes z _ l o o p | i f n o t , l o o p
fabsx % f p0 | g e t a b s ( Y I N T )
fcmpx % f p2 ,% f p0 | c h e c k i f a b s ( Y I N T ) = 1 0 ^ L E N
fbne A 1 4 _ s t | i f n o t , s k i p t h i s
fdivs F T E N ,% f p0 | d i v i d e a b s ( Y I N T ) b y 1 0
addql #1 ,% d6 | a n d i n c I L O G b y 1
addql #1 ,% d4 | a n d i n c L E N
fmuls F T E N ,% f p2 | i f L E N + + , t h e g e t 1 0 ^ ^ L E N
| A1 4 . C o n v e r t t h e m a n t i s s a t o b c d .
| The b i n s t r r o u t i n e i s u s e d t o c o n v e r t t h e L E N d i g i t
| mantissa t o b c d i n m e m o r y . T h e i n p u t t o b i n s t r i s
| to b e a f r a c t i o n ; i.e. (mantissa)/10^LEN and adjusted
| such t h a t t h e d e c i m a l p o i n t i s t o t h e l e f t o f b i t 6 3 .
| The b c d d i g i t s a r e s t o r e d i n t h e c o r r e c t p o s i t i o n i n
| the f i n a l s t r i n g a r e a i n m e m o r y .
|
|
| Register u s a g e :
| Input/ O u t p u t
| d0 : x/ L E N c a l l t o b i n s t r - f i n a l i s 0
| d1 : x/ 0
| d2 : x/ m s 3 2 - b i t s o f m a n t o f a b s ( Y I N T )
| d3 : x/ l s 3 2 - b i t s o f m a n t o f a b s ( Y I N T )
| d4 : LEN/ U n c h a n g e d
| d5 : ICTR : LAMBDA/ L A M B D A : I C T R
| d6 : ILOG
| d7 : k- f a c t o r / U n c h a n g e d
| a0 : pointer i n t o m e m o r y f o r p a c k e d b c d s t r i n g f o r m a t i o n
| / ptr t o f i r s t m a n t i s s a b y t e i n r e s u l t s t r i n g
| a1 : ptr t o P T E N x x a r r a y / U n c h a n g e d
| a2 : ptr t o F P _ S C R 2 ( a6 ) / U n c h a n g e d
| fp0 : int p o r t i o n o f Y / a b s ( Y I N T ) a d j u s t e d
| fp1 : 1 0 ^ ISCALE/ U n c h a n g e d
| fp2 : 1 0 ^ LEN/ U n c h a n g e d
| F_SCR1 : x/ W o r k a r e a f o r f i n a l r e s u l t
| F_SCR2 : Y w i t h o r i g i n a l e x p o n e n t / U n c h a n g e d
| L_SCR1 : original U S E R _ F P C R / U n c h a n g e d
| L_SCR2 : first w o r d o f X p a c k e d / U n c h a n g e d
A14_st :
fmovel #r z _ m o d e , % F P C R | f o r c e r z f o r c o n v e r s i o n
fdivx % f p2 ,% f p0 | d i v i d e a b s ( Y I N T ) b y 1 0 ^ L E N
leal F P _ S C R 1 ( % a6 ) ,% a0
fmovex % f p0 ,( % a0 ) | m o v e a b s ( Y I N T ) / 1 0 ^ L E N t o m e m o r y
movel 4 ( % a0 ) ,% d2 | m o v e 2 n d w o r d o f F P _ R E S t o d2
movel 8 ( % a0 ) ,% d3 | m o v e 3 r d w o r d o f F P _ R E S t o d3
clrl 4 ( % a0 ) | z e r o w o r d 2 o f F P _ R E S
clrl 8 ( % a0 ) | z e r o w o r d 3 o f F P _ R E S
movel ( % a0 ) ,% d0 | m o v e e x p o n e n t t o d0
swap % d0 | p u t e x p o n e n t i n l o w e r w o r d
beqs n o _ s f t | i f z e r o , d o n ' t s h i f t
subil #0x3ffd ,% d0 | s u b b i a s l e s s 2 t o m a k e f r a c t
tstl % d0 | c h e c k i f > 1
bgts n o _ s f t | i f s o , d o n ' t s h i f t
negl % d0 | m a k e e x p p o s i t i v e
m_loop :
lsrl #1 ,% d2 | s h i f t d2 : d3 r i g h t , a d d 0 s
roxrl #1 ,% d3 | t h e n u m b e r o f p l a c e s
dbf % d0 ,m _ l o o p | g i v e n i n d0
no_sft :
tstl % d2 | c h e c k f o r m a n t i s s a o f z e r o
bnes n o _ z r | i f n o t , g o o n
tstl % d3 | c o n t i n u e z e r o c h e c k
beqs z e r _ m | i f z e r o , g o d i r e c t l y t o b i n s t r
no_zr :
clrl % d1 | p u t z e r o i n d1 f o r a d d x
addil #0x00000080 ,% d3 | i n c a t b i t 7
addxl % d1 ,% d2 | c o n t i n u e i n c
andil #0xffffff80 ,% d3 | s t r i p o f f l s b n o t u s e d b y 8 8 2
zer_m :
movel % d4 ,% d0 | p u t L E N i n d0 f o r b i n s t r c a l l
addql #3 ,% a0 | a0 p o i n t s t o M 1 6 b y t e i n r e s u l t
bsr b i n s t r | c a l l b i n s t r t o c o n v e r t m a n t
| A1 5 . C o n v e r t t h e e x p o n e n t t o b c d .
| As i n A 1 4 a b o v e , t h e e x p i s c o n v e r t e d t o b c d a n d t h e
| digits a r e s t o r e d i n t h e f i n a l s t r i n g .
|
| Digits a r e s t o r e d i n L _ S C R 1 ( a6 ) o n r e t u r n f r o m B I N D E C a s :
|
| 3 2 1 6 1 5 0
| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| | 0 | e3 | e 2 | e 1 | e 4 | X | X | X |
| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
| And a r e m o v e d i n t o t h e i r p r o p e r p l a c e s i n F P _ S C R 1 . I f d i g i t e 4
| is n o n - z e r o , O P E R R i s s i g n a l e d . I n a l l c a s e s , a l l 4 d i g i t s a r e
| written a s s p e c i f i e d i n t h e 8 8 1 / 8 8 2 m a n u a l f o r p a c k e d d e c i m a l .
|
| Register u s a g e :
| Input/ O u t p u t
| d0 : x/ L E N c a l l t o b i n s t r - f i n a l i s 0
| d1 : x/ s c r a t c h ( 0 ) ;shift count for final exponent packing
| d2 : x/ m s 3 2 - b i t s o f e x p f r a c t i o n / s c r a t c h
| d3 : x/ l s 3 2 - b i t s o f e x p f r a c t i o n
| d4 : LEN/ U n c h a n g e d
| d5 : ICTR : LAMBDA/ L A M B D A : I C T R
| d6 : ILOG
| d7 : k- f a c t o r / U n c h a n g e d
| a0 : ptr t o r e s u l t s t r i n g / p t r t o L _ S C R 1 ( a6 )
| a1 : ptr t o P T E N x x a r r a y / U n c h a n g e d
| a2 : ptr t o F P _ S C R 2 ( a6 ) / U n c h a n g e d
| fp0 : abs( Y I N T ) a d j u s t e d / f l o a t ( I L O G )
| fp1 : 1 0 ^ ISCALE/ U n c h a n g e d
| fp2 : 1 0 ^ LEN/ U n c h a n g e d
| F_SCR1 : Work a r e a f o r f i n a l r e s u l t / B C D r e s u l t
| F_SCR2 : Y w i t h o r i g i n a l e x p o n e n t / I L O G / 1 0 ^ 4
| L_SCR1 : original U S E R _ F P C R / E x p o n e n t d i g i t s o n r e t u r n f r o m b i n s t r
| L_SCR2 : first w o r d o f X p a c k e d / U n c h a n g e d
A15_st :
tstb B I N D E C _ F L G ( % a6 ) | c h e c k f o r d e n o r m
beqs n o t _ d e n o r m
ftstx % f p0 | t e s t f o r z e r o
fbeq d e n _ z e r o | i f z e r o , u s e k - f a c t o r o r 4 9 3 3
fmovel % d6 ,% f p0 | f l o a t I L O G
fabsx % f p0 | g e t a b s o f I L O G
bras c o n v r t
den_zero :
tstl % d7 | c h e c k s i g n o f t h e k - f a c t o r
blts u s e _ i l o g | i f n e g a t i v e , u s e I L O G
fmoves F 4 9 3 3 ,% f p0 | f o r c e e x p o n e n t t o 4 9 3 3
bras c o n v r t | d o i t
use_ilog :
fmovel % d6 ,% f p0 | f l o a t I L O G
fabsx % f p0 | g e t a b s o f I L O G
bras c o n v r t
not_denorm :
ftstx % f p0 | t e s t f o r z e r o
fbne n o t _ z e r o | i f z e r o , f o r c e e x p o n e n t
fmoves F O N E ,% f p0 | f o r c e e x p o n e n t t o 1
bras c o n v r t | d o i t
not_zero :
fmovel % d6 ,% f p0 | f l o a t I L O G
fabsx % f p0 | g e t a b s o f I L O G
convrt :
fdivx 2 4 ( % a1 ) ,% f p0 | c o m p u t e I L O G / 1 0 ^ 4
fmovex % f p0 ,F P _ S C R 2 ( % a6 ) | s t o r e f p0 i n m e m o r y
movel 4 ( % a2 ) ,% d2 | m o v e w o r d 2 t o d2
movel 8 ( % a2 ) ,% d3 | m o v e w o r d 3 t o d3
movew ( % a2 ) ,% d0 | m o v e e x p t o d0
beqs x _ l o o p _ f i n | i f z e r o , s k i p t h e s h i f t
subiw #0x3ffd ,% d0 | s u b t r a c t o f f b i a s
negw % d0 | m a k e e x p p o s i t i v e
x_loop :
lsrl #1 ,% d2 | s h i f t d2 : d3 r i g h t
roxrl #1 ,% d3 | t h e n u m b e r o f p l a c e s
dbf % d0 ,x _ l o o p | g i v e n i n d0
x_loop_fin :
clrl % d1 | p u t z e r o i n d1 f o r a d d x
addil #0x00000080 ,% d3 | i n c a t b i t 6
addxl % d1 ,% d2 | c o n t i n u e i n c
andil #0xffffff80 ,% d3 | s t r i p o f f l s b n o t u s e d b y 8 8 2
movel #4 ,% d0 | p u t 4 i n d0 f o r b i n s t r c a l l
leal L _ S C R 1 ( % a6 ) ,% a0 | a0 i s p t r t o L _ S C R 1 f o r e x p d i g i t s
bsr b i n s t r | c a l l b i n s t r t o c o n v e r t e x p
movel L _ S C R 1 ( % a6 ) ,% d0 | l o a d L _ S C R 1 l w o r d t o d0
movel #12 ,% d1 | u s e d1 f o r s h i f t c o u n t
lsrl % d1 ,% d0 | s h i f t d0 r i g h t b y 1 2
bfins % d0 ,F P _ S C R 1 ( % a6 ) { #4 : #12 } | p u t e 3 : e 2 : e 1 i n F P _ S C R 1
lsrl % d1 ,% d0 | s h i f t d0 r i g h t b y 1 2
bfins % d0 ,F P _ S C R 1 ( % a6 ) { #16 : #4 } | p u t e 4 i n F P _ S C R 1
tstb % d0 | c h e c k i f e 4 i s z e r o
beqs A 1 6 _ s t | i f z e r o , s k i p r e s t
orl #o p a o p _ m a s k , U S E R _ F P S R ( % a 6 ) | s e t O P E R R & A I O P i n U S E R _ F P S R
| A1 6 . W r i t e s i g n b i t s t o f i n a l s t r i n g .
| Sigma i s b i t 3 1 o f i n i t i a l v a l u e ; RHO is bit 31 of d6 (ILOG).
|
| Register u s a g e :
| Input/ O u t p u t
| d0 : x/ s c r a t c h - f i n a l i s x
| d2 : x/ x
| d3 : x/ x
| d4 : LEN/ U n c h a n g e d
| d5 : ICTR : LAMBDA/ L A M B D A : I C T R
| d6 : ILOG/ I L O G a d j u s t e d
| d7 : k- f a c t o r / U n c h a n g e d
| a0 : ptr t o L _ S C R 1 ( a6 ) / U n c h a n g e d
| a1 : ptr t o P T E N x x a r r a y / U n c h a n g e d
| a2 : ptr t o F P _ S C R 2 ( a6 ) / U n c h a n g e d
| fp0 : float( I L O G ) / U n c h a n g e d
| fp1 : 1 0 ^ ISCALE/ U n c h a n g e d
| fp2 : 1 0 ^ LEN/ U n c h a n g e d
| F_SCR1 : BCD r e s u l t w i t h c o r r e c t s i g n s
| F_SCR2 : ILOG/ 1 0 ^ 4
| L_SCR1 : Exponent d i g i t s o n r e t u r n f r o m b i n s t r
| L_SCR2 : first w o r d o f X p a c k e d / U n c h a n g e d
A16_st :
clrl % d0 | c l r d0 f o r c o l l e c t i o n o f s i g n s
andib #0x0f ,F P _ S C R 1 ( % a6 ) | c l e a r f i r s t n i b b l e o f F P _ S C R 1
tstl L _ S C R 2 ( % a6 ) | c h e c k s i g n o f o r i g i n a l m a n t i s s a
bges m a n t _ p | i f p o s , d o n ' t s e t S M
moveql #2 ,% d0 | m o v e 2 i n t o d0 f o r S M
mant_p :
tstl % d6 | c h e c k s i g n o f I L O G
bges w r _ s g n | i f p o s , d o n ' t s e t S E
addql #1 ,% d0 | s e t b i t 0 i n d0 f o r S E
wr_sgn :
bfins % d0 ,F P _ S C R 1 ( % a6 ) { #0 : #2 } | i n s e r t S M a n d S E i n t o F P _ S C R 1
| Clean u p a n d r e s t o r e a l l r e g i s t e r s u s e d .
fmovel #0 ,% F P S R | c l e a r p o s s i b l e i n e x2 / a i n e x b i t s
fmovemx ( % a7 ) + ,% f p0 - % f p2
moveml ( % a7 ) + ,% d2 - % d7 / % a2
rts
| end