diff options
author | 2025-03-22 04:32:22 +1100 | |
---|---|---|
committer | 2025-03-22 04:32:22 +1100 | |
commit | 3313c37cb3d051eee135dc38061038b3b5b6d47d (patch) | |
tree | dea66d97b25dd8a5ac821b6385f01a3f92a1f01e /src/devices/cpu | |
parent | 28e4809e883008d2093e586ba89d034e09f6d728 (diff) |
cpu/e132xs: More recompiler fixes:
* Cleaned up and commented code for generating an exception, reducing
about nine memory accesses to update SR to two.
* Implemented NEGS, and fixed ADDS and SUBS not setting excption handler
address.
* Optimised code to update Z flag on logic operations to avoid branches.
* Reduced copy/paste a bit more.
Diffstat (limited to 'src/devices/cpu')
-rw-r--r-- | src/devices/cpu/drcbex64.cpp | 2 | ||||
-rw-r--r-- | src/devices/cpu/e132xs/e132xs.h | 4 | ||||
-rw-r--r-- | src/devices/cpu/e132xs/e132xsdrc.cpp | 4 | ||||
-rw-r--r-- | src/devices/cpu/e132xs/e132xsdrc_ops.hxx | 336 |
4 files changed, 169 insertions, 177 deletions
diff --git a/src/devices/cpu/drcbex64.cpp b/src/devices/cpu/drcbex64.cpp index 46d6b27a179..af602c0dc50 100644 --- a/src/devices/cpu/drcbex64.cpp +++ b/src/devices/cpu/drcbex64.cpp @@ -1611,7 +1611,7 @@ void drcbe_x64::shift_op_param(Assembler &a, Inst::Id const opcode, size_t opsiz if (carryin) { - a.sahf(); // restore flags to keep carry for rolc/rorc + a.sahf(); // restore flags to keep carry in for rolc/rorc a.mov(rax, r10); } diff --git a/src/devices/cpu/e132xs/e132xs.h b/src/devices/cpu/e132xs/e132xs.h index 5ce7e5ce423..c97dda300e8 100644 --- a/src/devices/cpu/e132xs/e132xs.h +++ b/src/devices/cpu/e132xs/e132xs.h @@ -524,7 +524,9 @@ private: void generate_exception(drcuml_block &block, compiler_state &compiler, const opcode_desc *desc, uint32_t addr); void generate_software(drcuml_block &block, compiler_state &compiler, const opcode_desc *desc); - template <reg_bank DST_GLOBAL, typename T> void generate_logic_op(drcuml_block &block, compiler_state &compiler, const opcode_desc *desc, uint32_t dst_code, T &&body); + void generate_trap_on_overflow(drcuml_block &block, compiler_state &compiler, const opcode_desc *desc); + template <reg_bank DST_GLOBAL, reg_bank SRC_GLOBAL, typename T> void generate_logic_op(drcuml_block &block, compiler_state &compiler, const opcode_desc *desc, T &&body); + template <reg_bank DST_GLOBAL, typename T> void generate_logic_op_imm(drcuml_block &block, compiler_state &compiler, const opcode_desc *desc, uint32_t dst_code, T &&body); template <reg_bank DST_GLOBAL, reg_bank SRC_GLOBAL> void generate_chk(drcuml_block &block, compiler_state &compiler, const opcode_desc *desc); template <reg_bank DST_GLOBAL, reg_bank SRC_GLOBAL> void generate_movd(drcuml_block &block, compiler_state &compiler, const opcode_desc *desc); diff --git a/src/devices/cpu/e132xs/e132xsdrc.cpp b/src/devices/cpu/e132xs/e132xsdrc.cpp index a07b719b8fb..cc159af929c 100644 --- a/src/devices/cpu/e132xs/e132xsdrc.cpp +++ b/src/devices/cpu/e132xs/e132xsdrc.cpp @@ -193,10 +193,10 @@ void hyperstone_device::code_flush_cache() /* Return the entry point for a determinated trap */ void hyperstone_device::generate_get_trap_addr(drcuml_block &block, uml::code_label &label, uint32_t trapno) { - int no_subtract; + const int no_subtract = label++; UML_MOV(block, I0, trapno); UML_CMP(block, mem(&m_core->trap_entry), 0xffffff00); - UML_JMPc(block, uml::COND_E, no_subtract = label++); + UML_JMPc(block, uml::COND_E, no_subtract); UML_SUB(block, I0, 63, I0); UML_LABEL(block, no_subtract); diff --git a/src/devices/cpu/e132xs/e132xsdrc_ops.hxx b/src/devices/cpu/e132xs/e132xsdrc_ops.hxx index 98b491c4d04..defc901be15 100644 --- a/src/devices/cpu/e132xs/e132xsdrc_ops.hxx +++ b/src/devices/cpu/e132xs/e132xsdrc_ops.hxx @@ -440,34 +440,30 @@ void hyperstone_device::generate_trap_exception_or_int(drcuml_block &block) { UML_ADD(block, I7, I7, mem(&m_core->clock_cycles_2)); - UML_MOV(block, I4, DRC_SR); - - UML_ROLAND(block, I1, DRC_SR, 7, 0x7f); - UML_ROLAND(block, I2, DRC_SR, 11, 0xf); - UML_MOVc(block, uml::COND_Z, I2, 16); - UML_ADD(block, I3, I1, I2); - - if (TYPE != IS_TRAP) - UML_ROLINS(block, DRC_SR, 2, 21, 0x01e00000); - else - UML_ROLINS(block, DRC_SR, 6, 21, 0x01e00000); - UML_ROLINS(block, DRC_SR, I3, 25, 0xfe000000); - - UML_AND(block, I1, I3, 0x3f); + UML_MOV(block, I4, DRC_SR); // I4 = old SR + + UML_MOV(block, I1, I4); // I1 = SR to be updated + UML_ROLAND(block, I3, I4, 7, 0x7f); // I3 = old FP + UML_ROLAND(block, I2, I4, 11, 0xf); // I2 = old FL + UML_MOVc(block, uml::COND_Z, I2, 16); // convert FL == 0 to 16 + UML_ADD(block, I3, I3, I2); // I3 = updated FP + + UML_SHL(block, I2, I3, 25); // I2 = updated FP:... + UML_OR(block, I2, I2, ((TYPE != IS_TRAP) ? 2 : 6) << 21); // I2 = updated FP:FL:... + UML_ROLINS(block, I1, I2, 0, 0xffe00000); // update FP and FL in I1 + UML_AND(block, I1, I1, ~(M_MASK | T_MASK)); // clear M and T, set S and L, set I for INT + UML_OR(block, I1, I1, (TYPE == IS_INT) ? (L_MASK | S_MASK | I_MASK) : (L_MASK | S_MASK)); + UML_MOV(block, DRC_SR, I1); // store updated SR + + UML_AND(block, I3, I3, 0x3f); // save old PC at updated (FP)^ UML_AND(block, I2, DRC_PC, ~uint32_t(1)); - UML_ROLINS(block, I2, DRC_SR, 32-S_SHIFT, 1); - UML_STORE(block, (void *)m_core->local_regs, I1, I2, SIZE_DWORD, SCALE_x4); - UML_ADD(block, I2, I1, 1); - UML_AND(block, I3, I2, 0x3f); + UML_ROLINS(block, I2, I4, 32 - S_SHIFT, 1); + UML_STORE(block, (void *)m_core->local_regs, I3, I2, SIZE_DWORD, SCALE_x4); + UML_ADD(block, I3, I3, 1); // save old SR at updated (FP + 1)^ + UML_AND(block, I3, I3, 0x3f); UML_STORE(block, (void *)m_core->local_regs, I3, I4, SIZE_DWORD, SCALE_x4); - UML_AND(block, DRC_SR, DRC_SR, ~(M_MASK | T_MASK)); - if (TYPE == IS_INT) - UML_OR(block, DRC_SR, DRC_SR, (L_MASK | S_MASK | I_MASK)); - else - UML_OR(block, DRC_SR, DRC_SR, (L_MASK | S_MASK)); - - UML_MOV(block, DRC_PC, I0); + UML_MOV(block, DRC_PC, I0); // branch to exception handler generate_branch(block, DRC_PC, nullptr, true); } @@ -566,28 +562,76 @@ void hyperstone_device::generate_software(drcuml_block &block, compiler_state &c +void hyperstone_device::generate_trap_on_overflow(drcuml_block &block, compiler_state &compiler, const opcode_desc *desc) +{ + const int no_exception = compiler.m_labelnum++; + UML_TEST(block, DRC_SR, V_MASK); + UML_JMPc(block, uml::COND_Z, no_exception); + UML_ROLINS(block, DRC_SR, ((desc->length >> 1) << ILC_SHIFT), 0, ILC_MASK); + generate_get_trap_addr(block, compiler.m_labelnum, TRAPNO_RANGE_ERROR); + generate_trap_exception_or_int<IS_EXCEPTION>(block); + UML_LABEL(block, no_exception); +} + + +template <hyperstone_device::reg_bank DST_GLOBAL, hyperstone_device::reg_bank SRC_GLOBAL, typename T> +inline void hyperstone_device::generate_logic_op(drcuml_block &block, compiler_state &compiler, const opcode_desc *desc, T &&body) +{ + // body takes operands in I0 and I0 and should update I0 and set Z flag + // body must not clobber I2 or I3 + + UML_MOV(block, I7, mem(&m_core->clock_cycles_1)); + + const uint16_t op = desc->opptr.w[0]; + + generate_check_delay_pc(block, compiler, desc); + + const uint32_t dst_code = (op & 0xf0) >> 4; + const uint32_t src_code = op & 0xf; + + UML_MOV(block, I2, DRC_SR); + if (!SRC_GLOBAL || !DST_GLOBAL) + UML_ROLAND(block, I3, I2, 7, 0x7f); + + generate_load_operand(block, compiler, SRC_GLOBAL, src_code, uml::I1, uml::I1); + generate_load_operand(block, compiler, DST_GLOBAL, dst_code, uml::I0, uml::I3); + + body(); + + UML_SETc(block, uml::COND_Z, I1); + UML_ROLINS(block, I2, I1, Z_SHIFT, Z_MASK); + UML_MOV(block, DRC_SR, I2); + + generate_set_dst(block, compiler, desc, DST_GLOBAL, dst_code, uml::I0, uml::I3, false); +} + + template <hyperstone_device::reg_bank DST_GLOBAL, typename T> -inline void hyperstone_device::generate_logic_op(drcuml_block &block, compiler_state &compiler, const opcode_desc *desc, uint32_t dst_code, T &&body) +inline void hyperstone_device::generate_logic_op_imm(drcuml_block &block, compiler_state &compiler, const opcode_desc *desc, uint32_t dst_code, T &&body) { - // clobbers I0, I1 and I3, body should update I0 and set Z flag + // clobbers I0, I1 and I3 + // body should update I0 and set Z flag + // body must not clobber I2 or I3 generate_check_delay_pc(block, compiler, desc); + UML_MOV(block, I2, DRC_SR); if (!DST_GLOBAL) - UML_ROLAND(block, I3, DRC_SR, 7, 0x7f); + UML_ROLAND(block, I3, I2, 7, 0x7f); generate_load_operand(block, compiler, DST_GLOBAL, dst_code, uml::I0, uml::I3); body(); - UML_MOVc(block, uml::COND_Z, I1, Z_MASK); - UML_MOVc(block, uml::COND_NZ, I1, 0); - UML_ROLINS(block, DRC_SR, I1, 0, Z_MASK); + UML_SETc(block, uml::COND_Z, I1); + UML_ROLINS(block, I2, I1, Z_SHIFT, Z_MASK); + UML_MOV(block, DRC_SR, I2); generate_set_dst(block, compiler, desc, DST_GLOBAL, dst_code, uml::I0, uml::I3, false); } + template <hyperstone_device::reg_bank DST_GLOBAL, hyperstone_device::reg_bank SRC_GLOBAL> void hyperstone_device::generate_chk(drcuml_block &block, compiler_state &compiler, const opcode_desc *desc) { @@ -883,9 +927,9 @@ void hyperstone_device::generate_divsu(drcuml_block &block, compiler_state &comp UML_DDIVU(block, I2, I4, I1, I0); UML_AND(block, I3, DRC_SR, ~(V_MASK | Z_MASK | N_MASK)); - UML_TEST(block, I2, ~0); - UML_MOVc(block, uml::COND_Z, I0, Z_MASK); - UML_MOVc(block, uml::COND_NZ, I0, 0); + UML_TEST(block, I2, ~uint32_t(0)); + UML_SETc(block, uml::COND_Z, I0); + UML_SHL(block, I0, I0, Z_SHIFT); UML_ROLINS(block, I0, I2, 3, N_MASK); UML_OR(block, DRC_SR, I3, I0); @@ -1012,15 +1056,16 @@ void hyperstone_device::generate_mask(drcuml_block &block, compiler_state &compi generate_check_delay_pc(block, compiler, desc); + UML_MOV(block, I2, DRC_SR); if (!SRC_GLOBAL || !DST_GLOBAL) - UML_ROLAND(block, I3, DRC_SR, 7, 0x7f); + UML_ROLAND(block, I3, I2, 7, 0x7f); generate_load_operand(block, compiler, SRC_GLOBAL, src_code, uml::I0, uml::I0); UML_AND(block, I0, I0, src); - UML_MOVc(block, uml::COND_Z, I1, Z_MASK); - UML_MOVc(block, uml::COND_NZ, I1, 0); - UML_ROLINS(block, DRC_SR, I1, 0, Z_MASK); + UML_SETc(block, uml::COND_Z, I1); + UML_ROLINS(block, I2, I1, Z_SHIFT, Z_MASK); + UML_MOV(block, DRC_SR, I2); generate_set_dst(block, compiler, desc, DST_GLOBAL, dst_code, uml::I0, uml::I3, true); } @@ -1244,13 +1289,7 @@ void hyperstone_device::generate_adds(drcuml_block &block, compiler_state &compi UML_MOV(block, DRC_SR, I2); generate_set_dst(block, compiler, desc, DST_GLOBAL, dst_code, uml::I0, uml::I3, false); - - const int no_exception = compiler.m_labelnum++; - UML_TEST(block, DRC_SR, V_MASK); - UML_JMPc(block, uml::COND_Z, no_exception); - UML_ROLINS(block, DRC_SR, ((desc->length >> 1) << ILC_SHIFT), 0, ILC_MASK); - generate_trap_exception_or_int<IS_EXCEPTION>(block); - UML_LABEL(block, no_exception); + generate_trap_on_overflow(block, compiler, desc); } @@ -1363,13 +1402,7 @@ void hyperstone_device::generate_subs(drcuml_block &block, compiler_state &compi UML_MOV(block, DRC_SR, I2); generate_set_dst(block, compiler, desc, DST_GLOBAL, dst_code, uml::I0, uml::I3, false); - - const int no_exception = compiler.m_labelnum++; - UML_TEST(block, DRC_SR, V_MASK); - UML_JMPc(block, uml::COND_Z, no_exception); - UML_ROLINS(block, DRC_SR, ((desc->length >> 1) << ILC_SHIFT), 0, ILC_MASK); - generate_trap_exception_or_int<IS_EXCEPTION>(block); - UML_LABEL(block, no_exception); + generate_trap_on_overflow(block, compiler, desc); } @@ -1438,15 +1471,6 @@ void hyperstone_device::generate_neg(drcuml_block &block, compiler_state &compil template <hyperstone_device::reg_bank DST_GLOBAL, hyperstone_device::reg_bank SRC_GLOBAL> void hyperstone_device::generate_negs(drcuml_block &block, compiler_state &compiler, const opcode_desc *desc) { - osd_printf_error("Unimplemented: generate_negs (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template <hyperstone_device::reg_bank DST_GLOBAL, hyperstone_device::reg_bank SRC_GLOBAL> -void hyperstone_device::generate_and(drcuml_block &block, compiler_state &compiler, const opcode_desc *desc) -{ UML_MOV(block, I7, mem(&m_core->clock_cycles_1)); const uint16_t op = desc->opptr.w[0]; @@ -1456,100 +1480,65 @@ void hyperstone_device::generate_and(drcuml_block &block, compiler_state &compil const uint32_t dst_code = (op & 0xf0) >> 4; const uint32_t src_code = op & 0xf; + UML_MOV(block, I2, DRC_SR); if (!SRC_GLOBAL || !DST_GLOBAL) - UML_ROLAND(block, I3, DRC_SR, 7, 0x7f); + UML_ROLAND(block, I3, I2, 7, 0x7f); - generate_load_operand(block, compiler, SRC_GLOBAL, src_code, uml::I1, uml::I1); - generate_load_operand(block, compiler, DST_GLOBAL, dst_code, uml::I0, uml::I3); + generate_load_src_addsub(block, compiler, SRC_GLOBAL, src_code, uml::I0, uml::I0, uml::I2); - UML_AND(block, I0, I0, I1); - UML_MOVc(block, uml::COND_Z, I1, Z_MASK); - UML_MOVc(block, uml::COND_NZ, I1, 0); - UML_ROLINS(block, DRC_SR, I1, 0, Z_MASK); + UML_SUB(block, I0, 0, I0); - generate_set_dst(block, compiler, desc, DST_GLOBAL, dst_code, uml::I0, uml::I3, false); + generate_update_flags_addsubs(block, compiler, uml::I2); + UML_MOV(block, DRC_SR, I2); + + generate_set_dst(block, compiler, desc, DST_GLOBAL, dst_code, uml::I0, uml::I3, true); + + if (!SRC_GLOBAL || (src_code != SR_REGISTER)) // negating carry cannot result in overflow + generate_trap_on_overflow(block, compiler, desc); } template <hyperstone_device::reg_bank DST_GLOBAL, hyperstone_device::reg_bank SRC_GLOBAL> -void hyperstone_device::generate_andn(drcuml_block &block, compiler_state &compiler, const opcode_desc *desc) +void hyperstone_device::generate_and(drcuml_block &block, compiler_state &compiler, const opcode_desc *desc) { - UML_MOV(block, I7, mem(&m_core->clock_cycles_1)); - - const uint16_t op = desc->opptr.w[0]; - - generate_check_delay_pc(block, compiler, desc); - - const uint32_t dst_code = (op & 0xf0) >> 4; - const uint32_t src_code = op & 0xf; - - if (!SRC_GLOBAL || !DST_GLOBAL) - UML_ROLAND(block, I3, DRC_SR, 7, 0x7f); - - generate_load_operand(block, compiler, SRC_GLOBAL, src_code, uml::I1, uml::I1); - generate_load_operand(block, compiler, DST_GLOBAL, dst_code, uml::I0, uml::I3); + generate_logic_op<DST_GLOBAL, SRC_GLOBAL>( + block, + compiler, + desc, + [&block] () { UML_AND(block, I0, I0, I1); }); +} - UML_XOR(block, I1, I1, ~uint32_t(0)); - UML_AND(block, I0, I0, I1); - UML_MOVc(block, uml::COND_Z, I1, Z_MASK); - UML_MOVc(block, uml::COND_NZ, I1, 0); - UML_ROLINS(block, DRC_SR, I1, 0, Z_MASK); - generate_set_dst(block, compiler, desc, DST_GLOBAL, dst_code, uml::I0, uml::I3, false); +template <hyperstone_device::reg_bank DST_GLOBAL, hyperstone_device::reg_bank SRC_GLOBAL> +void hyperstone_device::generate_andn(drcuml_block &block, compiler_state &compiler, const opcode_desc *desc) +{ + generate_logic_op<DST_GLOBAL, SRC_GLOBAL>( + block, + compiler, + desc, + [&block] () { UML_XOR(block, I1, I1, ~uint32_t(0)); UML_AND(block, I0, I0, I1); }); } template <hyperstone_device::reg_bank DST_GLOBAL, hyperstone_device::reg_bank SRC_GLOBAL> void hyperstone_device::generate_or(drcuml_block &block, compiler_state &compiler, const opcode_desc *desc) { - UML_MOV(block, I7, mem(&m_core->clock_cycles_1)); - - const uint16_t op = desc->opptr.w[0]; - - generate_check_delay_pc(block, compiler, desc); - - const uint32_t dst_code = (op & 0xf0) >> 4; - const uint32_t src_code = op & 0xf; - - if (!SRC_GLOBAL || !DST_GLOBAL) - UML_ROLAND(block, I3, DRC_SR, 7, 0x7f); - - generate_load_operand(block, compiler, SRC_GLOBAL, src_code, uml::I1, uml::I1); - generate_load_operand(block, compiler, DST_GLOBAL, dst_code, uml::I0, uml::I3); - - UML_OR(block, I0, I0, I1); - UML_MOVc(block, uml::COND_Z, I1, Z_MASK); - UML_MOVc(block, uml::COND_NZ, I1, 0); - UML_ROLINS(block, DRC_SR, I1, 0, Z_MASK); - - generate_set_dst(block, compiler, desc, DST_GLOBAL, dst_code, uml::I0, uml::I3, false); + generate_logic_op<DST_GLOBAL, SRC_GLOBAL>( + block, + compiler, + desc, + [&block] () { UML_OR(block, I0, I0, I1); }); } template <hyperstone_device::reg_bank DST_GLOBAL, hyperstone_device::reg_bank SRC_GLOBAL> void hyperstone_device::generate_xor(drcuml_block &block, compiler_state &compiler, const opcode_desc *desc) { - UML_MOV(block, I7, mem(&m_core->clock_cycles_1)); - - const uint16_t op = desc->opptr.w[0]; - - generate_check_delay_pc(block, compiler, desc); - - const uint32_t dst_code = (op & 0xf0) >> 4; - const uint32_t src_code = op & 0xf; - - if (!SRC_GLOBAL || !DST_GLOBAL) - UML_ROLAND(block, I3, DRC_SR, 7, 0x7f); - - generate_load_operand(block, compiler, SRC_GLOBAL, src_code, uml::I1, uml::I1); - generate_load_operand(block, compiler, DST_GLOBAL, dst_code, uml::I0, uml::I3); - - UML_XOR(block, I0, I0, I1); - UML_MOVc(block, uml::COND_Z, I1, Z_MASK); - UML_MOVc(block, uml::COND_NZ, I1, 0); - UML_ROLINS(block, DRC_SR, I1, 0, Z_MASK); - - generate_set_dst(block, compiler, desc, DST_GLOBAL, dst_code, uml::I0, uml::I3, false); + generate_logic_op<DST_GLOBAL, SRC_GLOBAL>( + block, + compiler, + desc, + [&block] () { UML_XOR(block, I0, I0, I1); }); } @@ -1565,15 +1554,16 @@ void hyperstone_device::generate_not(drcuml_block &block, compiler_state &compil const uint32_t dst_code = (op & 0xf0) >> 4; const uint32_t src_code = op & 0xf; + UML_MOV(block, I2, DRC_SR); if (!SRC_GLOBAL || !DST_GLOBAL) - UML_ROLAND(block, I3, DRC_SR, 7, 0x7f); + UML_ROLAND(block, I3, I2, 7, 0x7f); generate_load_operand(block, compiler, SRC_GLOBAL, src_code, uml::I0, uml::I0); UML_XOR(block, I0, I0, ~uint32_t(0)); - UML_MOVc(block, uml::COND_Z, I1, Z_MASK); - UML_MOVc(block, uml::COND_NZ, I1, 0); - UML_ROLINS(block, DRC_SR, I1, 0, Z_MASK); + UML_SETc(block, uml::COND_Z, I1); + UML_ROLINS(block, I2, I1, Z_SHIFT, Z_MASK); + UML_MOV(block, DRC_SR, I2); generate_set_dst(block, compiler, desc, DST_GLOBAL, dst_code, uml::I0, uml::I3, true); } @@ -1816,7 +1806,7 @@ void hyperstone_device::generate_andni(drcuml_block &block, compiler_state &comp src = op & 0x0f; src = ~src; - generate_logic_op<DST_GLOBAL>( + generate_logic_op_imm<DST_GLOBAL>( block, compiler, desc, @@ -1838,7 +1828,7 @@ void hyperstone_device::generate_ori(drcuml_block &block, compiler_state &compil else src = op & 0x0f; - generate_logic_op<DST_GLOBAL>( + generate_logic_op_imm<DST_GLOBAL>( block, compiler, desc, @@ -1860,7 +1850,7 @@ void hyperstone_device::generate_xori(drcuml_block &block, compiler_state &compi else src = op & 0x0f; - generate_logic_op<DST_GLOBAL>( + generate_logic_op_imm<DST_GLOBAL>( block, compiler, desc, @@ -1907,9 +1897,9 @@ void hyperstone_device::generate_shrdi(drcuml_block &block, compiler_state &comp UML_DSHR(block, I2, I2, n); } - UML_DTEST(block, I2, ~0ULL); - UML_MOVc(block, uml::COND_Z, I5, Z_MASK); - UML_MOVc(block, uml::COND_NZ, I5, 0); + UML_DTEST(block, I2, ~uint64_t(0)); + UML_SETc(block, uml::COND_Z, I5); + UML_SHL(block, I5, I5, Z_SHIFT); UML_DROLINS(block, I5, I2, 3, N_MASK); UML_OR(block, DRC_SR, I4, I5); @@ -2016,8 +2006,8 @@ void hyperstone_device::generate_shr(drcuml_block &block, compiler_state &compil UML_LABEL(block, no_shift); UML_TEST(block, I0, ~uint32_t(0)); - UML_MOVc(block, uml::COND_Z, I2, Z_MASK); - UML_MOVc(block, uml::COND_NZ, I2, 0); + UML_SETc(block, uml::COND_Z, I2); + UML_SHL(block, I2, I2, Z_SHIFT); UML_ROLINS(block, I2, I0, 3, N_MASK); UML_OR(block, DRC_SR, I2, I3); @@ -2047,8 +2037,8 @@ void hyperstone_device::generate_shri(drcuml_block &block, compiler_state &compi UML_ROLINS(block, I1, I0, 32 - (n - 1), 1); UML_SHR(block, I0, I0, n); - UML_MOVc(block, uml::COND_Z, I2, Z_MASK); - UML_MOVc(block, uml::COND_NZ, I2, 0); + UML_SETc(block, uml::COND_Z, I2); + UML_SHL(block, I2, I2, Z_SHIFT); UML_ROLINS(block, I2, I0, 3, N_MASK); UML_OR(block, DRC_SR, I1, I2); @@ -2098,9 +2088,9 @@ void hyperstone_device::generate_sardi(drcuml_block &block, compiler_state &comp UML_DSAR(block, I2, I2, n); } - UML_DTEST(block, I2, ~0ULL); - UML_MOVc(block, uml::COND_Z, I5, Z_MASK); - UML_MOVc(block, uml::COND_NZ, I5, 0); + UML_DTEST(block, I2, ~uint64_t(0)); + UML_SETc(block, uml::COND_Z, I5); + UML_SHL(block, I5, I5, Z_SHIFT); UML_DROLINS(block, I5, I2, 3, N_MASK); UML_OR(block, DRC_SR, I4, I5); @@ -2242,9 +2232,9 @@ void hyperstone_device::generate_sari(drcuml_block &block, compiler_state &compi UML_SAR(block, I0, I0, n); } - UML_TEST(block, I0, ~0); - UML_MOVc(block, uml::COND_Z, I3, Z_MASK); - UML_MOVc(block, uml::COND_NZ, I3, 0); + UML_TEST(block, I0, ~uint32_t(0)); + UML_SETc(block, uml::COND_Z, I3); + UML_SHL(block, I3, I3, Z_SHIFT); UML_OR(block, I2, I2, I3); UML_ROLINS(block, I2, I0, 3, N_MASK); UML_ROLINS(block, DRC_SR, I2, 0, (C_MASK | Z_MASK | N_MASK)); @@ -2308,9 +2298,9 @@ void hyperstone_device::generate_shldi(drcuml_block &block, compiler_state &comp UML_OR(block, I4, I4, V_MASK); UML_LABEL(block, no_overflow); - UML_DTEST(block, I0, ~0ULL); - UML_MOVc(block, uml::COND_Z, I1, Z_MASK); - UML_MOVc(block, uml::COND_NZ, I1, 0); + UML_DTEST(block, I0, ~uint64_t(0)); + UML_SETc(block, uml::COND_Z, I1); + UML_SHL(block, I1, I1, Z_SHIFT); UML_DROLINS(block, I1, I0, 3, N_MASK); UML_OR(block, I1, I1, I4); UML_ROLINS(block, DRC_SR, I1, 0, (N_MASK | Z_MASK | V_MASK)); @@ -2381,9 +2371,9 @@ void hyperstone_device::generate_shld(drcuml_block &block, compiler_state &compi UML_OR(block, I4, I4, V_MASK); UML_LABEL(block, no_overflow); - UML_DTEST(block, I0, ~0ULL); - UML_MOVc(block, uml::COND_Z, I1, Z_MASK); - UML_MOVc(block, uml::COND_NZ, I1, 0); + UML_DTEST(block, I0, ~uint64_t(0)); + UML_SETc(block, uml::COND_Z, I1); + UML_SHL(block, I1, I1, Z_SHIFT); UML_DROLINS(block, I1, I0, 3, N_MASK); UML_OR(block, I1, I1, I4); UML_ROLINS(block, DRC_SR, I1, 0, (N_MASK | Z_MASK | V_MASK)); @@ -2446,9 +2436,9 @@ void hyperstone_device::generate_shl(drcuml_block &block, compiler_state &compil UML_OR(block, I6, I6, V_MASK); UML_LABEL(block, done_shift); - UML_TEST(block, I0, ~0); - UML_MOVc(block, uml::COND_Z, I5, Z_MASK); - UML_MOVc(block, uml::COND_NZ, I5, 0); + UML_TEST(block, I0, ~uint32_t(0)); + UML_SETc(block, uml::COND_Z, I5); + UML_SHL(block, I5, I5, Z_SHIFT); UML_ROLINS(block, I5, I0, 3, N_MASK); UML_OR(block, DRC_SR, I5, I6); @@ -2513,9 +2503,9 @@ void hyperstone_device::generate_shli(drcuml_block &block, compiler_state &compi UML_OR(block, I1, I1, V_MASK); UML_LABEL(block, done_v); - UML_TEST(block, I5, ~0); - UML_MOVc(block, uml::COND_Z, I2, Z_MASK); - UML_MOVc(block, uml::COND_NZ, I2, 0); + UML_TEST(block, I5, ~uint32_t(0)); + UML_SETc(block, uml::COND_Z, I2); + UML_SHL(block, I2, I2, Z_SHIFT); UML_ROLINS(block, I2, I5, 3, N_MASK); UML_OR(block, DRC_SR, I1, I2); @@ -2596,9 +2586,9 @@ void hyperstone_device::generate_rol(drcuml_block &block, compiler_state &compil UML_OR(block, I6, I6, V_MASK); UML_LABEL(block, done_shift); - UML_TEST(block, I2, ~0); - UML_MOVc(block, uml::COND_Z, I5, Z_MASK); - UML_MOVc(block, uml::COND_NZ, I5, 0); + UML_TEST(block, I2, ~uint32_t(0)); + UML_SETc(block, uml::COND_Z, I5); + UML_SHL(block, I5, I5, Z_SHIFT); UML_ROLINS(block, I5, I2, 3, N_MASK); UML_OR(block, I5, I5, I6); @@ -3473,9 +3463,9 @@ void hyperstone_device::generate_mulsu(drcuml_block &block, compiler_state &comp UML_MULU(block, I4, I5, I0, I1); UML_OR(block, I2, I4, I5); - UML_TEST(block, I2, ~0); - UML_MOVc(block, uml::COND_NZ, I2, 0); - UML_MOVc(block, uml::COND_Z, I2, Z_MASK); + UML_TEST(block, I2, ~uint32_t(0)); + UML_SETc(block, uml::COND_Z, I2); + UML_SHL(block, I2, I2, Z_SHIFT); UML_ROLINS(block, I2, I5, 3, N_MASK); UML_ROLINS(block, DRC_SR, I2, 0, (N_MASK | Z_MASK)); @@ -3558,9 +3548,9 @@ void hyperstone_device::generate_mul(drcuml_block &block, compiler_state &compil UML_MULU(block, I2, I3, I0, I1); UML_AND(block, I4, DRC_SR, ~(Z_MASK | N_MASK)); - UML_TEST(block, I2, ~0); - UML_MOVc(block, uml::COND_Z, I5, Z_MASK); - UML_MOVc(block, uml::COND_NZ, I5, 0); + UML_TEST(block, I2, ~uint32_t(0)); + UML_SETc(block, uml::COND_Z, I5); + UML_SHL(block, I5, I5, Z_SHIFT); UML_ROLINS(block, I5, I2, 3, N_MASK); UML_ROLINS(block, DRC_SR, I5, 0, (Z_MASK | N_MASK)); |