target/arm: Implement VFP fp16 for VFP_BINOP operations

Implmeent VFP fp16 support for simple binary-operator VFP insns VADD,
VSUB, VMUL, VDIV, VMINNM and VMAXNM:

* make the VFP_BINOP() macro generate float16 helpers as well as
float32 and float64
* implement a do_vfp_3op_hp() function similar to the existing
do_vfp_3op_sp()
* add decode for the half-precision insn patterns

Note that the VFP_BINOP macro use creates a couple of unused helper
functions vfp_maxh and vfp_minh, but they're small so it's not worth
splitting the BINOP operations into "needs halfprec" and "no
halfprec" groups.

Backports commit 120a0eb3ea23a5b06fae2f3daebd46a4035864cf
This commit is contained in:
Peter Maydell 2021-02-28 04:18:36 -05:00 committed by Lioncash
parent 1afb240134
commit eae621098d
21 changed files with 235 additions and 0 deletions

View file

@ -1888,6 +1888,7 @@
#define helper_vfp_absd helper_vfp_absd_aarch64
#define helper_vfp_abss helper_vfp_abss_aarch64
#define helper_vfp_addd helper_vfp_addd_aarch64
#define helper_vfp_addh helper_vfp_addh_aarch64
#define helper_vfp_adds helper_vfp_adds_aarch64
#define helper_vfp_cmpd helper_vfp_cmpd_aarch64
#define helper_vfp_cmph_a64 helper_vfp_cmph_a64_aarch64
@ -1896,6 +1897,7 @@
#define helper_vfp_cmpes helper_vfp_cmpes_aarch64
#define helper_vfp_cmps helper_vfp_cmps_aarch64
#define helper_vfp_divd helper_vfp_divd_aarch64
#define helper_vfp_divh helper_vfp_divh_aarch64
#define helper_vfp_divs helper_vfp_divs_aarch64
#define helper_vfp_fcvt_f16_to_f32 helper_vfp_fcvt_f16_to_f32_aarch64
#define helper_vfp_fcvt_f16_to_f64 helper_vfp_fcvt_f16_to_f64_aarch64
@ -1905,16 +1907,21 @@
#define helper_vfp_fcvtsd helper_vfp_fcvtsd_aarch64
#define helper_vfp_get_fpscr helper_vfp_get_fpscr_aarch64
#define helper_vfp_maxd helper_vfp_maxd_aarch64
#define helper_vfp_maxh helper_vfp_maxh_aarch64
#define helper_vfp_maxnumd helper_vfp_maxnumd_aarch64
#define helper_vfp_maxnumh helper_vfp_maxnumh_aarch64
#define helper_vfp_maxnums helper_vfp_maxnums_aarch64
#define helper_vfp_maxs helper_vfp_maxs_aarch64
#define helper_vfp_mind helper_vfp_mind_aarch64
#define helper_vfp_minh helper_vfp_minh_aarch64
#define helper_vfp_minnumd helper_vfp_minnumd_aarch64
#define helper_vfp_minnumh helper_vfp_minnumh_aarch64
#define helper_vfp_minnums helper_vfp_minnums_aarch64
#define helper_vfp_mins helper_vfp_mins_aarch64
#define helper_vfp_muladdd helper_vfp_muladdd_aarch64
#define helper_vfp_muladds helper_vfp_muladds_aarch64
#define helper_vfp_muld helper_vfp_muld_aarch64
#define helper_vfp_mulh helper_vfp_mulh_aarch64
#define helper_vfp_muls helper_vfp_muls_aarch64
#define helper_vfp_negd helper_vfp_negd_aarch64
#define helper_vfp_negs helper_vfp_negs_aarch64
@ -1933,6 +1940,7 @@
#define helper_vfp_sqtoh helper_vfp_sqtoh_aarch64
#define helper_vfp_sqtos helper_vfp_sqtos_aarch64
#define helper_vfp_subd helper_vfp_subd_aarch64
#define helper_vfp_subh helper_vfp_subh_aarch64
#define helper_vfp_subs helper_vfp_subs_aarch64
#define helper_vfp_toshd helper_vfp_toshd_aarch64
#define helper_vfp_toshd_round_to_zero helper_vfp_toshd_round_to_zero_aarch64

View file

@ -1888,6 +1888,7 @@
#define helper_vfp_absd helper_vfp_absd_aarch64eb
#define helper_vfp_abss helper_vfp_abss_aarch64eb
#define helper_vfp_addd helper_vfp_addd_aarch64eb
#define helper_vfp_addh helper_vfp_addh_aarch64eb
#define helper_vfp_adds helper_vfp_adds_aarch64eb
#define helper_vfp_cmpd helper_vfp_cmpd_aarch64eb
#define helper_vfp_cmph_a64 helper_vfp_cmph_a64_aarch64eb
@ -1896,6 +1897,7 @@
#define helper_vfp_cmpes helper_vfp_cmpes_aarch64eb
#define helper_vfp_cmps helper_vfp_cmps_aarch64eb
#define helper_vfp_divd helper_vfp_divd_aarch64eb
#define helper_vfp_divh helper_vfp_divh_aarch64eb
#define helper_vfp_divs helper_vfp_divs_aarch64eb
#define helper_vfp_fcvt_f16_to_f32 helper_vfp_fcvt_f16_to_f32_aarch64eb
#define helper_vfp_fcvt_f16_to_f64 helper_vfp_fcvt_f16_to_f64_aarch64eb
@ -1905,16 +1907,21 @@
#define helper_vfp_fcvtsd helper_vfp_fcvtsd_aarch64eb
#define helper_vfp_get_fpscr helper_vfp_get_fpscr_aarch64eb
#define helper_vfp_maxd helper_vfp_maxd_aarch64eb
#define helper_vfp_maxh helper_vfp_maxh_aarch64eb
#define helper_vfp_maxnumd helper_vfp_maxnumd_aarch64eb
#define helper_vfp_maxnumh helper_vfp_maxnumh_aarch64eb
#define helper_vfp_maxnums helper_vfp_maxnums_aarch64eb
#define helper_vfp_maxs helper_vfp_maxs_aarch64eb
#define helper_vfp_mind helper_vfp_mind_aarch64eb
#define helper_vfp_minh helper_vfp_minh_aarch64eb
#define helper_vfp_minnumd helper_vfp_minnumd_aarch64eb
#define helper_vfp_minnumh helper_vfp_minnumh_aarch64eb
#define helper_vfp_minnums helper_vfp_minnums_aarch64eb
#define helper_vfp_mins helper_vfp_mins_aarch64eb
#define helper_vfp_muladdd helper_vfp_muladdd_aarch64eb
#define helper_vfp_muladds helper_vfp_muladds_aarch64eb
#define helper_vfp_muld helper_vfp_muld_aarch64eb
#define helper_vfp_mulh helper_vfp_mulh_aarch64eb
#define helper_vfp_muls helper_vfp_muls_aarch64eb
#define helper_vfp_negd helper_vfp_negd_aarch64eb
#define helper_vfp_negs helper_vfp_negs_aarch64eb
@ -1933,6 +1940,7 @@
#define helper_vfp_sqtoh helper_vfp_sqtoh_aarch64eb
#define helper_vfp_sqtos helper_vfp_sqtos_aarch64eb
#define helper_vfp_subd helper_vfp_subd_aarch64eb
#define helper_vfp_subh helper_vfp_subh_aarch64eb
#define helper_vfp_subs helper_vfp_subs_aarch64eb
#define helper_vfp_toshd helper_vfp_toshd_aarch64eb
#define helper_vfp_toshd_round_to_zero helper_vfp_toshd_round_to_zero_aarch64eb

View file

@ -1888,6 +1888,7 @@
#define helper_vfp_absd helper_vfp_absd_arm
#define helper_vfp_abss helper_vfp_abss_arm
#define helper_vfp_addd helper_vfp_addd_arm
#define helper_vfp_addh helper_vfp_addh_arm
#define helper_vfp_adds helper_vfp_adds_arm
#define helper_vfp_cmpd helper_vfp_cmpd_arm
#define helper_vfp_cmph_a64 helper_vfp_cmph_a64_arm
@ -1896,6 +1897,7 @@
#define helper_vfp_cmpes helper_vfp_cmpes_arm
#define helper_vfp_cmps helper_vfp_cmps_arm
#define helper_vfp_divd helper_vfp_divd_arm
#define helper_vfp_divh helper_vfp_divh_arm
#define helper_vfp_divs helper_vfp_divs_arm
#define helper_vfp_fcvt_f16_to_f32 helper_vfp_fcvt_f16_to_f32_arm
#define helper_vfp_fcvt_f16_to_f64 helper_vfp_fcvt_f16_to_f64_arm
@ -1905,16 +1907,21 @@
#define helper_vfp_fcvtsd helper_vfp_fcvtsd_arm
#define helper_vfp_get_fpscr helper_vfp_get_fpscr_arm
#define helper_vfp_maxd helper_vfp_maxd_arm
#define helper_vfp_maxh helper_vfp_maxh_arm
#define helper_vfp_maxnumd helper_vfp_maxnumd_arm
#define helper_vfp_maxnumh helper_vfp_maxnumh_arm
#define helper_vfp_maxnums helper_vfp_maxnums_arm
#define helper_vfp_maxs helper_vfp_maxs_arm
#define helper_vfp_mind helper_vfp_mind_arm
#define helper_vfp_minh helper_vfp_minh_arm
#define helper_vfp_minnumd helper_vfp_minnumd_arm
#define helper_vfp_minnumh helper_vfp_minnumh_arm
#define helper_vfp_minnums helper_vfp_minnums_arm
#define helper_vfp_mins helper_vfp_mins_arm
#define helper_vfp_muladdd helper_vfp_muladdd_arm
#define helper_vfp_muladds helper_vfp_muladds_arm
#define helper_vfp_muld helper_vfp_muld_arm
#define helper_vfp_mulh helper_vfp_mulh_arm
#define helper_vfp_muls helper_vfp_muls_arm
#define helper_vfp_negd helper_vfp_negd_arm
#define helper_vfp_negs helper_vfp_negs_arm
@ -1933,6 +1940,7 @@
#define helper_vfp_sqtoh helper_vfp_sqtoh_arm
#define helper_vfp_sqtos helper_vfp_sqtos_arm
#define helper_vfp_subd helper_vfp_subd_arm
#define helper_vfp_subh helper_vfp_subh_arm
#define helper_vfp_subs helper_vfp_subs_arm
#define helper_vfp_toshd helper_vfp_toshd_arm
#define helper_vfp_toshd_round_to_zero helper_vfp_toshd_round_to_zero_arm

View file

@ -1888,6 +1888,7 @@
#define helper_vfp_absd helper_vfp_absd_armeb
#define helper_vfp_abss helper_vfp_abss_armeb
#define helper_vfp_addd helper_vfp_addd_armeb
#define helper_vfp_addh helper_vfp_addh_armeb
#define helper_vfp_adds helper_vfp_adds_armeb
#define helper_vfp_cmpd helper_vfp_cmpd_armeb
#define helper_vfp_cmph_a64 helper_vfp_cmph_a64_armeb
@ -1896,6 +1897,7 @@
#define helper_vfp_cmpes helper_vfp_cmpes_armeb
#define helper_vfp_cmps helper_vfp_cmps_armeb
#define helper_vfp_divd helper_vfp_divd_armeb
#define helper_vfp_divh helper_vfp_divh_armeb
#define helper_vfp_divs helper_vfp_divs_armeb
#define helper_vfp_fcvt_f16_to_f32 helper_vfp_fcvt_f16_to_f32_armeb
#define helper_vfp_fcvt_f16_to_f64 helper_vfp_fcvt_f16_to_f64_armeb
@ -1905,16 +1907,21 @@
#define helper_vfp_fcvtsd helper_vfp_fcvtsd_armeb
#define helper_vfp_get_fpscr helper_vfp_get_fpscr_armeb
#define helper_vfp_maxd helper_vfp_maxd_armeb
#define helper_vfp_maxh helper_vfp_maxh_armeb
#define helper_vfp_maxnumd helper_vfp_maxnumd_armeb
#define helper_vfp_maxnumh helper_vfp_maxnumh_armeb
#define helper_vfp_maxnums helper_vfp_maxnums_armeb
#define helper_vfp_maxs helper_vfp_maxs_armeb
#define helper_vfp_mind helper_vfp_mind_armeb
#define helper_vfp_minh helper_vfp_minh_armeb
#define helper_vfp_minnumd helper_vfp_minnumd_armeb
#define helper_vfp_minnumh helper_vfp_minnumh_armeb
#define helper_vfp_minnums helper_vfp_minnums_armeb
#define helper_vfp_mins helper_vfp_mins_armeb
#define helper_vfp_muladdd helper_vfp_muladdd_armeb
#define helper_vfp_muladds helper_vfp_muladds_armeb
#define helper_vfp_muld helper_vfp_muld_armeb
#define helper_vfp_mulh helper_vfp_mulh_armeb
#define helper_vfp_muls helper_vfp_muls_armeb
#define helper_vfp_negd helper_vfp_negd_armeb
#define helper_vfp_negs helper_vfp_negs_armeb
@ -1933,6 +1940,7 @@
#define helper_vfp_sqtoh helper_vfp_sqtoh_armeb
#define helper_vfp_sqtos helper_vfp_sqtos_armeb
#define helper_vfp_subd helper_vfp_subd_armeb
#define helper_vfp_subh helper_vfp_subh_armeb
#define helper_vfp_subs helper_vfp_subs_armeb
#define helper_vfp_toshd helper_vfp_toshd_armeb
#define helper_vfp_toshd_round_to_zero helper_vfp_toshd_round_to_zero_armeb

View file

@ -1894,6 +1894,7 @@ symbols = (
'helper_vfp_absd',
'helper_vfp_abss',
'helper_vfp_addd',
'helper_vfp_addh',
'helper_vfp_adds',
'helper_vfp_cmpd',
'helper_vfp_cmph_a64',
@ -1902,6 +1903,7 @@ symbols = (
'helper_vfp_cmpes',
'helper_vfp_cmps',
'helper_vfp_divd',
'helper_vfp_divh',
'helper_vfp_divs',
'helper_vfp_fcvt_f16_to_f32',
'helper_vfp_fcvt_f16_to_f64',
@ -1911,16 +1913,21 @@ symbols = (
'helper_vfp_fcvtsd',
'helper_vfp_get_fpscr',
'helper_vfp_maxd',
'helper_vfp_maxh',
'helper_vfp_maxnumd',
'helper_vfp_maxnumh',
'helper_vfp_maxnums',
'helper_vfp_maxs',
'helper_vfp_mind',
'helper_vfp_minh',
'helper_vfp_minnumd',
'helper_vfp_minnumh',
'helper_vfp_minnums',
'helper_vfp_mins',
'helper_vfp_muladdd',
'helper_vfp_muladds',
'helper_vfp_muld',
'helper_vfp_mulh',
'helper_vfp_muls',
'helper_vfp_negd',
'helper_vfp_negs',
@ -1939,6 +1946,7 @@ symbols = (
'helper_vfp_sqtoh',
'helper_vfp_sqtos',
'helper_vfp_subd',
'helper_vfp_subh',
'helper_vfp_subs',
'helper_vfp_toshd',
'helper_vfp_toshd_round_to_zero',

View file

@ -1888,6 +1888,7 @@
#define helper_vfp_absd helper_vfp_absd_m68k
#define helper_vfp_abss helper_vfp_abss_m68k
#define helper_vfp_addd helper_vfp_addd_m68k
#define helper_vfp_addh helper_vfp_addh_m68k
#define helper_vfp_adds helper_vfp_adds_m68k
#define helper_vfp_cmpd helper_vfp_cmpd_m68k
#define helper_vfp_cmph_a64 helper_vfp_cmph_a64_m68k
@ -1896,6 +1897,7 @@
#define helper_vfp_cmpes helper_vfp_cmpes_m68k
#define helper_vfp_cmps helper_vfp_cmps_m68k
#define helper_vfp_divd helper_vfp_divd_m68k
#define helper_vfp_divh helper_vfp_divh_m68k
#define helper_vfp_divs helper_vfp_divs_m68k
#define helper_vfp_fcvt_f16_to_f32 helper_vfp_fcvt_f16_to_f32_m68k
#define helper_vfp_fcvt_f16_to_f64 helper_vfp_fcvt_f16_to_f64_m68k
@ -1905,16 +1907,21 @@
#define helper_vfp_fcvtsd helper_vfp_fcvtsd_m68k
#define helper_vfp_get_fpscr helper_vfp_get_fpscr_m68k
#define helper_vfp_maxd helper_vfp_maxd_m68k
#define helper_vfp_maxh helper_vfp_maxh_m68k
#define helper_vfp_maxnumd helper_vfp_maxnumd_m68k
#define helper_vfp_maxnumh helper_vfp_maxnumh_m68k
#define helper_vfp_maxnums helper_vfp_maxnums_m68k
#define helper_vfp_maxs helper_vfp_maxs_m68k
#define helper_vfp_mind helper_vfp_mind_m68k
#define helper_vfp_minh helper_vfp_minh_m68k
#define helper_vfp_minnumd helper_vfp_minnumd_m68k
#define helper_vfp_minnumh helper_vfp_minnumh_m68k
#define helper_vfp_minnums helper_vfp_minnums_m68k
#define helper_vfp_mins helper_vfp_mins_m68k
#define helper_vfp_muladdd helper_vfp_muladdd_m68k
#define helper_vfp_muladds helper_vfp_muladds_m68k
#define helper_vfp_muld helper_vfp_muld_m68k
#define helper_vfp_mulh helper_vfp_mulh_m68k
#define helper_vfp_muls helper_vfp_muls_m68k
#define helper_vfp_negd helper_vfp_negd_m68k
#define helper_vfp_negs helper_vfp_negs_m68k
@ -1933,6 +1940,7 @@
#define helper_vfp_sqtoh helper_vfp_sqtoh_m68k
#define helper_vfp_sqtos helper_vfp_sqtos_m68k
#define helper_vfp_subd helper_vfp_subd_m68k
#define helper_vfp_subh helper_vfp_subh_m68k
#define helper_vfp_subs helper_vfp_subs_m68k
#define helper_vfp_toshd helper_vfp_toshd_m68k
#define helper_vfp_toshd_round_to_zero helper_vfp_toshd_round_to_zero_m68k

View file

@ -1888,6 +1888,7 @@
#define helper_vfp_absd helper_vfp_absd_mips
#define helper_vfp_abss helper_vfp_abss_mips
#define helper_vfp_addd helper_vfp_addd_mips
#define helper_vfp_addh helper_vfp_addh_mips
#define helper_vfp_adds helper_vfp_adds_mips
#define helper_vfp_cmpd helper_vfp_cmpd_mips
#define helper_vfp_cmph_a64 helper_vfp_cmph_a64_mips
@ -1896,6 +1897,7 @@
#define helper_vfp_cmpes helper_vfp_cmpes_mips
#define helper_vfp_cmps helper_vfp_cmps_mips
#define helper_vfp_divd helper_vfp_divd_mips
#define helper_vfp_divh helper_vfp_divh_mips
#define helper_vfp_divs helper_vfp_divs_mips
#define helper_vfp_fcvt_f16_to_f32 helper_vfp_fcvt_f16_to_f32_mips
#define helper_vfp_fcvt_f16_to_f64 helper_vfp_fcvt_f16_to_f64_mips
@ -1905,16 +1907,21 @@
#define helper_vfp_fcvtsd helper_vfp_fcvtsd_mips
#define helper_vfp_get_fpscr helper_vfp_get_fpscr_mips
#define helper_vfp_maxd helper_vfp_maxd_mips
#define helper_vfp_maxh helper_vfp_maxh_mips
#define helper_vfp_maxnumd helper_vfp_maxnumd_mips
#define helper_vfp_maxnumh helper_vfp_maxnumh_mips
#define helper_vfp_maxnums helper_vfp_maxnums_mips
#define helper_vfp_maxs helper_vfp_maxs_mips
#define helper_vfp_mind helper_vfp_mind_mips
#define helper_vfp_minh helper_vfp_minh_mips
#define helper_vfp_minnumd helper_vfp_minnumd_mips
#define helper_vfp_minnumh helper_vfp_minnumh_mips
#define helper_vfp_minnums helper_vfp_minnums_mips
#define helper_vfp_mins helper_vfp_mins_mips
#define helper_vfp_muladdd helper_vfp_muladdd_mips
#define helper_vfp_muladds helper_vfp_muladds_mips
#define helper_vfp_muld helper_vfp_muld_mips
#define helper_vfp_mulh helper_vfp_mulh_mips
#define helper_vfp_muls helper_vfp_muls_mips
#define helper_vfp_negd helper_vfp_negd_mips
#define helper_vfp_negs helper_vfp_negs_mips
@ -1933,6 +1940,7 @@
#define helper_vfp_sqtoh helper_vfp_sqtoh_mips
#define helper_vfp_sqtos helper_vfp_sqtos_mips
#define helper_vfp_subd helper_vfp_subd_mips
#define helper_vfp_subh helper_vfp_subh_mips
#define helper_vfp_subs helper_vfp_subs_mips
#define helper_vfp_toshd helper_vfp_toshd_mips
#define helper_vfp_toshd_round_to_zero helper_vfp_toshd_round_to_zero_mips

View file

@ -1888,6 +1888,7 @@
#define helper_vfp_absd helper_vfp_absd_mips64
#define helper_vfp_abss helper_vfp_abss_mips64
#define helper_vfp_addd helper_vfp_addd_mips64
#define helper_vfp_addh helper_vfp_addh_mips64
#define helper_vfp_adds helper_vfp_adds_mips64
#define helper_vfp_cmpd helper_vfp_cmpd_mips64
#define helper_vfp_cmph_a64 helper_vfp_cmph_a64_mips64
@ -1896,6 +1897,7 @@
#define helper_vfp_cmpes helper_vfp_cmpes_mips64
#define helper_vfp_cmps helper_vfp_cmps_mips64
#define helper_vfp_divd helper_vfp_divd_mips64
#define helper_vfp_divh helper_vfp_divh_mips64
#define helper_vfp_divs helper_vfp_divs_mips64
#define helper_vfp_fcvt_f16_to_f32 helper_vfp_fcvt_f16_to_f32_mips64
#define helper_vfp_fcvt_f16_to_f64 helper_vfp_fcvt_f16_to_f64_mips64
@ -1905,16 +1907,21 @@
#define helper_vfp_fcvtsd helper_vfp_fcvtsd_mips64
#define helper_vfp_get_fpscr helper_vfp_get_fpscr_mips64
#define helper_vfp_maxd helper_vfp_maxd_mips64
#define helper_vfp_maxh helper_vfp_maxh_mips64
#define helper_vfp_maxnumd helper_vfp_maxnumd_mips64
#define helper_vfp_maxnumh helper_vfp_maxnumh_mips64
#define helper_vfp_maxnums helper_vfp_maxnums_mips64
#define helper_vfp_maxs helper_vfp_maxs_mips64
#define helper_vfp_mind helper_vfp_mind_mips64
#define helper_vfp_minh helper_vfp_minh_mips64
#define helper_vfp_minnumd helper_vfp_minnumd_mips64
#define helper_vfp_minnumh helper_vfp_minnumh_mips64
#define helper_vfp_minnums helper_vfp_minnums_mips64
#define helper_vfp_mins helper_vfp_mins_mips64
#define helper_vfp_muladdd helper_vfp_muladdd_mips64
#define helper_vfp_muladds helper_vfp_muladds_mips64
#define helper_vfp_muld helper_vfp_muld_mips64
#define helper_vfp_mulh helper_vfp_mulh_mips64
#define helper_vfp_muls helper_vfp_muls_mips64
#define helper_vfp_negd helper_vfp_negd_mips64
#define helper_vfp_negs helper_vfp_negs_mips64
@ -1933,6 +1940,7 @@
#define helper_vfp_sqtoh helper_vfp_sqtoh_mips64
#define helper_vfp_sqtos helper_vfp_sqtos_mips64
#define helper_vfp_subd helper_vfp_subd_mips64
#define helper_vfp_subh helper_vfp_subh_mips64
#define helper_vfp_subs helper_vfp_subs_mips64
#define helper_vfp_toshd helper_vfp_toshd_mips64
#define helper_vfp_toshd_round_to_zero helper_vfp_toshd_round_to_zero_mips64

View file

@ -1888,6 +1888,7 @@
#define helper_vfp_absd helper_vfp_absd_mips64el
#define helper_vfp_abss helper_vfp_abss_mips64el
#define helper_vfp_addd helper_vfp_addd_mips64el
#define helper_vfp_addh helper_vfp_addh_mips64el
#define helper_vfp_adds helper_vfp_adds_mips64el
#define helper_vfp_cmpd helper_vfp_cmpd_mips64el
#define helper_vfp_cmph_a64 helper_vfp_cmph_a64_mips64el
@ -1896,6 +1897,7 @@
#define helper_vfp_cmpes helper_vfp_cmpes_mips64el
#define helper_vfp_cmps helper_vfp_cmps_mips64el
#define helper_vfp_divd helper_vfp_divd_mips64el
#define helper_vfp_divh helper_vfp_divh_mips64el
#define helper_vfp_divs helper_vfp_divs_mips64el
#define helper_vfp_fcvt_f16_to_f32 helper_vfp_fcvt_f16_to_f32_mips64el
#define helper_vfp_fcvt_f16_to_f64 helper_vfp_fcvt_f16_to_f64_mips64el
@ -1905,16 +1907,21 @@
#define helper_vfp_fcvtsd helper_vfp_fcvtsd_mips64el
#define helper_vfp_get_fpscr helper_vfp_get_fpscr_mips64el
#define helper_vfp_maxd helper_vfp_maxd_mips64el
#define helper_vfp_maxh helper_vfp_maxh_mips64el
#define helper_vfp_maxnumd helper_vfp_maxnumd_mips64el
#define helper_vfp_maxnumh helper_vfp_maxnumh_mips64el
#define helper_vfp_maxnums helper_vfp_maxnums_mips64el
#define helper_vfp_maxs helper_vfp_maxs_mips64el
#define helper_vfp_mind helper_vfp_mind_mips64el
#define helper_vfp_minh helper_vfp_minh_mips64el
#define helper_vfp_minnumd helper_vfp_minnumd_mips64el
#define helper_vfp_minnumh helper_vfp_minnumh_mips64el
#define helper_vfp_minnums helper_vfp_minnums_mips64el
#define helper_vfp_mins helper_vfp_mins_mips64el
#define helper_vfp_muladdd helper_vfp_muladdd_mips64el
#define helper_vfp_muladds helper_vfp_muladds_mips64el
#define helper_vfp_muld helper_vfp_muld_mips64el
#define helper_vfp_mulh helper_vfp_mulh_mips64el
#define helper_vfp_muls helper_vfp_muls_mips64el
#define helper_vfp_negd helper_vfp_negd_mips64el
#define helper_vfp_negs helper_vfp_negs_mips64el
@ -1933,6 +1940,7 @@
#define helper_vfp_sqtoh helper_vfp_sqtoh_mips64el
#define helper_vfp_sqtos helper_vfp_sqtos_mips64el
#define helper_vfp_subd helper_vfp_subd_mips64el
#define helper_vfp_subh helper_vfp_subh_mips64el
#define helper_vfp_subs helper_vfp_subs_mips64el
#define helper_vfp_toshd helper_vfp_toshd_mips64el
#define helper_vfp_toshd_round_to_zero helper_vfp_toshd_round_to_zero_mips64el

View file

@ -1888,6 +1888,7 @@
#define helper_vfp_absd helper_vfp_absd_mipsel
#define helper_vfp_abss helper_vfp_abss_mipsel
#define helper_vfp_addd helper_vfp_addd_mipsel
#define helper_vfp_addh helper_vfp_addh_mipsel
#define helper_vfp_adds helper_vfp_adds_mipsel
#define helper_vfp_cmpd helper_vfp_cmpd_mipsel
#define helper_vfp_cmph_a64 helper_vfp_cmph_a64_mipsel
@ -1896,6 +1897,7 @@
#define helper_vfp_cmpes helper_vfp_cmpes_mipsel
#define helper_vfp_cmps helper_vfp_cmps_mipsel
#define helper_vfp_divd helper_vfp_divd_mipsel
#define helper_vfp_divh helper_vfp_divh_mipsel
#define helper_vfp_divs helper_vfp_divs_mipsel
#define helper_vfp_fcvt_f16_to_f32 helper_vfp_fcvt_f16_to_f32_mipsel
#define helper_vfp_fcvt_f16_to_f64 helper_vfp_fcvt_f16_to_f64_mipsel
@ -1905,16 +1907,21 @@
#define helper_vfp_fcvtsd helper_vfp_fcvtsd_mipsel
#define helper_vfp_get_fpscr helper_vfp_get_fpscr_mipsel
#define helper_vfp_maxd helper_vfp_maxd_mipsel
#define helper_vfp_maxh helper_vfp_maxh_mipsel
#define helper_vfp_maxnumd helper_vfp_maxnumd_mipsel
#define helper_vfp_maxnumh helper_vfp_maxnumh_mipsel
#define helper_vfp_maxnums helper_vfp_maxnums_mipsel
#define helper_vfp_maxs helper_vfp_maxs_mipsel
#define helper_vfp_mind helper_vfp_mind_mipsel
#define helper_vfp_minh helper_vfp_minh_mipsel
#define helper_vfp_minnumd helper_vfp_minnumd_mipsel
#define helper_vfp_minnumh helper_vfp_minnumh_mipsel
#define helper_vfp_minnums helper_vfp_minnums_mipsel
#define helper_vfp_mins helper_vfp_mins_mipsel
#define helper_vfp_muladdd helper_vfp_muladdd_mipsel
#define helper_vfp_muladds helper_vfp_muladds_mipsel
#define helper_vfp_muld helper_vfp_muld_mipsel
#define helper_vfp_mulh helper_vfp_mulh_mipsel
#define helper_vfp_muls helper_vfp_muls_mipsel
#define helper_vfp_negd helper_vfp_negd_mipsel
#define helper_vfp_negs helper_vfp_negs_mipsel
@ -1933,6 +1940,7 @@
#define helper_vfp_sqtoh helper_vfp_sqtoh_mipsel
#define helper_vfp_sqtos helper_vfp_sqtos_mipsel
#define helper_vfp_subd helper_vfp_subd_mipsel
#define helper_vfp_subh helper_vfp_subh_mipsel
#define helper_vfp_subs helper_vfp_subs_mipsel
#define helper_vfp_toshd helper_vfp_toshd_mipsel
#define helper_vfp_toshd_round_to_zero helper_vfp_toshd_round_to_zero_mipsel

View file

@ -1888,6 +1888,7 @@
#define helper_vfp_absd helper_vfp_absd_powerpc
#define helper_vfp_abss helper_vfp_abss_powerpc
#define helper_vfp_addd helper_vfp_addd_powerpc
#define helper_vfp_addh helper_vfp_addh_powerpc
#define helper_vfp_adds helper_vfp_adds_powerpc
#define helper_vfp_cmpd helper_vfp_cmpd_powerpc
#define helper_vfp_cmph_a64 helper_vfp_cmph_a64_powerpc
@ -1896,6 +1897,7 @@
#define helper_vfp_cmpes helper_vfp_cmpes_powerpc
#define helper_vfp_cmps helper_vfp_cmps_powerpc
#define helper_vfp_divd helper_vfp_divd_powerpc
#define helper_vfp_divh helper_vfp_divh_powerpc
#define helper_vfp_divs helper_vfp_divs_powerpc
#define helper_vfp_fcvt_f16_to_f32 helper_vfp_fcvt_f16_to_f32_powerpc
#define helper_vfp_fcvt_f16_to_f64 helper_vfp_fcvt_f16_to_f64_powerpc
@ -1905,16 +1907,21 @@
#define helper_vfp_fcvtsd helper_vfp_fcvtsd_powerpc
#define helper_vfp_get_fpscr helper_vfp_get_fpscr_powerpc
#define helper_vfp_maxd helper_vfp_maxd_powerpc
#define helper_vfp_maxh helper_vfp_maxh_powerpc
#define helper_vfp_maxnumd helper_vfp_maxnumd_powerpc
#define helper_vfp_maxnumh helper_vfp_maxnumh_powerpc
#define helper_vfp_maxnums helper_vfp_maxnums_powerpc
#define helper_vfp_maxs helper_vfp_maxs_powerpc
#define helper_vfp_mind helper_vfp_mind_powerpc
#define helper_vfp_minh helper_vfp_minh_powerpc
#define helper_vfp_minnumd helper_vfp_minnumd_powerpc
#define helper_vfp_minnumh helper_vfp_minnumh_powerpc
#define helper_vfp_minnums helper_vfp_minnums_powerpc
#define helper_vfp_mins helper_vfp_mins_powerpc
#define helper_vfp_muladdd helper_vfp_muladdd_powerpc
#define helper_vfp_muladds helper_vfp_muladds_powerpc
#define helper_vfp_muld helper_vfp_muld_powerpc
#define helper_vfp_mulh helper_vfp_mulh_powerpc
#define helper_vfp_muls helper_vfp_muls_powerpc
#define helper_vfp_negd helper_vfp_negd_powerpc
#define helper_vfp_negs helper_vfp_negs_powerpc
@ -1933,6 +1940,7 @@
#define helper_vfp_sqtoh helper_vfp_sqtoh_powerpc
#define helper_vfp_sqtos helper_vfp_sqtos_powerpc
#define helper_vfp_subd helper_vfp_subd_powerpc
#define helper_vfp_subh helper_vfp_subh_powerpc
#define helper_vfp_subs helper_vfp_subs_powerpc
#define helper_vfp_toshd helper_vfp_toshd_powerpc
#define helper_vfp_toshd_round_to_zero helper_vfp_toshd_round_to_zero_powerpc

View file

@ -1888,6 +1888,7 @@
#define helper_vfp_absd helper_vfp_absd_riscv32
#define helper_vfp_abss helper_vfp_abss_riscv32
#define helper_vfp_addd helper_vfp_addd_riscv32
#define helper_vfp_addh helper_vfp_addh_riscv32
#define helper_vfp_adds helper_vfp_adds_riscv32
#define helper_vfp_cmpd helper_vfp_cmpd_riscv32
#define helper_vfp_cmph_a64 helper_vfp_cmph_a64_riscv32
@ -1896,6 +1897,7 @@
#define helper_vfp_cmpes helper_vfp_cmpes_riscv32
#define helper_vfp_cmps helper_vfp_cmps_riscv32
#define helper_vfp_divd helper_vfp_divd_riscv32
#define helper_vfp_divh helper_vfp_divh_riscv32
#define helper_vfp_divs helper_vfp_divs_riscv32
#define helper_vfp_fcvt_f16_to_f32 helper_vfp_fcvt_f16_to_f32_riscv32
#define helper_vfp_fcvt_f16_to_f64 helper_vfp_fcvt_f16_to_f64_riscv32
@ -1905,16 +1907,21 @@
#define helper_vfp_fcvtsd helper_vfp_fcvtsd_riscv32
#define helper_vfp_get_fpscr helper_vfp_get_fpscr_riscv32
#define helper_vfp_maxd helper_vfp_maxd_riscv32
#define helper_vfp_maxh helper_vfp_maxh_riscv32
#define helper_vfp_maxnumd helper_vfp_maxnumd_riscv32
#define helper_vfp_maxnumh helper_vfp_maxnumh_riscv32
#define helper_vfp_maxnums helper_vfp_maxnums_riscv32
#define helper_vfp_maxs helper_vfp_maxs_riscv32
#define helper_vfp_mind helper_vfp_mind_riscv32
#define helper_vfp_minh helper_vfp_minh_riscv32
#define helper_vfp_minnumd helper_vfp_minnumd_riscv32
#define helper_vfp_minnumh helper_vfp_minnumh_riscv32
#define helper_vfp_minnums helper_vfp_minnums_riscv32
#define helper_vfp_mins helper_vfp_mins_riscv32
#define helper_vfp_muladdd helper_vfp_muladdd_riscv32
#define helper_vfp_muladds helper_vfp_muladds_riscv32
#define helper_vfp_muld helper_vfp_muld_riscv32
#define helper_vfp_mulh helper_vfp_mulh_riscv32
#define helper_vfp_muls helper_vfp_muls_riscv32
#define helper_vfp_negd helper_vfp_negd_riscv32
#define helper_vfp_negs helper_vfp_negs_riscv32
@ -1933,6 +1940,7 @@
#define helper_vfp_sqtoh helper_vfp_sqtoh_riscv32
#define helper_vfp_sqtos helper_vfp_sqtos_riscv32
#define helper_vfp_subd helper_vfp_subd_riscv32
#define helper_vfp_subh helper_vfp_subh_riscv32
#define helper_vfp_subs helper_vfp_subs_riscv32
#define helper_vfp_toshd helper_vfp_toshd_riscv32
#define helper_vfp_toshd_round_to_zero helper_vfp_toshd_round_to_zero_riscv32

View file

@ -1888,6 +1888,7 @@
#define helper_vfp_absd helper_vfp_absd_riscv64
#define helper_vfp_abss helper_vfp_abss_riscv64
#define helper_vfp_addd helper_vfp_addd_riscv64
#define helper_vfp_addh helper_vfp_addh_riscv64
#define helper_vfp_adds helper_vfp_adds_riscv64
#define helper_vfp_cmpd helper_vfp_cmpd_riscv64
#define helper_vfp_cmph_a64 helper_vfp_cmph_a64_riscv64
@ -1896,6 +1897,7 @@
#define helper_vfp_cmpes helper_vfp_cmpes_riscv64
#define helper_vfp_cmps helper_vfp_cmps_riscv64
#define helper_vfp_divd helper_vfp_divd_riscv64
#define helper_vfp_divh helper_vfp_divh_riscv64
#define helper_vfp_divs helper_vfp_divs_riscv64
#define helper_vfp_fcvt_f16_to_f32 helper_vfp_fcvt_f16_to_f32_riscv64
#define helper_vfp_fcvt_f16_to_f64 helper_vfp_fcvt_f16_to_f64_riscv64
@ -1905,16 +1907,21 @@
#define helper_vfp_fcvtsd helper_vfp_fcvtsd_riscv64
#define helper_vfp_get_fpscr helper_vfp_get_fpscr_riscv64
#define helper_vfp_maxd helper_vfp_maxd_riscv64
#define helper_vfp_maxh helper_vfp_maxh_riscv64
#define helper_vfp_maxnumd helper_vfp_maxnumd_riscv64
#define helper_vfp_maxnumh helper_vfp_maxnumh_riscv64
#define helper_vfp_maxnums helper_vfp_maxnums_riscv64
#define helper_vfp_maxs helper_vfp_maxs_riscv64
#define helper_vfp_mind helper_vfp_mind_riscv64
#define helper_vfp_minh helper_vfp_minh_riscv64
#define helper_vfp_minnumd helper_vfp_minnumd_riscv64
#define helper_vfp_minnumh helper_vfp_minnumh_riscv64
#define helper_vfp_minnums helper_vfp_minnums_riscv64
#define helper_vfp_mins helper_vfp_mins_riscv64
#define helper_vfp_muladdd helper_vfp_muladdd_riscv64
#define helper_vfp_muladds helper_vfp_muladds_riscv64
#define helper_vfp_muld helper_vfp_muld_riscv64
#define helper_vfp_mulh helper_vfp_mulh_riscv64
#define helper_vfp_muls helper_vfp_muls_riscv64
#define helper_vfp_negd helper_vfp_negd_riscv64
#define helper_vfp_negs helper_vfp_negs_riscv64
@ -1933,6 +1940,7 @@
#define helper_vfp_sqtoh helper_vfp_sqtoh_riscv64
#define helper_vfp_sqtos helper_vfp_sqtos_riscv64
#define helper_vfp_subd helper_vfp_subd_riscv64
#define helper_vfp_subh helper_vfp_subh_riscv64
#define helper_vfp_subs helper_vfp_subs_riscv64
#define helper_vfp_toshd helper_vfp_toshd_riscv64
#define helper_vfp_toshd_round_to_zero helper_vfp_toshd_round_to_zero_riscv64

View file

@ -1888,6 +1888,7 @@
#define helper_vfp_absd helper_vfp_absd_sparc
#define helper_vfp_abss helper_vfp_abss_sparc
#define helper_vfp_addd helper_vfp_addd_sparc
#define helper_vfp_addh helper_vfp_addh_sparc
#define helper_vfp_adds helper_vfp_adds_sparc
#define helper_vfp_cmpd helper_vfp_cmpd_sparc
#define helper_vfp_cmph_a64 helper_vfp_cmph_a64_sparc
@ -1896,6 +1897,7 @@
#define helper_vfp_cmpes helper_vfp_cmpes_sparc
#define helper_vfp_cmps helper_vfp_cmps_sparc
#define helper_vfp_divd helper_vfp_divd_sparc
#define helper_vfp_divh helper_vfp_divh_sparc
#define helper_vfp_divs helper_vfp_divs_sparc
#define helper_vfp_fcvt_f16_to_f32 helper_vfp_fcvt_f16_to_f32_sparc
#define helper_vfp_fcvt_f16_to_f64 helper_vfp_fcvt_f16_to_f64_sparc
@ -1905,16 +1907,21 @@
#define helper_vfp_fcvtsd helper_vfp_fcvtsd_sparc
#define helper_vfp_get_fpscr helper_vfp_get_fpscr_sparc
#define helper_vfp_maxd helper_vfp_maxd_sparc
#define helper_vfp_maxh helper_vfp_maxh_sparc
#define helper_vfp_maxnumd helper_vfp_maxnumd_sparc
#define helper_vfp_maxnumh helper_vfp_maxnumh_sparc
#define helper_vfp_maxnums helper_vfp_maxnums_sparc
#define helper_vfp_maxs helper_vfp_maxs_sparc
#define helper_vfp_mind helper_vfp_mind_sparc
#define helper_vfp_minh helper_vfp_minh_sparc
#define helper_vfp_minnumd helper_vfp_minnumd_sparc
#define helper_vfp_minnumh helper_vfp_minnumh_sparc
#define helper_vfp_minnums helper_vfp_minnums_sparc
#define helper_vfp_mins helper_vfp_mins_sparc
#define helper_vfp_muladdd helper_vfp_muladdd_sparc
#define helper_vfp_muladds helper_vfp_muladds_sparc
#define helper_vfp_muld helper_vfp_muld_sparc
#define helper_vfp_mulh helper_vfp_mulh_sparc
#define helper_vfp_muls helper_vfp_muls_sparc
#define helper_vfp_negd helper_vfp_negd_sparc
#define helper_vfp_negs helper_vfp_negs_sparc
@ -1933,6 +1940,7 @@
#define helper_vfp_sqtoh helper_vfp_sqtoh_sparc
#define helper_vfp_sqtos helper_vfp_sqtos_sparc
#define helper_vfp_subd helper_vfp_subd_sparc
#define helper_vfp_subh helper_vfp_subh_sparc
#define helper_vfp_subs helper_vfp_subs_sparc
#define helper_vfp_toshd helper_vfp_toshd_sparc
#define helper_vfp_toshd_round_to_zero helper_vfp_toshd_round_to_zero_sparc

View file

@ -1888,6 +1888,7 @@
#define helper_vfp_absd helper_vfp_absd_sparc64
#define helper_vfp_abss helper_vfp_abss_sparc64
#define helper_vfp_addd helper_vfp_addd_sparc64
#define helper_vfp_addh helper_vfp_addh_sparc64
#define helper_vfp_adds helper_vfp_adds_sparc64
#define helper_vfp_cmpd helper_vfp_cmpd_sparc64
#define helper_vfp_cmph_a64 helper_vfp_cmph_a64_sparc64
@ -1896,6 +1897,7 @@
#define helper_vfp_cmpes helper_vfp_cmpes_sparc64
#define helper_vfp_cmps helper_vfp_cmps_sparc64
#define helper_vfp_divd helper_vfp_divd_sparc64
#define helper_vfp_divh helper_vfp_divh_sparc64
#define helper_vfp_divs helper_vfp_divs_sparc64
#define helper_vfp_fcvt_f16_to_f32 helper_vfp_fcvt_f16_to_f32_sparc64
#define helper_vfp_fcvt_f16_to_f64 helper_vfp_fcvt_f16_to_f64_sparc64
@ -1905,16 +1907,21 @@
#define helper_vfp_fcvtsd helper_vfp_fcvtsd_sparc64
#define helper_vfp_get_fpscr helper_vfp_get_fpscr_sparc64
#define helper_vfp_maxd helper_vfp_maxd_sparc64
#define helper_vfp_maxh helper_vfp_maxh_sparc64
#define helper_vfp_maxnumd helper_vfp_maxnumd_sparc64
#define helper_vfp_maxnumh helper_vfp_maxnumh_sparc64
#define helper_vfp_maxnums helper_vfp_maxnums_sparc64
#define helper_vfp_maxs helper_vfp_maxs_sparc64
#define helper_vfp_mind helper_vfp_mind_sparc64
#define helper_vfp_minh helper_vfp_minh_sparc64
#define helper_vfp_minnumd helper_vfp_minnumd_sparc64
#define helper_vfp_minnumh helper_vfp_minnumh_sparc64
#define helper_vfp_minnums helper_vfp_minnums_sparc64
#define helper_vfp_mins helper_vfp_mins_sparc64
#define helper_vfp_muladdd helper_vfp_muladdd_sparc64
#define helper_vfp_muladds helper_vfp_muladds_sparc64
#define helper_vfp_muld helper_vfp_muld_sparc64
#define helper_vfp_mulh helper_vfp_mulh_sparc64
#define helper_vfp_muls helper_vfp_muls_sparc64
#define helper_vfp_negd helper_vfp_negd_sparc64
#define helper_vfp_negs helper_vfp_negs_sparc64
@ -1933,6 +1940,7 @@
#define helper_vfp_sqtoh helper_vfp_sqtoh_sparc64
#define helper_vfp_sqtos helper_vfp_sqtos_sparc64
#define helper_vfp_subd helper_vfp_subd_sparc64
#define helper_vfp_subh helper_vfp_subh_sparc64
#define helper_vfp_subs helper_vfp_subs_sparc64
#define helper_vfp_toshd helper_vfp_toshd_sparc64
#define helper_vfp_toshd_round_to_zero helper_vfp_toshd_round_to_zero_sparc64

View file

@ -99,20 +99,28 @@ DEF_HELPER_FLAGS_5(probe_access_armfn, TCG_CALL_NO_WG, void, env, tl, i32, i32,
DEF_HELPER_1(vfp_get_fpscr, i32, env)
DEF_HELPER_2(vfp_set_fpscr, void, env, i32)
DEF_HELPER_3(vfp_addh, f16, f16, f16, ptr)
DEF_HELPER_3(vfp_adds, f32, f32, f32, ptr)
DEF_HELPER_3(vfp_addd, f64, f64, f64, ptr)
DEF_HELPER_3(vfp_subh, f16, f16, f16, ptr)
DEF_HELPER_3(vfp_subs, f32, f32, f32, ptr)
DEF_HELPER_3(vfp_subd, f64, f64, f64, ptr)
DEF_HELPER_3(vfp_mulh, f16, f16, f16, ptr)
DEF_HELPER_3(vfp_muls, f32, f32, f32, ptr)
DEF_HELPER_3(vfp_muld, f64, f64, f64, ptr)
DEF_HELPER_3(vfp_divh, f16, f16, f16, ptr)
DEF_HELPER_3(vfp_divs, f32, f32, f32, ptr)
DEF_HELPER_3(vfp_divd, f64, f64, f64, ptr)
DEF_HELPER_3(vfp_maxh, f16, f16, f16, ptr)
DEF_HELPER_3(vfp_maxs, f32, f32, f32, ptr)
DEF_HELPER_3(vfp_maxd, f64, f64, f64, ptr)
DEF_HELPER_3(vfp_minh, f16, f16, f16, ptr)
DEF_HELPER_3(vfp_mins, f32, f32, f32, ptr)
DEF_HELPER_3(vfp_mind, f64, f64, f64, ptr)
DEF_HELPER_3(vfp_maxnumh, f16, f16, f16, ptr)
DEF_HELPER_3(vfp_maxnums, f32, f32, f32, ptr)
DEF_HELPER_3(vfp_maxnumd, f64, f64, f64, ptr)
DEF_HELPER_3(vfp_minnumh, f16, f16, f16, ptr)
DEF_HELPER_3(vfp_minnums, f32, f32, f32, ptr)
DEF_HELPER_3(vfp_minnumd, f64, f64, f64, ptr)
DEF_HELPER_1(vfp_negs, f32, f32)

View file

@ -1284,6 +1284,55 @@ static bool do_vfp_3op_sp(DisasContext *s, VFPGen3OpSPFn *fn,
return true;
}
static bool do_vfp_3op_hp(DisasContext *s, VFPGen3OpSPFn *fn,
int vd, int vn, int vm, bool reads_vd)
{
/*
* Do a half-precision operation. Functionally this is
* the same as do_vfp_3op_sp(), except:
* - it uses the FPST_FPCR_F16
* - it doesn't need the VFP vector handling (fp16 is a
* v8 feature, and in v8 VFP vectors don't exist)
* - it does the aa32_fp16_arith feature test
*/
TCGv_i32 f0, f1, fd;
TCGv_ptr fpst;
TCGContext *tcg_ctx = s->uc->tcg_ctx;
if (!dc_isar_feature(aa32_fp16_arith, s)) {
return false;
}
if (s->vec_len != 0 || s->vec_stride != 0) {
return false;
}
if (!vfp_access_check(s)) {
return true;
}
f0 = tcg_temp_new_i32(tcg_ctx);
f1 = tcg_temp_new_i32(tcg_ctx);
fd = tcg_temp_new_i32(tcg_ctx);
fpst = fpstatus_ptr(tcg_ctx, FPST_FPCR_F16);
neon_load_reg32(s, f0, vn);
neon_load_reg32(s, f1, vm);
if (reads_vd) {
neon_load_reg32(s, fd, vd);
}
fn(tcg_ctx, fd, f0, f1, fpst);
neon_store_reg32(s, fd, vd);
tcg_temp_free_i32(tcg_ctx, f0);
tcg_temp_free_i32(tcg_ctx, f1);
tcg_temp_free_i32(tcg_ctx, fd);
tcg_temp_free_ptr(tcg_ctx, fpst);
return true;
}
static bool do_vfp_3op_dp(DisasContext *s, VFPGen3OpDPFn *fn,
int vd, int vn, int vm, bool reads_vd)
{
@ -1664,6 +1713,11 @@ static bool trans_VNMLA_dp(DisasContext *s, arg_VNMLA_dp *a)
return do_vfp_3op_dp(s, gen_VNMLA_dp, a->vd, a->vn, a->vm, true);
}
static bool trans_VMUL_hp(DisasContext *s, arg_VMUL_sp *a)
{
return do_vfp_3op_hp(s, gen_helper_vfp_mulh, a->vd, a->vn, a->vm, false);
}
static bool trans_VMUL_sp(DisasContext *s, arg_VMUL_sp *a)
{
return do_vfp_3op_sp(s, gen_helper_vfp_muls, a->vd, a->vn, a->vm, false);
@ -1698,6 +1752,11 @@ static bool trans_VNMUL_dp(DisasContext *s, arg_VNMUL_dp *a)
return do_vfp_3op_dp(s, gen_VNMUL_dp, a->vd, a->vn, a->vm, false);
}
static bool trans_VADD_hp(DisasContext *s, arg_VADD_sp *a)
{
return do_vfp_3op_hp(s, gen_helper_vfp_addh, a->vd, a->vn, a->vm, false);
}
static bool trans_VADD_sp(DisasContext *s, arg_VADD_sp *a)
{
return do_vfp_3op_sp(s, gen_helper_vfp_adds, a->vd, a->vn, a->vm, false);
@ -1708,6 +1767,11 @@ static bool trans_VADD_dp(DisasContext *s, arg_VADD_dp *a)
return do_vfp_3op_dp(s, gen_helper_vfp_addd, a->vd, a->vn, a->vm, false);
}
static bool trans_VSUB_hp(DisasContext *s, arg_VSUB_sp *a)
{
return do_vfp_3op_hp(s, gen_helper_vfp_subh, a->vd, a->vn, a->vm, false);
}
static bool trans_VSUB_sp(DisasContext *s, arg_VSUB_sp *a)
{
return do_vfp_3op_sp(s, gen_helper_vfp_subs, a->vd, a->vn, a->vm, false);
@ -1718,6 +1782,11 @@ static bool trans_VSUB_dp(DisasContext *s, arg_VSUB_dp *a)
return do_vfp_3op_dp(s, gen_helper_vfp_subd, a->vd, a->vn, a->vm, false);
}
static bool trans_VDIV_hp(DisasContext *s, arg_VDIV_sp *a)
{
return do_vfp_3op_hp(s, gen_helper_vfp_divh, a->vd, a->vn, a->vm, false);
}
static bool trans_VDIV_sp(DisasContext *s, arg_VDIV_sp *a)
{
return do_vfp_3op_sp(s, gen_helper_vfp_divs, a->vd, a->vn, a->vm, false);
@ -1728,6 +1797,24 @@ static bool trans_VDIV_dp(DisasContext *s, arg_VDIV_dp *a)
return do_vfp_3op_dp(s, gen_helper_vfp_divd, a->vd, a->vn, a->vm, false);
}
static bool trans_VMINNM_hp(DisasContext *s, arg_VMINNM_sp *a)
{
if (!dc_isar_feature(aa32_vminmaxnm, s)) {
return false;
}
return do_vfp_3op_hp(s, gen_helper_vfp_minnumh,
a->vd, a->vn, a->vm, false);
}
static bool trans_VMAXNM_hp(DisasContext *s, arg_VMAXNM_sp *a)
{
if (!dc_isar_feature(aa32_vminmaxnm, s)) {
return false;
}
return do_vfp_3op_hp(s, gen_helper_vfp_maxnumh,
a->vd, a->vn, a->vm, false);
}
static bool trans_VMINNM_sp(DisasContext *s, arg_VMINNM_sp *a)
{
if (!dc_isar_feature(aa32_vminmaxnm, s)) {

View file

@ -49,6 +49,9 @@ VSEL 1111 1110 0. cc:2 .... .... 1010 .0.0 .... \
VSEL 1111 1110 0. cc:2 .... .... 1011 .0.0 .... \
vm=%vm_dp vn=%vn_dp vd=%vd_dp dp=1
VMAXNM_hp 1111 1110 1.00 .... .... 1001 .0.0 .... @vfp_dnm_s
VMINNM_hp 1111 1110 1.00 .... .... 1001 .1.0 .... @vfp_dnm_s
VMAXNM_sp 1111 1110 1.00 .... .... 1010 .0.0 .... @vfp_dnm_s
VMINNM_sp 1111 1110 1.00 .... .... 1010 .1.0 .... @vfp_dnm_s

View file

@ -115,18 +115,22 @@ VNMLS_dp ---- 1110 0.01 .... .... 1011 .0.0 .... @vfp_dnm_d
VNMLA_sp ---- 1110 0.01 .... .... 1010 .1.0 .... @vfp_dnm_s
VNMLA_dp ---- 1110 0.01 .... .... 1011 .1.0 .... @vfp_dnm_d
VMUL_hp ---- 1110 0.10 .... .... 1001 .0.0 .... @vfp_dnm_s
VMUL_sp ---- 1110 0.10 .... .... 1010 .0.0 .... @vfp_dnm_s
VMUL_dp ---- 1110 0.10 .... .... 1011 .0.0 .... @vfp_dnm_d
VNMUL_sp ---- 1110 0.10 .... .... 1010 .1.0 .... @vfp_dnm_s
VNMUL_dp ---- 1110 0.10 .... .... 1011 .1.0 .... @vfp_dnm_d
VADD_hp ---- 1110 0.11 .... .... 1001 .0.0 .... @vfp_dnm_s
VADD_sp ---- 1110 0.11 .... .... 1010 .0.0 .... @vfp_dnm_s
VADD_dp ---- 1110 0.11 .... .... 1011 .0.0 .... @vfp_dnm_d
VSUB_hp ---- 1110 0.11 .... .... 1001 .1.0 .... @vfp_dnm_s
VSUB_sp ---- 1110 0.11 .... .... 1010 .1.0 .... @vfp_dnm_s
VSUB_dp ---- 1110 0.11 .... .... 1011 .1.0 .... @vfp_dnm_d
VDIV_hp ---- 1110 1.00 .... .... 1001 .0.0 .... @vfp_dnm_s
VDIV_sp ---- 1110 1.00 .... .... 1010 .0.0 .... @vfp_dnm_s
VDIV_dp ---- 1110 1.00 .... .... 1011 .0.0 .... @vfp_dnm_d

View file

@ -239,6 +239,11 @@ void vfp_set_fpscr(CPUARMState *env, uint32_t val)
#define VFP_HELPER(name, p) HELPER(glue(glue(vfp_,name),p))
#define VFP_BINOP(name) \
dh_ctype_f16 VFP_HELPER(name, h)(dh_ctype_f16 a, dh_ctype_f16 b, void *fpstp) \
{ \
float_status *fpst = fpstp; \
return float16_ ## name(a, b, fpst); \
} \
float32 VFP_HELPER(name, s)(float32 a, float32 b, void *fpstp) \
{ \
float_status *fpst = fpstp; \

View file

@ -1888,6 +1888,7 @@
#define helper_vfp_absd helper_vfp_absd_x86_64
#define helper_vfp_abss helper_vfp_abss_x86_64
#define helper_vfp_addd helper_vfp_addd_x86_64
#define helper_vfp_addh helper_vfp_addh_x86_64
#define helper_vfp_adds helper_vfp_adds_x86_64
#define helper_vfp_cmpd helper_vfp_cmpd_x86_64
#define helper_vfp_cmph_a64 helper_vfp_cmph_a64_x86_64
@ -1896,6 +1897,7 @@
#define helper_vfp_cmpes helper_vfp_cmpes_x86_64
#define helper_vfp_cmps helper_vfp_cmps_x86_64
#define helper_vfp_divd helper_vfp_divd_x86_64
#define helper_vfp_divh helper_vfp_divh_x86_64
#define helper_vfp_divs helper_vfp_divs_x86_64
#define helper_vfp_fcvt_f16_to_f32 helper_vfp_fcvt_f16_to_f32_x86_64
#define helper_vfp_fcvt_f16_to_f64 helper_vfp_fcvt_f16_to_f64_x86_64
@ -1905,16 +1907,21 @@
#define helper_vfp_fcvtsd helper_vfp_fcvtsd_x86_64
#define helper_vfp_get_fpscr helper_vfp_get_fpscr_x86_64
#define helper_vfp_maxd helper_vfp_maxd_x86_64
#define helper_vfp_maxh helper_vfp_maxh_x86_64
#define helper_vfp_maxnumd helper_vfp_maxnumd_x86_64
#define helper_vfp_maxnumh helper_vfp_maxnumh_x86_64
#define helper_vfp_maxnums helper_vfp_maxnums_x86_64
#define helper_vfp_maxs helper_vfp_maxs_x86_64
#define helper_vfp_mind helper_vfp_mind_x86_64
#define helper_vfp_minh helper_vfp_minh_x86_64
#define helper_vfp_minnumd helper_vfp_minnumd_x86_64
#define helper_vfp_minnumh helper_vfp_minnumh_x86_64
#define helper_vfp_minnums helper_vfp_minnums_x86_64
#define helper_vfp_mins helper_vfp_mins_x86_64
#define helper_vfp_muladdd helper_vfp_muladdd_x86_64
#define helper_vfp_muladds helper_vfp_muladds_x86_64
#define helper_vfp_muld helper_vfp_muld_x86_64
#define helper_vfp_mulh helper_vfp_mulh_x86_64
#define helper_vfp_muls helper_vfp_muls_x86_64
#define helper_vfp_negd helper_vfp_negd_x86_64
#define helper_vfp_negs helper_vfp_negs_x86_64
@ -1933,6 +1940,7 @@
#define helper_vfp_sqtoh helper_vfp_sqtoh_x86_64
#define helper_vfp_sqtos helper_vfp_sqtos_x86_64
#define helper_vfp_subd helper_vfp_subd_x86_64
#define helper_vfp_subh helper_vfp_subh_x86_64
#define helper_vfp_subs helper_vfp_subs_x86_64
#define helper_vfp_toshd helper_vfp_toshd_x86_64
#define helper_vfp_toshd_round_to_zero helper_vfp_toshd_round_to_zero_x86_64