diff options
author | John Hauser <jhauser@eecs.berkeley.edu> | 2018-01-26 12:51:15 -0800 |
---|---|---|
committer | John Hauser <jhauser@eecs.berkeley.edu> | 2018-01-26 12:51:15 -0800 |
commit | f74b1e48110ac3a27dd49b787d164e55e42d81d1 (patch) | |
tree | 036feef8d982dff57c2f7fd6688deb4790865b10 /source/extF80_roundToInt.c | |
parent | 63d601476b7b2eefe72b1705b942eaa65db8c0bf (diff) | |
download | berkeley-softfloat-3-f74b1e48110ac3a27dd49b787d164e55e42d81d1.zip berkeley-softfloat-3-f74b1e48110ac3a27dd49b787d164e55e42d81d1.tar.gz berkeley-softfloat-3-f74b1e48110ac3a27dd49b787d164e55e42d81d1.tar.bz2 |
Release 3e. See "doc/SoftFloat-history.html".
Diffstat (limited to 'source/extF80_roundToInt.c')
-rw-r--r-- | source/extF80_roundToInt.c | 25 |
1 files changed, 16 insertions, 9 deletions
diff --git a/source/extF80_roundToInt.c b/source/extF80_roundToInt.c index f7d9500..8103dae 100644 --- a/source/extF80_roundToInt.c +++ b/source/extF80_roundToInt.c @@ -2,7 +2,7 @@ /*============================================================================ This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic -Package, Release 3d, by John R. Hauser. +Package, Release 3e, by John R. Hauser. Copyright 2011, 2012, 2013, 2014, 2017 The Regents of the University of California. All rights reserved. @@ -64,8 +64,8 @@ extFloat80_t sigA = uA.s.signif; /*------------------------------------------------------------------------ *------------------------------------------------------------------------*/ - if ( ! (sigA & UINT64_C( 0x8000000000000000 )) && (exp != 0x7FFF) ) { - if ( ! sigA ) { + if ( !(sigA & UINT64_C( 0x8000000000000000 )) && (exp != 0x7FFF) ) { + if ( !sigA ) { uiZ64 = signUI64; sigZ = 0; goto uiZ; @@ -95,7 +95,7 @@ extFloat80_t if ( exact ) softfloat_exceptionFlags |= softfloat_flag_inexact; switch ( roundingMode ) { case softfloat_round_near_even: - if ( ! (sigA & UINT64_C( 0x7FFFFFFFFFFFFFFF )) ) break; + if ( !(sigA & UINT64_C( 0x7FFFFFFFFFFFFFFF )) ) break; case softfloat_round_near_maxMag: if ( exp == 0x3FFE ) goto mag1; break; @@ -103,8 +103,12 @@ extFloat80_t if ( signUI64 ) goto mag1; break; case softfloat_round_max: - if ( ! signUI64 ) goto mag1; + if ( !signUI64 ) goto mag1; break; +#ifdef SOFTFLOAT_ROUND_ODD + case softfloat_round_odd: + goto mag1; +#endif } uiZ64 = signUI64; sigZ = 0; @@ -124,19 +128,22 @@ extFloat80_t sigZ += lastBitMask>>1; } else if ( roundingMode == softfloat_round_near_even ) { sigZ += lastBitMask>>1; - if ( ! (sigZ & roundBitsMask) ) sigZ &= ~lastBitMask; + if ( !(sigZ & roundBitsMask) ) sigZ &= ~lastBitMask; } else if ( roundingMode == (signUI64 ? softfloat_round_min : softfloat_round_max) ) { sigZ += roundBitsMask; } sigZ &= ~roundBitsMask; - if ( ! sigZ ) { + if ( !sigZ ) { ++uiZ64; sigZ = UINT64_C( 0x8000000000000000 ); } - if ( exact && (sigZ != sigA) ) { - softfloat_exceptionFlags |= softfloat_flag_inexact; + if ( sigZ != sigA ) { +#ifdef SOFTFLOAT_ROUND_ODD + if ( roundingMode == softfloat_round_odd ) sigZ |= lastBitMask; +#endif + if ( exact ) softfloat_exceptionFlags |= softfloat_flag_inexact; } uiZ: uZ.s.signExp = uiZ64; |