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