qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [RFC 12/12] target-ppc: Introduce DFP Add


From: Tom Musta
Subject: [Qemu-devel] [RFC 12/12] target-ppc: Introduce DFP Add
Date: Thu, 13 Mar 2014 10:13:08 -0500

This patch provides the implementation for the Decimal Floating Point
(DFP) Add instructions (dadd, daddq).

Signed-off-by: Tom Musta <address@hidden>
---
 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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]