diff options
| author | Rich Felker <dalias@aerifal.cx> | 2012-03-16 23:58:49 -0400 | 
|---|---|---|
| committer | Rich Felker <dalias@aerifal.cx> | 2012-03-16 23:58:49 -0400 | 
| commit | 2e77dc13f8bc2053642fcb136996f5f36c88c775 (patch) | |
| tree | c0fc346570b01898381431c51cd7520a22c402fb /src/math/fma.c | |
| parent | 8c071f872b2844ca297275176047f8d23eec96a7 (diff) | |
| download | musl-2e77dc13f8bc2053642fcb136996f5f36c88c775.tar.gz | |
make fma and lrint functions build without full fenv support
this is necessary to support archs where fenv is incomplete or
unavailable (presently arm). fma, fmal, and the lrint family should
work perfectly fine with this change; fmaf is slightly broken with
respect to rounding as it depends on non-default rounding modes to do
its work.
Diffstat (limited to 'src/math/fma.c')
| -rw-r--r-- | src/math/fma.c | 14 | 
1 files changed, 12 insertions, 2 deletions
diff --git a/src/math/fma.c b/src/math/fma.c index c53f3148..f44ecda7 100644 --- a/src/math/fma.c +++ b/src/math/fma.c @@ -199,27 +199,37 @@ double fma(double x, double y, double z)  	 * modes other than FE_TONEAREST are painful.  	 */  	if (spread < -DBL_MANT_DIG) { +#ifdef FE_INEXACT  		feraiseexcept(FE_INEXACT); +#endif +#ifdef FE_UNDERFLOW  		if (!isnormal(z))  			feraiseexcept(FE_UNDERFLOW); +#endif  		switch (oround) { -		case FE_TONEAREST: +		default: /* FE_TONEAREST */  			return (z); +#ifdef FE_TOWARDZERO  		case FE_TOWARDZERO:  			if (x > 0.0 ^ y < 0.0 ^ z < 0.0)  				return (z);  			else  				return (nextafter(z, 0)); +#endif +#ifdef FE_DOWNWARD  		case FE_DOWNWARD:  			if (x > 0.0 ^ y < 0.0)  				return (z);  			else  				return (nextafter(z, -INFINITY)); -		default:        /* FE_UPWARD */ +#endif +#ifdef FE_UPWARD +		case FE_UPWARD:  			if (x > 0.0 ^ y < 0.0)  				return (nextafter(z, INFINITY));  			else  				return (z); +#endif  		}  	}  	if (spread <= DBL_MANT_DIG * 2)  | 
