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

Reply via email to