41#include "specialize.h"
78 if ( expA == 0x7FF ) {
79 if ( sigA || ((expB == 0x7FF) && sigB) )
goto propagateNaN;
82 if ( expB == 0x7FF ) {
83 if ( sigB )
goto propagateNaN;
88 if ( expA < expB - 1 )
return a;
92 if ( ! sigB )
goto invalid;
94 expB = normExpSig.
exp;
95 sigB = normExpSig.
sig;
98 if ( ! sigA )
return a;
100 expA = normExpSig.
exp;
101 sigA = normExpSig.
sig;
105 rem = sigA |
UINT64_C( 0x0010000000000000 );
106 sigB |=
UINT64_C( 0x0010000000000000 );
107 expDiff = expA - expB;
109 if ( expDiff < -1 )
return a;
117 if ( q ) rem -= sigB;
135 if ( expDiff < 0 )
break;
136 q = (q64 + 0x80000000)>>32;
137#ifdef SOFTFLOAT_FAST_INT64
143 if ( rem &
UINT64_C( 0x8000000000000000 ) ) rem += sigB;
149 q = (
uint32_t) (q64>>32)>>(~expDiff & 31);
150 rem = (rem<<(expDiff + 30)) - q * (
uint64_t) sigB;
151 if ( rem &
UINT64_C( 0x8000000000000000 ) ) {
162 }
while ( ! (rem &
UINT64_C( 0x8000000000000000 )) );
164 meanRem = rem + altRem;
166 (meanRem &
UINT64_C( 0x8000000000000000 )) || (! meanRem && (q & 1))
171 if ( rem &
UINT64_C( 0x8000000000000000 ) ) {
const GenericPointer< typename T::ValueType > T2 T::AllocatorType & a
uint_fast64_t softfloat_propagateNaNF64UI(uint_fast64_t uiA, uint_fast64_t uiB)
void softfloat_raiseFlags(uint_fast8_t flags)
float64_t f64_rem(float64_t a, float64_t b)
struct exp16_sig64 softfloat_normSubnormalF64Sig(uint_fast64_t)
float64_t softfloat_normRoundPackToF64(bool, int_fast16_t, uint_fast64_t)
uint32_t softfloat_approxRecip32_1(uint32_t a)
unsigned __int64 uint64_t