always propagate default NaN (all bits set)
authorAndrew Waterman <waterman@eecs.berkeley.edu>
Tue, 13 Mar 2012 00:40:43 +0000 (17:40 -0700)
committerAndrew Waterman <waterman@eecs.berkeley.edu>
Tue, 13 Mar 2012 00:40:43 +0000 (17:40 -0700)
softfloat_riscv/s_propagateNaNF32UI.c
softfloat_riscv/s_propagateNaNF64UI.c

index 07774e8fd12c43941a813dbfea4f2ff3b183e9e8..d8738d1382c3e64cd1ea49babb70479b926890a9 100755 (executable)
 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
index 0ff6446c4285ba22b7f5bf3ddaf69aeaa7fc52b6..871989d8560ff638f0edad8f5bdae5e616b3e09c 100755 (executable)
 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;
 }