On 5/28/24 08:37, Peter Maydell wrote:
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) ?

No, but I could add an assert to the top-level expander below.
(In this case gen_gvec_usqadd_qc.)


r~

Reply via email to