diff options
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 |
commit | 04ad41cb6634613cbdf5804a041f00efda8ce1e0 (patch) | |
tree | d08238bfe90c78d10227f595cce3fbd49fdf184e | |
parent | 03d18776802c08f3487712974746e8e21b4ce19e (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.cpp | 57 | ||||
-rw-r--r-- | src/devices/cpu/mb86233/mb86233.h | 3 |
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); |