From: Richard Henderson <[email protected]> This is the various FRINT rounding modes.
Signed-off-by: Richard Henderson <[email protected]> Reviewed-by: Peter Maydell <[email protected]> Message-id: [email protected] Signed-off-by: Peter Maydell <[email protected]> --- target/arm/tcg/sve.decode | 8 ++++++++ target/arm/tcg/translate-sve.c | 17 +++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/target/arm/tcg/sve.decode b/target/arm/tcg/sve.decode index f1cf7a628d..099cd4e93d 100644 --- a/target/arm/tcg/sve.decode +++ b/target/arm/tcg/sve.decode @@ -1240,6 +1240,14 @@ FRINTA_m 01100101 .. 000 100 101 ... ..... ..... @rd_pg_rn FRINTX_m 01100101 .. 000 110 101 ... ..... ..... @rd_pg_rn FRINTI_m 01100101 .. 000 111 101 ... ..... ..... @rd_pg_rn +FRINTN_z 01100100 .. 011 000 100 ... ..... ..... @rd_pg_rn +FRINTP_z 01100100 .. 011 000 101 ... ..... ..... @rd_pg_rn +FRINTM_z 01100100 .. 011 000 110 ... ..... ..... @rd_pg_rn +FRINTZ_z 01100100 .. 011 000 111 ... ..... ..... @rd_pg_rn +FRINTA_z 01100100 .. 011 001 100 ... ..... ..... @rd_pg_rn +FRINTX_z 01100100 .. 011 001 110 ... ..... ..... @rd_pg_rn +FRINTI_z 01100100 .. 011 001 111 ... ..... ..... @rd_pg_rn + # SVE floating-point unary operations FRECPX_m 01100101 .. 001 100 101 ... ..... ..... @rd_pg_rn FSQRT_m 01100101 .. 001 101 101 ... ..... ..... @rd_pg_rn diff --git a/target/arm/tcg/translate-sve.c b/target/arm/tcg/translate-sve.c index ea936669ef..64ee1f7752 100644 --- a/target/arm/tcg/translate-sve.c +++ b/target/arm/tcg/translate-sve.c @@ -4644,6 +4644,9 @@ static gen_helper_gvec_3_ptr * const frint_fns[] = { TRANS_FEAT(FRINTI_m, aa64_sme_or_sve, gen_gvec_fpst_arg_zpz, frint_fns[a->esz], a, 0, a->esz == MO_16 ? FPST_A64_F16 : FPST_A64) +TRANS_FEAT(FRINTI_z, aa64_sme2p2_or_sve2p2, gen_gvec_fpst_arg_zpz, + frint_fns[a->esz], a, 1, + a->esz == MO_16 ? FPST_A64_F16 : FPST_A64) static gen_helper_gvec_3_ptr * const frintx_fns[] = { NULL, @@ -4654,6 +4657,9 @@ static gen_helper_gvec_3_ptr * const frintx_fns[] = { TRANS_FEAT(FRINTX_m, aa64_sme_or_sve, gen_gvec_fpst_arg_zpz, frintx_fns[a->esz], a, 0, a->esz == MO_16 ? FPST_A64_F16 : FPST_A64); +TRANS_FEAT(FRINTX_z, aa64_sme2p2_or_sve2p2, gen_gvec_fpst_arg_zpz, + frintx_fns[a->esz], a, 1, + a->esz == MO_16 ? FPST_A64_F16 : FPST_A64); static bool do_frint_mode(DisasContext *s, arg_rpr_esz *a, ARMFPRounding mode, int data, @@ -4694,6 +4700,17 @@ TRANS_FEAT(FRINTZ_m, aa64_sme_or_sve, do_frint_mode, a, TRANS_FEAT(FRINTA_m, aa64_sme_or_sve, do_frint_mode, a, FPROUNDING_TIEAWAY, 0, frint_fns[a->esz]) +TRANS_FEAT(FRINTN_z, aa64_sme2p2_or_sve2p2, do_frint_mode, a, + FPROUNDING_TIEEVEN, 1, frint_fns[a->esz]) +TRANS_FEAT(FRINTP_z, aa64_sme2p2_or_sve2p2, do_frint_mode, a, + FPROUNDING_POSINF, 1, frint_fns[a->esz]) +TRANS_FEAT(FRINTM_z, aa64_sme2p2_or_sve2p2, do_frint_mode, a, + FPROUNDING_NEGINF, 1, frint_fns[a->esz]) +TRANS_FEAT(FRINTZ_z, aa64_sme2p2_or_sve2p2, do_frint_mode, a, + FPROUNDING_ZERO, 1, frint_fns[a->esz]) +TRANS_FEAT(FRINTA_z, aa64_sme2p2_or_sve2p2, do_frint_mode, a, + FPROUNDING_TIEAWAY, 1, frint_fns[a->esz]) + static gen_helper_gvec_3_ptr * const frecpx_fns[] = { NULL, gen_helper_sve_frecpx_h, gen_helper_sve_frecpx_s, gen_helper_sve_frecpx_d, -- 2.43.0
