mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-03 15:53:54 -06:00
target/arm: Implement fp16 for Neon VCVT with rounding modes
Convert the Neon VCVT with-specified-rounding-mode instructions to gvec, and use this to implement fp16 support for them. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20200828183354.27913-40-peter.maydell@linaro.org
This commit is contained in:
parent
24018cf399
commit
ca88a6efdf
3 changed files with 66 additions and 67 deletions
|
@ -1869,3 +1869,26 @@ DO_VCVT_FIXED(gvec_vcvt_hs, helper_vfp_toshh_round_to_zero, uint16_t)
|
|||
DO_VCVT_FIXED(gvec_vcvt_hu, helper_vfp_touhh_round_to_zero, uint16_t)
|
||||
|
||||
#undef DO_VCVT_FIXED
|
||||
|
||||
#define DO_VCVT_RMODE(NAME, FUNC, TYPE) \
|
||||
void HELPER(NAME)(void *vd, void *vn, void *stat, uint32_t desc) \
|
||||
{ \
|
||||
float_status *fpst = stat; \
|
||||
intptr_t i, oprsz = simd_oprsz(desc); \
|
||||
uint32_t rmode = simd_data(desc); \
|
||||
uint32_t prev_rmode = get_float_rounding_mode(fpst); \
|
||||
TYPE *d = vd, *n = vn; \
|
||||
set_float_rounding_mode(rmode, fpst); \
|
||||
for (i = 0; i < oprsz / sizeof(TYPE); i++) { \
|
||||
d[i] = FUNC(n[i], 0, fpst); \
|
||||
} \
|
||||
set_float_rounding_mode(prev_rmode, fpst); \
|
||||
clear_tail(d, oprsz, simd_maxsz(desc)); \
|
||||
}
|
||||
|
||||
DO_VCVT_RMODE(gvec_vcvt_rm_ss, helper_vfp_tosls, uint32_t)
|
||||
DO_VCVT_RMODE(gvec_vcvt_rm_us, helper_vfp_touls, uint32_t)
|
||||
DO_VCVT_RMODE(gvec_vcvt_rm_sh, helper_vfp_toshh, uint16_t)
|
||||
DO_VCVT_RMODE(gvec_vcvt_rm_uh, helper_vfp_touhh, uint16_t)
|
||||
|
||||
#undef DO_VCVT_RMODE
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue