提交 e0a2db71 编写于 作者: W Will Newton 提交者: Peter Maydell

softfloat: Add float to 16bit integer conversions.

ARMv8 requires support for converting 32 and 64bit floating point
values to signed and unsigned 16bit integers.
Signed-off-by: NWill Newton <will.newton@linaro.org>
[PMM: updated not to incorrectly set Inexact for Invalid inputs]
Signed-off-by: NPeter Maydell <peter.maydell@linaro.org>
Reviewed-by: NRichard Henderson <rth@twiddle.net>
上级 1bf6beec
......@@ -6491,6 +6491,46 @@ uint32 float32_to_uint32_round_to_zero( float32 a STATUS_PARAM )
return res;
}
int_fast16_t float32_to_int16(float32 a STATUS_PARAM)
{
int32_t v;
int_fast16_t res;
int old_exc_flags = get_float_exception_flags(status);
v = float32_to_int32(a STATUS_VAR);
if (v < -0x8000) {
res = -0x8000;
} else if (v > 0x7fff) {
res = 0x7fff;
} else {
return v;
}
set_float_exception_flags(old_exc_flags, status);
float_raise(float_flag_invalid STATUS_VAR);
return res;
}
uint_fast16_t float32_to_uint16(float32 a STATUS_PARAM)
{
int32_t v;
uint_fast16_t res;
int old_exc_flags = get_float_exception_flags(status);
v = float32_to_int32(a STATUS_VAR);
if (v < 0) {
res = 0;
} else if (v > 0xffff) {
res = 0xffff;
} else {
return v;
}
set_float_exception_flags(old_exc_flags, status);
float_raise(float_flag_invalid STATUS_VAR);
return res;
}
uint_fast16_t float32_to_uint16_round_to_zero(float32 a STATUS_PARAM)
{
int64_t v;
......@@ -6545,6 +6585,46 @@ uint32 float64_to_uint32_round_to_zero( float64 a STATUS_PARAM )
return res;
}
int_fast16_t float64_to_int16(float64 a STATUS_PARAM)
{
int64_t v;
int_fast16_t res;
int old_exc_flags = get_float_exception_flags(status);
v = float64_to_int32(a STATUS_VAR);
if (v < -0x8000) {
res = -0x8000;
} else if (v > 0x7fff) {
res = 0x7fff;
} else {
return v;
}
set_float_exception_flags(old_exc_flags, status);
float_raise(float_flag_invalid STATUS_VAR);
return res;
}
uint_fast16_t float64_to_uint16(float64 a STATUS_PARAM)
{
int64_t v;
uint_fast16_t res;
int old_exc_flags = get_float_exception_flags(status);
v = float64_to_int32(a STATUS_VAR);
if (v < 0) {
res = 0;
} else if (v > 0xffff) {
res = 0xffff;
} else {
return v;
}
set_float_exception_flags(old_exc_flags, status);
float_raise(float_flag_invalid STATUS_VAR);
return res;
}
uint_fast16_t float64_to_uint16_round_to_zero(float64 a STATUS_PARAM)
{
int64_t v;
......
......@@ -265,6 +265,8 @@ extern const float16 float16_default_nan;
/*----------------------------------------------------------------------------
| Software IEC/IEEE single-precision conversion routines.
*----------------------------------------------------------------------------*/
int_fast16_t float32_to_int16(float32 STATUS_PARAM);
uint_fast16_t float32_to_uint16(float32 STATUS_PARAM);
int_fast16_t float32_to_int16_round_to_zero(float32 STATUS_PARAM);
uint_fast16_t float32_to_uint16_round_to_zero(float32 STATUS_PARAM);
int32 float32_to_int32( float32 STATUS_PARAM );
......@@ -371,6 +373,8 @@ extern const float32 float32_default_nan;
/*----------------------------------------------------------------------------
| Software IEC/IEEE double-precision conversion routines.
*----------------------------------------------------------------------------*/
int_fast16_t float64_to_int16(float64 STATUS_PARAM);
uint_fast16_t float64_to_uint16(float64 STATUS_PARAM);
int_fast16_t float64_to_int16_round_to_zero(float64 STATUS_PARAM);
uint_fast16_t float64_to_uint16_round_to_zero(float64 STATUS_PARAM);
int32 float64_to_int32( float64 STATUS_PARAM );
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册