target-ppc: add vector bit permute doubleword instruction
Add vbpermd instruction from ISA 3.0. Signed-off-by: Rajalakshmi Srinivasaraghavan <raji@linux.vnet.ibm.com> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
parent
a5ad8fbf9d
commit
01fe9a470c
@ -333,6 +333,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)
|
||||
|
@ -1128,12 +1128,32 @@ void helper_vperm(CPUPPCState *env, ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b,
|
||||
|
||||
#if defined(HOST_WORDS_BIGENDIAN)
|
||||
#define VBPERMQ_INDEX(avr, i) ((avr)->u8[(i)])
|
||||
#define VBPERMD_INDEX(i) (i)
|
||||
#define VBPERMQ_DW(index) (((index) & 0x40) != 0)
|
||||
#define EXTRACT_BIT(avr, i, index) (extract64((avr)->u64[i], index, 1))
|
||||
#else
|
||||
#define VBPERMQ_INDEX(avr, i) ((avr)->u8[15-(i)])
|
||||
#define VBPERMD_INDEX(i) (1 - i)
|
||||
#define VBPERMQ_DW(index) (((index) & 0x40) == 0)
|
||||
#define EXTRACT_BIT(avr, i, index) \
|
||||
(extract64((avr)->u64[1 - i], 63 - index, 1))
|
||||
#endif
|
||||
|
||||
void helper_vbpermd(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)
|
||||
{
|
||||
int i, j;
|
||||
ppc_avr_t result = { .u64 = { 0, 0 } };
|
||||
VECTOR_FOR_INORDER_I(i, u64) {
|
||||
for (j = 0; j < 8; j++) {
|
||||
int index = VBPERMQ_INDEX(b, (i * 8) + j);
|
||||
if (index < 64 && EXTRACT_BIT(a, i, index)) {
|
||||
result.u64[VBPERMD_INDEX(i)] |= (0x80 >> j);
|
||||
}
|
||||
}
|
||||
}
|
||||
*r = result;
|
||||
}
|
||||
|
||||
void helper_vbpermq(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)
|
||||
{
|
||||
int i;
|
||||
|
@ -792,6 +792,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)
|
||||
|
@ -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),
|
||||
|
Loading…
Reference in New Issue
Block a user