On Sat, 25 May 2024 at 00:32, Richard Henderson
<richard.hender...@linaro.org> wrote:
>
> Signed-off-by: Richard Henderson <richard.hender...@linaro.org>
> ---
>  target/arm/helper.h            |  16 +++++
>  target/arm/tcg/translate-a64.h |   6 ++
>  target/arm/tcg/gengvec64.c     | 106 +++++++++++++++++++++++++++++++
>  target/arm/tcg/translate-a64.c | 113 ++++++++++++++-------------------
>  target/arm/tcg/vec_helper.c    |  64 +++++++++++++++++++
>  5 files changed, 241 insertions(+), 64 deletions(-)

> diff --git a/target/arm/tcg/gengvec64.c b/target/arm/tcg/gengvec64.c
> index 093b498b13..4b76e476a0 100644
> --- a/target/arm/tcg/gengvec64.c
> +++ b/target/arm/tcg/gengvec64.c
> @@ -188,3 +188,109 @@ void gen_gvec_bcax(unsigned vece, uint32_t d, uint32_t 
> n, uint32_t m,
>      tcg_gen_gvec_4(d, n, m, a, oprsz, maxsz, &op);
>  }
>
> +static void gen_suqadd_vec(unsigned vece, TCGv_vec t, TCGv_vec qc,
> +                           TCGv_vec a, TCGv_vec b)
> +{
> +    TCGv_vec max =
> +        tcg_constant_vec_matching(t, vece, (1ull << ((8 << vece) - 1)) - 1);
> +    TCGv_vec u = tcg_temp_new_vec_matching(t);
> +
> +    /* Maximum value that can be added to @a without overflow. */
> +    tcg_gen_sub_vec(vece, u, max, a);
> +
> +    /* Constrain addend so that the next addition never overflows. */
> +    tcg_gen_umin_vec(vece, u, u, b);
> +    tcg_gen_add_vec(vece, t, u, a);
> +
> +    /* Compute QC by comparing the adjusted @b. */
> +    tcg_gen_xor_vec(vece, u, u, b);
> +    tcg_gen_or_vec(vece, qc, qc, u);

With this kind of code where we wind up doing a vector op
into vfp.qc, is there anything somewhere that asserts that
we don't try to do it with a vector length bigger than
sizeof(vfp.qc) (i.e. 128) ?

thanks
-- PMM

Reply via email to