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 */