This patch provides the implementation for the Decimal Floating Point (DFP) Add instructions (dadd, daddq).
Signed-off-by: Tom Musta <tommu...@gmail.com> --- target-ppc/dfp_helper.c | 35 ++++++++++++++++++++++++----------- target-ppc/helper.h | 3 +++ target-ppc/translate.c | 8 +++++--- 3 files changed, 32 insertions(+), 14 deletions(-) diff --git a/target-ppc/dfp_helper.c b/target-ppc/dfp_helper.c index a3381ef..46a83e4 100644 --- a/target-ppc/dfp_helper.c +++ b/target-ppc/dfp_helper.c @@ -235,17 +235,30 @@ static void ppc_dfp_run_post_processors(struct PPC_DFP *dfp, } } +#define DFP_HELPER_TAB(op, dnop, postprocs, size) \ +void helper_##op(CPUPPCState *env, uint64_t *t, uint64_t *a, uint64_t *b) \ +{ \ + struct PPC_DFP dfp; \ + ppc_dfp_prepare_decimal##size##_fra_frb(&dfp, a, b, env); \ + dnop(&dfp.t, &dfp.a, &dfp.b, &dfp.context); \ + decimal##size##FromNumber((decimal##size *)dfp.t64, &dfp.t, &dfp.context); \ + ppc_dfp_run_post_processors(&dfp, postprocs, ARRAY_SIZE(postprocs)); \ + if (size == 64) { \ + t[0] = dfp.t64[0]; \ + } else if (size == 128) { \ + t[0] = dfp.t64[HI_IDX]; \ + t[1] = dfp.t64[LO_IDX]; \ + } \ +} -void *_TmpAvoidDefinedButNotUsedWarnings_[] = { - (void *)ppc_dfp_prepare_decimal64_fra_frb, - (void *)ppc_dfp_prepare_decimal128_fra_frb, - (void *)ppc_dfp_run_post_processors, - (void *)ppc_dfp_set_FPRF_from_FRT, - (void *)ppc_dfp_check_for_OX, - (void *)ppc_dfp_check_for_UX, - (void *)ppc_dfp_check_for_XX, - (void *)ppc_dfp_check_for_VXSNAN, - (void *)ppc_dfp_check_for_VXISI_add, +PPC_DFP_PostProc ADD_PPs[] = { + ppc_dfp_set_FPRF_from_FRT, + ppc_dfp_check_for_OX, + ppc_dfp_check_for_UX, + ppc_dfp_check_for_XX, + ppc_dfp_check_for_VXSNAN, + ppc_dfp_check_for_VXISI_add, }; - +DFP_HELPER_TAB(dadd, decNumberAdd, ADD_PPs, 64) +DFP_HELPER_TAB(daddq, decNumberAdd, ADD_PPs, 128) diff --git a/target-ppc/helper.h b/target-ppc/helper.h index 1bebc8e..6054554 100644 --- a/target-ppc/helper.h +++ b/target-ppc/helper.h @@ -618,4 +618,7 @@ DEF_HELPER_3(store_601_batu, void, env, i32, tl) #define dh_ctype_fprp uint64_t * #define dh_is_signed_fprp dh_is_signed_ptr +DEF_HELPER_4(dadd, void, env, fprp, fprp, fprp) +DEF_HELPER_4(daddq, void, env, fprp, fprp, fprp) + #include "exec/def-helper.h" diff --git a/target-ppc/translate.c b/target-ppc/translate.c index 26bfebc..de9ddb6 100644 --- a/target-ppc/translate.c +++ b/target-ppc/translate.c @@ -8229,9 +8229,8 @@ static void gen_##name(DisasContext *ctx) \ _GEN_DFP_TAB(name, op1, op2) \ _GEN_DFP_TAB(name##q, op1, op2) -/* Avoid 'defined but not used' warnings ... this will be removed in */ -/* a subsequent patch. */ -void *_TempCr6_[] = { (void *)gen_set_cr6_from_fpscr, }; +GEN_DFP_TAB(dadd, 0x02, 0x00) + /*** SPE extension ***/ /* Register moves */ @@ -11062,6 +11061,9 @@ GEN_XX3FORM_DM(xxpermdi, 0x08, 0x01), #define GEN_DFP_TAB(name, op1, op2) \ GEN_DFP_TAB_LONG(name, op1, op2), \ GEN_DFP_TAB_QUAD(name##q, op1, op2), + +GEN_DFP_TAB(dadd, 0x02, 0x00) + #undef GEN_SPE #define GEN_SPE(name0, name1, opc2, opc3, inval0, inval1, type) \ GEN_OPCODE_DUAL(name0##_##name1, 0x04, opc2, opc3, inval0, inval1, type, PPC_NONE) -- 1.7.1