bool extF80_lt_quiet( extFloat80_t a, extFloat80_t b ) { union { struct extFloat80M s; extFloat80_t f; } uA; uint_fast16_t uiA64; uint_fast64_t uiA0; union { struct extFloat80M s; extFloat80_t f; } uB; uint_fast16_t uiB64; uint_fast64_t uiB0; bool signA, signB; uA.f = a; uiA64 = uA.s.signExp; uiA0 = uA.s.signif; uB.f = b; uiB64 = uB.s.signExp; uiB0 = uB.s.signif; if ( isNaNExtF80UI( uiA64, uiA0 ) || isNaNExtF80UI( uiB64, uiB0 ) ) { if ( softfloat_isSigNaNExtF80UI( uiA64, uiA0 ) || softfloat_isSigNaNExtF80UI( uiB64, uiB0 ) ) { softfloat_raiseFlags( softfloat_flag_invalid ); } return false; } signA = signExtF80UI64( uiA64 ); signB = signExtF80UI64( uiB64 ); return (signA != signB) ? signA && (((uiA64 | uiB64) & 0x7FFF) | uiA0 | uiB0) : ((uiA64 != uiB64) || (uiA0 != uiB0)) && (signA ^ softfloat_lt128( uiA64, uiA0, uiB64, uiB0 )); }
bool extF80_eq( extFloat80_t a, extFloat80_t b ) { union { struct extFloat80M s; extFloat80_t f; } uA; uint_fast16_t uiA64; uint_fast64_t uiA0; union { struct extFloat80M s; extFloat80_t f; } uB; uint_fast16_t uiB64; uint_fast64_t uiB0; uA.f = a; uiA64 = uA.s.signExp; uiA0 = uA.s.signif; uB.f = b; uiB64 = uB.s.signExp; uiB0 = uB.s.signif; if ( isNaNExtF80UI( uiA64, uiA0 ) || isNaNExtF80UI( uiB64, uiB0 ) ) { if ( softfloat_isSigNaNExtF80UI( uiA64, uiA0 ) || softfloat_isSigNaNExtF80UI( uiB64, uiB0 ) ) { softfloat_raiseFlags( softfloat_flag_invalid ); } return false; } return (uiA0 == uiB0) && ((uiA64 == uiB64) || (! uiA0 && ! ((uiA64 | uiB64) & 0x7FFF))); }
bool extF80M_lt_quiet( const extFloat80_t *aPtr, const extFloat80_t *bPtr ) { const struct extFloat80M *aSPtr, *bSPtr; uint_fast16_t uiA64; uint64_t uiA0; uint_fast16_t uiB64; uint64_t uiB0; bool signA, ltMags; /*------------------------------------------------------------------------ *------------------------------------------------------------------------*/ aSPtr = (const struct extFloat80M *) aPtr; bSPtr = (const struct extFloat80M *) bPtr; /*------------------------------------------------------------------------ *------------------------------------------------------------------------*/ uiA64 = aSPtr->signExp; uiA0 = aSPtr->signif; uiB64 = bSPtr->signExp; uiB0 = bSPtr->signif; /*------------------------------------------------------------------------ *------------------------------------------------------------------------*/ if ( isNaNExtF80UI( uiA64, uiA0 ) || isNaNExtF80UI( uiB64, uiB0 ) ) { if ( softfloat_isSigNaNExtF80UI( uiA64, uiA0 ) || softfloat_isSigNaNExtF80UI( uiB64, uiB0 ) ) { softfloat_raiseFlags( softfloat_flag_invalid ); } return false; } /*------------------------------------------------------------------------ *------------------------------------------------------------------------*/ signA = signExtF80UI64( uiA64 ); if ( (uiA64 ^ uiB64) & 0x8000 ) { /*-------------------------------------------------------------------- | Signs are different. *--------------------------------------------------------------------*/ return signA && ((uiA0 | uiB0) != 0); } else { /*-------------------------------------------------------------------- | Signs are the same. *--------------------------------------------------------------------*/ if ( ! ((uiA0 & uiB0) & UINT64_C( 0x8000000000000000 )) ) { return (softfloat_compareNonnormExtF80M( aSPtr, bSPtr ) < 0); } if ( uiA64 == uiB64 ) { if ( uiA0 == uiB0 ) return false; ltMags = (uiA0 < uiB0); } else { ltMags = (uiA64 < uiB64); } return signA ^ ltMags; } }
bool extF80M_eq( const extFloat80_t *aPtr, const extFloat80_t *bPtr ) { const struct extFloat80M *aSPtr, *bSPtr; uint_fast16_t uiA64; uint64_t uiA0; uint_fast16_t uiB64; uint64_t uiB0; /*------------------------------------------------------------------------ *------------------------------------------------------------------------*/ aSPtr = (const struct extFloat80M *) aPtr; bSPtr = (const struct extFloat80M *) bPtr; /*------------------------------------------------------------------------ *------------------------------------------------------------------------*/ uiA64 = aSPtr->signExp; uiA0 = aSPtr->signif; uiB64 = bSPtr->signExp; uiB0 = bSPtr->signif; /*------------------------------------------------------------------------ *------------------------------------------------------------------------*/ if ( isNaNExtF80UI( uiA64, uiA0 ) || isNaNExtF80UI( uiB64, uiB0 ) ) { if ( softfloat_isSigNaNExtF80UI( uiA64, uiA0 ) || softfloat_isSigNaNExtF80UI( uiB64, uiB0 ) ) { softfloat_raiseFlags( softfloat_flag_invalid ); } return false; } /*------------------------------------------------------------------------ *------------------------------------------------------------------------*/ if ( uiA0 == uiB0 ) { return (uiA64 == uiB64) || ! uiA0; } else { if ( ! ((uiA0 & uiB0) & UINT64_C( 0x8000000000000000 )) ) { return ! softfloat_compareNonnormExtF80M( aSPtr, bSPtr ); } return false; } }
bool softfloat_tryPropagateNaNExtF80M( const struct extFloat80M *aSPtr, const struct extFloat80M *bSPtr, struct extFloat80M *zSPtr ) { uint_fast16_t ui64; uint64_t ui0; ui64 = aSPtr->signExp; ui0 = aSPtr->signif; if ( isNaNExtF80UI( ui64, ui0 ) ) goto propagateNaN; ui64 = bSPtr->signExp; ui0 = bSPtr->signif; if ( isNaNExtF80UI( ui64, ui0 ) ) goto propagateNaN; return false; propagateNaN: softfloat_propagateNaNExtF80M( aSPtr, bSPtr, zSPtr ); return true; }