2005-04-17 02:20:36 +04:00
/* IEEE754 floating point arithmetic
* single precision
*/
/*
* MIPS floating point support
* Copyright ( C ) 1994 - 2000 Algorithmics Ltd .
*
* This program is free software ; you can distribute it and / or modify it
* under the terms of the GNU General Public License ( Version 2 ) as
* published by the Free Software Foundation .
*
* This program is distributed in the hope it will be useful , but WITHOUT
* ANY WARRANTY ; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE . See the GNU General Public License
* for more details .
*
* You should have received a copy of the GNU General Public License along
* with this program ; if not , write to the Free Software Foundation , Inc . ,
2014-04-26 03:49:14 +04:00
* 51 Franklin St , Fifth Floor , Boston , MA 02110 - 1301 USA .
2005-04-17 02:20:36 +04:00
*/
# include "ieee754sp.h"
2014-04-22 18:33:07 +04:00
# include "ieee754dp.h"
2005-04-17 02:20:36 +04:00
2015-04-04 01:25:23 +03:00
static inline union ieee754sp ieee754sp_nan_fdp ( int xs , u64 xm )
{
return buildsp ( xs , SP_EMAX + 1 + SP_EBIAS ,
xm > > ( DP_FBITS - SP_FBITS ) ) ;
}
2014-04-16 03:31:11 +04:00
union ieee754sp ieee754sp_fdp ( union ieee754dp x )
2005-04-17 02:20:36 +04:00
{
2015-04-04 01:25:52 +03:00
union ieee754sp y ;
2014-04-26 03:49:14 +04:00
u32 rm ;
2005-04-17 02:20:36 +04:00
COMPXDP ;
2015-04-04 01:25:52 +03:00
COMPYSP ;
2005-04-17 02:20:36 +04:00
EXPLODEXDP ;
2014-04-19 02:36:32 +04:00
ieee754_clearcx ( ) ;
2005-04-17 02:20:36 +04:00
FLUSHXDP ;
switch ( xc ) {
case IEEE754_CLASS_SNAN :
2015-11-13 03:47:28 +03:00
x = ieee754dp_nanxcpt ( x ) ;
EXPLODEXDP ;
/* Fall through. */
2005-04-17 02:20:36 +04:00
case IEEE754_CLASS_QNAN :
2015-04-04 01:25:52 +03:00
y = ieee754sp_nan_fdp ( xs , xm ) ;
2015-11-13 03:47:28 +03:00
if ( ! ieee754_csr . nan2008 ) {
EXPLODEYSP ;
if ( ! ieee754_class_nan ( yc ) )
y = ieee754sp_indef ( ) ;
}
2015-04-04 01:25:52 +03:00
return y ;
2014-04-26 03:49:14 +04:00
2005-04-17 02:20:36 +04:00
case IEEE754_CLASS_INF :
return ieee754sp_inf ( xs ) ;
2014-04-26 03:49:14 +04:00
2005-04-17 02:20:36 +04:00
case IEEE754_CLASS_ZERO :
return ieee754sp_zero ( xs ) ;
2014-04-26 03:49:14 +04:00
2005-04-17 02:20:36 +04:00
case IEEE754_CLASS_DNORM :
/* can't possibly be sp representable */
2014-04-19 02:36:32 +04:00
ieee754_setcx ( IEEE754_UNDERFLOW ) ;
ieee754_setcx ( IEEE754_INEXACT ) ;
2014-04-30 13:21:55 +04:00
if ( ( ieee754_csr . rm = = FPU_CSR_RU & & ! xs ) | |
( ieee754_csr . rm = = FPU_CSR_RD & & xs ) )
2014-04-25 05:19:57 +04:00
return ieee754sp_mind ( xs ) ;
return ieee754sp_zero ( xs ) ;
2014-04-26 03:49:14 +04:00
2005-04-17 02:20:36 +04:00
case IEEE754_CLASS_NORM :
break ;
}
2014-04-26 03:49:14 +04:00
/*
* Convert from DP_FBITS to SP_FBITS + 3 with sticky right shift .
*/
rm = ( xm > > ( DP_FBITS - ( SP_FBITS + 3 ) ) ) |
( ( xm < < ( 64 - ( DP_FBITS - ( SP_FBITS + 3 ) ) ) ) ! = 0 ) ;
2005-04-17 02:20:36 +04:00
2014-04-26 03:49:14 +04:00
return ieee754sp_format ( xs , xe , rm ) ;
2005-04-17 02:20:36 +04:00
}