Store the true blocksize, not the encoding.
Signed-off-by: Richard Henderson <[email protected]>
---
target/arm/tcg/translate.h | 4 ++--
target/arm/tcg/translate-a64.c | 5 ++---
2 files changed, 4 insertions(+), 5 deletions(-)
diff --git a/target/arm/tcg/translate.h b/target/arm/tcg/translate.h
index a3d03159ad..bab91eea22 100644
--- a/target/arm/tcg/translate.h
+++ b/target/arm/tcg/translate.h
@@ -197,14 +197,14 @@ typedef struct DisasContext {
* < 0, set by the current instruction.
*/
int8_t btype;
- /* A copy of DCZID_EL0.BS. */
- uint8_t dcz_blocksize;
/* A copy of cpu->gm_blocksize. */
uint8_t gm_blocksize;
/* True if the current insn_start has been updated. */
bool insn_start_updated;
/* FPMR access exception EL or 0 if enabled. */
uint8_t fpmr_el;
+ /* An expansion of DCZID_EL0.BS. */
+ int dcz_blocksize;
/* Offset from VNCR_EL2 when FEAT_NV2 redirects this reg to memory */
uint32_t nv2_redirect_offset;
} DisasContext;
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
index 1780490065..3d838a4cc1 100644
--- a/target/arm/tcg/translate-a64.c
+++ b/target/arm/tcg/translate-a64.c
@@ -4752,7 +4752,6 @@ static bool trans_LD_single_repl(DisasContext *s,
arg_LD_single_repl *a)
static bool trans_STZGM(DisasContext *s, arg_ldst_tag *a)
{
TCGv_i64 addr, clean_addr, tcg_rt;
- int size = 4 << s->dcz_blocksize;
if (!dc_isar_feature(aa64_mte, s)) {
return false;
@@ -4777,7 +4776,7 @@ static bool trans_STZGM(DisasContext *s, arg_ldst_tag *a)
* except the alignment happens before the access.
*/
clean_addr = clean_data_tbi(s, addr);
- tcg_gen_andi_i64(clean_addr, clean_addr, -size);
+ tcg_gen_andi_i64(clean_addr, clean_addr, -s->dcz_blocksize);
gen_helper_dc_zva(tcg_env, clean_addr);
return true;
}
@@ -11055,7 +11054,7 @@ static void
aarch64_tr_init_disas_context(DisasContextBase *dcbase,
dc->vec_stride = 0;
dc->cp_regs = arm_cpu->cp_regs;
dc->features = env->features;
- dc->dcz_blocksize = get_dczid_bs(arm_cpu);
+ dc->dcz_blocksize = 4 << get_dczid_bs(arm_cpu);
dc->gm_blocksize = arm_cpu->gm_blocksize;
#ifdef CONFIG_USER_ONLY
--
2.43.0