Signed-off-by: Richard Henderson <richard.hender...@linaro.org> --- target/arm/tcg/sve_helper.c | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-)
diff --git a/target/arm/tcg/sve_helper.c b/target/arm/tcg/sve_helper.c index 789c9ce3a5..0d16c318cf 100644 --- a/target/arm/tcg/sve_helper.c +++ b/target/arm/tcg/sve_helper.c @@ -4128,26 +4128,30 @@ static uint32_t pred_count_test(uint32_t elements, uint32_t count, bool invert) return flags; } -uint32_t HELPER(sve_whilel)(void *vd, uint32_t count, uint32_t pred_desc) +static void do_whilel(uint64_t *d, uint64_t esz_mask, + uint32_t count, uint32_t oprbits) { - intptr_t oprsz = FIELD_EX32(pred_desc, PREDDESC, OPRSZ); - intptr_t esz = FIELD_EX32(pred_desc, PREDDESC, ESZ); - uint64_t esz_mask = pred_esz_masks[esz]; - ARMPredicateReg *d = vd; - intptr_t i, oprbits = oprsz * 8; + uint32_t i; tcg_debug_assert(count <= oprbits); - /* Begin with a zero predicate register. */ - do_zero(d, oprsz); - - /* Set all of the requested bits. */ for (i = 0; i < count / 64; ++i) { - d->p[i] = esz_mask; + d[i] = esz_mask; } if (count & 63) { - d->p[i] = MAKE_64BIT_MASK(0, count & 63) & esz_mask; + d[i] = MAKE_64BIT_MASK(0, count & 63) & esz_mask; } +} + +uint32_t HELPER(sve_whilel)(void *vd, uint32_t count, uint32_t pred_desc) +{ + uint32_t oprsz = FIELD_EX32(pred_desc, PREDDESC, OPRSZ); + uint32_t esz = FIELD_EX32(pred_desc, PREDDESC, ESZ); + uint32_t oprbits = oprsz * 8; + uint64_t esz_mask = pred_esz_masks[esz]; + + do_zero(vd, oprsz); + do_whilel(vd, esz_mask, count, oprbits); return pred_count_test(oprbits, count, false); } -- 2.43.0