2019-05-31 01:09:55 -07:00
// SPDX-License-Identifier: GPL-2.0-only
2005-04-16 15:20:36 -07:00
/* IEEE754 floating point arithmetic
* double precision : common utilities
*/
/*
* MIPS floating point support
* Copyright ( C ) 1994 - 2000 Algorithmics Ltd .
*/
2014-04-22 16:33:07 +02:00
# include "ieee754sp.h"
2005-04-16 15:20:36 -07:00
# include "ieee754dp.h"
2015-04-03 23:25:23 +01:00
static inline union ieee754dp ieee754dp_nan_fsp ( int xs , u64 xm )
{
return builddp ( xs , DP_EMAX + 1 + DP_EBIAS ,
xm < < ( DP_FBITS - SP_FBITS ) ) ;
}
2014-04-16 01:31:11 +02:00
union ieee754dp ieee754dp_fsp ( union ieee754sp x )
2005-04-16 15:20:36 -07:00
{
COMPXSP ;
EXPLODEXSP ;
2014-04-19 00:36:32 +02:00
ieee754_clearcx ( ) ;
2005-04-16 15:20:36 -07:00
FLUSHXSP ;
switch ( xc ) {
case IEEE754_CLASS_SNAN :
2015-04-03 23:25:34 +01:00
return ieee754dp_nanxcpt ( ieee754dp_nan_fsp ( xs , xm ) ) ;
2014-04-26 01:49:14 +02:00
2005-04-16 15:20:36 -07:00
case IEEE754_CLASS_QNAN :
2015-04-03 23:25:30 +01:00
return ieee754dp_nan_fsp ( xs , xm ) ;
2015-04-03 23:25:23 +01:00
2005-04-16 15:20:36 -07:00
case IEEE754_CLASS_INF :
return ieee754dp_inf ( xs ) ;
2014-04-26 01:49:14 +02:00
2005-04-16 15:20:36 -07:00
case IEEE754_CLASS_ZERO :
return ieee754dp_zero ( xs ) ;
2014-04-26 01:49:14 +02:00
2005-04-16 15:20:36 -07:00
case IEEE754_CLASS_DNORM :
/* normalize */
2014-04-22 15:51:55 +02:00
while ( ( xm > > SP_FBITS ) = = 0 ) {
2005-04-16 15:20:36 -07:00
xm < < = 1 ;
xe - - ;
}
break ;
2014-04-26 01:49:14 +02:00
2005-04-16 15:20:36 -07:00
case IEEE754_CLASS_NORM :
break ;
}
2014-04-26 01:49:14 +02:00
/*
* Can ' t possibly overflow , underflow , or need rounding
2005-04-16 15:20:36 -07:00
*/
/* drop the hidden bit */
xm & = ~ SP_HIDDEN_BIT ;
return builddp ( xs , xe + DP_EBIAS ,
2014-04-22 15:51:55 +02:00
( u64 ) xm < < ( DP_FBITS - SP_FBITS ) ) ;
2005-04-16 15:20:36 -07:00
}