target/ppc: Implement xxpermx instruction
Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Matheus Ferst <matheus.ferst@eldorado.org.br> Message-Id: <20220225210936.1749575-33-matheus.ferst@eldorado.org.br> Signed-off-by: Cédric Le Goater <clg@kaod.org>
This commit is contained in:
parent
d31b2c1940
commit
41c2877f52
@ -495,6 +495,7 @@ DEF_HELPER_3(xvrspim, void, env, vsr, vsr)
|
||||
DEF_HELPER_3(xvrspip, void, env, vsr, vsr)
|
||||
DEF_HELPER_3(xvrspiz, void, env, vsr, vsr)
|
||||
DEF_HELPER_4(xxextractuw, void, env, vsr, vsr, i32)
|
||||
DEF_HELPER_FLAGS_5(XXPERMX, TCG_CALL_NO_RWG, void, vsr, vsr, vsr, vsr, tl)
|
||||
DEF_HELPER_4(xxinsertw, void, env, vsr, vsr, i32)
|
||||
DEF_HELPER_3(xvxsigsp, void, env, vsr, vsr)
|
||||
DEF_HELPER_5(XXBLENDVB, void, vsr, vsr, vsr, vsr, i32)
|
||||
|
@ -54,6 +54,11 @@
|
||||
...... ..... ..... ..... ..... .. .... \
|
||||
&8RR_XX4 xt=%8rr_xx_xt xa=%8rr_xx_xa xb=%8rr_xx_xb xc=%8rr_xx_xc
|
||||
|
||||
&8RR_XX4_uim3 xt xa xb xc uim3
|
||||
@8RR_XX4_uim3 ...... .. .... .. ............... uim3:3 \
|
||||
...... ..... ..... ..... ..... .. .... \
|
||||
&8RR_XX4_uim3 xt=%8rr_xx_xt xa=%8rr_xx_xa xb=%8rr_xx_xb xc=%8rr_xx_xc
|
||||
|
||||
### Fixed-Point Load Instructions
|
||||
|
||||
PLBZ 000001 10 0--.-- .................. \
|
||||
@ -194,3 +199,6 @@ XXBLENDVH 000001 01 0000 -- ------------------ \
|
||||
100001 ..... ..... ..... ..... 01 .... @8RR_XX4
|
||||
XXBLENDVB 000001 01 0000 -- ------------------ \
|
||||
100001 ..... ..... ..... ..... 00 .... @8RR_XX4
|
||||
|
||||
XXPERMX 000001 01 0000 -- --------------- ... \
|
||||
100010 ..... ..... ..... ..... 00 .... @8RR_XX4_uim3
|
||||
|
@ -1015,6 +1015,26 @@ VMUL(UW, u32, VsrW, VsrD, uint64_t)
|
||||
#undef VMUL_DO_ODD
|
||||
#undef VMUL
|
||||
|
||||
void helper_XXPERMX(ppc_vsr_t *t, ppc_vsr_t *s0, ppc_vsr_t *s1, ppc_vsr_t *pcv,
|
||||
target_ulong uim)
|
||||
{
|
||||
int i, idx;
|
||||
ppc_vsr_t tmp = { .u64 = {0, 0} };
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(t->u8); i++) {
|
||||
if ((pcv->VsrB(i) >> 5) == uim) {
|
||||
idx = pcv->VsrB(i) & 0x1f;
|
||||
if (idx < ARRAY_SIZE(t->u8)) {
|
||||
tmp.VsrB(i) = s0->VsrB(idx);
|
||||
} else {
|
||||
tmp.VsrB(i) = s1->VsrB(idx - ARRAY_SIZE(t->u8));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
*t = tmp;
|
||||
}
|
||||
|
||||
void helper_VPERM(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, ppc_avr_t *c)
|
||||
{
|
||||
ppc_avr_t result;
|
||||
|
@ -1234,6 +1234,28 @@ static bool trans_XXPERMDI(DisasContext *ctx, arg_XX3_dm *a)
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_XXPERMX(DisasContext *ctx, arg_8RR_XX4_uim3 *a)
|
||||
{
|
||||
TCGv_ptr xt, xa, xb, xc;
|
||||
|
||||
REQUIRE_INSNS_FLAGS2(ctx, ISA310);
|
||||
REQUIRE_VSX(ctx);
|
||||
|
||||
xt = gen_vsr_ptr(a->xt);
|
||||
xa = gen_vsr_ptr(a->xa);
|
||||
xb = gen_vsr_ptr(a->xb);
|
||||
xc = gen_vsr_ptr(a->xc);
|
||||
|
||||
gen_helper_XXPERMX(xt, xa, xb, xc, tcg_constant_tl(a->uim3));
|
||||
|
||||
tcg_temp_free_ptr(xt);
|
||||
tcg_temp_free_ptr(xa);
|
||||
tcg_temp_free_ptr(xb);
|
||||
tcg_temp_free_ptr(xc);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
#define GEN_VSX_HELPER_VSX_MADD(name, op1, aop, mop, inval, type) \
|
||||
static void gen_##name(DisasContext *ctx) \
|
||||
{ \
|
||||
|
Loading…
Reference in New Issue
Block a user