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; } }