|
@@ -1796,3 +1796,73 @@ Arithmetic.
|
|
|
float32 float64_to_float32( struct roundingData *roundData, float64 a )
|
|
|
{
|
|
|
flag aSign;
|
|
|
+ int16 aExp;
|
|
|
+ bits64 aSig;
|
|
|
+ bits32 zSig;
|
|
|
+
|
|
|
+ aSig = extractFloat64Frac( a );
|
|
|
+ aExp = extractFloat64Exp( a );
|
|
|
+ aSign = extractFloat64Sign( a );
|
|
|
+ if ( aExp == 0x7FF ) {
|
|
|
+ if ( aSig ) return commonNaNToFloat32( float64ToCommonNaN( a ) );
|
|
|
+ return packFloat32( aSign, 0xFF, 0 );
|
|
|
+ }
|
|
|
+ shift64RightJamming( aSig, 22, &aSig );
|
|
|
+ zSig = aSig;
|
|
|
+ if ( aExp || zSig ) {
|
|
|
+ zSig |= 0x40000000;
|
|
|
+ aExp -= 0x381;
|
|
|
+ }
|
|
|
+ return roundAndPackFloat32( roundData, aSign, aExp, zSig );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#ifdef FLOATX80
|
|
|
+
|
|
|
+/*
|
|
|
+-------------------------------------------------------------------------------
|
|
|
+Returns the result of converting the double-precision floating-point value
|
|
|
+`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 float64_to_floatx80( float64 a )
|
|
|
+{
|
|
|
+ flag aSign;
|
|
|
+ int16 aExp;
|
|
|
+ bits64 aSig;
|
|
|
+
|
|
|
+ aSig = extractFloat64Frac( a );
|
|
|
+ aExp = extractFloat64Exp( a );
|
|
|
+ aSign = extractFloat64Sign( a );
|
|
|
+ if ( aExp == 0x7FF ) {
|
|
|
+ if ( aSig ) return commonNaNToFloatx80( float64ToCommonNaN( a ) );
|
|
|
+ return packFloatx80( aSign, 0x7FFF, LIT64( 0x8000000000000000 ) );
|
|
|
+ }
|
|
|
+ if ( aExp == 0 ) {
|
|
|
+ if ( aSig == 0 ) return packFloatx80( aSign, 0, 0 );
|
|
|
+ normalizeFloat64Subnormal( aSig, &aExp, &aSig );
|
|
|
+ }
|
|
|
+ return
|
|
|
+ packFloatx80(
|
|
|
+ aSign, aExp + 0x3C00, ( aSig | LIT64( 0x0010000000000000 ) )<<11 );
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+/*
|
|
|
+-------------------------------------------------------------------------------
|
|
|
+Rounds the double-precision floating-point value `a' to an integer, and
|
|
|
+returns the result as a double-precision floating-point value. The
|
|
|
+operation is performed according to the IEC/IEEE Standard for Binary
|
|
|
+Floating-point Arithmetic.
|
|
|
+-------------------------------------------------------------------------------
|
|
|
+*/
|
|
|
+float64 float64_round_to_int( struct roundingData *roundData, float64 a )
|
|
|
+{
|
|
|
+ flag aSign;
|
|
|
+ int16 aExp;
|
|
|
+ bits64 lastBitMask, roundBitsMask;
|
|
|
+ int8 roundingMode;
|