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
* common internal header file
*/
/*
* MIPS floating point support
* Copyright ( C ) 1994 - 2000 Algorithmics Ltd .
*/
2014-04-19 00:15:40 +02:00
# ifndef __IEEE754INT_H
# define __IEEE754INT_H
2005-04-16 15:20:36 -07:00
# include "ieee754.h"
2007-10-11 23:46:15 +01:00
# define CLPAIR(x, y) ((x)*6+(y))
2005-04-16 15:20:36 -07:00
2017-07-27 18:08:57 +02:00
enum maddf_flags {
MADDF_NEGATE_PRODUCT = 1 < < 0 ,
2020-01-13 18:16:11 +08:00
MADDF_NEGATE_ADDITION = 1 < < 1 ,
2017-07-27 18:08:57 +02:00
} ;
2014-04-19 00:36:32 +02:00
static inline void ieee754_clearcx ( void )
{
ieee754_csr . cx = 0 ;
}
2005-04-16 15:20:36 -07:00
2014-04-19 00:36:32 +02:00
static inline void ieee754_setcx ( const unsigned int flags )
{
ieee754_csr . cx | = flags ;
ieee754_csr . sx | = flags ;
}
2005-04-16 15:20:36 -07:00
2014-04-19 00:36:32 +02:00
static inline int ieee754_setandtestcx ( const unsigned int x )
{
ieee754_setcx ( x ) ;
2005-04-16 15:20:36 -07:00
2014-04-19 00:36:32 +02:00
return ieee754_csr . mx & x ;
}
2005-04-16 15:20:36 -07:00
2015-04-03 23:25:38 +01:00
static inline int ieee754_class_nan ( int xc )
{
return xc > = IEEE754_CLASS_SNAN ;
}
2005-04-16 15:20:36 -07:00
# define COMPXSP \
2017-11-02 12:13:59 +01:00
unsigned int xm ; int xe ; int xs __maybe_unused ; int xc
2005-04-16 15:20:36 -07:00
# define COMPYSP \
2017-11-02 12:13:59 +01:00
unsigned int ym ; int ye ; int ys ; int yc
2014-04-16 11:00:12 +02:00
2016-04-21 14:04:51 +01:00
# define COMPZSP \
2017-11-02 12:13:59 +01:00
unsigned int zm ; int ze ; int zs ; int zc
2016-04-21 14:04:51 +01:00
2014-04-16 11:00:12 +02:00
# 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 ; \
2015-11-13 00:47:28 +00:00
else if ( ieee754_csr . nan2008 ^ ! ( vm & SP_MBIT ( SP_FBITS - 1 ) ) ) \
2015-07-16 16:43:33 +01:00
vc = IEEE754_CLASS_QNAN ; \
2015-11-13 00:47:28 +00:00
else \
vc = IEEE754_CLASS_SNAN ; \
2014-04-16 11:00:12 +02:00
} 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-16 15:20:36 -07:00
}
2007-10-11 23:46:15 +01:00
# define EXPLODEXSP EXPLODESP(x, xc, xs, xe, xm)
# define EXPLODEYSP EXPLODESP(y, yc, ys, ye, ym)
2016-04-21 14:04:51 +01:00
# define EXPLODEZSP EXPLODESP(z, zc, zs, ze, zm)
2005-04-16 15:20:36 -07:00
# define COMPXDP \
2014-04-16 11:00:12 +02:00
u64 xm ; int xe ; int xs __maybe_unused ; int xc
2005-04-16 15:20:36 -07:00
# define COMPYDP \
2014-04-16 11:00:12 +02:00
u64 ym ; int ye ; int ys ; int yc
2016-04-21 14:04:51 +01:00
# define COMPZDP \
u64 zm ; int ze ; int zs ; int zc
2014-04-16 11:00:12 +02:00
# 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 ; \
2015-11-13 00:47:28 +00:00
else if ( ieee754_csr . nan2008 ^ ! ( vm & DP_MBIT ( DP_FBITS - 1 ) ) ) \
2014-04-16 11:00:12 +02:00
vc = IEEE754_CLASS_QNAN ; \
2015-11-13 00:47:28 +00:00
else \
vc = IEEE754_CLASS_SNAN ; \
2014-04-16 11:00:12 +02:00
} else if ( ve = = DP_EMIN - 1 + DP_EBIAS ) { \
if ( vm ) { \
ve = DP_EMIN ; \
vc = IEEE754_CLASS_DNORM ; \
2015-07-16 16:43:33 +01:00
} else \
vc = IEEE754_CLASS_ZERO ; \
2014-04-16 11:00:12 +02:00
} else { \
ve - = DP_EBIAS ; \
vm | = DP_HIDDEN_BIT ; \
vc = IEEE754_CLASS_NORM ; \
} \
2005-04-16 15:20:36 -07:00
}
2007-10-11 23:46:15 +01:00
# define EXPLODEXDP EXPLODEDP(x, xc, xs, xe, xm)
# define EXPLODEYDP EXPLODEDP(y, yc, ys, ye, ym)
2016-04-21 14:04:51 +01:00
# define EXPLODEZDP EXPLODEDP(z, zc, zs, ze, zm)
2005-04-16 15:20:36 -07:00
2014-04-16 11:00:12 +02:00
# define FLUSHDP(v, vc, vs, ve, vm) \
if ( vc = = IEEE754_CLASS_DNORM ) { \
if ( ieee754_csr . nod ) { \
2014-04-19 00:36:32 +02:00
ieee754_setcx ( IEEE754_INEXACT ) ; \
2014-04-16 11:00:12 +02:00
vc = IEEE754_CLASS_ZERO ; \
ve = DP_EMIN - 1 + DP_EBIAS ; \
vm = 0 ; \
v = ieee754dp_zero ( vs ) ; \
} \
2005-04-16 15:20:36 -07:00
}
2014-04-16 11:00:12 +02:00
# define FLUSHSP(v, vc, vs, ve, vm) \
if ( vc = = IEEE754_CLASS_DNORM ) { \
if ( ieee754_csr . nod ) { \
2014-04-19 00:36:32 +02:00
ieee754_setcx ( IEEE754_INEXACT ) ; \
2014-04-16 11:00:12 +02:00
vc = IEEE754_CLASS_ZERO ; \
ve = SP_EMIN - 1 + SP_EBIAS ; \
vm = 0 ; \
v = ieee754sp_zero ( vs ) ; \
} \
2005-04-16 15:20:36 -07:00
}
2007-10-11 23:46:15 +01:00
# define FLUSHXDP FLUSHDP(x, xc, xs, xe, xm)
# define FLUSHYDP FLUSHDP(y, yc, ys, ye, ym)
2016-04-21 14:04:51 +01:00
# define FLUSHZDP FLUSHDP(z, zc, zs, ze, zm)
2007-10-11 23:46:15 +01:00
# define FLUSHXSP FLUSHSP(x, xc, xs, xe, xm)
# define FLUSHYSP FLUSHSP(y, yc, ys, ye, ym)
2016-04-21 14:04:51 +01:00
# define FLUSHZSP FLUSHSP(z, zc, zs, ze, zm)
2014-04-19 00:15:40 +02:00
# endif /* __IEEE754INT_H */