qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH 20/31] target/arm: Implement SVE2 complex integer add


From: Laurent Desnogues
Subject: Re: [PATCH 20/31] target/arm: Implement SVE2 complex integer add
Date: Mon, 13 Apr 2020 18:20:27 +0200

On Fri, Mar 27, 2020 at 12:20 AM Richard Henderson
<address@hidden> wrote:
[...]
> diff --git a/target/arm/sve_helper.c b/target/arm/sve_helper.c
> index b5afa34efe..a3653007ac 100644
> --- a/target/arm/sve_helper.c
> +++ b/target/arm/sve_helper.c
> @@ -1289,6 +1289,48 @@ DO_BITPERM(sve2_bgrp_d, uint64_t, bitgroup)
>
>  #undef DO_BITPERM
>
> +#define DO_CADD(NAME, TYPE, H, ADD_OP, SUB_OP)                  \
> +void HELPER(NAME)(void *vd, void *vn, void *vm, uint32_t desc)  \
> +{                                                               \
> +    intptr_t i, opr_sz = simd_oprsz(desc);                      \
> +    int sub_r = simd_data(desc);                                \
> +    if (sub_r) {                                                \
> +        for (i = 0; i < opr_sz; i += 2 * sizeof(TYPE)) {        \
> +            TYPE acc_r = *(TYPE *)(vn + H(i));                  \
> +            TYPE acc_i = *(TYPE *)(vn + H(i + sizeof(TYPE)));   \
> +            TYPE el2_r = *(TYPE *)(vm + H(i));                  \
> +            TYPE el2_i = *(TYPE *)(vm + H(i + sizeof(TYPE)));   \
> +            acc_r = SUB_OP(acc_r, el2_i);                       \
> +            acc_i = ADD_OP(acc_i, el2_r);                       \
> +            *(TYPE *)(vd + H(i)) = acc_r;                       \
> +            *(TYPE *)(vd + H(i + sizeof(TYPE))) = acc_i;        \
> +        }                                                       \
> +    } else {                                                    \
> +        for (i = 0; i < opr_sz; i += 2 * sizeof(TYPE)) {        \
> +            TYPE acc_r = *(TYPE *)(vn + H(i));                  \
> +            TYPE acc_i = *(TYPE *)(vn + H(i + sizeof(TYPE)));   \
> +            TYPE el2_r = *(TYPE *)(vm + H(i));                  \
> +            TYPE el2_i = *(TYPE *)(vm + H(i + sizeof(TYPE)));   \
> +            acc_r = ADD_OP(acc_r, el2_i);                       \
> +            acc_i = SUB_OP(acc_i, el2_r);                       \
> +            *(TYPE *)(vd + H(i)) = acc_r;                       \
> +            *(TYPE *)(vd + H(i + sizeof(TYPE))) = acc_i;        \
> +        }                                                       \
> +    }                                                           \
> +}

The then/else branches of if (sub_r) are swapped.

Laurent



reply via email to

[Prev in Thread] Current Thread [Next in Thread]