target-ppc: Altivec 2.07: vbpermq Instruction
This patch adds the Vector Bit Permute Quadword (vbpermq) instruction introduced in Power ISA Version 2.07. Signed-off-by: Tom Musta <tommusta@gmail.com> Signed-off-by: Alexander Graf <agraf@suse.de>
This commit is contained in:
parent
b41da4ebb2
commit
4d82038e41
@ -303,6 +303,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(vbpermq, void, avr, avr, avr)
|
||||
|
||||
DEF_HELPER_2(xsadddp, void, env, i32)
|
||||
DEF_HELPER_2(xssubdp, void, env, i32)
|
||||
|
@ -1038,6 +1038,37 @@ void helper_vperm(CPUPPCState *env, ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b,
|
||||
*r = result;
|
||||
}
|
||||
|
||||
#if defined(HOST_WORDS_BIGENDIAN)
|
||||
#define VBPERMQ_INDEX(avr, i) ((avr)->u8[(i)])
|
||||
#define VBPERMQ_DW(index) (((index) & 0x40) != 0)
|
||||
#else
|
||||
#define VBPERMQ_INDEX(avr, i) ((avr)->u8[15-(i)])
|
||||
#define VBPERMQ_DW(index) (((index) & 0x40) == 0)
|
||||
#endif
|
||||
|
||||
void helper_vbpermq(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)
|
||||
{
|
||||
int i;
|
||||
uint64_t perm = 0;
|
||||
|
||||
VECTOR_FOR_INORDER_I(i, u8) {
|
||||
int index = VBPERMQ_INDEX(b, i);
|
||||
|
||||
if (index < 128) {
|
||||
uint64_t mask = (1ull << (63-(index & 0x3F)));
|
||||
if (a->u64[VBPERMQ_DW(index)] & mask) {
|
||||
perm |= (0x8000 >> i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
r->u64[HI_IDX] = perm;
|
||||
r->u64[LO_IDX] = 0;
|
||||
}
|
||||
|
||||
#undef VBPERMQ_INDEX
|
||||
#undef VBPERMQ_DW
|
||||
|
||||
#if defined(HOST_WORDS_BIGENDIAN)
|
||||
#define PKBIG 1
|
||||
#else
|
||||
|
@ -7360,6 +7360,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(vbpermq, 6, 21);
|
||||
|
||||
/*** VSX extension ***/
|
||||
|
||||
@ -10609,6 +10610,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_207(vbpermq, 6, 21),
|
||||
|
||||
GEN_HANDLER_E(lxsdx, 0x1F, 0x0C, 0x12, 0, PPC_NONE, PPC2_VSX),
|
||||
GEN_HANDLER_E(lxsiwax, 0x1F, 0x0C, 0x02, 0, PPC_NONE, PPC2_VSX207),
|
||||
|
Loading…
Reference in New Issue
Block a user