@samitouri / QOSamiQemu / commits / ecc2e23b12

target/arm: Implement FVDOT (FP8 to FP16)

Signed-off-by: Richard Henderson <richard.henderson@linaro.org> [PMM: fix wrong sizeof(type) for fp16 output] Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Message-id: 20260625015159.719300-10-richard.henderson@linaro.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org>

Richard Henderson committed Jun 24, 2026 at 18:51 UTC ecc2e23b125b4546b526a23a475b53a12ea6229f
4 files changed +30
target/arm/tcg/fp8_helper.c
+23
@@ -950,3 +950,26 @@ void HELPER(sme_fvdot_idx_sb)(void *vd, void *vn, void *vm,
950 } while (++i & 3);
951 } while (i < elements);
952 }
953 +
954 +void HELPER(sme_fvdot_idx_hb)(void *vd, void *vn, void *vm,
955 + CPUARMState *env, uint32_t desc)
956 +{
957 + FP8MulContext ctx = fp8_mul_start(env, 0xf);
958 + intptr_t oprsz = simd_maxsz(desc);
959 + intptr_t elements = oprsz / sizeof(float16);
960 + int idx_n = extract32(desc, SIMD_DATA_SHIFT, 1);
961 + int idx_m = extract32(desc, SIMD_DATA_SHIFT + 1, 3);
962 + float16 *d = vd;
963 + uint8_t *n0 = vn;
964 + uint8_t *n1 = vn + sizeof(ARMVectorReg);
965 + uint16_t *m = vm;
966 + intptr_t i = 0;
967 +
968 + do {
969 + uint16_t mm = m[H2(2 * i + idx_m)];
970 + do {
971 + uint16_t nn = n0[H1(4 * i + idx_n)] | (n1[H1(4 * i + idx_n)] << 8);
972 + d[H2(i)] = f8dotadd_h(nn, mm, 2, d[H2(i)], &ctx);
973 + } while (++i & 7);
974 + } while (i < elements);
975 +}
target/arm/tcg/helper-fp8-defs.h
+1
@@ -43,3 +43,4 @@ DEF_HELPER_FLAGS_7(sme_fmopa_sb, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, ptr,
43 DEF_HELPER_FLAGS_7(sme_fmopa_hb, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, ptr, env, i32)
44
45 DEF_HELPER_FLAGS_5(sme_fvdot_idx_sb, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, env, i32)
46 +DEF_HELPER_FLAGS_5(sme_fvdot_idx_hb, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, env, i32)
target/arm/tcg/sme.decode
+2
@@ -821,6 +821,8 @@ FDOT_nx_hb 11000001 0001 .... 1 .. 1.. ...10 0. ... @azx_4x1_i3_o3
821 FVDOTB_sb 11000001 1101 .... 0 .. 01. ....0 0. ... @azx_4x2_i2_o3
822 FVDOTT_sb 11000001 1101 .... 0 .. 01. ....0 1. ... @azx_4x2_i2_o3
823
824 +FVDOT_hb 11000001 1101 .... 0 .. 1.. ....1 0. ... @azx_2x1_i3_o3
825 +
826 ### SME2 Add / Sub array accumulators
827
828 ADD_aaz_s 11000001 101 000000 .. 111 ....0 10 ... @az_2x2_o3
target/arm/tcg/translate-sme.c
+4
@@ -1273,6 +1273,10 @@ static bool do_fvdot_sb(DisasContext *s, arg_azx_n *a, bool top)
1273 TRANS_FEAT(FVDOTB_sb, aa64_sme_f8f32, do_fvdot_sb, a, false)
1274 TRANS_FEAT(FVDOTT_sb, aa64_sme_f8f32, do_fvdot_sb, a, true)
1275
1276 +TRANS_FEAT(FVDOT_hb, aa64_sme_f8f16, do_azz_acc_fp8,
1277 + a->n, 2, a->rv, a->off, a->zn, a->zm,
1278 + (a->idx << 1), 0, false, gen_helper_sme_fvdot_idx_hb)
1279 +
1280 static bool do_fmla(DisasContext *s, arg_azz_n *a, bool multi,
1281 ARMFPStatusFlavour fpst, gen_helper_gvec_3_ptr *fn)
1282 {