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