Loading fpu/softfloat-native.c +96 −0 Original line number Diff line number Diff line Loading @@ -59,11 +59,21 @@ float32 int32_to_float32(int v STATUS_PARAM) return (float32)v; } float32 uint32_to_float32(unsigned int v STATUS_PARAM) { return (float32)v; } float64 int32_to_float64(int v STATUS_PARAM) { return (float64)v; } float64 uint32_to_float64(unsigned int v STATUS_PARAM) { return (float64)v; } #ifdef FLOATX80 floatx80 int32_to_floatx80(int v STATUS_PARAM) { Loading @@ -74,10 +84,18 @@ float32 int64_to_float32( int64_t v STATUS_PARAM) { return (float32)v; } float32 uint64_to_float32( uint64_t v STATUS_PARAM) { return (float32)v; } float64 int64_to_float64( int64_t v STATUS_PARAM) { return (float64)v; } float64 uint64_to_float64( uint64_t v STATUS_PARAM) { return (float64)v; } #ifdef FLOATX80 floatx80 int64_to_floatx80( int64_t v STATUS_PARAM) { Loading Loading @@ -132,6 +150,37 @@ floatx80 float32_to_floatx80( float32 a STATUS_PARAM) } #endif unsigned int float32_to_uint32( float32 a STATUS_PARAM) { int64_t v; unsigned int res; v = llrintf(a); if (v < 0) { res = 0; } else if (v > 0xffffffff) { res = 0xffffffff; } else { res = v; } return res; } unsigned int float32_to_uint32_round_to_zero( float32 a STATUS_PARAM) { int64_t v; unsigned int res; v = (int64_t)a; if (v < 0) { res = 0; } else if (v > 0xffffffff) { res = 0xffffffff; } else { res = v; } return res; } /*---------------------------------------------------------------------------- | Software IEC/IEEE single-precision operations. *----------------------------------------------------------------------------*/ Loading Loading @@ -218,6 +267,53 @@ float128 float64_to_float128( float64 a STATUS_PARAM) } #endif unsigned int float64_to_uint32( float64 a STATUS_PARAM) { int64_t v; unsigned int res; v = llrint(a); if (v < 0) { res = 0; } else if (v > 0xffffffff) { res = 0xffffffff; } else { res = v; } return res; } unsigned int float64_to_uint32_round_to_zero( float64 a STATUS_PARAM) { int64_t v; unsigned int res; v = (int64_t)a; if (v < 0) { res = 0; } else if (v > 0xffffffff) { res = 0xffffffff; } else { res = v; } return res; } uint64_t float64_to_uint64 (float64 a STATUS_PARAM) { int64_t v; v = llrint(a + (float64)INT64_MIN); return v - INT64_MIN; } uint64_t float64_to_uint64_round_to_zero (float64 a STATUS_PARAM) { int64_t v; v = (int64_t)(a + (float64)INT64_MIN); return v - INT64_MIN; } /*---------------------------------------------------------------------------- | Software IEC/IEEE double-precision operations. *----------------------------------------------------------------------------*/ Loading fpu/softfloat-native.h +10 −0 Original line number Diff line number Diff line Loading @@ -99,7 +99,9 @@ void set_floatx80_rounding_precision(int val STATUS_PARAM); | Software IEC/IEEE integer-to-floating-point conversion routines. *----------------------------------------------------------------------------*/ float32 int32_to_float32( int STATUS_PARAM); float32 uint32_to_float32( unsigned int STATUS_PARAM); float64 int32_to_float64( int STATUS_PARAM); float64 uint32_to_float64( unsigned int STATUS_PARAM); #ifdef FLOATX80 floatx80 int32_to_floatx80( int STATUS_PARAM); #endif Loading @@ -107,7 +109,9 @@ floatx80 int32_to_floatx80( int STATUS_PARAM); float128 int32_to_float128( int STATUS_PARAM); #endif float32 int64_to_float32( int64_t STATUS_PARAM); float32 uint64_to_float32( uint64_t STATUS_PARAM); float64 int64_to_float64( int64_t STATUS_PARAM); float64 uint64_to_float64( uint64_t v STATUS_PARAM); #ifdef FLOATX80 floatx80 int64_to_floatx80( int64_t STATUS_PARAM); #endif Loading @@ -120,6 +124,8 @@ float128 int64_to_float128( int64_t STATUS_PARAM); *----------------------------------------------------------------------------*/ int float32_to_int32( float32 STATUS_PARAM); int float32_to_int32_round_to_zero( float32 STATUS_PARAM); unsigned int float32_to_uint32( float32 a STATUS_PARAM); unsigned int float32_to_uint32_round_to_zero( float32 a STATUS_PARAM); int64_t float32_to_int64( float32 STATUS_PARAM); int64_t float32_to_int64_round_to_zero( float32 STATUS_PARAM); float64 float32_to_float64( float32 STATUS_PARAM); Loading Loading @@ -200,8 +206,12 @@ INLINE float32 float32_chs(float32 a) *----------------------------------------------------------------------------*/ int float64_to_int32( float64 STATUS_PARAM ); int float64_to_int32_round_to_zero( float64 STATUS_PARAM ); unsigned int float64_to_uint32( float64 STATUS_PARAM ); unsigned int float64_to_uint32_round_to_zero( float64 STATUS_PARAM ); int64_t float64_to_int64( float64 STATUS_PARAM ); int64_t float64_to_int64_round_to_zero( float64 STATUS_PARAM ); uint64_t float64_to_uint64( float64 STATUS_PARAM ); uint64_t float64_to_uint64_round_to_zero( float64 STATUS_PARAM ); float32 float64_to_float32( float64 STATUS_PARAM ); #ifdef FLOATX80 floatx80 float64_to_floatx80( float64 STATUS_PARAM ); Loading fpu/softfloat.c +48 −0 Original line number Diff line number Diff line Loading @@ -1164,6 +1164,27 @@ float32 int64_to_float32( int64 a STATUS_PARAM ) } float64 uint64_to_float32( uint64 a STATUS_PARAM ) { int8 shiftCount; if ( a == 0 ) return 0; shiftCount = countLeadingZeros64( a ) - 40; if ( 0 <= shiftCount ) { return packFloat32( 1 > 0, 0x95 - shiftCount, a<<shiftCount ); } else { shiftCount += 7; if ( shiftCount < 0 ) { shift64RightJamming( a, - shiftCount, &a ); } else { a <<= shiftCount; } return roundAndPackFloat32( 1 > 0, 0x9C - shiftCount, a STATUS_VAR ); } } /*---------------------------------------------------------------------------- | Returns the result of converting the 64-bit two's complement integer `a' | to the double-precision floating-point format. The conversion is performed Loading @@ -1183,6 +1204,13 @@ float64 int64_to_float64( int64 a STATUS_PARAM ) } float64 uint64_to_float64( uint64 a STATUS_PARAM ) { if ( a == 0 ) return 0; return normalizeRoundAndPackFloat64( 0, 0x43C, a STATUS_VAR ); } #ifdef FLOATX80 /*---------------------------------------------------------------------------- Loading Loading @@ -5282,6 +5310,26 @@ unsigned int float64_to_uint32_round_to_zero( float64 a STATUS_PARAM ) return res; } uint64_t float64_to_uint64 (float64 a STATUS_PARAM) { int64_t v; v = int64_to_float64(INT64_MIN STATUS_VAR); v = float64_to_int64((a + v) STATUS_VAR); return v - INT64_MIN; } uint64_t float64_to_uint64_round_to_zero (float64 a STATUS_PARAM) { int64_t v; v = int64_to_float64(INT64_MIN STATUS_VAR); v = float64_to_int64_round_to_zero((a + v) STATUS_VAR); return v - INT64_MIN; } #define COMPARE(s, nan_exp) \ INLINE int float ## s ## _compare_internal( float ## s a, float ## s b, \ int is_quiet STATUS_PARAM ) \ Loading fpu/softfloat.h +4 −0 Original line number Diff line number Diff line Loading @@ -193,7 +193,9 @@ floatx80 int32_to_floatx80( int STATUS_PARAM ); float128 int32_to_float128( int STATUS_PARAM ); #endif float32 int64_to_float32( int64_t STATUS_PARAM ); float32 uint64_to_float32( uint64_t STATUS_PARAM ); float64 int64_to_float64( int64_t STATUS_PARAM ); float64 uint64_to_float64( uint64_t STATUS_PARAM ); #ifdef FLOATX80 floatx80 int64_to_floatx80( int64_t STATUS_PARAM ); #endif Loading Loading @@ -258,6 +260,8 @@ unsigned int float64_to_uint32( float64 STATUS_PARAM ); unsigned int float64_to_uint32_round_to_zero( float64 STATUS_PARAM ); int64_t float64_to_int64( float64 STATUS_PARAM ); int64_t float64_to_int64_round_to_zero( float64 STATUS_PARAM ); uint64_t float64_to_uint64 (float64 a STATUS_PARAM); uint64_t float64_to_uint64_round_to_zero (float64 a STATUS_PARAM); float32 float64_to_float32( float64 STATUS_PARAM ); #ifdef FLOATX80 floatx80 float64_to_floatx80( float64 STATUS_PARAM ); Loading Loading
fpu/softfloat-native.c +96 −0 Original line number Diff line number Diff line Loading @@ -59,11 +59,21 @@ float32 int32_to_float32(int v STATUS_PARAM) return (float32)v; } float32 uint32_to_float32(unsigned int v STATUS_PARAM) { return (float32)v; } float64 int32_to_float64(int v STATUS_PARAM) { return (float64)v; } float64 uint32_to_float64(unsigned int v STATUS_PARAM) { return (float64)v; } #ifdef FLOATX80 floatx80 int32_to_floatx80(int v STATUS_PARAM) { Loading @@ -74,10 +84,18 @@ float32 int64_to_float32( int64_t v STATUS_PARAM) { return (float32)v; } float32 uint64_to_float32( uint64_t v STATUS_PARAM) { return (float32)v; } float64 int64_to_float64( int64_t v STATUS_PARAM) { return (float64)v; } float64 uint64_to_float64( uint64_t v STATUS_PARAM) { return (float64)v; } #ifdef FLOATX80 floatx80 int64_to_floatx80( int64_t v STATUS_PARAM) { Loading Loading @@ -132,6 +150,37 @@ floatx80 float32_to_floatx80( float32 a STATUS_PARAM) } #endif unsigned int float32_to_uint32( float32 a STATUS_PARAM) { int64_t v; unsigned int res; v = llrintf(a); if (v < 0) { res = 0; } else if (v > 0xffffffff) { res = 0xffffffff; } else { res = v; } return res; } unsigned int float32_to_uint32_round_to_zero( float32 a STATUS_PARAM) { int64_t v; unsigned int res; v = (int64_t)a; if (v < 0) { res = 0; } else if (v > 0xffffffff) { res = 0xffffffff; } else { res = v; } return res; } /*---------------------------------------------------------------------------- | Software IEC/IEEE single-precision operations. *----------------------------------------------------------------------------*/ Loading Loading @@ -218,6 +267,53 @@ float128 float64_to_float128( float64 a STATUS_PARAM) } #endif unsigned int float64_to_uint32( float64 a STATUS_PARAM) { int64_t v; unsigned int res; v = llrint(a); if (v < 0) { res = 0; } else if (v > 0xffffffff) { res = 0xffffffff; } else { res = v; } return res; } unsigned int float64_to_uint32_round_to_zero( float64 a STATUS_PARAM) { int64_t v; unsigned int res; v = (int64_t)a; if (v < 0) { res = 0; } else if (v > 0xffffffff) { res = 0xffffffff; } else { res = v; } return res; } uint64_t float64_to_uint64 (float64 a STATUS_PARAM) { int64_t v; v = llrint(a + (float64)INT64_MIN); return v - INT64_MIN; } uint64_t float64_to_uint64_round_to_zero (float64 a STATUS_PARAM) { int64_t v; v = (int64_t)(a + (float64)INT64_MIN); return v - INT64_MIN; } /*---------------------------------------------------------------------------- | Software IEC/IEEE double-precision operations. *----------------------------------------------------------------------------*/ Loading
fpu/softfloat-native.h +10 −0 Original line number Diff line number Diff line Loading @@ -99,7 +99,9 @@ void set_floatx80_rounding_precision(int val STATUS_PARAM); | Software IEC/IEEE integer-to-floating-point conversion routines. *----------------------------------------------------------------------------*/ float32 int32_to_float32( int STATUS_PARAM); float32 uint32_to_float32( unsigned int STATUS_PARAM); float64 int32_to_float64( int STATUS_PARAM); float64 uint32_to_float64( unsigned int STATUS_PARAM); #ifdef FLOATX80 floatx80 int32_to_floatx80( int STATUS_PARAM); #endif Loading @@ -107,7 +109,9 @@ floatx80 int32_to_floatx80( int STATUS_PARAM); float128 int32_to_float128( int STATUS_PARAM); #endif float32 int64_to_float32( int64_t STATUS_PARAM); float32 uint64_to_float32( uint64_t STATUS_PARAM); float64 int64_to_float64( int64_t STATUS_PARAM); float64 uint64_to_float64( uint64_t v STATUS_PARAM); #ifdef FLOATX80 floatx80 int64_to_floatx80( int64_t STATUS_PARAM); #endif Loading @@ -120,6 +124,8 @@ float128 int64_to_float128( int64_t STATUS_PARAM); *----------------------------------------------------------------------------*/ int float32_to_int32( float32 STATUS_PARAM); int float32_to_int32_round_to_zero( float32 STATUS_PARAM); unsigned int float32_to_uint32( float32 a STATUS_PARAM); unsigned int float32_to_uint32_round_to_zero( float32 a STATUS_PARAM); int64_t float32_to_int64( float32 STATUS_PARAM); int64_t float32_to_int64_round_to_zero( float32 STATUS_PARAM); float64 float32_to_float64( float32 STATUS_PARAM); Loading Loading @@ -200,8 +206,12 @@ INLINE float32 float32_chs(float32 a) *----------------------------------------------------------------------------*/ int float64_to_int32( float64 STATUS_PARAM ); int float64_to_int32_round_to_zero( float64 STATUS_PARAM ); unsigned int float64_to_uint32( float64 STATUS_PARAM ); unsigned int float64_to_uint32_round_to_zero( float64 STATUS_PARAM ); int64_t float64_to_int64( float64 STATUS_PARAM ); int64_t float64_to_int64_round_to_zero( float64 STATUS_PARAM ); uint64_t float64_to_uint64( float64 STATUS_PARAM ); uint64_t float64_to_uint64_round_to_zero( float64 STATUS_PARAM ); float32 float64_to_float32( float64 STATUS_PARAM ); #ifdef FLOATX80 floatx80 float64_to_floatx80( float64 STATUS_PARAM ); Loading
fpu/softfloat.c +48 −0 Original line number Diff line number Diff line Loading @@ -1164,6 +1164,27 @@ float32 int64_to_float32( int64 a STATUS_PARAM ) } float64 uint64_to_float32( uint64 a STATUS_PARAM ) { int8 shiftCount; if ( a == 0 ) return 0; shiftCount = countLeadingZeros64( a ) - 40; if ( 0 <= shiftCount ) { return packFloat32( 1 > 0, 0x95 - shiftCount, a<<shiftCount ); } else { shiftCount += 7; if ( shiftCount < 0 ) { shift64RightJamming( a, - shiftCount, &a ); } else { a <<= shiftCount; } return roundAndPackFloat32( 1 > 0, 0x9C - shiftCount, a STATUS_VAR ); } } /*---------------------------------------------------------------------------- | Returns the result of converting the 64-bit two's complement integer `a' | to the double-precision floating-point format. The conversion is performed Loading @@ -1183,6 +1204,13 @@ float64 int64_to_float64( int64 a STATUS_PARAM ) } float64 uint64_to_float64( uint64 a STATUS_PARAM ) { if ( a == 0 ) return 0; return normalizeRoundAndPackFloat64( 0, 0x43C, a STATUS_VAR ); } #ifdef FLOATX80 /*---------------------------------------------------------------------------- Loading Loading @@ -5282,6 +5310,26 @@ unsigned int float64_to_uint32_round_to_zero( float64 a STATUS_PARAM ) return res; } uint64_t float64_to_uint64 (float64 a STATUS_PARAM) { int64_t v; v = int64_to_float64(INT64_MIN STATUS_VAR); v = float64_to_int64((a + v) STATUS_VAR); return v - INT64_MIN; } uint64_t float64_to_uint64_round_to_zero (float64 a STATUS_PARAM) { int64_t v; v = int64_to_float64(INT64_MIN STATUS_VAR); v = float64_to_int64_round_to_zero((a + v) STATUS_VAR); return v - INT64_MIN; } #define COMPARE(s, nan_exp) \ INLINE int float ## s ## _compare_internal( float ## s a, float ## s b, \ int is_quiet STATUS_PARAM ) \ Loading
fpu/softfloat.h +4 −0 Original line number Diff line number Diff line Loading @@ -193,7 +193,9 @@ floatx80 int32_to_floatx80( int STATUS_PARAM ); float128 int32_to_float128( int STATUS_PARAM ); #endif float32 int64_to_float32( int64_t STATUS_PARAM ); float32 uint64_to_float32( uint64_t STATUS_PARAM ); float64 int64_to_float64( int64_t STATUS_PARAM ); float64 uint64_to_float64( uint64_t STATUS_PARAM ); #ifdef FLOATX80 floatx80 int64_to_floatx80( int64_t STATUS_PARAM ); #endif Loading Loading @@ -258,6 +260,8 @@ unsigned int float64_to_uint32( float64 STATUS_PARAM ); unsigned int float64_to_uint32_round_to_zero( float64 STATUS_PARAM ); int64_t float64_to_int64( float64 STATUS_PARAM ); int64_t float64_to_int64_round_to_zero( float64 STATUS_PARAM ); uint64_t float64_to_uint64 (float64 a STATUS_PARAM); uint64_t float64_to_uint64_round_to_zero (float64 a STATUS_PARAM); float32 float64_to_float32( float64 STATUS_PARAM ); #ifdef FLOATX80 floatx80 float64_to_floatx80( float64 STATUS_PARAM ); Loading