target/arm: Use macros instead of open-coding fp16 conversion helpers
Now the VFP_CONV_FIX macros can handle fp16's distinction between the width of the operation and the width of the type used to pass operands, use the macros rather than the open-coded functions. This creates an extra six helper functions, all of which we are going to need for the AArch32 VFP fp16 instructions. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20200828183354.27913-15-peter.maydell@linaro.org
This commit is contained in:
parent
5366f6ad7d
commit
414ba270c4
@ -164,6 +164,10 @@ DEF_HELPER_2(vfp_tosizh, s32, f16, ptr)
|
||||
DEF_HELPER_2(vfp_tosizs, s32, f32, ptr)
|
||||
DEF_HELPER_2(vfp_tosizd, s32, f64, ptr)
|
||||
|
||||
DEF_HELPER_3(vfp_toshh_round_to_zero, i32, f16, i32, ptr)
|
||||
DEF_HELPER_3(vfp_toslh_round_to_zero, i32, f16, i32, ptr)
|
||||
DEF_HELPER_3(vfp_touhh_round_to_zero, i32, f16, i32, ptr)
|
||||
DEF_HELPER_3(vfp_toulh_round_to_zero, i32, f16, i32, ptr)
|
||||
DEF_HELPER_3(vfp_toshs_round_to_zero, i32, f32, i32, ptr)
|
||||
DEF_HELPER_3(vfp_tosls_round_to_zero, i32, f32, i32, ptr)
|
||||
DEF_HELPER_3(vfp_touhs_round_to_zero, i32, f32, i32, ptr)
|
||||
@ -202,6 +206,8 @@ DEF_HELPER_3(vfp_sqtod, f64, i64, i32, ptr)
|
||||
DEF_HELPER_3(vfp_uhtod, f64, i64, i32, ptr)
|
||||
DEF_HELPER_3(vfp_ultod, f64, i64, i32, ptr)
|
||||
DEF_HELPER_3(vfp_uqtod, f64, i64, i32, ptr)
|
||||
DEF_HELPER_3(vfp_shtoh, f16, i32, i32, ptr)
|
||||
DEF_HELPER_3(vfp_uhtoh, f16, i32, i32, ptr)
|
||||
DEF_HELPER_3(vfp_sltoh, f16, i32, i32, ptr)
|
||||
DEF_HELPER_3(vfp_ultoh, f16, i32, i32, ptr)
|
||||
DEF_HELPER_3(vfp_sqtoh, f16, i64, i32, ptr)
|
||||
|
@ -434,92 +434,18 @@ VFP_CONV_FIX_A64(sq, s, 32, float32, 64, int64)
|
||||
VFP_CONV_FIX(uh, s, 32, float32, 32, uint16)
|
||||
VFP_CONV_FIX(ul, s, 32, float32, 32, uint32)
|
||||
VFP_CONV_FIX_A64(uq, s, 32, float32, 64, uint64)
|
||||
VFP_CONV_FIX(sh, h, 16, dh_ctype_f16, 32, int16)
|
||||
VFP_CONV_FIX(sl, h, 16, dh_ctype_f16, 32, int32)
|
||||
VFP_CONV_FIX_A64(sq, h, 16, dh_ctype_f16, 64, int64)
|
||||
VFP_CONV_FIX(uh, h, 16, dh_ctype_f16, 32, uint16)
|
||||
VFP_CONV_FIX(ul, h, 16, dh_ctype_f16, 32, uint32)
|
||||
VFP_CONV_FIX_A64(uq, h, 16, dh_ctype_f16, 64, uint64)
|
||||
|
||||
#undef VFP_CONV_FIX
|
||||
#undef VFP_CONV_FIX_FLOAT
|
||||
#undef VFP_CONV_FLOAT_FIX_ROUND
|
||||
#undef VFP_CONV_FIX_A64
|
||||
|
||||
uint32_t HELPER(vfp_sltoh)(uint32_t x, uint32_t shift, void *fpst)
|
||||
{
|
||||
return int32_to_float16_scalbn(x, -shift, fpst);
|
||||
}
|
||||
|
||||
uint32_t HELPER(vfp_ultoh)(uint32_t x, uint32_t shift, void *fpst)
|
||||
{
|
||||
return uint32_to_float16_scalbn(x, -shift, fpst);
|
||||
}
|
||||
|
||||
uint32_t HELPER(vfp_sqtoh)(uint64_t x, uint32_t shift, void *fpst)
|
||||
{
|
||||
return int64_to_float16_scalbn(x, -shift, fpst);
|
||||
}
|
||||
|
||||
uint32_t HELPER(vfp_uqtoh)(uint64_t x, uint32_t shift, void *fpst)
|
||||
{
|
||||
return uint64_to_float16_scalbn(x, -shift, fpst);
|
||||
}
|
||||
|
||||
uint32_t HELPER(vfp_toshh)(uint32_t x, uint32_t shift, void *fpst)
|
||||
{
|
||||
if (unlikely(float16_is_any_nan(x))) {
|
||||
float_raise(float_flag_invalid, fpst);
|
||||
return 0;
|
||||
}
|
||||
return float16_to_int16_scalbn(x, get_float_rounding_mode(fpst),
|
||||
shift, fpst);
|
||||
}
|
||||
|
||||
uint32_t HELPER(vfp_touhh)(uint32_t x, uint32_t shift, void *fpst)
|
||||
{
|
||||
if (unlikely(float16_is_any_nan(x))) {
|
||||
float_raise(float_flag_invalid, fpst);
|
||||
return 0;
|
||||
}
|
||||
return float16_to_uint16_scalbn(x, get_float_rounding_mode(fpst),
|
||||
shift, fpst);
|
||||
}
|
||||
|
||||
uint32_t HELPER(vfp_toslh)(uint32_t x, uint32_t shift, void *fpst)
|
||||
{
|
||||
if (unlikely(float16_is_any_nan(x))) {
|
||||
float_raise(float_flag_invalid, fpst);
|
||||
return 0;
|
||||
}
|
||||
return float16_to_int32_scalbn(x, get_float_rounding_mode(fpst),
|
||||
shift, fpst);
|
||||
}
|
||||
|
||||
uint32_t HELPER(vfp_toulh)(uint32_t x, uint32_t shift, void *fpst)
|
||||
{
|
||||
if (unlikely(float16_is_any_nan(x))) {
|
||||
float_raise(float_flag_invalid, fpst);
|
||||
return 0;
|
||||
}
|
||||
return float16_to_uint32_scalbn(x, get_float_rounding_mode(fpst),
|
||||
shift, fpst);
|
||||
}
|
||||
|
||||
uint64_t HELPER(vfp_tosqh)(uint32_t x, uint32_t shift, void *fpst)
|
||||
{
|
||||
if (unlikely(float16_is_any_nan(x))) {
|
||||
float_raise(float_flag_invalid, fpst);
|
||||
return 0;
|
||||
}
|
||||
return float16_to_int64_scalbn(x, get_float_rounding_mode(fpst),
|
||||
shift, fpst);
|
||||
}
|
||||
|
||||
uint64_t HELPER(vfp_touqh)(uint32_t x, uint32_t shift, void *fpst)
|
||||
{
|
||||
if (unlikely(float16_is_any_nan(x))) {
|
||||
float_raise(float_flag_invalid, fpst);
|
||||
return 0;
|
||||
}
|
||||
return float16_to_uint64_scalbn(x, get_float_rounding_mode(fpst),
|
||||
shift, fpst);
|
||||
}
|
||||
|
||||
/* Set the current fp rounding mode and return the old one.
|
||||
* The argument is a softfloat float_round_ value.
|
||||
*/
|
||||
|
Loading…
x
Reference in New Issue
Block a user