2005-04-17 02:20:36 +04:00
|
| smovecr. s a 3 . 1 1 2 / 1 0 / 9 0
|
| The e n t r y p o i n t s M O V E C R r e t u r n s t h e c o n s t a n t a t t h e
| offset g i v e n i n t h e i n s t r u c t i o n f i e l d .
|
| Input : An o f f s e t i n t h e i n s t r u c t i o n w o r d .
|
| Output : The c o n s t a n t r o u n d e d t o t h e u s e r ' s r o u n d i n g
| mode u n c h e c k e d f o r o v e r f l o w .
|
| Modified : fp0 .
|
|
| 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
| SMOVECR 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
| section 8
# include " f p s p . h "
| xref n r m _ s e t
| xref r o u n d
| xref P I R N
| xref P I R Z R M
| xref P I R P
| xref S M A L R N
| xref S M A L R Z R M
| xref S M A L R P
| xref B I G R N
| xref B I G R Z R M
| xref B I G R P
FZERO : .long 00000000
|
| FMOVECR
|
.global smovcr
smovcr :
bfextu C M D R E G 1 B ( % a6 ) { #9 : #7 } ,% d0 | g e t o f f s e t
bfextu U S E R _ F P C R ( % a6 ) { #26 : #2 } ,% d1 | g e t r m o d e
|
| check r a n g e o f o f f s e t
|
tstb % d0 | i f z e r o , o f f s e t i s t o p i
beqs P I _ T B L | i t i s p i
cmpib #0x0a ,% d0 | c h e c k r a n g e $ 0 1 - $ 0 a
bles Z _ V A L | i f i n t h i s r a n g e , r e t u r n z e r o
cmpib #0x0e ,% d0 | c h e c k r a n g e $ 0 b - $ 0 e
bles S M _ T B L | v a l i d c o n s t a n t s i n t h i s r a n g e
cmpib #0x2f ,% d0 | c h e c k r a n g e $ 1 0 - $ 2 f
bles Z _ V A L | i f i n t h i s r a n g e , r e t u r n z e r o
cmpib #0x3f ,% d0 | c h e c k r a n g e $ 3 0 - $ 3 f
ble B G _ T B L | v a l i d c o n s t a n t s i n t h i s r a n g e
Z_VAL :
fmoves F Z E R O ,% f p0
rts
PI_TBL :
tstb % d1 | o f f s e t i s z e r o , c h e c k f o r r m o d e
beqs P I _ R N | i f z e r o , r n m o d e
cmpib #0x3 ,% d1 | c h e c k f o r r p
beqs P I _ R P | i f 3 , r p m o d e
PI_RZRM :
leal P I R Z R M ,% a0 | r m o d e i s r z o r r m , l o a d P I R Z R M i n a0
bra s e t _ f i n x
PI_RN :
leal P I R N ,% a0 | r m o d e i s r n , l o a d P I R N i n a0
bra s e t _ f i n x
PI_RP :
leal P I R P ,% a0 | r m o d e i s r p , l o a d P I R P i n a0
bra s e t _ f i n x
SM_TBL :
subil #0xb ,% d0 | m a k e o f f s e t i n 0 - 4 r a n g e
tstb % d1 | c h e c k f o r r m o d e
beqs S M _ R N | i f z e r o , r n m o d e
cmpib #0x3 ,% d1 | c h e c k f o r r p
beqs S M _ R P | i f 3 , r p m o d e
SM_RZRM :
leal S M A L R Z R M ,% a0 | r m o d e i s r z o r r m , l o a d S M R Z R M i n a0
cmpib #0x2 ,% d0 | c h e c k i f r e s u l t i s i n e x
ble s e t _ f i n x | i f 0 - 2 , i t i s i n e x a c t
bra n o _ f i n x | i f 3 , i t i s e x a c t
SM_RN :
leal S M A L R N ,% a0 | r m o d e i s r n , l o a d S M R N i n a0
cmpib #0x2 ,% d0 | c h e c k i f r e s u l t i s i n e x
ble s e t _ f i n x | i f 0 - 2 , i t i s i n e x a c t
bra n o _ f i n x | i f 3 , i t i s e x a c t
SM_RP :
leal S M A L R P ,% a0 | r m o d e i s r p , l o a d S M R P i n a0
cmpib #0x2 ,% d0 | c h e c k i f r e s u l t i s i n e x
ble s e t _ f i n x | i f 0 - 2 , i t i s i n e x a c t
bra n o _ f i n x | i f 3 , i t i s e x a c t
BG_TBL :
subil #0x30 ,% d0 | m a k e o f f s e t i n 0 - f r a n g e
tstb % d1 | c h e c k f o r r m o d e
beqs B G _ R N | i f z e r o , r n m o d e
cmpib #0x3 ,% d1 | c h e c k f o r r p
beqs B G _ R P | i f 3 , r p m o d e
BG_RZRM :
leal B I G R Z R M ,% a0 | r m o d e i s r z o r r m , l o a d B G R Z R M i n a0
cmpib #0x1 ,% d0 | c h e c k i f r e s u l t i s i n e x
ble s e t _ f i n x | i f 0 - 1 , i t i s i n e x a c t
cmpib #0x7 ,% d0 | s e c o n d c h e c k
ble n o _ f i n x | i f 0 - 7 , i t i s e x a c t
bra s e t _ f i n x | i f 8 - f , i t i s i n e x a c t
BG_RN :
leal B I G R N ,% a0 | r m o d e i s r n , l o a d B G R N i n a0
cmpib #0x1 ,% d0 | c h e c k i f r e s u l t i s i n e x
ble s e t _ f i n x | i f 0 - 1 , i t i s i n e x a c t
cmpib #0x7 ,% d0 | s e c o n d c h e c k
ble n o _ f i n x | i f 0 - 7 , i t i s e x a c t
bra s e t _ f i n x | i f 8 - f , i t i s i n e x a c t
BG_RP :
leal B I G R P ,% a0 | r m o d e i s r p , l o a d S M R P i n a0
cmpib #0x1 ,% d0 | c h e c k i f r e s u l t i s i n e x
ble s e t _ f i n x | i f 0 - 1 , i t i s i n e x a c t
cmpib #0x7 ,% d0 | s e c o n d c h e c k
ble n o _ f i n x | i f 0 - 7 , i t i s e x a c t
| bra s e t _ f i n x ;if 8 - f, it is inexact
set_finx :
orl #i n x 2 a _ m a s k ,U S E R _ F P S R ( % a6 ) | s e t i n e x2 / a i n e x
no_finx :
mulul #12 ,% d0 | u s e o f f s e t t o p o i n t i n t o t a b l e s
movel % d1 ,L _ S C R 1 ( % a6 ) | l o a d m o d e f o r r o u n d c a l l
bfextu U S E R _ F P C R ( % a6 ) { #24 : #2 } ,% d1 | g e t p r e c i s i o n
tstl % d1 | c h e c k i f e x t e n d e d p r e c i s i o n
|
| Precision i s e x t e n d e d
|
bnes n o t _ e x t | i f e x t e n d e d , d o n o t c a l l r o u n d
fmovemx ( % a0 ,% d0 ) ,% f p0 - % f p0 | r e t u r n r e s u l t i n f p0
rts
|
| Precision i s s i n g l e o r d o u b l e
|
not_ext :
swap % d1 | r n d p r e c i n u p p e r w o r d o f d1
addl L _ S C R 1 ( % a6 ) ,% d1 | m e r g e r m o d e i n l o w w o r d o f d1
movel ( % a0 ,% d0 ) ,F P _ S C R 1 ( % a6 ) | l o a d f i r s t w o r d t o t e m p s t o r a g e
movel 4 ( % a0 ,% d0 ) ,F P _ S C R 1 + 4 ( % a6 ) | l o a d s e c o n d w o r d
movel 8 ( % a0 ,% d0 ) ,F P _ S C R 1 + 8 ( % a6 ) | l o a d t h i r d w o r d
clrl % d0 | c l e a r g ,r ,s
lea F P _ S C R 1 ( % a6 ) ,% a0
btstb #s i g n _ b i t , L O C A L _ E X ( % a 0 )
sne L O C A L _ S G N ( % a0 ) | c o n v e r t t o i n t e r n a l e x t . f o r m a t
bsr r o u n d | g o r o u n d t h e m a n t i s s a
bfclr L O C A L _ S G N ( % a0 ) { #0 : #8 } | c o n v e r t b a c k t o I E E E e x t f o r m a t
beqs f i n _ f c r
bsetb #s i g n _ b i t , L O C A L _ E X ( % a 0 )
fin_fcr :
fmovemx ( % a0 ) ,% f p0 - % f p0
rts
| end