@@ -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)
@@ -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"
@@ -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)
This patch provides the implementation for the Decimal Floating Point (DFP) Add instructions (dadd, daddq). Signed-off-by: Tom Musta <tommusta@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(-)