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
|
STXVRWX 011111 ..... ..... ..... 0011001101 . @X_TSX
|
||||||
STXVRDX 011111 ..... ..... ..... 0011101101 . @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
|
## VSX Vector Binary Floating-Point Sign Manipulation Instructions
|
||||||
|
|
||||||
XVABSDP 111100 ..... 00000 ..... 111011001 .. @XX2
|
XVABSDP 111100 ..... 00000 ..... 111011001 .. @XX2
|
||||||
|
@ -24,30 +24,27 @@ static inline TCGv_ptr gen_acc_ptr(int reg)
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define VSX_LOAD_SCALAR(name, operation) \
|
static bool do_lxs(DisasContext *ctx, arg_X *a,
|
||||||
static void gen_##name(DisasContext *ctx) \
|
void (*op)(DisasContext *, TCGv_i64, TCGv))
|
||||||
{ \
|
{
|
||||||
TCGv EA; \
|
TCGv EA;
|
||||||
TCGv_i64 t0; \
|
TCGv_i64 t0;
|
||||||
if (unlikely(!ctx->vsx_enabled)) { \
|
REQUIRE_VSX(ctx);
|
||||||
gen_exception(ctx, POWERPC_EXCP_VSXU); \
|
t0 = tcg_temp_new_i64();
|
||||||
return; \
|
gen_set_access_type(ctx, ACCESS_INT);
|
||||||
} \
|
EA = do_ea_calc(ctx, a->ra, cpu_gpr[a->rb]);
|
||||||
t0 = tcg_temp_new_i64(); \
|
op(ctx, t0, EA);
|
||||||
gen_set_access_type(ctx, ACCESS_INT); \
|
set_cpu_vsr(a->rt, t0, true);
|
||||||
EA = tcg_temp_new(); \
|
/* NOTE: cpu_vsrl is undefined */
|
||||||
gen_addr_reg_index(ctx, EA); \
|
return true;
|
||||||
gen_qemu_##operation(ctx, t0, EA); \
|
|
||||||
set_cpu_vsr(xT(ctx->opcode), t0, true); \
|
|
||||||
/* NOTE: cpu_vsrl is undefined */ \
|
|
||||||
}
|
}
|
||||||
|
|
||||||
VSX_LOAD_SCALAR(lxsdx, ld64_i64)
|
TRANS_FLAGS2(VSX, LXSDX, do_lxs, gen_qemu_ld64_i64);
|
||||||
VSX_LOAD_SCALAR(lxsiwax, ld32s_i64)
|
TRANS_FLAGS2(VSX207, LXSIWAX, do_lxs, gen_qemu_ld32s_i64);
|
||||||
VSX_LOAD_SCALAR(lxsibzx, ld8u_i64)
|
TRANS_FLAGS2(ISA300, LXSIBZX, do_lxs, gen_qemu_ld8u_i64);
|
||||||
VSX_LOAD_SCALAR(lxsihzx, ld16u_i64)
|
TRANS_FLAGS2(ISA300, LXSIHZX, do_lxs, gen_qemu_ld16u_i64);
|
||||||
VSX_LOAD_SCALAR(lxsiwzx, ld32u_i64)
|
TRANS_FLAGS2(VSX207, LXSIWZX, do_lxs, gen_qemu_ld32u_i64);
|
||||||
VSX_LOAD_SCALAR(lxsspx, ld32fs)
|
TRANS_FLAGS2(VSX207, LXSSPX, do_lxs, gen_qemu_ld32fs);
|
||||||
|
|
||||||
static void gen_lxvd2x(DisasContext *ctx)
|
static void gen_lxvd2x(DisasContext *ctx)
|
||||||
{
|
{
|
||||||
@ -266,29 +263,25 @@ VSX_VECTOR_LOAD_STORE_LENGTH(stxvl)
|
|||||||
VSX_VECTOR_LOAD_STORE_LENGTH(stxvll)
|
VSX_VECTOR_LOAD_STORE_LENGTH(stxvll)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define VSX_STORE_SCALAR(name, operation) \
|
static bool do_stxs(DisasContext *ctx, arg_X *a,
|
||||||
static void gen_##name(DisasContext *ctx) \
|
void (*op)(DisasContext *, TCGv_i64, TCGv))
|
||||||
{ \
|
{
|
||||||
TCGv EA; \
|
TCGv EA;
|
||||||
TCGv_i64 t0; \
|
TCGv_i64 t0;
|
||||||
if (unlikely(!ctx->vsx_enabled)) { \
|
REQUIRE_VSX(ctx);
|
||||||
gen_exception(ctx, POWERPC_EXCP_VSXU); \
|
t0 = tcg_temp_new_i64();
|
||||||
return; \
|
gen_set_access_type(ctx, ACCESS_INT);
|
||||||
} \
|
EA = do_ea_calc(ctx, a->ra, cpu_gpr[a->rb]);
|
||||||
t0 = tcg_temp_new_i64(); \
|
get_cpu_vsr(t0, a->rt, true);
|
||||||
gen_set_access_type(ctx, ACCESS_INT); \
|
op(ctx, t0, EA);
|
||||||
EA = tcg_temp_new(); \
|
return true;
|
||||||
gen_addr_reg_index(ctx, EA); \
|
|
||||||
get_cpu_vsr(t0, xS(ctx->opcode), true); \
|
|
||||||
gen_qemu_##operation(ctx, t0, EA); \
|
|
||||||
}
|
}
|
||||||
|
|
||||||
VSX_STORE_SCALAR(stxsdx, st64_i64)
|
TRANS_FLAGS2(VSX, STXSDX, do_stxs, gen_qemu_st64_i64);
|
||||||
|
TRANS_FLAGS2(ISA300, STXSIBX, do_stxs, gen_qemu_st8_i64);
|
||||||
VSX_STORE_SCALAR(stxsibx, st8_i64)
|
TRANS_FLAGS2(ISA300, STXSIHX, do_stxs, gen_qemu_st16_i64);
|
||||||
VSX_STORE_SCALAR(stxsihx, st16_i64)
|
TRANS_FLAGS2(VSX207, STXSIWX, do_stxs, gen_qemu_st32_i64);
|
||||||
VSX_STORE_SCALAR(stxsiwx, st32_i64)
|
TRANS_FLAGS2(VSX207, STXSSPX, do_stxs, gen_qemu_st32fs);
|
||||||
VSX_STORE_SCALAR(stxsspx, st32fs)
|
|
||||||
|
|
||||||
static void gen_stxvd2x(DisasContext *ctx)
|
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(lxvd2x, 0x1F, 0x0C, 0x1A, 0, PPC_NONE, PPC2_VSX),
|
||||||
GEN_HANDLER_E(lxvwsx, 0x1F, 0x0C, 0x0B, 0, PPC_NONE, PPC2_ISA300),
|
GEN_HANDLER_E(lxvwsx, 0x1F, 0x0C, 0x0B, 0, PPC_NONE, PPC2_ISA300),
|
||||||
GEN_HANDLER_E(lxvdsx, 0x1F, 0x0C, 0x0A, 0, PPC_NONE, PPC2_VSX),
|
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),
|
GEN_HANDLER_E(lxvll, 0x1F, 0x0D, 0x09, 0, PPC_NONE, PPC2_ISA300),
|
||||||
#endif
|
#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(stxvd2x, 0x1F, 0xC, 0x1E, 0, PPC_NONE, PPC2_VSX),
|
||||||
GEN_HANDLER_E(stxvw4x, 0x1F, 0xC, 0x1C, 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(stxvh8x, 0x1F, 0x0C, 0x1D, 0, PPC_NONE, PPC2_ISA300),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user