target-ppc: implement lxv/lxvx and stxv/stxvx
lxv: Load VSX Vector lxvx: Load VSX Vector Indexed Little/Big-endian Storage +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ |F0|F1|F2|F3|F4|F5|F6|F7|E0|E1|E2|E3|E4|E5|E6|E7| +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ Vector load results: BE: +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ |F0|F1|F2|F3|F4|F5|F6|F7|E0|E1|E2|E3|E4|E5|E6|E7| +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ LE: +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ |E7|E6|E5|E4|E3|E2|E1|E0|F7|F6|F5|F4|F3|F2|F1|F0| +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ stxv: Store VSX Vector stxvx: Store VSX Vector Indexed Vector (8-bit elements) in BE: +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ |F0|F1|F2|F3|F4|F5|F6|F7|E0|E1|E2|E3|E4|E5|E6|E7| +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ Vector (8-bit elements) in LE: +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ |E7|E6|E5|E4|E3|E2|E1|E0|F7|F6|F5|F4|F3|F2|F1|F0| +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ Store results in following: +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ |F0|F1|F2|F3|F4|F5|F6|F7|E0|E1|E2|E3|E4|E5|E6|E7| +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ Signed-off-by: Nikunj A Dadhania <nikunj@linux.vnet.ibm.com> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
parent
e3001664f1
commit
d59ba58380
@ -187,6 +187,7 @@ EXTRACT_HELPER(DCM, 10, 6)
|
||||
/* DFP Z23-form */
|
||||
EXTRACT_HELPER(RMC, 9, 2)
|
||||
|
||||
EXTRACT_HELPER_SPLIT(DQxT, 3, 1, 21, 5);
|
||||
EXTRACT_HELPER_SPLIT(xT, 0, 1, 21, 5);
|
||||
EXTRACT_HELPER_SPLIT(xS, 0, 1, 21, 5);
|
||||
EXTRACT_HELPER_SPLIT(xA, 2, 1, 16, 5);
|
||||
|
@ -6095,14 +6095,20 @@ static void gen_dform39(DisasContext *ctx)
|
||||
return gen_invalid(ctx);
|
||||
}
|
||||
|
||||
/* handles stfdp, stxsd, stxssp */
|
||||
/* handles stfdp, lxv, stxsd, stxssp lxvx */
|
||||
static void gen_dform3D(DisasContext *ctx)
|
||||
{
|
||||
if ((ctx->opcode & 3) == 1) { /* DQ-FORM */
|
||||
switch (ctx->opcode & 0x7) {
|
||||
case 1: /* lxv */
|
||||
if (ctx->insns_flags2 & PPC2_ISA300) {
|
||||
return gen_lxv(ctx);
|
||||
}
|
||||
break;
|
||||
case 5: /* stxv */
|
||||
if (ctx->insns_flags2 & PPC2_ISA300) {
|
||||
return gen_stxv(ctx);
|
||||
}
|
||||
break;
|
||||
}
|
||||
} else { /* DS-FORM */
|
||||
@ -6201,7 +6207,7 @@ GEN_HANDLER(std, 0x3E, 0xFF, 0xFF, 0x00000000, PPC_64B),
|
||||
#endif
|
||||
/* handles lfdp, lxsd, lxssp */
|
||||
GEN_HANDLER_E(dform39, 0x39, 0xFF, 0xFF, 0x00000000, PPC_NONE, PPC2_ISA205),
|
||||
/* handles stfdp, stxsd, stxssp */
|
||||
/* handles stfdp, lxv, stxsd, stxssp, stxv */
|
||||
GEN_HANDLER_E(dform3D, 0x3D, 0xFF, 0xFF, 0x00000000, PPC_NONE, PPC2_ISA205),
|
||||
GEN_HANDLER(lmw, 0x2E, 0xFF, 0xFF, 0x00000000, PPC_INTEGER),
|
||||
GEN_HANDLER(stmw, 0x2F, 0xFF, 0xFF, 0x00000000, PPC_INTEGER),
|
||||
|
@ -190,6 +190,56 @@ static void gen_lxvb16x(DisasContext *ctx)
|
||||
tcg_temp_free(EA);
|
||||
}
|
||||
|
||||
#define VSX_VECTOR_LOAD_STORE(name, op, indexed) \
|
||||
static void gen_##name(DisasContext *ctx) \
|
||||
{ \
|
||||
int xt; \
|
||||
TCGv EA; \
|
||||
TCGv_i64 xth, xtl; \
|
||||
\
|
||||
if (indexed) { \
|
||||
xt = xT(ctx->opcode); \
|
||||
} else { \
|
||||
xt = DQxT(ctx->opcode); \
|
||||
} \
|
||||
xth = cpu_vsrh(xt); \
|
||||
xtl = cpu_vsrl(xt); \
|
||||
\
|
||||
if (xt < 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; \
|
||||
} \
|
||||
} \
|
||||
gen_set_access_type(ctx, ACCESS_INT); \
|
||||
EA = tcg_temp_new(); \
|
||||
if (indexed) { \
|
||||
gen_addr_reg_index(ctx, EA); \
|
||||
} else { \
|
||||
gen_addr_imm_index(ctx, EA, 0x0F); \
|
||||
} \
|
||||
if (ctx->le_mode) { \
|
||||
tcg_gen_qemu_##op(xtl, EA, ctx->mem_idx, MO_LEQ); \
|
||||
tcg_gen_addi_tl(EA, EA, 8); \
|
||||
tcg_gen_qemu_##op(xth, EA, ctx->mem_idx, MO_LEQ); \
|
||||
} else { \
|
||||
tcg_gen_qemu_##op(xth, EA, ctx->mem_idx, MO_BEQ); \
|
||||
tcg_gen_addi_tl(EA, EA, 8); \
|
||||
tcg_gen_qemu_##op(xtl, EA, ctx->mem_idx, MO_BEQ); \
|
||||
} \
|
||||
tcg_temp_free(EA); \
|
||||
}
|
||||
|
||||
VSX_VECTOR_LOAD_STORE(lxv, ld_i64, 0)
|
||||
VSX_VECTOR_LOAD_STORE(stxv, st_i64, 0)
|
||||
VSX_VECTOR_LOAD_STORE(lxvx, ld_i64, 1)
|
||||
VSX_VECTOR_LOAD_STORE(stxvx, st_i64, 1)
|
||||
|
||||
#define VSX_LOAD_SCALAR_DS(name, operation) \
|
||||
static void gen_##name(DisasContext *ctx) \
|
||||
{ \
|
||||
|
@ -9,6 +9,7 @@ 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),
|
||||
GEN_HANDLER_E(lxvx, 0x1F, 0x0C, 0x08, 0x00000040, PPC_NONE, PPC2_ISA300),
|
||||
|
||||
GEN_HANDLER_E(stxsdx, 0x1F, 0xC, 0x16, 0, PPC_NONE, PPC2_VSX),
|
||||
GEN_HANDLER_E(stxsibx, 0x1F, 0xD, 0x1C, 0, PPC_NONE, PPC2_ISA300),
|
||||
@ -19,6 +20,7 @@ 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),
|
||||
GEN_HANDLER_E(stxvx, 0x1F, 0x0C, 0x0C, 0, PPC_NONE, PPC2_ISA300),
|
||||
|
||||
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