@samitouri / QOSamiQemu / commits / 6ebbd57c36

target/arm: Implement FRINT{32,64}{X,Z}

Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Message-id: 20260604234852.573178-16-richard.henderson@linaro.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org>

Richard Henderson committed Jun 4, 2026 at 16:48 UTC 6ebbd57c3652776c46679fe4f75776a19ee71a6b
4 files changed +70
target/arm/tcg/helper-sve-defs.h
+9
@@ -1441,6 +1441,15 @@ DEF_HELPER_FLAGS_5(sve_frintx_s, TCG_CALL_NO_RWG,
1441 DEF_HELPER_FLAGS_5(sve_frintx_d, TCG_CALL_NO_RWG,
1442 void, ptr, ptr, ptr, fpst, i32)
1443
1444 +DEF_HELPER_FLAGS_5(sve2p2_frint32_s, TCG_CALL_NO_RWG,
1445 + void, ptr, ptr, ptr, fpst, i32)
1446 +DEF_HELPER_FLAGS_5(sve2p2_frint64_s, TCG_CALL_NO_RWG,
1447 + void, ptr, ptr, ptr, fpst, i32)
1448 +DEF_HELPER_FLAGS_5(sve2p2_frint32_d, TCG_CALL_NO_RWG,
1449 + void, ptr, ptr, ptr, fpst, i32)
1450 +DEF_HELPER_FLAGS_5(sve2p2_frint64_d, TCG_CALL_NO_RWG,
1451 + void, ptr, ptr, ptr, fpst, i32)
1452 +
1453 DEF_HELPER_FLAGS_5(sve_frecpx_h, TCG_CALL_NO_RWG,
1454 void, ptr, ptr, ptr, fpst, i32)
1455 DEF_HELPER_FLAGS_5(sve_frecpx_s, TCG_CALL_NO_RWG,
target/arm/tcg/sve.decode
+20
@@ -1259,6 +1259,26 @@ FRINTA_z 01100100 .. 011 001 100 ... ..... ..... @rd_pg_rn
1259 FRINTX_z 01100100 .. 011 001 110 ... ..... ..... @rd_pg_rn
1260 FRINTI_z 01100100 .. 011 001 111 ... ..... ..... @rd_pg_rn
1261
1262 +FRINT32X_s_m 01100101 00 010 001 101 ... ..... ..... @rd_pg_rn_e0
1263 +FRINT32X_d_m 01100101 00 010 011 101 ... ..... ..... @rd_pg_rn_e0
1264 +FRINT64X_s_m 01100101 00 010 101 101 ... ..... ..... @rd_pg_rn_e0
1265 +FRINT64X_d_m 01100101 00 010 111 101 ... ..... ..... @rd_pg_rn_e0
1266 +
1267 +FRINT32X_s_z 01100100 00 011 100 101 ... ..... ..... @rd_pg_rn_e0
1268 +FRINT32X_d_z 01100100 00 011 100 111 ... ..... ..... @rd_pg_rn_e0
1269 +FRINT64X_s_z 01100100 00 011 101 101 ... ..... ..... @rd_pg_rn_e0
1270 +FRINT64X_d_z 01100100 00 011 101 111 ... ..... ..... @rd_pg_rn_e0
1271 +
1272 +FRINT32Z_s_m 01100101 00 010 000 101 ... ..... ..... @rd_pg_rn_e0
1273 +FRINT32Z_d_m 01100101 00 010 010 101 ... ..... ..... @rd_pg_rn_e0
1274 +FRINT64Z_s_m 01100101 00 010 100 101 ... ..... ..... @rd_pg_rn_e0
1275 +FRINT64Z_d_m 01100101 00 010 110 101 ... ..... ..... @rd_pg_rn_e0
1276 +
1277 +FRINT32Z_s_z 01100100 00 011 100 100 ... ..... ..... @rd_pg_rn_e0
1278 +FRINT32Z_d_z 01100100 00 011 100 110 ... ..... ..... @rd_pg_rn_e0
1279 +FRINT64Z_s_z 01100100 00 011 101 100 ... ..... ..... @rd_pg_rn_e0
1280 +FRINT64Z_d_z 01100100 00 011 101 110 ... ..... ..... @rd_pg_rn_e0
1281 +
1282 # SVE floating-point unary operations
1283 FRECPX_m 01100101 .. 001 100 101 ... ..... ..... @rd_pg_rn
1284 FSQRT_m 01100101 .. 001 101 101 ... ..... ..... @rd_pg_rn
target/arm/tcg/sve_helper.c
+5
@@ -5017,6 +5017,11 @@ DO_ZPZ_FP(sve_frintx_h, uint16_t, H1_2, float16_round_to_int)
5017 DO_ZPZ_FP(sve_frintx_s, uint32_t, H1_4, float32_round_to_int)
5018 DO_ZPZ_FP(sve_frintx_d, uint64_t, H1_8, float64_round_to_int)
5019
5020 +DO_ZPZ_FP(sve2p2_frint32_s, uint32_t, H1_4, helper_frint32_s)
5021 +DO_ZPZ_FP(sve2p2_frint64_s, uint32_t, H1_4, helper_frint64_s)
5022 +DO_ZPZ_FP(sve2p2_frint32_d, uint64_t, H1_8, helper_frint32_d)
5023 +DO_ZPZ_FP(sve2p2_frint64_d, uint64_t, H1_8, helper_frint64_d)
5024 +
5025 DO_ZPZ_FP(sve_frecpx_h, uint16_t, H1_2, helper_frecpx_f16)
5026 DO_ZPZ_FP(sve_frecpx_s, uint32_t, H1_4, helper_frecpx_f32)
5027 DO_ZPZ_FP(sve_frecpx_d, uint64_t, H1_8, helper_frecpx_f64)
target/arm/tcg/translate-sve.c
+36
@@ -4730,6 +4730,42 @@ TRANS_FEAT(FRINTZ_z, aa64_sme2p2_or_sve2p2, do_frint_mode, a,
4730 TRANS_FEAT(FRINTA_z, aa64_sme2p2_or_sve2p2, do_frint_mode, a,
4731 FPROUNDING_TIEAWAY, 1, frint_fns[a->esz])
4732
4733 +TRANS_FEAT(FRINT32X_s_m, aa64_sme2p2_or_sve2p2, gen_gvec_fpst_arg_zpz,
4734 + gen_helper_sve2p2_frint32_s, a, 0, FPST_A64)
4735 +TRANS_FEAT(FRINT32X_d_m, aa64_sme2p2_or_sve2p2, gen_gvec_fpst_arg_zpz,
4736 + gen_helper_sve2p2_frint32_d, a, 0, FPST_A64)
4737 +TRANS_FEAT(FRINT64X_s_m, aa64_sme2p2_or_sve2p2, gen_gvec_fpst_arg_zpz,
4738 + gen_helper_sve2p2_frint64_s, a, 0, FPST_A64)
4739 +TRANS_FEAT(FRINT64X_d_m, aa64_sme2p2_or_sve2p2, gen_gvec_fpst_arg_zpz,
4740 + gen_helper_sve2p2_frint64_d, a, 0, FPST_A64)
4741 +
4742 +TRANS_FEAT(FRINT32X_s_z, aa64_sme2p2_or_sve2p2, gen_gvec_fpst_arg_zpz,
4743 + gen_helper_sve2p2_frint32_s, a, 1, FPST_A64)
4744 +TRANS_FEAT(FRINT32X_d_z, aa64_sme2p2_or_sve2p2, gen_gvec_fpst_arg_zpz,
4745 + gen_helper_sve2p2_frint32_d, a, 1, FPST_A64)
4746 +TRANS_FEAT(FRINT64X_s_z, aa64_sme2p2_or_sve2p2, gen_gvec_fpst_arg_zpz,
4747 + gen_helper_sve2p2_frint64_s, a, 1, FPST_A64)
4748 +TRANS_FEAT(FRINT64X_d_z, aa64_sme2p2_or_sve2p2, gen_gvec_fpst_arg_zpz,
4749 + gen_helper_sve2p2_frint64_d, a, 1, FPST_A64)
4750 +
4751 +TRANS_FEAT(FRINT32Z_s_m, aa64_sme2p2_or_sve2p2, do_frint_mode,
4752 + a, FPROUNDING_ZERO, 0, gen_helper_sve2p2_frint32_s)
4753 +TRANS_FEAT(FRINT32Z_d_m, aa64_sme2p2_or_sve2p2, do_frint_mode,
4754 + a, FPROUNDING_ZERO, 0, gen_helper_sve2p2_frint32_d)
4755 +TRANS_FEAT(FRINT64Z_s_m, aa64_sme2p2_or_sve2p2, do_frint_mode,
4756 + a, FPROUNDING_ZERO, 0, gen_helper_sve2p2_frint64_s)
4757 +TRANS_FEAT(FRINT64Z_d_m, aa64_sme2p2_or_sve2p2, do_frint_mode,
4758 + a, FPROUNDING_ZERO, 0, gen_helper_sve2p2_frint64_d)
4759 +
4760 +TRANS_FEAT(FRINT32Z_s_z, aa64_sme2p2_or_sve2p2, do_frint_mode,
4761 + a, FPROUNDING_ZERO, 1, gen_helper_sve2p2_frint32_s)
4762 +TRANS_FEAT(FRINT32Z_d_z, aa64_sme2p2_or_sve2p2, do_frint_mode,
4763 + a, FPROUNDING_ZERO, 1, gen_helper_sve2p2_frint32_d)
4764 +TRANS_FEAT(FRINT64Z_s_z, aa64_sme2p2_or_sve2p2, do_frint_mode,
4765 + a, FPROUNDING_ZERO, 1, gen_helper_sve2p2_frint64_s)
4766 +TRANS_FEAT(FRINT64Z_d_z, aa64_sme2p2_or_sve2p2, do_frint_mode,
4767 + a, FPROUNDING_ZERO, 1, gen_helper_sve2p2_frint64_d)
4768 +
4769 static gen_helper_gvec_3_ptr * const frecpx_fns[] = {
4770 NULL, gen_helper_sve_frecpx_h,
4771 gen_helper_sve_frecpx_s, gen_helper_sve_frecpx_d,