summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/e132xs/e132xsdrc_ops.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/e132xs/e132xsdrc_ops.hxx')
-rw-r--r--src/devices/cpu/e132xs/e132xsdrc_ops.hxx633
1 files changed, 424 insertions, 209 deletions
diff --git a/src/devices/cpu/e132xs/e132xsdrc_ops.hxx b/src/devices/cpu/e132xs/e132xsdrc_ops.hxx
index af0795bea2b..9f2d42b3ece 100644
--- a/src/devices/cpu/e132xs/e132xsdrc_ops.hxx
+++ b/src/devices/cpu/e132xs/e132xsdrc_ops.hxx
@@ -388,93 +388,158 @@ void hyperstone_device::generate_set_dst(drcuml_block &block, compiler_state &co
}
-void hyperstone_device::generate_update_flags_addsub(drcuml_block &block, compiler_state &compiler, uml::parameter sr)
+void hyperstone_device::generate_update_flags_addsub(drcuml_block &block, compiler_state &compiler, const opcode_desc *desc, uml::parameter sr)
{
// expects result in I0 and UML flags set by ADD/SUB
// clobbers I1, I4 and I5
- UML_SETc(block, uml::COND_V, I4); // I4 = ...V
- UML_SETc(block, uml::COND_Z, I5); // I5 = ...Z
- UML_SETc(block, uml::COND_C, I1); // I1 = ...C
- UML_SHL(block, I4, I4, V_SHIFT); // I4 = V...
- UML_OR(block, I1, I1, I4); // I1 = V..C
- UML_SHL(block, I4, I5, Z_SHIFT); // I4 = ..Z.
- UML_OR(block, I1, I1, I4); // I1 = V.ZC
- UML_ROLAND(block, I4, I0, N_SHIFT + 1, N_MASK); // I4 = .N..
- UML_OR(block, I1, I1, I4); // I1 = VNZC
+ if (!DO_ELIDE_CONDITION_CALC || desc->v_calc_required())
+ UML_SETc(block, uml::COND_V, I4); // I4 = ...V
+ if (!DO_ELIDE_CONDITION_CALC || desc->z_calc_required())
+ UML_SETc(block, uml::COND_Z, I5); // I5 = ...Z
+ if (!DO_ELIDE_CONDITION_CALC || desc->c_calc_required())
+ UML_SETc(block, uml::COND_C, I1); // I1 = ...C
+ else
+ UML_MOV(block, I1, 0);
+ if (!DO_ELIDE_CONDITION_CALC || desc->v_calc_required())
+ {
+ UML_SHL(block, I4, I4, V_SHIFT); // I4 = V...
+ UML_OR(block, I1, I1, I4); // I1 = V..C
+ }
+ if (!DO_ELIDE_CONDITION_CALC || desc->z_calc_required())
+ {
+ UML_SHL(block, I4, I5, Z_SHIFT); // I4 = ..Z.
+ UML_OR(block, I1, I1, I4); // I1 = V.ZC
+ }
+ if (!DO_ELIDE_CONDITION_CALC || desc->n_calc_required())
+ {
+ UML_ROLAND(block, I4, I0, N_SHIFT + 1, N_MASK); // I4 = .N..
+ UML_OR(block, I1, I1, I4); // I1 = VNZC
+ }
UML_ROLINS(block, sr, I1, 0, (V_MASK | N_MASK | Z_MASK | C_MASK));
}
-void hyperstone_device::generate_update_flags_addsubc(drcuml_block &block, compiler_state &compiler, uml::parameter sr)
+void hyperstone_device::generate_update_flags_addsubc(drcuml_block &block, compiler_state &compiler, const opcode_desc *desc, uml::parameter sr)
{
// expects result in I0 and UML flags set by ADD/SUB
// clobbers I1, I4 and I5
- UML_SETc(block, uml::COND_V, I4); // I4 = ...V
- UML_SETc(block, uml::COND_Z, I5); // I5 = ...Z
- UML_SETc(block, uml::COND_C, I1); // I1 = ...C
- UML_SHL(block, I4, I4, V_SHIFT); // I4 = V...
- UML_OR(block, I1, I1, I4); // I1 = V..C
- UML_SHL(block, I4, I5, Z_SHIFT); // I4 = ..Z.
- UML_OR(block, I1, I1, I4); // I1 = V.ZC
- UML_ROLAND(block, I4, I0, N_SHIFT + 1, N_MASK); // I4 = .N..
- UML_OR(block, I1, I1, I4); // I1 = VNZC
- UML_OR(block, I4, I2, ~Z_MASK); // combine with old Z flag
- UML_AND(block, I1, I1, I4);
+ if (!DO_ELIDE_CONDITION_CALC || desc->v_calc_required())
+ UML_SETc(block, uml::COND_V, I4); // I4 = ...V
+ if (!DO_ELIDE_CONDITION_CALC || desc->z_calc_required())
+ UML_SETc(block, uml::COND_Z, I5); // I5 = ...Z
+ if (!DO_ELIDE_CONDITION_CALC || desc->c_calc_required())
+ UML_SETc(block, uml::COND_C, I1); // I1 = ...C
+ else
+ UML_MOV(block, I1, 0);
+ if (!DO_ELIDE_CONDITION_CALC || desc->v_calc_required())
+ {
+ UML_SHL(block, I4, I4, V_SHIFT); // I4 = V...
+ UML_OR(block, I1, I1, I4); // I1 = V..C
+ }
+ if (!DO_ELIDE_CONDITION_CALC || desc->z_calc_required())
+ {
+ UML_SHL(block, I4, I5, Z_SHIFT); // I4 = ..Z.
+ UML_OR(block, I1, I1, I4); // I1 = V.ZC
+ }
+ if (!DO_ELIDE_CONDITION_CALC || desc->n_calc_required())
+ {
+ UML_ROLAND(block, I4, I0, N_SHIFT + 1, N_MASK); // I4 = .N..
+ UML_OR(block, I1, I1, I4); // I1 = VNZC
+ }
+ if (!DO_ELIDE_CONDITION_CALC || desc->z_calc_required())
+ {
+ UML_OR(block, I4, sr, ~Z_MASK); // combine with old Z flag
+ UML_AND(block, I1, I1, I4);
+ }
UML_ROLINS(block, sr, I1, 0, (V_MASK | N_MASK | Z_MASK | C_MASK));
}
-void hyperstone_device::generate_update_flags_addsubs(drcuml_block &block, compiler_state &compiler, uml::parameter sr)
+void hyperstone_device::generate_update_flags_addsubs(drcuml_block &block, compiler_state &compiler, const opcode_desc *desc, uml::parameter sr)
{
// expects UML flags set by ADD/SUB
// clobbers I1, I4 and I5
- UML_SETc(block, uml::COND_V, I4); // I4 = ...V
- UML_SETc(block, uml::COND_S, I1); // I1 = ...S
- UML_SETc(block, uml::COND_Z, I5); // I5 = ...Z
- UML_SHL(block, I4, I4, V_SHIFT); // I4 = V...
- UML_SHL(block, I1, I1, N_SHIFT); // I1 = .N..
- UML_OR(block, I1, I1, I4); // I1 = VN..
- UML_SHL(block, I4, I5, Z_SHIFT); // I4 = ..Z.
- UML_OR(block, I1, I1, I4); // I1 = VNZ.
+ if (!DO_ELIDE_CONDITION_CALC || desc->v_calc_required())
+ UML_SETc(block, uml::COND_V, I4); // I4 = ...V
+ if (!DO_ELIDE_CONDITION_CALC || desc->n_calc_required())
+ UML_SETc(block, uml::COND_S, I1); // I1 = ...N
+ else
+ UML_MOV(block, I1, 0);
+ if (!DO_ELIDE_CONDITION_CALC || desc->z_calc_required())
+ UML_SETc(block, uml::COND_Z, I5); // I5 = ...Z
+ if (!DO_ELIDE_CONDITION_CALC || desc->v_calc_required())
+ UML_SHL(block, I4, I4, V_SHIFT); // I4 = V...
+ if (!DO_ELIDE_CONDITION_CALC || desc->n_calc_required())
+ UML_SHL(block, I1, I1, N_SHIFT); // I1 = .N..
+ if (!DO_ELIDE_CONDITION_CALC || desc->v_calc_required())
+ UML_OR(block, I1, I1, I4); // I1 = VN..
+ if (!DO_ELIDE_CONDITION_CALC || desc->z_calc_required())
+ {
+ UML_SHL(block, I4, I5, Z_SHIFT); // I4 = ..Z.
+ UML_OR(block, I1, I1, I4); // I1 = VNZ.
+ }
UML_ROLINS(block, sr, I1, 0, (V_MASK | N_MASK | Z_MASK));
}
-void hyperstone_device::generate_update_flags_cmp(drcuml_block &block, compiler_state &compiler, uml::parameter sr)
+void hyperstone_device::generate_update_flags_cmp(drcuml_block &block, compiler_state &compiler, const opcode_desc *desc, uml::parameter sr)
{
// expects UML flags set by ADD/SUB
// clobbers I0, I1, I3 and I4
- UML_SETc(block, uml::COND_V, I0); // I0 = ...V
- UML_SETc(block, uml::COND_L, I1); // I1 = ...N
- UML_SETc(block, uml::COND_Z, I3); // I3 = ...Z
- UML_SETc(block, uml::COND_C, I4); // I4 = ...C
+ if (!DO_ELIDE_CONDITION_CALC || desc->v_calc_required())
+ UML_SETc(block, uml::COND_V, I0); // I0 = ...V
+ if (!DO_ELIDE_CONDITION_CALC || desc->n_calc_required())
+ UML_SETc(block, uml::COND_L, I1); // I1 = ...N
+ if (!DO_ELIDE_CONDITION_CALC || desc->z_calc_required())
+ UML_SETc(block, uml::COND_Z, I3); // I3 = ...Z
+ if (!DO_ELIDE_CONDITION_CALC || desc->c_calc_required())
+ UML_SETc(block, uml::COND_C, I4); // I4 = ...C
UML_AND(block, sr, sr, ~(V_MASK | N_MASK | Z_MASK | C_MASK));
- UML_SHL(block, I0, I0, V_SHIFT); // I0 = V...
- UML_SHL(block, I1, I1, N_SHIFT); // I1 = .N..
- UML_SHL(block, I3, I3, Z_SHIFT); // I3 = ..Z.
- UML_SHL(block, I4, I4, C_SHIFT); // I4 = ...C
- UML_OR(block, I0, I0, I1); // I0 = VN..
- UML_OR(block, I3, I3, I4); // I1 = ..ZC
- UML_OR(block, sr, sr, I0);
- UML_OR(block, sr, sr, I3);
+ if (!DO_ELIDE_CONDITION_CALC || desc->v_calc_required())
+ UML_SHL(block, I0, I0, V_SHIFT); // I0 = V...
+ if (!DO_ELIDE_CONDITION_CALC || desc->n_calc_required())
+ UML_SHL(block, I1, I1, N_SHIFT); // I1 = .N..
+ if (!DO_ELIDE_CONDITION_CALC || desc->z_calc_required())
+ UML_SHL(block, I3, I3, Z_SHIFT); // I3 = ..Z.
+ if (!DO_ELIDE_CONDITION_CALC || (desc->v_calc_required() && desc->n_calc_required()))
+ UML_OR(block, I0, I0, I1); // I0 = VN..
+ if (!DO_ELIDE_CONDITION_CALC || (desc->c_calc_required() && desc->z_calc_required()))
+ UML_OR(block, I3, I3, I4); // I3 = ..ZC
+ if (!DO_ELIDE_CONDITION_CALC || desc->v_calc_required())
+ UML_OR(block, sr, sr, I0);
+ else if (desc->n_calc_required())
+ UML_OR(block, sr, sr, I1);
+ if (!DO_ELIDE_CONDITION_CALC || desc->z_calc_required())
+ UML_OR(block, sr, sr, I3);
+ else if (desc->c_calc_required())
+ UML_OR(block, sr, sr, I4);
}
-void hyperstone_device::generate_update_nz(drcuml_block &block, compiler_state &compiler, uml::parameter sr)
+void hyperstone_device::generate_update_nz(drcuml_block &block, compiler_state &compiler, const opcode_desc *desc, uml::parameter sr)
{
// expects result in I0 and UML Z flag to be set
// clobbers I1
- UML_SETc(block, uml::COND_Z, I1);
- UML_SHL(block, I1, I1, Z_SHIFT);
- UML_ROLINS(block, I1, I0, N_SHIFT + 1, N_MASK);
- UML_OR(block, sr, sr, I1);
+ if (!DO_ELIDE_CONDITION_CALC || desc->z_calc_required())
+ {
+ UML_SETc(block, uml::COND_Z, I1);
+ UML_SHL(block, I1, I1, Z_SHIFT);
+ if (!DO_ELIDE_CONDITION_CALC || desc->n_calc_required())
+ UML_ROLINS(block, I1, I0, N_SHIFT + 1, N_MASK);
+ }
+ else if (desc->n_calc_required())
+ {
+ UML_ROLAND(block, I1, I0, N_SHIFT + 1, N_MASK);
+ }
+ if (!DO_ELIDE_CONDITION_CALC || desc->z_calc_required() || desc->n_calc_required())
+ UML_OR(block, sr, sr, I1);
}
-void hyperstone_device::generate_update_nz_d(drcuml_block &block, compiler_state &compiler, uml::parameter sr)
+void hyperstone_device::generate_update_nz_d(drcuml_block &block, compiler_state &compiler, const opcode_desc *desc, uml::parameter sr)
{
// expects result in I0 and UML Z flag to be set
// assumes Z and N bits in sr have already been cleared
@@ -1134,8 +1199,11 @@ void hyperstone_device::generate_sum(drcuml_block &block, compiler_state &compil
(BIT(result, 31) << N_SHIFT) |
(BIT((compiler.pc() ^ result) & (src ^ result), 31) << V_SHIFT);
- UML_ROLINS(block, I2, flags, 0, V_MASK | N_MASK | Z_MASK | C_MASK);
- UML_MOV(block, DRC_SR, I2);
+ if (!DO_ELIDE_CONDITION_CALC || desc->condition_calc_required())
+ {
+ UML_ROLINS(block, I2, flags, 0, V_MASK | N_MASK | Z_MASK | C_MASK);
+ UML_MOV(block, DRC_SR, I2);
+ }
generate_set_dst(block, compiler, desc, DstGlobal, dst_code, uint32_t(result), uml::I3, true);
}
@@ -1145,8 +1213,11 @@ void hyperstone_device::generate_sum(drcuml_block &block, compiler_state &compil
UML_ADD(block, I0, I0, src);
- generate_update_flags_addsub(block, compiler, uml::I2);
- UML_MOV(block, DRC_SR, I2);
+ if (!DO_ELIDE_CONDITION_CALC || desc->condition_calc_required())
+ {
+ generate_update_flags_addsub(block, compiler, desc, uml::I2);
+ UML_MOV(block, DRC_SR, I2);
+ }
generate_set_dst(block, compiler, desc, DstGlobal, dst_code, uml::I0, uml::I3, true);
}
@@ -1171,8 +1242,11 @@ void hyperstone_device::generate_sums(drcuml_block &block, compiler_state &compi
UML_ADD(block, I0, I0, src);
- generate_update_flags_addsubs(block, compiler, uml::I2);
- UML_MOV(block, DRC_SR, I2);
+ if (!DO_ELIDE_CONDITION_CALC || desc->condition_calc_required())
+ {
+ generate_update_flags_addsubs(block, compiler, desc, uml::I2);
+ UML_MOV(block, DRC_SR, I2);
+ }
generate_set_register(block, compiler, desc, DstGlobal, dst_code, uml::I0, uml::I3, true);
generate_exception_on_overflow(block, compiler, desc, uml::I2);
@@ -1211,8 +1285,11 @@ void hyperstone_device::generate_cmp(drcuml_block &block, compiler_state &compil
UML_CMP(block, I0, I1);
- generate_update_flags_cmp(block, compiler, uml::I2);
- UML_MOV(block, DRC_SR, I2);
+ if (!DO_ELIDE_CONDITION_CALC || desc->condition_calc_required())
+ {
+ generate_update_flags_cmp(block, compiler, desc, uml::I2);
+ UML_MOV(block, DRC_SR, I2);
+ }
}
template <hyperstone_device::reg_bank DstGlobal, hyperstone_device::reg_bank SrcGlobal>
@@ -1275,8 +1352,11 @@ void hyperstone_device::generate_mov(drcuml_block &block, compiler_state &compil
UML_LOAD(block, I0, (void *)m_core->local_regs, I0, SIZE_DWORD, SCALE_x4);
}
- UML_TEST(block, I0, ~uint32_t(0));
- generate_update_nz(block, compiler, uml::I2);
+ if (!DO_ELIDE_CONDITION_CALC || desc->condition_calc_required())
+ {
+ UML_TEST(block, I0, ~uint32_t(0));
+ generate_update_nz(block, compiler, desc, uml::I2);
+ }
if (DstGlobal)
{
@@ -1363,8 +1443,11 @@ void hyperstone_device::generate_add(drcuml_block &block, compiler_state &compil
(BIT(result, 31) << N_SHIFT) |
(BIT((compiler.pc() ^ result), 31) << V_SHIFT);
- UML_ROLINS(block, I2, flags, 0, M_MASK | V_MASK | N_MASK | Z_MASK | C_MASK);
- UML_MOV(block, DRC_SR, I2);
+ if (!DO_ELIDE_CONDITION_CALC || desc->condition_calc_required())
+ {
+ UML_ROLINS(block, I2, flags, 0, M_MASK | V_MASK | N_MASK | Z_MASK | C_MASK);
+ UML_MOV(block, DRC_SR, I2);
+ }
UML_MOV(block, DRC_PC, result);
generate_branch(block, compiler, compiler.mode(), result, desc);
@@ -1376,8 +1459,11 @@ void hyperstone_device::generate_add(drcuml_block &block, compiler_state &compil
UML_ADD(block, I0, I0, compiler.pc());
- generate_update_flags_addsub(block, compiler, uml::I2);
- UML_MOV(block, DRC_SR, I2);
+ if (!DO_ELIDE_CONDITION_CALC || desc->condition_calc_required())
+ {
+ generate_update_flags_addsub(block, compiler, desc, uml::I2);
+ UML_MOV(block, DRC_SR, I2);
+ }
generate_set_dst(block, compiler, desc, DstGlobal, dst_code, uml::I0, uml::I3, false);
return;
@@ -1388,7 +1474,8 @@ void hyperstone_device::generate_add(drcuml_block &block, compiler_state &compil
UML_ADD(block, I0, I0, compiler.pc());
- generate_update_flags_addsub(block, compiler, uml::I2);
+ if (!DO_ELIDE_CONDITION_CALC || desc->condition_calc_required())
+ generate_update_flags_addsub(block, compiler, desc, uml::I2);
UML_AND(block, I2, I2, ~M_MASK);
UML_MOV(block, DRC_SR, I2);
@@ -1404,8 +1491,11 @@ void hyperstone_device::generate_add(drcuml_block &block, compiler_state &compil
UML_ADD(block, I0, I0, I1);
- generate_update_flags_addsub(block, compiler, uml::I2);
- UML_MOV(block, DRC_SR, I2);
+ if (!DO_ELIDE_CONDITION_CALC || desc->condition_calc_required())
+ {
+ generate_update_flags_addsub(block, compiler, desc, uml::I2);
+ UML_MOV(block, DRC_SR, I2);
+ }
generate_set_dst(block, compiler, desc, DstGlobal, dst_code, uml::I0, uml::I3, false);
}
@@ -1429,8 +1519,11 @@ void hyperstone_device::generate_adds(drcuml_block &block, compiler_state &compi
UML_ADD(block, I0, I0, I1);
- generate_update_flags_addsubs(block, compiler, uml::I2);
- UML_MOV(block, DRC_SR, I2);
+ if (!DO_ELIDE_CONDITION_CALC || desc->condition_calc_required())
+ {
+ generate_update_flags_addsubs(block, compiler, desc, uml::I2);
+ UML_MOV(block, DRC_SR, I2);
+ }
generate_set_register(block, compiler, desc, DstGlobal, dst_code, uml::I0, uml::I3, false);
generate_exception_on_overflow(block, compiler, desc, uml::I2);
@@ -1498,8 +1591,11 @@ void hyperstone_device::generate_subc(drcuml_block &block, compiler_state &compi
UML_SUB(block, I0, I0, I1);
}
- generate_update_flags_addsubc(block, compiler, uml::I2);
- UML_MOV(block, DRC_SR, I2);
+ if (!DO_ELIDE_CONDITION_CALC || desc->condition_calc_required())
+ {
+ generate_update_flags_addsubc(block, compiler, desc, uml::I2);
+ UML_MOV(block, DRC_SR, I2);
+ }
generate_set_dst(block, compiler, desc, DstGlobal, dst_code, uml::I0, uml::I3, false);
}
@@ -1523,8 +1619,11 @@ void hyperstone_device::generate_sub(drcuml_block &block, compiler_state &compil
UML_SUB(block, I0, I0, I1);
- generate_update_flags_addsub(block, compiler, uml::I2);
- UML_MOV(block, DRC_SR, I2);
+ if (!DO_ELIDE_CONDITION_CALC || desc->condition_calc_required())
+ {
+ generate_update_flags_addsub(block, compiler, desc, uml::I2);
+ UML_MOV(block, DRC_SR, I2);
+ }
generate_set_dst(block, compiler, desc, DstGlobal, dst_code, uml::I0, uml::I3, false);
}
@@ -1548,8 +1647,11 @@ void hyperstone_device::generate_subs(drcuml_block &block, compiler_state &compi
UML_SUB(block, I0, I0, I1);
- generate_update_flags_addsubs(block, compiler, uml::I2);
- UML_MOV(block, DRC_SR, I2);
+ if (!DO_ELIDE_CONDITION_CALC || desc->condition_calc_required())
+ {
+ generate_update_flags_addsubs(block, compiler, desc, uml::I2);
+ UML_MOV(block, DRC_SR, I2);
+ }
generate_set_register(block, compiler, desc, DstGlobal, dst_code, uml::I0, uml::I3, false);
generate_exception_on_overflow(block, compiler, desc, uml::I2);
@@ -1596,8 +1698,11 @@ void hyperstone_device::generate_addc(drcuml_block &block, compiler_state &compi
UML_ADD(block, I0, I0, I1);
}
- generate_update_flags_addsubc(block, compiler, uml::I2);
- UML_MOV(block, DRC_SR, I2);
+ if (!DO_ELIDE_CONDITION_CALC || desc->condition_calc_required())
+ {
+ generate_update_flags_addsubc(block, compiler, desc, uml::I2);
+ UML_MOV(block, DRC_SR, I2);
+ }
generate_set_dst(block, compiler, desc, DstGlobal, dst_code, uml::I0, uml::I3, false);
}
@@ -1620,8 +1725,11 @@ void hyperstone_device::generate_neg(drcuml_block &block, compiler_state &compil
UML_SUB(block, I0, 0, I0);
- generate_update_flags_addsub(block, compiler, uml::I2);
- UML_MOV(block, DRC_SR, I2);
+ if (!DO_ELIDE_CONDITION_CALC || desc->condition_calc_required())
+ {
+ generate_update_flags_addsub(block, compiler, desc, uml::I2);
+ UML_MOV(block, DRC_SR, I2);
+ }
generate_set_dst(block, compiler, desc, DstGlobal, dst_code, uml::I0, uml::I3, true);
}
@@ -1644,8 +1752,11 @@ void hyperstone_device::generate_negs(drcuml_block &block, compiler_state &compi
UML_SUB(block, I0, 0, I0);
- generate_update_flags_addsubs(block, compiler, uml::I2);
- UML_MOV(block, DRC_SR, I2);
+ if (!DO_ELIDE_CONDITION_CALC || desc->condition_calc_required())
+ {
+ generate_update_flags_addsubs(block, compiler, desc, uml::I2);
+ UML_MOV(block, DRC_SR, I2);
+ }
generate_set_register(block, compiler, desc, DstGlobal, dst_code, uml::I0, uml::I3, true);
@@ -1766,8 +1877,11 @@ void hyperstone_device::generate_cmpi(drcuml_block &block, compiler_state &compi
UML_CMP(block, I0, src);
- generate_update_flags_cmp(block, compiler, uml::I2);
- UML_MOV(block, DRC_SR, I2);
+ if (!DO_ELIDE_CONDITION_CALC || desc->condition_calc_required())
+ {
+ generate_update_flags_cmp(block, compiler, desc, uml::I2);
+ UML_MOV(block, DRC_SR, I2);
+ }
}
@@ -1884,8 +1998,11 @@ void hyperstone_device::generate_addi(drcuml_block &block, compiler_state &compi
(BIT((compiler.pc() ^ result) & (src ^ result), 31) << V_SHIFT);
}
- UML_ROLINS(block, I2, flags, 0, M_MASK | V_MASK | N_MASK | Z_MASK | C_MASK);
- UML_MOV(block, DRC_SR, I2);
+ if (!DO_ELIDE_CONDITION_CALC || desc->condition_calc_required())
+ {
+ UML_ROLINS(block, I2, flags, 0, M_MASK | V_MASK | N_MASK | Z_MASK | C_MASK);
+ UML_MOV(block, DRC_SR, I2);
+ }
result = uint32_t(result) & uint32_t(1);
UML_MOV(block, DRC_PC, result);
@@ -1906,8 +2023,11 @@ void hyperstone_device::generate_addi(drcuml_block &block, compiler_state &compi
UML_ADD(block, I0, I0, srcp);
- generate_update_flags_addsub(block, compiler, uml::I2);
- UML_MOV(block, DRC_SR, I2);
+ if (!DO_ELIDE_CONDITION_CALC || desc->condition_calc_required())
+ {
+ generate_update_flags_addsub(block, compiler, desc, uml::I2);
+ UML_MOV(block, DRC_SR, I2);
+ }
generate_set_dst(block, compiler, desc, DstGlobal, dst_code, uml::I0, uml::I3, false);
}
@@ -2044,16 +2164,20 @@ void hyperstone_device::generate_shrdi(drcuml_block &block, compiler_state &comp
UML_DSHL(block, I1, I1, 32);
UML_DOR(block, I0, I0, I1);
- UML_AND(block, I2, I2, ~(C_MASK | Z_MASK | N_MASK));
- if (n)
+ if (!DO_ELIDE_CONDITION_CALC || desc->condition_calc_required())
+ UML_AND(block, I2, I2, ~(C_MASK | Z_MASK | N_MASK));
+ if (n && (!DO_ELIDE_CONDITION_CALC || desc->c_calc_required()))
{
UML_DROLAND(block, I1, I0, 64 - C_SHIFT + 1 - n, C_MASK);
UML_OR(block, I2, I2, I1);
}
UML_DSHR(block, I0, I0, n);
- generate_update_nz_d(block, compiler, uml::I2);
- UML_MOV(block, DRC_SR, I2);
+ if (!DO_ELIDE_CONDITION_CALC || desc->condition_calc_required())
+ {
+ generate_update_nz_d(block, compiler, desc, uml::I2);
+ UML_MOV(block, DRC_SR, I2);
+ }
UML_DSHR(block, I1, I0, 32);
UML_STORE(block, (void *)m_core->local_regs, I4, I1, SIZE_DWORD, SCALE_x4);
@@ -2085,18 +2209,25 @@ void hyperstone_device::generate_shrd(drcuml_block &block, compiler_state &compi
generate_load_operand(block, compiler, LOCAL, src_code, uml::I1, uml::I3);
- const int no_shift = compiler.next_label();
- UML_AND(block, I2, I2, ~(C_MASK | Z_MASK | N_MASK));
+ if (!DO_ELIDE_CONDITION_CALC || desc->condition_calc_required())
+ UML_AND(block, I2, I2, ~(C_MASK | Z_MASK | N_MASK));
UML_AND(block, I1, I1, 0x1f);
- UML_JMPc(block, uml::COND_Z, no_shift);
- UML_SUB(block, I3, 64 - C_SHIFT + 1, I1);
- UML_DROLAND(block, I3, I0, I3, C_MASK);
- UML_OR(block, I2, I2, I3);
- UML_LABEL(block, no_shift);
+ if (!DO_ELIDE_CONDITION_CALC || desc->c_calc_required())
+ {
+ const int no_shift = compiler.next_label();
+ UML_JMPc(block, uml::COND_Z, no_shift);
+ UML_SUB(block, I3, 64 - C_SHIFT + 1, I1);
+ UML_DROLAND(block, I3, I0, I3, C_MASK);
+ UML_OR(block, I2, I2, I3);
+ UML_LABEL(block, no_shift);
+ }
UML_DSHR(block, I0, I0, I1);
- generate_update_nz_d(block, compiler, uml::I2);
- UML_MOV(block, DRC_SR, I2);
+ if (!DO_ELIDE_CONDITION_CALC || desc->condition_calc_required())
+ {
+ generate_update_nz_d(block, compiler, desc, uml::I2);
+ UML_MOV(block, DRC_SR, I2);
+ }
UML_DSHR(block, I1, I0, 32);
UML_STORE(block, (void *)m_core->local_regs, I4, I1, SIZE_DWORD, SCALE_x4);
@@ -2118,18 +2249,25 @@ void hyperstone_device::generate_shr(drcuml_block &block, compiler_state &compil
generate_load_operand(block, compiler, LOCAL, src_code, uml::I1, uml::I1);
generate_load_operand(block, compiler, LOCAL, dst_code, uml::I0, uml::I3);
- const int no_shift = compiler.next_label();
- UML_AND(block, I2, I2, ~(C_MASK | Z_MASK | N_MASK));
+ if (!DO_ELIDE_CONDITION_CALC || desc->condition_calc_required())
+ UML_AND(block, I2, I2, ~(C_MASK | Z_MASK | N_MASK));
UML_AND(block, I1, I1, 0x1f);
- UML_JMPc(block, uml::COND_Z, no_shift);
- UML_SUB(block, I4, 32 - C_SHIFT + 1, I1);
- UML_ROLAND(block, I4, I0, I4, C_MASK);
- UML_OR(block, I2, I2, I4);
- UML_LABEL(block, no_shift);
+ if (!DO_ELIDE_CONDITION_CALC || desc->c_calc_required())
+ {
+ const int no_shift = compiler.next_label();
+ UML_JMPc(block, uml::COND_Z, no_shift);
+ UML_SUB(block, I4, 32 - C_SHIFT + 1, I1);
+ UML_ROLAND(block, I4, I0, I4, C_MASK);
+ UML_OR(block, I2, I2, I4);
+ UML_LABEL(block, no_shift);
+ }
UML_SHR(block, I0, I0, I1);
- generate_update_nz(block, compiler, uml::I2);
- UML_MOV(block, DRC_SR, I2);
+ if (!DO_ELIDE_CONDITION_CALC || desc->condition_calc_required())
+ {
+ generate_update_nz(block, compiler, desc, uml::I2);
+ UML_MOV(block, DRC_SR, I2);
+ }
UML_STORE(block, (void *)m_core->local_regs, I3, I0, SIZE_DWORD, SCALE_x4);
}
@@ -2150,16 +2288,20 @@ void hyperstone_device::generate_shri(drcuml_block &block, compiler_state &compi
generate_load_operand(block, compiler, DstGlobal, dst_code, uml::I0, uml::I3);
- UML_AND(block, I2, I2, ~(C_MASK | Z_MASK | N_MASK));
- if (n)
+ if (!DO_ELIDE_CONDITION_CALC || desc->condition_calc_required())
+ UML_AND(block, I2, I2, ~(C_MASK | Z_MASK | N_MASK));
+ if (n && (!DO_ELIDE_CONDITION_CALC || desc->condition_calc_required()))
{
UML_ROLAND(block, I4, I0, 32 - C_SHIFT + 1 - n, C_MASK);
UML_OR(block, I2, I2, I4);
}
UML_SHR(block, I0, I0, n);
- generate_update_nz(block, compiler, uml::I2);
- UML_MOV(block, DRC_SR, I2);
+ if (!DO_ELIDE_CONDITION_CALC || desc->condition_calc_required())
+ {
+ generate_update_nz(block, compiler, desc, uml::I2);
+ UML_MOV(block, DRC_SR, I2);
+ }
generate_set_dst(block, compiler, desc, DstGlobal, dst_code, uml::I0, uml::I3, false);
}
@@ -2183,16 +2325,20 @@ void hyperstone_device::generate_sardi(drcuml_block &block, compiler_state &comp
UML_DSHL(block, I1, I1, 32);
UML_DOR(block, I0, I0, I1);
- UML_AND(block, I2, I2, ~(C_MASK | Z_MASK | N_MASK));
- if (n)
+ if (!DO_ELIDE_CONDITION_CALC || desc->condition_calc_required())
+ UML_AND(block, I2, I2, ~(C_MASK | Z_MASK | N_MASK));
+ if (n && (!DO_ELIDE_CONDITION_CALC || desc->c_calc_required()))
{
UML_DROLAND(block, I1, I0, 64 - C_SHIFT + 1 - n, C_MASK);
UML_OR(block, I2, I2, I1);
}
UML_DSAR(block, I0, I0, n);
- generate_update_nz_d(block, compiler, uml::I2);
- UML_MOV(block, DRC_SR, I2);
+ if (!DO_ELIDE_CONDITION_CALC || desc->condition_calc_required())
+ {
+ generate_update_nz_d(block, compiler, desc, uml::I2);
+ UML_MOV(block, DRC_SR, I2);
+ }
UML_DSHR(block, I1, I0, 32);
UML_STORE(block, (void *)m_core->local_regs, I4, I1, SIZE_DWORD, SCALE_x4);
@@ -2224,18 +2370,25 @@ void hyperstone_device::generate_sard(drcuml_block &block, compiler_state &compi
generate_load_operand(block, compiler, LOCAL, src_code, uml::I1, uml::I3);
- const int no_shift = compiler.next_label();
- UML_AND(block, I2, I2, ~(C_MASK | Z_MASK | N_MASK));
+ if (!DO_ELIDE_CONDITION_CALC || desc->condition_calc_required())
+ UML_AND(block, I2, I2, ~(C_MASK | Z_MASK | N_MASK));
UML_AND(block, I1, I1, 0x1f);
- UML_JMPc(block, uml::COND_Z, no_shift);
- UML_SUB(block, I3, 64 - C_SHIFT + 1, I1);
- UML_DROLAND(block, I3, I0, I3, C_MASK);
- UML_OR(block, I2, I2, I3);
- UML_LABEL(block, no_shift);
+ if (!DO_ELIDE_CONDITION_CALC || desc->c_calc_required())
+ {
+ const int no_shift = compiler.next_label();
+ UML_JMPc(block, uml::COND_Z, no_shift);
+ UML_SUB(block, I3, 64 - C_SHIFT + 1, I1);
+ UML_DROLAND(block, I3, I0, I3, C_MASK);
+ UML_OR(block, I2, I2, I3);
+ UML_LABEL(block, no_shift);
+ }
UML_DSAR(block, I0, I0, I1);
- generate_update_nz_d(block, compiler, uml::I2);
- UML_MOV(block, DRC_SR, I2);
+ if (!DO_ELIDE_CONDITION_CALC || desc->condition_calc_required())
+ {
+ generate_update_nz_d(block, compiler, desc, uml::I2);
+ UML_MOV(block, DRC_SR, I2);
+ }
UML_DSHR(block, I1, I0, 32);
UML_STORE(block, (void *)m_core->local_regs, I4, I1, SIZE_DWORD, SCALE_x4);
@@ -2257,18 +2410,25 @@ void hyperstone_device::generate_sar(drcuml_block &block, compiler_state &compil
generate_load_operand(block, compiler, LOCAL, src_code, uml::I1, uml::I1);
generate_load_operand(block, compiler, LOCAL, dst_code, uml::I0, uml::I3);
- const int no_shift = compiler.next_label();
- UML_AND(block, I2, I2, ~(C_MASK | Z_MASK | N_MASK));
+ if (!DO_ELIDE_CONDITION_CALC || desc->condition_calc_required())
+ UML_AND(block, I2, I2, ~(C_MASK | Z_MASK | N_MASK));
UML_AND(block, I1, I1, 0x1f);
- UML_JMPc(block, uml::COND_Z, no_shift);
- UML_SUB(block, I4, 32 - C_SHIFT + 1, I1);
- UML_ROLAND(block, I4, I0, I4, C_MASK);
- UML_OR(block, I2, I2, I4);
- UML_LABEL(block, no_shift);
+ if (!DO_ELIDE_CONDITION_CALC || desc->c_calc_required())
+ {
+ const int no_shift = compiler.next_label();
+ UML_JMPc(block, uml::COND_Z, no_shift);
+ UML_SUB(block, I4, 32 - C_SHIFT + 1, I1);
+ UML_ROLAND(block, I4, I0, I4, C_MASK);
+ UML_OR(block, I2, I2, I4);
+ UML_LABEL(block, no_shift);
+ }
UML_SAR(block, I0, I0, I1);
- generate_update_nz(block, compiler, uml::I2);
- UML_MOV(block, DRC_SR, I2);
+ if (!DO_ELIDE_CONDITION_CALC || desc->condition_calc_required())
+ {
+ generate_update_nz(block, compiler, desc, uml::I2);
+ UML_MOV(block, DRC_SR, I2);
+ }
UML_STORE(block, (void *)m_core->local_regs, I3, I0, SIZE_DWORD, SCALE_x4);
}
@@ -2289,16 +2449,20 @@ void hyperstone_device::generate_sari(drcuml_block &block, compiler_state &compi
generate_load_operand(block, compiler, DstGlobal, dst_code, uml::I0, uml::I3);
- UML_AND(block, I2, I2, ~(C_MASK | Z_MASK | N_MASK));
- if (n)
+ if (!DO_ELIDE_CONDITION_CALC || desc->condition_calc_required())
+ UML_AND(block, I2, I2, ~(C_MASK | Z_MASK | N_MASK));
+ if (n && (!DO_ELIDE_CONDITION_CALC || desc->c_calc_required()))
{
UML_ROLAND(block, I4, I0, 32 - C_SHIFT + 1 - n, C_MASK);
UML_OR(block, I2, I2, I4);
}
UML_SAR(block, I0, I0, n);
- generate_update_nz(block, compiler, uml::I2);
- UML_MOV(block, DRC_SR, I2);
+ if (!DO_ELIDE_CONDITION_CALC || desc->condition_calc_required())
+ {
+ generate_update_nz(block, compiler, desc, uml::I2);
+ UML_MOV(block, DRC_SR, I2);
+ }
generate_set_dst(block, compiler, desc, DstGlobal, dst_code, uml::I0, uml::I3, false);
}
@@ -2319,23 +2483,25 @@ void hyperstone_device::generate_shldi(drcuml_block &block, compiler_state &comp
generate_load_operand(block, compiler, LOCAL, dst_code, uml::I1, uml::I4);
generate_load_operand(block, compiler, LOCAL, dst_code + 1, uml::I0, uml::I5);
- UML_AND(block, I2, I2, ~(C_MASK | Z_MASK | N_MASK | V_MASK));
- if (n)
+ if (!DO_ELIDE_CONDITION_CALC || desc->condition_calc_required())
+ UML_AND(block, I2, I2, ~(C_MASK | Z_MASK | N_MASK | V_MASK));
+ if (n && (!DO_ELIDE_CONDITION_CALC || (desc->c_calc_required() || desc->v_calc_required())))
UML_SHR(block, I3, I1, 32 - n);
UML_DSHL(block, I1, I1, 32);
UML_DOR(block, I0, I0, I1);
- if (n)
+ if (n && (!DO_ELIDE_CONDITION_CALC || desc->c_calc_required()))
{
UML_ROLAND(block, I1, I3, C_SHIFT, C_MASK);
UML_OR(block, I2, I2, I1);
}
UML_DSHL(block, I0, I0, n);
- generate_update_nz_d(block, compiler, uml::I2);
+ if (!DO_ELIDE_CONDITION_CALC || desc->condition_calc_required())
+ generate_update_nz_d(block, compiler, desc, uml::I2);
- if (n)
+ if (n && (!DO_ELIDE_CONDITION_CALC || desc->v_calc_required()))
{
UML_DTEST(block, I0, ~uint64_t(0));
UML_MOV(block, I1, util::make_bitmask<uint32_t>(n));
@@ -2346,7 +2512,8 @@ void hyperstone_device::generate_shldi(drcuml_block &block, compiler_state &comp
UML_OR(block, I2, I2, I1);
}
- UML_MOV(block, DRC_SR, I2);
+ if (!DO_ELIDE_CONDITION_CALC || desc->condition_calc_required())
+ UML_MOV(block, DRC_SR, I2);
UML_DSHR(block, I1, I0, 32);
UML_STORE(block, (void *)m_core->local_regs, I4, I1, SIZE_DWORD, SCALE_x4);
@@ -2378,31 +2545,44 @@ void hyperstone_device::generate_shld(drcuml_block &block, compiler_state &compi
generate_load_operand(block, compiler, LOCAL, src_code, uml::I1, uml::I3);
- const int no_shift = compiler.next_label();
- UML_AND(block, I2, I2, ~(C_MASK | Z_MASK | N_MASK | V_MASK));
+ if (!DO_ELIDE_CONDITION_CALC || desc->condition_calc_required())
+ UML_AND(block, I2, I2, ~(C_MASK | Z_MASK | N_MASK | V_MASK));
UML_AND(block, I1, I1, 0x1f);
- UML_JMPc(block, uml::COND_Z, no_shift);
- UML_SUB(block, I3, 64, I1);
- UML_DSHR(block, I4, I0, I3);
- UML_ROLINS(block, I2, I4, C_SHIFT, C_MASK);
- UML_LABEL(block, no_shift);
+ if (!DO_ELIDE_CONDITION_CALC || desc->c_calc_required() || desc->v_calc_required())
+ {
+ const int no_shift = compiler.next_label();
+ UML_JMPc(block, uml::COND_Z, no_shift);
+ UML_SUB(block, I3, 64, I1);
+ UML_DSHR(block, I4, I0, I3);
+ if (!DO_ELIDE_CONDITION_CALC || desc->c_calc_required())
+ UML_ROLINS(block, I2, I4, C_SHIFT, C_MASK);
+ UML_LABEL(block, no_shift);
+ }
UML_DSHL(block, I0, I0, I1);
- const int no_overflow = compiler.next_label();
- UML_TEST(block, I1, ~uint32_t(0));
- UML_JMPc(block, uml::COND_Z, no_overflow);
- UML_SHR(block, I1, ~uint32_t(0), I3);
- UML_DTEST(block, I0, ~uint64_t(0));
- UML_MOVc(block, uml::COND_NS, I1, 0);
- UML_CMP(block, I4, I1);
- UML_JMPc(block, uml::COND_E, no_overflow);
- UML_OR(block, I2, I2, V_MASK);
- UML_LABEL(block, no_overflow);
-
- UML_DTEST(block, I0, I0);
- generate_update_nz_d(block, compiler, uml::I2);
- UML_MOV(block, DRC_SR, I2);
+ if (!DO_ELIDE_CONDITION_CALC || desc->v_calc_required())
+ {
+ const int no_overflow = compiler.next_label();
+ UML_TEST(block, I1, ~uint32_t(0));
+ UML_JMPc(block, uml::COND_Z, no_overflow);
+ UML_SHR(block, I1, ~uint32_t(0), I3);
+ UML_DTEST(block, I0, ~uint64_t(0));
+ UML_MOVc(block, uml::COND_NS, I1, 0);
+ UML_CMP(block, I4, I1);
+ UML_JMPc(block, uml::COND_E, no_overflow);
+ UML_OR(block, I2, I2, V_MASK);
+ UML_LABEL(block, no_overflow);
+ }
+
+ if (!DO_ELIDE_CONDITION_CALC || desc->z_calc_required() || desc->n_calc_required())
+ {
+ if (!DO_ELIDE_CONDITION_CALC || desc->v_calc_required())
+ UML_DTEST(block, I0, I0);
+ generate_update_nz_d(block, compiler, desc, uml::I2);
+ }
+ if (!DO_ELIDE_CONDITION_CALC || desc->condition_calc_required())
+ UML_MOV(block, DRC_SR, I2);
UML_DSHR(block, I1, I0, 32);
UML_STORE(block, (void *)m_core->local_regs, I5, I1, SIZE_DWORD, SCALE_x4);
@@ -2433,26 +2613,39 @@ void hyperstone_device::generate_shl(drcuml_block &block, compiler_state &compil
UML_AND(block, I1, I0, 0x1f);
}
- UML_AND(block, I2, I2, ~(C_MASK | Z_MASK | N_MASK | V_MASK));
+ if (!DO_ELIDE_CONDITION_CALC || desc->condition_calc_required())
+ UML_AND(block, I2, I2, ~(C_MASK | Z_MASK | N_MASK | V_MASK));
- UML_SUB(block, I4, 32, I1);
- UML_SHR(block, I5, ~uint32_t(0), I4);
- UML_SHR(block, I4, I0, I4);
- UML_TEST(block, I1, 0xffffffff);
- UML_MOVc(block, uml::COND_Z, I4, 0);
- UML_MOVc(block, uml::COND_Z, I5, 0);
- UML_ROLINS(block, I2, I4, C_SHIFT, C_MASK);
+ if (!DO_ELIDE_CONDITION_CALC || (desc->c_calc_required() || desc->v_calc_required()))
+ {
+ UML_SUB(block, I4, 32, I1);
+ if (!DO_ELIDE_CONDITION_CALC || desc->v_calc_required())
+ UML_SHR(block, I5, ~uint32_t(0), I4);
+ UML_SHR(block, I4, I0, I4);
+ UML_TEST(block, I1, 0xffffffff);
+ UML_MOVc(block, uml::COND_Z, I4, 0);
+ if (!DO_ELIDE_CONDITION_CALC || desc->v_calc_required())
+ UML_MOVc(block, uml::COND_Z, I5, 0);
+ if (!DO_ELIDE_CONDITION_CALC || desc->c_calc_required())
+ UML_ROLINS(block, I2, I4, C_SHIFT, C_MASK);
+ }
UML_SHL(block, I0, I0, I1);
- UML_MOVc(block, uml::COND_NS, I5, 0);
- generate_update_nz(block, compiler, uml::I2);
+ if (!DO_ELIDE_CONDITION_CALC || desc->v_calc_required())
+ UML_MOVc(block, uml::COND_NS, I5, 0);
+ if (!DO_ELIDE_CONDITION_CALC || desc->condition_calc_required())
+ generate_update_nz(block, compiler, desc, uml::I2);
- UML_CMP(block, I4, I5);
- UML_MOV(block, I1, V_MASK);
- UML_MOVc(block, uml::COND_E, I1, 0);
- UML_OR(block, I2, I2, I1);
+ if (!DO_ELIDE_CONDITION_CALC || desc->v_calc_required())
+ {
+ UML_CMP(block, I4, I5);
+ UML_MOV(block, I1, V_MASK);
+ UML_MOVc(block, uml::COND_E, I1, 0);
+ UML_OR(block, I2, I2, I1);
+ }
- UML_MOV(block, DRC_SR, I2);
+ if (!DO_ELIDE_CONDITION_CALC || desc->condition_calc_required())
+ UML_MOV(block, DRC_SR, I2);
UML_STORE(block, (void *)m_core->local_regs, I3, I0, SIZE_DWORD, SCALE_x4);
}
@@ -2473,23 +2666,32 @@ void hyperstone_device::generate_shli(drcuml_block &block, compiler_state &compi
generate_load_operand(block, compiler, DstGlobal, dst_code, uml::I0, uml::I3);
- UML_AND(block, I2, I2, ~(C_MASK | Z_MASK | N_MASK | V_MASK));
- if (n)
+ if (!DO_ELIDE_CONDITION_CALC || desc->condition_calc_required())
+ UML_AND(block, I2, I2, ~(C_MASK | Z_MASK | N_MASK | V_MASK));
+ if (n && (!DO_ELIDE_CONDITION_CALC || desc->c_calc_required() || desc->v_calc_required()))
{
- UML_SHR(block, I4, I0, 32 - n);
- UML_MOV(block, I5, util::make_bitmask<uint32_t>(n));
- UML_ROLAND(block, I1, I4, C_SHIFT, C_MASK);
- UML_OR(block, I2, I2, I1);
+ if (!DO_ELIDE_CONDITION_CALC || desc->v_calc_required())
+ {
+ UML_SHR(block, I4, I0, 32 - n);
+ UML_MOV(block, I5, util::make_bitmask<uint32_t>(n));
+ if (!DO_ELIDE_CONDITION_CALC || desc->c_calc_required())
+ UML_ROLAND(block, I1, I4, C_SHIFT, C_MASK);
+ }
+ else
+ {
+ UML_ROLAND(block, I1, I0, n + C_SHIFT, C_MASK);
+ }
+ if (!DO_ELIDE_CONDITION_CALC || desc->c_calc_required())
+ UML_OR(block, I2, I2, I1);
}
UML_SHL(block, I0, I0, n);
- if (n)
- {
+ if (n && (!DO_ELIDE_CONDITION_CALC || desc->v_calc_required()))
UML_MOVc(block, uml::COND_NS, I5, 0);
- }
- generate_update_nz(block, compiler, uml::I2);
+ if (!DO_ELIDE_CONDITION_CALC || desc->condition_calc_required())
+ generate_update_nz(block, compiler, desc, uml::I2);
- if (n)
+ if (n && (!DO_ELIDE_CONDITION_CALC || desc->v_calc_required()))
{
UML_CMP(block, I4, I5);
UML_MOV(block, I1, V_MASK);
@@ -2497,7 +2699,8 @@ void hyperstone_device::generate_shli(drcuml_block &block, compiler_state &compi
UML_OR(block, I2, I2, I1);
}
- UML_MOV(block, DRC_SR, I2);
+ if (!DO_ELIDE_CONDITION_CALC || desc->condition_calc_required())
+ UML_MOV(block, DRC_SR, I2);
generate_set_dst(block, compiler, desc, DstGlobal, dst_code, uml::I0, uml::I3, false);
}
@@ -2544,26 +2747,38 @@ void hyperstone_device::generate_rol(drcuml_block &block, compiler_state &compil
UML_AND(block, I1, I0, 0x1f);
}
- UML_AND(block, I2, I2, ~(C_MASK | Z_MASK | N_MASK | V_MASK));
+ if (!DO_ELIDE_CONDITION_CALC || desc->condition_calc_required())
+ UML_AND(block, I2, I2, ~(C_MASK | Z_MASK | N_MASK | V_MASK));
- UML_SUB(block, I4, 32, I1);
- UML_SHR(block, I4, ~uint32_t(0), I4);
- UML_TEST(block, I1, 0xffffffff);
- UML_MOVc(block, uml::COND_Z, I4, 0);
- UML_MOV(block, I5, I4);
+ if (!DO_ELIDE_CONDITION_CALC || desc->c_calc_required() || desc->v_calc_required())
+ {
+ UML_SUB(block, I4, 32, I1);
+ UML_SHR(block, I4, ~uint32_t(0), I4);
+ UML_TEST(block, I1, 0xffffffff);
+ UML_MOVc(block, uml::COND_Z, I4, 0);
+ UML_MOV(block, I5, I4);
+ }
UML_ROL(block, I0, I0, I1);
- UML_MOVc(block, uml::COND_NS, I4, 0);
- generate_update_nz(block, compiler, uml::I2);
-
- UML_AND(block, I1, I5, I0);
- UML_ROLINS(block, I2, I1, C_SHIFT, C_MASK);
- UML_CMP(block, I4, I1);
- UML_MOV(block, I1, V_MASK);
- UML_MOVc(block, uml::COND_E, I1, 0);
- UML_OR(block, I2, I2, I1);
+ if (!DO_ELIDE_CONDITION_CALC || desc->v_calc_required())
+ UML_MOVc(block, uml::COND_NS, I4, 0);
+ if (!DO_ELIDE_CONDITION_CALC || desc->condition_calc_required())
+ generate_update_nz(block, compiler, desc, uml::I2);
+
+ if (!DO_ELIDE_CONDITION_CALC || desc->c_calc_required() || desc->v_calc_required())
+ UML_AND(block, I1, I5, I0);
+ if (!DO_ELIDE_CONDITION_CALC || desc->c_calc_required())
+ UML_ROLINS(block, I2, I1, C_SHIFT, C_MASK);
+ if (!DO_ELIDE_CONDITION_CALC || desc->v_calc_required())
+ {
+ UML_CMP(block, I4, I1);
+ UML_MOV(block, I1, V_MASK);
+ UML_MOVc(block, uml::COND_E, I1, 0);
+ UML_OR(block, I2, I2, I1);
+ }
- UML_MOV(block, DRC_SR, I2);
+ if (!DO_ELIDE_CONDITION_CALC || desc->condition_calc_required())
+ UML_MOV(block, DRC_SR, I2);
UML_STORE(block, (void *)m_core->local_regs, I3, I0, SIZE_DWORD, SCALE_x4);
}