diff options
author | John Hauser <jhauser@eecs.berkeley.edu> | 2014-12-11 14:27:41 -0800 |
---|---|---|
committer | John Hauser <jhauser@eecs.berkeley.edu> | 2014-12-11 14:27:41 -0800 |
commit | 5c93163afa8d4b00eddd401880c0bacb6d8c5d84 (patch) | |
tree | d9fb7f37413597d388d24a8c17546ce1d20c0bc6 /source | |
parent | 8f59d925353145a65c09301dea6c47da1f1311b1 (diff) | |
download | berkeley-softfloat-3-5c93163afa8d4b00eddd401880c0bacb6d8c5d84.zip berkeley-softfloat-3-5c93163afa8d4b00eddd401880c0bacb6d8c5d84.tar.gz berkeley-softfloat-3-5c93163afa8d4b00eddd401880c0bacb6d8c5d84.tar.bz2 |
Update in RC for Release 3, fixing some bugs and adding to the documentation.
Diffstat (limited to 'source')
-rw-r--r-- | source/extF80M_add.c | 10 | ||||
-rw-r--r-- | source/extF80M_sub.c | 10 | ||||
-rw-r--r-- | source/extF80_add.c | 10 | ||||
-rw-r--r-- | source/extF80_sub.c | 10 | ||||
-rw-r--r-- | source/f128M_add.c | 10 | ||||
-rw-r--r-- | source/f128M_sub.c | 10 | ||||
-rw-r--r-- | source/f128_add.c | 10 | ||||
-rw-r--r-- | source/f128_sub.c | 10 | ||||
-rw-r--r-- | source/f32_add.c | 10 | ||||
-rw-r--r-- | source/f32_rem.c | 8 | ||||
-rw-r--r-- | source/f32_sqrt.c | 3 | ||||
-rw-r--r-- | source/f32_sub.c | 12 | ||||
-rw-r--r-- | source/f64_add.c | 10 | ||||
-rw-r--r-- | source/f64_rem.c | 6 | ||||
-rw-r--r-- | source/f64_sub.c | 10 |
15 files changed, 129 insertions, 10 deletions
diff --git a/source/extF80M_add.c b/source/extF80M_add.c index 8499393..f39852d 100644 --- a/source/extF80M_add.c +++ b/source/extF80M_add.c @@ -49,9 +49,11 @@ void uint_fast16_t uiB64; uint_fast64_t uiB0; bool signB; +#if ! defined INLINE_LEVEL || (INLINE_LEVEL < 2) extFloat80_t (*magsFuncPtr)( uint_fast16_t, uint_fast64_t, uint_fast16_t, uint_fast64_t, bool ); +#endif aSPtr = (const struct extFloat80M *) aPtr; bSPtr = (const struct extFloat80M *) bPtr; @@ -61,9 +63,17 @@ void uiB64 = bSPtr->signExp; uiB0 = bSPtr->signif; signB = signExtF80UI64( uiB64 ); +#if defined INLINE_LEVEL && (2 <= INLINE_LEVEL) + if ( signA == signB ) { + *zPtr = softfloat_addMagsExtF80( uiA64, uiA0, uiB64, uiB0, signA ); + } else { + *zPtr = softfloat_subMagsExtF80( uiA64, uiA0, uiB64, uiB0, signA ); + } +#else magsFuncPtr = (signA == signB) ? softfloat_addMagsExtF80 : softfloat_subMagsExtF80; *zPtr = (*magsFuncPtr)( uiA64, uiA0, uiB64, uiB0, signA ); +#endif } diff --git a/source/extF80M_sub.c b/source/extF80M_sub.c index a0a1ae3..a79fb71 100644 --- a/source/extF80M_sub.c +++ b/source/extF80M_sub.c @@ -49,9 +49,11 @@ void uint_fast16_t uiB64; uint_fast64_t uiB0; bool signB; +#if ! defined INLINE_LEVEL || (INLINE_LEVEL < 2) extFloat80_t (*magsFuncPtr)( uint_fast16_t, uint_fast64_t, uint_fast16_t, uint_fast64_t, bool ); +#endif aSPtr = (const struct extFloat80M *) aPtr; bSPtr = (const struct extFloat80M *) bPtr; @@ -61,9 +63,17 @@ void uiB64 = bSPtr->signExp; uiB0 = bSPtr->signif; signB = signExtF80UI64( uiB64 ); +#if defined INLINE_LEVEL && (2 <= INLINE_LEVEL) + if ( signA == signB ) { + *zPtr = softfloat_subMagsExtF80( uiA64, uiA0, uiB64, uiB0, signA ); + } else { + *zPtr = softfloat_addMagsExtF80( uiA64, uiA0, uiB64, uiB0, signA ); + } +#else magsFuncPtr = (signA == signB) ? softfloat_subMagsExtF80 : softfloat_addMagsExtF80; *zPtr = (*magsFuncPtr)( uiA64, uiA0, uiB64, uiB0, signA ); +#endif } diff --git a/source/extF80_add.c b/source/extF80_add.c index dcf1d36..e6aae82 100644 --- a/source/extF80_add.c +++ b/source/extF80_add.c @@ -47,9 +47,11 @@ extFloat80_t extF80_add( extFloat80_t a, extFloat80_t b ) uint_fast16_t uiB64; uint_fast64_t uiB0; bool signB; +#if ! defined INLINE_LEVEL || (INLINE_LEVEL < 2) extFloat80_t (*magsFuncPtr)( uint_fast16_t, uint_fast64_t, uint_fast16_t, uint_fast64_t, bool ); +#endif uA.f = a; uiA64 = uA.s.signExp; @@ -59,9 +61,17 @@ extFloat80_t extF80_add( extFloat80_t a, extFloat80_t b ) uiB64 = uB.s.signExp; uiB0 = uB.s.signif; signB = signExtF80UI64( uiB64 ); +#if defined INLINE_LEVEL && (2 <= INLINE_LEVEL) + if ( signA == signB ) { + return softfloat_addMagsExtF80( uiA64, uiA0, uiB64, uiB0, signA ); + } else { + return softfloat_subMagsExtF80( uiA64, uiA0, uiB64, uiB0, signA ); + } +#else magsFuncPtr = (signA == signB) ? softfloat_addMagsExtF80 : softfloat_subMagsExtF80; return (*magsFuncPtr)( uiA64, uiA0, uiB64, uiB0, signA ); +#endif } diff --git a/source/extF80_sub.c b/source/extF80_sub.c index 66043b7..abbd7c3 100644 --- a/source/extF80_sub.c +++ b/source/extF80_sub.c @@ -47,9 +47,11 @@ extFloat80_t extF80_sub( extFloat80_t a, extFloat80_t b ) uint_fast16_t uiB64; uint_fast64_t uiB0; bool signB; +#if ! defined INLINE_LEVEL || (INLINE_LEVEL < 2) extFloat80_t (*magsFuncPtr)( uint_fast16_t, uint_fast64_t, uint_fast16_t, uint_fast64_t, bool ); +#endif uA.f = a; uiA64 = uA.s.signExp; @@ -59,9 +61,17 @@ extFloat80_t extF80_sub( extFloat80_t a, extFloat80_t b ) uiB64 = uB.s.signExp; uiB0 = uB.s.signif; signB = signExtF80UI64( uiB64 ); +#if defined INLINE_LEVEL && (2 <= INLINE_LEVEL) + if ( signA == signB ) { + return softfloat_subMagsExtF80( uiA64, uiA0, uiB64, uiB0, signA ); + } else { + return softfloat_addMagsExtF80( uiA64, uiA0, uiB64, uiB0, signA ); + } +#else magsFuncPtr = (signA == signB) ? softfloat_subMagsExtF80 : softfloat_addMagsExtF80; return (*magsFuncPtr)( uiA64, uiA0, uiB64, uiB0, signA ); +#endif } diff --git a/source/f128M_add.c b/source/f128M_add.c index 5a46fe8..930d4b4 100644 --- a/source/f128M_add.c +++ b/source/f128M_add.c @@ -47,9 +47,11 @@ void bool signA; uint_fast64_t uiB64, uiB0; bool signB; +#if ! defined INLINE_LEVEL || (INLINE_LEVEL < 2) float128_t (*magsFuncPtr)( uint_fast64_t, uint_fast64_t, uint_fast64_t, uint_fast64_t, bool ); +#endif aWPtr = (const uint64_t *) aPtr; bWPtr = (const uint64_t *) bPtr; @@ -59,9 +61,17 @@ void uiB64 = bWPtr[indexWord( 2, 1 )]; uiB0 = bWPtr[indexWord( 2, 0 )]; signB = signF128UI64( uiB64 ); +#if defined INLINE_LEVEL && (2 <= INLINE_LEVEL) + if ( signA == signB ) { + *zPtr = softfloat_addMagsF128( uiA64, uiA0, uiB64, uiB0, signA ); + } else { + *zPtr = softfloat_subMagsF128( uiA64, uiA0, uiB64, uiB0, signA ); + } +#else magsFuncPtr = (signA == signB) ? softfloat_addMagsF128 : softfloat_subMagsF128; *zPtr = (*magsFuncPtr)( uiA64, uiA0, uiB64, uiB0, signA ); +#endif } diff --git a/source/f128M_sub.c b/source/f128M_sub.c index b53d8df..9776ddd 100644 --- a/source/f128M_sub.c +++ b/source/f128M_sub.c @@ -47,9 +47,11 @@ void bool signA; uint_fast64_t uiB64, uiB0; bool signB; +#if ! defined INLINE_LEVEL || (INLINE_LEVEL < 2) float128_t (*magsFuncPtr)( uint_fast64_t, uint_fast64_t, uint_fast64_t, uint_fast64_t, bool ); +#endif aWPtr = (const uint64_t *) aPtr; bWPtr = (const uint64_t *) bPtr; @@ -59,9 +61,17 @@ void uiB64 = bWPtr[indexWord( 2, 1 )]; uiB0 = bWPtr[indexWord( 2, 0 )]; signB = signF128UI64( uiB64 ); +#if defined INLINE_LEVEL && (2 <= INLINE_LEVEL) + if ( signA == signB ) { + *zPtr = softfloat_subMagsF128( uiA64, uiA0, uiB64, uiB0, signA ); + } else { + *zPtr = softfloat_addMagsF128( uiA64, uiA0, uiB64, uiB0, signA ); + } +#else magsFuncPtr = (signA == signB) ? softfloat_subMagsF128 : softfloat_addMagsF128; *zPtr = (*magsFuncPtr)( uiA64, uiA0, uiB64, uiB0, signA ); +#endif } diff --git a/source/f128_add.c b/source/f128_add.c index b168508..bcc15db 100644 --- a/source/f128_add.c +++ b/source/f128_add.c @@ -45,9 +45,11 @@ float128_t f128_add( float128_t a, float128_t b ) union ui128_f128 uB; uint_fast64_t uiB64, uiB0; bool signB; +#if ! defined INLINE_LEVEL || (INLINE_LEVEL < 2) float128_t (*magsFuncPtr)( uint_fast64_t, uint_fast64_t, uint_fast64_t, uint_fast64_t, bool ); +#endif uA.f = a; uiA64 = uA.ui.v64; @@ -57,9 +59,17 @@ float128_t f128_add( float128_t a, float128_t b ) uiB64 = uB.ui.v64; uiB0 = uB.ui.v0; signB = signF128UI64( uiB64 ); +#if defined INLINE_LEVEL && (2 <= INLINE_LEVEL) + if ( signA == signB ) { + return softfloat_addMagsF128( uiA64, uiA0, uiB64, uiB0, signA ); + } else { + return softfloat_subMagsF128( uiA64, uiA0, uiB64, uiB0, signA ); + } +#else magsFuncPtr = (signA == signB) ? softfloat_addMagsF128 : softfloat_subMagsF128; return (*magsFuncPtr)( uiA64, uiA0, uiB64, uiB0, signA ); +#endif } diff --git a/source/f128_sub.c b/source/f128_sub.c index f29b2ae..b54bc35 100644 --- a/source/f128_sub.c +++ b/source/f128_sub.c @@ -45,9 +45,11 @@ float128_t f128_sub( float128_t a, float128_t b ) union ui128_f128 uB; uint_fast64_t uiB64, uiB0; bool signB; +#if ! defined INLINE_LEVEL || (INLINE_LEVEL < 2) float128_t (*magsFuncPtr)( uint_fast64_t, uint_fast64_t, uint_fast64_t, uint_fast64_t, bool ); +#endif uA.f = a; uiA64 = uA.ui.v64; @@ -57,9 +59,17 @@ float128_t f128_sub( float128_t a, float128_t b ) uiB64 = uB.ui.v64; uiB0 = uB.ui.v0; signB = signF128UI64( uiB64 ); +#if defined INLINE_LEVEL && (2 <= INLINE_LEVEL) + if ( signA == signB ) { + return softfloat_subMagsF128( uiA64, uiA0, uiB64, uiB0, signA ); + } else { + return softfloat_addMagsF128( uiA64, uiA0, uiB64, uiB0, signA ); + } +#else magsFuncPtr = (signA == signB) ? softfloat_subMagsF128 : softfloat_addMagsF128; return (*magsFuncPtr)( uiA64, uiA0, uiB64, uiB0, signA ); +#endif } diff --git a/source/f32_add.c b/source/f32_add.c index 0a51115..6485b59 100644 --- a/source/f32_add.c +++ b/source/f32_add.c @@ -45,7 +45,9 @@ float32_t f32_add( float32_t a, float32_t b ) union ui32_f32 uB; uint_fast32_t uiB; bool signB; +#if ! defined INLINE_LEVEL || (INLINE_LEVEL < 1) float32_t (*magsFuncPtr)( uint_fast32_t, uint_fast32_t, bool ); +#endif uA.f = a; uiA = uA.ui; @@ -53,9 +55,17 @@ float32_t f32_add( float32_t a, float32_t b ) uB.f = b; uiB = uB.ui; signB = signF32UI( uiB ); +#if defined INLINE_LEVEL && (1 <= INLINE_LEVEL) + if ( signA == signB ) { + return softfloat_addMagsF32( uiA, uiB, signA ); + } else { + return softfloat_subMagsF32( uiA, uiB, signA ); + } +#else magsFuncPtr = (signA == signB) ? softfloat_addMagsF32 : softfloat_subMagsF32; return (*magsFuncPtr)( uiA, uiB, signA ); +#endif } diff --git a/source/f32_rem.c b/source/f32_rem.c index 73bcb00..583293b 100644 --- a/source/f32_rem.c +++ b/source/f32_rem.c @@ -50,11 +50,9 @@ float32_t f32_rem( float32_t a, float32_t b ) int_fast16_t expB; uint_fast32_t sigB; struct exp16_sig32 normExpSig; - uint_fast32_t rem; + uint32_t rem; int_fast16_t expDiff; - uint32_t q, recip32; - uint_fast32_t altRem; - uint32_t meanRem; + uint32_t q, recip32, altRem, meanRem; bool signRem; uint_fast32_t uiZ; union ui32_f32 uZ; @@ -125,7 +123,7 @@ float32_t f32_rem( float32_t a, float32_t b ) *--------------------------------------------------------------------*/ sigB <<= 6; for (;;) { - q = ((uint32_t) rem * (uint_fast64_t) recip32)>>32; + q = (rem * (uint_fast64_t) recip32)>>32; if ( expDiff < 0 ) break; rem = -(q * (uint32_t) sigB); expDiff -= 29; diff --git a/source/f32_sqrt.c b/source/f32_sqrt.c index 6b946ba..38a3e8a 100644 --- a/source/f32_sqrt.c +++ b/source/f32_sqrt.c @@ -47,7 +47,8 @@ float32_t f32_sqrt( float32_t a ) uint_fast32_t sigA, uiZ; struct exp16_sig32 normExpSig; int_fast16_t expZ; - uint_fast32_t sigZ, shiftedSigZ, negRem; + uint_fast32_t sigZ, shiftedSigZ; + uint32_t negRem; union ui32_f32 uZ; /*------------------------------------------------------------------------ diff --git a/source/f32_sub.c b/source/f32_sub.c index 67aad28..f18a968 100644 --- a/source/f32_sub.c +++ b/source/f32_sub.c @@ -45,7 +45,9 @@ float32_t f32_sub( float32_t a, float32_t b ) union ui32_f32 uB; uint_fast32_t uiB; bool signB; +#if ! defined INLINE_LEVEL || (INLINE_LEVEL < 1) float32_t (*magsFuncPtr)( uint_fast32_t, uint_fast32_t, bool ); +#endif uA.f = a; uiA = uA.ui; @@ -53,9 +55,17 @@ float32_t f32_sub( float32_t a, float32_t b ) uB.f = b; uiB = uB.ui; signB = signF32UI( uiB ); +#if defined INLINE_LEVEL && (1 <= INLINE_LEVEL) + if ( signA == signB ) { + return softfloat_subMagsF32( uiA, uiB, signA ); + } else { + return softfloat_addMagsF32( uiA, uiB, signA ); + } +#else magsFuncPtr = (signA == signB) ? softfloat_subMagsF32 : softfloat_addMagsF32; - return (*magsFuncPtr)( uiA, uiB ^ 0x80000000, signA ); + return (*magsFuncPtr)( uiA, uiB, signA ); +#endif } diff --git a/source/f64_add.c b/source/f64_add.c index fcce50e..8bdb428 100644 --- a/source/f64_add.c +++ b/source/f64_add.c @@ -45,7 +45,9 @@ float64_t f64_add( float64_t a, float64_t b ) union ui64_f64 uB; uint_fast64_t uiB; bool signB; +#if ! defined INLINE_LEVEL || (INLINE_LEVEL < 2) float64_t (*magsFuncPtr)( uint_fast64_t, uint_fast64_t, bool ); +#endif uA.f = a; uiA = uA.ui; @@ -53,9 +55,17 @@ float64_t f64_add( float64_t a, float64_t b ) uB.f = b; uiB = uB.ui; signB = signF64UI( uiB ); +#if defined INLINE_LEVEL && (2 <= INLINE_LEVEL) + if ( signA == signB ) { + return softfloat_addMagsF64( uiA, uiB, signA ); + } else { + return softfloat_subMagsF64( uiA, uiB, signA ); + } +#else magsFuncPtr = (signA == signB) ? softfloat_addMagsF64 : softfloat_subMagsF64; return (*magsFuncPtr)( uiA, uiB, signA ); +#endif } diff --git a/source/f64_rem.c b/source/f64_rem.c index 8bc1d3c..77c5e27 100644 --- a/source/f64_rem.c +++ b/source/f64_rem.c @@ -50,11 +50,11 @@ float64_t f64_rem( float64_t a, float64_t b ) int_fast16_t expB; uint_fast64_t sigB; struct exp16_sig64 normExpSig; - uint_fast64_t rem; + uint64_t rem; int_fast16_t expDiff; uint32_t q, recip32; - uint_fast64_t q64, altRem; - uint64_t meanRem; + uint_fast64_t q64; + uint64_t altRem, meanRem; bool signRem; uint_fast64_t uiZ; union ui64_f64 uZ; diff --git a/source/f64_sub.c b/source/f64_sub.c index e229574..6d38386 100644 --- a/source/f64_sub.c +++ b/source/f64_sub.c @@ -45,7 +45,9 @@ float64_t f64_sub( float64_t a, float64_t b ) union ui64_f64 uB; uint_fast64_t uiB; bool signB; +#if ! defined INLINE_LEVEL || (INLINE_LEVEL < 2) float64_t (*magsFuncPtr)( uint_fast64_t, uint_fast64_t, bool ); +#endif uA.f = a; uiA = uA.ui; @@ -53,9 +55,17 @@ float64_t f64_sub( float64_t a, float64_t b ) uB.f = b; uiB = uB.ui; signB = signF64UI( uiB ); +#if defined INLINE_LEVEL && (2 <= INLINE_LEVEL) + if ( signA == signB ) { + return softfloat_subMagsF64( uiA, uiB, signA ); + } else { + return softfloat_addMagsF64( uiA, uiB, signA ); + } +#else magsFuncPtr = (signA == signB) ? softfloat_subMagsF64 : softfloat_addMagsF64; return (*magsFuncPtr)( uiA, uiB, signA ); +#endif } |