All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH] fpu_helper.c: fix helper_fpscr_clrbit() function
@ 2018-06-17 15:53 John Arbuckle
  2018-06-18  0:34 ` David Gibson
  2018-06-18 11:30 ` Peter Maydell
  0 siblings, 2 replies; 5+ messages in thread
From: John Arbuckle @ 2018-06-17 15:53 UTC (permalink / raw)
  To: peter.maydell, qemu-devel, aurelien, david, agraf, qemu-ppc; +Cc: John Arbuckle

Fix the helper_fpscr_clrbit() function so it correctly
sets the FEX and VX bits.

Signed-off-by: John Arbuckle <programmingkidx@gmail.com>
---
 target/ppc/fpu_helper.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 57 insertions(+)

diff --git a/target/ppc/fpu_helper.c b/target/ppc/fpu_helper.c
index d31a933cbb..7e697a11d0 100644
--- a/target/ppc/fpu_helper.c
+++ b/target/ppc/fpu_helper.c
@@ -325,6 +325,63 @@ void helper_fpscr_clrbit(CPUPPCState *env, uint32_t bit)
         case FPSCR_RN:
             fpscr_set_rounding_mode(env);
             break;
+        case FPSCR_VXSNAN:
+        case FPSCR_VXISI:
+        case FPSCR_VXIDI:
+        case FPSCR_VXZDZ:
+        case FPSCR_VXIMZ:
+        case FPSCR_VXVC:
+        case FPSCR_VXSOFT:
+        case FPSCR_VXSQRT:
+        case FPSCR_VXCVI:
+        {
+            int vxsnan, vxisi, vxidi, vxzdz, vximz, vxvc, vxsoft, vxsqrt, vxcvi;
+            vxsnan = (env->fpscr >> (31 - FPSCR_VXSNAN)) & 1;
+            vxisi = (env->fpscr >> (31 - FPSCR_VXISI)) & 1;
+            vxidi = (env->fpscr >> (31 - FPSCR_VXIDI)) & 1;
+            vxzdz = (env->fpscr >> (31 - FPSCR_VXZDZ)) & 1;
+            vximz = (env->fpscr >> (31 - FPSCR_VXIMZ)) & 1;
+            vxvc = (env->fpscr >> (31 - FPSCR_VXVC)) & 1;
+            vxsoft = (env->fpscr >> (31 - FPSCR_VXSOFT)) & 1;
+            vxsqrt = (env->fpscr >> (31 - FPSCR_VXSQRT)) & 1;
+            vxcvi = (env->fpscr >> (31 - FPSCR_VXCVI)) & 1;
+            if (~(vxsnan & vxisi & vxidi & vxzdz & vximz & vxvc & vxsoft &
+                  vxsqrt & vxcvi)) {
+                /* Set VX bit to zero */
+                env->fpscr = env->fpscr & ~(1 << FPSCR_VX);
+            }
+        }
+            break;
+        case FPSCR_VX:
+        case FPSCR_OX:
+        case FPSCR_UX:
+        case FPSCR_ZX:
+        case FPSCR_XX:
+        case FPSCR_VE:
+        case FPSCR_OE:
+        case FPSCR_UE:
+        case FPSCR_ZE:
+        case FPSCR_XE:
+        {
+            int vx, ox, ux, zx, xx, ve, oe, ue, ze, xe;
+            vx = (env->fpscr >> (31 - FPSCR_VX)) & 1;
+            ox = (env->fpscr >> (31 - FPSCR_OX)) & 1;
+            ux = (env->fpscr >> (31 - FPSCR_UX)) & 1;
+            zx = (env->fpscr >> (31 - FPSCR_ZX)) & 1;
+            xx = (env->fpscr >> (31 - FPSCR_XX)) & 1;
+            ve = (env->fpscr >> (31 - FPSCR_VE)) & 1;
+            oe = (env->fpscr >> (31 - FPSCR_OE)) & 1;
+            ue = (env->fpscr >> (31 - FPSCR_UE)) & 1;
+            ze = (env->fpscr >> (31 - FPSCR_ZE)) & 1;
+            xe = (env->fpscr >> (31 - FPSCR_XE)) & 1;
+            bool fex;
+            fex = (vx & ve) | (ox & oe) | (ux & ue) | (zx & ze) | (xx & xe);
+            unsigned int mask;
+            mask = (1 << FPSCR_FEX);
+            /* Set the FEX bit */
+            env->fpscr = (env->fpscr & ~mask) | (-fex & mask);
+        }
+            break;
         default:
             break;
         }
-- 
2.14.3 (Apple Git-98)

^ permalink raw reply related	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2018-06-18 15:16 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-06-17 15:53 [Qemu-devel] [PATCH] fpu_helper.c: fix helper_fpscr_clrbit() function John Arbuckle
2018-06-18  0:34 ` David Gibson
2018-06-18  1:20   ` Programmingkid
2018-06-18 11:30 ` Peter Maydell
2018-06-18 15:15   ` Programmingkid

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.