The field is encoded as [0-3], which is convenient for
indexing our array of function pointers, but the true
value is [1-4]. Adjust before calling do_mem_zpa.
Add an assert, and move the comment re passing ZT to
the helper back next to the relevant code.
Cc: qemu-stable@nongnu.org
Fixes: 206adacfb8d ("target/arm: Add mte helpers for sve scalar + int loads")
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
target/arm/tcg/translate-sve.c | 13 +++++++------
1 file changed, 7 insertions(+), 6 deletions(-)
diff --git a/target/arm/tcg/translate-sve.c b/target/arm/tcg/translate-sve.c
index 296e7d1ce2..f50a426c98 100644
--- a/target/arm/tcg/translate-sve.c
+++ b/target/arm/tcg/translate-sve.c
@@ -4445,11 +4445,7 @@ static void do_mem_zpa(DisasContext *s, int zt, int pg, TCGv_i64 addr,
TCGv_ptr t_pg;
int desc = 0;
- /*
- * For e.g. LD4, there are not enough arguments to pass all 4
- * registers as pointers, so encode the regno into the data field.
- * For consistency, do this even for LD1.
- */
+ assert(mte_n >= 1 && mte_n <= 4);
if (s->mte_active[0]) {
int msz = dtype_msz(dtype);
@@ -4463,6 +4459,11 @@ static void do_mem_zpa(DisasContext *s, int zt, int pg, TCGv_i64 addr,
addr = clean_data_tbi(s, addr);
}
+ /*
+ * For e.g. LD4, there are not enough arguments to pass all 4
+ * registers as pointers, so encode the regno into the data field.
+ * For consistency, do this even for LD1.
+ */
desc = simd_desc(vsz, vsz, zt | desc);
t_pg = tcg_temp_new_ptr();
@@ -4600,7 +4601,7 @@ static void do_ld_zpa(DisasContext *s, int zt, int pg,
* accessible via the instruction encoding.
*/
assert(fn != NULL);
- do_mem_zpa(s, zt, pg, addr, dtype, nreg, false, fn);
+ do_mem_zpa(s, zt, pg, addr, dtype, nreg + 1, false, fn);
}
static bool trans_LD_zprr(DisasContext *s, arg_rprr_load *a)
--
2.34.1
On Tue, 6 Feb 2024 at 03:06, Richard Henderson <richard.henderson@linaro.org> wrote: > > The field is encoded as [0-3], which is convenient for > indexing our array of function pointers, but the true > value is [1-4]. Adjust before calling do_mem_zpa. > > Add an assert, and move the comment re passing ZT to > the helper back next to the relevant code. > > Cc: qemu-stable@nongnu.org > Fixes: 206adacfb8d ("target/arm: Add mte helpers for sve scalar + int loads") > Signed-off-by: Richard Henderson <richard.henderson@linaro.org> > --- > target/arm/tcg/translate-sve.c | 13 +++++++------ > 1 file changed, 7 insertions(+), 6 deletions(-) > > diff --git a/target/arm/tcg/translate-sve.c b/target/arm/tcg/translate-sve.c > index 296e7d1ce2..f50a426c98 100644 > --- a/target/arm/tcg/translate-sve.c > +++ b/target/arm/tcg/translate-sve.c > @@ -4445,11 +4445,7 @@ static void do_mem_zpa(DisasContext *s, int zt, int pg, TCGv_i64 addr, > TCGv_ptr t_pg; > int desc = 0; > > - /* > - * For e.g. LD4, there are not enough arguments to pass all 4 > - * registers as pointers, so encode the regno into the data field. > - * For consistency, do this even for LD1. > - */ > + assert(mte_n >= 1 && mte_n <= 4); > if (s->mte_active[0]) { > int msz = dtype_msz(dtype); > > @@ -4463,6 +4459,11 @@ static void do_mem_zpa(DisasContext *s, int zt, int pg, TCGv_i64 addr, > addr = clean_data_tbi(s, addr); > } > > + /* > + * For e.g. LD4, there are not enough arguments to pass all 4 > + * registers as pointers, so encode the regno into the data field. > + * For consistency, do this even for LD1. > + */ > desc = simd_desc(vsz, vsz, zt | desc); > t_pg = tcg_temp_new_ptr(); > > @@ -4600,7 +4601,7 @@ static void do_ld_zpa(DisasContext *s, int zt, int pg, > * accessible via the instruction encoding. > */ > assert(fn != NULL); > - do_mem_zpa(s, zt, pg, addr, dtype, nreg, false, fn); > + do_mem_zpa(s, zt, pg, addr, dtype, nreg + 1, false, fn); > } > > static bool trans_LD_zprr(DisasContext *s, arg_rprr_load *a) What about do_st_zpa() ? It's not obvious what the 'nreg' encoding is in the a->nreg field in arg_rprr_store, but it's definitely confusing that do_st_zpa() calls do_mem_zpa() passing "nreg" whereas do_ld_zpa() now passes it "nreg + 1". Can we make it so the handling in these two functions lines up? thanks -- PMM
On 2/7/24 00:46, Peter Maydell wrote: >> @@ -4600,7 +4601,7 @@ static void do_ld_zpa(DisasContext *s, int zt, int pg, >> * accessible via the instruction encoding. >> */ >> assert(fn != NULL); >> - do_mem_zpa(s, zt, pg, addr, dtype, nreg, false, fn); >> + do_mem_zpa(s, zt, pg, addr, dtype, nreg + 1, false, fn); >> } >> >> static bool trans_LD_zprr(DisasContext *s, arg_rprr_load *a) > > What about do_st_zpa() ? It's not obvious what the 'nreg' > encoding is in the a->nreg field in arg_rprr_store, but > it's definitely confusing that do_st_zpa() calls > do_mem_zpa() passing "nreg" whereas do_ld_zpa() now > passes it "nreg + 1". Can we make it so the handling > in these two functions lines up? Yes, I think there may be a bug in store as well. Comparing the two is complicated by the cut outs for LDFF1, LDNF1, LD1R and PRF. r~
© 2016 - 2024 Red Hat, Inc.