uint_fast32_t\r
softfloat_propagateNaNF32UI( uint_fast32_t uiA, uint_fast32_t uiB )\r
{\r
- bool isNaNA, isSigNaNA, isNaNB, isSigNaNB;\r
- uint_fast32_t uiMagA, uiMagB;\r
-\r
- /*------------------------------------------------------------------------\r
- *------------------------------------------------------------------------*/\r
- isNaNA = isNaNF32UI( uiA );\r
- isSigNaNA = softfloat_isSigNaNF32UI( uiA );\r
- isNaNB = isNaNF32UI( uiB );\r
- isSigNaNB = softfloat_isSigNaNF32UI( uiB );\r
- /*------------------------------------------------------------------------\r
- | Make NaNs non-signaling.\r
- *------------------------------------------------------------------------*/\r
- uiA |= 0x00400000;\r
- uiB |= 0x00400000;\r
- /*------------------------------------------------------------------------\r
- *------------------------------------------------------------------------*/\r
- if ( isSigNaNA | isSigNaNB ) {\r
+ if ( softfloat_isSigNaNF32UI( uiA ) | softfloat_isSigNaNF32UI( uiB ) ) {\r
softfloat_raiseFlags( softfloat_flag_invalid );\r
}\r
- if ( isSigNaNA ) {\r
- if ( isSigNaNB ) goto returnLargerSignificand;\r
- return isNaNB ? uiB : uiA;\r
- } else if ( isNaNA ) {\r
- if ( isSigNaNB || ! isNaNB ) return uiA;\r
- returnLargerSignificand:\r
- uiMagA = uiA<<1;\r
- uiMagB = uiB<<1;\r
- if ( uiMagA < uiMagB ) return uiB;\r
- if ( uiMagB < uiMagA ) return uiA;\r
- return ( uiA < uiB ) ? uiA : uiB;\r
- } else {\r
- return uiB;\r
- }\r
-\r
+ return defaultNaNF32UI;\r
}\r
\r
uint_fast64_t
softfloat_propagateNaNF64UI( uint_fast64_t uiA, uint_fast64_t uiB )
{
- bool isNaNA, isSigNaNA, isNaNB, isSigNaNB;
- uint_fast64_t uiMagA, uiMagB;
-
- /*------------------------------------------------------------------------
- *------------------------------------------------------------------------*/
- isNaNA = isNaNF64UI( uiA );
- isSigNaNA = softfloat_isSigNaNF64UI( uiA );
- isNaNB = isNaNF64UI( uiB );
- isSigNaNB = softfloat_isSigNaNF64UI( uiB );
- /*------------------------------------------------------------------------
- | Make NaNs non-signaling.
- *------------------------------------------------------------------------*/
- uiA |= UINT64_C( 0x0008000000000000 );
- uiB |= UINT64_C( 0x0008000000000000 );
- /*------------------------------------------------------------------------
- *------------------------------------------------------------------------*/
- if ( isSigNaNA | isSigNaNB ) {
+ if ( softfloat_isSigNaNF64UI( uiA ) | softfloat_isSigNaNF64UI( uiB ) ) {
softfloat_raiseFlags( softfloat_flag_invalid );
}
- if ( isSigNaNA ) {
- if ( isSigNaNB ) goto returnLargerSignificand;
- return isNaNB ? uiB : uiA;
- } else if ( isNaNA ) {
- if ( isSigNaNB || ! isNaNB ) return uiA;
- returnLargerSignificand:
- uiMagA = uiA & UINT64_C( 0x7FFFFFFFFFFFFFFF );
- uiMagB = uiB & UINT64_C( 0x7FFFFFFFFFFFFFFF );
- if ( uiMagA < uiMagB ) return uiB;
- if ( uiMagB < uiMagA ) return uiA;
- return ( uiA < uiB ) ? uiA : uiB;
- } else {
- return uiB;
- }
-
+ return defaultNaNF64UI;
}