On Sun, 22 Jun 2025 at 00:55, Richard Henderson
<richard.henderson@linaro.org> wrote:
>
> Indicate whether to use FPST_FPCR or FPST_ZA via bit 2 of
> simd_data(desc). For SVE, this bit remains zero.
> For do_FMLAL_zzzw, this requires no change.
> For do_FMLAL_zzxw, move the index up one bit.
>
> Read fz16 directly from env->fpcr.
This line of the commit message doesn't seem related to the change?
We were already reading fz16 from env->fpcr.
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
> target/arm/tcg/translate-sve.c | 2 +-
> target/arm/tcg/vec_helper.c | 8 +++++---
> 2 files changed, 6 insertions(+), 4 deletions(-)
>
> diff --git a/target/arm/tcg/translate-sve.c b/target/arm/tcg/translate-sve.c
> index 87b6e4a88e..7f8ca78a91 100644
> --- a/target/arm/tcg/translate-sve.c
> +++ b/target/arm/tcg/translate-sve.c
> @@ -7168,7 +7168,7 @@ static bool do_FMLAL_zzxw(DisasContext *s, arg_rrxr_esz *a, bool sub, bool sel)
> {
> return gen_gvec_ptr_zzzz(s, gen_helper_sve2_fmlal_zzxw_s,
> a->rd, a->rn, a->rm, a->ra,
> - (a->index << 2) | (sel << 1) | sub, tcg_env);
> + (a->index << 3) | (sel << 1) | sub, tcg_env);
> }
>
> TRANS_FEAT(FMLALB_zzxw, aa64_sve2, do_FMLAL_zzxw, a, false, false)
> diff --git a/target/arm/tcg/vec_helper.c b/target/arm/tcg/vec_helper.c
> index 671777ce52..16ddd35239 100644
> --- a/target/arm/tcg/vec_helper.c
> +++ b/target/arm/tcg/vec_helper.c
> @@ -2191,7 +2191,8 @@ void HELPER(sve2_fmlal_zzzw_s)(void *vd, void *vn, void *vm, void *va,
> intptr_t i, oprsz = simd_oprsz(desc);
> bool is_s = extract32(desc, SIMD_DATA_SHIFT, 1);
> intptr_t sel = extract32(desc, SIMD_DATA_SHIFT + 1, 1) * sizeof(float16);
> - float_status *status = &env->vfp.fp_status[FPST_A64];
> + bool za = extract32(desc, SIMD_DATA_SHIFT + 2, 1);
> + float_status *status = &env->vfp.fp_status[za ? FPST_ZA : FPST_A64];
> bool fz16 = env->vfp.fpcr & FPCR_FZ16;
> int negx = 0, negf = 0;
>
> @@ -2274,8 +2275,9 @@ void HELPER(sve2_fmlal_zzxw_s)(void *vd, void *vn, void *vm, void *va,
> intptr_t i, j, oprsz = simd_oprsz(desc);
> bool is_s = extract32(desc, SIMD_DATA_SHIFT, 1);
> intptr_t sel = extract32(desc, SIMD_DATA_SHIFT + 1, 1) * sizeof(float16);
> - intptr_t idx = extract32(desc, SIMD_DATA_SHIFT + 2, 3) * sizeof(float16);
> - float_status *status = &env->vfp.fp_status[FPST_A64];
> + bool za = extract32(desc, SIMD_DATA_SHIFT + 2, 1);
> + intptr_t idx = extract32(desc, SIMD_DATA_SHIFT + 3, 3) * sizeof(float16);
> + float_status *status = &env->vfp.fp_status[za ? FPST_ZA : FPST_A64];
> bool fz16 = env->vfp.fpcr & FPCR_FZ16;
> int negx = 0, negf = 0;
>
Otherwise
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
thanks
-- PMM