2005-04-17 02:20:36 +04:00
/*
* IEEE754 floating point
* common internal header file
*/
/*
* 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
*/
2014-04-19 02:15:40 +04:00
# ifndef __IEEE754INT_H
# define __IEEE754INT_H
2005-04-17 02:20:36 +04:00
# include "ieee754.h"
2007-10-12 02:46:15 +04:00
# define CLPAIR(x, y) ((x)*6+(y))
2005-04-17 02:20:36 +04:00
2014-04-19 02:36:32 +04:00
static inline void ieee754_clearcx ( void )
{
ieee754_csr . cx = 0 ;
}
2005-04-17 02:20:36 +04:00
2014-04-19 02:36:32 +04:00
static inline void ieee754_setcx ( const unsigned int flags )
{
ieee754_csr . cx | = flags ;
ieee754_csr . sx | = flags ;
}
2005-04-17 02:20:36 +04:00
2014-04-19 02:36:32 +04:00
static inline int ieee754_setandtestcx ( const unsigned int x )
{
ieee754_setcx ( x ) ;
2005-04-17 02:20:36 +04:00
2014-04-19 02:36:32 +04:00
return ieee754_csr . mx & x ;
}
2005-04-17 02:20:36 +04:00
# define COMPXSP \
2014-04-16 13:00:12 +04:00
unsigned xm ; int xe ; int xs __maybe_unused ; int xc
2005-04-17 02:20:36 +04:00
# define COMPYSP \
2014-04-16 13:00:12 +04:00
unsigned ym ; int ye ; int ys ; int yc
# define EXPLODESP(v, vc, vs, ve, vm) \
{ \
vs = SPSIGN ( v ) ; \
ve = SPBEXP ( v ) ; \
vm = SPMANT ( v ) ; \
if ( ve = = SP_EMAX + 1 + SP_EBIAS ) { \
if ( vm = = 0 ) \
vc = IEEE754_CLASS_INF ; \
2014-04-22 17:51:55 +04:00
else if ( vm & SP_MBIT ( SP_FBITS - 1 ) ) \
2014-04-16 13:00:12 +04:00
vc = IEEE754_CLASS_SNAN ; \
else \
vc = IEEE754_CLASS_QNAN ; \
} else if ( ve = = SP_EMIN - 1 + SP_EBIAS ) { \
if ( vm ) { \
ve = SP_EMIN ; \
vc = IEEE754_CLASS_DNORM ; \
} else \
vc = IEEE754_CLASS_ZERO ; \
} else { \
ve - = SP_EBIAS ; \
vm | = SP_HIDDEN_BIT ; \
vc = IEEE754_CLASS_NORM ; \
} \
2005-04-17 02:20:36 +04:00
}
2007-10-12 02:46:15 +04:00
# define EXPLODEXSP EXPLODESP(x, xc, xs, xe, xm)
# define EXPLODEYSP EXPLODESP(y, yc, ys, ye, ym)
2005-04-17 02:20:36 +04:00
# define COMPXDP \
2014-04-16 13:00:12 +04:00
u64 xm ; int xe ; int xs __maybe_unused ; int xc
2005-04-17 02:20:36 +04:00
# define COMPYDP \
2014-04-16 13:00:12 +04:00
u64 ym ; int ye ; int ys ; int yc
# define EXPLODEDP(v, vc, vs, ve, vm) \
{ \
vm = DPMANT ( v ) ; \
vs = DPSIGN ( v ) ; \
ve = DPBEXP ( v ) ; \
if ( ve = = DP_EMAX + 1 + DP_EBIAS ) { \
if ( vm = = 0 ) \
vc = IEEE754_CLASS_INF ; \
2014-04-22 17:51:55 +04:00
else if ( vm & DP_MBIT ( DP_FBITS - 1 ) ) \
2014-04-16 13:00:12 +04:00
vc = IEEE754_CLASS_SNAN ; \
else \
vc = IEEE754_CLASS_QNAN ; \
} else if ( ve = = DP_EMIN - 1 + DP_EBIAS ) { \
if ( vm ) { \
ve = DP_EMIN ; \
vc = IEEE754_CLASS_DNORM ; \
} else \
vc = IEEE754_CLASS_ZERO ; \
} else { \
ve - = DP_EBIAS ; \
vm | = DP_HIDDEN_BIT ; \
vc = IEEE754_CLASS_NORM ; \
} \
2005-04-17 02:20:36 +04:00
}
2007-10-12 02:46:15 +04:00
# define EXPLODEXDP EXPLODEDP(x, xc, xs, xe, xm)
# define EXPLODEYDP EXPLODEDP(y, yc, ys, ye, ym)
2005-04-17 02:20:36 +04:00
2014-04-16 13:00:12 +04:00
# define FLUSHDP(v, vc, vs, ve, vm) \
if ( vc = = IEEE754_CLASS_DNORM ) { \
if ( ieee754_csr . nod ) { \
2014-04-19 02:36:32 +04:00
ieee754_setcx ( IEEE754_INEXACT ) ; \
2014-04-16 13:00:12 +04:00
vc = IEEE754_CLASS_ZERO ; \
ve = DP_EMIN - 1 + DP_EBIAS ; \
vm = 0 ; \
v = ieee754dp_zero ( vs ) ; \
} \
2005-04-17 02:20:36 +04:00
}
2014-04-16 13:00:12 +04:00
# define FLUSHSP(v, vc, vs, ve, vm) \
if ( vc = = IEEE754_CLASS_DNORM ) { \
if ( ieee754_csr . nod ) { \
2014-04-19 02:36:32 +04:00
ieee754_setcx ( IEEE754_INEXACT ) ; \
2014-04-16 13:00:12 +04:00
vc = IEEE754_CLASS_ZERO ; \
ve = SP_EMIN - 1 + SP_EBIAS ; \
vm = 0 ; \
v = ieee754sp_zero ( vs ) ; \
} \
2005-04-17 02:20:36 +04:00
}
2007-10-12 02:46:15 +04:00
# define FLUSHXDP FLUSHDP(x, xc, xs, xe, xm)
# define FLUSHYDP FLUSHDP(y, yc, ys, ye, ym)
# define FLUSHXSP FLUSHSP(x, xc, xs, xe, xm)
# define FLUSHYSP FLUSHSP(y, yc, ys, ye, ym)
2014-04-19 02:15:40 +04:00
# endif /* __IEEE754INT_H */