qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH v3 4/5] target-ppc: add vector bit permute doubl


From: David Gibson
Subject: Re: [Qemu-devel] [PATCH v3 4/5] target-ppc: add vector bit permute doubleword instruction
Date: Tue, 16 Aug 2016 14:33:46 +1000
User-agent: Mutt/1.6.2 (2016-07-01)

On Thu, Aug 11, 2016 at 01:06:47PM +0530, Rajalakshmi Srinivasaraghavan wrote:
> Add vbpermd instruction from ISA 3.0.
> 
> Signed-off-by: Rajalakshmi Srinivasaraghavan <address@hidden>
> ---
>  target-ppc/helper.h             |    1 +
>  target-ppc/int_helper.c         |   22 ++++++++++++++++++++++
>  target-ppc/translate/vmx-impl.c |    1 +
>  target-ppc/translate/vmx-ops.c  |    1 +
>  4 files changed, 25 insertions(+), 0 deletions(-)
> 
> diff --git a/target-ppc/helper.h b/target-ppc/helper.h
> index 6e6e7b3..d1d9418 100644
> --- a/target-ppc/helper.h
> +++ b/target-ppc/helper.h
> @@ -335,6 +335,7 @@ DEF_HELPER_2(vpopcntb, void, avr, avr)
>  DEF_HELPER_2(vpopcnth, void, avr, avr)
>  DEF_HELPER_2(vpopcntw, void, avr, avr)
>  DEF_HELPER_2(vpopcntd, void, avr, avr)
> +DEF_HELPER_3(vbpermd, void, avr, avr, avr)
>  DEF_HELPER_3(vbpermq, void, avr, avr, avr)
>  DEF_HELPER_2(vgbbd, void, avr, avr)
>  DEF_HELPER_3(vpmsumb, void, avr, avr, avr)
> diff --git a/target-ppc/int_helper.c b/target-ppc/int_helper.c
> index 162f1e9..6bed3b6 100644
> --- a/target-ppc/int_helper.c
> +++ b/target-ppc/int_helper.c
> @@ -1134,6 +1134,28 @@ void helper_vperm(CPUPPCState *env, ppc_avr_t *r, 
> ppc_avr_t *a, ppc_avr_t *b,
>  #define VBPERMQ_DW(index) (((index) & 0x40) == 0)
>  #endif
>  
> +void helper_vbpermd(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)
> +{
> +    int i, j;
> +    uint64_t perm = 0;
> +    ppc_avr_t result;
> +
> +    VECTOR_FOR_INORDER_I(i, u64) {
> +        perm = 0;

Since you already have a temporary for the whole result vector, you
shouldn't need a temporary for the individual result dwords.

> +        for (j = 0; j < 8; j++) {
> +            int index = VBPERMQ_INDEX(b, (i * 8) + j);
> +            if (index < 64) {
> +                uint64_t mask = (1ull << (63 - (index & 0x3F)));
> +                if (a->u64[VBPERMQ_DW(index)] & mask) {
> +                    perm |= (0x80 >> j);
> +                }

It would probably be nice to avoid the conditional branch probably
created by this innermost if, which should be possible given you can
extract the actual value of the bit you're inserting.

> +            }
> +        }
> +        result.u64[i] = perm;
> +    }
> +    *r = result;
> +}
> +
>  void helper_vbpermq(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)
>  {
>      int i;
> diff --git a/target-ppc/translate/vmx-impl.c b/target-ppc/translate/vmx-impl.c
> index ebf123f..38f8ad7 100644
> --- a/target-ppc/translate/vmx-impl.c
> +++ b/target-ppc/translate/vmx-impl.c
> @@ -776,6 +776,7 @@ GEN_VXFORM_DUAL(vclzw, PPC_NONE, PPC2_ALTIVEC_207, \
>                  vpopcntw, PPC_NONE, PPC2_ALTIVEC_207)
>  GEN_VXFORM_DUAL(vclzd, PPC_NONE, PPC2_ALTIVEC_207, \
>                  vpopcntd, PPC_NONE, PPC2_ALTIVEC_207)
> +GEN_VXFORM(vbpermd, 6, 23);
>  GEN_VXFORM(vbpermq, 6, 21);
>  GEN_VXFORM_NOA(vgbbd, 6, 20);
>  GEN_VXFORM(vpmsumb, 4, 16)
> diff --git a/target-ppc/translate/vmx-ops.c b/target-ppc/translate/vmx-ops.c
> index 5b2826e..32bd533 100644
> --- a/target-ppc/translate/vmx-ops.c
> +++ b/target-ppc/translate/vmx-ops.c
> @@ -261,6 +261,7 @@ GEN_VXFORM_DUAL(vclzh, vpopcnth, 1, 29, PPC_NONE, 
> PPC2_ALTIVEC_207),
>  GEN_VXFORM_DUAL(vclzw, vpopcntw, 1, 30, PPC_NONE, PPC2_ALTIVEC_207),
>  GEN_VXFORM_DUAL(vclzd, vpopcntd, 1, 31, PPC_NONE, PPC2_ALTIVEC_207),
>  
> +GEN_VXFORM_300(vbpermd, 6, 23),
>  GEN_VXFORM_207(vbpermq, 6, 21),
>  GEN_VXFORM_207(vgbbd, 6, 20),
>  GEN_VXFORM_207(vpmsumb, 4, 16),

-- 
David Gibson                    | I'll have my music baroque, and my code
david AT gibson.dropbear.id.au  | minimalist, thank you.  NOT _the_ _other_
                                | _way_ _around_!
http://www.ozlabs.org/~dgibson

Attachment: signature.asc
Description: PGP signature


reply via email to

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