Revision fe76d976 fpu/softfloat.c
b/fpu/softfloat.c | ||
---|---|---|
30 | 30 |
|
31 | 31 |
=============================================================================*/ |
32 | 32 |
|
33 |
/* FIXME: Flush-To-Zero only effects results. Denormal inputs should also |
|
34 |
be flushed to zero. */ |
|
33 | 35 |
#include "softfloat.h" |
34 | 36 |
|
35 | 37 |
/*---------------------------------------------------------------------------- |
... | ... | |
294 | 296 |
return packFloat32( zSign, 0xFF, - ( roundIncrement == 0 )); |
295 | 297 |
} |
296 | 298 |
if ( zExp < 0 ) { |
299 |
if ( STATUS(flush_to_zero) ) return packFloat32( zSign, 0, 0 ); |
|
297 | 300 |
isTiny = |
298 | 301 |
( STATUS(float_detect_tininess) == float_tininess_before_rounding ) |
299 | 302 |
|| ( zExp < -1 ) |
... | ... | |
457 | 460 |
return packFloat64( zSign, 0x7FF, - ( roundIncrement == 0 )); |
458 | 461 |
} |
459 | 462 |
if ( zExp < 0 ) { |
463 |
if ( STATUS(flush_to_zero) ) return packFloat64( zSign, 0, 0 ); |
|
460 | 464 |
isTiny = |
461 | 465 |
( STATUS(float_detect_tininess) == float_tininess_before_rounding ) |
462 | 466 |
|| ( zExp < -1 ) |
... | ... | |
635 | 639 |
goto overflow; |
636 | 640 |
} |
637 | 641 |
if ( zExp <= 0 ) { |
642 |
if ( STATUS(flush_to_zero) ) return packFloatx80( zSign, 0, 0 ); |
|
638 | 643 |
isTiny = |
639 | 644 |
( STATUS(float_detect_tininess) == float_tininess_before_rounding ) |
640 | 645 |
|| ( zExp < 0 ) |
... | ... | |
965 | 970 |
return packFloat128( zSign, 0x7FFF, 0, 0 ); |
966 | 971 |
} |
967 | 972 |
if ( zExp < 0 ) { |
973 |
if ( STATUS(flush_to_zero) ) return packFloat128( zSign, 0, 0, 0 ); |
|
968 | 974 |
isTiny = |
969 | 975 |
( STATUS(float_detect_tininess) == float_tininess_before_rounding ) |
970 | 976 |
|| ( zExp < -1 ) |
... | ... | |
1637 | 1643 |
if ( aSig | bSig ) return propagateFloat32NaN( a, b STATUS_VAR ); |
1638 | 1644 |
return a; |
1639 | 1645 |
} |
1640 |
if ( aExp == 0 ) return packFloat32( zSign, 0, ( aSig + bSig )>>6 ); |
|
1646 |
if ( aExp == 0 ) { |
|
1647 |
if ( STATUS(flush_to_zero) ) return packFloat32( zSign, 0, 0 ); |
|
1648 |
return packFloat32( zSign, 0, ( aSig + bSig )>>6 ); |
|
1649 |
} |
|
1641 | 1650 |
zSig = 0x40000000 + aSig + bSig; |
1642 | 1651 |
zExp = aExp; |
1643 | 1652 |
goto roundAndPack; |
... | ... | |
2595 | 2604 |
if ( aSig | bSig ) return propagateFloat64NaN( a, b STATUS_VAR ); |
2596 | 2605 |
return a; |
2597 | 2606 |
} |
2598 |
if ( aExp == 0 ) return packFloat64( zSign, 0, ( aSig + bSig )>>9 ); |
|
2607 |
if ( aExp == 0 ) { |
|
2608 |
if ( STATUS(flush_to_zero) ) return packFloat64( zSign, 0, 0 ); |
|
2609 |
return packFloat64( zSign, 0, ( aSig + bSig )>>9 ); |
|
2610 |
} |
|
2599 | 2611 |
zSig = LIT64( 0x4000000000000000 ) + aSig + bSig; |
2600 | 2612 |
zExp = aExp; |
2601 | 2613 |
goto roundAndPack; |
... | ... | |
4597 | 4609 |
return a; |
4598 | 4610 |
} |
4599 | 4611 |
add128( aSig0, aSig1, bSig0, bSig1, &zSig0, &zSig1 ); |
4600 |
if ( aExp == 0 ) return packFloat128( zSign, 0, zSig0, zSig1 ); |
|
4612 |
if ( aExp == 0 ) { |
|
4613 |
if ( STATUS(flush_to_zero) ) return packFloat128( zSign, 0, 0, 0 ); |
|
4614 |
return packFloat128( zSign, 0, zSig0, zSig1 ); |
|
4615 |
} |
|
4601 | 4616 |
zSig2 = 0; |
4602 | 4617 |
zSig0 |= LIT64( 0x0002000000000000 ); |
4603 | 4618 |
zExp = aExp; |
Also available in: Unified diff