summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/i386/x87priv.h
diff options
context:
space:
mode:
author yz70s <yz70s@users.noreply.github.com>2018-11-03 10:21:04 +0100
committer yz70s <yz70s@users.noreply.github.com>2018-11-03 10:25:11 +0100
commit4f5f5c6c92236a8d1948293bf5129117333f4152 (patch)
treee627882fb4ff816959deb755231c7c52b2a6f25d /src/devices/cpu/i386/x87priv.h
parentcbd7b12f60d615cf9c4a554dab7326d38557df42 (diff)
i386.cpp: prepare to change hxx files into regular cpp files (nw)
-change order of include files at top of i386.cpp -move some routines between i386.cpp and i386priv.h -move part of x87ops.hxx into new file x87priv.h . Now you only have to rename the hxx files to cpp and add the following at the top of each one . #include "emu.h" #include "i386.h" #include "i386priv.h" #include "x87priv.h" #include "cycles.h" #include "debugger.h" #include "debug/debugcpu.h" #undef i386
Diffstat (limited to 'src/devices/cpu/i386/x87priv.h')
-rw-r--r--src/devices/cpu/i386/x87priv.h169
1 files changed, 169 insertions, 0 deletions
diff --git a/src/devices/cpu/i386/x87priv.h b/src/devices/cpu/i386/x87priv.h
new file mode 100644
index 00000000000..67cf067a15f
--- /dev/null
+++ b/src/devices/cpu/i386/x87priv.h
@@ -0,0 +1,169 @@
+// license:BSD-3-Clause
+// copyright-holders:Philip Bennett
+#pragma once
+
+#ifndef __X87PRIV_H__
+#define __X87PRIV_H__
+
+#include <math.h>
+
+
+/*************************************
+ *
+ * Defines
+ *
+ *************************************/
+
+#define X87_SW_IE 0x0001
+#define X87_SW_DE 0x0002
+#define X87_SW_ZE 0x0004
+#define X87_SW_OE 0x0008
+#define X87_SW_UE 0x0010
+#define X87_SW_PE 0x0020
+#define X87_SW_SF 0x0040
+#define X87_SW_ES 0x0080
+#define X87_SW_C0 0x0100
+#define X87_SW_C1 0x0200
+#define X87_SW_C2 0x0400
+#define X87_SW_TOP_SHIFT 11
+#define X87_SW_TOP_MASK 7
+#define X87_SW_C3 0x4000
+#define X87_SW_BUSY 0x8000
+
+#define X87_CW_IM 0x0001
+#define X87_CW_DM 0x0002
+#define X87_CW_ZM 0x0004
+#define X87_CW_OM 0x0008
+#define X87_CW_UM 0x0010
+#define X87_CW_PM 0x0020
+#define X87_CW_IEM 0x0080
+#define X87_CW_PC_SHIFT 8
+#define X87_CW_PC_MASK 3
+#define X87_CW_PC_SINGLE 0
+#define X87_CW_PC_DOUBLE 2
+#define X87_CW_PC_EXTEND 3
+#define X87_CW_RC_SHIFT 10
+#define X87_CW_RC_MASK 3
+#define X87_CW_RC_NEAREST 0
+#define X87_CW_RC_DOWN 1
+#define X87_CW_RC_UP 2
+#define X87_CW_RC_ZERO 3
+
+#define X87_TW_MASK 3
+#define X87_TW_VALID 0
+#define X87_TW_ZERO 1
+#define X87_TW_SPECIAL 2
+#define X87_TW_EMPTY 3
+
+
+ /*************************************
+ *
+ * Macros
+ *
+ *************************************/
+
+#define ST_TO_PHYS(x) (((m_x87_sw >> X87_SW_TOP_SHIFT) + (x)) & X87_SW_TOP_MASK)
+#define ST(x) (m_x87_reg[ST_TO_PHYS(x)])
+#define X87_TW_FIELD_SHIFT(x) ((x) << 1)
+#define X87_TAG(x) ((m_x87_tw >> X87_TW_FIELD_SHIFT(x)) & X87_TW_MASK)
+#define X87_RC ((m_x87_cw >> X87_CW_RC_SHIFT) & X87_CW_RC_MASK)
+#define X87_IS_ST_EMPTY(x) (X87_TAG(ST_TO_PHYS(x)) == X87_TW_EMPTY)
+#define X87_SW_C3_0 X87_SW_C0
+
+#define UNIMPLEMENTED fatalerror("Unimplemented x87 op: %s (PC:%x)\n", __FUNCTION__, m_pc)
+
+
+ /*************************************
+ *
+ * Constants
+ *
+ *************************************/
+
+static const floatx80 fx80_zero = { 0x0000, 0x0000000000000000U };
+static const floatx80 fx80_one = { 0x3fff, 0x8000000000000000U };
+
+static const floatx80 fx80_ninf = { 0xffff, 0x8000000000000000U };
+static const floatx80 fx80_inan = { 0xffff, 0xc000000000000000U };
+
+/* Maps x87 round modes to SoftFloat round modes */
+static const int x87_to_sf_rc[4] =
+{
+ float_round_nearest_even,
+ float_round_down,
+ float_round_up,
+ float_round_to_zero,
+};
+
+
+/*************************************
+ *
+ * SoftFloat helpers
+ *
+ *************************************/
+
+extern flag floatx80_is_nan(floatx80 a);
+
+extern flag floatx80_is_signaling_nan(floatx80 a);
+
+static inline flag floatx80_is_quiet_nan(floatx80 a)
+{
+ bits64 aLow;
+
+ aLow = a.low & ~LIT64(0x4000000000000000);
+ return
+ ((a.high & 0x7FFF) == 0x7FFF)
+ && (bits64)(aLow << 1)
+ && (a.low != aLow);
+}
+
+static inline int floatx80_is_zero(floatx80 fx)
+{
+ return (((fx.high & 0x7fff) == 0) && ((fx.low << 1) == 0));
+}
+
+static inline int floatx80_is_inf(floatx80 fx)
+{
+ return (((fx.high & 0x7fff) == 0x7fff) && ((fx.low << 1) == 0));
+}
+
+static inline int floatx80_is_denormal(floatx80 fx)
+{
+ return (((fx.high & 0x7fff) == 0) &&
+ ((fx.low & 0x8000000000000000U) == 0) &&
+ ((fx.low << 1) != 0));
+}
+
+static inline floatx80 floatx80_abs(floatx80 fx)
+{
+ fx.high &= 0x7fff;
+ return fx;
+}
+
+static inline double fx80_to_double(floatx80 fx)
+{
+ uint64_t d = floatx80_to_float64(fx);
+ return *(double*)&d;
+}
+
+static inline floatx80 double_to_fx80(double in)
+{
+ return float64_to_floatx80(*(uint64_t*)&in);
+}
+
+floatx80 i386_device::READ80(uint32_t ea)
+{
+ floatx80 t;
+
+ t.low = READ64(ea);
+ t.high = READ16(ea + 8);
+
+ return t;
+}
+
+void i386_device::WRITE80(uint32_t ea, floatx80 t)
+{
+ WRITE64(ea, t.low);
+ WRITE16(ea + 8, t.high);
+}
+
+#endif /* __X87PRIV_H__ */