target/ppc: move xxperm/xxpermr to decodetree
Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Matheus Ferst <matheus.ferst@eldorado.org.br> Message-Id: <20220225210936.1749575-31-matheus.ferst@eldorado.org.br> Signed-off-by: Cédric Le Goater <clg@kaod.org>
This commit is contained in:
parent
43d55fc23d
commit
6a94bf196c
@ -3055,27 +3055,6 @@ uint64_t helper_xsrsp(CPUPPCState *env, uint64_t xb)
|
||||
return xt;
|
||||
}
|
||||
|
||||
#define VSX_XXPERM(op, indexed) \
|
||||
void helper_##op(CPUPPCState *env, ppc_vsr_t *xt, \
|
||||
ppc_vsr_t *xa, ppc_vsr_t *pcv) \
|
||||
{ \
|
||||
ppc_vsr_t t = *xt; \
|
||||
int i, idx; \
|
||||
\
|
||||
for (i = 0; i < 16; i++) { \
|
||||
idx = pcv->VsrB(i) & 0x1F; \
|
||||
if (indexed) { \
|
||||
idx = 31 - idx; \
|
||||
} \
|
||||
t.VsrB(i) = (idx <= 15) ? xa->VsrB(idx) \
|
||||
: xt->VsrB(idx - 16); \
|
||||
} \
|
||||
*xt = t; \
|
||||
}
|
||||
|
||||
VSX_XXPERM(xxperm, 0)
|
||||
VSX_XXPERM(xxpermr, 1)
|
||||
|
||||
void helper_xvxsigsp(CPUPPCState *env, ppc_vsr_t *xt, ppc_vsr_t *xb)
|
||||
{
|
||||
ppc_vsr_t t = { };
|
||||
|
@ -494,8 +494,6 @@ DEF_HELPER_3(xvrspic, void, env, vsr, vsr)
|
||||
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(xxperm, void, env, vsr, vsr, vsr)
|
||||
DEF_HELPER_4(xxpermr, void, env, vsr, vsr, vsr)
|
||||
DEF_HELPER_4(xxextractuw, void, env, vsr, vsr, i32)
|
||||
DEF_HELPER_4(xxinsertw, void, env, vsr, vsr, i32)
|
||||
DEF_HELPER_3(xvxsigsp, void, env, vsr, vsr)
|
||||
|
@ -604,6 +604,11 @@ STXVPX 011111 ..... ..... ..... 0111001101 - @X_TSXP
|
||||
XXSPLTIB 111100 ..... 00 ........ 0101101000 . @X_imm8
|
||||
XXSPLTW 111100 ..... ---.. ..... 010100100 . . @XX2
|
||||
|
||||
## VSX Permute Instructions
|
||||
|
||||
XXPERM 111100 ..... ..... ..... 00011010 ... @XX3
|
||||
XXPERMR 111100 ..... ..... ..... 00111010 ... @XX3
|
||||
|
||||
XXSEL 111100 ..... ..... ..... ..... 11 .... @XX4
|
||||
|
||||
## VSX Vector Load Special Value Instruction
|
||||
|
@ -1200,8 +1200,46 @@ GEN_VSX_HELPER_X2(xvrspip, 0x12, 0x0A, 0, PPC2_VSX)
|
||||
GEN_VSX_HELPER_X2(xvrspiz, 0x12, 0x09, 0, PPC2_VSX)
|
||||
GEN_VSX_HELPER_2(xvtstdcsp, 0x14, 0x1A, 0, PPC2_VSX)
|
||||
GEN_VSX_HELPER_2(xvtstdcdp, 0x14, 0x1E, 0, PPC2_VSX)
|
||||
GEN_VSX_HELPER_X3(xxperm, 0x08, 0x03, 0, PPC2_ISA300)
|
||||
GEN_VSX_HELPER_X3(xxpermr, 0x08, 0x07, 0, PPC2_ISA300)
|
||||
|
||||
static bool trans_XXPERM(DisasContext *ctx, arg_XX3 *a)
|
||||
{
|
||||
TCGv_ptr xt, xa, xb;
|
||||
|
||||
REQUIRE_INSNS_FLAGS2(ctx, ISA300);
|
||||
REQUIRE_VSX(ctx);
|
||||
|
||||
xt = gen_vsr_ptr(a->xt);
|
||||
xa = gen_vsr_ptr(a->xa);
|
||||
xb = gen_vsr_ptr(a->xb);
|
||||
|
||||
gen_helper_VPERM(xt, xa, xt, xb);
|
||||
|
||||
tcg_temp_free_ptr(xt);
|
||||
tcg_temp_free_ptr(xa);
|
||||
tcg_temp_free_ptr(xb);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_XXPERMR(DisasContext *ctx, arg_XX3 *a)
|
||||
{
|
||||
TCGv_ptr xt, xa, xb;
|
||||
|
||||
REQUIRE_INSNS_FLAGS2(ctx, ISA300);
|
||||
REQUIRE_VSX(ctx);
|
||||
|
||||
xt = gen_vsr_ptr(a->xt);
|
||||
xa = gen_vsr_ptr(a->xa);
|
||||
xb = gen_vsr_ptr(a->xb);
|
||||
|
||||
gen_helper_VPERMR(xt, xa, xt, xb);
|
||||
|
||||
tcg_temp_free_ptr(xt);
|
||||
tcg_temp_free_ptr(xa);
|
||||
tcg_temp_free_ptr(xb);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
#define GEN_VSX_HELPER_VSX_MADD(name, op1, aop, mop, inval, type) \
|
||||
static void gen_##name(DisasContext *ctx) \
|
||||
|
@ -341,8 +341,6 @@ VSX_LOGICAL(xxlnand, 0x8, 0x16, PPC2_VSX207),
|
||||
VSX_LOGICAL(xxlorc, 0x8, 0x15, PPC2_VSX207),
|
||||
GEN_XX3FORM(xxmrghw, 0x08, 0x02, PPC2_VSX),
|
||||
GEN_XX3FORM(xxmrglw, 0x08, 0x06, PPC2_VSX),
|
||||
GEN_XX3FORM(xxperm, 0x08, 0x03, PPC2_ISA300),
|
||||
GEN_XX3FORM(xxpermr, 0x08, 0x07, PPC2_ISA300),
|
||||
GEN_XX3FORM_DM(xxsldwi, 0x08, 0x00),
|
||||
GEN_XX2FORM_EXT(xxextractuw, 0x0A, 0x0A, PPC2_ISA300),
|
||||
GEN_XX2FORM_EXT(xxinsertw, 0x0A, 0x0B, PPC2_ISA300),
|
||||
|
Loading…
Reference in New Issue
Block a user