float128_t f128_sub( float128_t a, float128_t b ) { union ui128_f128 uA; uint_fast64_t uiA64, uiA0; bool signA; union ui128_f128 uB; uint_fast64_t uiB64, uiB0; bool signB; #if ! defined INLINE_LEVEL || (INLINE_LEVEL < 2) float128_t (*magsFuncPtr)( uint_fast64_t, uint_fast64_t, uint_fast64_t, uint_fast64_t, bool ); #endif uA.f = a; uiA64 = uA.ui.v64; uiA0 = uA.ui.v0; signA = signF128UI64( uiA64 ); uB.f = b; uiB64 = uB.ui.v64; uiB0 = uB.ui.v0; signB = signF128UI64( uiB64 ); #if defined INLINE_LEVEL && (2 <= INLINE_LEVEL) if ( signA == signB ) { return softfloat_subMagsF128( uiA64, uiA0, uiB64, uiB0, signA ); } else { return softfloat_addMagsF128( uiA64, uiA0, uiB64, uiB0, signA ); } #else magsFuncPtr = (signA == signB) ? softfloat_subMagsF128 : softfloat_addMagsF128; return (*magsFuncPtr)( uiA64, uiA0, uiB64, uiB0, signA ); #endif }
void f128M_sub( const float128_t *aPtr, const float128_t *bPtr, float128_t *zPtr ) { const uint64_t *aWPtr, *bWPtr; uint_fast64_t uiA64, uiA0; bool signA; uint_fast64_t uiB64, uiB0; bool signB; #if ! defined INLINE_LEVEL || (INLINE_LEVEL < 2) float128_t (*magsFuncPtr)( uint_fast64_t, uint_fast64_t, uint_fast64_t, uint_fast64_t, bool ); #endif aWPtr = (const uint64_t *) aPtr; bWPtr = (const uint64_t *) bPtr; uiA64 = aWPtr[indexWord( 2, 1 )]; uiA0 = aWPtr[indexWord( 2, 0 )]; signA = signF128UI64( uiA64 ); uiB64 = bWPtr[indexWord( 2, 1 )]; uiB0 = bWPtr[indexWord( 2, 0 )]; signB = signF128UI64( uiB64 ); #if defined INLINE_LEVEL && (2 <= INLINE_LEVEL) if ( signA == signB ) { *zPtr = softfloat_subMagsF128( uiA64, uiA0, uiB64, uiB0, signA ); } else { *zPtr = softfloat_addMagsF128( uiA64, uiA0, uiB64, uiB0, signA ); } #else magsFuncPtr = (signA == signB) ? softfloat_subMagsF128 : softfloat_addMagsF128; *zPtr = (*magsFuncPtr)( uiA64, uiA0, uiB64, uiB0, signA ); #endif }