@samitouri / QOSamiQemu / commits / 56aef9cf6f

target/arm: Implement Floating-point round to integral value (predicated, zeroing)

This is the various FRINT rounding modes. Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Message-id: 20260604234852.573178-12-richard.henderson@linaro.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org>

Richard Henderson committed Jun 4, 2026 at 16:48 UTC 56aef9cf6f22e08b4b203bfdc61ec542445421b1
2 files changed +25
target/arm/tcg/sve.decode
+8
@@ -1240,6 +1240,14 @@ FRINTA_m 01100101 .. 000 100 101 ... ..... ..... @rd_pg_rn
1240 FRINTX_m 01100101 .. 000 110 101 ... ..... ..... @rd_pg_rn
1241 FRINTI_m 01100101 .. 000 111 101 ... ..... ..... @rd_pg_rn
1242
1243 +FRINTN_z 01100100 .. 011 000 100 ... ..... ..... @rd_pg_rn
1244 +FRINTP_z 01100100 .. 011 000 101 ... ..... ..... @rd_pg_rn
1245 +FRINTM_z 01100100 .. 011 000 110 ... ..... ..... @rd_pg_rn
1246 +FRINTZ_z 01100100 .. 011 000 111 ... ..... ..... @rd_pg_rn
1247 +FRINTA_z 01100100 .. 011 001 100 ... ..... ..... @rd_pg_rn
1248 +FRINTX_z 01100100 .. 011 001 110 ... ..... ..... @rd_pg_rn
1249 +FRINTI_z 01100100 .. 011 001 111 ... ..... ..... @rd_pg_rn
1250 +
1251 # SVE floating-point unary operations
1252 FRECPX_m 01100101 .. 001 100 101 ... ..... ..... @rd_pg_rn
1253 FSQRT_m 01100101 .. 001 101 101 ... ..... ..... @rd_pg_rn
target/arm/tcg/translate-sve.c
+17
@@ -4644,6 +4644,9 @@ static gen_helper_gvec_3_ptr * const frint_fns[] = {
4644 TRANS_FEAT(FRINTI_m, aa64_sme_or_sve, gen_gvec_fpst_arg_zpz,
4645 frint_fns[a->esz], a, 0,
4646 a->esz == MO_16 ? FPST_A64_F16 : FPST_A64)
4647 +TRANS_FEAT(FRINTI_z, aa64_sme2p2_or_sve2p2, gen_gvec_fpst_arg_zpz,
4648 + frint_fns[a->esz], a, 1,
4649 + a->esz == MO_16 ? FPST_A64_F16 : FPST_A64)
4650
4651 static gen_helper_gvec_3_ptr * const frintx_fns[] = {
4652 NULL,
@@ -4654,6 +4657,9 @@ static gen_helper_gvec_3_ptr * const frintx_fns[] = {
4657 TRANS_FEAT(FRINTX_m, aa64_sme_or_sve, gen_gvec_fpst_arg_zpz,
4658 frintx_fns[a->esz], a, 0,
4659 a->esz == MO_16 ? FPST_A64_F16 : FPST_A64);
4660 +TRANS_FEAT(FRINTX_z, aa64_sme2p2_or_sve2p2, gen_gvec_fpst_arg_zpz,
4661 + frintx_fns[a->esz], a, 1,
4662 + a->esz == MO_16 ? FPST_A64_F16 : FPST_A64);
4663
4664 static bool do_frint_mode(DisasContext *s, arg_rpr_esz *a,
4665 ARMFPRounding mode, int data,
@@ -4694,6 +4700,17 @@ TRANS_FEAT(FRINTZ_m, aa64_sme_or_sve, do_frint_mode, a,
4700 TRANS_FEAT(FRINTA_m, aa64_sme_or_sve, do_frint_mode, a,
4701 FPROUNDING_TIEAWAY, 0, frint_fns[a->esz])
4702
4703 +TRANS_FEAT(FRINTN_z, aa64_sme2p2_or_sve2p2, do_frint_mode, a,
4704 + FPROUNDING_TIEEVEN, 1, frint_fns[a->esz])
4705 +TRANS_FEAT(FRINTP_z, aa64_sme2p2_or_sve2p2, do_frint_mode, a,
4706 + FPROUNDING_POSINF, 1, frint_fns[a->esz])
4707 +TRANS_FEAT(FRINTM_z, aa64_sme2p2_or_sve2p2, do_frint_mode, a,
4708 + FPROUNDING_NEGINF, 1, frint_fns[a->esz])
4709 +TRANS_FEAT(FRINTZ_z, aa64_sme2p2_or_sve2p2, do_frint_mode, a,
4710 + FPROUNDING_ZERO, 1, frint_fns[a->esz])
4711 +TRANS_FEAT(FRINTA_z, aa64_sme2p2_or_sve2p2, do_frint_mode, a,
4712 + FPROUNDING_TIEAWAY, 1, frint_fns[a->esz])
4713 +
4714 static gen_helper_gvec_3_ptr * const frecpx_fns[] = {
4715 NULL, gen_helper_sve_frecpx_h,
4716 gen_helper_sve_frecpx_s, gen_helper_sve_frecpx_d,