extFloat80_t extF80_sub( extFloat80_t a, extFloat80_t b ) { union { struct extFloat80M s; extFloat80_t f; } uA; uint_fast16_t uiA64; uint_fast64_t uiA0; bool signA; union { struct extFloat80M s; extFloat80_t f; } uB; 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; uiA0 = uA.s.signif; signA = signExtF80UI64( uiA64 ); uB.f = 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 }
void extF80M_add( const extFloat80_t *aPtr, const extFloat80_t *bPtr, extFloat80_t *zPtr ) { const struct extFloat80M *aSPtr, *bSPtr; uint_fast16_t uiA64; uint_fast64_t uiA0; bool signA; 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; uiA64 = aSPtr->signExp; uiA0 = aSPtr->signif; signA = signExtF80UI64( uiA64 ); 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 }