From 495df453156dd73e6767a04c563011b657406cc1 Mon Sep 17 00:00:00 2001 From: mooglyguy Date: Sun, 19 Nov 2017 14:23:38 +0100 Subject: e132xs: initial drc work, and templated conditional db/b, nw --- scripts/src/cpu.lua | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'scripts/src/cpu.lua') diff --git a/scripts/src/cpu.lua b/scripts/src/cpu.lua index 35e27b3e97f..dad6fe50a1a 100644 --- a/scripts/src/cpu.lua +++ b/scripts/src/cpu.lua @@ -13,7 +13,7 @@ -- Dynamic recompiler objects -------------------------------------------------- -if (CPUS["SH"]~=null or CPUS["MIPS"]~=null or CPUS["POWERPC"]~=null or CPUS["RSP"]~=null or CPUS["ARM7"]~=null or CPUS["ADSP21062"]~=null or CPUS["MB86235"]~=null) then +if (CPUS["SH"]~=null or CPUS["MIPS"]~=null or CPUS["POWERPC"]~=null or CPUS["RSP"]~=null or CPUS["ARM7"]~=null or CPUS["ADSP21062"]~=null or CPUS["MB86235"]~=null or CPUS["E1"]~=null) then files { MAME_DIR .. "src/devices/cpu/drcbec.cpp", MAME_DIR .. "src/devices/cpu/drcbec.h", @@ -808,6 +808,10 @@ if (CPUS["E1"]~=null) then files { MAME_DIR .. "src/devices/cpu/e132xs/e132xs.cpp", MAME_DIR .. "src/devices/cpu/e132xs/e132xs.h", + MAME_DIR .. "src/devices/cpu/e132xs/e132xsfe.cpp", + MAME_DIR .. "src/devices/cpu/e132xs/e132xsfe.h", + MAME_DIR .. "src/devices/cpu/e132xs/e132xsdrc.cpp", + MAME_DIR .. "src/devices/cpu/e132xs/e132xsdrc_ops.cpp", MAME_DIR .. "src/devices/cpu/e132xs/32xsdefs.h", MAME_DIR .. "src/devices/cpu/e132xs/e132xsop.hxx", } @@ -1016,7 +1020,7 @@ if (CPUS["I86"]~=null) then } end -if (CPUS["SH"]~=null or CPUS["MIPS"]~=null or CPUS["POWERPC"]~=null or CPUS["RSP"]~=null or CPUS["ARM7"]~=null or CPUS["ADSP21062"]~=null or CPUS["MB86235"]~=null or CPUS["I86"]~=null or CPUS["I386"]~=null or _OPTIONS["with-tools"]) then +if (CPUS["E1"]~=null or CPUS["SH"]~=null or CPUS["MIPS"]~=null or CPUS["POWERPC"]~=null or CPUS["RSP"]~=null or CPUS["ARM7"]~=null or CPUS["ADSP21062"]~=null or CPUS["MB86235"]~=null or CPUS["I86"]~=null or CPUS["I386"]~=null or _OPTIONS["with-tools"]) then table.insert(disasm_files , MAME_DIR .. "src/devices/cpu/i386/i386dasm.cpp") table.insert(disasm_files , MAME_DIR .. "src/devices/cpu/i386/i386dasm.h") end -- cgit v1.2.3-70-g09d2 From bccc962b69ea4f5db5ff4ae912db233775cecd00 Mon Sep 17 00:00:00 2001 From: mooglyguy Date: Thu, 23 Nov 2017 15:14:13 +0100 Subject: e132xs: initial work on drc, nw --- scripts/src/cpu.lua | 2 +- src/devices/cpu/e132xs/32xsdasm.cpp | 20 +- src/devices/cpu/e132xs/32xsdefs.h | 30 +- src/devices/cpu/e132xs/e132xs.cpp | 23 +- src/devices/cpu/e132xs/e132xs.h | 248 ++++--- src/devices/cpu/e132xs/e132xsdefs.h | 79 --- src/devices/cpu/e132xs/e132xsdrc.cpp | 691 ++++++++++++-------- src/devices/cpu/e132xs/e132xsdrc_ops.cpp | 1035 ------------------------------ src/devices/cpu/e132xs/e132xsdrc_ops.hxx | 575 +++++++++++++++++ src/devices/cpu/e132xs/e132xsfe.cpp | 49 +- src/devices/cpu/e132xs/e132xsfe.h | 1 + src/devices/cpu/e132xs/e132xsop.hxx | 58 +- 12 files changed, 1206 insertions(+), 1605 deletions(-) delete mode 100644 src/devices/cpu/e132xs/e132xsdefs.h delete mode 100644 src/devices/cpu/e132xs/e132xsdrc_ops.cpp create mode 100644 src/devices/cpu/e132xs/e132xsdrc_ops.hxx (limited to 'scripts/src/cpu.lua') diff --git a/scripts/src/cpu.lua b/scripts/src/cpu.lua index dad6fe50a1a..69d70d8b237 100644 --- a/scripts/src/cpu.lua +++ b/scripts/src/cpu.lua @@ -811,7 +811,7 @@ if (CPUS["E1"]~=null) then MAME_DIR .. "src/devices/cpu/e132xs/e132xsfe.cpp", MAME_DIR .. "src/devices/cpu/e132xs/e132xsfe.h", MAME_DIR .. "src/devices/cpu/e132xs/e132xsdrc.cpp", - MAME_DIR .. "src/devices/cpu/e132xs/e132xsdrc_ops.cpp", + MAME_DIR .. "src/devices/cpu/e132xs/e132xsdrc_ops.hxx", MAME_DIR .. "src/devices/cpu/e132xs/32xsdefs.h", MAME_DIR .. "src/devices/cpu/e132xs/e132xsop.hxx", } diff --git a/src/devices/cpu/e132xs/32xsdasm.cpp b/src/devices/cpu/e132xs/32xsdasm.cpp index 2060350c5b8..aa4dcc912eb 100644 --- a/src/devices/cpu/e132xs/32xsdasm.cpp +++ b/src/devices/cpu/e132xs/32xsdasm.cpp @@ -396,27 +396,25 @@ u32 hyperstone_disassembler::opcode_alignment() const /*****************************/ offs_t hyperstone_disassembler::disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer ¶ms) { - uint16_t op; - uint8_t op_num; - - uint8_t source_code, dest_code, source_bit, dest_bit; - char source[5] = "\0", dest[5] = "\0"; uint32_t flags = 0; - op = opcodes.r16(pc); + base_pc = pc; + base_oprom = oprom; + + uint16_t op = READ_OP_DASM(pc); size = 2; - source_code = SOURCECODE(op); - dest_code = DESTCODE(op); - source_bit = SOURCEBIT(op); - dest_bit = DESTBIT(op); + uint8_t source_code = SOURCECODE(op); + uint8_t dest_code = DESTCODE(op); + uint8_t source_bit = SOURCEBIT(op); + uint8_t dest_bit = DESTBIT(op); global_fp = 0; int h_flag = 0; - op_num = (op & 0xff00) >> 8; + uint8_t op_num = (op & 0xff00) >> 8; switch( op_num ) { diff --git a/src/devices/cpu/e132xs/32xsdefs.h b/src/devices/cpu/e132xs/32xsdefs.h index a4a5ff876df..943bb4911e6 100644 --- a/src/devices/cpu/e132xs/32xsdefs.h +++ b/src/devices/cpu/e132xs/32xsdefs.h @@ -125,27 +125,6 @@ /* Internal registers */ -#define SREG decode.src_value -#define SREGF decode.next_src_value -#define DREG decode.dst_value -#define DREGF decode.next_dst_value -#define EXTRA_U decode.extra.u -#define EXTRA_S decode.extra.s - -#define SET_SREG( _data_ ) (decode.src_is_local ? set_local_register(decode.src, (uint32_t)_data_) : set_global_register(decode.src, (uint32_t)_data_)) -#define SET_SREGF( _data_ ) (decode.src_is_local ? set_local_register(decode.src + 1, (uint32_t)_data_) : set_global_register(decode.src + 1, (uint32_t)_data_)) -#define SET_DREG( _data_ ) (decode.dst_is_local ? set_local_register(decode.dst, (uint32_t)_data_) : set_global_register(decode.dst, (uint32_t)_data_)) -#define SET_DREGF( _data_ ) (decode.dst_is_local ? set_local_register(decode.dst + 1, (uint32_t)_data_) : set_global_register(decode.dst + 1, (uint32_t)_data_)) - -#define SRC_IS_PC (!decode.src_is_local && decode.src == PC_REGISTER) -#define DST_IS_PC (!decode.dst_is_local && decode.dst == PC_REGISTER) -#define SRC_IS_SR (!decode.src_is_local && decode.src == SR_REGISTER) -#define DST_IS_SR (!decode.dst_is_local && decode.dst == SR_REGISTER) -#define SAME_SRC_DST decode.same_src_dst -#define SAME_SRC_DSTF decode.same_src_dstf -#define SAME_SRCF_DST decode.same_srcf_dst - - #define OP m_op #define PC m_global_regs[0] //Program Counter #define SR m_global_regs[1] //Status Register @@ -175,6 +154,7 @@ #define T_MASK 0x00010000 #define P_MASK 0x00020000 #define S_MASK 0x00040000 +#define ILC_MASK 0x00180000 /* SR flags */ #define GET_C ( SR & C_MASK) // bit 0 //CARRY @@ -220,17 +200,11 @@ #define SET_LOW_SR(val) (SR = (SR & 0xffff0000) | ((val) & 0x0000ffff)) // when SR is addressed, only low 16 bits can be changed -#define CHECK_C(x) (SR = (SR & ~0x00000001) | (uint32_t)((x & 0x100000000L) >> 32)) -#define CHECK_VADD(x,y,z) (SR = (SR & ~0x00000008) | ((((x) ^ (z)) & ((y) ^ (z)) & 0x80000000) >> 29)) -#define CHECK_VADD3(x,y,w,z) (SR = (SR & ~0x00000008) | ((((x) ^ (z)) & ((y) ^ (z)) & ((w) ^ (z)) & 0x80000000) >> 29)) -#define CHECK_VSUB(x,y,z) (SR = (SR & ~0x00000008) | (((z ^ y) & (y ^ x) & 0x80000000) >> 29)) - - /* FER flags */ #define GET_ACCRUED (FER & 0x0000001f) //bits 4 - 0 //Floating-Point Accrued Exceptions #define GET_ACTUAL (FER & 0x00001f00) //bits 12 - 8 //Floating-Point Actual Exceptions //other bits are reversed, in particular 7 - 5 for the operating system. -//the user program can only changes the above 2 flags +//the user program can only change the above 2 flags #endif // MAME_CPU_E132XS_XS32DEFS_H diff --git a/src/devices/cpu/e132xs/e132xs.cpp b/src/devices/cpu/e132xs/e132xs.cpp index 8c88af94c31..3a31e93a2a9 100644 --- a/src/devices/cpu/e132xs/e132xs.cpp +++ b/src/devices/cpu/e132xs/e132xs.cpp @@ -661,10 +661,8 @@ void hyperstone_device::set_global_register(uint8_t code, uint32_t val) #define SIGN_BIT(val) ((val & 0x80000000) >> 31) #define SIGN_TO_N(val) ((val & 0x80000000) >> 29) -static constexpr int32_t immediate_values[32] = +/*static*/ const int32_t hyperstone_device::s_immediate_values[16] = { - 0, 1, 2, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 32, 64, 128, int32_t(0x80000000), -8, -7, -6, -5, -4, -3, -2, -1 }; @@ -678,7 +676,7 @@ do if (m_delay_slot) \ { \ PC = m_delay_pc; \ - m_delay_slot = false; \ + m_delay_slot = 0; \ } \ } while (0) @@ -697,8 +695,7 @@ uint32_t hyperstone_device::decode_immediate_s() switch (nybble) { case 0: - default: - return immediate_values[0x10 + nybble]; + return 16; case 1: { m_instruction_length = (3<<19); @@ -720,6 +717,8 @@ uint32_t hyperstone_device::decode_immediate_s() PC += 2; return extra_u; } + default: + return s_immediate_values[nybble]; } } @@ -791,7 +790,7 @@ void hyperstone_device::ignore_pcrel() } } -void hyperstone_device::execute_br() +void hyperstone_device::hyperstone_br() { const int32_t offset = decode_pcrel(); check_delay_PC(); @@ -1029,7 +1028,7 @@ void hyperstone_device::device_start() void hyperstone_device::init(int scale_mask) { - m_enable_drc = false;//allow_drc(); + m_enable_drc = allow_drc(); memset(m_global_regs, 0, sizeof(uint32_t) * 32); memset(m_local_regs, 0, sizeof(uint32_t) * 64); @@ -1584,7 +1583,7 @@ void hyperstone_device::execute_run() m_instruction_length = (1<<19); - switch ((OP >> 8) & 0x00ff) + switch (m_op >> 8) { case 0x00: hyperstone_chk(); break; case 0x01: hyperstone_chk(); break; @@ -1798,8 +1797,8 @@ void hyperstone_device::execute_run() case 0xd1: hyperstone_ldwr(); break; case 0xd2: hyperstone_lddr(); break; case 0xd3: hyperstone_lddr(); break; - case 0xd4: hypesrtone_ldwp(); break; - case 0xd5: hypesrtone_ldwp(); break; + case 0xd4: hyperstone_ldwp(); break; + case 0xd5: hyperstone_ldwp(); break; case 0xd6: hyperstone_lddp(); break; case 0xd7: hyperstone_lddp(); break; case 0xd8: hyperstone_stwr(); break; @@ -1838,7 +1837,7 @@ void hyperstone_device::execute_run() case 0xf9: hyperstone_b(); break; case 0xfa: hyperstone_b(); break; case 0xfb: hyperstone_b(); break; - case 0xfc: execute_br(); break; + case 0xfc: hyperstone_br(); break; case 0xfd: hyperstone_trap(); break; case 0xfe: hyperstone_trap(); break; case 0xff: hyperstone_trap(); break; diff --git a/src/devices/cpu/e132xs/e132xs.h b/src/devices/cpu/e132xs/e132xs.h index 8328215c475..93247a4bbc1 100644 --- a/src/devices/cpu/e132xs/e132xs.h +++ b/src/devices/cpu/e132xs/e132xs.h @@ -64,6 +64,7 @@ class hyperstone_device : public cpu_device public: inline void ccfunc_unimplemented(); + inline void ccfunc_print(); protected: enum @@ -165,6 +166,8 @@ protected: enum { EXCEPTION_INTERRUPT = 0, + EXCEPTION_PRIVILEGE_ERROR, + EXCEPTION_TRACE, EXCEPTION_COUNT }; @@ -225,7 +228,7 @@ protected: emu_timer *m_timer; uint32_t m_delay_pc; - bool m_delay_slot; + uint32_t m_delay_slot; uint32_t m_opcodexor; @@ -236,6 +239,7 @@ protected: int m_icount; uint8_t m_fl_lut[16]; + static const int32_t s_immediate_values[16]; uint32_t get_trap_addr(uint8_t trapno); @@ -256,16 +260,18 @@ private: TIMER_CALLBACK_MEMBER(timer_callback); - void execute_br(); + uint32_t decode_const(); + uint32_t decode_immediate_s(); + void ignore_immediate_s(); + int32_t decode_pcrel(); + void ignore_pcrel(); + + void hyperstone_br(); void execute_trap(uint32_t addr); void execute_int(uint32_t addr); void execute_exception(uint32_t addr); void execute_software(); - void ignore_immediate_s(); - uint32_t decode_immediate_s(); - uint32_t decode_const(); - template void hyperstone_chk(); template void hyperstone_movd(); template void hyperstone_divsu(); @@ -323,7 +329,7 @@ private: template void hyperstone_ldwr(); template void hyperstone_lddr(); - template void hypesrtone_ldwp(); + template void hyperstone_ldwp(); template void hyperstone_lddp(); template void hyperstone_stwr(); @@ -345,9 +351,6 @@ private: void hyperstone_reserved(); void hyperstone_do(); - int32_t decode_pcrel(); - void ignore_pcrel(); - drc_cache m_cache; std::unique_ptr m_drcuml; std::unique_ptr m_drcfe; @@ -364,6 +367,7 @@ private: uint32_t m_drc_arg1; uint32_t m_drc_arg2; uint32_t m_drc_arg3; + uint32_t m_branch_dest; uml::code_handle *m_mem_read8; uml::code_handle *m_mem_write8; @@ -394,139 +398,109 @@ private: void static_generate_entry_point(); void static_generate_nocode_handler(); void static_generate_out_of_cycles(); - void static_generate_exception(uint8_t exception, const char *name); + void static_generate_exception(uint32_t exception, const char *name); void static_generate_memory_accessor(int size, int iswrite, bool isio, const char *name, uml::code_handle *&handleptr); - void generate_update_cycles(drcuml_block *block, compiler_state *compiler, uml::parameter param, bool allow_exception); + void generate_delay_slot_and_branch(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_update_cycles(drcuml_block *block, compiler_state *compiler, uml::parameter param); void generate_checksum_block(drcuml_block *block, compiler_state *compiler, const opcode_desc *seqhead, const opcode_desc *seqlast); void generate_sequence_instruction(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void log_add_disasm_comment(drcuml_block *block, uint32_t pc, uint32_t op); bool generate_opcode(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op00(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op01(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op02(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op03(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op04(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op05(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op06(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op07(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op08(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op09(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op0a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op0b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op0c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op0d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op0e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op0f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op10(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op11(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op12(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op13(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op14(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op15(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op16(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op17(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op18(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op19(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op1a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op1b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op1c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op1d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op1e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op1f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op20(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op21(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op22(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op23(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op24(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op25(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op26(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op27(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op28(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op29(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op2a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op2b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op2c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op2d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op2e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op2f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op30(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op31(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op32(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op33(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op34(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op35(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op36(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op37(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op38(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op39(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op3a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op3b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op3c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op3d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op3e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op3f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op40(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op41(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op42(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op43(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op44(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op45(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op46(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op47(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op48(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op49(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op4a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op4b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op4c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op4d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op4e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op4f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op50(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op51(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op52(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op53(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op54(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op55(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op56(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op57(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op58(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op59(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op5a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op5b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op5c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op5d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op5e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op5f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op60(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op61(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op62(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op63(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op64(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op65(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op66(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op67(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op68(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op69(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op6a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op6b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op6c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op6d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op6e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op6f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op70(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op71(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op72(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op73(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op74(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op75(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op76(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op77(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op78(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op79(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op7a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op7b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op7c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op7d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op7e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op7f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op80(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op81(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op82(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op83(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op84(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op85(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op86(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op87(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op88(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op89(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op8a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op8b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op8e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op8f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op90(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op91(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op92(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op93(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op94(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op95(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op96(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op97(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op98(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op99(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op9a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op9b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op9c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op9d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op9e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op9f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opa0(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opa1(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opa2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opa3(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opa4(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opa5(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opa6(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opa7(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opa8(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opa9(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opaa(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opab(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opb0(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opb1(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opb2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opb3(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opb4(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opb5(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opb6(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opb7(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opb8(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opb9(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opba(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opbb(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opbc(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opbd(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opbe(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opbf(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opc0(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opc1(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opc2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opc3(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opc4(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opc5(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opc6(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opc7(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opc8(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opc9(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opca(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opcb(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opcc(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opcd(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opce(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opcf(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opd0(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opd1(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opd2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opd3(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opd4(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opd5(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opd6(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opd7(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opd8(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opd9(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opda(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opdb(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opdc(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opdd(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opde(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opdf(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_ope0(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_ope1(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_ope2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_ope3(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_ope4(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_ope5(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_ope6(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_ope7(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_ope8(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_ope9(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opea(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opeb(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opec(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_oped(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opee(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opef(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opf0(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opf1(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opf2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opf3(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opf4(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opf5(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opf6(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opf7(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opf8(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opf9(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opfa(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opfb(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opfc(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opfd(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opfe(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opff(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + int generate_get_trap_addr(drcuml_block *block, int label, uint32_t trapno); + void generate_check_delay_pc(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_decode_const(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + int generate_decode_immediate_s(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_ignore_immediate_s(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_decode_pcrel(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_ignore_pcrel(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + + int generate_set_global_register(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc, int label); + + void generate_trap(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc, uint32_t addr); + void generate_int(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc, uint32_t addr); + 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 void generate_chk(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_movd(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_divsu(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_xm(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_mask(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_sum(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_sums(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_cmp(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_mov(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_add(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_adds(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_cmpb(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_subc(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_sub(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_subs(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_addc(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_neg(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_negs(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_and(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_andn(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_or(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_xor(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_not(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_cmpi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template int generate_movi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_addi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_addsi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_cmpbi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_andni(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_ori(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_xori(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_shrdi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_shrd(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_shr(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_shri(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_sardi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_sard(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_sar(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_sari(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_shldi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_shld(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_shl(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_shli(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_testlz(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_rol(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_ldxx1(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_ldxx2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_stxx1(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_stxx2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + + template void generate_mulsu(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_mul(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + + template void generate_set(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + + template void generate_ldwr(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_lddr(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_ldwp(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_lddp(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + + template void generate_stwr(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_stdr(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_stwp(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_stdp(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + + template void generate_b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_br(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_db(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_dbr(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + + void generate_frame(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_call_global(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_call_local(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + + void generate_trap_op(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_extend(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + + void generate_reserved(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_do(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); }; // device type definition diff --git a/src/devices/cpu/e132xs/e132xsdefs.h b/src/devices/cpu/e132xs/e132xsdefs.h deleted file mode 100644 index 95a0274ed3a..00000000000 --- a/src/devices/cpu/e132xs/e132xsdefs.h +++ /dev/null @@ -1,79 +0,0 @@ -/* Memory access */ -/* read byte */ -#define READ_B(addr) m_program->read_byte((addr)) -/* read half-word */ -#define READ_HW(addr) m_program->read_word((addr) & ~1) -/* read word */ -#define READ_W(addr) m_program->read_dword((addr) & ~3) - -/* write byte */ -#define WRITE_B(addr, data) m_program->write_byte(addr, data) -/* write half-word */ -#define WRITE_HW(addr, data) m_program->write_word((addr) & ~1, data) -/* write word */ -#define WRITE_W(addr, data) m_program->write_dword((addr) & ~3, data) - - -/* I/O access */ -/* read word */ -#define IO_READ_W(addr) m_io->read_dword(((addr) >> 11) & 0x7ffc) -/* write word */ -#define IO_WRITE_W(addr, data) m_io->write_dword(((addr) >> 11) & 0x7ffc, data) - - -#define READ_OP(addr) m_direct->read_word((addr), m_opcodexor) - -// set C in adds/addsi/subs/sums -#define SETCARRYS 0 -#define MISSIONCRAFT_FLAGS 1 - -/* Registers */ - -/* Internal registers */ - -#define SREG decode.src_value -#define SREGF decode.next_src_value -#define DREG decode.dst_value -#define DREGF decode.next_dst_value -#define EXTRA_U decode.extra.u -#define EXTRA_S decode.extra.s - -#define SET_SREG( _data_ ) (decode.src_is_local ? set_local_register(decode.src, (uint32_t)_data_) : set_global_register(decode.src, (uint32_t)_data_)) -#define SET_SREGF( _data_ ) (decode.src_is_local ? set_local_register(decode.src + 1, (uint32_t)_data_) : set_global_register(decode.src + 1, (uint32_t)_data_)) -#define SET_DREG( _data_ ) (decode.dst_is_local ? set_local_register(decode.dst, (uint32_t)_data_) : set_global_register(decode.dst, (uint32_t)_data_)) -#define SET_DREGF( _data_ ) (decode.dst_is_local ? set_local_register(decode.dst + 1, (uint32_t)_data_) : set_global_register(decode.dst + 1, (uint32_t)_data_)) - -#define SRC_IS_PC (!decode.src_is_local && decode.src == PC_REGISTER) -#define DST_IS_PC (!decode.dst_is_local && decode.dst == PC_REGISTER) -#define SRC_IS_SR (!decode.src_is_local && decode.src == SR_REGISTER) -#define DST_IS_SR (!decode.dst_is_local && decode.dst == SR_REGISTER) -#define SAME_SRC_DST decode.same_src_dst -#define SAME_SRC_DSTF decode.same_src_dstf -#define SAME_SRCF_DST decode.same_srcf_dst - - -/* Memory access */ -/* read byte */ -#define READ_B(addr) m_program->read_byte((addr)) -/* read half-word */ -#define READ_HW(addr) m_program->read_word((addr) & ~1) -/* read word */ -#define READ_W(addr) m_program->read_dword((addr) & ~3) - -/* write byte */ -#define WRITE_B(addr, data) m_program->write_byte(addr, data) -/* write half-word */ -#define WRITE_HW(addr, data) m_program->write_word((addr) & ~1, data) -/* write word */ -#define WRITE_W(addr, data) m_program->write_dword((addr) & ~3, data) - - -/* I/O access */ -/* read word */ -#define IO_READ_W(addr) m_io->read_dword(((addr) >> 11) & 0x7ffc) -/* write word */ -#define IO_WRITE_W(addr, data) m_io->write_dword(((addr) >> 11) & 0x7ffc, data) - - -#define READ_OP(addr) m_direct->read_word((addr), m_opcodexor) - diff --git a/src/devices/cpu/e132xs/e132xsdrc.cpp b/src/devices/cpu/e132xs/e132xsdrc.cpp index 9e0d7e9ef15..43dc59dd016 100644 --- a/src/devices/cpu/e132xs/e132xsdrc.cpp +++ b/src/devices/cpu/e132xs/e132xsdrc.cpp @@ -7,6 +7,8 @@ using namespace uml; +#define DRC_SR mem(&m_global_regs[1]) + void hyperstone_device::execute_run_drc() { drcuml_state *drcuml = m_drcuml.get(); @@ -19,6 +21,7 @@ void hyperstone_device::execute_run_drc() m_cache_dirty = false; } + /* execute */ do { @@ -74,6 +77,10 @@ void hyperstone_device::code_flush_cache() static_generate_nocode_handler(); static_generate_out_of_cycles(); + static_generate_exception(EXCEPTION_INTERRUPT, "interrupt"); + static_generate_exception(EXCEPTION_PRIVILEGE_ERROR, "privilege_error"); + static_generate_exception(EXCEPTION_TRACE, "trace"); + /* add subroutines for memory accesses */ static_generate_memory_accessor(1, false, false, "read8", m_mem_read8); static_generate_memory_accessor(1, true, false, "write8", m_mem_write8); @@ -87,10 +94,25 @@ void hyperstone_device::code_flush_cache() catch (drcuml_block::abort_compilation &) { - fatalerror("Unable to generate static E132XS code\n"); + fatalerror("Unable to generate static E132XS code\n"); fflush(stdout); } } +/* Return the entry point for a determinated trap */ +int hyperstone_device::generate_get_trap_addr(drcuml_block *block, int label, uint32_t trapno) +{ + int no_mem3; + UML_MOV(block, I0, trapno); + UML_CMP(block, mem(&m_trap_entry), 0xffffff00); + UML_JMPc(block, uml::COND_NE, no_mem3 = label++); + UML_SUB(block, I0, 63, I0); + + UML_LABEL(block, no_mem3); + UML_SHL(block, I0, I0, 2); + UML_OR(block, I0, I0, mem(&m_trap_entry)); + return label; +} + /*------------------------------------------------- code_compile_block - compile a block of the given mode at the specified pc @@ -126,7 +148,7 @@ void hyperstone_device::code_compile_block(offs_t pc) /* add a code log entry */ if (drcuml->logging()) - block->append_comment("-------------------------"); // comment + block->append_comment("-------------------------"); /* determine the last instruction in this sequence */ for (seqlast = seqhead; seqlast != nullptr; seqlast = seqlast->next()) @@ -136,22 +158,21 @@ void hyperstone_device::code_compile_block(offs_t pc) /* if we don't have a hash for this mode/pc, or if we are overriding all, add one */ if (override || !drcuml->hash_exists(0, seqhead->pc)) - UML_HASH(block, 0, seqhead->pc); // hash mode,pc + UML_HASH(block, 0, seqhead->pc); /* if we already have a hash, and this is the first sequence, assume that we */ /* are recompiling due to being out of sync and allow future overrides */ else if (seqhead == desclist) { override = true; - UML_HASH(block, 0, seqhead->pc); // hash mode,pc + UML_HASH(block, 0, seqhead->pc); } /* otherwise, redispatch to that fixed PC and skip the rest of the processing */ else { - UML_LABEL(block, seqhead->pc | 0x80000000); // label seqhead->pc + UML_LABEL(block, seqhead->pc | 0x80000000); UML_HASHJMP(block, 0, seqhead->pc, *m_nocode); - // hashjmp <0>,seqhead->pc,nocode continue; } @@ -161,11 +182,13 @@ void hyperstone_device::code_compile_block(offs_t pc) /* label this instruction, if it may be jumped to locally */ if (seqhead->flags & OPFLAG_IS_BRANCH_TARGET) - UML_LABEL(block, seqhead->pc | 0x80000000); // label seqhead->pc + UML_LABEL(block, seqhead->pc | 0x80000000); /* iterate over instructions in the sequence and compile them */ for (curdesc = seqhead; curdesc != seqlast->next(); curdesc = curdesc->next()) + { generate_sequence_instruction(block, &compiler, curdesc); + } /* if we need to return to the start, do it */ if (seqlast->flags & OPFLAG_RETURN_TO_START) @@ -173,14 +196,16 @@ void hyperstone_device::code_compile_block(offs_t pc) /* otherwise we just go to the next instruction */ else - nextpc = seqlast->pc + (seqlast->skipslots + 1) * 4; + nextpc = seqlast->pc + (seqlast->skipslots + 1) * 2; /* count off cycles and go there */ - generate_update_cycles(block, &compiler, nextpc, true); // + generate_update_cycles(block, &compiler, nextpc); // /* if the last instruction can change modes, use a variable mode; otherwise, assume the same mode */ if (seqlast->next() == nullptr || seqlast->next()->pc != nextpc) + { UML_HASHJMP(block, 0, nextpc, *m_nocode); // hashjmp ,nextpc,nocode + } } /* end the sequence */ @@ -209,11 +234,23 @@ inline void hyperstone_device::ccfunc_unimplemented() fatalerror("PC=%08X: Unimplemented op %08X\n", PC, m_drc_arg0); } +inline void hyperstone_device::ccfunc_print() +{ + printf("%c: %08X\n", (char)m_drc_arg0, m_drc_arg1); +} + static void cfunc_unimplemented(void *param) { ((hyperstone_device *)param)->ccfunc_unimplemented(); } +#if 0 +static void cfunc_print(void *param) +{ + ((hyperstone_device *)param)->ccfunc_print(); +} +#endif + /*************************************************************************** STATIC CODEGEN ***************************************************************************/ @@ -241,6 +278,59 @@ static inline void alloc_handle(drcuml_state *drcuml, code_handle **handleptr, c } + +/*------------------------------------------------- + static_generate_exception - generate an + exception handler +-------------------------------------------------*/ + +void hyperstone_device::static_generate_exception(uint32_t exception, const char *name) +{ + code_handle *&exception_handle = m_exception[exception]; + drcuml_state *drcuml = m_drcuml.get(); + drcuml_block *block = drcuml->begin_block(1024); + + /* add a global entry for this */ + alloc_handle(drcuml, &exception_handle, name); + UML_HANDLE(block, *exception_handle); + + generate_get_trap_addr(block, 1, exception); + UML_ROLAND(block, I1, DRC_SR, 7, 0x7f); + UML_ROLAND(block, I2, DRC_SR, 11, 0xf); + UML_TEST(block, I2, 0xf); + UML_MOVc(block, uml::COND_Z, I2, 16); + UML_ADD(block, I1, I1, I2); + + UML_AND(block, DRC_SR, DRC_SR, 0xffe7ffff); + UML_OR(block, DRC_SR, DRC_SR, mem(&m_instruction_length)); + + UML_MOV(block, I4, DRC_SR); + UML_ROLINS(block, DRC_SR, 2, 21, 0x01e00000); + UML_ROLINS(block, DRC_SR, I1, 25, 0xfe000000); + + UML_AND(block, I3, I1, 0x3f); + UML_AND(block, I1, mem(m_global_regs), ~1); + UML_ROLAND(block, I2, DRC_SR, 14, 1); + UML_OR(block, I1, I1, I2); + UML_STORE(block, (void *)m_local_regs, I3, I1, SIZE_DWORD, SCALE_x4); + UML_ADD(block, I3, I3, 1); + UML_AND(block, I3, I3, 0x3f); + UML_STORE(block, (void *)m_local_regs, I3, I4, SIZE_DWORD, SCALE_x4); + + UML_AND(block, DRC_SR, DRC_SR, ~(M_MASK | T_MASK)); + UML_OR(block, DRC_SR, DRC_SR, (L_MASK | S_MASK)); + + UML_MOV(block, mem(m_global_regs), I0); + UML_SUB(block, mem(&m_icount), mem(&m_icount), 2); + UML_EXHc(block, COND_S, *m_out_of_cycles, 0); + + UML_HASHJMP(block, 0, I0, *m_nocode);// hashjmp ,i0,nocode + + block->end(); +} + + + /*------------------------------------------------- generate_entry_point - generate a static entry point @@ -378,7 +468,7 @@ void hyperstone_device::static_generate_memory_accessor(int size, int iswrite, b an exception if out -------------------------------------------------*/ -void hyperstone_device::generate_update_cycles(drcuml_block *block, compiler_state *compiler, uml::parameter param, bool allow_exception) +void hyperstone_device::generate_update_cycles(drcuml_block *block, compiler_state *compiler, uml::parameter param) { /* account for cycles */ if (compiler->m_cycles > 0) @@ -469,6 +559,43 @@ void hyperstone_device::log_add_disasm_comment(drcuml_block *block, uint32_t pc, } +/*------------------------------------------------------------------ + generate_delay_slot_and_branch +------------------------------------------------------------------*/ + +void hyperstone_device::generate_delay_slot_and_branch(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ + compiler_state compiler_temp = *compiler; + + /* fetch the target register if dynamic, in case it is modified by the delay slot */ + if (desc->targetpc == BRANCH_TARGET_DYNAMIC) + { + UML_MOV(block, mem(&m_branch_dest), I0); + } + + /* update the cycles and jump through the hash table to the target */ + if (desc->targetpc != BRANCH_TARGET_DYNAMIC) + { + generate_update_cycles(block, &compiler_temp, desc->targetpc); + if (desc->flags & OPFLAG_INTRABLOCK_BRANCH) + UML_JMP(block, desc->targetpc | 0x80000000); + else + UML_HASHJMP(block, 0, desc->targetpc, *m_nocode); + } + else + { + generate_update_cycles(block, &compiler_temp, mem(&m_branch_dest)); + UML_HASHJMP(block, 0, mem(&m_branch_dest), *m_nocode); + } + + /* update the label */ + compiler->m_labelnum = compiler_temp.m_labelnum; + + /* reset the mapvar to the current cycles */ + UML_MAPVAR(block, MAPVAR_CYCLES, compiler->m_cycles); +} + + /*------------------------------------------------- generate_sequence_instruction - generate code for a single instruction in a sequence @@ -495,7 +622,7 @@ void hyperstone_device::generate_sequence_instruction(drcuml_block *block, compi /* if we are debugging, call the debugger */ if ((machine().debug_flags & DEBUG_FLAG_ENABLED) != 0) { - UML_MOV(block, mem(&PC), desc->pc); + UML_MOV(block, mem(m_global_regs), desc->pc); //save_fast_iregs(block); UML_DEBUG(block, desc->pc); } @@ -505,277 +632,297 @@ void hyperstone_device::generate_sequence_instruction(drcuml_block *block, compi /* compile the instruction */ if (!generate_opcode(block, compiler, desc)) { - UML_MOV(block, mem(&PC), desc->pc); + UML_MOV(block, mem(m_global_regs), desc->pc); UML_MOV(block, mem(&m_drc_arg0), desc->opptr.l[0]); UML_CALLC(block, cfunc_unimplemented, this); } } } +#include "e132xsdrc_ops.hxx" + bool hyperstone_device::generate_opcode(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) { - uint32_t op = desc->opptr.l[0]; - uint8_t opswitch = (op & 0x0000ff00) >> 8; - code_label skip; + uint32_t op = (uint32_t)desc->opptr.w[0]; + printf("op:%04x\n", op); + printf("pc:%08x\n", desc->pc); + + UML_MOV(block, I0, op); + UML_AND(block, I7, DRC_SR, H_MASK); + UML_ADD(block, mem(m_global_regs), mem(m_global_regs), 2); + UML_MOV(block, mem(&m_instruction_length), (1 << 19)); - switch (opswitch) + int label = 1; + switch (op >> 8) { - case 0x00: generate_op00(block, compiler, desc); break; - case 0x01: generate_op01(block, compiler, desc); break; - case 0x02: generate_op02(block, compiler, desc); break; - case 0x03: generate_op03(block, compiler, desc); break; - case 0x04: generate_op04(block, compiler, desc); break; - case 0x05: generate_op05(block, compiler, desc); break; - case 0x06: generate_op06(block, compiler, desc); break; - case 0x07: generate_op07(block, compiler, desc); break; - case 0x08: generate_op08(block, compiler, desc); break; - case 0x09: generate_op09(block, compiler, desc); break; - case 0x0a: generate_op0a(block, compiler, desc); break; - case 0x0b: generate_op0b(block, compiler, desc); break; - case 0x0c: generate_op0c(block, compiler, desc); break; - case 0x0d: generate_op0d(block, compiler, desc); break; - case 0x0e: generate_op0e(block, compiler, desc); break; - case 0x0f: generate_op0f(block, compiler, desc); break; - case 0x10: generate_op10(block, compiler, desc); break; - case 0x11: generate_op11(block, compiler, desc); break; - case 0x12: generate_op12(block, compiler, desc); break; - case 0x13: generate_op13(block, compiler, desc); break; - case 0x14: generate_op14(block, compiler, desc); break; - case 0x15: generate_op15(block, compiler, desc); break; - case 0x16: generate_op16(block, compiler, desc); break; - case 0x17: generate_op17(block, compiler, desc); break; - case 0x18: generate_op18(block, compiler, desc); break; - case 0x19: generate_op19(block, compiler, desc); break; - case 0x1a: generate_op1a(block, compiler, desc); break; - case 0x1b: generate_op1b(block, compiler, desc); break; - case 0x1c: generate_op1c(block, compiler, desc); break; - case 0x1d: generate_op1d(block, compiler, desc); break; - case 0x1e: generate_op1e(block, compiler, desc); break; - case 0x1f: generate_op1f(block, compiler, desc); break; - case 0x20: generate_op20(block, compiler, desc); break; - case 0x21: generate_op21(block, compiler, desc); break; - case 0x22: generate_op22(block, compiler, desc); break; - case 0x23: generate_op23(block, compiler, desc); break; - case 0x24: generate_op24(block, compiler, desc); break; - case 0x25: generate_op25(block, compiler, desc); break; - case 0x26: generate_op26(block, compiler, desc); break; - case 0x27: generate_op27(block, compiler, desc); break; - case 0x28: generate_op28(block, compiler, desc); break; - case 0x29: generate_op29(block, compiler, desc); break; - case 0x2a: generate_op2a(block, compiler, desc); break; - case 0x2b: generate_op2b(block, compiler, desc); break; - case 0x2c: generate_op2c(block, compiler, desc); break; - case 0x2d: generate_op2d(block, compiler, desc); break; - case 0x2e: generate_op2e(block, compiler, desc); break; - case 0x2f: generate_op2f(block, compiler, desc); break; - case 0x30: generate_op30(block, compiler, desc); break; - case 0x31: generate_op31(block, compiler, desc); break; - case 0x32: generate_op32(block, compiler, desc); break; - case 0x33: generate_op33(block, compiler, desc); break; - case 0x34: generate_op34(block, compiler, desc); break; - case 0x35: generate_op35(block, compiler, desc); break; - case 0x36: generate_op36(block, compiler, desc); break; - case 0x37: generate_op37(block, compiler, desc); break; - case 0x38: generate_op38(block, compiler, desc); break; - case 0x39: generate_op39(block, compiler, desc); break; - case 0x3a: generate_op3a(block, compiler, desc); break; - case 0x3b: generate_op3b(block, compiler, desc); break; - case 0x3c: generate_op3c(block, compiler, desc); break; - case 0x3d: generate_op3d(block, compiler, desc); break; - case 0x3e: generate_op3e(block, compiler, desc); break; - case 0x3f: generate_op3f(block, compiler, desc); break; - case 0x40: generate_op40(block, compiler, desc); break; - case 0x41: generate_op41(block, compiler, desc); break; - case 0x42: generate_op42(block, compiler, desc); break; - case 0x43: generate_op43(block, compiler, desc); break; - case 0x44: generate_op44(block, compiler, desc); break; - case 0x45: generate_op45(block, compiler, desc); break; - case 0x46: generate_op46(block, compiler, desc); break; - case 0x47: generate_op47(block, compiler, desc); break; - case 0x48: generate_op48(block, compiler, desc); break; - case 0x49: generate_op49(block, compiler, desc); break; - case 0x4a: generate_op4a(block, compiler, desc); break; - case 0x4b: generate_op4b(block, compiler, desc); break; - case 0x4c: generate_op4c(block, compiler, desc); break; - case 0x4d: generate_op4d(block, compiler, desc); break; - case 0x4e: generate_op4e(block, compiler, desc); break; - case 0x4f: generate_op4f(block, compiler, desc); break; - case 0x50: generate_op50(block, compiler, desc); break; - case 0x51: generate_op51(block, compiler, desc); break; - case 0x52: generate_op52(block, compiler, desc); break; - case 0x53: generate_op53(block, compiler, desc); break; - case 0x54: generate_op54(block, compiler, desc); break; - case 0x55: generate_op55(block, compiler, desc); break; - case 0x56: generate_op56(block, compiler, desc); break; - case 0x57: generate_op57(block, compiler, desc); break; - case 0x58: generate_op58(block, compiler, desc); break; - case 0x59: generate_op59(block, compiler, desc); break; - case 0x5a: generate_op5a(block, compiler, desc); break; - case 0x5b: generate_op5b(block, compiler, desc); break; - case 0x5c: generate_op5c(block, compiler, desc); break; - case 0x5d: generate_op5d(block, compiler, desc); break; - case 0x5e: generate_op5e(block, compiler, desc); break; - case 0x5f: generate_op5f(block, compiler, desc); break; - case 0x60: generate_op60(block, compiler, desc); break; - case 0x61: generate_op61(block, compiler, desc); break; - case 0x62: generate_op62(block, compiler, desc); break; - case 0x63: generate_op63(block, compiler, desc); break; - case 0x64: generate_op64(block, compiler, desc); break; - case 0x65: generate_op65(block, compiler, desc); break; - case 0x66: generate_op66(block, compiler, desc); break; - case 0x67: generate_op67(block, compiler, desc); break; - case 0x68: generate_op68(block, compiler, desc); break; - case 0x69: generate_op69(block, compiler, desc); break; - case 0x6a: generate_op6a(block, compiler, desc); break; - case 0x6b: generate_op6b(block, compiler, desc); break; - case 0x6c: generate_op6c(block, compiler, desc); break; - case 0x6d: generate_op6d(block, compiler, desc); break; - case 0x6e: generate_op6e(block, compiler, desc); break; - case 0x6f: generate_op6f(block, compiler, desc); break; - case 0x70: generate_op70(block, compiler, desc); break; - case 0x71: generate_op71(block, compiler, desc); break; - case 0x72: generate_op72(block, compiler, desc); break; - case 0x73: generate_op73(block, compiler, desc); break; - case 0x74: generate_op74(block, compiler, desc); break; - case 0x75: generate_op75(block, compiler, desc); break; - case 0x76: generate_op76(block, compiler, desc); break; - case 0x77: generate_op77(block, compiler, desc); break; - case 0x78: generate_op78(block, compiler, desc); break; - case 0x79: generate_op79(block, compiler, desc); break; - case 0x7a: generate_op7a(block, compiler, desc); break; - case 0x7b: generate_op7b(block, compiler, desc); break; - case 0x7c: generate_op7c(block, compiler, desc); break; - case 0x7d: generate_op7d(block, compiler, desc); break; - case 0x7e: generate_op7e(block, compiler, desc); break; - case 0x7f: generate_op7f(block, compiler, desc); break; - case 0x80: generate_op80(block, compiler, desc); break; - case 0x81: generate_op81(block, compiler, desc); break; - case 0x82: generate_op82(block, compiler, desc); break; - case 0x83: generate_op83(block, compiler, desc); break; - case 0x84: generate_op84(block, compiler, desc); break; - case 0x85: generate_op85(block, compiler, desc); break; - case 0x86: generate_op86(block, compiler, desc); break; - case 0x87: generate_op87(block, compiler, desc); break; - case 0x88: generate_op88(block, compiler, desc); break; - case 0x89: generate_op89(block, compiler, desc); break; - case 0x8a: generate_op8a(block, compiler, desc); break; - case 0x8b: generate_op8b(block, compiler, desc); break; - case 0x8c: - case 0x8d: return false; - case 0x8e: generate_op8e(block, compiler, desc); break; - case 0x8f: generate_op8f(block, compiler, desc); break; - case 0x90: generate_op90(block, compiler, desc); break; - case 0x91: generate_op91(block, compiler, desc); break; - case 0x92: generate_op92(block, compiler, desc); break; - case 0x93: generate_op93(block, compiler, desc); break; - case 0x94: generate_op94(block, compiler, desc); break; - case 0x95: generate_op95(block, compiler, desc); break; - case 0x96: generate_op96(block, compiler, desc); break; - case 0x97: generate_op97(block, compiler, desc); break; - case 0x98: generate_op98(block, compiler, desc); break; - case 0x99: generate_op99(block, compiler, desc); break; - case 0x9a: generate_op9a(block, compiler, desc); break; - case 0x9b: generate_op9b(block, compiler, desc); break; - case 0x9c: generate_op9c(block, compiler, desc); break; - case 0x9d: generate_op9d(block, compiler, desc); break; - case 0x9e: generate_op9e(block, compiler, desc); break; - case 0x9f: generate_op9f(block, compiler, desc); break; - case 0xa0: generate_opa0(block, compiler, desc); break; - case 0xa1: generate_opa1(block, compiler, desc); break; - case 0xa2: generate_opa2(block, compiler, desc); break; - case 0xa3: generate_opa3(block, compiler, desc); break; - case 0xa4: generate_opa4(block, compiler, desc); break; - case 0xa5: generate_opa5(block, compiler, desc); break; - case 0xa6: generate_opa6(block, compiler, desc); break; - case 0xa7: generate_opa7(block, compiler, desc); break; - case 0xa8: generate_opa8(block, compiler, desc); break; - case 0xa9: generate_opa9(block, compiler, desc); break; - case 0xaa: generate_opaa(block, compiler, desc); break; - case 0xab: generate_opab(block, compiler, desc); break; - case 0xac: - case 0xad: - case 0xae: - case 0xaf: return false; - case 0xb0: generate_opb0(block, compiler, desc); break; - case 0xb1: generate_opb1(block, compiler, desc); break; - case 0xb2: generate_opb2(block, compiler, desc); break; - case 0xb3: generate_opb3(block, compiler, desc); break; - case 0xb4: generate_opb4(block, compiler, desc); break; - case 0xb5: generate_opb5(block, compiler, desc); break; - case 0xb6: generate_opb6(block, compiler, desc); break; - case 0xb7: generate_opb7(block, compiler, desc); break; - case 0xb8: generate_opb8(block, compiler, desc); break; - case 0xb9: generate_opb9(block, compiler, desc); break; - case 0xba: generate_opba(block, compiler, desc); break; - case 0xbb: generate_opbb(block, compiler, desc); break; - case 0xbc: generate_opbc(block, compiler, desc); break; - case 0xbd: generate_opbd(block, compiler, desc); break; - case 0xbe: generate_opbe(block, compiler, desc); break; - case 0xbf: generate_opbf(block, compiler, desc); break; - case 0xc0: generate_opc0(block, compiler, desc); break; - case 0xc1: generate_opc1(block, compiler, desc); break; - case 0xc2: generate_opc2(block, compiler, desc); break; - case 0xc3: generate_opc3(block, compiler, desc); break; - case 0xc4: generate_opc4(block, compiler, desc); break; - case 0xc5: generate_opc5(block, compiler, desc); break; - case 0xc6: generate_opc6(block, compiler, desc); break; - case 0xc7: generate_opc7(block, compiler, desc); break; - case 0xc8: generate_opc8(block, compiler, desc); break; - case 0xc9: generate_opc9(block, compiler, desc); break; - case 0xca: generate_opca(block, compiler, desc); break; - case 0xcb: generate_opcb(block, compiler, desc); break; - case 0xcc: generate_opcc(block, compiler, desc); break; - case 0xcd: generate_opcd(block, compiler, desc); break; - case 0xce: generate_opce(block, compiler, desc); break; - case 0xcf: generate_opcf(block, compiler, desc); break; - case 0xd0: generate_opd0(block, compiler, desc); break; - case 0xd1: generate_opd1(block, compiler, desc); break; - case 0xd2: generate_opd2(block, compiler, desc); break; - case 0xd3: generate_opd3(block, compiler, desc); break; - case 0xd4: generate_opd4(block, compiler, desc); break; - case 0xd5: generate_opd5(block, compiler, desc); break; - case 0xd6: generate_opd6(block, compiler, desc); break; - case 0xd7: generate_opd7(block, compiler, desc); break; - case 0xd8: generate_opd8(block, compiler, desc); break; - case 0xd9: generate_opd9(block, compiler, desc); break; - case 0xda: generate_opda(block, compiler, desc); break; - case 0xdb: generate_opdb(block, compiler, desc); break; - case 0xdc: generate_opdc(block, compiler, desc); break; - case 0xdd: generate_opdd(block, compiler, desc); break; - case 0xde: generate_opde(block, compiler, desc); break; - case 0xdf: generate_opdf(block, compiler, desc); break; - case 0xe0: generate_ope0(block, compiler, desc); break; - case 0xe1: generate_ope1(block, compiler, desc); break; - case 0xe2: generate_ope2(block, compiler, desc); break; - case 0xe3: generate_ope3(block, compiler, desc); break; - case 0xe4: generate_ope4(block, compiler, desc); break; - case 0xe5: generate_ope5(block, compiler, desc); break; - case 0xe6: generate_ope6(block, compiler, desc); break; - case 0xe7: generate_ope7(block, compiler, desc); break; - case 0xe8: generate_ope8(block, compiler, desc); break; - case 0xe9: generate_ope9(block, compiler, desc); break; - case 0xea: generate_opea(block, compiler, desc); break; - case 0xeb: generate_opeb(block, compiler, desc); break; - case 0xec: generate_opec(block, compiler, desc); break; - case 0xed: generate_oped(block, compiler, desc); break; - case 0xee: generate_opee(block, compiler, desc); break; - case 0xef: generate_opef(block, compiler, desc); break; - case 0xf0: generate_opf0(block, compiler, desc); break; - case 0xf1: generate_opf1(block, compiler, desc); break; - case 0xf2: generate_opf2(block, compiler, desc); break; - case 0xf3: generate_opf3(block, compiler, desc); break; - case 0xf4: generate_opf4(block, compiler, desc); break; - case 0xf5: generate_opf5(block, compiler, desc); break; - case 0xf6: generate_opf6(block, compiler, desc); break; - case 0xf7: generate_opf7(block, compiler, desc); break; - case 0xf8: generate_opf8(block, compiler, desc); break; - case 0xf9: generate_opf9(block, compiler, desc); break; - case 0xfa: generate_opfa(block, compiler, desc); break; - case 0xfb: generate_opfb(block, compiler, desc); break; - case 0xfc: generate_opfc(block, compiler, desc); break; - case 0xfd: generate_opfd(block, compiler, desc); break; - case 0xfe: generate_opfe(block, compiler, desc); break; - case 0xff: generate_opff(block, compiler, desc); break; + case 0x00: generate_chk(block, compiler, desc); break; + case 0x01: generate_chk(block, compiler, desc); break; + case 0x02: generate_chk(block, compiler, desc); break; + case 0x03: generate_chk(block, compiler, desc); break; + case 0x04: generate_movd(block, compiler, desc); break; + case 0x05: generate_movd(block, compiler, desc); break; + case 0x06: generate_movd(block, compiler, desc); break; + case 0x07: generate_movd(block, compiler, desc); break; + case 0x08: generate_divsu(block, compiler, desc); break; + case 0x09: generate_divsu(block, compiler, desc); break; + case 0x0a: generate_divsu(block, compiler, desc); break; + case 0x0b: generate_divsu(block, compiler, desc); break; + case 0x0c: generate_divsu(block, compiler, desc); break; + case 0x0d: generate_divsu(block, compiler, desc); break; + case 0x0e: generate_divsu(block, compiler, desc); break; + case 0x0f: generate_divsu(block, compiler, desc); break; + case 0x10: generate_xm(block, compiler, desc); break; + case 0x11: generate_xm(block, compiler, desc); break; + case 0x12: generate_xm(block, compiler, desc); break; + case 0x13: generate_xm(block, compiler, desc); break; + case 0x14: generate_mask(block, compiler, desc); break; + case 0x15: generate_mask(block, compiler, desc); break; + case 0x16: generate_mask(block, compiler, desc); break; + case 0x17: generate_mask(block, compiler, desc); break; + case 0x18: generate_sum(block, compiler, desc); break; + case 0x19: generate_sum(block, compiler, desc); break; + case 0x1a: generate_sum(block, compiler, desc); break; + case 0x1b: generate_sum(block, compiler, desc); break; + case 0x1c: generate_sums(block, compiler, desc); break; + case 0x1d: generate_sums(block, compiler, desc); break; + case 0x1e: generate_sums(block, compiler, desc); break; + case 0x1f: generate_sums(block, compiler, desc); break; + case 0x20: generate_cmp(block, compiler, desc); break; + case 0x21: generate_cmp(block, compiler, desc); break; + case 0x22: generate_cmp(block, compiler, desc); break; + case 0x23: generate_cmp(block, compiler, desc); break; + case 0x24: generate_mov(block, compiler, desc); break; + case 0x25: generate_mov(block, compiler, desc); break; + case 0x26: generate_mov(block, compiler, desc); break; + case 0x27: generate_mov(block, compiler, desc); break; + case 0x28: generate_add(block, compiler, desc); break; + case 0x29: generate_add(block, compiler, desc); break; + case 0x2a: generate_add(block, compiler, desc); break; + case 0x2b: generate_add(block, compiler, desc); break; + case 0x2c: generate_adds(block, compiler, desc); break; + case 0x2d: generate_adds(block, compiler, desc); break; + case 0x2e: generate_adds(block, compiler, desc); break; + case 0x2f: generate_adds(block, compiler, desc); break; + case 0x30: generate_cmpb(block, compiler, desc); break; + case 0x31: generate_cmpb(block, compiler, desc); break; + case 0x32: generate_cmpb(block, compiler, desc); break; + case 0x33: generate_cmpb(block, compiler, desc); break; + case 0x34: generate_andn(block, compiler, desc); break; + case 0x35: generate_andn(block, compiler, desc); break; + case 0x36: generate_andn(block, compiler, desc); break; + case 0x37: generate_andn(block, compiler, desc); break; + case 0x38: generate_or(block, compiler, desc); break; + case 0x39: generate_or(block, compiler, desc); break; + case 0x3a: generate_or(block, compiler, desc); break; + case 0x3b: generate_or(block, compiler, desc); break; + case 0x3c: generate_xor(block, compiler, desc); break; + case 0x3d: generate_xor(block, compiler, desc); break; + case 0x3e: generate_xor(block, compiler, desc); break; + case 0x3f: generate_xor(block, compiler, desc); break; + case 0x40: generate_subc(block, compiler, desc); break; + case 0x41: generate_subc(block, compiler, desc); break; + case 0x42: generate_subc(block, compiler, desc); break; + case 0x43: generate_subc(block, compiler, desc); break; + case 0x44: generate_not(block, compiler, desc); break; + case 0x45: generate_not(block, compiler, desc); break; + case 0x46: generate_not(block, compiler, desc); break; + case 0x47: generate_not(block, compiler, desc); break; + case 0x48: generate_sub(block, compiler, desc); break; + case 0x49: generate_sub(block, compiler, desc); break; + case 0x4a: generate_sub(block, compiler, desc); break; + case 0x4b: generate_sub(block, compiler, desc); break; + case 0x4c: generate_subs(block, compiler, desc); break; + case 0x4d: generate_subs(block, compiler, desc); break; + case 0x4e: generate_subs(block, compiler, desc); break; + case 0x4f: generate_subs(block, compiler, desc); break; + case 0x50: generate_addc(block, compiler, desc); break; + case 0x51: generate_addc(block, compiler, desc); break; + case 0x52: generate_addc(block, compiler, desc); break; + case 0x53: generate_addc(block, compiler, desc); break; + case 0x54: generate_and(block, compiler, desc); break; + case 0x55: generate_and(block, compiler, desc); break; + case 0x56: generate_and(block, compiler, desc); break; + case 0x57: generate_and(block, compiler, desc); break; + case 0x58: generate_neg(block, compiler, desc); break; + case 0x59: generate_neg(block, compiler, desc); break; + case 0x5a: generate_neg(block, compiler, desc); break; + case 0x5b: generate_neg(block, compiler, desc); break; + case 0x5c: generate_negs(block, compiler, desc); break; + case 0x5d: generate_negs(block, compiler, desc); break; + case 0x5e: generate_negs(block, compiler, desc); break; + case 0x5f: generate_negs(block, compiler, desc); break; + case 0x60: generate_cmpi(block, compiler, desc); break; + case 0x61: generate_cmpi(block, compiler, desc); break; + case 0x62: generate_cmpi(block, compiler, desc); break; + case 0x63: generate_cmpi(block, compiler, desc); break; + case 0x64: label = generate_movi(block, compiler, desc); break; + case 0x65: label = generate_movi(block, compiler, desc); break; + case 0x66: label = generate_movi(block, compiler, desc); break; + case 0x67: label = generate_movi(block, compiler, desc); break; + case 0x68: generate_addi(block, compiler, desc); break; + case 0x69: generate_addi(block, compiler, desc); break; + case 0x6a: generate_addi(block, compiler, desc); break; + case 0x6b: generate_addi(block, compiler, desc); break; + case 0x6c: generate_addsi(block, compiler, desc); break; + case 0x6d: generate_addsi(block, compiler, desc); break; + case 0x6e: generate_addsi(block, compiler, desc); break; + case 0x6f: generate_addsi(block, compiler, desc); break; + case 0x70: generate_cmpbi(block, compiler, desc); break; + case 0x71: generate_cmpbi(block, compiler, desc); break; + case 0x72: generate_cmpbi(block, compiler, desc); break; + case 0x73: generate_cmpbi(block, compiler, desc); break; + case 0x74: generate_andni(block, compiler, desc); break; + case 0x75: generate_andni(block, compiler, desc); break; + case 0x76: generate_andni(block, compiler, desc); break; + case 0x77: generate_andni(block, compiler, desc); break; + case 0x78: generate_ori(block, compiler, desc); break; + case 0x79: generate_ori(block, compiler, desc); break; + case 0x7a: generate_ori(block, compiler, desc); break; + case 0x7b: generate_ori(block, compiler, desc); break; + case 0x7c: generate_xori(block, compiler, desc); break; + case 0x7d: generate_xori(block, compiler, desc); break; + case 0x7e: generate_xori(block, compiler, desc); break; + case 0x7f: generate_xori(block, compiler, desc); break; + case 0x80: generate_shrdi(block, compiler, desc); break; + case 0x81: generate_shrdi(block, compiler, desc); break; + case 0x82: generate_shrd(block, compiler, desc); break; + case 0x83: generate_shr(block, compiler, desc); break; + case 0x84: generate_sardi(block, compiler, desc); break; + case 0x85: generate_sardi(block, compiler, desc); break; + case 0x86: generate_sard(block, compiler, desc); break; + case 0x87: generate_sar(block, compiler, desc); break; + case 0x88: generate_shldi(block, compiler, desc); break; + case 0x89: generate_shldi(block, compiler, desc); break; + case 0x8a: generate_shld(block, compiler, desc); break; + case 0x8b: generate_shl(block, compiler, desc); break; + case 0x8c: generate_reserved(block, compiler, desc); break; + case 0x8d: generate_reserved(block, compiler, desc); break; + case 0x8e: generate_testlz(block, compiler, desc); break; + case 0x8f: generate_rol(block, compiler, desc); break; + case 0x90: generate_ldxx1(block, compiler, desc); break; + case 0x91: generate_ldxx1(block, compiler, desc); break; + case 0x92: generate_ldxx1(block, compiler, desc); break; + case 0x93: generate_ldxx1(block, compiler, desc); break; + case 0x94: generate_ldxx2(block, compiler, desc); break; + case 0x95: generate_ldxx2(block, compiler, desc); break; + case 0x96: generate_ldxx2(block, compiler, desc); break; + case 0x97: generate_ldxx2(block, compiler, desc); break; + case 0x98: generate_stxx1(block, compiler, desc); break; + case 0x99: generate_stxx1(block, compiler, desc); break; + case 0x9a: generate_stxx1(block, compiler, desc); break; + case 0x9b: generate_stxx1(block, compiler, desc); break; + case 0x9c: generate_stxx2(block, compiler, desc); break; + case 0x9d: generate_stxx2(block, compiler, desc); break; + case 0x9e: generate_stxx2(block, compiler, desc); break; + case 0x9f: generate_stxx2(block, compiler, desc); break; + case 0xa0: generate_shri(block, compiler, desc); break; + case 0xa1: generate_shri(block, compiler, desc); break; + case 0xa2: generate_shri(block, compiler, desc); break; + case 0xa3: generate_shri(block, compiler, desc); break; + case 0xa4: generate_sari(block, compiler, desc); break; + case 0xa5: generate_sari(block, compiler, desc); break; + case 0xa6: generate_sari(block, compiler, desc); break; + case 0xa7: generate_sari(block, compiler, desc); break; + case 0xa8: generate_shli(block, compiler, desc); break; + case 0xa9: generate_shli(block, compiler, desc); break; + case 0xaa: generate_shli(block, compiler, desc); break; + case 0xab: generate_shli(block, compiler, desc); break; + case 0xac: generate_reserved(block, compiler, desc); break; + case 0xad: generate_reserved(block, compiler, desc); break; + case 0xae: generate_reserved(block, compiler, desc); break; + case 0xaf: generate_reserved(block, compiler, desc); break; + case 0xb0: generate_mulsu(block, compiler, desc); break; + case 0xb1: generate_mulsu(block, compiler, desc); break; + case 0xb2: generate_mulsu(block, compiler, desc); break; + case 0xb3: generate_mulsu(block, compiler, desc); break; + case 0xb4: generate_mulsu(block, compiler, desc); break; + case 0xb5: generate_mulsu(block, compiler, desc); break; + case 0xb6: generate_mulsu(block, compiler, desc); break; + case 0xb7: generate_mulsu(block, compiler, desc); break; + case 0xb8: generate_set(block, compiler, desc); break; + case 0xb9: generate_set(block, compiler, desc); break; + case 0xba: generate_set(block, compiler, desc); break; + case 0xbb: generate_set(block, compiler, desc); break; + case 0xbc: generate_mul(block, compiler, desc); break; + case 0xbd: generate_mul(block, compiler, desc); break; + case 0xbe: generate_mul(block, compiler, desc); break; + case 0xbf: generate_mul(block, compiler, desc); break; + case 0xc0: generate_software(block, compiler, desc); break; // fadd + case 0xc1: generate_software(block, compiler, desc); break; // faddd + case 0xc2: generate_software(block, compiler, desc); break; // fsub + case 0xc3: generate_software(block, compiler, desc); break; // fsubd + case 0xc4: generate_software(block, compiler, desc); break; // fmul + case 0xc5: generate_software(block, compiler, desc); break; // fmuld + case 0xc6: generate_software(block, compiler, desc); break; // fdiv + case 0xc7: generate_software(block, compiler, desc); break; // fdivd + case 0xc8: generate_software(block, compiler, desc); break; // fcmp + case 0xc9: generate_software(block, compiler, desc); break; // fcmpd + case 0xca: generate_software(block, compiler, desc); break; // fcmpu + case 0xcb: generate_software(block, compiler, desc); break; // fcmpud + case 0xcc: generate_software(block, compiler, desc); break; // fcvt + case 0xcd: generate_software(block, compiler, desc); break; // fcvtd + case 0xce: generate_extend(block, compiler, desc); break; + case 0xcf: generate_do(block, compiler, desc); break; + case 0xd0: generate_ldwr(block, compiler, desc); break; + case 0xd1: generate_ldwr(block, compiler, desc); break; + case 0xd2: generate_lddr(block, compiler, desc); break; + case 0xd3: generate_lddr(block, compiler, desc); break; + case 0xd4: generate_ldwp(block, compiler, desc); break; + case 0xd5: generate_ldwp(block, compiler, desc); break; + case 0xd6: generate_lddp(block, compiler, desc); break; + case 0xd7: generate_lddp(block, compiler, desc); break; + case 0xd8: generate_stwr(block, compiler, desc); break; + case 0xd9: generate_stwr(block, compiler, desc); break; + case 0xda: generate_stdr(block, compiler, desc); break; + case 0xdb: generate_stdr(block, compiler, desc); break; + case 0xdc: generate_stwp(block, compiler, desc); break; + case 0xdd: generate_stwp(block, compiler, desc); break; + case 0xde: generate_stdp(block, compiler, desc); break; + case 0xdf: generate_stdp(block, compiler, desc); break; + case 0xe0: generate_db(block, compiler, desc); break; + case 0xe1: generate_db(block, compiler, desc); break; + case 0xe2: generate_db(block, compiler, desc); break; + case 0xe3: generate_db(block, compiler, desc); break; + case 0xe4: generate_db(block, compiler, desc); break; + case 0xe5: generate_db(block, compiler, desc); break; + case 0xe6: generate_db(block, compiler, desc); break; + case 0xe7: generate_db(block, compiler, desc); break; + case 0xe8: generate_db(block, compiler, desc); break; + case 0xe9: generate_db(block, compiler, desc); break; + case 0xea: generate_db(block, compiler, desc); break; + case 0xeb: generate_db(block, compiler, desc); break; + case 0xec: generate_dbr(block, compiler, desc); break; + case 0xed: generate_frame(block, compiler, desc); break; + case 0xee: generate_call_global(block, compiler, desc); break; + case 0xef: generate_call_local(block, compiler, desc); break; + case 0xf0: generate_b(block, compiler, desc); break; + case 0xf1: generate_b(block, compiler, desc); break; + case 0xf2: generate_b(block, compiler, desc); break; + case 0xf3: generate_b(block, compiler, desc); break; + case 0xf4: generate_b(block, compiler, desc); break; + case 0xf5: generate_b(block, compiler, desc); break; + case 0xf6: generate_b(block, compiler, desc); break; + case 0xf7: generate_b(block, compiler, desc); break; + case 0xf8: generate_b(block, compiler, desc); break; + case 0xf9: generate_b(block, compiler, desc); break; + case 0xfa: generate_b(block, compiler, desc); break; + case 0xfb: generate_b(block, compiler, desc); break; + case 0xfc: generate_br(block, compiler, desc); break; + case 0xfd: generate_trap_op(block, compiler, desc); break; + case 0xfe: generate_trap_op(block, compiler, desc); break; + case 0xff: generate_trap_op(block, compiler, desc); break; } + + UML_AND(block, DRC_SR, DRC_SR, ~ILC_MASK); + UML_OR(block, DRC_SR, DRC_SR, mem(&m_instruction_length)); + + int done; + UML_AND(block, I0, DRC_SR, (T_MASK | P_MASK)); + UML_CMP(block, I0, (T_MASK | P_MASK)); + UML_JMPc(block, uml::COND_NE, done = label++); + UML_TEST(block, mem(&m_delay_slot), 1); + UML_EXHc(block, uml::COND_E, *m_exception[EXCEPTION_TRACE], 0); + + UML_LABEL(block, done); return true; } \ No newline at end of file diff --git a/src/devices/cpu/e132xs/e132xsdrc_ops.cpp b/src/devices/cpu/e132xs/e132xsdrc_ops.cpp deleted file mode 100644 index 7c421f5af7a..00000000000 --- a/src/devices/cpu/e132xs/e132xsdrc_ops.cpp +++ /dev/null @@ -1,1035 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Ryan Holtz - -#include "e132xs.h" - -void hyperstone_device::generate_op00(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op01(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op02(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op03(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op04(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op05(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op06(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op07(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op08(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op09(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op0a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op0b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op0c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op0d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op0e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op0f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - - - -void hyperstone_device::generate_op10(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op11(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op12(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op13(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op14(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op15(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op16(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op17(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op18(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op19(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op1a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op1b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op1c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op1d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op1e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op1f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - - - -void hyperstone_device::generate_op20(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op21(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op22(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op23(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op24(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op25(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op26(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op27(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op28(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op29(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op2a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op2b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op2c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op2d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op2e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op2f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - - - -void hyperstone_device::generate_op30(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op31(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op32(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op33(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op34(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op35(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op36(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op37(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op38(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op39(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op3a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op3b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op3c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op3d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op3e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op3f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - - - -void hyperstone_device::generate_op40(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op41(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op42(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op43(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op44(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op45(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op46(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op47(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op48(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op49(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op4a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op4b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op4c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op4d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op4e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op4f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - - - -void hyperstone_device::generate_op50(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op51(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op52(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op53(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op54(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op55(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op56(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op57(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op58(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op59(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op5a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op5b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op5c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op5d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op5e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op5f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - - - -void hyperstone_device::generate_op60(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op61(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op62(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op63(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op64(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op65(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op66(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op67(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op68(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op69(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op6a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op6b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op6c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op6d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op6e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op6f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - - - -void hyperstone_device::generate_op70(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op71(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op72(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op73(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op74(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op75(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op76(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op77(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op78(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op79(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op7a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op7b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op7c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op7d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op7e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op7f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - - - -void hyperstone_device::generate_op80(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op81(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op82(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op83(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op84(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op85(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op86(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op87(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op88(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op89(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op8a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op8b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op8e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op8f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - - - -void hyperstone_device::generate_op90(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op91(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op92(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op93(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op94(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op95(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op96(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op97(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op98(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op99(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op9a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op9b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op9c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op9d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op9e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op9f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - - - -void hyperstone_device::generate_opa0(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opa1(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opa2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opa3(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opa4(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opa5(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opa6(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opa7(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opa8(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opa9(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opaa(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opab(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - - - - -void hyperstone_device::generate_opb0(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opb1(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opb2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opb3(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opb4(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opb5(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opb6(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opb7(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opb8(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opb9(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opba(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opbb(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opbc(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opbd(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opbe(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opbf(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - - - -void hyperstone_device::generate_opc0(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opc1(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opc2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opc3(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opc4(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opc5(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opc6(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opc7(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opc8(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opc9(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opca(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opcb(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opcc(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opcd(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opce(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opcf(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - - - -void hyperstone_device::generate_opd0(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opd1(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opd2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opd3(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opd4(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opd5(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opd6(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opd7(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opd8(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opd9(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opda(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opdb(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opdc(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opdd(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opde(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opdf(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - - - -void hyperstone_device::generate_ope0(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_ope1(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_ope2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_ope3(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_ope4(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_ope5(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_ope6(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_ope7(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_ope8(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_ope9(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opea(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opeb(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opec(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_oped(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opee(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opef(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - - - -void hyperstone_device::generate_opf0(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opf1(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opf2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opf3(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opf4(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opf5(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opf6(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opf7(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opf8(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opf9(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opfa(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opfb(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opfc(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opfd(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opfe(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opff(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} diff --git a/src/devices/cpu/e132xs/e132xsdrc_ops.hxx b/src/devices/cpu/e132xs/e132xsdrc_ops.hxx new file mode 100644 index 00000000000..4da04f7588d --- /dev/null +++ b/src/devices/cpu/e132xs/e132xsdrc_ops.hxx @@ -0,0 +1,575 @@ +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz + +#include "e132xs.h" + +void hyperstone_device::generate_check_delay_pc(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ + /* if PC is used in a delay instruction, the delayed PC should be used */ + UML_TEST(block, mem(&m_delay_slot), 1); + UML_MOVc(block, COND_E, mem(m_global_regs), mem(&m_delay_pc)); + UML_MOVc(block, COND_E, mem(&m_delay_slot), 0); +} + +void hyperstone_device::generate_decode_const(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +int hyperstone_device::generate_decode_immediate_s(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ + static int32_t immediate_values[16] = + { + 16, 0, 0, 0, 32, 64, 128, int32_t(0x80000000), + -8, -7, -6, -5, -4, -3, -2, -1 + }; + + int label = 1; + int nolut, done, zero_or_one, three; + + UML_AND(block, I1, I0, 0x0f); + UML_CMP(block, I1, 4); + UML_JMPc(block, COND_L, nolut = label++); + + // 4..f, immediate lookup + UML_LOAD(block, I1, (void *)immediate_values, I1, SIZE_DWORD, SCALE_x4); + UML_JMP(block, done = label++); + + UML_LABEL(block, nolut); + UML_CMP(block, I1, 2); + UML_JMPc(block, COND_L, zero_or_one = label++); + UML_JMPc(block, COND_G, three = label++); + + // 2 + UML_MOV(block, mem(&m_instruction_length), (2<<19)); + UML_READ(block, I1, mem(m_global_regs), SIZE_WORD, SPACE_PROGRAM); + UML_JMP(block, done); + + // 0..1 + UML_LABEL(block, zero_or_one); + UML_TEST(block, I1, 1); + UML_MOVc(block, COND_E, I1, 16); // 0 + UML_JMPc(block, COND_E, done); // if 0, we exit here. if 1, we fall through. + + // 1 + UML_MOV(block, mem(&m_instruction_length), (3<<19)); + UML_READ(block, I1, mem(m_global_regs), SIZE_WORD, SPACE_PROGRAM); + UML_SHL(block, I1, I1, 16); + UML_ADD(block, mem(m_global_regs), mem(m_global_regs), 2); + UML_READ(block, I2, mem(m_global_regs), SIZE_WORD, SPACE_PROGRAM); + UML_ADD(block, mem(m_global_regs), mem(m_global_regs), 2); + UML_JMP(block, done); + + // 3 + UML_LABEL(block, three); + UML_MOV(block, mem(&m_instruction_length), (2<<19)); + UML_READ(block, I1, mem(m_global_regs), SIZE_WORD, SPACE_PROGRAM); + UML_SEXT(block, I1, I1, SIZE_WORD); + // fall through to done + + UML_LABEL(block, done); + return label; +} + +void hyperstone_device::generate_ignore_immediate_s(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_decode_pcrel(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_ignore_pcrel(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +int hyperstone_device::generate_set_global_register(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc, int label) +{ + // Expects register index in I0, value in I1 + return label; +} + +void hyperstone_device::generate_trap(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc, uint32_t addr) +{ +} + +void hyperstone_device::generate_int(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc, uint32_t addr) +{ +} + +void hyperstone_device::generate_exception(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc, uint32_t addr) +{ +} + +void hyperstone_device::generate_software(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_chk(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_movd(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_divsu(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_xm(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_mask(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_sum(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_sums(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_cmp(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_mov(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_add(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_adds(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_cmpb(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_subc(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_sub(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_subs(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_addc(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_neg(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_negs(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_and(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_andn(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_or(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_xor(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_not(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_cmpi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +int hyperstone_device::generate_movi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ + int label = 1; + if (IMM_LONG) + { + label = generate_decode_immediate_s(block, compiler, desc); // I1 <-- imm32 + } + else + { + UML_AND(block, I1, I0, 0xf); + } + + int done = label++; + if (DST_GLOBAL) + { + UML_AND(block, I2, mem(&m_global_regs[1]), H_MASK); + UML_TEST(block, mem(&m_global_regs[1]), S_MASK); + UML_EXHc(block, uml::COND_Z, *m_exception[EXCEPTION_PRIVILEGE_ERROR], 0); + UML_JMPc(block, uml::COND_Z, done); + } + + UML_AND(block, DRC_SR, DRC_SR, ~(Z_MASK | N_MASK)); + + int no_z; + UML_TEST(block, I1, ~0); + UML_JMPc(block, uml::COND_NZ, no_z = label++); + UML_OR(block, DRC_SR, DRC_SR, Z_MASK); + UML_LABEL(block, no_z); + + int no_n; + UML_TEST(block, I1, 0x80000000); + UML_JMPc(block, uml::COND_Z, no_n = label++); + UML_OR(block, DRC_SR, DRC_SR, N_MASK); + UML_LABEL(block, no_n); + +#if MISSIONCRAFT_FLAGS + UML_AND(block, DRC_SR, DRC_SR, ~V_MASK); +#endif + + UML_ROLAND(block, I0, I0, 30, 0x3c); + + if (DST_GLOBAL) + { + int no_pc; + UML_TEST(block, I0, 0xf0); + UML_JMPc(block, uml::COND_NZ, no_pc = label++); + UML_AND(block, mem(m_global_regs), I1, ~1); + UML_AND(block, DRC_SR, DRC_SR, ~M_MASK); + generate_delay_slot_and_branch(block, compiler, desc); + UML_JMP(block, done); + + UML_LABEL(block, no_pc); + + // TODO + UML_JMP(block, done); + } + else + { + UML_ROLAND(block, I2, DRC_SR, 7, 0x7f); + UML_ADD(block, I0, I0, I2); + UML_AND(block, I0, I0, 0x3f); + UML_STORE(block, (void *)m_local_regs, I0, I1, SIZE_DWORD, SCALE_x4); + } + + UML_LABEL(block, done); + return label; +} + + +template +void hyperstone_device::generate_addi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_addsi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_cmpbi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_andni(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_ori(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_xori(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_shrdi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +void hyperstone_device::generate_shrd(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +void hyperstone_device::generate_shr(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_shri(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_sardi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +void hyperstone_device::generate_sard(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +void hyperstone_device::generate_sar(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_sari(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_shldi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +void hyperstone_device::generate_shld(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +void hyperstone_device::generate_shl(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_shli(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +void hyperstone_device::generate_testlz(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +void hyperstone_device::generate_rol(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_ldxx1(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_ldxx2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_stxx1(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_stxx2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_mulsu(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_mul(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_set(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_ldwr(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_lddr(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_ldwp(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_lddp(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_stwr(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_stdr(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_stwp(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_stdp(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +void hyperstone_device::generate_br(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_db(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +void hyperstone_device::generate_dbr(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +void hyperstone_device::generate_frame(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_call_global(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_call_local(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +void hyperstone_device::generate_trap_op(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_extend(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +void hyperstone_device::generate_reserved(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_do(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + diff --git a/src/devices/cpu/e132xs/e132xsfe.cpp b/src/devices/cpu/e132xs/e132xsfe.cpp index b0ece09d68f..c13e72f8e89 100644 --- a/src/devices/cpu/e132xs/e132xsfe.cpp +++ b/src/devices/cpu/e132xs/e132xsfe.cpp @@ -10,6 +10,7 @@ #include "emu.h" #include "e132xsfe.h" +#include "32xsdefs.h" #define FE_FP ((m_cpu->m_global_regs[1] & 0xfe000000) >> 25) #define FE_FL (m_cpu->m_fl_lut[((m_cpu->m_global_regs[1] >> 21) & 0xf)]) @@ -69,6 +70,30 @@ inline uint32_t e132xs_frontend::read_ldstxx_imm(opcode_desc &desc) return extra_s; } +inline uint32_t e132xs_frontend::read_limm(opcode_desc &desc, uint16_t op) +{ + static const int32_t immediate_values[16] = + { + 16, 0, 0, 0, 32, 64, 128, int32_t(0x80000000), + -8, -7, -6, -5, -4, -3, -2, -1 + }; + + uint8_t nybble = op & 0xf; + switch (nybble) + { + case 0: + return 16; + case 1: + return (read_imm1(desc) << 16) | read_imm2(desc); + case 2: + return read_imm1(desc); + case 3: + return 0xffff0000 | read_imm1(desc); + default: + return immediate_values[nybble]; + } +} + inline int32_t e132xs_frontend::decode_pcrel(opcode_desc &desc, uint16_t op) { if (op & 0x80) @@ -119,7 +144,7 @@ inline int32_t e132xs_frontend::decode_call(opcode_desc &desc) bool e132xs_frontend::describe(opcode_desc &desc, const opcode_desc *prev) { - uint16_t op = read_word(desc); + uint16_t op = desc.opptr.w[0] = read_word(desc); /* most instructions are 2 bytes and a single cycle */ desc.length = 2; @@ -326,6 +351,7 @@ bool e132xs_frontend::describe(opcode_desc &desc, const opcode_desc *prev) desc.regout[0] |= 1 << gdst_code; desc.regout[0] |= SR_CODE; desc.length = (read_imm1(desc) & 0x8000) ? 6 : 4; + if (op & 0x4 && gsrc_code != SR_REGISTER) desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; break; case 0x19: // sum global,local case 0x1d: // sums global,local @@ -334,6 +360,7 @@ bool e132xs_frontend::describe(opcode_desc &desc, const opcode_desc *prev) desc.regout[0] |= 1 << gdst_code; desc.regout[0] |= SR_CODE; desc.length = (read_imm1(desc) & 0x8000) ? 6 : 4; + if (op & 0x4) desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; break; case 0x1a: // sum local,global case 0x1e: // sums local,global @@ -342,6 +369,7 @@ bool e132xs_frontend::describe(opcode_desc &desc, const opcode_desc *prev) desc.regout[ldst_group] |= 1 << ldst_code; desc.regout[0] |= SR_CODE; desc.length = (read_imm1(desc) & 0x8000) ? 6 : 4; + if (op & 0x4 && gsrc_code != SR_REGISTER) desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; break; case 0x1b: // sum local,local case 0x1f: // sums local,local @@ -350,6 +378,7 @@ bool e132xs_frontend::describe(opcode_desc &desc, const opcode_desc *prev) desc.regout[ldst_group] |= 1 << ldst_code; desc.regout[0] |= SR_CODE; desc.length = (read_imm1(desc) & 0x8000) ? 6 : 4; + if (op & 0x4) desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; break; case 0x20: // cmp global,global case 0x30: // cmpb global,global @@ -384,12 +413,14 @@ bool e132xs_frontend::describe(opcode_desc &desc, const opcode_desc *prev) desc.regin[0] |= 1 << (gsrc_code + 16); desc.regout[0] |= 1 << gdst_code; desc.regout[0] |= SR_CODE; + desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; break; case 0x25: // mov global,local desc.regin[0] |= SR_CODE; desc.regin[lsrc_group] |= 1 << lsrc_code; desc.regout[0] |= 1 << gdst_code; desc.regout[0] |= SR_CODE; + desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; break; case 0x26: // mov local,global desc.regin[0] |= SR_CODE; @@ -549,24 +580,28 @@ bool e132xs_frontend::describe(opcode_desc &desc, const opcode_desc *prev) desc.regin[0] |= 1 << gsrc_code; desc.regout[0] |= 1 << gdst_code; desc.regout[0] |= SR_CODE; + desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; break; case 0x5d: // negs global,local desc.regin[0] |= SR_CODE; desc.regin[lsrc_group] |= 1 << lsrc_code; desc.regout[0] |= 1 << gdst_code; desc.regout[0] |= SR_CODE; + desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; break; case 0x5e: // negs local,global desc.regin[0] |= SR_CODE; desc.regin[0] |= 1 << gsrc_code; desc.regout[ldst_group] |= 1 << ldst_code; desc.regout[0] |= SR_CODE; + desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; break; case 0x5f: // negs local,local desc.regin[0] |= SR_CODE; desc.regin[lsrc_group] |= 1 << lsrc_code; desc.regout[ldst_group] |= 1 << ldst_code; desc.regout[0] |= SR_CODE; + desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; break; case 0x60: // cmpi global,simm case 0x70: // cmpbi global,simm @@ -597,6 +632,12 @@ bool e132xs_frontend::describe(opcode_desc &desc, const opcode_desc *prev) desc.regout[0] |= 1 << gdst_code; desc.regout[0] |= 1 << (gdst_code + 16); desc.regout[0] |= SR_CODE; + desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; + if (gdst_code == PC_REGISTER) + { + desc.targetpc = op & 0xf; + desc.flags |= OPFLAG_IS_UNCONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE; + } break; case 0x65: // movi global,limm desc.regin[0] |= SR_CODE; @@ -604,6 +645,12 @@ bool e132xs_frontend::describe(opcode_desc &desc, const opcode_desc *prev) desc.regout[0] |= 1 << (gdst_code + 16); desc.regout[0] |= SR_CODE; desc.length = (read_imm1(desc) & 0x8000) ? 6 : 4; + desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; + if (gdst_code == PC_REGISTER) + { + desc.targetpc = read_limm(desc, op); + desc.flags |= OPFLAG_IS_UNCONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE; + } break; case 0x66: // movi local,simm desc.regin[0] |= SR_CODE; diff --git a/src/devices/cpu/e132xs/e132xsfe.h b/src/devices/cpu/e132xs/e132xsfe.h index 1d42177110a..1cac61a08cd 100644 --- a/src/devices/cpu/e132xs/e132xsfe.h +++ b/src/devices/cpu/e132xs/e132xsfe.h @@ -23,6 +23,7 @@ private: inline uint16_t read_imm1(opcode_desc &desc); inline uint16_t read_imm2(opcode_desc &desc); inline uint32_t read_ldstxx_imm(opcode_desc &desc); + inline uint32_t read_limm(opcode_desc &desc, uint16_t op); inline int32_t decode_pcrel(opcode_desc &desc, uint16_t op); inline int32_t decode_call(opcode_desc &desc); diff --git a/src/devices/cpu/e132xs/e132xsop.hxx b/src/devices/cpu/e132xs/e132xsop.hxx index e9290ea4ab1..22b39a70818 100644 --- a/src/devices/cpu/e132xs/e132xsop.hxx +++ b/src/devices/cpu/e132xs/e132xsop.hxx @@ -277,10 +277,12 @@ void hyperstone_device::hyperstone_sums() const int32_t sreg = int32_t(SRC_GLOBAL ? ((src_code == SR_REGISTER) ? GET_C : m_global_regs[src_code]) : m_local_regs[src_code]); const int64_t tmp = int64_t(sreg) + int64_t(extra_s); + + SR &= ~(Z_MASK | N_MASK | V_MASK); SR |= ((sreg ^ tmp) & (extra_s ^ tmp) & 0x80000000) >> 28; //#if SETCARRYS -// CHECK_C(tmp); +// SR |= (tmp & 0x100000000) >> 32; //#endif const int32_t res = sreg + extra_s; @@ -318,15 +320,14 @@ void hyperstone_device::hyperstone_cmp() SR &= ~(Z_MASK | N_MASK | V_MASK | C_MASK); SR |= ((tmp ^ dreg) & (dreg ^ sreg) & 0x80000000) >> 28; - if (dreg == sreg) + if (dreg < sreg) + SR |= C_MASK; + else if (dreg == sreg) SR |= Z_MASK; if (int32_t(dreg) < int32_t(sreg)) SR |= N_MASK; - if (dreg < sreg) - SR |= C_MASK; - m_icount -= m_clock_cycles_1; } @@ -425,7 +426,7 @@ void hyperstone_device::hyperstone_adds() SR |= ((sreg ^ tmp) & (dreg ^ tmp) & 0x80000000) >> 28; //#if SETCARRYS -// CHECK_C(tmp); +// SR |= (tmp & 0x100000000) >> 32; //#endif const int32_t res = sreg + dreg; @@ -655,7 +656,7 @@ void hyperstone_device::hyperstone_subs() SR &= ~(V_MASK | Z_MASK | N_MASK); //#ifdef SETCARRYS -// CHECK_C(tmp); +// SR |= (tmp & 0x100000000) >> 32; //#endif SR |= ((tmp ^ dreg) & (dreg ^ sreg) & 0x80000000) >> 28; @@ -700,13 +701,13 @@ void hyperstone_device::hyperstone_addc() if (SRC_GLOBAL && (src_code == SR_REGISTER)) { tmp = uint64_t(dreg) + uint64_t(c); - SR |= ((dreg ^ tmp) & (c ^ tmp) & 0x80000000) >> 28; + SR |= ((dreg ^ tmp) & tmp & 0x80000000) >> 28; dreg += c; } else { tmp = uint64_t(sreg) + uint64_t(dreg) + uint64_t(c); - SR |= ((sreg ^ tmp) & (dreg ^ tmp) & (c ^ tmp) & 0x80000000) >> 28; + SR |= ((sreg ^ tmp) & (dreg ^ tmp) & tmp & 0x80000000) >> 28; dreg += sreg + c; } @@ -792,7 +793,7 @@ void hyperstone_device::hyperstone_negs() SR |= V_MASK; //#if SETCARRYS -// CHECK_C(tmp); +// SR |= (tmp & 0x100000000) >> 32; //#endif const int32_t res = -sreg; @@ -824,7 +825,7 @@ void hyperstone_device::hyperstone_cmpi() check_delay_PC(); if (!IMM_LONG) - imm = immediate_values[m_op & 0x0f]; + imm = m_op & 0x0f; const uint32_t dst_code = DST_GLOBAL ? DST_CODE : ((DST_CODE + GET_FP) & 0x3f); const uint32_t dreg = (DST_GLOBAL ? m_global_regs : m_local_regs)[dst_code]; @@ -833,15 +834,14 @@ void hyperstone_device::hyperstone_cmpi() uint64_t tmp = (uint64_t)dreg - (uint64_t)imm; SR |= ((tmp ^ dreg) & (dreg ^ imm) & 0x80000000) >> 28; - if (dreg == imm) + if (dreg < imm) + SR |= C_MASK; + else if (dreg == imm) SR |= Z_MASK; if ((int32_t)dreg < (int32_t)imm) SR |= N_MASK; - if (dreg < imm) - SR |= C_MASK; - m_icount -= m_clock_cycles_1; } @@ -854,7 +854,7 @@ void hyperstone_device::hyperstone_movi() check_delay_PC(); if (!IMM_LONG) - imm = immediate_values[m_op & 0x0f]; + imm = m_op & 0x0f; const bool h = (SR & H_MASK) != 0; if (DST_GLOBAL && h && !(SR & S_MASK)) @@ -903,7 +903,7 @@ void hyperstone_device::hyperstone_addi() if (!N_OP_MASK) imm = GET_C & (((SR & Z_MASK) ? 0 : 1) | (dreg & 0x01)); else if (!IMM_LONG) - imm = immediate_values[m_op & 0x0f]; + imm = m_op & 0x0f; SR &= ~(C_MASK | V_MASK | Z_MASK | N_MASK); @@ -952,7 +952,7 @@ void hyperstone_device::hyperstone_addsi() } else { - imm = immediate_values[m_op & 0x0f]; + imm = m_op & 0x0f; } } else @@ -971,7 +971,7 @@ void hyperstone_device::hyperstone_addsi() SR |= ((imm ^ tmp) & (dreg ^ tmp) & 0x80000000) >> 28; //#if SETCARRYS -// CHECK_C(tmp); +// SR |= (tmp & 0x100000000) >> 32; //#endif const int32_t res = imm + (int32_t)dreg; @@ -1023,7 +1023,7 @@ void hyperstone_device::hyperstone_cmpbi() } else { - imm = immediate_values[m_op & 0x0f]; + imm = m_op & 0x0f; } } @@ -1060,7 +1060,7 @@ void hyperstone_device::hyperstone_andni() if (N_OP_MASK == 0x10f) imm = 0x7fffffff; // bit 31 = 0, others = 1 else if (!IMM_LONG) - imm = immediate_values[m_op & 0x0f]; + imm = m_op & 0x0f; uint32_t dreg; if (DST_GLOBAL) @@ -1100,7 +1100,7 @@ void hyperstone_device::hyperstone_ori() check_delay_PC(); if (!IMM_LONG) - imm = immediate_values[m_op & 0x0f]; + imm = m_op & 0x0f; uint32_t dreg; if (DST_GLOBAL) { @@ -1138,7 +1138,7 @@ void hyperstone_device::hyperstone_xori() check_delay_PC(); if (!IMM_LONG) - imm = immediate_values[m_op & 0x0f]; + imm = m_op & 0x0f; uint32_t dreg; if (DST_GLOBAL) { @@ -2535,7 +2535,7 @@ void hyperstone_device::hyperstone_lddr() } template -void hyperstone_device::hypesrtone_ldwp() +void hyperstone_device::hyperstone_ldwp() { check_delay_PC(); @@ -2677,7 +2677,7 @@ void hyperstone_device::hyperstone_db() { const int32_t offset = decode_pcrel(); check_delay_PC(); - m_delay_slot = true; + m_delay_slot = 1; m_delay_pc = PC + offset; m_intblock = 3; } @@ -2698,7 +2698,7 @@ void hyperstone_device::hyperstone_db() { const int32_t offset = decode_pcrel(); check_delay_PC(); - m_delay_slot = true; + m_delay_slot = 1; m_delay_pc = PC + offset; m_intblock = 3; } @@ -2712,7 +2712,7 @@ void hyperstone_device::hyperstone_dbr() const int32_t offset = decode_pcrel(); check_delay_PC(); - m_delay_slot = true; + m_delay_slot = 1; m_delay_pc = PC + offset; m_intblock = 3; } @@ -2885,7 +2885,7 @@ void hyperstone_device::hyperstone_b() { if (SR & condition_masks[CONDITION]) { - execute_br(); + hyperstone_br(); } else { @@ -2904,7 +2904,7 @@ void hyperstone_device::hyperstone_b() } else { - execute_br(); + hyperstone_br(); } } } -- cgit v1.2.3-70-g09d2 From 5d51e9110027e4aff1f9d3f109cee4278a0847e8 Mon Sep 17 00:00:00 2001 From: mooglyguy Date: Wed, 6 Dec 2017 21:51:16 +0100 Subject: no help = no hyperstone drc, nw --- scripts/src/cpu.lua | 6 +- src/devices/cpu/e132xs/e132xs.cpp | 77 - src/devices/cpu/e132xs/e132xs.h | 179 --- src/devices/cpu/e132xs/e132xsdrc.cpp | 983 ------------ src/devices/cpu/e132xs/e132xsdrc_ops.hxx | 2438 ------------------------------ src/devices/cpu/e132xs/e132xsfe.cpp | 1303 ---------------- src/devices/cpu/e132xs/e132xsfe.h | 34 - 7 files changed, 1 insertion(+), 5019 deletions(-) delete mode 100644 src/devices/cpu/e132xs/e132xsdrc.cpp delete mode 100644 src/devices/cpu/e132xs/e132xsdrc_ops.hxx delete mode 100644 src/devices/cpu/e132xs/e132xsfe.cpp delete mode 100644 src/devices/cpu/e132xs/e132xsfe.h (limited to 'scripts/src/cpu.lua') diff --git a/scripts/src/cpu.lua b/scripts/src/cpu.lua index 69d70d8b237..97c0ee7e384 100644 --- a/scripts/src/cpu.lua +++ b/scripts/src/cpu.lua @@ -13,7 +13,7 @@ -- Dynamic recompiler objects -------------------------------------------------- -if (CPUS["SH"]~=null or CPUS["MIPS"]~=null or CPUS["POWERPC"]~=null or CPUS["RSP"]~=null or CPUS["ARM7"]~=null or CPUS["ADSP21062"]~=null or CPUS["MB86235"]~=null or CPUS["E1"]~=null) then +if (CPUS["SH"]~=null or CPUS["MIPS"]~=null or CPUS["POWERPC"]~=null or CPUS["RSP"]~=null or CPUS["ARM7"]~=null or CPUS["ADSP21062"]~=null or CPUS["MB86235"]~=null) then files { MAME_DIR .. "src/devices/cpu/drcbec.cpp", MAME_DIR .. "src/devices/cpu/drcbec.h", @@ -808,10 +808,6 @@ if (CPUS["E1"]~=null) then files { MAME_DIR .. "src/devices/cpu/e132xs/e132xs.cpp", MAME_DIR .. "src/devices/cpu/e132xs/e132xs.h", - MAME_DIR .. "src/devices/cpu/e132xs/e132xsfe.cpp", - MAME_DIR .. "src/devices/cpu/e132xs/e132xsfe.h", - MAME_DIR .. "src/devices/cpu/e132xs/e132xsdrc.cpp", - MAME_DIR .. "src/devices/cpu/e132xs/e132xsdrc_ops.hxx", MAME_DIR .. "src/devices/cpu/e132xs/32xsdefs.h", MAME_DIR .. "src/devices/cpu/e132xs/e132xsop.hxx", } diff --git a/src/devices/cpu/e132xs/e132xs.cpp b/src/devices/cpu/e132xs/e132xs.cpp index 7f3d8c2efcc..3793e351b73 100644 --- a/src/devices/cpu/e132xs/e132xs.cpp +++ b/src/devices/cpu/e132xs/e132xs.cpp @@ -144,7 +144,6 @@ #include "emu.h" #include "e132xs.h" -#include "e132xsfe.h" #include "debugger.h" @@ -153,9 +152,6 @@ //#define VERBOSE 1 #include "logmacro.h" -/* size of the execution code cache */ -#define CACHE_SIZE (32 * 1024 * 1024) - //************************************************************************** // INTERNAL ADDRESS MAP //************************************************************************** @@ -203,27 +199,6 @@ hyperstone_device::hyperstone_device(const machine_config &mconfig, const char * , m_program_config("program", ENDIANNESS_BIG, prg_data_width, 32, 0, internal_map) , m_io_config("io", ENDIANNESS_BIG, io_data_width, 15) , m_icount(0) - , m_cache(CACHE_SIZE + sizeof(hyperstone_device)) - , m_drcuml(nullptr) - , m_drcfe(nullptr) - , m_drcoptions(0) - , m_cache_dirty(0) - , m_entry(nullptr) - , m_nocode(nullptr) - , m_out_of_cycles(nullptr) - , m_drc_arg0(0) - , m_drc_arg1(0) - , m_drc_arg2(0) - , m_drc_arg3(0) - , m_mem_read8(nullptr) - , m_mem_write8(nullptr) - , m_mem_read16(nullptr) - , m_mem_write16(nullptr) - , m_mem_read32(nullptr) - , m_mem_write32(nullptr) - , m_io_read32(nullptr) - , m_io_write32(nullptr) - , m_enable_drc(false) { } @@ -1017,12 +992,6 @@ void hyperstone_device::device_start() void hyperstone_device::init(int scale_mask) { -#if ENABLE_E132XS_DRC - m_enable_drc = allow_drc(); -#else - m_enable_drc = false; -#endif - memset(m_global_regs, 0, sizeof(uint32_t) * 32); memset(m_local_regs, 0, sizeof(uint32_t) * 64); m_op = 0; @@ -1057,38 +1026,6 @@ void hyperstone_device::init(int scale_mask) m_fl_lut[i] = (i ? i : 16); } - uint32_t umlflags = 0; - m_drcuml = std::make_unique(*this, m_cache, umlflags, 1, 32, 1); - - // add UML symbols- - m_drcuml->symbol_add(&m_global_regs[0], sizeof(uint32_t), "pc"); - m_drcuml->symbol_add(&m_global_regs[1], sizeof(uint32_t), "sr"); - m_drcuml->symbol_add(&m_icount, sizeof(m_icount), "icount"); - - char buf[4]; - for (int i=0; i < 32; i++) - { - sprintf(buf, "g%d", i); - m_drcuml->symbol_add(&m_global_regs[i], sizeof(uint32_t), buf); - } - - for (int i=0; i < 64; i++) - { - sprintf(buf, "l%d", i); - m_drcuml->symbol_add(&m_local_regs[i], sizeof(uint32_t), buf); - } - - m_drcuml->symbol_add(&m_drc_arg0, sizeof(uint32_t), "arg0"); - m_drcuml->symbol_add(&m_drc_arg1, sizeof(uint32_t), "arg1"); - m_drcuml->symbol_add(&m_drc_arg2, sizeof(uint32_t), "arg2"); - m_drcuml->symbol_add(&m_drc_arg3, sizeof(uint32_t), "arg3"); - - /* initialize the front-end helper */ - m_drcfe = std::make_unique(this, COMPILE_BACKWARDS_BYTES, COMPILE_FORWARDS_BYTES, SINGLE_INSTRUCTION_MODE ? 1 : COMPILE_MAX_SEQUENCE); - - /* mark the cache dirty so it is updated on next execute */ - m_cache_dirty = true; - // register our state for the debugger state_add(STATE_GENPC, "GENPC", m_global_regs[0]).noshow(); state_add(STATE_GENPCBASE, "CURPC", m_global_regs[0]).noshow(); @@ -1347,14 +1284,6 @@ void hyperstone_device::device_reset() void hyperstone_device::device_stop() { - if (m_drcfe != nullptr) - { - m_drcfe = nullptr; - } - if (m_drcuml != nullptr) - { - m_drcuml = nullptr; - } } @@ -1521,12 +1450,6 @@ void hyperstone_device::hyperstone_do() void hyperstone_device::execute_run() { - if (m_enable_drc) - { - execute_run_drc(); - return; - } - if (m_intblock < 0) m_intblock = 0; diff --git a/src/devices/cpu/e132xs/e132xs.h b/src/devices/cpu/e132xs/e132xs.h index 73e2fe74e77..4ccc09de6ff 100644 --- a/src/devices/cpu/e132xs/e132xs.h +++ b/src/devices/cpu/e132xs/e132xs.h @@ -5,9 +5,6 @@ #pragma once -#include "cpu/drcfe.h" -#include "cpu/drcuml.h" -#include "cpu/drcumlsh.h" #include "32xsdasm.h" /* @@ -26,32 +23,6 @@ -/*************************************************************************** - CONSTANTS -***************************************************************************/ - -/* map variables */ -#define MAPVAR_PC M0 -#define MAPVAR_CYCLES M1 - -/* compilation boundaries -- how far back/forward does the analysis extend? */ -#define COMPILE_BACKWARDS_BYTES 128 -#define COMPILE_FORWARDS_BYTES 512 -#define COMPILE_MAX_INSTRUCTIONS ((COMPILE_BACKWARDS_BYTES/4) + (COMPILE_FORWARDS_BYTES/4)) -#define COMPILE_MAX_SEQUENCE 64 - -/* exit codes */ -#define EXECUTE_OUT_OF_CYCLES 0 -#define EXECUTE_MISSING_CODE 1 -#define EXECUTE_UNMAPPED_CODE 2 -#define EXECUTE_RESET_CACHE 3 - -#define E132XS_STRICT_VERIFY 0x0001 /* verify all instructions */ - -#define SINGLE_INSTRUCTION_MODE (1) - -#define ENABLE_E132XS_DRC (0) - //************************************************************************** // TYPE DEFINITIONS //************************************************************************** @@ -374,156 +345,6 @@ private: void hyperstone_reserved(); void hyperstone_do(); - - drc_cache m_cache; - std::unique_ptr m_drcuml; - std::unique_ptr m_drcfe; - uint32_t m_drcoptions; - uint8_t m_cache_dirty; - - uml::parameter m_regmap[16]; - - uml::code_handle *m_entry; - uml::code_handle *m_nocode; - uml::code_handle *m_out_of_cycles; - - uint32_t m_drc_arg0; - uint32_t m_drc_arg1; - uint32_t m_drc_arg2; - uint32_t m_drc_arg3; - uint32_t m_branch_dest; - - uml::code_handle *m_mem_read8; - uml::code_handle *m_mem_write8; - uml::code_handle *m_mem_read16; - uml::code_handle *m_mem_write16; - uml::code_handle *m_mem_read32; - uml::code_handle *m_mem_write32; - uml::code_handle *m_io_read32; - uml::code_handle *m_io_write32; - uml::code_handle *m_exception[EXCEPTION_COUNT]; - - bool m_enable_drc; - - /* internal compiler state */ - struct compiler_state - { - uint32_t m_cycles; /* accumulated cycles */ - uint8_t m_checkints; /* need to check interrupts before next instruction */ - uml::code_label m_labelnum; /* index for local labels */ - }; - - void execute_run_drc(); - void flush_drc_cache(); - void code_flush_cache(); - void code_compile_block(offs_t pc); - //void load_fast_iregs(drcuml_block *block); - //void save_fast_iregs(drcuml_block *block); - void static_generate_entry_point(); - void static_generate_nocode_handler(); - void static_generate_out_of_cycles(); - void static_generate_exception(uint32_t exception, const char *name); - void static_generate_memory_accessor(int size, int iswrite, bool isio, const char *name, uml::code_handle *&handleptr); - void generate_delay_slot_and_branch(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_update_cycles(drcuml_block *block, compiler_state *compiler, uml::parameter param); - void generate_checksum_block(drcuml_block *block, compiler_state *compiler, const opcode_desc *seqhead, const opcode_desc *seqlast); - void generate_sequence_instruction(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void log_add_disasm_comment(drcuml_block *block, uint32_t pc, uint32_t op); - bool generate_opcode(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - - void generate_get_trap_addr(drcuml_block *block, uml::code_label &label, uint32_t trapno); - void generate_check_delay_pc(drcuml_block *block); - void generate_decode_const(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_decode_immediate_s(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_ignore_immediate_s(drcuml_block *block, const opcode_desc *desc); - void generate_decode_pcrel(drcuml_block *block, const opcode_desc *desc); - void generate_ignore_pcrel(drcuml_block *block, const opcode_desc *desc); - - void generate_set_global_register(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - - void generate_trap(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc, uint32_t addr); - void generate_int(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc, uint32_t addr); - 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 void generate_chk(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_movd(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_divsu(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_xm(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_mask(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_sum(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_sums(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_cmp(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_mov(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_add(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_adds(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_cmpb(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_subc(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_sub(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_subs(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_addc(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_neg(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_negs(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_and(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_andn(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_or(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_xor(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_not(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_cmpi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_movi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_addi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_addsi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_cmpbi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_andni(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_ori(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_xori(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_shrdi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_shrd(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_shr(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_shri(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_sardi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_sard(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_sar(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_sari(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_shldi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_shld(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_shl(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_shli(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_testlz(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_rol(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_ldxx1(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_ldxx2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_stxx1(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_stxx2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - - template void generate_mulsu(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_mul(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - - template void generate_set(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - - template void generate_ldwr(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_lddr(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_ldwp(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_lddp(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - - template void generate_stwr(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_stdr(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_stwp(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_stdp(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - - template void generate_b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_br(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_db(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_dbr(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - - void generate_frame(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_call(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - - void generate_trap_op(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_extend(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - - void generate_reserved(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_do(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); }; // device type definition diff --git a/src/devices/cpu/e132xs/e132xsdrc.cpp b/src/devices/cpu/e132xs/e132xsdrc.cpp deleted file mode 100644 index 8f0d44fad1d..00000000000 --- a/src/devices/cpu/e132xs/e132xsdrc.cpp +++ /dev/null @@ -1,983 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Ryan Holtz - -#include "emu.h" -#include "e132xs.h" -#include "e132xsfe.h" -#include "32xsdefs.h" - -using namespace uml; - -#define DRC_PC mem(m_global_regs) -#define DRC_SR mem(&m_global_regs[1]) - -void hyperstone_device::execute_run_drc() -{ - drcuml_state *drcuml = m_drcuml.get(); - int execute_result; - - /* reset the cache if dirty */ - if (m_cache_dirty) - { - code_flush_cache(); - m_cache_dirty = false; - } - - - /* execute */ - do - { - /* run as much as we can */ - execute_result = drcuml->execute(*m_entry); - - /* if we need to recompile, do it */ - if (execute_result == EXECUTE_MISSING_CODE) - { - code_compile_block(m_global_regs[0]); - } - else if (execute_result == EXECUTE_UNMAPPED_CODE) - { - fatalerror("Attempted to execute unmapped code at PC=%08X\n", m_global_regs[0]); - } - else if (execute_result == EXECUTE_RESET_CACHE) - { - code_flush_cache(); - } - } while (execute_result != EXECUTE_OUT_OF_CYCLES); -} - - -/*************************************************************************** - C FUNCTION CALLBACKS -***************************************************************************/ - -/*------------------------------------------------- - cfunc_unimplemented - handler for - unimplemented opcdes --------------------------------------------------*/ - -inline void hyperstone_device::ccfunc_unimplemented() -{ - fatalerror("PC=%08X: Unimplemented op %08X\n", PC, m_drc_arg0); -} - -inline void hyperstone_device::ccfunc_print() -{ - printf("%c: %08X\n", (char)m_drc_arg0, m_drc_arg1); -} - -static void cfunc_unimplemented(void *param) -{ - ((hyperstone_device *)param)->ccfunc_unimplemented(); -} - -static void cfunc_adjust_timer_interrupt(void *param) -{ - ((hyperstone_device *)param)->adjust_timer_interrupt(); -} - -static void cfunc_compute_tr(void *param) -{ - ((hyperstone_device *)param)->compute_tr(); -} - -static void cfunc_update_timer_prescale(void *param) -{ - ((hyperstone_device *)param)->update_timer_prescale(); -} - -#if 0 -static void cfunc_print(void *param) -{ - ((hyperstone_device *)param)->ccfunc_print(); -} -#endif - -/*------------------------------------------------- - ccfunc_total_cycles - compute the total number - of cycles executed so far --------------------------------------------------*/ - -void hyperstone_device::ccfunc_total_cycles() -{ - m_numcycles = total_cycles(); -} - -static void cfunc_total_cycles(void *param) -{ - ((hyperstone_device *)param)->ccfunc_total_cycles(); -} - -/*************************************************************************** - CACHE MANAGEMENT -***************************************************************************/ - -/*------------------------------------------------- - flush_drc_cache - outward-facing accessor to - code_flush_cache --------------------------------------------------*/ - -void hyperstone_device::flush_drc_cache() -{ - if (!m_enable_drc) - return; - m_cache_dirty = true; -} - -/*------------------------------------------------- - code_flush_cache - flush the cache and - regenerate static code --------------------------------------------------*/ - -void hyperstone_device::code_flush_cache() -{ - /* empty the transient cache contents */ - m_drcuml->reset(); - - try - { - /* generate the entry point and out-of-cycles handlers */ - static_generate_entry_point(); - static_generate_nocode_handler(); - static_generate_out_of_cycles(); - - static_generate_exception(EXCEPTION_IO2, "io2"); - static_generate_exception(EXCEPTION_IO1, "io1"); - static_generate_exception(EXCEPTION_INT4, "int4"); - static_generate_exception(EXCEPTION_INT3, "int3"); - static_generate_exception(EXCEPTION_INT2, "int2"); - static_generate_exception(EXCEPTION_INT1, "int1"); - static_generate_exception(EXCEPTION_IO3, "io3"); - static_generate_exception(EXCEPTION_TIMER, "timer"); - static_generate_exception(EXCEPTION_RESERVED1, "reserved1"); - static_generate_exception(EXCEPTION_TRACE, "trace"); - static_generate_exception(EXCEPTION_PARITY_ERROR, "parity_error"); - static_generate_exception(EXCEPTION_EXTENDED_OVERFLOW, "extended_overflow"); - static_generate_exception(EXCEPTION_RANGE_ERROR, "range_error"); - static_generate_exception(EXCEPTION_RESERVED2, "reserved2"); - static_generate_exception(EXCEPTION_RESET, "reset"); - static_generate_exception(EXCEPTION_ERROR_ENTRY, "error_entry"); - - /* add subroutines for memory accesses */ - static_generate_memory_accessor(1, false, false, "read8", m_mem_read8); - static_generate_memory_accessor(1, true, false, "write8", m_mem_write8); - static_generate_memory_accessor(2, false, false, "read16", m_mem_read16); - static_generate_memory_accessor(2, true, false, "write16", m_mem_write16); - static_generate_memory_accessor(4, false, false, "read32", m_mem_read32); - static_generate_memory_accessor(4, true, false, "write32", m_mem_write32); - static_generate_memory_accessor(4, false, true, "ioread32", m_io_read32); - static_generate_memory_accessor(4, true, true, "iowrite32", m_io_write32); - } - - catch (drcuml_block::abort_compilation &) - { - fatalerror("Unable to generate static E132XS code\n"); fflush(stdout); - } -} - -/* 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_mem3; - UML_MOV(block, I0, trapno); - UML_CMP(block, mem(&m_trap_entry), 0xffffff00); - UML_JMPc(block, uml::COND_NE, no_mem3 = label++); - UML_SUB(block, I0, 63, I0); - - UML_LABEL(block, no_mem3); - UML_SHL(block, I0, I0, 2); - UML_OR(block, I0, I0, mem(&m_trap_entry)); -} - -/*------------------------------------------------- - code_compile_block - compile a block of the - given mode at the specified pc --------------------------------------------------*/ - -void hyperstone_device::code_compile_block(offs_t pc) -{ - drcuml_state *drcuml = m_drcuml.get(); - compiler_state compiler = { 0 }; - const opcode_desc *seqhead, *seqlast; - const opcode_desc *desclist; - int override = false; - drcuml_block *block; - - g_profiler.start(PROFILER_DRC_COMPILE); - - /* get a description of this sequence */ - desclist = m_drcfe->describe_code(pc); - - bool succeeded = false; - while (!succeeded) - { - try - { - /* start the block */ - block = drcuml->begin_block(4096); - - /* loop until we get through all instruction sequences */ - for (seqhead = desclist; seqhead != nullptr; seqhead = seqlast->next()) - { - const opcode_desc *curdesc; - uint32_t nextpc; - - /* add a code log entry */ - if (drcuml->logging()) - block->append_comment("-------------------------"); - - /* determine the last instruction in this sequence */ - for (seqlast = seqhead; seqlast != nullptr; seqlast = seqlast->next()) - if (seqlast->flags & OPFLAG_END_SEQUENCE) - break; - assert(seqlast != nullptr); - - /* if we don't have a hash for this mode/pc, or if we are overriding all, add one */ - if (override || !drcuml->hash_exists(0, seqhead->pc)) - UML_HASH(block, 0, seqhead->pc); - - /* if we already have a hash, and this is the first sequence, assume that we */ - /* are recompiling due to being out of sync and allow future overrides */ - else if (seqhead == desclist) - { - override = true; - UML_HASH(block, 0, seqhead->pc); - } - - /* otherwise, redispatch to that fixed PC and skip the rest of the processing */ - else - { - UML_LABEL(block, seqhead->pc | 0x80000000); - UML_HASHJMP(block, 0, seqhead->pc, *m_nocode); - continue; - } - - /* validate this code block if we're not pointing into ROM */ - if (m_program->get_write_ptr(seqhead->physpc) != nullptr) - generate_checksum_block(block, &compiler, seqhead, seqlast); - - /* label this instruction, if it may be jumped to locally */ - if (seqhead->flags & OPFLAG_IS_BRANCH_TARGET) - UML_LABEL(block, seqhead->pc | 0x80000000); - - /* iterate over instructions in the sequence and compile them */ - for (curdesc = seqhead; curdesc != seqlast->next(); curdesc = curdesc->next()) - { - generate_sequence_instruction(block, &compiler, curdesc); - } - - /* if we need to return to the start, do it */ - if (seqlast->flags & OPFLAG_RETURN_TO_START) - nextpc = pc; - - /* otherwise we just go to the next instruction */ - else - { - nextpc = seqlast->pc + seqlast->length; - } - - /* count off cycles and go there */ - generate_update_cycles(block, &compiler, nextpc); // - - /* if the last instruction can change modes, use a variable mode; otherwise, assume the same mode */ - if (seqlast->next() == nullptr || seqlast->next()->pc != nextpc) - { - UML_HASHJMP(block, 0, nextpc, *m_nocode); // hashjmp ,nextpc,nocode - } - } - - /* end the sequence */ - block->end(); - g_profiler.stop(); - succeeded = true; - } - catch (drcuml_block::abort_compilation &) - { - code_flush_cache(); - } - } -} - -/*************************************************************************** - STATIC CODEGEN -***************************************************************************/ - -/*------------------------------------------------- - epc - compute the exception PC from a - descriptor --------------------------------------------------*/ - -static inline uint32_t epc(const opcode_desc *desc) -{ - return (desc->flags & OPFLAG_IN_DELAY_SLOT) ? (desc->pc - 3) : desc->pc; -} - - -/*------------------------------------------------- - alloc_handle - allocate a handle if not - already allocated --------------------------------------------------*/ - -static inline void alloc_handle(drcuml_state *drcuml, code_handle **handleptr, const char *name) -{ - if (*handleptr == nullptr) - *handleptr = drcuml->handle_alloc(name); -} - - - -/*------------------------------------------------- - static_generate_exception - generate an - exception handler --------------------------------------------------*/ - -void hyperstone_device::static_generate_exception(uint32_t exception, const char *name) -{ - code_handle *&exception_handle = m_exception[exception]; - drcuml_state *drcuml = m_drcuml.get(); - drcuml_block *block = drcuml->begin_block(1024); - - /* add a global entry for this */ - alloc_handle(drcuml, &exception_handle, name); - UML_HANDLE(block, *exception_handle); - - uml::code_label label = 1; - generate_get_trap_addr(block, label, exception); - UML_ROLAND(block, I1, DRC_SR, 7, 0x7f); - UML_ROLAND(block, I2, DRC_SR, 11, 0xf); - UML_TEST(block, I2, 0xf); - UML_MOVc(block, uml::COND_Z, I2, 16); - UML_ADD(block, I1, I1, I2); - - UML_AND(block, DRC_SR, DRC_SR, 0xffe7ffff); - UML_OR(block, DRC_SR, DRC_SR, mem(&m_instruction_length)); - - UML_MOV(block, I4, DRC_SR); - UML_ROLINS(block, DRC_SR, 2, 21, 0x01e00000); - UML_ROLINS(block, DRC_SR, I1, 25, 0xfe000000); - - UML_AND(block, I3, I1, 0x3f); - UML_AND(block, I1, DRC_PC, ~1); - UML_ROLAND(block, I2, DRC_SR, 14, 1); - UML_OR(block, I1, I1, I2); - UML_STORE(block, (void *)m_local_regs, I3, I1, SIZE_DWORD, SCALE_x4); - UML_ADD(block, I3, I3, 1); - UML_AND(block, I3, I3, 0x3f); - UML_STORE(block, (void *)m_local_regs, I3, I4, SIZE_DWORD, SCALE_x4); - - UML_AND(block, DRC_SR, DRC_SR, ~(M_MASK | T_MASK)); - UML_OR(block, DRC_SR, DRC_SR, (L_MASK | S_MASK)); - - UML_MOV(block, DRC_PC, I0); - UML_SUB(block, mem(&m_icount), mem(&m_icount), 2); - UML_EXHc(block, COND_S, *m_out_of_cycles, 0); - - UML_HASHJMP(block, 0, I0, *m_nocode);// hashjmp ,i0,nocode - - block->end(); -} - - - -/*------------------------------------------------- - generate_entry_point - generate a - static entry point --------------------------------------------------*/ - -void hyperstone_device::static_generate_entry_point() -{ - drcuml_state *drcuml = m_drcuml.get(); - drcuml_block *block; - - /* begin generating */ - block = drcuml->begin_block(20); - - /* forward references */ - alloc_handle(drcuml, &m_nocode, "nocode"); - - alloc_handle(drcuml, &m_entry, "entry"); - UML_HANDLE(block, *m_entry); - - /* load fast integer registers */ - //load_fast_iregs(block); - - /* generate a hash jump via the current mode and PC */ - UML_HASHJMP(block, 0, mem(&m_global_regs[0]), *m_nocode); - block->end(); -} - - -/*------------------------------------------------- - static_generate_nocode_handler - generate an - exception handler for "out of code" --------------------------------------------------*/ - -void hyperstone_device::static_generate_nocode_handler() -{ - drcuml_state *drcuml = m_drcuml.get(); - drcuml_block *block; - - /* begin generating */ - block = drcuml->begin_block(10); - - /* generate a hash jump via the current mode and PC */ - alloc_handle(drcuml, &m_nocode, "nocode"); - UML_HANDLE(block, *m_nocode); - UML_GETEXP(block, I0); - UML_MOV(block, mem(&PC), I0); - //save_fast_iregs(block); - UML_EXIT(block, EXECUTE_MISSING_CODE); - - block->end(); -} - - -/*------------------------------------------------- - static_generate_out_of_cycles - generate an - out of cycles exception handler --------------------------------------------------*/ - -void hyperstone_device::static_generate_out_of_cycles() -{ - drcuml_state *drcuml = m_drcuml.get(); - drcuml_block *block; - - /* begin generating */ - block = drcuml->begin_block(10); - - /* generate a hash jump via the current mode and PC */ - alloc_handle(drcuml, &m_out_of_cycles, "out_of_cycles"); - UML_HANDLE(block, *m_out_of_cycles); - UML_GETEXP(block, I0); - UML_MOV(block, mem(&m_global_regs[0]), I0); - //save_fast_iregs(block); - UML_EXIT(block, EXECUTE_OUT_OF_CYCLES); - - block->end(); -} - -/*------------------------------------------------------------------ - static_generate_memory_accessor -------------------------------------------------------------------*/ - -void hyperstone_device::static_generate_memory_accessor(int size, int iswrite, bool isio, const char *name, code_handle *&handleptr) -{ - /* on entry, address is in I0; data for writes is in I1 */ - /* on exit, read result is in I1 */ - /* routine trashes I0-I1 */ - drcuml_state *drcuml = m_drcuml.get(); - drcuml_block *block; - - /* begin generating */ - block = drcuml->begin_block(1024); - - /* add a global entry for this */ - alloc_handle(drcuml, &handleptr, name); - UML_HANDLE(block, *handleptr); - - // write: - switch (size) - { - case 1: - if (iswrite) - UML_WRITE(block, I0, I1, SIZE_BYTE, SPACE_PROGRAM); - else - UML_READ(block, I1, I0, SIZE_BYTE, SPACE_PROGRAM); - break; - - case 2: - if (iswrite) - UML_WRITE(block, I0, I1, SIZE_WORD, SPACE_PROGRAM); - else - UML_READ(block, I1, I0, SIZE_WORD, SPACE_PROGRAM); - break; - - case 4: - if (iswrite) - UML_WRITE(block, I0, I1, SIZE_DWORD, isio ? SPACE_IO : SPACE_PROGRAM); - else - UML_READ(block, I1, I0, SIZE_DWORD, isio ? SPACE_IO : SPACE_PROGRAM); - break; - } - UML_RET(block); - - block->end(); -} - - - -/*************************************************************************** - CODE GENERATION -***************************************************************************/ - -/*------------------------------------------------- - generate_update_cycles - generate code to - subtract cycles from the icount and generate - an exception if out --------------------------------------------------*/ - -void hyperstone_device::generate_update_cycles(drcuml_block *block, compiler_state *compiler, uml::parameter param) -{ - /* account for cycles */ - if (compiler->m_cycles > 0) - { - UML_SUB(block, mem(&m_icount), mem(&m_icount), MAPVAR_CYCLES); - UML_MAPVAR(block, MAPVAR_CYCLES, 0); - UML_EXHc(block, COND_S, *m_out_of_cycles, param); - } - compiler->m_cycles = 0; -} - -/*------------------------------------------------- - generate_checksum_block - generate code to - validate a sequence of opcodes --------------------------------------------------*/ - -void hyperstone_device::generate_checksum_block(drcuml_block *block, compiler_state *compiler, const opcode_desc *seqhead, const opcode_desc *seqlast) -{ - const opcode_desc *curdesc; - if (m_drcuml->logging()) - { - block->append_comment("[Validation for %08X]", seqhead->pc); - } - /* loose verify or single instruction: just compare and fail */ - if (!(m_drcoptions & E132XS_STRICT_VERIFY) || seqhead->next() == nullptr) - { - if (!(seqhead->flags & OPFLAG_VIRTUAL_NOOP)) - { - uint32_t sum = seqhead->opptr.w[0]; - void *base = m_direct->read_ptr(seqhead->physpc); - UML_LOAD(block, I0, base, 0, SIZE_WORD, SCALE_x2); - - if (seqhead->delay.first() != nullptr && seqhead->physpc != seqhead->delay.first()->physpc) - { - base = m_direct->read_ptr(seqhead->delay.first()->physpc); - assert(base != nullptr); - UML_LOAD(block, I1, base, 0, SIZE_WORD, SCALE_x2); - UML_ADD(block, I0, I0, I1); - - sum += seqhead->delay.first()->opptr.w[0]; - } - - UML_CMP(block, I0, sum); - UML_EXHc(block, COND_NE, *m_nocode, epc(seqhead)); - } - } - else /* full verification; sum up everything */ - { - void *base = m_direct->read_ptr(seqhead->physpc); - UML_LOAD(block, I0, base, 0, SIZE_WORD, SCALE_x2); - uint32_t sum = seqhead->opptr.w[0]; - for (curdesc = seqhead->next(); curdesc != seqlast->next(); curdesc = curdesc->next()) - if (!(curdesc->flags & OPFLAG_VIRTUAL_NOOP)) - { - base = m_direct->read_ptr(curdesc->physpc); - assert(base != nullptr); - UML_LOAD(block, I1, base, 0, SIZE_WORD, SCALE_x2); - UML_ADD(block, I0, I0, I1); - sum += curdesc->opptr.w[0]; - - if (curdesc->delay.first() != nullptr && (curdesc == seqlast || (curdesc->next() != nullptr && curdesc->next()->physpc != curdesc->delay.first()->physpc))) - { - base = m_direct->read_ptr(curdesc->delay.first()->physpc); - assert(base != nullptr); - UML_LOAD(block, I1, base, 0, SIZE_WORD, SCALE_x2); - UML_ADD(block, I0, I0, I1); - - sum += curdesc->delay.first()->opptr.w[0]; - } - } - UML_CMP(block, I0, sum); - UML_EXHc(block, COND_NE, *m_nocode, epc(seqhead)); - } -} - - -/*------------------------------------------------- - log_add_disasm_comment - add a comment - including disassembly of a MIPS instruction --------------------------------------------------*/ - -void hyperstone_device::log_add_disasm_comment(drcuml_block *block, uint32_t pc, uint32_t op) -{ - if (m_drcuml->logging()) - { - block->append_comment("%08X: %08x", pc, op); - } -} - - -/*------------------------------------------------------------------ - generate_delay_slot_and_branch -------------------------------------------------------------------*/ - -void hyperstone_device::generate_delay_slot_and_branch(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - compiler_state compiler_temp = *compiler; - - /* fetch the target register if dynamic, in case it is modified by the delay slot */ - if (desc->targetpc == BRANCH_TARGET_DYNAMIC) - { - UML_MOV(block, mem(&m_branch_dest), DRC_PC); - } - - if (desc->delayslots) - { - /* compile the delay slot using temporary compiler state */ - assert(desc->delay.first() != nullptr); - generate_sequence_instruction(block, &compiler_temp, desc->delay.first()); // - UML_MOV(block, mem(&m_branch_dest), DRC_PC); - } - - /* update the cycles and jump through the hash table to the target */ - if (desc->targetpc != BRANCH_TARGET_DYNAMIC) - { - generate_update_cycles(block, &compiler_temp, desc->targetpc); - if (desc->flags & OPFLAG_INTRABLOCK_BRANCH) - UML_JMP(block, desc->targetpc | 0x80000000); - else - UML_HASHJMP(block, 0, desc->targetpc, *m_nocode); - } - else - { - generate_update_cycles(block, &compiler_temp, mem(&m_branch_dest)); - UML_HASHJMP(block, 0, mem(&m_branch_dest), *m_nocode); - } - - /* update the label */ - compiler->m_labelnum = compiler_temp.m_labelnum; - - /* reset the mapvar to the current cycles */ - UML_MAPVAR(block, MAPVAR_CYCLES, compiler->m_cycles); -} - - -/*------------------------------------------------- - generate_sequence_instruction - generate code - for a single instruction in a sequence --------------------------------------------------*/ - -void hyperstone_device::generate_sequence_instruction(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - offs_t expc; - - /* add an entry for the log */ - if (m_drcuml->logging() && !(desc->flags & OPFLAG_VIRTUAL_NOOP)) - log_add_disasm_comment(block, desc->pc, desc->opptr.w[0]); - - /* set the PC map variable */ - expc = (desc->flags & OPFLAG_IN_DELAY_SLOT) ? desc->pc - 3 : desc->pc; - UML_MAPVAR(block, MAPVAR_PC, expc); - - /* accumulate total cycles */ - compiler->m_cycles += desc->cycles; - - /* update the icount map variable */ - UML_MAPVAR(block, MAPVAR_CYCLES, compiler->m_cycles); - - /* if we are debugging, call the debugger */ - if ((machine().debug_flags & DEBUG_FLAG_ENABLED) != 0) - { - UML_MOV(block, DRC_PC, desc->pc); - //save_fast_iregs(block); - UML_DEBUG(block, desc->pc); - } - - if (!(desc->flags & OPFLAG_VIRTUAL_NOOP)) - { - /* compile the instruction */ - if (!generate_opcode(block, compiler, desc)) - { - UML_MOV(block, DRC_PC, desc->pc); - UML_MOV(block, mem(&m_drc_arg0), desc->opptr.w[0]); - UML_CALLC(block, cfunc_unimplemented, this); - } - } -} - -#include "e132xsdrc_ops.hxx" - -bool hyperstone_device::generate_opcode(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - uint32_t op = (uint32_t)desc->opptr.w[0]; - - UML_MOV(block, I0, op); - UML_AND(block, I7, DRC_SR, H_MASK); - UML_ADD(block, DRC_PC, DRC_PC, 2); - UML_MOV(block, mem(&m_instruction_length), (1 << 19)); - - switch (op >> 8) - { - case 0x00: generate_chk(block, compiler, desc); break; - case 0x01: generate_chk(block, compiler, desc); break; - case 0x02: generate_chk(block, compiler, desc); break; - case 0x03: generate_chk(block, compiler, desc); break; - case 0x04: generate_movd(block, compiler, desc); break; - case 0x05: generate_movd(block, compiler, desc); break; - case 0x06: generate_movd(block, compiler, desc); break; - case 0x07: generate_movd(block, compiler, desc); break; - case 0x08: generate_divsu(block, compiler, desc); break; - case 0x09: generate_divsu(block, compiler, desc); break; - case 0x0a: generate_divsu(block, compiler, desc); break; - case 0x0b: generate_divsu(block, compiler, desc); break; - case 0x0c: generate_divsu(block, compiler, desc); break; - case 0x0d: generate_divsu(block, compiler, desc); break; - case 0x0e: generate_divsu(block, compiler, desc); break; - case 0x0f: generate_divsu(block, compiler, desc); break; - case 0x10: generate_xm(block, compiler, desc); break; - case 0x11: generate_xm(block, compiler, desc); break; - case 0x12: generate_xm(block, compiler, desc); break; - case 0x13: generate_xm(block, compiler, desc); break; - case 0x14: generate_mask(block, compiler, desc); break; - case 0x15: generate_mask(block, compiler, desc); break; - case 0x16: generate_mask(block, compiler, desc); break; - case 0x17: generate_mask(block, compiler, desc); break; - case 0x18: generate_sum(block, compiler, desc); break; - case 0x19: generate_sum(block, compiler, desc); break; - case 0x1a: generate_sum(block, compiler, desc); break; - case 0x1b: generate_sum(block, compiler, desc); break; - case 0x1c: generate_sums(block, compiler, desc); break; - case 0x1d: generate_sums(block, compiler, desc); break; - case 0x1e: generate_sums(block, compiler, desc); break; - case 0x1f: generate_sums(block, compiler, desc); break; - case 0x20: generate_cmp(block, compiler, desc); break; - case 0x21: generate_cmp(block, compiler, desc); break; - case 0x22: generate_cmp(block, compiler, desc); break; - case 0x23: generate_cmp(block, compiler, desc); break; - case 0x24: generate_mov(block, compiler, desc); break; - case 0x25: generate_mov(block, compiler, desc); break; - case 0x26: generate_mov(block, compiler, desc); break; - case 0x27: generate_mov(block, compiler, desc); break; - case 0x28: generate_add(block, compiler, desc); break; - case 0x29: generate_add(block, compiler, desc); break; - case 0x2a: generate_add(block, compiler, desc); break; - case 0x2b: generate_add(block, compiler, desc); break; - case 0x2c: generate_adds(block, compiler, desc); break; - case 0x2d: generate_adds(block, compiler, desc); break; - case 0x2e: generate_adds(block, compiler, desc); break; - case 0x2f: generate_adds(block, compiler, desc); break; - case 0x30: generate_cmpb(block, compiler, desc); break; - case 0x31: generate_cmpb(block, compiler, desc); break; - case 0x32: generate_cmpb(block, compiler, desc); break; - case 0x33: generate_cmpb(block, compiler, desc); break; - case 0x34: generate_andn(block, compiler, desc); break; - case 0x35: generate_andn(block, compiler, desc); break; - case 0x36: generate_andn(block, compiler, desc); break; - case 0x37: generate_andn(block, compiler, desc); break; - case 0x38: generate_or(block, compiler, desc); break; - case 0x39: generate_or(block, compiler, desc); break; - case 0x3a: generate_or(block, compiler, desc); break; - case 0x3b: generate_or(block, compiler, desc); break; - case 0x3c: generate_xor(block, compiler, desc); break; - case 0x3d: generate_xor(block, compiler, desc); break; - case 0x3e: generate_xor(block, compiler, desc); break; - case 0x3f: generate_xor(block, compiler, desc); break; - case 0x40: generate_subc(block, compiler, desc); break; - case 0x41: generate_subc(block, compiler, desc); break; - case 0x42: generate_subc(block, compiler, desc); break; - case 0x43: generate_subc(block, compiler, desc); break; - case 0x44: generate_not(block, compiler, desc); break; - case 0x45: generate_not(block, compiler, desc); break; - case 0x46: generate_not(block, compiler, desc); break; - case 0x47: generate_not(block, compiler, desc); break; - case 0x48: generate_sub(block, compiler, desc); break; - case 0x49: generate_sub(block, compiler, desc); break; - case 0x4a: generate_sub(block, compiler, desc); break; - case 0x4b: generate_sub(block, compiler, desc); break; - case 0x4c: generate_subs(block, compiler, desc); break; - case 0x4d: generate_subs(block, compiler, desc); break; - case 0x4e: generate_subs(block, compiler, desc); break; - case 0x4f: generate_subs(block, compiler, desc); break; - case 0x50: generate_addc(block, compiler, desc); break; - case 0x51: generate_addc(block, compiler, desc); break; - case 0x52: generate_addc(block, compiler, desc); break; - case 0x53: generate_addc(block, compiler, desc); break; - case 0x54: generate_and(block, compiler, desc); break; - case 0x55: generate_and(block, compiler, desc); break; - case 0x56: generate_and(block, compiler, desc); break; - case 0x57: generate_and(block, compiler, desc); break; - case 0x58: generate_neg(block, compiler, desc); break; - case 0x59: generate_neg(block, compiler, desc); break; - case 0x5a: generate_neg(block, compiler, desc); break; - case 0x5b: generate_neg(block, compiler, desc); break; - case 0x5c: generate_negs(block, compiler, desc); break; - case 0x5d: generate_negs(block, compiler, desc); break; - case 0x5e: generate_negs(block, compiler, desc); break; - case 0x5f: generate_negs(block, compiler, desc); break; - case 0x60: generate_cmpi(block, compiler, desc); break; - case 0x61: generate_cmpi(block, compiler, desc); break; - case 0x62: generate_cmpi(block, compiler, desc); break; - case 0x63: generate_cmpi(block, compiler, desc); break; - case 0x64: generate_movi(block, compiler, desc); break; - case 0x65: generate_movi(block, compiler, desc); break; - case 0x66: generate_movi(block, compiler, desc); break; - case 0x67: generate_movi(block, compiler, desc); break; - case 0x68: generate_addi(block, compiler, desc); break; - case 0x69: generate_addi(block, compiler, desc); break; - case 0x6a: generate_addi(block, compiler, desc); break; - case 0x6b: generate_addi(block, compiler, desc); break; - case 0x6c: generate_addsi(block, compiler, desc); break; - case 0x6d: generate_addsi(block, compiler, desc); break; - case 0x6e: generate_addsi(block, compiler, desc); break; - case 0x6f: generate_addsi(block, compiler, desc); break; - case 0x70: generate_cmpbi(block, compiler, desc); break; - case 0x71: generate_cmpbi(block, compiler, desc); break; - case 0x72: generate_cmpbi(block, compiler, desc); break; - case 0x73: generate_cmpbi(block, compiler, desc); break; - case 0x74: generate_andni(block, compiler, desc); break; - case 0x75: generate_andni(block, compiler, desc); break; - case 0x76: generate_andni(block, compiler, desc); break; - case 0x77: generate_andni(block, compiler, desc); break; - case 0x78: generate_ori(block, compiler, desc); break; - case 0x79: generate_ori(block, compiler, desc); break; - case 0x7a: generate_ori(block, compiler, desc); break; - case 0x7b: generate_ori(block, compiler, desc); break; - case 0x7c: generate_xori(block, compiler, desc); break; - case 0x7d: generate_xori(block, compiler, desc); break; - case 0x7e: generate_xori(block, compiler, desc); break; - case 0x7f: generate_xori(block, compiler, desc); break; - case 0x80: generate_shrdi(block, compiler, desc); break; - case 0x81: generate_shrdi(block, compiler, desc); break; - case 0x82: generate_shrd(block, compiler, desc); break; - case 0x83: generate_shr(block, compiler, desc); break; - case 0x84: generate_sardi(block, compiler, desc); break; - case 0x85: generate_sardi(block, compiler, desc); break; - case 0x86: generate_sard(block, compiler, desc); break; - case 0x87: generate_sar(block, compiler, desc); break; - case 0x88: generate_shldi(block, compiler, desc); break; - case 0x89: generate_shldi(block, compiler, desc); break; - case 0x8a: generate_shld(block, compiler, desc); break; - case 0x8b: generate_shl(block, compiler, desc); break; - case 0x8c: generate_reserved(block, compiler, desc); break; - case 0x8d: generate_reserved(block, compiler, desc); break; - case 0x8e: generate_testlz(block, compiler, desc); break; - case 0x8f: generate_rol(block, compiler, desc); break; - case 0x90: generate_ldxx1(block, compiler, desc); break; - case 0x91: generate_ldxx1(block, compiler, desc); break; - case 0x92: generate_ldxx1(block, compiler, desc); break; - case 0x93: generate_ldxx1(block, compiler, desc); break; - case 0x94: generate_ldxx2(block, compiler, desc); break; - case 0x95: generate_ldxx2(block, compiler, desc); break; - case 0x96: generate_ldxx2(block, compiler, desc); break; - case 0x97: generate_ldxx2(block, compiler, desc); break; - case 0x98: generate_stxx1(block, compiler, desc); break; - case 0x99: generate_stxx1(block, compiler, desc); break; - case 0x9a: generate_stxx1(block, compiler, desc); break; - case 0x9b: generate_stxx1(block, compiler, desc); break; - case 0x9c: generate_stxx2(block, compiler, desc); break; - case 0x9d: generate_stxx2(block, compiler, desc); break; - case 0x9e: generate_stxx2(block, compiler, desc); break; - case 0x9f: generate_stxx2(block, compiler, desc); break; - case 0xa0: generate_shri(block, compiler, desc); break; - case 0xa1: generate_shri(block, compiler, desc); break; - case 0xa2: generate_shri(block, compiler, desc); break; - case 0xa3: generate_shri(block, compiler, desc); break; - case 0xa4: generate_sari(block, compiler, desc); break; - case 0xa5: generate_sari(block, compiler, desc); break; - case 0xa6: generate_sari(block, compiler, desc); break; - case 0xa7: generate_sari(block, compiler, desc); break; - case 0xa8: generate_shli(block, compiler, desc); break; - case 0xa9: generate_shli(block, compiler, desc); break; - case 0xaa: generate_shli(block, compiler, desc); break; - case 0xab: generate_shli(block, compiler, desc); break; - case 0xac: generate_reserved(block, compiler, desc); break; - case 0xad: generate_reserved(block, compiler, desc); break; - case 0xae: generate_reserved(block, compiler, desc); break; - case 0xaf: generate_reserved(block, compiler, desc); break; - case 0xb0: generate_mulsu(block, compiler, desc); break; - case 0xb1: generate_mulsu(block, compiler, desc); break; - case 0xb2: generate_mulsu(block, compiler, desc); break; - case 0xb3: generate_mulsu(block, compiler, desc); break; - case 0xb4: generate_mulsu(block, compiler, desc); break; - case 0xb5: generate_mulsu(block, compiler, desc); break; - case 0xb6: generate_mulsu(block, compiler, desc); break; - case 0xb7: generate_mulsu(block, compiler, desc); break; - case 0xb8: generate_set(block, compiler, desc); break; - case 0xb9: generate_set(block, compiler, desc); break; - case 0xba: generate_set(block, compiler, desc); break; - case 0xbb: generate_set(block, compiler, desc); break; - case 0xbc: generate_mul(block, compiler, desc); break; - case 0xbd: generate_mul(block, compiler, desc); break; - case 0xbe: generate_mul(block, compiler, desc); break; - case 0xbf: generate_mul(block, compiler, desc); break; - case 0xc0: generate_software(block, compiler, desc); break; // fadd - case 0xc1: generate_software(block, compiler, desc); break; // faddd - case 0xc2: generate_software(block, compiler, desc); break; // fsub - case 0xc3: generate_software(block, compiler, desc); break; // fsubd - case 0xc4: generate_software(block, compiler, desc); break; // fmul - case 0xc5: generate_software(block, compiler, desc); break; // fmuld - case 0xc6: generate_software(block, compiler, desc); break; // fdiv - case 0xc7: generate_software(block, compiler, desc); break; // fdivd - case 0xc8: generate_software(block, compiler, desc); break; // fcmp - case 0xc9: generate_software(block, compiler, desc); break; // fcmpd - case 0xca: generate_software(block, compiler, desc); break; // fcmpu - case 0xcb: generate_software(block, compiler, desc); break; // fcmpud - case 0xcc: generate_software(block, compiler, desc); break; // fcvt - case 0xcd: generate_software(block, compiler, desc); break; // fcvtd - case 0xce: generate_extend(block, compiler, desc); break; - case 0xcf: generate_do(block, compiler, desc); break; - case 0xd0: generate_ldwr(block, compiler, desc); break; - case 0xd1: generate_ldwr(block, compiler, desc); break; - case 0xd2: generate_lddr(block, compiler, desc); break; - case 0xd3: generate_lddr(block, compiler, desc); break; - case 0xd4: generate_ldwp(block, compiler, desc); break; - case 0xd5: generate_ldwp(block, compiler, desc); break; - case 0xd6: generate_lddp(block, compiler, desc); break; - case 0xd7: generate_lddp(block, compiler, desc); break; - case 0xd8: generate_stwr(block, compiler, desc); break; - case 0xd9: generate_stwr(block, compiler, desc); break; - case 0xda: generate_stdr(block, compiler, desc); break; - case 0xdb: generate_stdr(block, compiler, desc); break; - case 0xdc: generate_stwp(block, compiler, desc); break; - case 0xdd: generate_stwp(block, compiler, desc); break; - case 0xde: generate_stdp(block, compiler, desc); break; - case 0xdf: generate_stdp(block, compiler, desc); break; - case 0xe0: generate_db(block, compiler, desc); break; - case 0xe1: generate_db(block, compiler, desc); break; - case 0xe2: generate_db(block, compiler, desc); break; - case 0xe3: generate_db(block, compiler, desc); break; - case 0xe4: generate_db(block, compiler, desc); break; - case 0xe5: generate_db(block, compiler, desc); break; - case 0xe6: generate_db(block, compiler, desc); break; - case 0xe7: generate_db(block, compiler, desc); break; - case 0xe8: generate_db(block, compiler, desc); break; - case 0xe9: generate_db(block, compiler, desc); break; - case 0xea: generate_db(block, compiler, desc); break; - case 0xeb: generate_db(block, compiler, desc); break; - case 0xec: generate_dbr(block, compiler, desc); break; - case 0xed: generate_frame(block, compiler, desc); break; - case 0xee: generate_call(block, compiler, desc); break; - case 0xef: generate_call(block, compiler, desc); break; - case 0xf0: generate_b(block, compiler, desc); break; - case 0xf1: generate_b(block, compiler, desc); break; - case 0xf2: generate_b(block, compiler, desc); break; - case 0xf3: generate_b(block, compiler, desc); break; - case 0xf4: generate_b(block, compiler, desc); break; - case 0xf5: generate_b(block, compiler, desc); break; - case 0xf6: generate_b(block, compiler, desc); break; - case 0xf7: generate_b(block, compiler, desc); break; - case 0xf8: generate_b(block, compiler, desc); break; - case 0xf9: generate_b(block, compiler, desc); break; - case 0xfa: generate_b(block, compiler, desc); break; - case 0xfb: generate_b(block, compiler, desc); break; - case 0xfc: generate_br(block, compiler, desc); break; - case 0xfd: generate_trap_op(block, compiler, desc); break; - case 0xfe: generate_trap_op(block, compiler, desc); break; - case 0xff: generate_trap_op(block, compiler, desc); break; - } - - UML_AND(block, DRC_SR, DRC_SR, ~ILC_MASK); - UML_OR(block, DRC_SR, DRC_SR, mem(&m_instruction_length)); - - int done; - UML_AND(block, I0, DRC_SR, (T_MASK | P_MASK)); - UML_CMP(block, I0, (T_MASK | P_MASK)); - UML_JMPc(block, uml::COND_NE, done = compiler->m_labelnum++); - UML_TEST(block, mem(&m_delay_slot), 1); - UML_EXHc(block, uml::COND_E, *m_exception[EXCEPTION_TRACE], 0); - - UML_LABEL(block, done); - UML_XOR(block, DRC_SR, DRC_SR, I7); - - return true; -} \ No newline at end of file diff --git a/src/devices/cpu/e132xs/e132xsdrc_ops.hxx b/src/devices/cpu/e132xs/e132xsdrc_ops.hxx deleted file mode 100644 index 45677280d2d..00000000000 --- a/src/devices/cpu/e132xs/e132xsdrc_ops.hxx +++ /dev/null @@ -1,2438 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Ryan Holtz - -#include "e132xs.h" - -constexpr uint32_t WRITE_ONLY_REGMASK = (1 << BCR_REGISTER) | (1 << TPR_REGISTER) | (1 << FCR_REGISTER) | (1 << MCR_REGISTER); - -void hyperstone_device::generate_check_delay_pc(drcuml_block *block) -{ - /* if PC is used in a delay instruction, the delayed PC should be used */ - UML_TEST(block, mem(&m_delay_slot), 1); - UML_MOVc(block, uml::COND_NZ, DRC_PC, mem(&m_delay_pc)); - UML_MOVc(block, uml::COND_NZ, mem(&m_delay_slot), 0); -} - -void hyperstone_device::generate_decode_const(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - const uint16_t imm_1 = READ_OP(desc->pc + 2); - - if (imm_1 & 0x8000) - { - const uint16_t imm_2 = READ_OP(desc->pc + 4); - - uint32_t imm = imm_2; - imm |= ((imm_1 & 0x3fff) << 16); - - if (imm_1 & 0x4000) - imm |= 0xc0000000; - - UML_MOV(block, mem(&m_instruction_length), (3<<19)); - UML_ADD(block, DRC_PC, DRC_PC, 4); - UML_MOV(block, I1, imm); - } - else - { - uint32_t imm = imm_1 & 0x3fff; - - if (imm_1 & 0x4000) - imm |= 0xffffc000; - - UML_MOV(block, mem(&m_instruction_length), (2<<19)); - UML_ADD(block, DRC_PC, DRC_PC, 2); - UML_MOV(block, I1, imm); - } -} - -void hyperstone_device::generate_decode_immediate_s(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - uint16_t op = desc->opptr.w[0]; - - switch (op & 0xf) - { - case 0: - UML_MOV(block, I1, 16); - return; - case 1: - { - uint32_t extra_u = (READ_OP(desc->pc + 2) << 16) | READ_OP(desc->pc + 4); - UML_MOV(block, mem(&m_instruction_length), (3<<19)); - UML_ADD(block, DRC_PC, DRC_PC, 4); - UML_MOV(block, I1, extra_u); - return; - } - case 2: - { - uint32_t extra_u = READ_OP(desc->pc + 2); - UML_MOV(block, mem(&m_instruction_length), (2<<19)); - UML_ADD(block, DRC_PC, DRC_PC, 2); - UML_MOV(block, I1, extra_u); - return; - } - case 3: - { - uint32_t extra_u = 0xffff0000 | READ_OP(desc->pc + 2); - UML_MOV(block, mem(&m_instruction_length), (2<<19)); - UML_ADD(block, DRC_PC, DRC_PC, 2); - UML_MOV(block, I1, extra_u); - return; - } - default: - UML_MOV(block, I1, s_immediate_values[op & 0xf]); - return; - } -} - -void hyperstone_device::generate_ignore_immediate_s(drcuml_block *block, const opcode_desc *desc) -{ - uint16_t op = desc->opptr.w[0]; - - static const uint32_t lengths[16] = { 1<<19, 3<<19, 2<<19, 2<<19, 1<<19, 1<<19, 1<<19, 1<<19, 1<<19, 1<<19, 1<<19, 1<<19, 1<<19, 1<<19, 1<<19, 1<<19 }; - static const uint32_t offsets[16] = { 0, 4, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; - const uint8_t nybble = op & 0x0f; - - UML_MOV(block, mem(&m_instruction_length), lengths[nybble]); - UML_ADD(block, DRC_PC, DRC_PC, offsets[nybble]); -} - -void hyperstone_device::generate_decode_pcrel(drcuml_block *block, const opcode_desc *desc) -{ - uint16_t op = desc->opptr.w[0]; - - int32_t offset; - if (op & 0x80) - { - uint16_t next = READ_OP(desc->pc + 2); - - offset = (op & 0x7f) << 16; - offset |= (next & 0xfffe); - - if (next & 1) - offset |= 0xff800000; - - UML_MOV(block, mem(&m_instruction_length), (2<<19)); - UML_ADD(block, DRC_PC, DRC_PC, 2); - } - else - { - offset = op & 0x7e; - - if (op & 1) - offset |= 0xffffff80; - } - - UML_MOV(block, I1, offset); -} - -void hyperstone_device::generate_ignore_pcrel(drcuml_block *block, const opcode_desc *desc) -{ - uint16_t op = desc->opptr.w[0]; - - if (op & 0x80) - { - UML_ADD(block, DRC_PC, DRC_PC, 2); - UML_MOV(block, mem(&m_instruction_length), (2<<19)); - } -} - -void hyperstone_device::generate_set_global_register(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - // Expects register index in I4, value in I5, clobbers I6 - int extended; - UML_CMP(block, I4, 16); - UML_JMPc(block, uml::COND_AE, extended = compiler->m_labelnum++); - - int generic_store, set_sr, done; - UML_CMP(block, I4, 1); - UML_JMPc(block, uml::COND_A, generic_store = compiler->m_labelnum++); - UML_JMPc(block, uml::COND_E, set_sr = compiler->m_labelnum++); - UML_AND(block, DRC_PC, I5, ~1); - generate_delay_slot_and_branch(block, compiler, desc); - UML_JMP(block, done = compiler->m_labelnum++); - - UML_LABEL(block, set_sr); - UML_ROLINS(block, DRC_SR, I5, 0, 0x0000ffff); - UML_AND(block, DRC_SR, DRC_SR, ~0x40); - UML_TEST(block, mem(&m_intblock), ~0); - UML_MOVc(block, uml::COND_Z, mem(&m_intblock), 1); - UML_JMP(block, done); - - UML_LABEL(block, generic_store); - UML_STORE(block, (void *)m_global_regs, I4, I5, SIZE_DWORD, SCALE_x4); - UML_JMP(block, done); - - int above_bcr; - UML_LABEL(block, extended); - UML_CMP(block, I4, 17); - UML_JMPc(block, uml::COND_BE, generic_store); - UML_CMP(block, I4, BCR_REGISTER); - UML_JMPc(block, uml::COND_A, above_bcr = compiler->m_labelnum++); - UML_JMPc(block, uml::COND_E, generic_store); - - // SP or UB - UML_AND(block, I5, I5, ~3); - UML_JMP(block, generic_store); - - int set_tpr, set_tcr, set_tr, set_fcr; - UML_LABEL(block, above_bcr); - UML_CMP(block, I4, TCR_REGISTER); - UML_JMPc(block, uml::COND_B, set_tpr = compiler->m_labelnum++); - UML_JMPc(block, uml::COND_E, set_tcr = compiler->m_labelnum++); - // Above TCR - UML_CMP(block, I4, WCR_REGISTER); - UML_JMPc(block, uml::COND_B, set_tr = compiler->m_labelnum++); - UML_JMPc(block, uml::COND_E, generic_store); // WCR - // Above WCR - UML_CMP(block, I4, FCR_REGISTER); - UML_JMPc(block, uml::COND_B, done); // ISR - read only - UML_JMPc(block, uml::COND_E, set_fcr = compiler->m_labelnum++); - UML_CMP(block, I4, MCR_REGISTER); - UML_JMPc(block, uml::COND_A, generic_store); // regs 28..31 - // Set MCR - UML_ROLAND(block, I6, I5, 20, 0x7); - UML_LOAD(block, I6, (void *)s_trap_entries, I6, SIZE_DWORD, SCALE_x4); - UML_MOV(block, mem(&m_trap_entry), I6); - UML_JMP(block, generic_store); - - int skip_compute_tr; - UML_LABEL(block, set_tpr); - UML_STORE(block, (void *)m_global_regs, I4, I5, SIZE_DWORD, SCALE_x4); - UML_TEST(block, I5, 0x80000000); - UML_JMPc(block, uml::COND_NZ, skip_compute_tr = compiler->m_labelnum++); - UML_CALLC(block, cfunc_compute_tr, this); - UML_CALLC(block, cfunc_update_timer_prescale, this); - UML_LABEL(block, skip_compute_tr); - UML_CALLC(block, cfunc_adjust_timer_interrupt, this); - UML_JMP(block, done); - - UML_LABEL(block, set_tcr); - UML_LOAD(block, I6, (void *)m_global_regs, I4, SIZE_DWORD, SCALE_x4); - UML_CMP(block, I6, I5); - UML_JMPc(block, uml::COND_E, done); - UML_STORE(block, (void *)m_global_regs, I4, I5, SIZE_DWORD, SCALE_x4); - UML_CALLC(block, cfunc_adjust_timer_interrupt, this); - UML_CMP(block, mem(&m_intblock), 1); - UML_MOVc(block, uml::COND_L, mem(&m_intblock), 1); - UML_JMP(block, done); - - UML_LABEL(block, set_tr); - UML_STORE(block, (void *)m_global_regs, I4, I5, SIZE_DWORD, SCALE_x4); - UML_MOV(block, mem(&m_tr_base_value), I5); - UML_CALLC(block, cfunc_total_cycles, this); - UML_DMOV(block, mem(&m_tr_base_cycles), mem(&m_numcycles)); - UML_CALLC(block, cfunc_adjust_timer_interrupt, this); - UML_JMP(block, done); - - int skip_adjust_timer; - UML_LABEL(block, set_fcr); - UML_LOAD(block, I6, (void *)m_global_regs, I4, SIZE_DWORD, SCALE_x4); - UML_XOR(block, I6, I6, I5); - UML_TEST(block, I6, 0x80000000); - UML_JMPc(block, uml::COND_Z, skip_adjust_timer = compiler->m_labelnum++); - UML_CALLC(block, cfunc_adjust_timer_interrupt, this); - UML_LABEL(block, skip_adjust_timer); - UML_STORE(block, (void *)m_global_regs, I4, I5, SIZE_DWORD, SCALE_x4); - UML_CMP(block, mem(&m_intblock), 1); - UML_MOVc(block, uml::COND_L, mem(&m_intblock), 1); - // Fall through to done - - UML_LABEL(block, done); -} - -void hyperstone_device::generate_trap(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc, uint32_t addr) -{ - printf("Unimplemented: generate_trap (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - -void hyperstone_device::generate_int(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc, uint32_t addr) -{ - printf("Unimplemented: generate_int (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - -void hyperstone_device::generate_exception(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc, uint32_t addr) -{ - printf("Unimplemented: generate_exception (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - -void hyperstone_device::generate_software(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_software (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_chk(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_chk (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_movd(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - generate_check_delay_pc(block); - - uint16_t op = desc->opptr.w[0]; - const uint32_t src_code = op & 0xf; - const uint32_t srcf_code = src_code + 1; - const uint32_t dst_code = (op & 0xf0) >> 4; - const uint32_t dstf_code = dst_code + 1; - - int done = compiler->m_labelnum++; - if (DST_GLOBAL && (dst_code == PC_REGISTER)) - { - if (SRC_GLOBAL && src_code < 2) - { - printf("Denoted PC or SR in RET instruction. PC = %08X\n", desc->pc); - return; - } - - UML_AND(block, I1, DRC_SR, (S_MASK | L_MASK)); - if (SRC_GLOBAL) - { - UML_LOAD(block, I2, (void *)m_global_regs, src_code, SIZE_DWORD, SCALE_x4); - UML_LOAD(block, I3, (void *)m_global_regs, srcf_code, SIZE_DWORD, SCALE_x4); - } - else - { - UML_ROLAND(block, I5, DRC_SR, 7, 0x7f); - UML_ADD(block, I3, I5, src_code); - UML_AND(block, I4, I3, 0x3f); - UML_LOAD(block, I2, (void *)m_local_regs, I4, SIZE_DWORD, SCALE_x4); - - UML_ADD(block, I6, I5, srcf_code); - UML_AND(block, I5, I6, 0x3f); - UML_LOAD(block, I3, (void *)m_local_regs, I5, SIZE_DWORD, SCALE_x4); - } - - UML_AND(block, DRC_PC, I2, ~1); - - UML_AND(block, DRC_SR, I3, 0xffe3ffff); - UML_ROLINS(block, DRC_SR, I2, S_SHIFT, S_MASK); - - UML_TEST(block, mem(&m_intblock), ~0); - UML_MOVc(block, uml::COND_Z, mem(&m_intblock), 1); - - UML_MOV(block, mem(&m_instruction_length), 0); - - int no_exception; - UML_AND(block, I2, DRC_SR, (S_MASK | L_MASK)); - UML_AND(block, I3, I1, I2); - UML_TEST(block, I3, S_MASK); - UML_JMPc(block, uml::COND_NZ, no_exception = compiler->m_labelnum++); // If S is set and unchanged, there won't be an exception. - - UML_XOR(block, I3, I1, I2); - UML_AND(block, I4, I3, I2); - UML_TEST(block, I4, S_MASK); - UML_EXHc(block, uml::COND_NZ, *m_exception[EXCEPTION_PRIVILEGE_ERROR], 0); // If S is newly set, it's a privilege error. - - UML_TEST(block, I3, L_MASK); - UML_JMPc(block, uml::COND_Z, no_exception); // If L is unchanged, there won't be an exception. - UML_TEST(block, I1, L_MASK); - UML_JMPc(block, uml::COND_NZ, no_exception); // If L was previously set, there won't be an exception. - UML_TEST(block, I2, S_MASK); - UML_EXHc(block, uml::COND_Z, *m_exception[EXCEPTION_PRIVILEGE_ERROR], 0); // If L is newly set and we are not in Supervisor mode, it's a privilege error. - - int diff_in_range; - UML_LABEL(block, no_exception); - UML_MOV(block, I0, mem(&SP)); - UML_ROLAND(block, I1, I0, 30, 0x7f); - UML_ROLAND(block, I2, DRC_SR, 7, 0x7f); - UML_SUB(block, I3, I2, I1); - UML_CMP(block, I3, -64); - UML_JMPc(block, uml::COND_L, done); - UML_CMP(block, I3, 64); - UML_JMPc(block, uml::COND_L, diff_in_range = compiler->m_labelnum++); - UML_OR(block, I3, I3, 0x80); - UML_SEXT(block, I3, I3, SIZE_BYTE); - UML_LABEL(block, diff_in_range); - - int pop_next, done_ret; - UML_LABEL(block, pop_next = compiler->m_labelnum++); - UML_CMP(block, I3, 0); - UML_JMPc(block, uml::COND_GE, done_ret = compiler->m_labelnum++); - UML_SUB(block, I0, I0, 4); - UML_CALLH(block, *m_mem_read32); - UML_ROLAND(block, I2, I0, 30, 0x3f); - UML_STORE(block, (void *)m_local_regs, I2, I1, SIZE_DWORD, SCALE_x4); - UML_ADD(block, I3, I3, 1); - UML_TEST(block, I3, ~0); - UML_JMP(block, pop_next); - - UML_LABEL(block, done_ret); - generate_delay_slot_and_branch(block, compiler, desc); - } - else if (SRC_GLOBAL && (src_code == SR_REGISTER)) // Rd doesn't denote PC and Rs denotes SR - { - UML_OR(block, DRC_SR, DRC_SR, Z_MASK); - UML_AND(block, DRC_SR, DRC_SR, ~N_MASK); - if (DST_GLOBAL) - { - UML_MOV(block, I4, dst_code); - UML_MOV(block, I5, 0); - generate_set_global_register(block, compiler, desc); - UML_MOV(block, I4, dstf_code); - UML_MOV(block, I5, 0); - generate_set_global_register(block, compiler, desc); - } - else - { - UML_ROLAND(block, I0, DRC_SR, 7, 0x7f); - UML_ADD(block, I0, I0, dst_code); - UML_AND(block, I0, I0, 0x3f); - UML_STORE(block, (void *)m_local_regs, I0, 0, SIZE_DWORD, SCALE_x4); - UML_ADD(block, I0, I0, 1); - UML_AND(block, I0, I0, 0x3f); - UML_STORE(block, (void *)m_local_regs, I0, 0, SIZE_DWORD, SCALE_x4); - } - } - else // Rd doesn't denote PC and Rs doesn't denote SR - { - if (!SRC_GLOBAL || !DST_GLOBAL) - { - UML_ROLAND(block, I3, DRC_SR, 7, 0x7f); - } - - if (SRC_GLOBAL) - { - UML_LOAD(block, I0, (void *)m_global_regs, src_code, SIZE_DWORD, SCALE_x4); - UML_LOAD(block, I1, (void *)m_global_regs, srcf_code, SIZE_DWORD, SCALE_x4); - } - else - { - UML_ADD(block, I0, I3, src_code); - UML_AND(block, I0, I0, 0x3f); - UML_LOAD(block, I0, (void *)m_local_regs, I0, SIZE_DWORD, SCALE_x4); - UML_ADD(block, I1, I3, srcf_code); - UML_AND(block, I1, I1, 0x3f); - UML_LOAD(block, I1, (void *)m_local_regs, I0, SIZE_DWORD, SCALE_x4); - } - - UML_AND(block, DRC_SR, DRC_SR, ~(Z_MASK | N_MASK)); - - UML_OR(block, I2, I0, I1); - UML_TEST(block, I2, ~0); - UML_SETc(block, uml::COND_Z, I2); - UML_ROLINS(block, DRC_SR, I2, Z_SHIFT, Z_MASK); - - UML_TEST(block, I0, 0x80000000); - UML_SETc(block, uml::COND_NZ, I2); - UML_ROLINS(block, DRC_SR, I2, N_SHIFT, N_MASK); - - if (DST_GLOBAL) - { - UML_MOV(block, I4, dst_code); - UML_MOV(block, I5, I0); - generate_set_global_register(block, compiler, desc); - UML_MOV(block, I4, dstf_code); - UML_MOV(block, I5, I1); - generate_set_global_register(block, compiler, desc); - } - else - { - UML_ADD(block, I2, I3, dst_code); - UML_AND(block, I2, I2, 0x3f); - UML_STORE(block, (void *)m_local_regs, I2, I0, SIZE_DWORD, SCALE_x4); - UML_ADD(block, I2, I3, dstf_code); - UML_AND(block, I2, I2, 0x3f); - UML_STORE(block, (void *)m_local_regs, I2, I1, SIZE_DWORD, SCALE_x4); - } - } - - UML_LABEL(block, done); -} - - -template -void hyperstone_device::generate_divsu(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_divsu (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_xm(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - uint16_t op = desc->opptr.w[0]; - const uint32_t src_code = op & 0xf; - const uint32_t dst_code = (op & 0xf0) >> 4; - - const uint32_t next = READ_OP(desc->pc + 2); - const uint8_t sub_type = (next & 0x7000) >> 12; - - uint32_t extra_u = next & 0xfff; - if (next & 0x8000) - { - extra_u = ((extra_u & 0xfff) << 16) | READ_OP(desc->pc + 4); - UML_MOV(block, mem(&m_instruction_length), (3<<19)); - UML_ADD(block, DRC_PC, DRC_PC, 4); - } - else - { - UML_MOV(block, mem(&m_instruction_length), (2<<19)); - UML_ADD(block, DRC_PC, DRC_PC, 2); - } - - UML_MOV(block, I1, extra_u); - - generate_check_delay_pc(block); - - if (!SRC_GLOBAL || !DST_GLOBAL) - UML_ROLAND(block, I3, DRC_SR, 7, 0x7f); - - if (SRC_GLOBAL) - { - if (src_code == SR_REGISTER) - UML_AND(block, I0, DRC_SR, C_MASK); - else - UML_LOAD(block, I0, (void *)m_global_regs, src_code, SIZE_DWORD, SCALE_x4); - } - else - { - UML_ADD(block, I2, I3, src_code); - UML_AND(block, I4, I2, 0x3f); - UML_LOAD(block, I0, (void *)m_local_regs, I4, SIZE_DWORD, SCALE_x4); - } - - if ((SRC_GLOBAL && (src_code == SR_REGISTER)) || (DST_GLOBAL && (dst_code < 2))) - { - return; - } - - if (sub_type < 4) - { - UML_CMP(block, I0, I1); - int skip, done; - if (SRC_GLOBAL && (src_code == PC_REGISTER)) - { - UML_JMPc(block, uml::COND_B, skip = compiler->m_labelnum++); - UML_EXH(block, *m_exception[EXCEPTION_RANGE_ERROR], 0); - UML_JMP(block, done = compiler->m_labelnum++); - } - else - { - UML_JMPc(block, uml::COND_BE, skip = compiler->m_labelnum++); - UML_EXH(block, *m_exception[EXCEPTION_RANGE_ERROR], 0); - UML_JMP(block, done = compiler->m_labelnum++); - } - - UML_LABEL(block, skip); - UML_SHL(block, I5, I0, sub_type); - - UML_LABEL(block, done); - } - else - { - UML_SHL(block, I5, I0, sub_type - 4); - } - - if (DST_GLOBAL) - { - UML_STORE(block, (void *)m_global_regs, dst_code, I5, SIZE_DWORD, SCALE_x4); - } - else - { - UML_ADD(block, I6, I3, dst_code); - UML_AND(block, I4, I6, 0x3f); - UML_STORE(block, (void *)m_local_regs, I6, I5, SIZE_DWORD, SCALE_x4); - } -} - - -template -void hyperstone_device::generate_mask(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - uint16_t op = desc->opptr.w[0]; - const uint32_t src_code = op & 0xf; - const uint32_t dst_code = (op & 0xf0) >> 4; - - generate_decode_const(block, compiler, desc); - generate_check_delay_pc(block); - - if (!SRC_GLOBAL || !DST_GLOBAL) - UML_ROLAND(block, I3, DRC_SR, 7, 0x7f); - - if (SRC_GLOBAL) - { - UML_LOAD(block, I2, (void *)m_global_regs, src_code, SIZE_DWORD, SCALE_x4); - } - else - { - UML_ADD(block, I2, I3, src_code); - UML_AND(block, I2, I2, 0x3f); - UML_LOAD(block, I2, (void *)m_local_regs, I2, SIZE_DWORD, SCALE_x4); - } - - UML_AND(block, I1, I2, I1); - - int skip_mask; - UML_AND(block, DRC_SR, DRC_SR, ~Z_MASK); - UML_TEST(block, I1, ~0); - UML_JMPc(block, uml::COND_NZ, skip_mask = compiler->m_labelnum++); - UML_OR(block, DRC_SR, DRC_SR, Z_MASK); - UML_LABEL(block, skip_mask); - - if (DST_GLOBAL) - { - UML_MOV(block, I4, dst_code); - UML_MOV(block, I5, I2); - generate_set_global_register(block, compiler, desc); - } - else - { - UML_ADD(block, I0, I3, dst_code); - UML_AND(block, I0, I0, 0x3f); - UML_STORE(block, (void *)m_local_regs, I0, I1, SIZE_DWORD, SCALE_x4); - } -} - - -template -void hyperstone_device::generate_sum(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - uint16_t op = desc->opptr.w[0]; - const uint32_t src_code = op & 0xf; - const uint32_t dst_code = (op & 0xf0) >> 4; - - generate_decode_const(block, compiler, desc); - generate_check_delay_pc(block); - - if (!SRC_GLOBAL || !DST_GLOBAL) - { - UML_ROLAND(block, I3, DRC_SR, 7, 0x7f); - } - - if (SRC_GLOBAL) - { - UML_LOAD(block, I2, (void *)m_global_regs, src_code, SIZE_DWORD, SCALE_x4); - } - else - { - UML_ADD(block, I2, I3, src_code); - UML_AND(block, I2, I2, 0x3f); - UML_LOAD(block, I2, (void *)m_local_regs, I2, SIZE_DWORD, SCALE_x4); - } - - UML_DADD(block, I5, I1, I2); - - UML_AND(block, DRC_SR, DRC_SR, ~(C_MASK | V_MASK | Z_MASK | N_MASK)); - UML_DTEST(block, I5, 0x100000000U); - UML_SETc(block, uml::COND_NZ, I6); - UML_ROLINS(block, DRC_SR, I6, C_SHIFT, C_MASK); - - UML_XOR(block, I1, I5, I2); - UML_XOR(block, I6, I5, I1); - UML_AND(block, I1, I1, I6); - UML_TEST(block, I1, 0x80000000); - UML_ROLINS(block, DRC_SR, I1, 4, V_MASK); - - UML_TEST(block, I5, ~0); - UML_SETc(block, uml::COND_Z, I6); - UML_ROLINS(block, DRC_SR, I6, Z_SHIFT, Z_MASK); - - UML_ROLINS(block, DRC_SR, I5, 3, N_MASK); - - if (DST_GLOBAL) - { - UML_MOV(block, I4, dst_code); - generate_set_global_register(block, compiler, desc); - } - else - { - UML_ADD(block, I0, I3, dst_code); - UML_AND(block, I2, I0, 0x3f); - UML_STORE(block, (void *)m_local_regs, I2, I5, SIZE_DWORD, SCALE_x4); - } -} - - -template -void hyperstone_device::generate_sums(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_sums (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_cmp(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - uint16_t op = desc->opptr.w[0]; - const uint32_t src_code = op & 0xf; - const uint32_t dst_code = (op & 0xf0) >> 4; - - generate_check_delay_pc(block); - - if (!SRC_GLOBAL || !DST_GLOBAL) - UML_ROLAND(block, I3, DRC_SR, 7, 0x7f); - - if (SRC_GLOBAL) - { - if (src_code == SR_REGISTER) - UML_AND(block, I0, DRC_SR, C_MASK); - else - UML_LOAD(block, I0, (void *)m_global_regs, src_code, SIZE_DWORD, SCALE_x4); - } - else - { - UML_ADD(block, I2, I3, src_code); - UML_AND(block, I4, I2, 0x3f); - UML_LOAD(block, I0, (void *)m_local_regs, I4, SIZE_DWORD, SCALE_x4); - } - - if (DST_GLOBAL) - { - UML_LOAD(block, I1, (void *)m_global_regs, dst_code, SIZE_DWORD, SCALE_x4); - } - else - { - UML_ADD(block, I2, I3, dst_code); - UML_AND(block, I4, I2, 0x3f); - UML_LOAD(block, I1, (void *)m_local_regs, I4, SIZE_DWORD, SCALE_x4); - } - - UML_DSUB(block, I2, I1, I0); // tmp - - UML_AND(block, DRC_SR, DRC_SR, ~(Z_MASK | N_MASK | V_MASK | C_MASK)); - UML_XOR(block, I4, I1, I2); - UML_XOR(block, I5, I1, I0); - UML_AND(block, I6, I4, I5); - UML_ROLINS(block, DRC_SR, I6, 4, V_MASK); - - UML_CMP(block, I1, I0); - UML_SETc(block, uml::COND_B, I3); - UML_ROLINS(block, DRC_SR, I3, C_SHIFT, C_MASK); - - UML_CMP(block, I1, I0); - UML_SETc(block, uml::COND_E, I4); - UML_ROLINS(block, DRC_SR, I4, Z_SHIFT, Z_MASK); - - UML_CMP(block, I1, I0); - UML_SETc(block, uml::COND_L, I5); - UML_ROLINS(block, DRC_SR, I5, N_SHIFT, N_MASK); -} - - -template -void hyperstone_device::generate_mov(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - uint16_t op = desc->opptr.w[0]; - const uint32_t src_code = op & 0xf; - const uint32_t dst_code = (op & 0xf0) >> 4; - - generate_check_delay_pc(block); - - if (DST_GLOBAL) - { - int no_exception; - UML_TEST(block, DRC_SR, H_MASK); - UML_JMPc(block, uml::COND_Z, no_exception = compiler->m_labelnum++); - UML_TEST(block, DRC_SR, S_MASK); - UML_JMPc(block, uml::COND_NZ, no_exception); - UML_EXH(block, *m_exception[EXCEPTION_PRIVILEGE_ERROR], 0); - UML_LABEL(block, no_exception); - } - - if (!SRC_GLOBAL || !DST_GLOBAL) - UML_ROLAND(block, I1, DRC_SR, 7, 0x7f); - - if (SRC_GLOBAL) - { - UML_TEST(block, DRC_SR, H_MASK); - UML_MOVc(block, uml::COND_NZ, I1, 16 + src_code); - UML_MOVc(block, uml::COND_Z, I1, src_code); - UML_LOAD(block, I5, (void *)m_global_regs, I1, SIZE_DWORD, SCALE_x4); - UML_SHL(block, I2, 1, I1); - UML_TEST(block, I2, WRITE_ONLY_REGMASK); - UML_MOVc(block, uml::COND_NZ, I5, 0); - } - else - { - UML_ADD(block, I2, I1, src_code); - UML_AND(block, I2, I2, 0x3f); - UML_LOAD(block, I5, (void *)m_local_regs, I2, SIZE_DWORD, SCALE_x4); - } - - UML_AND(block, DRC_SR, DRC_SR, ~(Z_MASK | N_MASK)); - UML_TEST(block, I3, ~0); - UML_SETc(block, uml::COND_Z, I2); - UML_ROLINS(block, DRC_SR, I2, Z_SHIFT, Z_MASK); - UML_ROLINS(block, DRC_SR, I5, 3, N_MASK); - - if (DST_GLOBAL) - { - UML_TEST(block, DRC_SR, H_MASK); - UML_MOVc(block, uml::COND_NZ, I4, 16 + dst_code); - UML_MOVc(block, uml::COND_Z, I4, dst_code); - generate_set_global_register(block, compiler, desc); - } - else - { - UML_ADD(block, I2, I1, dst_code); - UML_AND(block, I2, I2, 0x3f); - UML_STORE(block, (void *)m_local_regs, I2, I5, SIZE_DWORD, SCALE_x4); - } -} - - -template -void hyperstone_device::generate_add(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - uint16_t op = desc->opptr.w[0]; - const uint32_t src_code = op & 0xf; - const uint32_t dst_code = (op & 0xf0) >> 4; - - generate_check_delay_pc(block); - - if (!SRC_GLOBAL || !DST_GLOBAL) - UML_ROLAND(block, I3, DRC_SR, 7, 0x7f); - - if (SRC_GLOBAL) - { - UML_LOAD(block, I0, (void *)m_global_regs, src_code, SIZE_DWORD, SCALE_x4); - } - else - { - UML_ADD(block, I2, I3, src_code); - UML_AND(block, I4, I2, 0x3f); - UML_LOAD(block, I0, (void *)m_local_regs, I4, SIZE_DWORD, SCALE_x4); - } - - if (DST_GLOBAL) - { - UML_LOAD(block, I1, (void *)m_global_regs, dst_code, SIZE_DWORD, SCALE_x4); - } - else - { - UML_ADD(block, I2, I3, dst_code); - UML_AND(block, I4, I2, 0x3f); - UML_LOAD(block, I1, (void *)m_local_regs, I4, SIZE_DWORD, SCALE_x4); - } - - UML_DADD(block, I2, I0, I1); - - UML_AND(block, DRC_SR, DRC_SR, ~(C_MASK | V_MASK | Z_MASK | N_MASK)); - - UML_DTEST(block, I2, 0x100000000U); - UML_SETc(block, uml::COND_NZ, I4); - UML_ROLINS(block, DRC_SR, I4, 0, C_MASK); - - UML_XOR(block, I4, I0, I2); - UML_XOR(block, I5, I1, I2); - UML_AND(block, I6, I4, I5); - UML_ROLINS(block, DRC_SR, I6, 4, V_MASK); - - UML_ADD(block, I2, I0, I1); - - UML_TEST(block, I2, ~0); - UML_SETc(block, uml::COND_Z, I4); - UML_ROLINS(block, DRC_SR, I4, 0, Z_MASK); - UML_ROLINS(block, DRC_SR, I2, 3, N_MASK); - - if (DST_GLOBAL) - { - UML_MOV(block, I4, dst_code); - UML_MOV(block, I5, I2); - generate_set_global_register(block, compiler, desc); - - if (dst_code == 0) - UML_AND(block, DRC_SR, DRC_SR, ~M_MASK); - } - else - { - UML_ADD(block, I4, I3, dst_code); - UML_AND(block, I5, I4, 0x3f); - UML_STORE(block, (void *)m_local_regs, I5, I2, SIZE_DWORD, SCALE_x4); - } -} - - -template -void hyperstone_device::generate_adds(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_adds (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_cmpb(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_cmpb (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_subc(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_subc (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_sub(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - uint16_t op = desc->opptr.w[0]; - const uint32_t src_code = op & 0xf; - const uint32_t dst_code = (op & 0xf0) >> 4; - - generate_check_delay_pc(block); - - if (!SRC_GLOBAL || !DST_GLOBAL) - UML_ROLAND(block, I3, DRC_SR, 7, 0x7f); - - UML_DMOV(block, I0, 0); - UML_DMOV(block, I1, 0); - - if (SRC_GLOBAL) - { - UML_LOAD(block, I0, (void *)m_global_regs, src_code, SIZE_DWORD, SCALE_x4); - } - else - { - UML_ADD(block, I2, I3, src_code); - UML_AND(block, I4, I2, 0x3f); - UML_LOAD(block, I0, (void *)m_local_regs, I4, SIZE_DWORD, SCALE_x4); - } - - if (DST_GLOBAL) - { - UML_LOAD(block, I1, (void *)m_global_regs, dst_code, SIZE_DWORD, SCALE_x4); - } - else - { - UML_ADD(block, I2, I3, dst_code); - UML_AND(block, I4, I2, 0x3f); - UML_LOAD(block, I1, (void *)m_local_regs, I4, SIZE_DWORD, SCALE_x4); - } - - UML_DSUB(block, I2, I1, I0); - - UML_AND(block, DRC_SR, DRC_SR, ~(C_MASK | V_MASK | Z_MASK | N_MASK)); - - UML_DTEST(block, I2, 0x100000000U); - UML_SETc(block, uml::COND_NZ, I4); - UML_ROLINS(block, DRC_SR, I4, 0, C_MASK); - - UML_XOR(block, I4, I0, I2); - UML_XOR(block, I5, I1, I2); - UML_AND(block, I6, I4, I5); - UML_ROLINS(block, DRC_SR, I6, 4, V_MASK); - - UML_SUB(block, I2, I1, I0); - - UML_TEST(block, I2, ~0); - UML_SETc(block, uml::COND_Z, I4); - UML_ROLINS(block, DRC_SR, I4, 0, Z_MASK); - UML_ROLINS(block, DRC_SR, I2, 3, N_MASK); - - if (DST_GLOBAL) - { - UML_MOV(block, I4, dst_code); - UML_MOV(block, I5, I2); - generate_set_global_register(block, compiler, desc); - - if (dst_code == 0) - UML_AND(block, DRC_SR, DRC_SR, ~M_MASK); - } - else - { - UML_ADD(block, I4, I3, dst_code); - UML_AND(block, I5, I4, 0x3f); - UML_STORE(block, (void *)m_local_regs, I5, I2, SIZE_DWORD, SCALE_x4); - } -} - - -template -void hyperstone_device::generate_subs(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_subs (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_addc(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_addc (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_neg(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_neg (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_negs(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_negs (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_and(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_and (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_andn(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_andn (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_or(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_or (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_xor(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_xor (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_not(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_not (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_cmpi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - uint16_t op = desc->opptr.w[0]; - const uint32_t dst_code = (op & 0xf0) >> 4; - - if (IMM_LONG) - { - generate_decode_immediate_s(block, compiler, desc); // I1 <-- imm32 - } - else - { - UML_AND(block, I1, I0, 0xf); - } - - generate_check_delay_pc(block); - - if (DST_GLOBAL) - { - UML_LOAD(block, I2, (void *)m_global_regs, dst_code, SIZE_DWORD, SCALE_x4); - } - else - { - UML_ROLAND(block, I3, DRC_SR, 7, 0x7f); - UML_ADD(block, I2, I3, dst_code); - UML_LOAD(block, I2, (void *)m_local_regs, I2, SIZE_DWORD, SCALE_x4); - } - - UML_AND(block, DRC_SR, DRC_SR, ~(V_MASK | Z_MASK | N_MASK | C_MASK)); - UML_DSUB(block, I0, I2, I1); - - int no_v; - UML_XOR(block, I0, I0, I2); - UML_XOR(block, I3, I1, I2); - UML_AND(block, I0, I0, I3); - UML_TEST(block, I0, 0x80000000); - UML_JMPc(block, uml::COND_Z, no_v = compiler->m_labelnum++); - UML_OR(block, DRC_SR, DRC_SR, V_MASK); - UML_LABEL(block, no_v); - - int no_n; - UML_MOV(block, I3, 0); - UML_CMP(block, I2, I1); - UML_MOVc(block, uml::COND_E, I3, Z_MASK); - UML_MOVc(block, uml::COND_B, I3, C_MASK); - UML_JMPc(block, uml::COND_GE, no_n = compiler->m_labelnum++); - UML_OR(block, I3, I3, N_MASK); - UML_LABEL(block, no_n); - UML_OR(block, DRC_SR, DRC_SR, I3); - - UML_CMP(block, I2, I1); - -} - - -template -void hyperstone_device::generate_movi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - uint16_t op = desc->opptr.w[0]; - const uint32_t dst_code = (op & 0xf0) >> 4; - const uint32_t src_code = op & 0xf; - - if (IMM_LONG) - generate_decode_immediate_s(block, compiler, desc); - else - UML_MOV(block, I1, src_code); - - generate_check_delay_pc(block); - - int done, no_exception; - if (DST_GLOBAL) - { - UML_TEST(block, DRC_SR, H_MASK); - UML_JMPc(block, uml::COND_Z, no_exception = compiler->m_labelnum++); - UML_TEST(block, DRC_SR, S_MASK); - UML_JMPc(block, uml::COND_NZ, no_exception); - UML_EXH(block, *m_exception[EXCEPTION_PRIVILEGE_ERROR], 0); - UML_JMP(block, done = compiler->m_labelnum++); - UML_LABEL(block, no_exception); - } - - UML_AND(block, DRC_SR, DRC_SR, ~(Z_MASK | N_MASK)); - - int no_z; - UML_TEST(block, I1, ~0); - UML_JMPc(block, uml::COND_NZ, no_z = compiler->m_labelnum++); - UML_OR(block, DRC_SR, DRC_SR, Z_MASK); - UML_LABEL(block, no_z); - - int no_n; - UML_TEST(block, I1, 0x80000000); - UML_JMPc(block, uml::COND_Z, no_n = compiler->m_labelnum++); - UML_OR(block, DRC_SR, DRC_SR, N_MASK); - UML_LABEL(block, no_n); - -#if MISSIONCRAFT_FLAGS - UML_AND(block, DRC_SR, DRC_SR, ~V_MASK); -#endif - - if (DST_GLOBAL) - { - UML_TEST(block, DRC_SR, H_MASK); - UML_MOVc(block, uml::COND_NZ, I4, dst_code + 16); - UML_MOVc(block, uml::COND_Z, I4, dst_code); - UML_MOV(block, I5, I1); - generate_set_global_register(block, compiler, desc); - - UML_TEST(block, op, 0xf0); - UML_JMPc(block, uml::COND_NZ, done); - UML_AND(block, DRC_SR, DRC_SR, ~M_MASK); - generate_delay_slot_and_branch(block, compiler, desc); - - UML_LABEL(block, done); - } - else - { - UML_ROLAND(block, I2, DRC_SR, 7, 0x7f); - UML_ADD(block, I0, I2, dst_code); - UML_AND(block, I0, I0, 0x3f); - UML_STORE(block, (void *)m_local_regs, I0, I1, SIZE_DWORD, SCALE_x4); - } -} - - -template -void hyperstone_device::generate_addi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - uint16_t op = desc->opptr.w[0]; - const uint32_t dst_code = (op & 0xf0) >> 4; - const uint32_t src_code = op & 0xf; - - if (IMM_LONG) - generate_decode_immediate_s(block, compiler, desc); // I1 <-- imm32 - else - UML_MOV(block, I1, src_code); - - generate_check_delay_pc(block); - - if (DST_GLOBAL) - { - UML_LOAD(block, I2, (void *)m_global_regs, dst_code, SIZE_DWORD, SCALE_x4); - } - else - { - UML_ROLAND(block, I3, DRC_SR, 7, 0x7f); - UML_ADD(block, I4, I3, dst_code); - UML_AND(block, I5, I4, 0x3f); - UML_LOAD(block, I2, (void *)m_local_regs, I5, SIZE_DWORD, SCALE_x4); - } - - if (!(op & 0x10f)) - { - UML_TEST(block, DRC_SR, Z_MASK); - UML_SETc(block, uml::COND_Z, I4); - UML_AND(block, I5, I2, 1); - UML_OR(block, I6, I4, I5); - UML_AND(block, I1, DRC_SR, I6); - } - - UML_AND(block, DRC_SR, DRC_SR, ~(C_MASK | V_MASK | Z_MASK | N_MASK)); - - UML_DADD(block, I0, I1, I2); - - UML_DTEST(block, I2, 0x100000000U); - UML_SETc(block, uml::COND_NZ, I4); - UML_ROLINS(block, DRC_SR, I4, 0, C_MASK); - - UML_XOR(block, I4, I2, I0); - UML_XOR(block, I5, I1, I0); - UML_AND(block, I6, I4, I5); - UML_ROLINS(block, DRC_SR, I6, 4, V_MASK); - - UML_ADD(block, I0, I1, I2); - - UML_TEST(block, I0, ~0); - UML_SETc(block, uml::COND_Z, I4); - UML_ROLINS(block, DRC_SR, I4, Z_SHIFT, Z_MASK); - UML_ROLINS(block, DRC_SR, I0, 3, N_MASK); - - if (DST_GLOBAL) - { - UML_MOV(block, I4, dst_code); - UML_MOV(block, I5, I0); - generate_set_global_register(block, compiler, desc); - - if (dst_code == 0) - UML_AND(block, DRC_SR, DRC_SR, ~M_MASK); - } - else - { - UML_ADD(block, I4, I3, dst_code); - UML_AND(block, I5, I4, 0x3f); - UML_STORE(block, (void *)m_local_regs, I5, I0, SIZE_DWORD, SCALE_x4); - } -} - - -template -void hyperstone_device::generate_addsi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_addsi (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_cmpbi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - uint16_t op = desc->opptr.w[0]; - const uint32_t dst_code = (op & 0xf0) >> 4; - - if (!IMM_LONG) - generate_check_delay_pc(block); - - if (DST_GLOBAL) - { - UML_LOAD(block, I2, (void *)m_global_regs, dst_code, SIZE_DWORD, SCALE_x4); - } - else - { - UML_ROLAND(block, I3, DRC_SR, 7, 0x7f); - UML_ADD(block, I4, I3, dst_code); - UML_AND(block, I5, I4, 0x3f); - UML_LOAD(block, I2, (void *)m_local_regs, I5, SIZE_DWORD, SCALE_x4); - } - - const uint32_t n = ((op & 0x100) >> 4) | (op & 0x0f); - if (n) - { - if (n == 31) - { - if (IMM_LONG) - { - generate_ignore_immediate_s(block, desc); - generate_check_delay_pc(block); - } - UML_MOV(block, I1, 0x7fffffff); - } - else - { - if (IMM_LONG) - { - generate_decode_immediate_s(block, compiler, desc); - generate_check_delay_pc(block); - } - else - { - UML_MOV(block, I1, op & 0xf); - } - } - - UML_AND(block, DRC_SR, DRC_SR, ~Z_MASK); - UML_TEST(block, I2, I1); - UML_SETc(block, uml::COND_Z, I3); - UML_ROLINS(block, DRC_SR, I3, Z_SHIFT, Z_MASK); - } - else - { - if (IMM_LONG) - { - generate_ignore_immediate_s(block, desc); - generate_check_delay_pc(block); - } - - int or_mask, done; - UML_TEST(block, I2, 0xff000000); - UML_JMPc(block, uml::COND_Z, or_mask = compiler->m_labelnum++); - UML_TEST(block, I2, 0x00ff0000); - UML_JMPc(block, uml::COND_Z, or_mask); - UML_TEST(block, I2, 0x0000ff00); - UML_JMPc(block, uml::COND_Z, or_mask); - UML_TEST(block, I2, 0x000000ff); - UML_JMPc(block, uml::COND_Z, or_mask); - UML_AND(block, DRC_SR, DRC_SR, ~Z_MASK); - UML_JMP(block, done = compiler->m_labelnum++); - - UML_LABEL(block, or_mask); - UML_OR(block, DRC_SR, DRC_SR, Z_MASK); - - UML_LABEL(block, done); - } -} - - -template -void hyperstone_device::generate_andni(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - uint16_t op = desc->opptr.w[0]; - const uint32_t dst_code = (op & 0xf0) >> 4; - - if (IMM_LONG) - { - generate_decode_immediate_s(block, compiler, desc); // I1 <-- imm32 - } - else - { - UML_AND(block, I1, I0, 0xf); - } - - generate_check_delay_pc(block); - - if (DST_GLOBAL) - { - UML_LOAD(block, I2, (void *)m_global_regs, dst_code, SIZE_DWORD, SCALE_x4); - } - else - { - UML_ROLAND(block, I3, DRC_SR, 7, 0x7f); - UML_ADD(block, I2, I3, dst_code); - UML_LOAD(block, I2, (void *)m_local_regs, I2, SIZE_DWORD, SCALE_x4); - } - - UML_AND(block, DRC_SR, DRC_SR, ~Z_MASK); - UML_XOR(block, I1, I1, ~0); - UML_AND(block, I5, I2, I1); - - if (DST_GLOBAL) - { - UML_MOV(block, I4, dst_code); - generate_set_global_register(block, compiler, desc); - } - else - { - UML_ADD(block, I4, I3, dst_code); - UML_AND(block, I4, I4, 0x3f); - UML_STORE(block, (void *)m_local_regs, I4, I5, SIZE_DWORD, SCALE_x4); - } -} - - -template -void hyperstone_device::generate_ori(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - uint16_t op = desc->opptr.w[0]; - const uint32_t dst_code = (op & 0xf0) >> 4; - - if (IMM_LONG) - { - generate_decode_immediate_s(block, compiler, desc); // I1 <-- imm32 - } - else - { - UML_AND(block, I1, I0, 0xf); - } - - generate_check_delay_pc(block); - - if (DST_GLOBAL) - { - UML_LOAD(block, I2, (void *)m_global_regs, dst_code, SIZE_DWORD, SCALE_x4); - } - else - { - UML_ROLAND(block, I3, DRC_SR, 7, 0x7f); - UML_ADD(block, I2, I3, dst_code); - UML_LOAD(block, I2, (void *)m_local_regs, I2, SIZE_DWORD, SCALE_x4); - } - - UML_AND(block, DRC_SR, DRC_SR, ~Z_MASK); - UML_OR(block, I5, I2, I1); - - if (DST_GLOBAL) - { - UML_MOV(block, I4, dst_code); - generate_set_global_register(block, compiler, desc); - } - else - { - UML_ADD(block, I4, I3, dst_code); - UML_AND(block, I4, I4, 0x3f); - UML_STORE(block, (void *)m_local_regs, I4, I5, SIZE_DWORD, SCALE_x4); - } -} - - -template -void hyperstone_device::generate_xori(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_xori (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_shrdi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_shrdi (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -void hyperstone_device::generate_shrd(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_shrd (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -void hyperstone_device::generate_shr(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_shr (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_shri(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_shri (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_sardi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_sardi (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -void hyperstone_device::generate_sard(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_sard (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -void hyperstone_device::generate_sar(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_sar (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_sari(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_sari (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_shldi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_shldi (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -void hyperstone_device::generate_shld(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_shld (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -void hyperstone_device::generate_shl(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_shl (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_shli(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_shli (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -void hyperstone_device::generate_testlz(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_testlz (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -void hyperstone_device::generate_rol(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_rol (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_ldxx1(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - const uint16_t op = desc->opptr.w[0]; - uint16_t next_1 = READ_OP(desc->pc + 2); - const uint16_t sub_type = (next_1 & 0x3000) >> 12; - - uint32_t extra_s; - if (next_1 & 0x8000) - { - const uint16_t next_2 = READ_OP(desc->pc + 4); - - extra_s = next_2; - extra_s |= ((next_1 & 0xfff) << 16); - - if (next_1 & 0x4000) - extra_s |= 0xf0000000; - - UML_MOV(block, mem(&m_instruction_length), (3<<19)); - UML_ADD(block, DRC_PC, DRC_PC, 4); - } - else - { - extra_s = next_1 & 0xfff; - - if (next_1 & 0x4000) - extra_s |= 0xfffff000; - - UML_MOV(block, mem(&m_instruction_length), (2<<19)); - UML_ADD(block, DRC_PC, DRC_PC, 2); - } - - generate_check_delay_pc(block); - - const uint32_t src_code = op & 0xf; - const uint32_t srcf_code = src_code + 1; - const uint32_t dst_code = (op & 0xf0) >> 4; - - if (!DST_GLOBAL || !SRC_GLOBAL) - UML_ROLAND(block, I3, DRC_SR, 7, 0x7f); - - if (DST_GLOBAL) - { - if (dst_code == SR_REGISTER) - { - UML_MOV(block, I6, extra_s); - } - else - { - UML_LOAD(block, I4, (void *)m_global_regs, dst_code, SIZE_DWORD, SCALE_x4); - } - } - else - { - UML_ADD(block, I2, I3, dst_code); - UML_AND(block, I5, I2, 0x3f); - UML_LOAD(block, I4, (void *)m_local_regs, I5, SIZE_DWORD, SCALE_x4); - } - - UML_ADD(block, I6, I4, extra_s); - - switch (sub_type) - { - case 0: // LDBS.A - UML_MOV(block, I0, I6); - UML_CALLH(block, *m_mem_read8); - - if (SRC_GLOBAL) - { - UML_MOV(block, I4, src_code); - UML_SEXT(block, I5, I1, SIZE_BYTE); - generate_set_global_register(block, compiler, desc); - } - else - { - UML_ADD(block, I2, I3, src_code); - UML_AND(block, I2, I2, 0x3f); - UML_STORE(block, (void *)m_local_regs, I2, I1, SIZE_DWORD, SCALE_x4); - } - break; - - case 1: // LDBU.A - UML_MOV(block, I0, I6); - UML_CALLH(block, *m_mem_read8); - - if (SRC_GLOBAL) - { - UML_MOV(block, I4, src_code); - UML_MOV(block, I5, I1); - generate_set_global_register(block, compiler, desc); - } - else - { - UML_ADD(block, I2, I3, src_code); - UML_AND(block, I2, I2, 0x3f); - UML_STORE(block, (void *)m_local_regs, I2, I1, SIZE_DWORD, SCALE_x4); - } - break; - - case 2: - UML_AND(block, I6, I6, ~1); - UML_MOV(block, I0, I6); - UML_CALLH(block, *m_mem_read16); - - if (SRC_GLOBAL) - { - UML_MOV(block, I4, src_code); - if (extra_s & 1) // LDHS.A - UML_SEXT(block, I5, I1, SIZE_WORD); - else // LDHU.A - UML_MOV(block, I5, I1); - - generate_set_global_register(block, compiler, desc); - } - else - { - UML_ADD(block, I2, I3, src_code); - UML_AND(block, I2, I2, 0x3f); - if (extra_s & 1) - { - UML_SEXT(block, I5, I1, SIZE_WORD); - UML_STORE(block, (void *)m_local_regs, I2, I5, SIZE_DWORD, SCALE_x4); - } - else - { - UML_STORE(block, (void *)m_local_regs, I2, I1, SIZE_DWORD, SCALE_x4); - } - } - break; - - case 3: - { - uint32_t switch_val = extra_s & 3; - UML_AND(block, I6, I6, ~3); - switch (switch_val) - { - case 0: // LDW.A/D - UML_MOV(block, I0, I6); - UML_CALLH(block, *m_mem_read32); - - if (SRC_GLOBAL) - { - UML_MOV(block, I5, I1); - UML_MOV(block, I4, src_code); - generate_set_global_register(block, compiler, desc); - } - else - { - UML_ADD(block, I2, I3, src_code); - UML_AND(block, I2, I2, 0x3f); - UML_STORE(block, (void *)m_local_regs, I2, I1, SIZE_DWORD, SCALE_x4); - } - break; - case 1: // LDD.A - UML_MOV(block, I0, I6); - UML_CALLH(block, *m_mem_read32); - - if (SRC_GLOBAL) - { - UML_MOV(block, I5, I1); - UML_MOV(block, I4, src_code); - generate_set_global_register(block, compiler, desc); - } - else - { - UML_ADD(block, I2, I3, src_code); - UML_AND(block, I2, I2, 0x3f); - UML_STORE(block, (void *)m_local_regs, I2, I1, SIZE_DWORD, SCALE_x4); - } - - UML_ADD(block, I0, I6, 4); - UML_CALLH(block, *m_mem_read32); - - if (SRC_GLOBAL) - { - UML_MOV(block, I5, I1); - UML_MOV(block, I4, srcf_code); - generate_set_global_register(block, compiler, desc); - } - else - { - UML_ADD(block, I2, I3, srcf_code); - UML_AND(block, I2, I2, 0x3f); - UML_STORE(block, (void *)m_local_regs, I2, I1, SIZE_DWORD, SCALE_x4); - } - break; - case 2: // LDW.IOA - UML_MOV(block, I0, I6); - UML_CALLH(block, *m_io_read32); - - if (SRC_GLOBAL) - { - UML_MOV(block, I5, I1); - UML_MOV(block, I4, src_code); - generate_set_global_register(block, compiler, desc); - } - else - { - UML_ADD(block, I2, I3, src_code); - UML_AND(block, I2, I2, 0x3f); - UML_STORE(block, (void *)m_local_regs, I2, I1, SIZE_DWORD, SCALE_x4); - } - break; - - case 3: // LDD.IOA - UML_MOV(block, I0, I6); - UML_CALLH(block, *m_io_read32); - - if (SRC_GLOBAL) - { - UML_MOV(block, I5, I1); - UML_MOV(block, I4, src_code); - generate_set_global_register(block, compiler, desc); - } - else - { - UML_ADD(block, I2, I3, src_code); - UML_AND(block, I2, I2, 0x3f); - UML_STORE(block, (void *)m_local_regs, I2, I1, SIZE_DWORD, SCALE_x4); - } - - UML_ADD(block, I0, I6, 4); - UML_CALLH(block, *m_io_read32); - - if (SRC_GLOBAL) - { - UML_MOV(block, I5, I1); - UML_MOV(block, I4, srcf_code); - generate_set_global_register(block, compiler, desc); - } - else - { - UML_ADD(block, I2, I3, srcf_code); - UML_AND(block, I2, I2, 0x3f); - UML_STORE(block, (void *)m_local_regs, I2, I1, SIZE_DWORD, SCALE_x4); - } - break; - } - break; - } - } -} - - -template -void hyperstone_device::generate_ldxx2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_ldxx2 (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_stxx1(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - const uint16_t op = desc->opptr.w[0]; - - uint16_t next_1 = READ_OP(desc->pc + 2); - const uint16_t sub_type = (next_1 & 0x3000) >> 12; - - uint32_t extra_s; - if (next_1 & 0x8000) - { - const uint16_t next_2 = READ_OP(desc->pc + 4); - - extra_s = next_2; - extra_s |= ((next_1 & 0xfff) << 16); - - if (next_1 & 0x4000) - extra_s |= 0xf0000000; - - UML_MOV(block, mem(&m_instruction_length), (3<<19)); - UML_ADD(block, DRC_PC, DRC_PC, 4); - } - else - { - extra_s = next_1 & 0xfff; - - if (next_1 & 0x4000) - extra_s |= 0xfffff000; - - UML_MOV(block, mem(&m_instruction_length), (2<<19)); - UML_ADD(block, DRC_PC, DRC_PC, 2); - } - - generate_check_delay_pc(block); - - const uint32_t src_code = op & 0xf; - const uint32_t dst_code = (op & 0xf0) >> 4; - - UML_ROLAND(block, I3, DRC_SR, 7, 0x7f); - - if (DST_GLOBAL) - { - UML_LOAD(block, I0, (void *)m_global_regs, dst_code, SIZE_DWORD, SCALE_x4); - } - else - { - UML_ADD(block, I1, I3, dst_code); - UML_AND(block, I1, I1, 0x3f); - UML_LOAD(block, I0, (void *)m_local_regs, I1, SIZE_DWORD, SCALE_x4); - } - - if (SRC_GLOBAL) - { - UML_LOAD(block, I1, (void *)m_global_regs, src_code, SIZE_DWORD, SCALE_x4); - } - else - { - UML_ADD(block, I1, I3, src_code); - UML_AND(block, I1, I1, 0x3f); - UML_LOAD(block, I1, (void *)m_local_regs, I1, SIZE_DWORD, SCALE_x4); - } - - switch (sub_type) - { - case 0: // STBS.D - case 1: // STBU.D - // TODO: missing trap on range error for STBS.D - UML_ADD(block, I0, I0, extra_s); - UML_CALLH(block, *m_mem_write8); - break; - - case 2: // STHS.D, STHU.D - // TODO: missing trap on range error with STHS.D - UML_ADD(block, I0, I0, extra_s); - UML_CALLH(block, *m_mem_write16); - break; - - case 3: - switch (extra_s & 3) - { - case 0: // STW.D - UML_ADD(block, I0, I0, extra_s & ~3); - UML_CALLH(block, *m_mem_write32); - break; - case 1: // STD.D - { - UML_ADD(block, I0, I0, extra_s & ~1); - UML_CALLH(block, *m_mem_write32); - - if (SRC_GLOBAL) - { - if (src_code == SR_REGISTER) - UML_MOV(block, I1, 0); - else - UML_LOAD(block, I1, (void *)m_global_regs, src_code + 1, SIZE_DWORD, SCALE_x4); - } - else - { - UML_ADD(block, I1, I3, src_code + 1); - UML_AND(block, I1, I1, 0x3f); - UML_LOAD(block, I1, (void *)m_local_regs, I1, SIZE_DWORD, SCALE_x4); - } - - UML_ADD(block, I0, I0, 4); - UML_CALLH(block, *m_mem_write32); - break; - } - case 2: // STW.IOD - UML_ADD(block, I0, I0, extra_s & ~3); - UML_CALLH(block, *m_io_write32); - break; - case 3: // STD.IOD - { - UML_ADD(block, I0, I0, extra_s & ~1); - UML_CALLH(block, *m_io_write32); - - if (SRC_GLOBAL) - { - if (src_code == SR_REGISTER) - UML_MOV(block, I1, 0); - else - UML_LOAD(block, I1, (void *)m_global_regs, src_code + 1, SIZE_DWORD, SCALE_x4); - } - else - { - UML_ADD(block, I1, I3, src_code + 1); - UML_AND(block, I1, I1, 0x3f); - UML_LOAD(block, I1, (void *)m_local_regs, I1, SIZE_DWORD, SCALE_x4); - } - - UML_ADD(block, I0, I0, 4); - UML_CALLH(block, *m_io_write32); - break; - } - } - break; - } -} - - -template -void hyperstone_device::generate_stxx2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_stxx2 (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_mulsu(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_mulsu (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_mul(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_mul (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_set(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_set (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_ldwr(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - const uint16_t op = desc->opptr.w[0]; - - generate_check_delay_pc(block); - - const uint32_t src_code = op & 0xf; - const uint32_t dst_code = (op & 0xf0) >> 4; - - UML_ROLAND(block, I3, DRC_SR, 7, 0x7f); - UML_ADD(block, I2, I3, dst_code); - UML_LOAD(block, I0, (void *)m_local_regs, I2, SIZE_DWORD, SCALE_x4); - UML_CALLH(block, *m_mem_read32); - - if (SRC_GLOBAL) - { - UML_MOV(block, I4, src_code); - UML_MOV(block, I5, I1); - generate_set_global_register(block, compiler, desc); - } - else - { - UML_ADD(block, I2, I3, src_code); - UML_AND(block, I4, I2, 0x3f); - UML_STORE(block, (void *)m_local_regs, I4, I1, SIZE_DWORD, SCALE_x4); - } -} - - -template -void hyperstone_device::generate_lddr(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_lddr (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_ldwp(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - const uint16_t op = desc->opptr.w[0]; - - generate_check_delay_pc(block); - - const uint32_t src_code = op & 0xf; - const uint32_t dst_code = (op & 0xf0) >> 4; - - UML_ROLAND(block, I0, DRC_SR, 7, 0x7f); - UML_ADD(block, I1, I0, dst_code); - UML_AND(block, I2, I1, 0x3f); - UML_LOAD(block, I0, (void *)m_local_regs, I2, SIZE_DWORD, SCALE_x4); - - UML_ADD(block, I3, I0, 4); - UML_CALLH(block, *m_mem_read32); - - if (SRC_GLOBAL) - { - UML_MOV(block, I4, src_code); - UML_MOV(block, I5, I1); - generate_set_global_register(block, compiler, desc); - - UML_ROLAND(block, I0, DRC_SR, 7, 0x7f); - UML_ADD(block, I1, I0, dst_code); - UML_AND(block, I2, I1, 0x3f); - UML_STORE(block, (void *)m_local_regs, I2, I3, SIZE_DWORD, SCALE_x4); - } - else - { - UML_ROLAND(block, I0, DRC_SR, 7, 0x7f); - UML_ADD(block, I4, I0, src_code); - UML_AND(block, I5, I4, 0x3f); - UML_STORE(block, (void *)m_local_regs, I5, I1, SIZE_DWORD, SCALE_x4); - - if (src_code != dst_code) - { - UML_ADD(block, I4, I0, dst_code); - UML_AND(block, I5, I4, 0x3f); - UML_STORE(block, (void *)m_local_regs, I5, I3, SIZE_DWORD, SCALE_x4); - } - } -} - - -template -void hyperstone_device::generate_lddp(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - const uint16_t op = desc->opptr.w[0]; - - generate_check_delay_pc(block); - - const uint32_t src_code = op & 0xf; - const uint32_t dst_code = (op & 0xf0) >> 4; - - UML_ROLAND(block, I0, DRC_SR, 7, 0x7f); - UML_ADD(block, I1, I0, dst_code); - UML_AND(block, I2, I1, 0x3f); - UML_LOAD(block, I0, (void *)m_local_regs, I2, SIZE_DWORD, SCALE_x4); - - UML_ADD(block, I3, I0, 8); - UML_CALLH(block, *m_mem_read32); - UML_MOV(block, I2, I1); // I2: dreg[0] - UML_ADD(block, I0, I0, 4); - UML_CALLH(block, *m_mem_read32); // I1: dreg[4] - - if (SRC_GLOBAL) - { - UML_MOV(block, I4, src_code); - UML_MOV(block, I5, I2); - generate_set_global_register(block, compiler, desc); - UML_MOV(block, I4, src_code + 1); - UML_MOV(block, I5, I1); - generate_set_global_register(block, compiler, desc); - - UML_ROLAND(block, I0, DRC_SR, 7, 0x7f); - UML_ADD(block, I1, I0, dst_code); - UML_AND(block, I2, I1, 0x3f); - UML_STORE(block, (void *)m_local_regs, I2, I3, SIZE_DWORD, SCALE_x4); - } - else - { - UML_ROLAND(block, I0, DRC_SR, 7, 0x7f); - UML_ADD(block, I4, I0, src_code); - UML_AND(block, I5, I4, 0x3f); - UML_STORE(block, (void *)m_local_regs, I5, I2, SIZE_DWORD, SCALE_x4); - UML_ADD(block, I4, I0, src_code + 1); - UML_AND(block, I5, I4, 0x3f); - UML_STORE(block, (void *)m_local_regs, I5, I1, SIZE_DWORD, SCALE_x4); - - if (src_code != dst_code && (src_code + 1) != dst_code) - { - UML_ADD(block, I4, I0, dst_code); - UML_AND(block, I5, I4, 0x3f); - UML_STORE(block, (void *)m_local_regs, I5, I3, SIZE_DWORD, SCALE_x4); - } - } -} - - -template -void hyperstone_device::generate_stwr(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - const uint16_t op = desc->opptr.w[0]; - - generate_check_delay_pc(block); - - const uint32_t src_code = op & 0xf; - const uint32_t dst_code = (op & 0xf0) >> 4; - - UML_ROLAND(block, I3, DRC_SR, 7, 0x7f); - - if (SRC_GLOBAL) - { - if (src_code == SR_REGISTER) - UML_MOV(block, I1, 0); - else - UML_LOAD(block, I1, (void *)m_global_regs, src_code, SIZE_DWORD, SCALE_x4); - } - else - { - UML_ADD(block, I2, I3, src_code); - UML_AND(block, I2, I2, 0x3f); - UML_LOAD(block, I1, (void *)m_local_regs, I2, SIZE_DWORD, SCALE_x4); - } - - UML_ADD(block, I2, I3, dst_code); - UML_AND(block, I4, I2, 0x3f); - UML_LOAD(block, I0, (void *)m_local_regs, I4, SIZE_DWORD, SCALE_x4); - UML_CALLH(block, *m_mem_write32); -} - - -template -void hyperstone_device::generate_stdr(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_stdr (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_stwp(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - const uint16_t op = desc->opptr.w[0]; - - generate_check_delay_pc(block); - - const uint32_t src_code = op & 0xf; - const uint32_t dst_code = (op & 0xf0) >> 4; - - UML_ROLAND(block, I3, DRC_SR, 7, 0x7f); - - if (SRC_GLOBAL) - { - if (src_code == SR_REGISTER) - UML_MOV(block, I1, 0); - else - UML_LOAD(block, I1, (void *)m_global_regs, src_code, SIZE_DWORD, SCALE_x4); - } - else - { - UML_ADD(block, I2, I3, src_code); - UML_AND(block, I0, I2, 0x3f); - UML_LOAD(block, I1, (void *)m_local_regs, I0, SIZE_DWORD, SCALE_x4); - } - - UML_ADD(block, I2, I3, dst_code); - UML_AND(block, I4, I2, 0x3f); - UML_LOAD(block, I0, (void *)m_local_regs, I4, SIZE_DWORD, SCALE_x4); - UML_CALLH(block, *m_mem_write32); - UML_ADD(block, I2, I0, 4); - UML_STORE(block, (void *)m_local_regs, I4, I2, SIZE_DWORD, SCALE_x4); -} - - -template -void hyperstone_device::generate_stdp(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_stdp (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - static const uint32_t condition_masks[6] = { V_MASK, Z_MASK, C_MASK, C_MASK | Z_MASK, N_MASK, N_MASK | Z_MASK }; - - int done = compiler->m_labelnum++; - uml::condition_t condition = COND_SET ? uml::COND_Z : uml::COND_NZ; - - int skip; - UML_TEST(block, DRC_SR, condition_masks[CONDITION]); - UML_JMPc(block, condition, skip = compiler->m_labelnum++); - generate_br(block, compiler, desc); - - UML_JMP(block, done); - - UML_LABEL(block, skip); - generate_ignore_pcrel(block, desc); - generate_check_delay_pc(block); - - UML_LABEL(block, done); -} - - -void hyperstone_device::generate_br(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - generate_decode_pcrel(block, desc); - generate_check_delay_pc(block); - - UML_ADD(block, DRC_PC, DRC_PC, I1); - UML_AND(block, DRC_SR, DRC_SR, ~M_MASK); - - generate_delay_slot_and_branch(block, compiler, desc); - // TODO: correct cycle count -} - - -template -void hyperstone_device::generate_db(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - static const uint32_t condition_masks[6] = { V_MASK, Z_MASK, C_MASK, C_MASK | Z_MASK, N_MASK, N_MASK | Z_MASK }; - int skip_jump = compiler->m_labelnum++; - int done = compiler->m_labelnum++; - - UML_TEST(block, DRC_SR, condition_masks[CONDITION]); - if (COND_SET) - UML_JMPc(block, uml::COND_Z, skip_jump); - else - UML_JMPc(block, uml::COND_NZ, skip_jump); - - generate_dbr(block, compiler, desc); - UML_JMP(block, done); - - UML_LABEL(block, skip_jump); - generate_ignore_pcrel(block, desc); - generate_check_delay_pc(block); - - UML_LABEL(block, done); -} - - -void hyperstone_device::generate_dbr(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - generate_decode_pcrel(block, desc); - generate_check_delay_pc(block); - - UML_MOV(block, mem(&m_delay_slot), 1); - UML_ADD(block, mem(&m_delay_pc), DRC_PC, I1); - UML_MOV(block, mem(&m_intblock), 3); - generate_delay_slot_and_branch(block, compiler, desc); -} - - -void hyperstone_device::generate_frame(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - const uint16_t op = desc->opptr.w[0]; - - generate_check_delay_pc(block); - - UML_ROLAND(block, I1, DRC_SR, 7, 0x7f); - UML_SUB(block, I1, I1, op & 0xf); - UML_ROLINS(block, DRC_SR, I1, 25, 0xfe000000); // SET_FP(GET_FP - SRC_CODE) - UML_ROLINS(block, DRC_SR, op, 17, 0x01e00000); // SET_FL(DST_CODE) - UML_AND(block, DRC_SR, DRC_SR, ~M_MASK); // SET_M(0) - - UML_MOV(block, I0, mem(&SP)); - UML_ADD(block, I1, I1, (op & 0xf0) >> 4); - UML_ROLAND(block, I2, I0, 30, 0x7f); - UML_ADD(block, I2, I2, (64 - 10)); - UML_SUB(block, I3, I2, I1); - UML_SEXT(block, I3, I3, SIZE_BYTE); // difference = ((SP & 0x1fc) >> 2) + (64 - 10) - ((GET_FP - SRC_CODE) + GET_FL) - - int diff_in_range, done; - UML_CMP(block, I3, -64); - UML_JMPc(block, uml::COND_L, done = compiler->m_labelnum++); - UML_CMP(block, I3, 64); - UML_JMPc(block, uml::COND_L, diff_in_range = compiler->m_labelnum++); - UML_OR(block, I3, I3, 0xffffff80); - UML_LABEL(block, diff_in_range); - - UML_CMP(block, I0, mem(&UB)); - UML_SETc(block, uml::COND_AE, I4); - UML_CMP(block, I3, 0); - UML_JMPc(block, uml::COND_GE, done); - - int push_next; - UML_LABEL(block, push_next = compiler->m_labelnum++); - UML_ROLAND(block, I2, I0, 30, 0x3f); - UML_LOAD(block, I1, (void *)m_local_regs, I2, SIZE_DWORD, SCALE_x4); - UML_CALLH(block, *m_mem_write32); - UML_ADD(block, I0, I0, 4); - UML_ADD(block, I3, I3, 1); - - UML_TEST(block, I3, ~0); - UML_JMPc(block, uml::COND_NZ, push_next); - - UML_MOV(block, mem(&SP), I0); - - UML_TEST(block, I4, ~0); - UML_EXHc(block, uml::COND_NZ, *m_exception[EXCEPTION_FRAME_ERROR], 0); - - UML_LABEL(block, done); -} - -template -void hyperstone_device::generate_call(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - uint16_t op = desc->opptr.w[0]; - uint16_t imm_1 = READ_OP(desc->pc + 2); - - int32_t extra_s = 0; - - if (imm_1 & 0x8000) - { - uint16_t imm_2 = READ_OP(desc->pc + 4); - - extra_s = imm_2; - extra_s |= ((imm_1 & 0x3fff) << 16); - - if (imm_1 & 0x4000) - extra_s |= 0xc0000000; - - UML_MOV(block, mem(&m_instruction_length), (3<<19)); - UML_ADD(block, DRC_PC, DRC_PC, 4); - } - else - { - extra_s = imm_1 & 0x3fff; - - if (imm_1 & 0x4000) - extra_s |= 0xffffc000; - - UML_MOV(block, mem(&m_instruction_length), (2<<19)); - UML_ADD(block, DRC_PC, DRC_PC, 2); - } - - UML_MOV(block, I1, extra_s); - - generate_check_delay_pc(block); - - const uint32_t src_code = op & 0xf; - uint32_t dst_code = (op & 0xf0) >> 4; - - if (!dst_code) - dst_code = 16; - - UML_ROLAND(block, I3, DRC_SR, 7, 0x7f); - - if (SRC_GLOBAL) - { - if (src_code == SR_REGISTER) - UML_MOV(block, I2, 0); - else - UML_LOAD(block, I2, (void *)m_global_regs, src_code, SIZE_DWORD, SCALE_x4); - } - else - { - UML_ADD(block, I4, I3, src_code); - UML_AND(block, I5, I4, 0x3f); - UML_LOAD(block, I2, (void *)m_local_regs, I5, SIZE_DWORD, SCALE_x4); - } - - UML_AND(block, I4, DRC_PC, ~1); - UML_ROLINS(block, I4, DRC_SR, 32-S_SHIFT, 1); - - UML_ADD(block, I1, I3, dst_code); - UML_AND(block, I6, I1, 0x3f); - UML_STORE(block, (void *)m_local_regs, I6, I4, SIZE_DWORD, SCALE_x4); - - UML_ADD(block, I4, I6, 1); - UML_AND(block, I5, I4, 0x3f); - UML_STORE(block, (void *)m_local_regs, I5, DRC_SR, SIZE_DWORD, SCALE_x4); - - UML_ROLINS(block, DRC_SR, I1, 25, 0xfe000000); - UML_ROLINS(block, DRC_SR, 6, 21, 0x01e00000); - UML_AND(block, DRC_SR, DRC_SR, ~M_MASK); - - UML_ADD(block, DRC_PC, I2, extra_s & ~1); - - UML_MOV(block, mem(&m_intblock), 2); - - generate_delay_slot_and_branch(block, compiler, desc); - //TODO: add interrupt locks, errors, .... -} - - - -void hyperstone_device::generate_trap_op(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_trap_op (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - -void hyperstone_device::generate_extend(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_extend (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -void hyperstone_device::generate_reserved(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_reserved (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - -void hyperstone_device::generate_do(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_do (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - diff --git a/src/devices/cpu/e132xs/e132xsfe.cpp b/src/devices/cpu/e132xs/e132xsfe.cpp deleted file mode 100644 index 33f57434e1b..00000000000 --- a/src/devices/cpu/e132xs/e132xsfe.cpp +++ /dev/null @@ -1,1303 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Ryan Holtz -/*************************************************************************** - - e132xsfe.cpp - - Front end for Hyperstone recompiler - -***************************************************************************/ - -#include "emu.h" -#include "e132xsfe.h" -#include "32xsdefs.h" - -#define FE_FP ((m_cpu->m_global_regs[1] & 0xfe000000) >> 25) -#define FE_FL (m_cpu->m_fl_lut[((m_cpu->m_global_regs[1] >> 21) & 0xf)]) -#define DST_CODE ((op & 0xf0) >> 4) -#define SRC_CODE (op & 0x0f) -#define SR_CODE (1 << 1) - -/*************************************************************************** - INSTRUCTION PARSERS -***************************************************************************/ - -e132xs_frontend::e132xs_frontend(hyperstone_device *e132xs, uint32_t window_start, uint32_t window_end, uint32_t max_sequence) - : drc_frontend(*e132xs, window_start, window_end, max_sequence) - , m_cpu(e132xs) -{ -} - -inline uint32_t e132xs_frontend::imm_length(opcode_desc &desc, uint16_t op) -{ - uint8_t nybble = op & 0x0f; - switch (nybble) - { - case 0: - default: - return 2; - case 1: - return 6; - case 2: - case 3: - return 4; - } -} - -inline uint16_t e132xs_frontend::read_word(opcode_desc &desc) -{ - return m_cpu->m_direct->read_word(desc.physpc, m_cpu->m_opcodexor); -} - -inline uint16_t e132xs_frontend::read_imm1(opcode_desc &desc) -{ - return m_cpu->m_direct->read_word(desc.physpc + 2, m_cpu->m_opcodexor); -} - -inline uint16_t e132xs_frontend::read_imm2(opcode_desc &desc) -{ - return m_cpu->m_direct->read_word(desc.physpc + 4, m_cpu->m_opcodexor); -} - -inline uint32_t e132xs_frontend::read_ldstxx_imm(opcode_desc &desc) -{ - const uint16_t imm1 = read_imm1(desc); - uint32_t extra_s; - if (imm1 & 0x8000) - { - extra_s = read_imm2(desc); - extra_s |= ((imm1 & 0xfff) << 16); - - if (imm1 & 0x4000) - extra_s |= 0xf0000000; - } - else - { - extra_s = imm1 & 0xfff; - - if (imm1 & 0x4000) - extra_s |= 0xfffff000; - } - return extra_s; -} - -inline uint32_t e132xs_frontend::read_limm(opcode_desc &desc, uint16_t op) -{ - static const int32_t immediate_values[16] = - { - 16, 0, 0, 0, 32, 64, 128, int32_t(0x80000000), - -8, -7, -6, -5, -4, -3, -2, -1 - }; - - uint8_t nybble = op & 0xf; - switch (nybble) - { - case 0: - return 16; - case 1: - return (read_imm1(desc) << 16) | read_imm2(desc); - case 2: - return read_imm1(desc); - case 3: - return 0xffff0000 | read_imm1(desc); - default: - return immediate_values[nybble]; - } -} - -inline int32_t e132xs_frontend::decode_pcrel(opcode_desc &desc, uint16_t op) -{ - if (op & 0x80) - { - uint16_t next = read_imm1(desc); - - desc.length = 4; - - int32_t offset = (op & 0x7f) << 16; - offset |= (next & 0xfffe); - - if (next & 1) - offset |= 0xff800000; - - return offset; - } - else - { - int32_t offset = op & 0x7e; - if (op & 1) - offset |= 0xffffff80; - return offset; - } -} - -inline int32_t e132xs_frontend::decode_call(opcode_desc &desc) -{ - const uint16_t imm_1 = read_imm1(desc); - int32_t extra_s = 0; - if (imm_1 & 0x8000) - { - desc.length = 6; - extra_s = read_imm2(desc); - extra_s |= ((imm_1 & 0x3fff) << 16); - - if (imm_1 & 0x4000) - extra_s |= 0xc0000000; - } - else - { - desc.length = 4; - extra_s = imm_1 & 0x3fff; - if (imm_1 & 0x4000) - extra_s |= 0xffffc000; - } - return extra_s; -} - - -/*------------------------------------------------- - describe - build a description of a single - instruction --------------------------------------------------*/ - -bool e132xs_frontend::describe(opcode_desc &desc, const opcode_desc *prev) -{ - uint16_t op = desc.opptr.w[0] = read_word(desc); - - /* most instructions are 2 bytes and a single cycle */ - desc.length = 2; - desc.cycles = m_cpu->m_clock_cycles_1; - - const uint32_t fp = FE_FP; - const uint32_t gdst_code = DST_CODE; - const uint32_t gdstf_code = gdst_code + 1; - const uint32_t gsrc_code = SRC_CODE; - const uint32_t gsrcf_code = gsrc_code + 1; - const uint32_t ldst_code = (gdst_code + fp) & 0x1f; - const uint32_t ldstf_code = (gdstf_code + fp) & 0x1f; - const uint32_t lsrc_code = (gsrc_code + fp) & 0x1f; - const uint32_t lsrcf_code = (gsrcf_code + fp) & 0x1f; - const uint32_t ldst_group = 1 + (((DST_CODE + fp) & 0x20) >> 5); - const uint32_t ldstf_group = 1 + (((DST_CODE + fp + 1) & 0x20) >> 5); - const uint32_t lsrc_group = 1 + (((SRC_CODE + fp) & 0x20) >> 5); - const uint32_t lsrcf_group = 1 + ((SRC_CODE + fp + 1) >> 5); - - switch (op >> 8) - { - case 0x00: // chk global,global - desc.regin[0] |= 1 << gdst_code; - desc.regin[0] |= 1 << gsrc_code; - desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; - break; - case 0x01: // chk global,local - desc.regin[0] |= SR_CODE; - desc.regin[0] |= 1 << gdst_code; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; - break; - case 0x02: // chk local,global - desc.regin[0] |= SR_CODE; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regin[0] |= 1 << gsrc_code; - desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; - break; - case 0x03: // chk local,local - desc.regin[0] |= SR_CODE; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; - break; - case 0x04: // movd global,global - desc.regin[0] |= 1 << gsrc_code; - desc.regin[0] |= 1 << gsrcf_code; - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= 1 << gdstf_code; - if (gdst_code == 0) - { - desc.regout[1] = 0xffffffff; - desc.regout[2] = 0xffffffff; - desc.targetpc = BRANCH_TARGET_DYNAMIC; - desc.flags |= OPFLAG_IS_UNCONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE | OPFLAG_CAN_CAUSE_EXCEPTION; - } - else - { - desc.cycles = m_cpu->m_clock_cycles_2; - } - desc.regout[0] |= SR_CODE; - break; - case 0x05: // movd global,local - desc.regin[0] |= SR_CODE; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regin[lsrcf_group] |= 1 << lsrcf_code; - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= 1 << gdstf_code; - if (gdst_code == 0) - { - desc.regout[1] = 0xffffffff; - desc.regout[2] = 0xffffffff; - desc.targetpc = BRANCH_TARGET_DYNAMIC; - desc.flags |= OPFLAG_IS_UNCONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE | OPFLAG_CAN_CAUSE_EXCEPTION; - } - else - { - desc.cycles = m_cpu->m_clock_cycles_2; - } - desc.regout[0] |= SR_CODE; - break; - case 0x06: // movd local,global - desc.regin[0] |= SR_CODE; - desc.regin[0] |= 1 << gsrc_code; - desc.regin[0] |= 1 << gsrcf_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[ldstf_group] |= 1 << ldstf_code; - desc.regout[0] |= SR_CODE; - desc.cycles = m_cpu->m_clock_cycles_2; - break; - case 0x07: // movd local,local - desc.regin[0] |= SR_CODE; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regin[lsrcf_group] |= 1 << lsrcf_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[ldstf_group] |= 1 << ldstf_code; - desc.regout[0] |= SR_CODE; - desc.cycles = m_cpu->m_clock_cycles_2; - break; - case 0x08: // divu global,global - case 0x0c: // divs global,global - desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; - desc.regin[0] |= 1 << gsrc_code; - desc.regin[0] |= 1 << gdst_code; - desc.regin[0] |= 1 << gdstf_code; - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= 1 << gdstf_code; - desc.regout[0] |= SR_CODE; - desc.cycles = 36 << m_cpu->m_clck_scale; - break; - case 0x09: // divu global,local - case 0x0d: // divs global,local - desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; - desc.regin[0] |= SR_CODE; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regin[0] |= 1 << gdst_code; - desc.regin[0] |= 1 << gdstf_code; - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= 1 << gdstf_code; - desc.regout[0] |= SR_CODE; - desc.cycles = 36 << m_cpu->m_clck_scale; - break; - case 0x0a: // divu local,global - case 0x0e: // divs local,global - desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; - desc.regin[0] |= SR_CODE; - desc.regin[0] |= 1 << gsrc_code; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regin[ldstf_group] |= 1 << ldstf_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[ldstf_group] |= 1 << ldstf_code; - desc.regout[0] |= SR_CODE; - desc.cycles = 36 << m_cpu->m_clck_scale; - break; - case 0x0b: // divu local,local - case 0x0f: // divs local,local - desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; - desc.regin[0] |= SR_CODE; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regin[ldstf_group] |= 1 << ldstf_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[ldstf_group] |= 1 << ldstf_code; - desc.regout[0] |= SR_CODE; - desc.cycles = 36 << m_cpu->m_clck_scale; - break; - case 0x10: // xm global,global - desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; - desc.regin[0] |= 1 << gsrc_code; - desc.regout[0] |= 1 << gdst_code; - desc.length = (read_imm1(desc) & 0x8000) ? 6 : 4; - break; - case 0x11: // xm global,local - desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; - desc.regin[0] |= SR_CODE; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regout[0] |= 1 << gdst_code; - desc.length = (read_imm1(desc) & 0x8000) ? 6 : 4; - break; - case 0x12: // xm local,global - desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; - desc.regin[0] |= SR_CODE; - desc.regin[0] |= 1 << gsrc_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.length = (read_imm1(desc) & 0x8000) ? 6 : 4; - break; - case 0x13: // xm local,local - desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; - desc.regin[0] |= SR_CODE; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.length = (read_imm1(desc) & 0x8000) ? 6 : 4; - break; - case 0x14: // mask global,global - desc.regin[0] |= 1 << gsrc_code; - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= SR_CODE; - desc.length = (read_imm1(desc) & 0x8000) ? 6 : 4; - break; - case 0x15: // mask global,local - desc.regin[0] |= SR_CODE; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= SR_CODE; - desc.length = (read_imm1(desc) & 0x8000) ? 6 : 4; - break; - case 0x16: // mask local,global - desc.regin[0] |= SR_CODE; - desc.regin[0] |= 1 << gsrc_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= SR_CODE; - desc.length = (read_imm1(desc) & 0x8000) ? 6 : 4; - break; - case 0x17: // mask local,local - desc.regin[0] |= SR_CODE; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= SR_CODE; - desc.length = (read_imm1(desc) & 0x8000) ? 6 : 4; - break; - case 0x18: // sum global,global - case 0x1c: // sums global,global - desc.regin[0] |= 1 << gsrc_code; - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= SR_CODE; - desc.length = (read_imm1(desc) & 0x8000) ? 6 : 4; - if (op & 0x4 && gsrc_code != SR_REGISTER) desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; - break; - case 0x19: // sum global,local - case 0x1d: // sums global,local - desc.regin[0] |= SR_CODE; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= SR_CODE; - desc.length = (read_imm1(desc) & 0x8000) ? 6 : 4; - if (op & 0x4) desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; - break; - case 0x1a: // sum local,global - case 0x1e: // sums local,global - desc.regin[0] |= SR_CODE; - desc.regin[0] |= 1 << gsrc_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= SR_CODE; - desc.length = (read_imm1(desc) & 0x8000) ? 6 : 4; - if (op & 0x4 && gsrc_code != SR_REGISTER) desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; - break; - case 0x1b: // sum local,local - case 0x1f: // sums local,local - desc.regin[0] |= SR_CODE; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= SR_CODE; - desc.length = (read_imm1(desc) & 0x8000) ? 6 : 4; - if (op & 0x4) desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; - break; - case 0x20: // cmp global,global - case 0x30: // cmpb global,global - desc.regin[0] |= 1 << gsrc_code; - desc.regin[0] |= 1 << gdst_code; - desc.regout[0] |= SR_CODE; - break; - case 0x21: // cmp global,local - case 0x31: // cmpb global,local - desc.regin[0] |= SR_CODE; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regin[0] |= 1 << gdst_code; - desc.regout[0] |= SR_CODE; - break; - case 0x22: // cmp local,global - case 0x32: // cmpb local,global - desc.regin[0] |= SR_CODE; - desc.regin[0] |= 1 << gsrc_code; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= SR_CODE; - break; - case 0x23: // cmp local,local - case 0x33: // cmpb local,local - desc.regin[0] |= SR_CODE; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= SR_CODE; - break; - case 0x24: // mov global,global - desc.regin[0] |= SR_CODE; - desc.regin[0] |= 1 << gsrc_code; - desc.regin[0] |= 1 << (gsrc_code + 16); - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= SR_CODE; - desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; - break; - case 0x25: // mov global,local - desc.regin[0] |= SR_CODE; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= SR_CODE; - desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; - break; - case 0x26: // mov local,global - desc.regin[0] |= SR_CODE; - desc.regin[0] |= 1 << gsrc_code; - desc.regin[0] |= 1 << (gsrc_code + 16); - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= SR_CODE; - break; - case 0x27: // mov local,local - desc.regin[0] |= SR_CODE; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= SR_CODE; - break; - case 0x28: // add global,global - case 0x2c: // adds global,global - case 0x48: // sub global,global - case 0x4c: // subs global,global - desc.regin[0] |= 1 << gsrc_code; - desc.regin[0] |= 1 << gdst_code; - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= SR_CODE; - if (op & 0x04) desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; // adds, subs - break; - case 0x29: // add global,local - case 0x2d: // adds global,local - case 0x49: // sub global,local - case 0x4d: // subs global,local - desc.regin[0] |= SR_CODE; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regin[0] |= 1 << gdst_code; - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= SR_CODE; - if (op & 0x04) desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; // adds, subs - break; - case 0x2a: // add local,global - case 0x2e: // adds local,global - case 0x4a: // sub local,global - case 0x4e: // subs local,global - desc.regin[0] |= SR_CODE; - desc.regin[0] |= 1 << gsrc_code; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= SR_CODE; - if (op & 0x04) desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; // adds, subs - break; - case 0x2b: // add local,local - case 0x2f: // adds local,local - case 0x4b: // sub local,local - case 0x4f: // subs local,local - desc.regin[0] |= SR_CODE; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= SR_CODE; - if (op & 0x04) desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; // adds, subs - break; - case 0x34: // andn global,global - case 0x38: // or global,global - case 0x3c: // xor global,global - case 0x54: // and global,global - desc.regin[0] |= 1 << gsrc_code; - desc.regin[0] |= 1 << gdst_code; - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= SR_CODE; - break; - case 0x35: // andn global,local - case 0x39: // or global,local - case 0x3d: // xor global,local - case 0x55: // and global,local - desc.regin[0] |= SR_CODE; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regin[0] |= 1 << gdst_code; - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= SR_CODE; - break; - case 0x36: // andn local,global - case 0x3a: // or local,global - case 0x3e: // xor local,global - case 0x56: // and local,global - desc.regin[0] |= SR_CODE; - desc.regin[0] |= 1 << gsrc_code; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= SR_CODE; - break; - case 0x37: // andn local,local - case 0x3b: // or local,local - case 0x3f: // xor local,local - case 0x57: // and local,local - desc.regin[0] |= SR_CODE; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= SR_CODE; - break; - case 0x40: // subc global,global - case 0x50: // addc global,global - desc.regin[0] |= SR_CODE; - desc.regin[0] |= 1 << gsrc_code; - desc.regin[0] |= 1 << gdst_code; - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= SR_CODE; - break; - case 0x41: // subc global,local - case 0x51: // addc global,local - desc.regin[0] |= SR_CODE; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regin[0] |= 1 << gdst_code; - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= SR_CODE; - break; - case 0x42: // subc local,global - case 0x52: // addc local,global - desc.regin[0] |= SR_CODE; - desc.regin[0] |= 1 << gsrc_code; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= SR_CODE; - break; - case 0x43: // subc local,local - case 0x53: // addc local,local - desc.regin[0] |= SR_CODE; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= SR_CODE; - break; - case 0x44: // not global,global - case 0x58: // neg global,global - desc.regin[0] |= 1 << gsrc_code; - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= SR_CODE; - break; - case 0x45: // not global,local - case 0x59: // neg global,local - desc.regin[0] |= SR_CODE; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= SR_CODE; - break; - case 0x46: // not local,global - case 0x5a: // neg local,global - desc.regin[0] |= SR_CODE; - desc.regin[0] |= 1 << gsrc_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= SR_CODE; - break; - case 0x47: // not local,local - case 0x5b: // neg local,local - desc.regin[0] |= SR_CODE; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= SR_CODE; - break; - case 0x5c: // negs global,global - desc.regin[0] |= 1 << gsrc_code; - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= SR_CODE; - desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; - break; - case 0x5d: // negs global,local - desc.regin[0] |= SR_CODE; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= SR_CODE; - desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; - break; - case 0x5e: // negs local,global - desc.regin[0] |= SR_CODE; - desc.regin[0] |= 1 << gsrc_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= SR_CODE; - desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; - break; - case 0x5f: // negs local,local - desc.regin[0] |= SR_CODE; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= SR_CODE; - desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; - break; - case 0x60: // cmpi global,simm - case 0x70: // cmpbi global,simm - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= SR_CODE; - break; - case 0x61: // cmpi global,limm - case 0x71: // cmpbi global,limm - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= SR_CODE; - desc.length = imm_length(desc, op); - break; - case 0x62: // cmpi local,simm - case 0x72: // cmpbi local,simm - desc.regin[0] |= SR_CODE; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= SR_CODE; - break; - case 0x63: // cmpi local,limm - case 0x73: // cmpbi local,limm - desc.regin[0] |= SR_CODE; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= SR_CODE; - desc.length = imm_length(desc, op); - break; - case 0x64: // movi global,simm - desc.regin[0] |= SR_CODE; - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= 1 << (gdst_code + 16); - desc.regout[0] |= SR_CODE; - desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; - if (gdst_code == PC_REGISTER) - { - desc.targetpc = op & 0xf; - desc.flags |= OPFLAG_IS_UNCONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE; - } - break; - case 0x65: // movi global,limm - desc.regin[0] |= SR_CODE; - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= 1 << (gdst_code + 16); - desc.regout[0] |= SR_CODE; - desc.length = imm_length(desc, op); - desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; - if (gdst_code == PC_REGISTER) - { - desc.targetpc = read_limm(desc, op); - desc.flags |= OPFLAG_IS_UNCONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE; - } - break; - case 0x66: // movi local,simm - desc.regin[0] |= SR_CODE; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= SR_CODE; - break; - case 0x67: // movi local,limm - desc.regin[0] |= SR_CODE; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= SR_CODE; - desc.length = imm_length(desc, op); - break; - case 0x68: // addi global,simm - case 0x6c: // addsi global,simm - desc.regin[0] |= SR_CODE; - desc.regin[0] |= 1 << gdst_code; - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= SR_CODE; - if (op & 0x04) desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; // addsi - if (gdst_code == PC_REGISTER) - { - desc.targetpc = BRANCH_TARGET_DYNAMIC; - desc.flags |= OPFLAG_IS_UNCONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE; - } - break; - case 0x69: // addi global,limm - case 0x6d: // addsi global,limm - desc.regin[0] |= SR_CODE; - desc.regin[0] |= 1 << gdst_code; - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= SR_CODE; - desc.length = imm_length(desc, op); - if (op & 0x04) desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; // addsi - if (gdst_code == PC_REGISTER) - { - desc.targetpc = BRANCH_TARGET_DYNAMIC; - desc.flags |= OPFLAG_IS_UNCONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE; - } - break; - case 0x6a: // addi local,simm - case 0x6e: // addsi local,simm - desc.regin[0] |= SR_CODE; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= SR_CODE; - if (op & 0x04) desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; // addsi - break; - case 0x6b: // addi local,limm - case 0x6f: // addsi local,limm - desc.regin[0] |= SR_CODE; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= SR_CODE; - desc.length = imm_length(desc, op); - if (op & 0x04) desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; // addsi - break; - case 0x74: // andni global,simm - case 0x78: // ori global,simm - case 0x7c: // xori global,simm - desc.regin[0] |= SR_CODE; - desc.regin[0] |= 1 << gdst_code; - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= SR_CODE; - if (gdst_code == PC_REGISTER) - { - desc.targetpc = BRANCH_TARGET_DYNAMIC; - desc.flags |= OPFLAG_IS_UNCONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE; - } - break; - case 0x75: // andni global,limm - case 0x79: // ori global,limm - case 0x7d: // xori global,limm - desc.regin[0] |= SR_CODE; - desc.regin[0] |= 1 << gdst_code; - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= SR_CODE; - desc.length = imm_length(desc, op); - if (gdst_code == PC_REGISTER) - { - desc.targetpc = BRANCH_TARGET_DYNAMIC; - desc.flags |= OPFLAG_IS_UNCONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE; - } - break; - case 0x76: // andni local,simm - case 0x7a: // ori local,simm - case 0x7e: // xori local,simm - desc.regin[0] |= SR_CODE; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= SR_CODE; - break; - case 0x77: // andni local,limm - case 0x7b: // ori local,limm - case 0x7f: // xori local,limm - desc.regin[0] |= SR_CODE; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= SR_CODE; - desc.length = imm_length(desc, op); - break; - case 0x80: case 0x81: // shrdi - case 0x84: case 0x85: // sardi - case 0x88: case 0x89: // shldi - desc.regin[0] |= SR_CODE; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[ldstf_group] |= 1 << ldstf_code; - desc.regout[0] |= SR_CODE; - desc.cycles = m_cpu->m_clock_cycles_2; - break; - case 0x82: // shrd - case 0x86: // sard - case 0x8a: // shld - desc.regin[0] |= SR_CODE; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[ldstf_group] |= 1 << ldstf_code; - desc.regout[0] |= SR_CODE; - desc.cycles = m_cpu->m_clock_cycles_2; - break; - case 0x83: // shr - case 0x87: // sar - case 0x8b: // shl - case 0x8f: // rol - desc.regin[0] |= SR_CODE; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= SR_CODE; - break; - case 0x8c: case 0x8d: // reserved - return false; - case 0x8e: // testlz - desc.regin[0] |= SR_CODE; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regout[ldst_group] |= 1 << ldst_code; - break; - case 0x90: // ldxx1 global,global - { - const uint16_t imm1 = read_imm1(desc); - const uint32_t extra_s = read_ldstxx_imm(desc); - - desc.regin[0] |= 1 << gdst_code; - desc.regout[0] |= 1 << gsrc_code; - if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regout[0] |= 1 << gsrcf_code; - - desc.length = (imm1 & 0x8000) ? 6 : 4; - desc.flags |= OPFLAG_READS_MEMORY; - if (gdst_code == PC_REGISTER) - { - desc.targetpc = BRANCH_TARGET_DYNAMIC; - desc.flags |= OPFLAG_IS_UNCONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE; - } - break; - } - case 0x91: // ldxx1 global,local - { - const uint16_t imm1 = read_imm1(desc); - const uint32_t extra_s = read_ldstxx_imm(desc); - - desc.regin[0] |= SR_CODE; - desc.regin[0] |= 1 << gdst_code; - desc.regout[lsrc_group] |= 1 << lsrc_code; - if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regout[lsrcf_group] |= 1 << lsrcf_code; - - desc.length = (imm1 & 0x8000) ? 6 : 4; - desc.flags |= OPFLAG_READS_MEMORY; - if (gdst_code == PC_REGISTER) - { - desc.targetpc = BRANCH_TARGET_DYNAMIC; - desc.flags |= OPFLAG_IS_UNCONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE; - } - break; - } - case 0x92: // ldxx1 local,global - { - const uint16_t imm1 = read_imm1(desc); - const uint32_t extra_s = read_ldstxx_imm(desc); - - desc.regin[0] |= SR_CODE; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= 1 << gsrc_code; - if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regout[0] |= 1 << gsrcf_code; - - desc.length = (imm1 & 0x8000) ? 6 : 4; - desc.flags |= OPFLAG_READS_MEMORY; - break; - } - case 0x93: // ldxx1 local,local - { - const uint16_t imm1 = read_imm1(desc); - const uint32_t extra_s = read_ldstxx_imm(desc); - - desc.regin[0] |= SR_CODE; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regout[lsrc_group] |= 1 << lsrc_code; - if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regout[lsrcf_group] |= 1 << lsrcf_code; - - desc.length = (imm1 & 0x8000) ? 6 : 4; - desc.flags |= OPFLAG_READS_MEMORY; - break; - } - case 0x94: // ldxx2 global,global - { - const uint16_t imm1 = read_imm1(desc); - const uint32_t extra_s = read_ldstxx_imm(desc); - - desc.regin[0] |= 1 << gdst_code; - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= 1 << gsrc_code; - if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regout[0] |= 1 << gsrcf_code; - - desc.length = (imm1 & 0x8000) ? 6 : 4; - desc.flags |= OPFLAG_READS_MEMORY; - if (gdst_code == PC_REGISTER) - { - desc.targetpc = BRANCH_TARGET_DYNAMIC; - desc.flags |= OPFLAG_IS_UNCONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE; - } - break; - } - case 0x95: // ldxx2 global,local - { - const uint16_t imm1 = read_imm1(desc); - const uint32_t extra_s = read_ldstxx_imm(desc); - - desc.regin[0] |= SR_CODE; - desc.regin[0] |= 1 << gdst_code; - desc.regout[0] |= 1 << gdst_code; - desc.regout[lsrc_group] |= 1 << lsrc_code; - if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regout[lsrcf_group] |= 1 << lsrcf_code; - - desc.length = (imm1 & 0x8000) ? 6 : 4; - desc.flags |= OPFLAG_READS_MEMORY; - if (gdst_code == PC_REGISTER) - { - desc.targetpc = BRANCH_TARGET_DYNAMIC; - desc.flags |= OPFLAG_IS_UNCONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE; - } - break; - } - case 0x96: // ldxx2 local,global - { - const uint16_t imm1 = read_imm1(desc); - const uint32_t extra_s = read_ldstxx_imm(desc); - - desc.regin[0] |= SR_CODE; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= 1 << gsrc_code; - if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regout[0] |= 1 << gsrcf_code; - - desc.length = (imm1 & 0x8000) ? 6 : 4; - desc.flags |= OPFLAG_READS_MEMORY; - break; - } - case 0x97: // ldxx2 local,local - { - const uint16_t imm1 = read_imm1(desc); - const uint32_t extra_s = read_ldstxx_imm(desc); - - desc.regin[0] |= SR_CODE; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[lsrc_group] |= 1 << lsrc_code; - if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regout[lsrcf_group] |= 1 << lsrcf_code; - - desc.length = (imm1 & 0x8000) ? 6 : 4; - desc.flags |= OPFLAG_READS_MEMORY; - break; - } - case 0x98: // stxx1 global,global - { - const uint16_t imm1 = read_imm1(desc); - const uint32_t extra_s = read_ldstxx_imm(desc); - - desc.regin[0] |= 1 << gdst_code; - desc.regin[0] |= 1 << gsrc_code; - if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regin[0] |= 1 << gsrcf_code; - - desc.length = (imm1 & 0x8000) ? 6 : 4; - desc.flags |= OPFLAG_WRITES_MEMORY; - break; - } - case 0x99: // stxx1 global,local - { - const uint16_t imm1 = read_imm1(desc); - const uint32_t extra_s = read_ldstxx_imm(desc); - - desc.regin[0] |= SR_CODE; - desc.regin[0] |= 1 << gdst_code; - desc.regin[lsrc_group] |= 1 << lsrc_code; - if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regin[lsrcf_group] |= 1 << lsrcf_code; - - desc.length = (imm1 & 0x8000) ? 6 : 4; - desc.flags |= OPFLAG_WRITES_MEMORY; - break; - } - case 0x9a: // stxx1 local,global - { - const uint16_t imm1 = read_imm1(desc); - const uint32_t extra_s = read_ldstxx_imm(desc); - - desc.regin[0] |= SR_CODE; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regin[0] |= 1 << gsrc_code; - if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regin[0] |= 1 << gsrcf_code; - - desc.length = (imm1 & 0x8000) ? 6 : 4; - desc.flags |= OPFLAG_WRITES_MEMORY; - break; - } - case 0x9b: // stxx1 local,local - { - const uint16_t imm1 = read_imm1(desc); - const uint32_t extra_s = read_ldstxx_imm(desc); - - desc.regin[0] |= SR_CODE; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regin[lsrc_group] |= 1 << lsrc_code; - if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regin[lsrcf_group] |= 1 << lsrcf_code; - - desc.length = (imm1 & 0x8000) ? 6 : 4; - desc.flags |= OPFLAG_WRITES_MEMORY; - break; - } - case 0x9c: // stxx2 global,global - { - const uint16_t imm1 = read_imm1(desc); - const uint32_t extra_s = read_ldstxx_imm(desc); - - desc.regin[0] |= 1 << gdst_code; - desc.regin[0] |= 1 << gsrc_code; - if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regin[0] |= 1 << gsrcf_code; - desc.regout[0] |= 1 << gdst_code; - - desc.length = (imm1 & 0x8000) ? 6 : 4; - desc.flags |= OPFLAG_WRITES_MEMORY; - break; - } - case 0x9d: // stxx2 global,local - { - const uint16_t imm1 = read_imm1(desc); - const uint32_t extra_s = read_ldstxx_imm(desc); - - desc.regin[0] |= SR_CODE; - desc.regin[0] |= 1 << gdst_code; - desc.regin[lsrc_group] |= 1 << lsrc_code; - if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regin[lsrcf_group] |= 1 << lsrcf_code; - desc.regout[0] |= 1 << gdst_code; - - desc.length = (imm1 & 0x8000) ? 6 : 4; - desc.flags |= OPFLAG_WRITES_MEMORY; - break; - } - case 0x9e: // stxx2 local,global - { - const uint16_t imm1 = read_imm1(desc); - const uint32_t extra_s = read_ldstxx_imm(desc); - - desc.regin[0] |= SR_CODE; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regin[0] |= 1 << gsrc_code; - if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regin[0] |= 1 << gsrcf_code; - desc.regout[ldst_group] |= 1 << ldst_code; - - desc.length = (imm1 & 0x8000) ? 6 : 4; - desc.flags |= OPFLAG_WRITES_MEMORY; - break; - } - case 0x9f: // stxx2 local,local - { - const uint16_t imm1 = read_imm1(desc); - const uint32_t extra_s = read_ldstxx_imm(desc); - - desc.regin[0] |= SR_CODE; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regin[lsrc_group] |= 1 << lsrc_code; - if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regin[lsrcf_group] |= 1 << lsrcf_code; - desc.regout[ldst_group] |= 1 << ldst_code; - - desc.length = (imm1 & 0x8000) ? 6 : 4; - desc.flags |= OPFLAG_WRITES_MEMORY; - break; - } - case 0xa0: // shri global (lo n) - case 0xa1: // shri global (hi n) - case 0xa4: // sari global (lo n) - case 0xa5: // sari global (hi n) - case 0xa8: // shli global (lo n) - case 0xa9: // shli global (hi n) - desc.regin[0] |= 1 << gdst_code; - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= SR_CODE; - break; - case 0xa2: // shri local (lo n) - case 0xa3: // shri local (hi n) - case 0xa6: // sari local (lo n) - case 0xa7: // sari local (hi n) - case 0xaa: // shli local (lo n) - case 0xab: // shli local (hi n) - desc.regin[0] |= SR_CODE; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= SR_CODE; - break; - case 0xac: case 0xad: case 0xae: case 0xaf: // reserved - return false; - case 0xb0: // mulu global,global - case 0xb4: // muls global,global - desc.regin[0] |= 1 << gsrc_code; - desc.regin[0] |= 1 << gdst_code; - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= 1 << gdstf_code; - desc.regout[0] |= SR_CODE; - desc.cycles = m_cpu->m_clock_cycles_4; - break; - case 0xb1: // mulu global,local - case 0xb5: // muls global,local - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regin[0] |= 1 << gdst_code; - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= 1 << gdstf_code; - desc.regout[0] |= SR_CODE; - desc.cycles = m_cpu->m_clock_cycles_4; - break; - case 0xb2: // mulu local,global - case 0xb6: // muls local,global - desc.regin[0] |= 1 << gsrc_code; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[ldstf_group] |= 1 << ldstf_code; - desc.regout[0] |= SR_CODE; - desc.cycles = m_cpu->m_clock_cycles_4; - break; - case 0xb3: // mulu local,local - case 0xb7: // muls local,local - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[ldstf_group] |= 1 << ldstf_code; - desc.regout[0] |= SR_CODE; - desc.cycles = m_cpu->m_clock_cycles_4; - break; - case 0xb8: // set global (lo n) - case 0xb9: // set global (hi n) - desc.regin[0] |= SR_CODE; - desc.regout[0] |= 1 << gdst_code; - break; - case 0xba: // set local (lo n) - case 0xbb: // set local (hi n) - desc.regout[ldst_group] |= 1 << ldst_code; - break; - case 0xbc: // mul global,global - desc.regin[0] |= 1 << gsrc_code; - desc.regin[0] |= 1 << gdst_code; - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= SR_CODE; - desc.cycles = 3 << m_cpu->m_clck_scale; - break; - case 0xbd: // muls global,local - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regin[0] |= 1 << gdst_code; - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= SR_CODE; - desc.cycles = 3 << m_cpu->m_clck_scale; - break; - case 0xbe: // muls local,global - desc.regin[0] |= 1 << gsrc_code; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= SR_CODE; - desc.cycles = 3 << m_cpu->m_clck_scale; - break; - case 0xbf: // mulu local,local - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= SR_CODE; - desc.cycles = 3 << m_cpu->m_clck_scale; - break; - case 0xc0: case 0xc1: case 0xc2: case 0xc3: // software - case 0xc4: case 0xc5: case 0xc6: case 0xc7: // software - case 0xc8: case 0xc9: case 0xca: case 0xcb: // software - case 0xcc: case 0xcd: // software - { - desc.regin[0] |= SR_CODE; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regin[lsrcf_group] |= 1 << lsrcf_code; - - const uint32_t reg = FE_FP + FE_FL; - desc.regout[1 + (((reg + 0) & 0x20) >> 5)] |= 1 << ((reg + 0) & 0x1f); - desc.regout[1 + (((reg + 1) & 0x20) >> 5)] |= 1 << ((reg + 1) & 0x1f); - desc.regout[1 + (((reg + 2) & 0x20) >> 5)] |= 1 << ((reg + 2) & 0x1f); - desc.regout[1 + (((reg + 3) & 0x20) >> 5)] |= 1 << ((reg + 3) & 0x1f); - desc.regout[1 + (((reg + 4) & 0x20) >> 5)] |= 1 << ((reg + 4) & 0x1f); - - desc.regout[0] |= SR_CODE; - - desc.flags |= OPFLAG_IS_UNCONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE; - break; - } - case 0xce: // extend - 4 bytes - desc.regin[0] |= SR_CODE; - desc.regin[0] |= (3 << 14); // global regs 14, 15 - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= (3 << 14); // global regs 14, 15 - break; - case 0xcf: // do - return false; - case 0xd0: // ldwr global - case 0xd4: // ldwp global - desc.regin[0] |= SR_CODE; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= 1 << gsrc_code; - if (op & 0x04) desc.regout[ldst_group] |= 1 << ldst_code; - desc.flags |= OPFLAG_READS_MEMORY; - break; - case 0xd1: // ldwr local - case 0xd5: // ldwp local - desc.regin[0] |= SR_CODE; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regout[lsrc_group] |= 1 << lsrc_code; - if (op & 0x04) desc.regout[ldst_group] |= 1 << ldst_code; - desc.flags |= OPFLAG_READS_MEMORY; - break; - case 0xd2: // lddr global - case 0xd6: // lddp global - desc.regin[0] |= SR_CODE; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= 1 << gsrc_code; - desc.regout[0] |= 1 << gsrcf_code; - if (op & 0x04) desc.regout[ldst_group] |= 1 << ldst_code; - desc.flags |= OPFLAG_READS_MEMORY; - break; - case 0xd3: // lddr local - case 0xd7: // lddp local - desc.regin[0] |= SR_CODE; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regout[lsrc_group] |= 1 << lsrc_code; - desc.regout[lsrcf_group] |= 1 << lsrcf_code; - if (op & 0x04) desc.regout[ldst_group] |= 1 << ldst_code; - desc.flags |= OPFLAG_READS_MEMORY; - break; - case 0xd8: // stwr global - case 0xdc: // stwp global - desc.regin[0] |= SR_CODE; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regin[0] |= 1 << gsrc_code; - if (op & 0x04) desc.regout[ldst_group] |= 1 << ldst_code; - desc.flags |= OPFLAG_WRITES_MEMORY; - break; - case 0xd9: // stwr local - case 0xdd: // stwp local - desc.regin[0] |= SR_CODE; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regin[lsrc_group] |= 1 << lsrc_code; - if (op & 0x04) desc.regout[ldst_group] |= 1 << ldst_code; - desc.flags |= OPFLAG_WRITES_MEMORY; - break; - case 0xda: // stdr global - case 0xde: // stdp global - desc.regin[0] |= SR_CODE; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regin[0] |= 1 << gsrc_code; - desc.regin[0] |= 1 << gsrcf_code; - if (op & 0x04) desc.regout[ldst_group] |= 1 << ldst_code; - desc.flags |= OPFLAG_WRITES_MEMORY; - break; - case 0xdb: // stdr local - case 0xdf: // stdp local - desc.regin[0] |= SR_CODE; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regin[lsrcf_group] |= 1 << lsrcf_code; - if (op & 0x04) desc.regout[ldst_group] |= 1 << ldst_code; - desc.flags |= OPFLAG_WRITES_MEMORY; - break; - case 0xe0: case 0xe1: case 0xe2: case 0xe3: // dbv, dbnv, dbe, dbne - could be 4 bytes (pcrel) - case 0xe4: case 0xe5: case 0xe6: case 0xe7: // dbc, dbnc, dbse, dbht - could be 4 bytes (pcrel) - case 0xe8: case 0xe9: case 0xea: case 0xeb: // dbn, dbnn, dblt, dbgt - could be 4 bytes (pcrel) - desc.regin[0] |= SR_CODE; - desc.targetpc = BRANCH_TARGET_DYNAMIC; - desc.flags |= OPFLAG_IS_CONDITIONAL_BRANCH; - desc.delayslots = 1; - break; - case 0xec: // dbr - could be 4 bytes (pcrel) - desc.targetpc = BRANCH_TARGET_DYNAMIC; - desc.flags |= OPFLAG_IS_UNCONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE; - desc.delayslots = 1; - break; - case 0xed: // frame - desc.regin[0] |= SR_CODE; - desc.regin[1] = 0xffffffff; - desc.regin[2] = 0xffffffff; - desc.regout[0] |= SR_CODE; - desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION | OPFLAG_END_SEQUENCE; - break; - case 0xee: // call global - desc.regin[0] |= SR_CODE; - desc.regin[0] |= 1 << gsrc_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[ldstf_group] |= 1 << ldstf_code; - desc.targetpc = BRANCH_TARGET_DYNAMIC; - desc.flags |= OPFLAG_IS_UNCONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE; - break; - case 0xef: // call local - desc.regin[0] |= SR_CODE; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[ldstf_group] |= 1 << ldstf_code; - desc.targetpc = BRANCH_TARGET_DYNAMIC; - desc.flags |= OPFLAG_IS_UNCONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE; - break; - case 0xf0: case 0xf1: case 0xf2: case 0xf3: // bv, bnv, be, bne - case 0xf4: case 0xf5: case 0xf6: case 0xf7: // bc, bnc, bse, bht - case 0xf8: case 0xf9: case 0xfa: case 0xfb: // bn, bnn, blt, bgt - decode_pcrel(desc, op); - desc.regin[0] |= SR_CODE; - desc.targetpc = BRANCH_TARGET_DYNAMIC; - desc.flags |= OPFLAG_IS_CONDITIONAL_BRANCH; - break; - case 0xfc: // br - desc.targetpc = (desc.pc + 2) + decode_pcrel(desc, op); - desc.flags |= OPFLAG_IS_UNCONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE; - break; - case 0xfd: case 0xfe: case 0xff: // trap - desc.regin[0] |= SR_CODE; - desc.targetpc = BRANCH_TARGET_DYNAMIC; - desc.flags |= OPFLAG_IS_CONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE | OPFLAG_CAN_CAUSE_EXCEPTION; - break; - } - return true; -} diff --git a/src/devices/cpu/e132xs/e132xsfe.h b/src/devices/cpu/e132xs/e132xsfe.h deleted file mode 100644 index 7463fd964d0..00000000000 --- a/src/devices/cpu/e132xs/e132xsfe.h +++ /dev/null @@ -1,34 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Ryan Holtz -#ifndef MAME_CPU_E132XS_E132XSFE_H -#define MAME_CPU_E132XS_E132XSFE_H - -#pragma once - -#include "e132xs.h" -#include "cpu/drcfe.h" - -class e132xs_frontend : public drc_frontend -{ -public: - e132xs_frontend(hyperstone_device *e132xs, uint32_t window_start, uint32_t window_end, uint32_t max_sequence); - void flush(); - -protected: - // required overrides - virtual bool describe(opcode_desc &desc, const opcode_desc *prev) override; - -private: - inline uint32_t imm_length(opcode_desc &desc, uint16_t op); - inline uint16_t read_word(opcode_desc &desc); - inline uint16_t read_imm1(opcode_desc &desc); - inline uint16_t read_imm2(opcode_desc &desc); - inline uint32_t read_ldstxx_imm(opcode_desc &desc); - inline uint32_t read_limm(opcode_desc &desc, uint16_t op); - inline int32_t decode_pcrel(opcode_desc &desc, uint16_t op); - inline int32_t decode_call(opcode_desc &desc); - - hyperstone_device *m_cpu; -}; - -#endif /* MAME_CPU_E132XS_E132XSFE_H */ -- cgit v1.2.3-70-g09d2