mirror of https://gitee.com/openkylin/qemu.git
Add missing softfloat helpers.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2518 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
parent
b1e341ebb7
commit
75d62a5856
|
@ -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)
|
||||
{
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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.
|
||||
*----------------------------------------------------------------------------*/
|
||||
|
@ -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.
|
||||
*----------------------------------------------------------------------------*/
|
||||
|
|
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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 );
|
||||
|
|
|
@ -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
|
||||
|
@ -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
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
|
@ -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 ) \
|
||||
|
|
|
@ -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
|
||||
|
@ -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…
Reference in New Issue