target/ppc: Move VSX vector with length storage access insns to decodetree.
Moving the following instructions to decodetree specification : {l, st}xvl(l) : X-form The changes were verified by validating that the tcg-ops generated by those instructions remain the same, which were captured using the '-d in_asm,op' flag. Also added a new function do_ea_calc_ra to calculate the effective address : EA <- (RA == 0) ? 0 : GPR[RA], which is now used by the above-said insns, and shall be used later by (p){lx, stx}vp insns. Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Chinmay Rath <rathc@linux.ibm.com> [np: Fix 32-bit build] Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
This commit is contained in:
parent
cff278c9fa
commit
29df8d950e
@ -277,10 +277,10 @@ DEF_HELPER_3(STVEBX, void, env, avr, tl)
|
||||
DEF_HELPER_3(STVEHX, void, env, avr, tl)
|
||||
DEF_HELPER_3(STVEWX, void, env, avr, tl)
|
||||
#if defined(TARGET_PPC64)
|
||||
DEF_HELPER_4(lxvl, void, env, tl, vsr, tl)
|
||||
DEF_HELPER_4(lxvll, void, env, tl, vsr, tl)
|
||||
DEF_HELPER_4(stxvl, void, env, tl, vsr, tl)
|
||||
DEF_HELPER_4(stxvll, void, env, tl, vsr, tl)
|
||||
DEF_HELPER_4(LXVL, void, env, tl, vsr, tl)
|
||||
DEF_HELPER_4(LXVLL, void, env, tl, vsr, tl)
|
||||
DEF_HELPER_4(STXVL, void, env, tl, vsr, tl)
|
||||
DEF_HELPER_4(STXVLL, void, env, tl, vsr, tl)
|
||||
#endif
|
||||
DEF_HELPER_4(vsumsws, void, env, avr, avr, avr)
|
||||
DEF_HELPER_4(vsum2sws, void, env, avr, avr, avr)
|
||||
|
@ -1006,6 +1006,12 @@ STXSIHX 011111 ..... ..... ..... 1110101101 . @X_TSX
|
||||
STXSIWX 011111 ..... ..... ..... 0010001100 . @X_TSX
|
||||
STXSSPX 011111 ..... ..... ..... 1010001100 . @X_TSX
|
||||
|
||||
LXVL 011111 ..... ..... ..... 0100001101 . @X_TSX
|
||||
LXVLL 011111 ..... ..... ..... 0100101101 . @X_TSX
|
||||
|
||||
STXVL 011111 ..... ..... ..... 0110001101 . @X_TSX
|
||||
STXVLL 011111 ..... ..... ..... 0110101101 . @X_TSX
|
||||
|
||||
## VSX Vector Binary Floating-Point Sign Manipulation Instructions
|
||||
|
||||
XVABSDP 111100 ..... 00000 ..... 111011001 .. @XX2
|
||||
|
@ -475,8 +475,8 @@ void helper_##name(CPUPPCState *env, target_ulong addr, \
|
||||
*xt = t; \
|
||||
}
|
||||
|
||||
VSX_LXVL(lxvl, 0)
|
||||
VSX_LXVL(lxvll, 1)
|
||||
VSX_LXVL(LXVL, 0)
|
||||
VSX_LXVL(LXVLL, 1)
|
||||
#undef VSX_LXVL
|
||||
|
||||
#define VSX_STXVL(name, lj) \
|
||||
@ -504,8 +504,8 @@ void helper_##name(CPUPPCState *env, target_ulong addr, \
|
||||
} \
|
||||
}
|
||||
|
||||
VSX_STXVL(stxvl, 0)
|
||||
VSX_STXVL(stxvll, 1)
|
||||
VSX_STXVL(STXVL, 0)
|
||||
VSX_STXVL(STXVLL, 1)
|
||||
#undef VSX_STXVL
|
||||
#undef GET_NB
|
||||
#endif /* TARGET_PPC64 */
|
||||
|
@ -2543,6 +2543,7 @@ static inline void gen_align_no_le(DisasContext *ctx)
|
||||
(ctx->opcode & 0x03FF0000) | POWERPC_EXCP_ALIGN_LE);
|
||||
}
|
||||
|
||||
/* EA <- {(ra == 0) ? 0 : GPR[ra]} + displ */
|
||||
static TCGv do_ea_calc(DisasContext *ctx, int ra, TCGv displ)
|
||||
{
|
||||
TCGv ea = tcg_temp_new();
|
||||
@ -2557,6 +2558,22 @@ static TCGv do_ea_calc(DisasContext *ctx, int ra, TCGv displ)
|
||||
return ea;
|
||||
}
|
||||
|
||||
#if defined(TARGET_PPC64)
|
||||
/* EA <- (ra == 0) ? 0 : GPR[ra] */
|
||||
static TCGv do_ea_calc_ra(DisasContext *ctx, int ra)
|
||||
{
|
||||
TCGv EA = tcg_temp_new();
|
||||
if (!ra) {
|
||||
tcg_gen_movi_tl(EA, 0);
|
||||
} else if (NARROW_MODE(ctx)) {
|
||||
tcg_gen_ext32u_tl(EA, cpu_gpr[ra]);
|
||||
} else {
|
||||
tcg_gen_mov_tl(EA, cpu_gpr[ra]);
|
||||
}
|
||||
return EA;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*** Integer load ***/
|
||||
#define DEF_MEMOP(op) ((op) | ctx->default_tcg_memop_mask)
|
||||
#define BSWAP_MEMOP(op) ((op) | (ctx->default_tcg_memop_mask ^ MO_BSWAP))
|
||||
|
@ -232,36 +232,72 @@ static void gen_lxvb16x(DisasContext *ctx)
|
||||
set_cpu_vsr(xT(ctx->opcode), xtl, false);
|
||||
}
|
||||
|
||||
#ifdef TARGET_PPC64
|
||||
#define VSX_VECTOR_LOAD_STORE_LENGTH(name) \
|
||||
static void gen_##name(DisasContext *ctx) \
|
||||
{ \
|
||||
TCGv EA; \
|
||||
TCGv_ptr xt; \
|
||||
\
|
||||
if (xT(ctx->opcode) < 32) { \
|
||||
if (unlikely(!ctx->vsx_enabled)) { \
|
||||
gen_exception(ctx, POWERPC_EXCP_VSXU); \
|
||||
return; \
|
||||
} \
|
||||
} else { \
|
||||
if (unlikely(!ctx->altivec_enabled)) { \
|
||||
gen_exception(ctx, POWERPC_EXCP_VPU); \
|
||||
return; \
|
||||
} \
|
||||
} \
|
||||
EA = tcg_temp_new(); \
|
||||
xt = gen_vsr_ptr(xT(ctx->opcode)); \
|
||||
gen_set_access_type(ctx, ACCESS_INT); \
|
||||
gen_addr_register(ctx, EA); \
|
||||
gen_helper_##name(tcg_env, EA, xt, cpu_gpr[rB(ctx->opcode)]); \
|
||||
#if defined(TARGET_PPC64)
|
||||
static bool do_ld_st_vl(DisasContext *ctx, arg_X *a,
|
||||
void (*helper)(TCGv_ptr, TCGv, TCGv_ptr, TCGv))
|
||||
{
|
||||
TCGv EA;
|
||||
TCGv_ptr xt;
|
||||
if (a->rt < 32) {
|
||||
REQUIRE_VSX(ctx);
|
||||
} else {
|
||||
REQUIRE_VECTOR(ctx);
|
||||
}
|
||||
xt = gen_vsr_ptr(a->rt);
|
||||
gen_set_access_type(ctx, ACCESS_INT);
|
||||
EA = do_ea_calc_ra(ctx, a->ra);
|
||||
helper(tcg_env, EA, xt, cpu_gpr[a->rb]);
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
static bool trans_LXVL(DisasContext *ctx, arg_LXVL *a)
|
||||
{
|
||||
REQUIRE_64BIT(ctx);
|
||||
REQUIRE_INSNS_FLAGS2(ctx, ISA300);
|
||||
#if defined(TARGET_PPC64)
|
||||
return do_ld_st_vl(ctx, a, gen_helper_LXVL);
|
||||
#else
|
||||
qemu_build_not_reached();
|
||||
#endif
|
||||
return true;
|
||||
}
|
||||
|
||||
VSX_VECTOR_LOAD_STORE_LENGTH(lxvl)
|
||||
VSX_VECTOR_LOAD_STORE_LENGTH(lxvll)
|
||||
VSX_VECTOR_LOAD_STORE_LENGTH(stxvl)
|
||||
VSX_VECTOR_LOAD_STORE_LENGTH(stxvll)
|
||||
static bool trans_LXVLL(DisasContext *ctx, arg_LXVLL *a)
|
||||
{
|
||||
REQUIRE_64BIT(ctx);
|
||||
REQUIRE_INSNS_FLAGS2(ctx, ISA300);
|
||||
#if defined(TARGET_PPC64)
|
||||
return do_ld_st_vl(ctx, a, gen_helper_LXVLL);
|
||||
#else
|
||||
qemu_build_not_reached();
|
||||
#endif
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_STXVL(DisasContext *ctx, arg_STXVL *a)
|
||||
{
|
||||
REQUIRE_64BIT(ctx);
|
||||
REQUIRE_INSNS_FLAGS2(ctx, ISA300);
|
||||
#if defined(TARGET_PPC64)
|
||||
return do_ld_st_vl(ctx, a, gen_helper_STXVL);
|
||||
#else
|
||||
qemu_build_not_reached();
|
||||
#endif
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_STXVLL(DisasContext *ctx, arg_STXVLL *a)
|
||||
{
|
||||
REQUIRE_64BIT(ctx);
|
||||
REQUIRE_INSNS_FLAGS2(ctx, ISA300);
|
||||
#if defined(TARGET_PPC64)
|
||||
return do_ld_st_vl(ctx, a, gen_helper_STXVLL);
|
||||
#else
|
||||
qemu_build_not_reached();
|
||||
#endif
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool do_stxs(DisasContext *ctx, arg_X *a,
|
||||
void (*op)(DisasContext *, TCGv_i64, TCGv))
|
||||
|
@ -4,19 +4,11 @@ GEN_HANDLER_E(lxvdsx, 0x1F, 0x0C, 0x0A, 0, PPC_NONE, PPC2_VSX),
|
||||
GEN_HANDLER_E(lxvw4x, 0x1F, 0x0C, 0x18, 0, PPC_NONE, PPC2_VSX),
|
||||
GEN_HANDLER_E(lxvh8x, 0x1F, 0x0C, 0x19, 0, PPC_NONE, PPC2_ISA300),
|
||||
GEN_HANDLER_E(lxvb16x, 0x1F, 0x0C, 0x1B, 0, PPC_NONE, PPC2_ISA300),
|
||||
#if defined(TARGET_PPC64)
|
||||
GEN_HANDLER_E(lxvl, 0x1F, 0x0D, 0x08, 0, PPC_NONE, PPC2_ISA300),
|
||||
GEN_HANDLER_E(lxvll, 0x1F, 0x0D, 0x09, 0, PPC_NONE, PPC2_ISA300),
|
||||
#endif
|
||||
|
||||
GEN_HANDLER_E(stxvd2x, 0x1F, 0xC, 0x1E, 0, PPC_NONE, PPC2_VSX),
|
||||
GEN_HANDLER_E(stxvw4x, 0x1F, 0xC, 0x1C, 0, PPC_NONE, PPC2_VSX),
|
||||
GEN_HANDLER_E(stxvh8x, 0x1F, 0x0C, 0x1D, 0, PPC_NONE, PPC2_ISA300),
|
||||
GEN_HANDLER_E(stxvb16x, 0x1F, 0x0C, 0x1F, 0, PPC_NONE, PPC2_ISA300),
|
||||
#if defined(TARGET_PPC64)
|
||||
GEN_HANDLER_E(stxvl, 0x1F, 0x0D, 0x0C, 0, PPC_NONE, PPC2_ISA300),
|
||||
GEN_HANDLER_E(stxvll, 0x1F, 0x0D, 0x0D, 0, PPC_NONE, PPC2_ISA300),
|
||||
#endif
|
||||
|
||||
GEN_HANDLER_E(mfvsrwz, 0x1F, 0x13, 0x03, 0x0000F800, PPC_NONE, PPC2_VSX207),
|
||||
GEN_HANDLER_E(mtvsrwa, 0x1F, 0x13, 0x06, 0x0000F800, PPC_NONE, PPC2_VSX207),
|
||||
|
Loading…
Reference in New Issue
Block a user