summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Olivier Galibert <galibert@pobox.com>2021-07-09 21:19:05 +0200
committer Olivier Galibert <galibert@pobox.com>2021-07-09 21:19:19 +0200
commit04ad41cb6634613cbdf5804a041f00efda8ce1e0 (patch)
treed08238bfe90c78d10227f595cce3fbd49fdf184e
parent03d18776802c08f3487712974746e8e21b4ce19e (diff)
mb86233: refine the patch to only do fp-type flag setting on fp operations [Ryan Holtz]
-rw-r--r--src/devices/cpu/mb86233/mb86233.cpp57
-rw-r--r--src/devices/cpu/mb86233/mb86233.h3
2 files changed, 33 insertions, 27 deletions
diff --git a/src/devices/cpu/mb86233/mb86233.cpp b/src/devices/cpu/mb86233/mb86233.cpp
index 3434faa7fbc..b3abdb85b44 100644
--- a/src/devices/cpu/mb86233/mb86233.cpp
+++ b/src/devices/cpu/mb86233/mb86233.cpp
@@ -277,7 +277,12 @@ void mb86233_device::testdz()
m_st &= ~F_SGD;
}
-void mb86233_device::stset_set_sz(u32 val)
+void mb86233_device::stset_set_sz_int(u32 val)
+{
+ m_alu_stset = val ? (val & 0x80000000 ? F_SGD : 0) : F_ZRD;
+}
+
+void mb86233_device::stset_set_sz_fp(u32 val)
{
m_alu_stset = (val & 0x7fffffff) ? (val & 0x80000000 ? F_SGD : 0) : F_ZRD;
}
@@ -291,7 +296,7 @@ void mb86233_device::alu_pre(u32 alu)
// andd
m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD;
m_alu_r1 = m_d & m_a;
- stset_set_sz(m_alu_r1);
+ stset_set_sz_int(m_alu_r1);
break;
}
@@ -299,15 +304,15 @@ void mb86233_device::alu_pre(u32 alu)
// orad
m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD;
m_alu_r1 = m_d | m_a;
- stset_set_sz(m_alu_r1);
+ stset_set_sz_int(m_alu_r1);
break;
}
case 0x03: {
// eord
m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD;
- m_alu_r1 = m_d ^ m_a;
- stset_set_sz(m_alu_r1);
+ m_alu_r1 = m_d ^ m_a;
+ stset_set_sz_int(m_alu_r1);
break;
}
@@ -315,7 +320,7 @@ void mb86233_device::alu_pre(u32 alu)
// notd
m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD;
m_alu_r1 = ~m_d;
- stset_set_sz(m_alu_r1);
+ stset_set_sz_int(m_alu_r1);
break;
}
@@ -323,7 +328,7 @@ void mb86233_device::alu_pre(u32 alu)
// fcpd
m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD;
u32 r = f2u(u2f(m_d) - u2f(m_a));
- stset_set_sz(r);
+ stset_set_sz_fp(r);
break;
}
@@ -331,7 +336,7 @@ void mb86233_device::alu_pre(u32 alu)
// fmad
m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD;
m_alu_r1 = f2u(u2f(m_d) + u2f(m_a));
- stset_set_sz(m_alu_r1);
+ stset_set_sz_fp(m_alu_r1);
break;
}
@@ -339,7 +344,7 @@ void mb86233_device::alu_pre(u32 alu)
// fsbd
m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD;
m_alu_r1 = f2u(u2f(m_d) - u2f(m_a));
- stset_set_sz(m_alu_r1);
+ stset_set_sz_fp(m_alu_r1);
break;
}
@@ -356,7 +361,7 @@ void mb86233_device::alu_pre(u32 alu)
m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD;
m_alu_r1 = f2u(u2f(m_d) + u2f(m_p));
m_alu_r2 = f2u(u2f(m_a) * u2f(m_b));
- stset_set_sz(m_alu_r1);
+ stset_set_sz_fp(m_alu_r1);
break;
}
@@ -365,7 +370,7 @@ void mb86233_device::alu_pre(u32 alu)
m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD;
m_alu_r1 = f2u(u2f(m_d) - u2f(m_p));
m_alu_r2 = f2u(u2f(m_a) * u2f(m_b));
- stset_set_sz(m_alu_r1);
+ stset_set_sz_fp(m_alu_r1);
break;
}
@@ -373,7 +378,7 @@ void mb86233_device::alu_pre(u32 alu)
// fabd
m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD;
m_alu_r1 = m_d & 0x7fffffff;
- stset_set_sz(m_alu_r1);
+ stset_set_sz_fp(m_alu_r1);
break;
}
@@ -381,7 +386,7 @@ void mb86233_device::alu_pre(u32 alu)
// fsmd
m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD;
m_alu_r1 = f2u(u2f(m_d) + u2f(m_p));
- stset_set_sz(m_alu_r1);
+ stset_set_sz_fp(m_alu_r1);
break;
}
@@ -390,7 +395,7 @@ void mb86233_device::alu_pre(u32 alu)
m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD;
m_alu_r1 = m_p;
m_alu_r2 = f2u(u2f(m_a) * u2f(m_b));
- stset_set_sz(m_alu_r1);
+ stset_set_sz_fp(m_alu_r1);
break;
}
@@ -398,7 +403,7 @@ void mb86233_device::alu_pre(u32 alu)
// cxfd
m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD;
m_alu_r1 = f2u(s32(m_d));
- stset_set_sz(m_alu_r1);
+ stset_set_sz_int(m_alu_r1);
break;
}
@@ -411,7 +416,7 @@ void mb86233_device::alu_pre(u32 alu)
case 2: m_alu_r1 = s32(floorf(u2f(m_d))); break;
case 3: m_alu_r1 = s32(u2f(m_d)); break;
}
- stset_set_sz(m_alu_r1);
+ stset_set_sz_int(m_alu_r1);
break;
}
@@ -419,7 +424,7 @@ void mb86233_device::alu_pre(u32 alu)
// fdvd
m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD;
m_alu_r1 = f2u(u2f(m_d) / u2f(m_a));
- stset_set_sz(m_alu_r1);
+ stset_set_sz_fp(m_alu_r1);
break;
}
@@ -427,7 +432,7 @@ void mb86233_device::alu_pre(u32 alu)
// fned
m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD;
m_alu_r1 = m_d ? m_d ^ 0x80000000 : 0;
- stset_set_sz(m_alu_r1);
+ stset_set_sz_fp(m_alu_r1);
break;
}
@@ -435,7 +440,7 @@ void mb86233_device::alu_pre(u32 alu)
// d = b + a
m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD;
m_alu_r1 = f2u(u2f(m_b) + u2f(m_a));
- stset_set_sz(m_alu_r1);
+ stset_set_sz_fp(m_alu_r1);
break;
}
@@ -443,7 +448,7 @@ void mb86233_device::alu_pre(u32 alu)
// d = b - a
m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD;
m_alu_r1 = f2u(u2f(m_b) - u2f(m_a));
- stset_set_sz(m_alu_r1);
+ stset_set_sz_fp(m_alu_r1);
break;
}
@@ -451,7 +456,7 @@ void mb86233_device::alu_pre(u32 alu)
// lsrd
m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD;
m_alu_r1 = m_d >> m_sft;
- stset_set_sz(m_alu_r1);
+ stset_set_sz_int(m_alu_r1);
break;
}
@@ -459,7 +464,7 @@ void mb86233_device::alu_pre(u32 alu)
// lsld
m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD;
m_alu_r1 = m_d << m_sft;
- stset_set_sz(m_alu_r1);
+ stset_set_sz_int(m_alu_r1);
break;
}
@@ -467,7 +472,7 @@ void mb86233_device::alu_pre(u32 alu)
// asrd
m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD;
m_alu_r1 = s32(m_d) >> m_sft;
- stset_set_sz(m_alu_r1);
+ stset_set_sz_int(m_alu_r1);
break;
}
@@ -475,7 +480,7 @@ void mb86233_device::alu_pre(u32 alu)
// asld
m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD;
m_alu_r1 = s32(m_d) << m_sft;
- stset_set_sz(m_alu_r1);
+ stset_set_sz_int(m_alu_r1);
break;
}
@@ -483,7 +488,7 @@ void mb86233_device::alu_pre(u32 alu)
// addd
m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD;
m_alu_r1 = m_d + m_a;
- stset_set_sz(m_alu_r1);
+ stset_set_sz_int(m_alu_r1);
break;
}
@@ -491,7 +496,7 @@ void mb86233_device::alu_pre(u32 alu)
// subd
m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD;
m_alu_r1 = m_d - m_a;
- stset_set_sz(m_alu_r1);
+ stset_set_sz_int(m_alu_r1);
break;
}
diff --git a/src/devices/cpu/mb86233/mb86233.h b/src/devices/cpu/mb86233/mb86233.h
index 1da3750f5fc..5e8c0b10d16 100644
--- a/src/devices/cpu/mb86233/mb86233.h
+++ b/src/devices/cpu/mb86233/mb86233.h
@@ -120,7 +120,8 @@ private:
void ea_post_1(u32 r);
void pcs_push();
void pcs_pop();
- inline void stset_set_sz(u32 val);
+ inline void stset_set_sz_int(u32 val);
+ inline void stset_set_sz_fp(u32 val);
u32 read_reg(u32 r);
void write_reg(u32 r, u32 v);