aboutsummaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorJohn Hauser <jhauser@eecs.berkeley.edu>2014-12-11 14:27:41 -0800
committerJohn Hauser <jhauser@eecs.berkeley.edu>2014-12-11 14:27:41 -0800
commit5c93163afa8d4b00eddd401880c0bacb6d8c5d84 (patch)
treed9fb7f37413597d388d24a8c17546ce1d20c0bc6 /source
parent8f59d925353145a65c09301dea6c47da1f1311b1 (diff)
downloadberkeley-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.c10
-rw-r--r--source/extF80M_sub.c10
-rw-r--r--source/extF80_add.c10
-rw-r--r--source/extF80_sub.c10
-rw-r--r--source/f128M_add.c10
-rw-r--r--source/f128M_sub.c10
-rw-r--r--source/f128_add.c10
-rw-r--r--source/f128_sub.c10
-rw-r--r--source/f32_add.c10
-rw-r--r--source/f32_rem.c8
-rw-r--r--source/f32_sqrt.c3
-rw-r--r--source/f32_sub.c12
-rw-r--r--source/f64_add.c10
-rw-r--r--source/f64_rem.c6
-rw-r--r--source/f64_sub.c10
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
}