target/arm: Move scale by esz into helper_sve_while*
Change the API to pass element count rather than bit count. This will be helpful later for predicate as counter. Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20250704142112.1018902-76-richard.henderson@linaro.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
3fd8ce4294
commit
f96fd13c6e
2 changed files with 7 additions and 8 deletions
|
|
@ -4133,6 +4133,7 @@ uint32_t HELPER(sve_whilel)(void *vd, uint32_t count, uint32_t pred_desc)
|
|||
uint64_t esz_mask = pred_esz_masks[esz];
|
||||
ARMPredicateReg *d = vd;
|
||||
|
||||
count <<= esz;
|
||||
memset(d, 0, sizeof(*d));
|
||||
do_whilel(d, esz_mask, count, oprbits);
|
||||
return pred_count_test(oprbits, count, false);
|
||||
|
|
@ -4165,6 +4166,7 @@ uint32_t HELPER(sve_whileg)(void *vd, uint32_t count, uint32_t pred_desc)
|
|||
uint64_t esz_mask = pred_esz_masks[esz];
|
||||
ARMPredicateReg *d = vd;
|
||||
|
||||
count <<= esz;
|
||||
memset(d, 0, sizeof(*d));
|
||||
do_whileg(d, esz_mask, count, oprbits);
|
||||
return pred_count_test(oprbits, count, true);
|
||||
|
|
|
|||
|
|
@ -3198,9 +3198,6 @@ static bool trans_WHILE(DisasContext *s, arg_WHILE *a)
|
|||
t2 = tcg_temp_new_i32();
|
||||
tcg_gen_extrl_i64_i32(t2, t0);
|
||||
|
||||
/* Scale elements to bits. */
|
||||
tcg_gen_shli_i32(t2, t2, a->esz);
|
||||
|
||||
desc = FIELD_DP32(desc, PREDDESC, OPRSZ, vsz / 8);
|
||||
desc = FIELD_DP32(desc, PREDDESC, ESZ, a->esz);
|
||||
|
||||
|
|
@ -3234,7 +3231,7 @@ static bool trans_WHILE_ptr(DisasContext *s, arg_WHILE_ptr *a)
|
|||
op0 = read_cpu_reg(s, a->rn, 1);
|
||||
op1 = read_cpu_reg(s, a->rm, 1);
|
||||
|
||||
tmax = tcg_constant_i64(vsz);
|
||||
tmax = tcg_constant_i64(vsz >> a->esz);
|
||||
diff = tcg_temp_new_i64();
|
||||
|
||||
if (a->rw) {
|
||||
|
|
@ -3244,15 +3241,15 @@ static bool trans_WHILE_ptr(DisasContext *s, arg_WHILE_ptr *a)
|
|||
tcg_gen_sub_i64(diff, op0, op1);
|
||||
tcg_gen_sub_i64(t1, op1, op0);
|
||||
tcg_gen_movcond_i64(TCG_COND_GEU, diff, op0, op1, diff, t1);
|
||||
/* Round down to a multiple of ESIZE. */
|
||||
tcg_gen_andi_i64(diff, diff, -1 << a->esz);
|
||||
/* Divide, rounding down, by ESIZE. */
|
||||
tcg_gen_shri_i64(diff, diff, a->esz);
|
||||
/* If op1 == op0, diff == 0, and the condition is always true. */
|
||||
tcg_gen_movcond_i64(TCG_COND_EQ, diff, op0, op1, tmax, diff);
|
||||
} else {
|
||||
/* WHILEWR */
|
||||
tcg_gen_sub_i64(diff, op1, op0);
|
||||
/* Round down to a multiple of ESIZE. */
|
||||
tcg_gen_andi_i64(diff, diff, -1 << a->esz);
|
||||
/* Divide, rounding down, by ESIZE. */
|
||||
tcg_gen_shri_i64(diff, diff, a->esz);
|
||||
/* If op0 >= op1, diff <= 0, the condition is always true. */
|
||||
tcg_gen_movcond_i64(TCG_COND_GEU, diff, op0, op1, tmax, diff);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue