[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-ppc] [PATCH v3 4/5] target-ppc: add vector bit permute doublew
From: |
David Gibson |
Subject: |
Re: [Qemu-ppc] [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
signature.asc
Description: PGP signature