bits64
bits64 zSig64;
shift64RightJamming( ( (bits64) aSig ) * bSig, 32, &zSig64 );
bits64 tmp = ( (bits64) aSig )<<32;
zSig |= ( ( (bits64) bSig ) * zSig != ( (bits64) aSig )<<32 );
bits64 aSig64, bSig64, q64;
bits64 tmp = ( (bits64) aSig )<<32;
aSig64 = ( (bits64) aSig )<<40;
bSig64 = ( (bits64) bSig )<<40;
bits64 rem, term;
term = ( (bits64) zSig ) * zSig;
rem = ( ( (bits64) aSig )<<32 ) - term;
rem += ( ( (bits64) zSig )<<1 ) | 1;
bits64 aSig;
bits64 aSig, savedASig;
bits64 aSig;
bits64 aSig, savedASig;
bits64 aSig;
bits64 aSig;
bits64 lastBitMask, roundBitsMask;
if ( (bits64) ( a<<1 ) == 0 ) return a;
bits64 aSig, bSig, zSig;
bits64 aSig, bSig, zSig;
bits64 aSig, bSig, zSig0, zSig1;
bits64 aSig, bSig, zSig;
bits64 rem0, rem1;
bits64 term0, term1;
bits64 aSig, bSig;
bits64 q, alternateASig;
bits64 aSig, zSig;
bits64 rem0, rem1, term0, term1; //, shiftedRem;
return ( a == b ) || ( (bits64) ( ( a | b )<<1 ) == 0 );
if ( aSign != bSign ) return aSign || ( (bits64) ( ( a | b )<<1 ) == 0 );
if ( aSign != bSign ) return aSign && ( (bits64) ( ( a | b )<<1 ) != 0 );
return ( a == b ) || ( (bits64) ( ( a | b )<<1 ) == 0 );
if ( aSign != bSign ) return aSign || ( (bits64) ( ( a | b )<<1 ) == 0 );
if ( aSign != bSign ) return aSign && ( (bits64) ( ( a | b )<<1 ) != 0 );
bits64 aSig;
if ( ( aExp == 0x7FFF ) && (bits64) ( aSig<<1 ) ) aSign = 0;
bits64 aSig, savedASig;
if ( ( aExp == 0x7FFF ) && (bits64) ( aSig<<1 ) ) aSign = 0;
bits64 aSig;
if ( (bits64) ( aSig<<1 ) ) {
bits64 aSig, zSig;
if ( (bits64) ( aSig<<1 ) ) {
bits64 lastBitMask, roundBitsMask;
if ( ( aExp == 0x7FFF ) && (bits64) ( extractFloatx80Frac( a )<<1 ) ) {
&& ( (bits64) ( extractFloatx80Frac( a )<<1 ) == 0 ) ) {
if ( ( aExp == 0x3FFE ) && (bits64) ( extractFloatx80Frac( a )<<1 )
bits64 aSig, bSig, zSig0, zSig1;
if ( (bits64) ( aSig<<1 ) ) return propagateFloatx80NaN( a, b );
if ( (bits64) ( bSig<<1 ) ) return propagateFloatx80NaN( a, b );
if ( (bits64) ( ( aSig | bSig )<<1 ) ) {
bits64 aSig, bSig, zSig0, zSig1;
if ( (bits64) ( ( aSig | bSig )<<1 ) ) {
if ( (bits64) ( bSig<<1 ) ) return propagateFloatx80NaN( a, b );
if ( (bits64) ( aSig<<1 ) ) return propagateFloatx80NaN( a, b );
bits64 aSig, bSig, zSig0, zSig1;
INLINE bits64 extractFloat64Frac( float64 a )
if ( (bits64) ( aSig<<1 )
|| ( ( bExp == 0x7FFF ) && (bits64) ( bSig<<1 ) ) ) {
if ( (bits64) ( bSig<<1 ) ) return propagateFloatx80NaN( a, b );
bits64 aSig, bSig, zSig0, zSig1;
bits64 rem0, rem1, rem2, term0, term1, term2;
if ( (bits64) ( aSig<<1 ) ) return propagateFloatx80NaN( a, b );
if ( (bits64) ( bSig<<1 ) ) return propagateFloatx80NaN( a, b );
if ( (bits64) ( bSig<<1 ) ) return propagateFloatx80NaN( a, b );
if ( (bits64) ( zSig1<<1 ) <= 8 ) {
bits64 aSig0, aSig1, bSig;
bits64 q, term0, term1, alternateASig0, alternateASig1;
if ( (bits64) ( aSig0<<1 )
|| ( ( bExp == 0x7FFF ) && (bits64) ( bSig<<1 ) ) ) {
if ( (bits64) ( bSig<<1 ) ) return propagateFloatx80NaN( a, b );
if ( (bits64) ( aSig0<<1 ) == 0 ) return a;
bits64 aSig0, aSig1, zSig0, zSig1;
bits64 rem0, rem1, rem2, rem3, term0, term1, term2, term3;
bits64 shiftedRem0, shiftedRem1;
if ( (bits64) ( aSig0<<1 ) ) return propagateFloatx80NaN( a, a );
if ( (bits64) ( zSig1<<1 ) <= 10 ) {
&& (bits64) ( extractFloatx80Frac( a )<<1 ) )
&& (bits64) ( extractFloatx80Frac( b )<<1 ) )
&& (bits64) ( extractFloatx80Frac( a )<<1 ) )
&& (bits64) ( extractFloatx80Frac( b )<<1 ) )
&& (bits64) ( extractFloatx80Frac( a )<<1 ) )
&& (bits64) ( extractFloatx80Frac( b )<<1 ) )
&& (bits64) ( extractFloatx80Frac( a )<<1 ) )
&& (bits64) ( extractFloatx80Frac( b )<<1 ) )
normalizeFloat64Subnormal( bits64 aSig, int16 *zExpPtr, bits64 *zSigPtr )
&& (bits64) ( extractFloatx80Frac( a )<<1 ) )
&& (bits64) ( extractFloatx80Frac( b )<<1 ) )
&& (bits64) ( extractFloatx80Frac( a )<<1 ) )
&& (bits64) ( extractFloatx80Frac( b )<<1 ) )
INLINE float64 packFloat64( flag zSign, int16 zExp, bits64 zSig )
return ( ( (bits64) zSign )<<63 ) + ( ( (bits64) zExp )<<52 ) + zSig;
static float64 roundAndPackFloat64( struct roundingData *roundData, flag zSign, int16 zExp, bits64 zSig )
normalizeRoundAndPackFloat64( struct roundingData *roundData, flag zSign, int16 zExp, bits64 zSig )
INLINE bits64 extractFloatx80Frac( floatx80 a )
normalizeFloatx80Subnormal( bits64 aSig, int32 *zExpPtr, bits64 *zSigPtr )
INLINE floatx80 packFloatx80( flag zSign, int32 zExp, bits64 zSig )
struct roundingData *roundData, flag zSign, int32 zExp, bits64 zSig0, bits64 zSig1
static int32 roundAndPackInt32( struct roundingData *roundData, flag zSign, bits64 absZ )
struct roundingData *roundData, flag zSign, int32 zExp, bits64 zSig0, bits64 zSig1
bits64 zSig;
bits64 zSig;
bits64 zSig;
return packFloat64( aSign, aExp + 0x380, ( (bits64) aSig )<<29 );
return packFloatx80( aSign, aExp + 0x3F80, ( (bits64) aSig )<<40 );
return (a == b) || ((bits64) ((a | b) << 1) == 0);
return aSign && ((bits64) ((a | b) << 1) != 0);
static float64 roundAndPackFloat64(flag zSign, int16 zExp, bits64 zSig);
static void normalizeFloat64Subnormal(bits64 aSig, int16 * zExpPtr,
bits64 * zSigPtr);
static bits64 estimateDiv128To64(bits64 a0, bits64 a1, bits64 b);
bits64 extractFloat64Frac(float64 a)
float64 packFloat64(flag zSign, int16 zExp, bits64 zSig)
return (((bits64) zSign) << 63) + (((bits64) zExp) << 52) + zSig;
void shift64RightJamming(bits64 a, int16 count, bits64 * zPtr)
bits64 z;
static int8 countLeadingZeros64(bits64 a)
if (a < ((bits64) 1) << 32) {
static float64 normalizeRoundAndPackFloat64(flag zSign, int16 zExp, bits64 zSig)
bits64 aSig, bSig, zSig;
bits64 aSig, bSig, zSig;
static float64 roundAndPackFloat64(flag zSign, int16 zExp, bits64 zSig)
normalizeFloat64Subnormal(bits64 aSig, int16 * zExpPtr, bits64 * zSigPtr)
void add128(bits64 a0, bits64 a1, bits64 b0, bits64 b1, bits64 * z0Ptr,
bits64 * z1Ptr)
bits64 z1;
sub128(bits64 a0, bits64 a1, bits64 b0, bits64 b1, bits64 * z0Ptr,
bits64 * z1Ptr)
static bits64 estimateDiv128To64(bits64 a0, bits64 a1, bits64 b)
bits64 b0, b1;
bits64 rem0, rem1, term0, term1;
bits64 z, tmp;
void mul64To128(bits64 a, bits64 b, bits64 * z0Ptr, bits64 * z1Ptr)
bits64 z0, zMiddleA, zMiddleB, z1;
z1 = ((bits64) aLow) * bLow;
zMiddleA = ((bits64) aLow) * bHigh;
zMiddleB = ((bits64) aHigh) * bLow;
z0 = ((bits64) aHigh) * bHigh;
z0 += (((bits64) (zMiddleA < zMiddleB)) << 32) + (zMiddleA >> 32);
bits64 extractFloat64Frac(float64 a);
bits64 aSig, bSig, zSig;
bits64 rem0, rem1;
bits64 term0, term1;
float64 packFloat64(flag zSign, int16 zExp, bits64 zSig);
void shift64RightJamming(bits64 a, int16 count, bits64 * zPtr);
zSig = (((bits64) aSig) << 32);
zSig |= (((bits64) bSig) * zSig != ((bits64) aSig) << 32);
void add128(bits64 a0, bits64 a1, bits64 b0, bits64 b1, bits64 * z0Ptr,
bits64 * z1Ptr);
bits64 aSig;
void sub128(bits64 a0, bits64 a1, bits64 b0, bits64 b1, bits64 * z0Ptr,
bits64 * z1Ptr);
void mul64To128(bits64 a, bits64 b, bits64 * z0Ptr, bits64 * z1Ptr);
static int8 countLeadingZeros64(bits64 a);
bits64 zSig);