On Tue, 21 Jul 2026 at 19:49, Richard Henderson
<[email protected]> wrote:
>
> Signed-off-by: Richard Henderson <[email protected]>
> ---


> +void HELPER(sve_pmull_q)(void *vd, void *vn, void *vm, uint32_t desc)
> +{
> +    intptr_t opr_sz = simd_oprsz(desc);
> +    uint64_t *n = vn, *m = vm;
> +    Int128 *d0 = vd;
> +    Int128 *d1 = vd + sizeof(ARMVectorReg);
> +
> +    for (intptr_t i = 0; i < opr_sz / 16; ++i) {
> +        Int128 rl = clmul_64(n[2 * i + 0], m[2 * i + 0]);
> +        Int128 rh = clmul_64(n[2 * i + 1], m[2 * i + 1]);
> +        d0[i] = rl;
> +        d1[i] = rh;

Doesn't this put the two 64-bit halves of the results in the
wrong order on big-endian hosts? Compare how we handle
writing back the Int128 result in sve2_adcl_d.

> +    }
> +}
> +
> +void HELPER(sve_pmlal_q)(void *vd, void *vn, void *vm, uint32_t desc)
> +{
> +    intptr_t opr_sz = simd_oprsz(desc);
> +    uint64_t *n = vn, *m = vm;
> +    Int128 *d0 = vd;
> +    Int128 *d1 = vd + sizeof(ARMVectorReg);
> +
> +    for (intptr_t i = 0; i < opr_sz / 16; ++i) {
> +        Int128 rl = clmul_64(n[2 * i + 0], m[2 * i + 0]);
> +        Int128 rh = clmul_64(n[2 * i + 1], m[2 * i + 1]);
> +        d0[i] = int128_xor(d0[i], rl);
> +        d1[i] = int128_xor(d1[i], rh);
> +    }
> +}

Similarly here.

(The other places where we use Int128 in helpers -- ZIP, UZP,
TRN, and some moves -- don't need endianness handling as they
are just copying 128 bits of data from one vector to another
without interpreting it.)

thanks
-- PMM

Reply via email to