On Fri, 5 Jun 2026 at 00:51, Richard Henderson
<[email protected]> wrote:
>
> Signed-off-by: Richard Henderson <[email protected]>
> ---
> target/arm/tcg/helper-sve-defs.h | 5 +++++
> target/arm/tcg/sve_helper.c | 28 ++++++++++++++++++++++++++++
> target/arm/tcg/translate-sve.c | 7 +++++++
> target/arm/tcg/sve.decode | 2 ++
> 4 files changed, 42 insertions(+)
>
> diff --git a/target/arm/tcg/helper-sve-defs.h
> b/target/arm/tcg/helper-sve-defs.h
> index de2254bb19..75c0fc919d 100644
> --- a/target/arm/tcg/helper-sve-defs.h
> +++ b/target/arm/tcg/helper-sve-defs.h
> @@ -3203,3 +3203,8 @@ DEF_HELPER_FLAGS_6(sve2_famin_s, TCG_CALL_NO_RWG,
> void, ptr, ptr, ptr, ptr, fpst, i32)
> DEF_HELPER_FLAGS_6(sve2_famin_d, TCG_CALL_NO_RWG,
> void, ptr, ptr, ptr, ptr, fpst, i32)
> +
> +DEF_HELPER_FLAGS_4(sve2p2_expand_b, TCG_CALL_NO_WG, void, ptr, ptr, ptr, i32)
> +DEF_HELPER_FLAGS_4(sve2p2_expand_h, TCG_CALL_NO_WG, void, ptr, ptr, ptr, i32)
> +DEF_HELPER_FLAGS_4(sve2p2_expand_s, TCG_CALL_NO_WG, void, ptr, ptr, ptr, i32)
> +DEF_HELPER_FLAGS_4(sve2p2_expand_d, TCG_CALL_NO_WG, void, ptr, ptr, ptr, i32)
> diff --git a/target/arm/tcg/sve_helper.c b/target/arm/tcg/sve_helper.c
> index c2b3162084..a13ccf4b85 100644
> --- a/target/arm/tcg/sve_helper.c
> +++ b/target/arm/tcg/sve_helper.c
> @@ -8669,3 +8669,31 @@ void HELPER(pext)(void *vd, uint32_t png, uint32_t
> desc)
> do_whilel(vd, mask, MIN(b_count, vl), vl);
> }
> }
> +
> +#define DO_EXPAND(NAME, TYPE, H) \
> +void HELPER(NAME)(void *vd, void *vn, void *vg, uint32_t desc) \
> +{ \
> + intptr_t oprsz = simd_oprsz(desc); \
> + ARMVectorReg tn = *(ARMVectorReg *)vn; \
> + intptr_t i = 0, j = 0; \
> + do { \
> + uint16_t pg = *(uint16_t *)(vg + H1_2(i >> 3)); \
> + do { \
> + TYPE nn = 0; \
> + if (pg & 1) { \
> + nn = *(TYPE *)((void *)&tn + H(j)); \
> + j += sizeof(TYPE); \
> + } \
> + *(TYPE *)(vd + H(i)) = nn; \
> + i += sizeof(TYPE); \
> + pg >>= sizeof(TYPE); \
> + } while (i & 15); \
> + } while (i < oprsz); \
It looks like in the other macros where we iterate like this
(eg DO_ZPZZ, DO_ZPZ) we write the outer loop as
for (i = 0; i < opr_sz; ) {
...
}
rather than as a do while(). Is there a reason I'm missing why
we need the do-while here ?
Reviewed-by: Peter Maydell <[email protected]>
thanks
-- PMM