[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-ppc] [PATCH] fpu_helper.c: fix helper_fpscr_clrbit() function
From: |
John Arbuckle |
Subject: |
[Qemu-ppc] [PATCH] fpu_helper.c: fix helper_fpscr_clrbit() function |
Date: |
Sun, 17 Jun 2018 11:53:09 -0400 |
Fix the helper_fpscr_clrbit() function so it correctly
sets the FEX and VX bits.
Signed-off-by: John Arbuckle <address@hidden>
---
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)
- [Qemu-ppc] [PATCH] fpu_helper.c: fix helper_fpscr_clrbit() function,
John Arbuckle <=