Revision e6afc87f

b/fpu/softfloat.c
341 341
            return packFloat32( zSign, 0xFF, - ( roundIncrement == 0 ));
342 342
        }
343 343
        if ( zExp < 0 ) {
344
            if ( STATUS(flush_to_zero) ) return packFloat32( zSign, 0, 0 );
344
            if (STATUS(flush_to_zero)) {
345
                float_raise(float_flag_output_denormal STATUS_VAR);
346
                return packFloat32(zSign, 0, 0);
347
            }
345 348
            isTiny =
346 349
                   ( STATUS(float_detect_tininess) == float_tininess_before_rounding )
347 350
                || ( zExp < -1 )
......
520 523
            return packFloat64( zSign, 0x7FF, - ( roundIncrement == 0 ));
521 524
        }
522 525
        if ( zExp < 0 ) {
523
            if ( STATUS(flush_to_zero) ) return packFloat64( zSign, 0, 0 );
526
            if (STATUS(flush_to_zero)) {
527
                float_raise(float_flag_output_denormal STATUS_VAR);
528
                return packFloat64(zSign, 0, 0);
529
            }
524 530
            isTiny =
525 531
                   ( STATUS(float_detect_tininess) == float_tininess_before_rounding )
526 532
                || ( zExp < -1 )
......
699 705
            goto overflow;
700 706
        }
701 707
        if ( zExp <= 0 ) {
702
            if ( STATUS(flush_to_zero) ) return packFloatx80( zSign, 0, 0 );
708
            if (STATUS(flush_to_zero)) {
709
                float_raise(float_flag_output_denormal STATUS_VAR);
710
                return packFloatx80(zSign, 0, 0);
711
            }
703 712
            isTiny =
704 713
                   ( STATUS(float_detect_tininess) == float_tininess_before_rounding )
705 714
                || ( zExp < 0 )
......
1030 1039
            return packFloat128( zSign, 0x7FFF, 0, 0 );
1031 1040
        }
1032 1041
        if ( zExp < 0 ) {
1033
            if ( STATUS(flush_to_zero) ) return packFloat128( zSign, 0, 0, 0 );
1042
            if (STATUS(flush_to_zero)) {
1043
                float_raise(float_flag_output_denormal STATUS_VAR);
1044
                return packFloat128(zSign, 0, 0, 0);
1045
            }
1034 1046
            isTiny =
1035 1047
                   ( STATUS(float_detect_tininess) == float_tininess_before_rounding )
1036 1048
                || ( zExp < -1 )
......
1761 1773
            return a;
1762 1774
        }
1763 1775
        if ( aExp == 0 ) {
1764
            if ( STATUS(flush_to_zero) ) return packFloat32( zSign, 0, 0 );
1776
            if (STATUS(flush_to_zero)) {
1777
                if (aSig | bSig) {
1778
                    float_raise(float_flag_output_denormal STATUS_VAR);
1779
                }
1780
                return packFloat32(zSign, 0, 0);
1781
            }
1765 1782
            return packFloat32( zSign, 0, ( aSig + bSig )>>6 );
1766 1783
        }
1767 1784
        zSig = 0x40000000 + aSig + bSig;
......
3120 3137
            return a;
3121 3138
        }
3122 3139
        if ( aExp == 0 ) {
3123
            if ( STATUS(flush_to_zero) ) return packFloat64( zSign, 0, 0 );
3140
            if (STATUS(flush_to_zero)) {
3141
                if (aSig | bSig) {
3142
                    float_raise(float_flag_output_denormal STATUS_VAR);
3143
                }
3144
                return packFloat64(zSign, 0, 0);
3145
            }
3124 3146
            return packFloat64( zSign, 0, ( aSig + bSig )>>9 );
3125 3147
        }
3126 3148
        zSig = LIT64( 0x4000000000000000 ) + aSig + bSig;
......
5282 5304
        }
5283 5305
        add128( aSig0, aSig1, bSig0, bSig1, &zSig0, &zSig1 );
5284 5306
        if ( aExp == 0 ) {
5285
            if ( STATUS(flush_to_zero) ) return packFloat128( zSign, 0, 0, 0 );
5307
            if (STATUS(flush_to_zero)) {
5308
                if (zSig0 | zSig1) {
5309
                    float_raise(float_flag_output_denormal STATUS_VAR);
5310
                }
5311
                return packFloat128(zSign, 0, 0, 0);
5312
            }
5286 5313
            return packFloat128( zSign, 0, zSig0, zSig1 );
5287 5314
        }
5288 5315
        zSig2 = 0;
b/fpu/softfloat.h
193 193
    float_flag_overflow  =  8,
194 194
    float_flag_underflow = 16,
195 195
    float_flag_inexact   = 32,
196
    float_flag_input_denormal = 64
196
    float_flag_input_denormal = 64,
197
    float_flag_output_denormal = 128
197 198
};
198 199

  
199 200
typedef struct float_status {

Also available in: Unified diff