mirror of https://github.com/xemu-project/xemu.git
target/ppc: Moving VSX scalar storage access insns to decodetree.
Moving the following instructions to decodetree specification : lxs{d, iwa, ibz, ihz, iwz, sp}x : X-form stxs{d, ib, ih, iw, sp}x : 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. Signed-off-by: Chinmay Rath <rathc@linux.ibm.com> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
This commit is contained in:
parent
c1167a9257
commit
cff278c9fa
|
@ -993,6 +993,19 @@ STXVRHX 011111 ..... ..... ..... 0010101101 . @X_TSX
|
|||
STXVRWX 011111 ..... ..... ..... 0011001101 . @X_TSX
|
||||
STXVRDX 011111 ..... ..... ..... 0011101101 . @X_TSX
|
||||
|
||||
LXSDX 011111 ..... ..... ..... 1001001100 . @X_TSX
|
||||
LXSIWAX 011111 ..... ..... ..... 0001001100 . @X_TSX
|
||||
LXSIBZX 011111 ..... ..... ..... 1100001101 . @X_TSX
|
||||
LXSIHZX 011111 ..... ..... ..... 1100101101 . @X_TSX
|
||||
LXSIWZX 011111 ..... ..... ..... 0000001100 . @X_TSX
|
||||
LXSSPX 011111 ..... ..... ..... 1000001100 . @X_TSX
|
||||
|
||||
STXSDX 011111 ..... ..... ..... 1011001100 . @X_TSX
|
||||
STXSIBX 011111 ..... ..... ..... 1110001101 . @X_TSX
|
||||
STXSIHX 011111 ..... ..... ..... 1110101101 . @X_TSX
|
||||
STXSIWX 011111 ..... ..... ..... 0010001100 . @X_TSX
|
||||
STXSSPX 011111 ..... ..... ..... 1010001100 . @X_TSX
|
||||
|
||||
## VSX Vector Binary Floating-Point Sign Manipulation Instructions
|
||||
|
||||
XVABSDP 111100 ..... 00000 ..... 111011001 .. @XX2
|
||||
|
|
|
@ -24,30 +24,27 @@ static inline TCGv_ptr gen_acc_ptr(int reg)
|
|||
return r;
|
||||
}
|
||||
|
||||
#define VSX_LOAD_SCALAR(name, operation) \
|
||||
static void gen_##name(DisasContext *ctx) \
|
||||
{ \
|
||||
TCGv EA; \
|
||||
TCGv_i64 t0; \
|
||||
if (unlikely(!ctx->vsx_enabled)) { \
|
||||
gen_exception(ctx, POWERPC_EXCP_VSXU); \
|
||||
return; \
|
||||
} \
|
||||
t0 = tcg_temp_new_i64(); \
|
||||
gen_set_access_type(ctx, ACCESS_INT); \
|
||||
EA = tcg_temp_new(); \
|
||||
gen_addr_reg_index(ctx, EA); \
|
||||
gen_qemu_##operation(ctx, t0, EA); \
|
||||
set_cpu_vsr(xT(ctx->opcode), t0, true); \
|
||||
/* NOTE: cpu_vsrl is undefined */ \
|
||||
static bool do_lxs(DisasContext *ctx, arg_X *a,
|
||||
void (*op)(DisasContext *, TCGv_i64, TCGv))
|
||||
{
|
||||
TCGv EA;
|
||||
TCGv_i64 t0;
|
||||
REQUIRE_VSX(ctx);
|
||||
t0 = tcg_temp_new_i64();
|
||||
gen_set_access_type(ctx, ACCESS_INT);
|
||||
EA = do_ea_calc(ctx, a->ra, cpu_gpr[a->rb]);
|
||||
op(ctx, t0, EA);
|
||||
set_cpu_vsr(a->rt, t0, true);
|
||||
/* NOTE: cpu_vsrl is undefined */
|
||||
return true;
|
||||
}
|
||||
|
||||
VSX_LOAD_SCALAR(lxsdx, ld64_i64)
|
||||
VSX_LOAD_SCALAR(lxsiwax, ld32s_i64)
|
||||
VSX_LOAD_SCALAR(lxsibzx, ld8u_i64)
|
||||
VSX_LOAD_SCALAR(lxsihzx, ld16u_i64)
|
||||
VSX_LOAD_SCALAR(lxsiwzx, ld32u_i64)
|
||||
VSX_LOAD_SCALAR(lxsspx, ld32fs)
|
||||
TRANS_FLAGS2(VSX, LXSDX, do_lxs, gen_qemu_ld64_i64);
|
||||
TRANS_FLAGS2(VSX207, LXSIWAX, do_lxs, gen_qemu_ld32s_i64);
|
||||
TRANS_FLAGS2(ISA300, LXSIBZX, do_lxs, gen_qemu_ld8u_i64);
|
||||
TRANS_FLAGS2(ISA300, LXSIHZX, do_lxs, gen_qemu_ld16u_i64);
|
||||
TRANS_FLAGS2(VSX207, LXSIWZX, do_lxs, gen_qemu_ld32u_i64);
|
||||
TRANS_FLAGS2(VSX207, LXSSPX, do_lxs, gen_qemu_ld32fs);
|
||||
|
||||
static void gen_lxvd2x(DisasContext *ctx)
|
||||
{
|
||||
|
@ -266,29 +263,25 @@ VSX_VECTOR_LOAD_STORE_LENGTH(stxvl)
|
|||
VSX_VECTOR_LOAD_STORE_LENGTH(stxvll)
|
||||
#endif
|
||||
|
||||
#define VSX_STORE_SCALAR(name, operation) \
|
||||
static void gen_##name(DisasContext *ctx) \
|
||||
{ \
|
||||
TCGv EA; \
|
||||
TCGv_i64 t0; \
|
||||
if (unlikely(!ctx->vsx_enabled)) { \
|
||||
gen_exception(ctx, POWERPC_EXCP_VSXU); \
|
||||
return; \
|
||||
} \
|
||||
t0 = tcg_temp_new_i64(); \
|
||||
gen_set_access_type(ctx, ACCESS_INT); \
|
||||
EA = tcg_temp_new(); \
|
||||
gen_addr_reg_index(ctx, EA); \
|
||||
get_cpu_vsr(t0, xS(ctx->opcode), true); \
|
||||
gen_qemu_##operation(ctx, t0, EA); \
|
||||
static bool do_stxs(DisasContext *ctx, arg_X *a,
|
||||
void (*op)(DisasContext *, TCGv_i64, TCGv))
|
||||
{
|
||||
TCGv EA;
|
||||
TCGv_i64 t0;
|
||||
REQUIRE_VSX(ctx);
|
||||
t0 = tcg_temp_new_i64();
|
||||
gen_set_access_type(ctx, ACCESS_INT);
|
||||
EA = do_ea_calc(ctx, a->ra, cpu_gpr[a->rb]);
|
||||
get_cpu_vsr(t0, a->rt, true);
|
||||
op(ctx, t0, EA);
|
||||
return true;
|
||||
}
|
||||
|
||||
VSX_STORE_SCALAR(stxsdx, st64_i64)
|
||||
|
||||
VSX_STORE_SCALAR(stxsibx, st8_i64)
|
||||
VSX_STORE_SCALAR(stxsihx, st16_i64)
|
||||
VSX_STORE_SCALAR(stxsiwx, st32_i64)
|
||||
VSX_STORE_SCALAR(stxsspx, st32fs)
|
||||
TRANS_FLAGS2(VSX, STXSDX, do_stxs, gen_qemu_st64_i64);
|
||||
TRANS_FLAGS2(ISA300, STXSIBX, do_stxs, gen_qemu_st8_i64);
|
||||
TRANS_FLAGS2(ISA300, STXSIHX, do_stxs, gen_qemu_st16_i64);
|
||||
TRANS_FLAGS2(VSX207, STXSIWX, do_stxs, gen_qemu_st32_i64);
|
||||
TRANS_FLAGS2(VSX207, STXSSPX, do_stxs, gen_qemu_st32fs);
|
||||
|
||||
static void gen_stxvd2x(DisasContext *ctx)
|
||||
{
|
||||
|
|
|
@ -1,9 +1,3 @@
|
|||
GEN_HANDLER_E(lxsdx, 0x1F, 0x0C, 0x12, 0, PPC_NONE, PPC2_VSX),
|
||||
GEN_HANDLER_E(lxsiwax, 0x1F, 0x0C, 0x02, 0, PPC_NONE, PPC2_VSX207),
|
||||
GEN_HANDLER_E(lxsiwzx, 0x1F, 0x0C, 0x00, 0, PPC_NONE, PPC2_VSX207),
|
||||
GEN_HANDLER_E(lxsibzx, 0x1F, 0x0D, 0x18, 0, PPC_NONE, PPC2_ISA300),
|
||||
GEN_HANDLER_E(lxsihzx, 0x1F, 0x0D, 0x19, 0, PPC_NONE, PPC2_ISA300),
|
||||
GEN_HANDLER_E(lxsspx, 0x1F, 0x0C, 0x10, 0, PPC_NONE, PPC2_VSX207),
|
||||
GEN_HANDLER_E(lxvd2x, 0x1F, 0x0C, 0x1A, 0, PPC_NONE, PPC2_VSX),
|
||||
GEN_HANDLER_E(lxvwsx, 0x1F, 0x0C, 0x0B, 0, PPC_NONE, PPC2_ISA300),
|
||||
GEN_HANDLER_E(lxvdsx, 0x1F, 0x0C, 0x0A, 0, PPC_NONE, PPC2_VSX),
|
||||
|
@ -15,11 +9,6 @@ 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(stxsdx, 0x1F, 0xC, 0x16, 0, PPC_NONE, PPC2_VSX),
|
||||
GEN_HANDLER_E(stxsibx, 0x1F, 0xD, 0x1C, 0, PPC_NONE, PPC2_ISA300),
|
||||
GEN_HANDLER_E(stxsihx, 0x1F, 0xD, 0x1D, 0, PPC_NONE, PPC2_ISA300),
|
||||
GEN_HANDLER_E(stxsiwx, 0x1F, 0xC, 0x04, 0, PPC_NONE, PPC2_VSX207),
|
||||
GEN_HANDLER_E(stxsspx, 0x1F, 0xC, 0x14, 0, PPC_NONE, PPC2_VSX207),
|
||||
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),
|
||||
|
|
Loading…
Reference in New Issue