|
@@ -767,3 +767,112 @@ float32 int32_to_float32(struct roundingData *roundData, int32 a)
|
|
|
if ( a == 0x80000000 ) return packFloat32( 1, 0x9E, 0 );
|
|
|
zSign = ( a < 0 );
|
|
|
return normalizeRoundAndPackFloat32( roundData, zSign, 0x9C, zSign ? - a : a );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
+-------------------------------------------------------------------------------
|
|
|
+Returns the result of converting the 32-bit two's complement integer `a' to
|
|
|
+the double-precision floating-point format. The conversion is performed
|
|
|
+according to the IEC/IEEE Standard for Binary Floating-point Arithmetic.
|
|
|
+-------------------------------------------------------------------------------
|
|
|
+*/
|
|
|
+float64 int32_to_float64( int32 a )
|
|
|
+{
|
|
|
+ flag aSign;
|
|
|
+ uint32 absA;
|
|
|
+ int8 shiftCount;
|
|
|
+ bits64 zSig;
|
|
|
+
|
|
|
+ if ( a == 0 ) return 0;
|
|
|
+ aSign = ( a < 0 );
|
|
|
+ absA = aSign ? - a : a;
|
|
|
+ shiftCount = countLeadingZeros32( absA ) + 21;
|
|
|
+ zSig = absA;
|
|
|
+ return packFloat64( aSign, 0x432 - shiftCount, zSig<<shiftCount );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#ifdef FLOATX80
|
|
|
+
|
|
|
+/*
|
|
|
+-------------------------------------------------------------------------------
|
|
|
+Returns the result of converting the 32-bit two's complement integer `a'
|
|
|
+to the extended double-precision floating-point format. The conversion
|
|
|
+is performed according to the IEC/IEEE Standard for Binary Floating-point
|
|
|
+Arithmetic.
|
|
|
+-------------------------------------------------------------------------------
|
|
|
+*/
|
|
|
+floatx80 int32_to_floatx80( int32 a )
|
|
|
+{
|
|
|
+ flag zSign;
|
|
|
+ uint32 absA;
|
|
|
+ int8 shiftCount;
|
|
|
+ bits64 zSig;
|
|
|
+
|
|
|
+ if ( a == 0 ) return packFloatx80( 0, 0, 0 );
|
|
|
+ zSign = ( a < 0 );
|
|
|
+ absA = zSign ? - a : a;
|
|
|
+ shiftCount = countLeadingZeros32( absA ) + 32;
|
|
|
+ zSig = absA;
|
|
|
+ return packFloatx80( zSign, 0x403E - shiftCount, zSig<<shiftCount );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/*
|
|
|
+-------------------------------------------------------------------------------
|
|
|
+Returns the result of converting the single-precision floating-point value
|
|
|
+`a' to the 32-bit two's complement integer format. The conversion is
|
|
|
+performed according to the IEC/IEEE Standard for Binary Floating-point
|
|
|
+Arithmetic---which means in particular that the conversion is rounded
|
|
|
+according to the current rounding mode. If `a' is a NaN, the largest
|
|
|
+positive integer is returned. Otherwise, if the conversion overflows, the
|
|
|
+largest integer with the same sign as `a' is returned.
|
|
|
+-------------------------------------------------------------------------------
|
|
|
+*/
|
|
|
+int32 float32_to_int32( struct roundingData *roundData, float32 a )
|
|
|
+{
|
|
|
+ flag aSign;
|
|
|
+ int16 aExp, shiftCount;
|
|
|
+ bits32 aSig;
|
|
|
+ bits64 zSig;
|
|
|
+
|
|
|
+ aSig = extractFloat32Frac( a );
|
|
|
+ aExp = extractFloat32Exp( a );
|
|
|
+ aSign = extractFloat32Sign( a );
|
|
|
+ if ( ( aExp == 0x7FF ) && aSig ) aSign = 0;
|
|
|
+ if ( aExp ) aSig |= 0x00800000;
|
|
|
+ shiftCount = 0xAF - aExp;
|
|
|
+ zSig = aSig;
|
|
|
+ zSig <<= 32;
|
|
|
+ if ( 0 < shiftCount ) shift64RightJamming( zSig, shiftCount, &zSig );
|
|
|
+ return roundAndPackInt32( roundData, aSign, zSig );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
+-------------------------------------------------------------------------------
|
|
|
+Returns the result of converting the single-precision floating-point value
|
|
|
+`a' to the 32-bit two's complement integer format. The conversion is
|
|
|
+performed according to the IEC/IEEE Standard for Binary Floating-point
|
|
|
+Arithmetic, except that the conversion is always rounded toward zero. If
|
|
|
+`a' is a NaN, the largest positive integer is returned. Otherwise, if the
|
|
|
+conversion overflows, the largest integer with the same sign as `a' is
|
|
|
+returned.
|
|
|
+-------------------------------------------------------------------------------
|
|
|
+*/
|
|
|
+int32 float32_to_int32_round_to_zero( float32 a )
|
|
|
+{
|
|
|
+ flag aSign;
|
|
|
+ int16 aExp, shiftCount;
|
|
|
+ bits32 aSig;
|
|
|
+ int32 z;
|
|
|
+
|
|
|
+ aSig = extractFloat32Frac( a );
|
|
|
+ aExp = extractFloat32Exp( a );
|
|
|
+ aSign = extractFloat32Sign( a );
|
|
|
+ shiftCount = aExp - 0x9E;
|
|
|
+ if ( 0 <= shiftCount ) {
|
|
|
+ if ( a == 0xCF000000 ) return 0x80000000;
|