diff --git a/CMakeLists.txt b/CMakeLists.txt index 2ddfc9c5..d2669375 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -103,40 +103,41 @@ add_custom_target(format ${CLANG_FORMAT_EXECUTABLE} -style=Google -i ${CLANG_FOR #-------------------------------------------------- set(DREAVM_SOURCES - src/aica/aica.cc src/core/assert.cc src/core/filesystem.cc src/core/log.cc - src/cpu/backend/interpreter/interpreter_backend.cc - src/cpu/backend/interpreter/interpreter_block.cc - src/cpu/backend/interpreter/interpreter_callbacks.cc - src/cpu/backend/x64/x64_backend.cc - src/cpu/backend/x64/x64_block.cc - src/cpu/backend/x64/x64_emitter.cc - src/cpu/frontend/sh4/sh4_builder.cc - src/cpu/frontend/sh4/sh4_emit.cc - src/cpu/frontend/sh4/sh4_frontend.cc - src/cpu/frontend/sh4/sh4_instr.cc - src/cpu/ir/ir_builder.cc - src/cpu/ir/passes/constant_propagation_pass.cc - src/cpu/ir/passes/context_promotion_pass.cc - src/cpu/ir/passes/control_flow_analysis_pass.cc - src/cpu/ir/passes/pass_runner.cc - src/cpu/ir/passes/register_allocation_pass.cc - src/cpu/ir/passes/validate_pass.cc - src/cpu/sh4.cc - src/cpu/runtime.cc - src/emu/disc.cc src/emu/dreamcast.cc src/emu/profiler.cc - src/emu/scheduler.cc - src/gdrom/gdrom.cc - src/holly/holly.cc - src/holly/maple.cc - src/holly/maple_controller.cc - src/holly/pvr2.cc - src/holly/tile_accelerator.cc - src/holly/tile_renderer.cc + src/hw/aica/aica.cc + src/hw/gdrom/disc.cc + src/hw/gdrom/gdrom.cc + src/hw/holly/holly.cc + src/hw/holly/pvr2.cc + src/hw/holly/tile_accelerator.cc + src/hw/holly/tile_renderer.cc + src/hw/maple/maple.cc + src/hw/maple/maple_controller.cc + src/hw/sh4/sh4.cc + src/hw/scheduler.cc + src/jit/backend/interpreter/interpreter_backend.cc + src/jit/backend/interpreter/interpreter_block.cc + src/jit/backend/interpreter/interpreter_callbacks.cc + src/jit/backend/x64/x64_backend.cc + src/jit/backend/x64/x64_block.cc + src/jit/backend/x64/x64_emitter.cc + src/jit/frontend/sh4/sh4_builder.cc + src/jit/frontend/sh4/sh4_context.cc + src/jit/frontend/sh4/sh4_emit.cc + src/jit/frontend/sh4/sh4_frontend.cc + src/jit/frontend/sh4/sh4_instr.cc + src/jit/ir/ir_builder.cc + src/jit/ir/passes/constant_propagation_pass.cc + src/jit/ir/passes/context_promotion_pass.cc + src/jit/ir/passes/control_flow_analysis_pass.cc + src/jit/ir/passes/pass_runner.cc + src/jit/ir/passes/register_allocation_pass.cc + src/jit/ir/passes/validate_pass.cc + src/jit/runtime.cc src/renderer/gl_backend.cc src/renderer/gl_shader.cc src/system/keys.cc diff --git a/src/core/platform.h b/src/core/platform.h index 0b611db3..cc6dc511 100644 --- a/src/core/platform.h +++ b/src/core/platform.h @@ -11,14 +11,4 @@ #error "Unsupported platform" #endif -#if defined(__GNUC__) -#define COMPILER_GCC -#elif defined(__clang__) -#define COMPILER_CLANG -#elif defined(_MSC_VER) -#define COMPILER_MSVC -#else -#error "Unsupported compiler" -#endif - #endif diff --git a/src/emu/dreamcast.cc b/src/emu/dreamcast.cc index 4cfa5507..e9679db5 100644 --- a/src/emu/dreamcast.cc +++ b/src/emu/dreamcast.cc @@ -1,21 +1,24 @@ #include "core/core.h" -#include "cpu/backend/interpreter/interpreter_backend.h" -#include "cpu/backend/x64/x64_backend.h" -#include "cpu/frontend/sh4/sh4_frontend.h" +#include "jit/backend/interpreter/interpreter_backend.h" +#include "jit/backend/x64/x64_backend.h" +#include "jit/frontend/sh4/sh4_frontend.h" #include "emu/dreamcast.h" #include "emu/profiler.h" -#include "holly/maple_controller.h" +#include "hw/maple/maple_controller.h" #include "renderer/gl_backend.h" -using namespace dreavm::aica; using namespace dreavm::core; -using namespace dreavm::cpu; -using namespace dreavm::cpu::backend::interpreter; -using namespace dreavm::cpu::backend::x64; -using namespace dreavm::cpu::frontend::sh4; using namespace dreavm::emu; -using namespace dreavm::gdrom; -using namespace dreavm::holly; +using namespace dreavm::hw; +using namespace dreavm::hw::aica; +using namespace dreavm::hw::gdrom; +using namespace dreavm::hw::holly; +using namespace dreavm::hw::maple; +using namespace dreavm::hw::sh4; +using namespace dreavm::jit; +using namespace dreavm::jit::backend::interpreter; +using namespace dreavm::jit::backend::x64; +using namespace dreavm::jit::frontend::sh4; using namespace dreavm::renderer; using namespace dreavm::system; using namespace dreavm::trace; @@ -32,7 +35,7 @@ Dreamcast::Dreamcast() { rt_backend_ = std::unique_ptr(new X64Backend(*memory())); runtime_ = std::unique_ptr( new Runtime(*memory(), *rt_frontend_.get(), *rt_backend_.get())); - cpu_ = std::unique_ptr(new SH4(*memory(), *runtime())); + sh4_ = std::unique_ptr(new SH4(*memory(), *runtime())); aica_ = std::unique_ptr(new AICA(this)); holly_ = std::unique_ptr(new Holly(this)); pvr_ = std::unique_ptr(new PVR2(this)); @@ -103,7 +106,7 @@ bool Dreamcast::Init() { InitMemory(); InitRegisters(); - cpu_->Init(); + sh4_->Init(); aica_->Init(); holly_->Init(); pvr_->Init(); @@ -111,7 +114,7 @@ bool Dreamcast::Init() { gdrom_->Init(); maple_->Init(); - scheduler_->AddDevice(cpu()); + scheduler_->AddDevice(sh4()); scheduler_->AddDevice(aica()); return true; @@ -235,43 +238,43 @@ void Dreamcast::InitMemory() { // cpu memory_->Handle(SH4_REG_START, SH4_REG_END, MIRROR_MASK, - std::bind(&SH4::ReadRegister8, cpu(), _1), // - std::bind(&SH4::ReadRegister16, cpu(), _1), // - std::bind(&SH4::ReadRegister32, cpu(), _1), // + std::bind(&SH4::ReadRegister8, sh4(), _1), // + std::bind(&SH4::ReadRegister16, sh4(), _1), // + std::bind(&SH4::ReadRegister32, sh4(), _1), // nullptr, // - std::bind(&SH4::WriteRegister8, cpu(), _1, _2), // - std::bind(&SH4::WriteRegister16, cpu(), _1, _2), // - std::bind(&SH4::WriteRegister32, cpu(), _1, _2), // + std::bind(&SH4::WriteRegister8, sh4(), _1, _2), // + std::bind(&SH4::WriteRegister16, sh4(), _1, _2), // + std::bind(&SH4::WriteRegister32, sh4(), _1, _2), // nullptr); memory_->Handle(SH4_CACHE_START, SH4_CACHE_END, 0x0, - std::bind(&SH4::ReadCache8, cpu(), _1), // - std::bind(&SH4::ReadCache16, cpu(), _1), // - std::bind(&SH4::ReadCache32, cpu(), _1), // - std::bind(&SH4::ReadCache64, cpu(), _1), // - std::bind(&SH4::WriteCache8, cpu(), _1, _2), // - std::bind(&SH4::WriteCache16, cpu(), _1, _2), // - std::bind(&SH4::WriteCache32, cpu(), _1, _2), // - std::bind(&SH4::WriteCache64, cpu(), _1, _2)); + std::bind(&SH4::ReadCache8, sh4(), _1), // + std::bind(&SH4::ReadCache16, sh4(), _1), // + std::bind(&SH4::ReadCache32, sh4(), _1), // + std::bind(&SH4::ReadCache64, sh4(), _1), // + std::bind(&SH4::WriteCache8, sh4(), _1, _2), // + std::bind(&SH4::WriteCache16, sh4(), _1, _2), // + std::bind(&SH4::WriteCache32, sh4(), _1, _2), // + std::bind(&SH4::WriteCache64, sh4(), _1, _2)); memory_->Handle(SH4_SQ_START, SH4_SQ_END, 0x0, - std::bind(&SH4::ReadSQ8, cpu(), _1), // - std::bind(&SH4::ReadSQ16, cpu(), _1), // - std::bind(&SH4::ReadSQ32, cpu(), _1), // + std::bind(&SH4::ReadSQ8, sh4(), _1), // + std::bind(&SH4::ReadSQ16, sh4(), _1), // + std::bind(&SH4::ReadSQ32, sh4(), _1), // nullptr, // - std::bind(&SH4::WriteSQ8, cpu(), _1, _2), // - std::bind(&SH4::WriteSQ16, cpu(), _1, _2), // - std::bind(&SH4::WriteSQ32, cpu(), _1, _2), // + std::bind(&SH4::WriteSQ8, sh4(), _1, _2), // + std::bind(&SH4::WriteSQ16, sh4(), _1, _2), // + std::bind(&SH4::WriteSQ32, sh4(), _1, _2), // nullptr); } void Dreamcast::InitRegisters() { #define HOLLY_REG(addr, name, flags, default, type) \ holly_regs_[name##_OFFSET] = {flags, default}; -#include "holly/holly_regs.inc" +#include "hw/holly/holly_regs.inc" #undef HOLLY_REG #define PVR_REG(addr, name, flags, default, type) \ pvr_regs_[name##_OFFSET] = {flags, default}; -#include "holly/pvr2_regs.inc" +#include "hw/holly/pvr2_regs.inc" #undef PVR_REG } @@ -355,7 +358,7 @@ bool Dreamcast::LaunchBIN(const char *path) { memory_->Memcpy(0x0c010000, data, size); free(data); - cpu_->SetPC(0x0c010000); + sh4_->SetPC(0x0c010000); return true; } @@ -368,7 +371,7 @@ bool Dreamcast::LaunchGDI(const char *path) { } gdrom_->SetDisc(std::move(gdi)); - cpu_->SetPC(0xa0000000); + sh4_->SetPC(0xa0000000); return true; } diff --git a/src/emu/dreamcast.h b/src/emu/dreamcast.h index 060553c6..7f247379 100644 --- a/src/emu/dreamcast.h +++ b/src/emu/dreamcast.h @@ -2,18 +2,18 @@ #define DREAMCAST_H #include -#include "aica/aica.h" -#include "cpu/backend/backend.h" -#include "cpu/frontend/frontend.h" -#include "cpu/runtime.h" -#include "cpu/sh4.h" -#include "emu/memory.h" -#include "emu/scheduler.h" -#include "gdrom/gdrom.h" -#include "holly/holly.h" -#include "holly/maple.h" -#include "holly/pvr2.h" -#include "holly/tile_accelerator.h" +#include "hw/aica/aica.h" +#include "hw/sh4/sh4.h" +#include "hw/gdrom/gdrom.h" +#include "hw/holly/holly.h" +#include "hw/holly/pvr2.h" +#include "hw/holly/tile_accelerator.h" +#include "hw/maple/maple.h" +#include "hw/memory.h" +#include "hw/scheduler.h" +#include "jit/backend/backend.h" +#include "jit/frontend/frontend.h" +#include "jit/runtime.h" #include "renderer/backend.h" #include "system/system.h" #include "trace/trace.h" @@ -29,7 +29,7 @@ namespace emu { enum { // ignore all access modifier bits - MIRROR_MASK = ~cpu::ADDR_MASK, + MIRROR_MASK = ~hw::sh4::ADDR_MASK, // main ram is mirrored an additional four times: // 0x0c000000 - 0x0cffffff @@ -81,33 +81,33 @@ struct Register { enum { #define AICA_REG(addr, name, flags, default, type) \ name##_OFFSET = addr - emu::AICA_REG_START, -#include "aica/aica_regs.inc" +#include "hw/aica/aica_regs.inc" #undef AICA_REG #define HOLLY_REG(addr, name, flags, default, type) \ name##_OFFSET = (addr - emu::HOLLY_REG_START) >> 2, -#include "holly/holly_regs.inc" +#include "hw/holly/holly_regs.inc" #undef HOLLY_REG #define PVR_REG(addr, name, flags, default_value, type) \ name##_OFFSET = (addr - emu::PVR_REG_START) >> 2, -#include "holly/pvr2_regs.inc" +#include "hw/holly/pvr2_regs.inc" #undef PVR_REG }; class Dreamcast { public: - emu::Scheduler *scheduler() { return scheduler_.get(); } - emu::Memory *memory() { return memory_.get(); } + hw::Memory *memory() { return memory_.get(); } + hw::Scheduler *scheduler() { return scheduler_.get(); } renderer::Backend *rb() { return rb_.get(); } - cpu::Runtime *runtime() { return runtime_.get(); } - cpu::SH4 *cpu() { return cpu_.get(); } - aica::AICA *aica() { return aica_.get(); } - holly::Holly *holly() { return holly_.get(); } - holly::PVR2 *pvr() { return pvr_.get(); } - holly::TileAccelerator *ta() { return ta_.get(); } - gdrom::GDROM *gdrom() { return gdrom_.get(); } - holly::Maple *maple() { return maple_.get(); } + jit::Runtime *runtime() { return runtime_.get(); } + hw::aica::AICA *aica() { return aica_.get(); } + hw::gdrom::GDROM *gdrom() { return gdrom_.get(); } + hw::holly::Holly *holly() { return holly_.get(); } + hw::holly::PVR2 *pvr() { return pvr_.get(); } + hw::holly::TileAccelerator *ta() { return ta_.get(); } + hw::maple::Maple *maple() { return maple_.get(); } + hw::sh4::SH4 *sh4() { return sh4_.get(); } trace::TraceWriter *trace_writer() { return trace_writer_.get(); } uint8_t *aica_regs() { return aica_regs_; } @@ -124,12 +124,12 @@ class Dreamcast { #define HOLLY_REG(offset, name, flags, default, type) \ type &name{reinterpret_cast(holly_regs_[name##_OFFSET].value)}; -#include "holly/holly_regs.inc" +#include "hw/holly/holly_regs.inc" #undef HOLLY_REG #define PVR_REG(offset, name, flags, default, type) \ type &name{reinterpret_cast(pvr_regs_[name##_OFFSET].value)}; -#include "holly/pvr2_regs.inc" +#include "hw/holly/pvr2_regs.inc" #undef PVR_REG private: @@ -147,19 +147,19 @@ class Dreamcast { void RenderFrame(); system::System sys_; - std::unique_ptr scheduler_; - std::unique_ptr memory_; + std::unique_ptr memory_; + std::unique_ptr scheduler_; std::unique_ptr rb_; - std::unique_ptr rt_frontend_; - std::unique_ptr rt_backend_; - std::unique_ptr runtime_; - std::unique_ptr cpu_; - std::unique_ptr aica_; - std::unique_ptr holly_; - std::unique_ptr pvr_; - std::unique_ptr ta_; - std::unique_ptr gdrom_; - std::unique_ptr maple_; + std::unique_ptr rt_frontend_; + std::unique_ptr rt_backend_; + std::unique_ptr runtime_; + std::unique_ptr aica_; + std::unique_ptr gdrom_; + std::unique_ptr holly_; + std::unique_ptr pvr_; + std::unique_ptr ta_; + std::unique_ptr maple_; + std::unique_ptr sh4_; std::unique_ptr trace_writer_; Register holly_regs_[HOLLY_REG_SIZE >> 2]; diff --git a/src/aica/aica.cc b/src/hw/aica/aica.cc similarity index 93% rename from src/aica/aica.cc rename to src/hw/aica/aica.cc index 48bf2596..f8b42138 100644 --- a/src/aica/aica.cc +++ b/src/hw/aica/aica.cc @@ -1,9 +1,9 @@ -#include "aica/aica.h" #include "emu/dreamcast.h" +#include "hw/aica/aica.h" -using namespace dreavm::aica; using namespace dreavm::emu; -using namespace dreavm::holly; +using namespace dreavm::hw::aica; +using namespace dreavm::hw::holly; AICA::AICA(Dreamcast *dc) : dc_(dc) {} diff --git a/src/aica/aica.h b/src/hw/aica/aica.h similarity index 88% rename from src/aica/aica.h rename to src/hw/aica/aica.h index 34224a5e..a203f5ce 100644 --- a/src/aica/aica.h +++ b/src/hw/aica/aica.h @@ -2,16 +2,17 @@ #define AICA_H #include -#include "emu/device.h" +#include "hw/device.h" namespace dreavm { namespace emu { class Dreamcast; } +namespace hw { namespace aica { -class AICA : public emu::Device { +class AICA : public hw::Device { public: AICA(emu::Dreamcast *dc); @@ -33,5 +34,6 @@ class AICA : public emu::Device { }; } } +} #endif diff --git a/src/aica/aica_regs.inc b/src/hw/aica/aica_regs.inc similarity index 100% rename from src/aica/aica_regs.inc rename to src/hw/aica/aica_regs.inc diff --git a/src/emu/device.h b/src/hw/device.h similarity index 93% rename from src/emu/device.h rename to src/hw/device.h index c0e02104..3e6a9aae 100644 --- a/src/emu/device.h +++ b/src/hw/device.h @@ -4,7 +4,7 @@ #include namespace dreavm { -namespace emu { +namespace hw { class Device { public: diff --git a/src/emu/disc.cc b/src/hw/gdrom/disc.cc similarity index 97% rename from src/emu/disc.cc rename to src/hw/gdrom/disc.cc index 9695b11d..e4411641 100644 --- a/src/emu/disc.cc +++ b/src/hw/gdrom/disc.cc @@ -1,10 +1,10 @@ #include "core/core.h" -#include "emu/disc.h" +#include "hw/gdrom/disc.h" #define PREGAP_SIZE 150 using namespace dreavm::core; -using namespace dreavm::emu; +using namespace dreavm::hw::gdrom; // // GDI format diff --git a/src/emu/disc.h b/src/hw/gdrom/disc.h similarity index 96% rename from src/emu/disc.h rename to src/hw/gdrom/disc.h index 9eadac86..c6e1f806 100644 --- a/src/emu/disc.h +++ b/src/hw/gdrom/disc.h @@ -5,7 +5,8 @@ #include "core/filesystem.h" namespace dreavm { -namespace emu { +namespace hw { +namespace gdrom { enum { SECTOR_SIZE = 2352 }; @@ -53,5 +54,6 @@ class GDI : public Disc { }; } } +} #endif diff --git a/src/gdrom/gdrom.cc b/src/hw/gdrom/gdrom.cc similarity index 99% rename from src/gdrom/gdrom.cc rename to src/hw/gdrom/gdrom.cc index 881fe63e..c19b3c5c 100644 --- a/src/gdrom/gdrom.cc +++ b/src/hw/gdrom/gdrom.cc @@ -1,12 +1,12 @@ #include "core/core.h" #include "emu/dreamcast.h" -#include "gdrom/gdrom_replies.inc" +#include "hw/gdrom/gdrom_replies.inc" using namespace dreavm::core; -using namespace dreavm::cpu; using namespace dreavm::emu; -using namespace dreavm::gdrom; -using namespace dreavm::holly; +using namespace dreavm::hw::gdrom; +using namespace dreavm::hw::holly; +using namespace dreavm::hw::sh4; #define SWAP_24(fad) \ (((fad & 0xff) << 16) | (fad & 0x00ff00) | ((fad & 0xff0000) >> 16)) diff --git a/src/gdrom/gdrom.h b/src/hw/gdrom/gdrom.h similarity index 97% rename from src/gdrom/gdrom.h rename to src/hw/gdrom/gdrom.h index f6b47a63..32dc86ef 100644 --- a/src/gdrom/gdrom.h +++ b/src/hw/gdrom/gdrom.h @@ -2,19 +2,21 @@ #define GDROM_H #include -#include "emu/disc.h" +#include "hw/gdrom/disc.h" namespace dreavm { namespace emu { class Dreamcast; -class Memory; struct Register; } +namespace hw { namespace holly { class Holly; } +class Memory; + namespace gdrom { enum GDState { // @@ -210,7 +212,7 @@ class GDROM { void Init(); - void SetDisc(std::unique_ptr disc); + void SetDisc(std::unique_ptr disc); uint8_t ReadRegister8(uint32_t addr); uint16_t ReadRegister16(uint32_t addr); @@ -233,8 +235,8 @@ class GDROM { uint8_t *dst); emu::Dreamcast *dc_; - emu::Memory *memory_; - holly::Holly *holly_; + hw::Memory *memory_; + hw::holly::Holly *holly_; emu::Register *holly_regs_; GD_FEATURES_T features_; @@ -251,9 +253,10 @@ class GDROM { GDState state_; int spi_read_offset_; - std::unique_ptr current_disc_; + std::unique_ptr current_disc_; }; } } +} #endif diff --git a/src/gdrom/gdrom_replies.inc b/src/hw/gdrom/gdrom_replies.inc similarity index 100% rename from src/gdrom/gdrom_replies.inc rename to src/hw/gdrom/gdrom_replies.inc diff --git a/src/holly/holly.cc b/src/hw/holly/holly.cc similarity index 91% rename from src/holly/holly.cc rename to src/hw/holly/holly.cc index 69bccf6f..163283b2 100644 --- a/src/holly/holly.cc +++ b/src/hw/holly/holly.cc @@ -2,16 +2,16 @@ #include "emu/dreamcast.h" using namespace dreavm::core; -using namespace dreavm::cpu; using namespace dreavm::emu; -using namespace dreavm::holly; +using namespace dreavm::hw::holly; +using namespace dreavm::hw::sh4; using namespace dreavm::renderer; using namespace dreavm::system; Holly::Holly(Dreamcast *dc) : dc_(dc) {} void Holly::Init() { - cpu_ = dc_->cpu(); + sh4_ = dc_->sh4(); holly_regs_ = dc_->holly_regs(); } @@ -163,7 +163,7 @@ void Holly::WriteRegister32(uint32_t addr, uint32_t value) { // FIXME what are SB_LMMODE0 / SB_LMMODE1 void Holly::CH2DMATransfer() { - cpu_->DDT(2, DDT_W, dc_->SB_C2DSTAT); + sh4_->DDT(2, DDT_W, dc_->SB_C2DSTAT); dc_->SB_C2DLEN = 0; dc_->SB_C2DST = 0; @@ -182,9 +182,9 @@ void Holly::ForwardRequestInterrupts() { if ((dc_->SB_ISTNRM & dc_->SB_IML6NRM) || (dc_->SB_ISTERR & dc_->SB_IML6ERR) || (dc_->SB_ISTEXT & dc_->SB_IML6EXT)) { - cpu_->RequestInterrupt(SH4_INTC_IRL_9); + sh4_->RequestInterrupt(SH4_INTC_IRL_9); } else { - cpu_->UnrequestInterrupt(SH4_INTC_IRL_9); + sh4_->UnrequestInterrupt(SH4_INTC_IRL_9); } } @@ -192,9 +192,9 @@ void Holly::ForwardRequestInterrupts() { if ((dc_->SB_ISTNRM & dc_->SB_IML4NRM) || (dc_->SB_ISTERR & dc_->SB_IML4ERR) || (dc_->SB_ISTEXT & dc_->SB_IML4EXT)) { - cpu_->RequestInterrupt(SH4_INTC_IRL_11); + sh4_->RequestInterrupt(SH4_INTC_IRL_11); } else { - cpu_->UnrequestInterrupt(SH4_INTC_IRL_11); + sh4_->UnrequestInterrupt(SH4_INTC_IRL_11); } } @@ -202,9 +202,9 @@ void Holly::ForwardRequestInterrupts() { if ((dc_->SB_ISTNRM & dc_->SB_IML2NRM) || (dc_->SB_ISTERR & dc_->SB_IML2ERR) || (dc_->SB_ISTEXT & dc_->SB_IML2EXT)) { - cpu_->RequestInterrupt(SH4_INTC_IRL_13); + sh4_->RequestInterrupt(SH4_INTC_IRL_13); } else { - cpu_->UnrequestInterrupt(SH4_INTC_IRL_13); + sh4_->UnrequestInterrupt(SH4_INTC_IRL_13); } } } diff --git a/src/holly/holly.h b/src/hw/holly/holly.h similarity index 98% rename from src/holly/holly.h rename to src/hw/holly/holly.h index b799a0b7..e43cf133 100644 --- a/src/holly/holly.h +++ b/src/hw/holly/holly.h @@ -4,14 +4,16 @@ #include namespace dreavm { -namespace cpu { -class SH4; -} namespace emu { class Dreamcast; struct Register; } +namespace hw { +namespace sh4 { +class SH4; +} + namespace holly { // interrupts @@ -167,10 +169,11 @@ class Holly { void ForwardRequestInterrupts(); emu::Dreamcast *dc_; - cpu::SH4 *cpu_; emu::Register *holly_regs_; + hw::sh4::SH4 *sh4_; }; } } +} #endif diff --git a/src/holly/holly_regs.inc b/src/hw/holly/holly_regs.inc similarity index 100% rename from src/holly/holly_regs.inc rename to src/hw/holly/holly_regs.inc diff --git a/src/holly/pixel_convert.h b/src/hw/holly/pixel_convert.h similarity index 99% rename from src/holly/pixel_convert.h rename to src/hw/holly/pixel_convert.h index a9893842..8c7e9b4c 100644 --- a/src/holly/pixel_convert.h +++ b/src/hw/holly/pixel_convert.h @@ -18,6 +18,7 @@ (x / min + y / min) * min * min) namespace dreavm { +namespace hw { namespace holly { class ARGB1555 { @@ -242,5 +243,6 @@ class PixelConvert { }; } } +} #endif diff --git a/src/holly/pvr2.cc b/src/hw/holly/pvr2.cc similarity index 98% rename from src/holly/pvr2.cc rename to src/hw/holly/pvr2.cc index 04d0be12..88803151 100644 --- a/src/holly/pvr2.cc +++ b/src/hw/holly/pvr2.cc @@ -1,9 +1,9 @@ #include "core/core.h" #include "emu/dreamcast.h" -using namespace dreavm::cpu; using namespace dreavm::emu; -using namespace dreavm::holly; +using namespace dreavm::hw::holly; +using namespace dreavm::hw::sh4; using namespace dreavm::renderer; PVR2::PVR2(Dreamcast *dc) diff --git a/src/holly/pvr2.h b/src/hw/holly/pvr2.h similarity index 95% rename from src/holly/pvr2.h rename to src/hw/holly/pvr2.h index bf9e23cf..1bfa72a5 100644 --- a/src/holly/pvr2.h +++ b/src/hw/holly/pvr2.h @@ -1,14 +1,15 @@ #ifndef PVR_CLX2_H #define PVR_CLX2_H -#include "emu/scheduler.h" +#include +#include "hw/scheduler.h" namespace dreavm { namespace emu { class Dreamcast; -class Scheduler; } +namespace hw { namespace holly { class Holly; @@ -218,13 +219,13 @@ class PVR2 { void LineClockUpdate(); emu::Dreamcast *dc_; - emu::Scheduler *scheduler_; - holly::Holly *holly_; - holly::TileAccelerator *ta_; + hw::Scheduler *scheduler_; + hw::holly::Holly *holly_; + hw::holly::TileAccelerator *ta_; emu::Register *pvr_regs_; uint8_t *video_ram_; - emu::TimerHandle line_timer_; + hw::TimerHandle line_timer_; uint32_t current_scanline_; std::chrono::high_resolution_clock::time_point last_frame_; float fps_; @@ -233,5 +234,6 @@ class PVR2 { }; } } +} #endif diff --git a/src/holly/pvr2_regs.inc b/src/hw/holly/pvr2_regs.inc similarity index 72% rename from src/holly/pvr2_regs.inc rename to src/hw/holly/pvr2_regs.inc index e829373c..640565d0 100644 --- a/src/holly/pvr2_regs.inc +++ b/src/hw/holly/pvr2_regs.inc @@ -3,12 +3,12 @@ PVR_REG(0x005f8004, REVISION, R, 0x00000011, uint32_t) PVR_REG(0x005f8008, SOFTRESET, RW, 0x00000007, uint32_t) PVR_REG(0x005f8014, STARTRENDER, RW, 0x00000000, uint32_t) PVR_REG(0x005f8018, TEST_SELECT, RW, 0x00000000, uint32_t) -PVR_REG(0x005f8020, PARAM_BASE, RW, 0x00000000, holly::PARAM_BASE_T) +PVR_REG(0x005f8020, PARAM_BASE, RW, 0x00000000, hw::holly::PARAM_BASE_T) PVR_REG(0x005f802c, REGION_BASE, RW, 0x00000000, uint32_t) PVR_REG(0x005f8030, SPAN_SORT_CFG, RW, 0x00000000, uint32_t) PVR_REG(0x005f8040, VO_BORDER_COL, RW, 0x00000000, uint32_t) -PVR_REG(0x005f8044, FB_R_CTRL, RW, 0x00000000, holly::FB_R_CTRL_T) -PVR_REG(0x005f8048, FB_W_CTRL, RW, 0x00000000, holly::FB_W_CTRL_T) +PVR_REG(0x005f8044, FB_R_CTRL, RW, 0x00000000, hw::holly::FB_R_CTRL_T) +PVR_REG(0x005f8048, FB_W_CTRL, RW, 0x00000000, hw::holly::FB_W_CTRL_T) PVR_REG(0x005f804c, FB_W_LINESTRIDE, RW, 0x00000000, uint32_t) PVR_REG(0x005f8050, FB_R_SOF1, RW, 0x00000000, uint32_t) PVR_REG(0x005f8054, FB_R_SOF2, RW, 0x00000000, uint32_t) @@ -17,14 +17,14 @@ PVR_REG(0x005f8060, FB_W_SOF1, RW, 0x00000000, uint32_t) PVR_REG(0x005f8064, FB_W_SOF2, RW, 0x00000000, uint32_t) PVR_REG(0x005f8068, FB_X_CLIP, RW, 0x00000000, uint32_t) PVR_REG(0x005f806c, FB_Y_CLIP, RW, 0x00000000, uint32_t) -PVR_REG(0x005f8074, FPU_SHAD_SCALE, RW, 0x00000000, holly::FPU_SHAD_SCALE_T) +PVR_REG(0x005f8074, FPU_SHAD_SCALE, RW, 0x00000000, hw::holly::FPU_SHAD_SCALE_T) PVR_REG(0x005f8078, FPU_CULL_VAL, RW, 0x00000000, uint32_t) -PVR_REG(0x005f807c, FPU_PARAM_CFG, RW, 0x0007df77, holly::FPU_PARAM_CFG_T) +PVR_REG(0x005f807c, FPU_PARAM_CFG, RW, 0x0007df77, hw::holly::FPU_PARAM_CFG_T) PVR_REG(0x005f8080, HALF_OFFSET, RW, 0x00000007, uint32_t) PVR_REG(0x005f8084, FPU_PERP_VAL, RW, 0x00000000, uint32_t) PVR_REG(0x005f8088, ISP_BACKGND_D, RW, 0x00000000, uint32_t) -PVR_REG(0x005f808c, ISP_BACKGND_T, RW, 0x00000000, holly::ISP_BACKGND_T_T) -PVR_REG(0x005f8098, ISP_FEED_CFG, RW, 0x00402000, holly::ISP_FEED_CFG_T) +PVR_REG(0x005f808c, ISP_BACKGND_T, RW, 0x00000000, hw::holly::ISP_BACKGND_T_T) +PVR_REG(0x005f8098, ISP_FEED_CFG, RW, 0x00402000, hw::holly::ISP_FEED_CFG_T) PVR_REG(0x005f80a0, SDRAM_REFRESH, RW, 0x00000020, uint32_t) PVR_REG(0x005f80a4, SDRAM_ARB_CFG, RW, 0x0000001f, uint32_t) PVR_REG(0x005f80a8, SDRAM_CFG, RW, 0x15f28997, uint32_t) @@ -34,26 +34,26 @@ PVR_REG(0x005f80b8, FOG_DENSITY, RW, 0x00000000, uint32_t) PVR_REG(0x005f80bc, FOG_CLAMP_MAX, RW, 0x00000000, uint32_t) PVR_REG(0x005f80c0, FOG_CLAMP_MIN, RW, 0x00000000, uint32_t) PVR_REG(0x005f80c4, SPG_TRIGGER_POS, RW, 0x00000000, uint32_t) -PVR_REG(0x005f80c8, SPG_HBLANK_INT, RW, 0x031d0000, holly::SPG_HBLANK_INT_T) -PVR_REG(0x005f80cc, SPG_VBLANK_INT, RW, 0x01500104, holly::SPG_VBLANK_INT_T) -PVR_REG(0x005f80d0, SPG_CONTROL, RW, 0x00000000, holly::SPG_CONTROL_T) +PVR_REG(0x005f80c8, SPG_HBLANK_INT, RW, 0x031d0000, hw::holly::SPG_HBLANK_INT_T) +PVR_REG(0x005f80cc, SPG_VBLANK_INT, RW, 0x01500104, hw::holly::SPG_VBLANK_INT_T) +PVR_REG(0x005f80d0, SPG_CONTROL, RW, 0x00000000, hw::holly::SPG_CONTROL_T) PVR_REG(0x005f80d4, SPG_HBLANK, RW, 0x007e0345, uint32_t) -PVR_REG(0x005f80d8, SPG_LOAD, RW, 0x01060359, holly::SPG_LOAD_T) -PVR_REG(0x005f80dc, SPG_VBLANK, RW, 0x01500104, holly::SPG_VBLANK_T) +PVR_REG(0x005f80d8, SPG_LOAD, RW, 0x01060359, hw::holly::SPG_LOAD_T) +PVR_REG(0x005f80dc, SPG_VBLANK, RW, 0x01500104, hw::holly::SPG_VBLANK_T) PVR_REG(0x005f80e0, SPG_WIDTH, RW, 0x07f1933f, uint32_t) -PVR_REG(0x005f80e4, TEXT_CONTROL, RW, 0x00000000, holly::TEXT_CONTROL_T) +PVR_REG(0x005f80e4, TEXT_CONTROL, RW, 0x00000000, hw::holly::TEXT_CONTROL_T) PVR_REG(0x005f80e8, VO_CONTROL, RW, 0x00000108, uint32_t) PVR_REG(0x005f80ec, VO_STARTX, RW, 0x0000009d, uint32_t) PVR_REG(0x005f80f0, VO_STARTY, RW, 0x00000015, uint32_t) PVR_REG(0x005f80f4, SCALER_CTL, RW, 0x00000400, uint32_t) -PVR_REG(0x005f8108, PAL_RAM_CTRL, RW, 0x00000000, holly::PAL_RAM_CTRL_T) -PVR_REG(0x005f810c, SPG_STATUS, R, 0x00000000, holly::SPG_STATUS_T) +PVR_REG(0x005f8108, PAL_RAM_CTRL, RW, 0x00000000, hw::holly::PAL_RAM_CTRL_T) +PVR_REG(0x005f810c, SPG_STATUS, R, 0x00000000, hw::holly::SPG_STATUS_T) PVR_REG(0x005f8110, FB_BURSTCTRL, RW, 0x00090639, uint32_t) PVR_REG(0x005f8114, FB_C_SOF, R, 0x00000000, uint32_t) PVR_REG(0x005f8118, Y_COEFF, RW, 0x00000000, uint32_t) PVR_REG(0x005f811c, PT_ALPHA_REF, RW, 0x000000ff, uint32_t) PVR_REG(0x005f8124, TA_OL_BASE, RW, 0x00000000, uint32_t) -PVR_REG(0x005f8128, TA_ISP_BASE, RW, 0x00000000, holly::TA_ISP_BASE_T) +PVR_REG(0x005f8128, TA_ISP_BASE, RW, 0x00000000, hw::holly::TA_ISP_BASE_T) PVR_REG(0x005f812c, TA_OL_LIMIT, RW, 0x00000000, uint32_t) PVR_REG(0x005f8130, TA_ISP_LIMIT, RW, 0x00000000, uint32_t) PVR_REG(0x005f8134, TA_NEXT_OPB, R, 0x00000000, uint32_t) diff --git a/src/holly/tile_accelerator.cc b/src/hw/holly/tile_accelerator.cc similarity index 99% rename from src/holly/tile_accelerator.cc rename to src/hw/holly/tile_accelerator.cc index 473c9d6e..08279cd5 100644 --- a/src/holly/tile_accelerator.cc +++ b/src/hw/holly/tile_accelerator.cc @@ -1,10 +1,10 @@ #include "core/core.h" #include "emu/dreamcast.h" -#include "holly/pixel_convert.h" +#include "hw/holly/pixel_convert.h" using namespace dreavm::core; using namespace dreavm::emu; -using namespace dreavm::holly; +using namespace dreavm::hw::holly; using namespace dreavm::renderer; using namespace dreavm::trace; diff --git a/src/holly/tile_accelerator.h b/src/hw/holly/tile_accelerator.h similarity index 98% rename from src/holly/tile_accelerator.h rename to src/hw/holly/tile_accelerator.h index 85776aae..a6b71233 100644 --- a/src/holly/tile_accelerator.h +++ b/src/hw/holly/tile_accelerator.h @@ -3,19 +3,21 @@ #include #include -#include "holly/tile_renderer.h" +#include "hw/holly/tile_renderer.h" #include "renderer/backend.h" namespace dreavm { namespace emu { class Dreamcast; -class Memory; } namespace trace { class TraceWriter; } +namespace hw { +class Memory; + namespace holly { class Holly; @@ -521,8 +523,8 @@ class TileAccelerator { void WriteBackgroundState(TileContext *tactx); emu::Dreamcast *dc_; - emu::Memory *memory_; - holly::Holly *holly_; + hw::Memory *memory_; + hw::holly::Holly *holly_; uint8_t *video_ram_; TileTextureCache texcache_; @@ -533,5 +535,6 @@ class TileAccelerator { }; } } +} #endif diff --git a/src/holly/tile_renderer.cc b/src/hw/holly/tile_renderer.cc similarity index 99% rename from src/holly/tile_renderer.cc rename to src/hw/holly/tile_renderer.cc index ddd51b6a..67bf8432 100644 --- a/src/holly/tile_renderer.cc +++ b/src/hw/holly/tile_renderer.cc @@ -1,10 +1,10 @@ #include "core/core.h" #include "emu/profiler.h" -#include "holly/pixel_convert.h" -#include "holly/tile_accelerator.h" -#include "holly/tile_renderer.h" +#include "hw/holly/pixel_convert.h" +#include "hw/holly/tile_accelerator.h" +#include "hw/holly/tile_renderer.h" -using namespace dreavm::holly; +using namespace dreavm::hw::holly; using namespace dreavm::renderer; static int compressed_mipmap_offsets[] = { diff --git a/src/holly/tile_renderer.h b/src/hw/holly/tile_renderer.h similarity index 99% rename from src/holly/tile_renderer.h rename to src/hw/holly/tile_renderer.h index 14343746..df1c26f0 100644 --- a/src/holly/tile_renderer.h +++ b/src/hw/holly/tile_renderer.h @@ -6,6 +6,7 @@ #include "renderer/backend.h" namespace dreavm { +namespace hw { namespace holly { union TSP; @@ -91,5 +92,6 @@ class TileRenderer { }; } } +} #endif diff --git a/src/holly/maple.cc b/src/hw/maple/maple.cc similarity index 95% rename from src/holly/maple.cc rename to src/hw/maple/maple.cc index 7609d599..0da1e1ce 100644 --- a/src/holly/maple.cc +++ b/src/hw/maple/maple.cc @@ -1,11 +1,12 @@ #include "core/core.h" #include "emu/dreamcast.h" -#include "holly/maple_controller.h" +#include "hw/maple/maple_controller.h" using namespace dreavm::core; -using namespace dreavm::cpu; using namespace dreavm::emu; -using namespace dreavm::holly; +using namespace dreavm::hw::holly; +using namespace dreavm::hw::maple; +using namespace dreavm::hw::sh4; using namespace dreavm::system; Maple::Maple(Dreamcast *dc) : dc_(dc), devices_() { diff --git a/src/holly/maple.h b/src/hw/maple/maple.h similarity index 96% rename from src/holly/maple.h rename to src/hw/maple/maple.h index faf40fe5..3242de7d 100644 --- a/src/holly/maple.h +++ b/src/hw/maple/maple.h @@ -6,13 +6,17 @@ namespace dreavm { namespace emu { class Dreamcast; -class Memory; struct Register; } +namespace hw { namespace holly { - class Holly; +} + +class Memory; + +namespace maple { enum { MAX_PORTS = 4 }; @@ -114,13 +118,14 @@ class Maple { void StartDMA(); emu::Dreamcast *dc_; - emu::Memory *memory_; - holly::Holly *holly_; + hw::Memory *memory_; + hw::holly::Holly *holly_; emu::Register *holly_regs_; std::unique_ptr devices_[MAX_PORTS]; }; } } +} #endif diff --git a/src/holly/maple_controller.cc b/src/hw/maple/maple_controller.cc similarity index 98% rename from src/holly/maple_controller.cc rename to src/hw/maple/maple_controller.cc index ca3655ac..64b944a8 100644 --- a/src/holly/maple_controller.cc +++ b/src/hw/maple/maple_controller.cc @@ -2,9 +2,9 @@ #include #include #include "core/core.h" -#include "holly/maple_controller.h" +#include "hw/maple/maple_controller.h" -using namespace dreavm::holly; +using namespace dreavm::hw::maple; using namespace dreavm::system; using namespace json11; diff --git a/src/holly/maple_controller.h b/src/hw/maple/maple_controller.h similarity index 95% rename from src/holly/maple_controller.h rename to src/hw/maple/maple_controller.h index d245c800..ea2129b1 100644 --- a/src/holly/maple_controller.h +++ b/src/hw/maple/maple_controller.h @@ -1,10 +1,11 @@ #ifndef MAPLE_CONTROLLER_H #define MAPLE_CONTROLLER_H -#include "holly/maple.h" +#include "hw/maple/maple.h" namespace dreavm { -namespace holly { +namespace hw { +namespace maple { enum { CONT_C = 0x1, @@ -68,5 +69,6 @@ class MapleController : public MapleDevice { }; } } +} #endif diff --git a/src/emu/memory.h b/src/hw/memory.h similarity index 99% rename from src/emu/memory.h rename to src/hw/memory.h index 368cc838..c5e60bba 100644 --- a/src/emu/memory.h +++ b/src/hw/memory.h @@ -10,7 +10,7 @@ #include "core/core.h" namespace dreavm { -namespace emu { +namespace hw { // // single level page table implementation diff --git a/src/emu/scheduler.cc b/src/hw/scheduler.cc similarity index 97% rename from src/emu/scheduler.cc rename to src/hw/scheduler.cc index 42b18bbb..84498b95 100644 --- a/src/emu/scheduler.cc +++ b/src/hw/scheduler.cc @@ -1,8 +1,8 @@ #include #include -#include "emu/scheduler.h" +#include "hw/scheduler.h" -using namespace dreavm::emu; +using namespace dreavm::hw; Scheduler::Scheduler() : next_timer_handle_(0), base_time_() {} diff --git a/src/emu/scheduler.h b/src/hw/scheduler.h similarity index 97% rename from src/emu/scheduler.h rename to src/hw/scheduler.h index 3a54d928..d1946129 100644 --- a/src/emu/scheduler.h +++ b/src/hw/scheduler.h @@ -5,10 +5,10 @@ #include #include #include -#include "emu/device.h" +#include "hw/device.h" namespace dreavm { -namespace emu { +namespace hw { typedef std::function TimerCallback; diff --git a/src/cpu/sh4.cc b/src/hw/sh4/sh4.cc similarity index 90% rename from src/cpu/sh4.cc rename to src/hw/sh4/sh4.cc index fc9df48b..7892e346 100644 --- a/src/cpu/sh4.cc +++ b/src/hw/sh4/sh4.cc @@ -1,79 +1,23 @@ #include "core/core.h" -#include "cpu/runtime.h" -#include "cpu/sh4.h" -#include "emu/memory.h" #include "emu/profiler.h" +#include "hw/sh4/sh4.h" +#include "hw/memory.h" +#include "jit/runtime.h" using namespace dreavm::core; -using namespace dreavm::cpu; using namespace dreavm::emu; +using namespace dreavm::hw::sh4; +using namespace dreavm::jit; +using namespace dreavm::jit::frontend::sh4; InterruptInfo interrupts[NUM_INTERRUPTS] = { #define SH4_INT(name, intevt, pri, ipr, ipr_shift) \ { intevt, pri, ipr, ipr_shift } \ , -#include "cpu/sh4_int.inc" +#include "hw/sh4/sh4_int.inc" #undef SH4_INT }; -static void SetRegisterBank(SH4Context *ctx, int bank) { - if (bank == 0) { - for (int s = 0; s < 8; s++) { - ctx->rbnk[1][s] = ctx->r[s]; - ctx->r[s] = ctx->rbnk[0][s]; - } - } else { - for (int s = 0; s < 8; s++) { - ctx->rbnk[0][s] = ctx->r[s]; - ctx->r[s] = ctx->rbnk[1][s]; - } - } -} - -static void SwapFPRegisters(SH4Context *ctx) { - uint32_t z; - - for (int s = 0; s <= 15; s++) { - z = ctx->fr[s]; - ctx->fr[s] = ctx->xf[s]; - ctx->xf[s] = z; - } -} - -static void SwapFPCouples(SH4Context *ctx) { - uint32_t z; - - for (int s = 0; s <= 15; s = s + 2) { - z = ctx->fr[s]; - ctx->fr[s] = ctx->fr[s + 1]; - ctx->fr[s + 1] = z; - - z = ctx->xf[s]; - ctx->xf[s] = ctx->xf[s + 1]; - ctx->xf[s + 1] = z; - } -} - -void SH4Context::SRUpdated(SH4Context *ctx) { - if (ctx->sr.RB != ctx->old_sr.RB) { - SetRegisterBank(ctx, ctx->sr.RB ? 1 : 0); - } - - ctx->old_sr = ctx->sr; -} - -void SH4Context::FPSCRUpdated(SH4Context *ctx) { - if (ctx->fpscr.FR != ctx->old_fpscr.FR) { - SwapFPRegisters(ctx); - } - - if (ctx->fpscr.PR != ctx->old_fpscr.PR) { - SwapFPCouples(ctx); - } - - ctx->old_fpscr = ctx->fpscr; -} - SH4::SH4(Memory &memory, Runtime &runtime) : memory_(memory), runtime_(runtime), @@ -93,7 +37,7 @@ void SH4::Init() { if (default != HELD) { \ *(uint32_t *)&area7_[name##_OFFSET] = default; \ } -#include "cpu/sh4_regs.inc" +#include "hw/sh4/sh4_regs.inc" #undef SH4_REG memset(cache_, 0, sizeof(cache_)); @@ -480,7 +424,7 @@ void SH4::CheckPendingInterrupts() { ctx_.sr.RB = 1; ctx_.pc = ctx_.vbr + 0x600; - SH4Context::SRUpdated(&ctx_); + SRUpdated(&ctx_); } bool SH4::TimerEnabled(int n) { // diff --git a/src/cpu/sh4.h b/src/hw/sh4/sh4.h similarity index 74% rename from src/cpu/sh4.h rename to src/hw/sh4/sh4.h index 175d17fe..a751ebe8 100644 --- a/src/cpu/sh4.h +++ b/src/hw/sh4/sh4.h @@ -1,18 +1,20 @@ #ifndef SH4_H #define SH4_H -#include "emu/device.h" +#include "hw/device.h" +#include "jit/frontend/sh4/sh4_context.h" struct SH4Test; namespace dreavm { -namespace emu { -class Memory; +namespace jit { +class Runtime; } -namespace cpu { +namespace hw { +class Memory; -class Runtime; +namespace sh4 { // translate address to 29-bit physical space, ignoring all modifier bits enum { ADDR_MASK = 0x1fffffff }; @@ -23,40 +25,6 @@ enum { HELD = 0x1, }; -union SR_T { - uint32_t full; - struct { - uint32_t T : 1; - uint32_t S : 1; - uint32_t reserved : 2; - uint32_t IMASK : 4; - uint32_t Q : 1; - uint32_t M : 1; - uint32_t reserved1 : 5; - uint32_t FD : 1; - uint32_t reserved2 : 12; - uint32_t BL : 1; - uint32_t RB : 1; - uint32_t MD : 1; - uint32_t reserved3 : 1; - }; -}; - -union FPSCR_T { - uint32_t full; - struct { - uint32_t RM : 2; - uint32_t flag : 5; - uint32_t enable : 5; - uint32_t cause : 6; - uint32_t DN : 1; - uint32_t PR : 1; - uint32_t SZ : 1; - uint32_t FR : 1; - uint32_t reserved : 10; - }; -}; - union CCR_T { uint32_t full; struct { @@ -121,7 +89,7 @@ union DMAOR_T { enum { #define SH4_REG(addr, name, flags, default, reset, sleep, standby, type) \ name##_OFFSET = ((addr & 0x1fe0000) >> 11) | ((addr & 0xfc) >> 2), -#include "cpu/sh4_regs.inc" +#include "hw/sh4/sh4_regs.inc" #undef SH4_REG }; @@ -132,7 +100,7 @@ struct InterruptInfo { enum Interrupt { #define SH4_INT(name, intevt, pri, ipr, ipr_shift) SH4_INTC_##name, -#include "cpu/sh4_int.inc" +#include "hw/sh4/sh4_int.inc" #undef SH4_INT NUM_INTERRUPTS }; @@ -143,31 +111,12 @@ enum DDTRW { // DDT_W }; -struct SH4Context { - static void SRUpdated(SH4Context *ctx); - static void FPSCRUpdated(SH4Context *ctx); - - uint32_t pc, spc; - uint32_t pr; - uint32_t gbr, vbr; - uint32_t mach, macl; - uint32_t r[16], rbnk[2][8], sgr; - uint32_t fr[16], xf[16]; - uint32_t fpul; - uint32_t dbr; - uint32_t sq[2][8]; - uint32_t sq_ext_addr[2]; - uint32_t preserve; - SR_T sr, ssr, old_sr; - FPSCR_T fpscr, old_fpscr; -}; - -class SH4 : public emu::Device { +class SH4 : public hw::Device { template friend void RunSH4Test(const SH4Test &); public: - SH4(emu::Memory &memory, cpu::Runtime &runtime); + SH4(hw::Memory &memory, jit::Runtime &runtime); uint32_t GetClockFrequency() { return 200000000; } @@ -220,14 +169,14 @@ class SH4 : public emu::Device { bool TimerEnabled(int n); void RunTimer(int n, uint32_t cycles); - emu::Memory &memory_; - Runtime &runtime_; + hw::Memory &memory_; + jit::Runtime &runtime_; - SH4Context ctx_; - SR_T old_sr_; + jit::frontend::sh4::SH4Context ctx_; + jit::frontend::sh4::SR_T old_sr_; #define SH4_REG(addr, name, flags, default, reset, sleep, standby, type) \ type &name{reinterpret_cast(area7_[name##_OFFSET])}; -#include "cpu/sh4_regs.inc" +#include "hw/sh4/sh4_regs.inc" #undef SH4_REG bool pending_cache_reset_; @@ -243,5 +192,6 @@ class SH4 : public emu::Device { }; } } +} #endif diff --git a/src/cpu/sh4_int.inc b/src/hw/sh4/sh4_int.inc similarity index 100% rename from src/cpu/sh4_int.inc rename to src/hw/sh4/sh4_int.inc diff --git a/src/cpu/sh4_regs.inc b/src/hw/sh4/sh4_regs.inc similarity index 100% rename from src/cpu/sh4_regs.inc rename to src/hw/sh4/sh4_regs.inc diff --git a/src/cpu/backend/backend.h b/src/jit/backend/backend.h similarity index 76% rename from src/cpu/backend/backend.h rename to src/jit/backend/backend.h index f8e2147b..63d712ef 100644 --- a/src/cpu/backend/backend.h +++ b/src/jit/backend/backend.h @@ -2,11 +2,11 @@ #define BACKEND_H #include -#include "cpu/ir/ir_builder.h" -#include "emu/memory.h" +#include "hw/memory.h" +#include "jit/ir/ir_builder.h" namespace dreavm { -namespace cpu { +namespace jit { class RuntimeBlock; @@ -19,7 +19,7 @@ struct Register { class Backend { public: - Backend(emu::Memory &memory) : memory_(memory) {} + Backend(hw::Memory &memory) : memory_(memory) {} virtual ~Backend() {} virtual const Register *registers() const = 0; @@ -30,7 +30,7 @@ class Backend { ir::IRBuilder &builder) = 0; protected: - emu::Memory &memory_; + hw::Memory &memory_; }; } } diff --git a/src/cpu/backend/interpreter/interpreter_backend.cc b/src/jit/backend/interpreter/interpreter_backend.cc similarity index 92% rename from src/cpu/backend/interpreter/interpreter_backend.cc rename to src/jit/backend/interpreter/interpreter_backend.cc index 1954acd1..6809e7eb 100644 --- a/src/cpu/backend/interpreter/interpreter_backend.cc +++ b/src/jit/backend/interpreter/interpreter_backend.cc @@ -1,12 +1,12 @@ -#include "cpu/backend/interpreter/interpreter_backend.h" -#include "cpu/backend/interpreter/interpreter_block.h" -#include "cpu/backend/interpreter/interpreter_callbacks.h" +#include "jit/backend/interpreter/interpreter_backend.h" +#include "jit/backend/interpreter/interpreter_block.h" +#include "jit/backend/interpreter/interpreter_callbacks.h" -using namespace dreavm::cpu; -using namespace dreavm::cpu::backend; -using namespace dreavm::cpu::backend::interpreter; -using namespace dreavm::cpu::ir; -using namespace dreavm::emu; +using namespace dreavm::hw; +using namespace dreavm::jit; +using namespace dreavm::jit::backend; +using namespace dreavm::jit::backend::interpreter; +using namespace dreavm::jit::ir; static IntSig GetSignature(Instr &ir_i) { IntSig sig = 0; diff --git a/src/cpu/backend/interpreter/interpreter_backend.h b/src/jit/backend/interpreter/interpreter_backend.h similarity index 94% rename from src/cpu/backend/interpreter/interpreter_backend.h rename to src/jit/backend/interpreter/interpreter_backend.h index 46b17215..54f622f0 100644 --- a/src/cpu/backend/interpreter/interpreter_backend.h +++ b/src/jit/backend/interpreter/interpreter_backend.h @@ -1,11 +1,11 @@ #ifndef INTERPRETER_BACKEND_H #define INTERPRETER_BACKEND_H -#include "cpu/backend/backend.h" -#include "cpu/runtime.h" +#include "jit/backend/backend.h" +#include "jit/runtime.h" namespace dreavm { -namespace cpu { +namespace jit { namespace backend { namespace interpreter { @@ -56,7 +56,7 @@ constexpr Register int_registers[] = {{"a", ir::VALUE_INT_MASK}, class InterpreterBackend : public Backend { public: - InterpreterBackend(emu::Memory &memory); + InterpreterBackend(hw::Memory &memory); ~InterpreterBackend(); const Register *registers() const; diff --git a/src/cpu/backend/interpreter/interpreter_block.cc b/src/jit/backend/interpreter/interpreter_block.cc similarity index 87% rename from src/cpu/backend/interpreter/interpreter_block.cc rename to src/jit/backend/interpreter/interpreter_block.cc index 5dbcbb81..59c4f95a 100644 --- a/src/cpu/backend/interpreter/interpreter_block.cc +++ b/src/jit/backend/interpreter/interpreter_block.cc @@ -1,9 +1,8 @@ -#include "cpu/backend/interpreter/interpreter_block.h" +#include "jit/backend/interpreter/interpreter_block.h" -using namespace dreavm::emu; -using namespace dreavm::cpu; -using namespace dreavm::emu; -using namespace dreavm::cpu::backend::interpreter; +using namespace dreavm::hw; +using namespace dreavm::jit; +using namespace dreavm::jit::backend::interpreter; InterpreterBlock::InterpreterBlock(int guest_cycles, IntInstr *instrs, int num_instrs, int locals_size) diff --git a/src/cpu/backend/interpreter/interpreter_block.h b/src/jit/backend/interpreter/interpreter_block.h similarity index 75% rename from src/cpu/backend/interpreter/interpreter_block.h rename to src/jit/backend/interpreter/interpreter_block.h index a5d159eb..1f9cbf0c 100644 --- a/src/cpu/backend/interpreter/interpreter_block.h +++ b/src/jit/backend/interpreter/interpreter_block.h @@ -1,12 +1,12 @@ #ifndef INTERPRETER_BLOCK_H #define INTERPRETER_BLOCK_H -#include "cpu/backend/interpreter/interpreter_callbacks.h" -#include "cpu/runtime.h" -#include "emu/memory.h" +#include "hw/memory.h" +#include "jit/backend/interpreter/interpreter_callbacks.h" +#include "jit/runtime.h" namespace dreavm { -namespace cpu { +namespace jit { namespace backend { namespace interpreter { @@ -29,7 +29,7 @@ class InterpreterBlock : public RuntimeBlock { InterpreterBlock(int guest_cycles, IntInstr *instrs, int num_instrs, int locals_size); - uint32_t Call(emu::Memory *memory, void *guest_ctx); + uint32_t Call(hw::Memory *memory, void *guest_ctx); void Dump(); private: diff --git a/src/cpu/backend/interpreter/interpreter_callbacks.cc b/src/jit/backend/interpreter/interpreter_callbacks.cc similarity index 98% rename from src/cpu/backend/interpreter/interpreter_callbacks.cc rename to src/jit/backend/interpreter/interpreter_callbacks.cc index 4996cf20..7e578fda 100644 --- a/src/cpu/backend/interpreter/interpreter_callbacks.cc +++ b/src/jit/backend/interpreter/interpreter_callbacks.cc @@ -1,13 +1,13 @@ #include -#include "cpu/backend/interpreter/interpreter_backend.h" -#include "cpu/backend/interpreter/interpreter_block.h" -#include "cpu/backend/interpreter/interpreter_callbacks.h" +#include "jit/backend/interpreter/interpreter_backend.h" +#include "jit/backend/interpreter/interpreter_block.h" +#include "jit/backend/interpreter/interpreter_callbacks.h" using namespace dreavm::core; -using namespace dreavm::cpu; -using namespace dreavm::cpu::backend::interpreter; -using namespace dreavm::cpu::ir; -using namespace dreavm::emu; +using namespace dreavm::hw; +using namespace dreavm::jit; +using namespace dreavm::jit::backend::interpreter; +using namespace dreavm::jit::ir; // callbacks for each IR operation. callback functions are generated per // operation, per signature, per access mask. @@ -54,7 +54,7 @@ static std::unordered_map int_cbs; } \ } int_##op##_##r##_##a0##_##a1##_init -IntFn dreavm::cpu::backend::interpreter::GetCallback( +IntFn dreavm::jit::backend::interpreter::GetCallback( Opcode op, const IntSig &sig, IntAccessMask access_mask) { auto it = int_cbs.find(CALLBACK_IDX(op, GetArgSignature(sig, 3), GetArgSignature(sig, 0), diff --git a/src/cpu/backend/interpreter/interpreter_callbacks.h b/src/jit/backend/interpreter/interpreter_callbacks.h similarity index 68% rename from src/cpu/backend/interpreter/interpreter_callbacks.h rename to src/jit/backend/interpreter/interpreter_callbacks.h index e59513af..f6b5999a 100644 --- a/src/cpu/backend/interpreter/interpreter_callbacks.h +++ b/src/jit/backend/interpreter/interpreter_callbacks.h @@ -1,11 +1,11 @@ #ifndef INTERPRETER_EMIT_H #define INTERPRETER_EMIT_H -#include "cpu/backend/interpreter/interpreter_backend.h" -#include "cpu/ir/ir_builder.h" +#include "jit/backend/interpreter/interpreter_backend.h" +#include "jit/ir/ir_builder.h" namespace dreavm { -namespace cpu { +namespace jit { namespace backend { namespace interpreter { @@ -13,7 +13,7 @@ union IntValue; struct IntInstr; typedef uint32_t (*IntFn)(const IntInstr *instr, uint32_t idx, - emu::Memory *memory, IntValue *registers, + hw::Memory *memory, IntValue *registers, uint8_t *locals, void *guest_ctx); IntFn GetCallback(ir::Opcode op, const IntSig &sig, IntAccessMask access_mask); diff --git a/src/cpu/backend/x64/x64_backend.cc b/src/jit/backend/x64/x64_backend.cc similarity index 79% rename from src/cpu/backend/x64/x64_backend.cc rename to src/jit/backend/x64/x64_backend.cc index c2c2aca0..e8afa107 100644 --- a/src/cpu/backend/x64/x64_backend.cc +++ b/src/jit/backend/x64/x64_backend.cc @@ -1,13 +1,13 @@ #include "core/core.h" -#include "cpu/backend/x64/x64_backend.h" -#include "cpu/backend/x64/x64_block.h" +#include "jit/backend/x64/x64_backend.h" +#include "jit/backend/x64/x64_block.h" using namespace dreavm::core; -using namespace dreavm::cpu; -using namespace dreavm::cpu::backend; -using namespace dreavm::cpu::backend::x64; -using namespace dreavm::cpu::ir; -using namespace dreavm::emu; +using namespace dreavm::hw; +using namespace dreavm::jit; +using namespace dreavm::jit::backend; +using namespace dreavm::jit::backend::x64; +using namespace dreavm::jit::ir; X64Backend::X64Backend(Memory &memory) : Backend(memory), codegen_(1024 * 1024 * 8), emitter_(memory, codegen_) {} diff --git a/src/cpu/backend/x64/x64_backend.h b/src/jit/backend/x64/x64_backend.h similarity index 89% rename from src/cpu/backend/x64/x64_backend.h rename to src/jit/backend/x64/x64_backend.h index 8ad836d4..1eaa47fa 100644 --- a/src/cpu/backend/x64/x64_backend.h +++ b/src/jit/backend/x64/x64_backend.h @@ -2,12 +2,12 @@ #define X64_BACKEND_H #include -#include "cpu/backend/backend.h" -#include "cpu/backend/x64/x64_emitter.h" -#include "cpu/runtime.h" +#include "jit/backend/backend.h" +#include "jit/backend/x64/x64_emitter.h" +#include "jit/runtime.h" namespace dreavm { -namespace cpu { +namespace jit { namespace backend { namespace x64 { @@ -26,7 +26,7 @@ constexpr Register x64_registers[] = {{"rbx", ir::VALUE_INT_MASK}, class X64Backend : public Backend { public: - X64Backend(emu::Memory &memory); + X64Backend(hw::Memory &memory); ~X64Backend(); const Register *registers() const; diff --git a/src/cpu/backend/x64/x64_block.cc b/src/jit/backend/x64/x64_block.cc similarity index 89% rename from src/cpu/backend/x64/x64_block.cc rename to src/jit/backend/x64/x64_block.cc index 7ff64df5..74c54fc5 100644 --- a/src/cpu/backend/x64/x64_block.cc +++ b/src/jit/backend/x64/x64_block.cc @@ -1,11 +1,11 @@ #include #include #include -#include "cpu/backend/x64/x64_block.h" +#include "jit/backend/x64/x64_block.h" -using namespace dreavm::cpu; -using namespace dreavm::emu; -using namespace dreavm::cpu::backend::x64; +using namespace dreavm::hw; +using namespace dreavm::jit; +using namespace dreavm::jit::backend::x64; X64Block::X64Block(int guest_cycles, X64Fn fn) : RuntimeBlock(guest_cycles), fn_(fn) {} diff --git a/src/cpu/backend/x64/x64_block.h b/src/jit/backend/x64/x64_block.h similarity index 60% rename from src/cpu/backend/x64/x64_block.h rename to src/jit/backend/x64/x64_block.h index c0ce465d..040ebc35 100644 --- a/src/cpu/backend/x64/x64_block.h +++ b/src/jit/backend/x64/x64_block.h @@ -1,12 +1,12 @@ #ifndef X64_BLOCK_H #define X64_BLOCK_H -#include "cpu/backend/x64/x64_emitter.h" -#include "cpu/runtime.h" -#include "emu/memory.h" +#include "hw/memory.h" +#include "jit/backend/x64/x64_emitter.h" +#include "jit/runtime.h" namespace dreavm { -namespace cpu { +namespace jit { namespace backend { namespace x64 { @@ -14,7 +14,7 @@ class X64Block : public RuntimeBlock { public: X64Block(int guest_cycles, X64Fn fn); - uint32_t Call(emu::Memory *memory, void *guest_ctx); + uint32_t Call(hw::Memory *memory, void *guest_ctx); void Dump(); private: diff --git a/src/cpu/backend/x64/x64_emitter.cc b/src/jit/backend/x64/x64_emitter.cc similarity index 99% rename from src/cpu/backend/x64/x64_emitter.cc rename to src/jit/backend/x64/x64_emitter.cc index 818e6af7..6dce4859 100644 --- a/src/cpu/backend/x64/x64_emitter.cc +++ b/src/jit/backend/x64/x64_emitter.cc @@ -1,11 +1,11 @@ #include "core/core.h" -#include "cpu/backend/x64/x64_emitter.h" #include "emu/profiler.h" +#include "jit/backend/x64/x64_emitter.h" using namespace dreavm::core; -using namespace dreavm::cpu::backend::x64; -using namespace dreavm::cpu::ir; -using namespace dreavm::emu; +using namespace dreavm::hw; +using namespace dreavm::jit::backend::x64; +using namespace dreavm::jit::ir; // // x64 register layout diff --git a/src/cpu/backend/x64/x64_emitter.h b/src/jit/backend/x64/x64_emitter.h similarity index 85% rename from src/cpu/backend/x64/x64_emitter.h rename to src/jit/backend/x64/x64_emitter.h index 2d8cc14f..0025aea9 100644 --- a/src/cpu/backend/x64/x64_emitter.h +++ b/src/jit/backend/x64/x64_emitter.h @@ -5,11 +5,11 @@ #include #include "core/arena.h" #include "core/platform.h" -#include "cpu/runtime.h" -#include "emu/memory.h" +#include "hw/memory.h" +#include "jit/runtime.h" namespace dreavm { -namespace cpu { +namespace jit { namespace backend { namespace x64 { @@ -25,11 +25,11 @@ enum { STACK_SIZE = STACK_OFFSET_LOCALS }; -typedef uint32_t (*X64Fn)(void *guest_ctx, emu::Memory *memory); +typedef uint32_t (*X64Fn)(void *guest_ctx, hw::Memory *memory); class X64Emitter { public: - X64Emitter(emu::Memory &memory, Xbyak::CodeGenerator &codegen); + X64Emitter(hw::Memory &memory, Xbyak::CodeGenerator &codegen); Xbyak::Label &epilog_label() { return *epilog_label_; } @@ -51,7 +51,7 @@ class X64Emitter { Xbyak::Label *AllocLabel(); Xbyak::Address *AllocAddress(const Xbyak::Address &addr); - emu::Memory &memory_; + hw::Memory &memory_; Xbyak::CodeGenerator &c_; core::Arena arena_; Xbyak::Label *epilog_label_; diff --git a/src/cpu/frontend/frontend.h b/src/jit/frontend/frontend.h similarity index 68% rename from src/cpu/frontend/frontend.h rename to src/jit/frontend/frontend.h index 16c534c8..8ca8a1f2 100644 --- a/src/cpu/frontend/frontend.h +++ b/src/jit/frontend/frontend.h @@ -2,23 +2,23 @@ #define FRONTEND_H #include -#include "cpu/ir/ir_builder.h" -#include "emu/memory.h" +#include "hw/memory.h" +#include "jit/ir/ir_builder.h" namespace dreavm { -namespace cpu { +namespace jit { namespace frontend { class Frontend { public: - Frontend(emu::Memory &memory) : memory_(memory) {} + Frontend(hw::Memory &memory) : memory_(memory) {} virtual ~Frontend() {} virtual std::unique_ptr BuildBlock(uint32_t addr, const void *guest_ctx) = 0; protected: - emu::Memory &memory_; + hw::Memory &memory_; }; } } diff --git a/src/cpu/frontend/sh4/sh4_builder.cc b/src/jit/frontend/sh4/sh4_builder.cc similarity index 93% rename from src/cpu/frontend/sh4/sh4_builder.cc rename to src/jit/frontend/sh4/sh4_builder.cc index edeaa608..835a1463 100644 --- a/src/cpu/frontend/sh4/sh4_builder.cc +++ b/src/jit/frontend/sh4/sh4_builder.cc @@ -1,14 +1,14 @@ -#include "cpu/frontend/sh4/sh4_emit.h" -#include "cpu/frontend/sh4/sh4_frontend.h" -#include "cpu/frontend/sh4/sh4_instr.h" -#include "cpu/runtime.h" #include "emu/profiler.h" +#include "jit/frontend/sh4/sh4_emit.h" +#include "jit/frontend/sh4/sh4_frontend.h" +#include "jit/frontend/sh4/sh4_instr.h" +#include "jit/runtime.h" -using namespace dreavm::cpu; -using namespace dreavm::cpu::frontend; -using namespace dreavm::cpu::frontend::sh4; -using namespace dreavm::cpu::ir; -using namespace dreavm::emu; +using namespace dreavm::hw; +using namespace dreavm::jit; +using namespace dreavm::jit::frontend; +using namespace dreavm::jit::frontend::sh4; +using namespace dreavm::jit::ir; SH4Builder::SH4Builder(Memory &memory) : memory_(memory), @@ -116,7 +116,7 @@ Value *SH4Builder::LoadSR() { void SH4Builder::StoreSR(Value *v) { CHECK_EQ(v->type(), VALUE_I32); StoreAndPreserveContext(offsetof(SH4Context, sr), v, IF_INVALIDATE_CONTEXT); - CallExternal((ExternalFn)&SH4Context::SRUpdated); + CallExternal((ExternalFn)&SRUpdated); } ir::Value *SH4Builder::LoadT() { return And(LoadSR(), AllocConstant(T)); } @@ -144,7 +144,7 @@ void SH4Builder::StoreFPSCR(ir::Value *v) { CHECK_EQ(v->type(), VALUE_I32); v = And(v, AllocConstant(0x003fffff)); StoreAndPreserveContext(offsetof(SH4Context, fpscr), v); - CallExternal((ExternalFn)&SH4Context::FPSCRUpdated); + CallExternal((ExternalFn)&FPSCRUpdated); } ir::Value *SH4Builder::LoadPR() { diff --git a/src/cpu/frontend/sh4/sh4_builder.h b/src/jit/frontend/sh4/sh4_builder.h similarity index 91% rename from src/cpu/frontend/sh4/sh4_builder.h rename to src/jit/frontend/sh4/sh4_builder.h index 9cca4af0..420e3778 100644 --- a/src/cpu/frontend/sh4/sh4_builder.h +++ b/src/jit/frontend/sh4/sh4_builder.h @@ -1,15 +1,13 @@ #ifndef SH4_BUILDER_H #define SH4_BUILDER_H -#include "cpu/frontend/sh4/sh4_instr.h" -#include "cpu/ir/ir_builder.h" -#include "emu/memory.h" +#include "hw/memory.h" +#include "jit/frontend/sh4/sh4_context.h" +#include "jit/frontend/sh4/sh4_instr.h" +#include "jit/ir/ir_builder.h" namespace dreavm { -namespace cpu { - -struct SH4Context; - +namespace jit { namespace frontend { namespace sh4 { @@ -43,7 +41,7 @@ struct FPUState { class SH4Builder : public ir::IRBuilder { public: - SH4Builder(emu::Memory &memory); + SH4Builder(hw::Memory &memory); ~SH4Builder(); void Emit(uint32_t start_addr, const SH4Context &ctx); @@ -76,7 +74,7 @@ class SH4Builder : public ir::IRBuilder { void StoreAndPreserveContext(size_t offset, ir::Value *v, ir::InstrFlag flags = ir::IF_NONE); - emu::Memory &memory_; + hw::Memory &memory_; FPUState fpu_state_; Instr delay_instr_; bool has_delay_instr_; diff --git a/src/jit/frontend/sh4/sh4_context.cc b/src/jit/frontend/sh4/sh4_context.cc new file mode 100644 index 00000000..f3afbfaa --- /dev/null +++ b/src/jit/frontend/sh4/sh4_context.cc @@ -0,0 +1,68 @@ +#include "jit/frontend/sh4/sh4_context.h" + +namespace dreavm { +namespace jit { +namespace frontend { +namespace sh4 { + +static void SetRegisterBank(SH4Context *ctx, int bank) { + if (bank == 0) { + for (int s = 0; s < 8; s++) { + ctx->rbnk[1][s] = ctx->r[s]; + ctx->r[s] = ctx->rbnk[0][s]; + } + } else { + for (int s = 0; s < 8; s++) { + ctx->rbnk[0][s] = ctx->r[s]; + ctx->r[s] = ctx->rbnk[1][s]; + } + } +} + +static void SwapFPRegisters(SH4Context *ctx) { + uint32_t z; + + for (int s = 0; s <= 15; s++) { + z = ctx->fr[s]; + ctx->fr[s] = ctx->xf[s]; + ctx->xf[s] = z; + } +} + +static void SwapFPCouples(SH4Context *ctx) { + uint32_t z; + + for (int s = 0; s <= 15; s = s + 2) { + z = ctx->fr[s]; + ctx->fr[s] = ctx->fr[s + 1]; + ctx->fr[s + 1] = z; + + z = ctx->xf[s]; + ctx->xf[s] = ctx->xf[s + 1]; + ctx->xf[s + 1] = z; + } +} + +void SRUpdated(SH4Context *ctx) { + if (ctx->sr.RB != ctx->old_sr.RB) { + SetRegisterBank(ctx, ctx->sr.RB ? 1 : 0); + } + + ctx->old_sr = ctx->sr; +} + +void FPSCRUpdated(SH4Context *ctx) { + if (ctx->fpscr.FR != ctx->old_fpscr.FR) { + SwapFPRegisters(ctx); + } + + if (ctx->fpscr.PR != ctx->old_fpscr.PR) { + SwapFPCouples(ctx); + } + + ctx->old_fpscr = ctx->fpscr; +} +} +} +} +} diff --git a/src/jit/frontend/sh4/sh4_context.h b/src/jit/frontend/sh4/sh4_context.h new file mode 100644 index 00000000..2bd5b256 --- /dev/null +++ b/src/jit/frontend/sh4/sh4_context.h @@ -0,0 +1,68 @@ +#ifndef SH4_CONTEXT_H +#define SH4_CONTEXT_H + +#include + +namespace dreavm { +namespace jit { +namespace frontend { +namespace sh4 { + +union SR_T { + uint32_t full; + struct { + uint32_t T : 1; + uint32_t S : 1; + uint32_t reserved : 2; + uint32_t IMASK : 4; + uint32_t Q : 1; + uint32_t M : 1; + uint32_t reserved1 : 5; + uint32_t FD : 1; + uint32_t reserved2 : 12; + uint32_t BL : 1; + uint32_t RB : 1; + uint32_t MD : 1; + uint32_t reserved3 : 1; + }; +}; + +union FPSCR_T { + uint32_t full; + struct { + uint32_t RM : 2; + uint32_t flag : 5; + uint32_t enable : 5; + uint32_t cause : 6; + uint32_t DN : 1; + uint32_t PR : 1; + uint32_t SZ : 1; + uint32_t FR : 1; + uint32_t reserved : 10; + }; +}; + +struct SH4Context { + uint32_t pc, spc; + uint32_t pr; + uint32_t gbr, vbr; + uint32_t mach, macl; + uint32_t r[16], rbnk[2][8], sgr; + uint32_t fr[16], xf[16]; + uint32_t fpul; + uint32_t dbr; + uint32_t sq[2][8]; + uint32_t sq_ext_addr[2]; + uint32_t preserve; + SR_T sr, ssr, old_sr; + FPSCR_T fpscr, old_fpscr; +}; + +void SRUpdated(SH4Context *ctx); +void FPSCRUpdated(SH4Context *ctx); +} +} +} +} + +#endif diff --git a/src/cpu/frontend/sh4/sh4_emit.cc b/src/jit/frontend/sh4/sh4_emit.cc similarity index 99% rename from src/cpu/frontend/sh4/sh4_emit.cc rename to src/jit/frontend/sh4/sh4_emit.cc index 643d9aa8..a1a27fc7 100644 --- a/src/cpu/frontend/sh4/sh4_emit.cc +++ b/src/jit/frontend/sh4/sh4_emit.cc @@ -1,17 +1,17 @@ #define _USE_MATH_DEFINES #include -#include "cpu/frontend/sh4/sh4_emit.h" -#include "cpu/frontend/sh4/sh4_frontend.h" +#include "jit/frontend/sh4/sh4_emit.h" +#include "jit/frontend/sh4/sh4_frontend.h" -using namespace dreavm::cpu; -using namespace dreavm::cpu::frontend; -using namespace dreavm::cpu::frontend::sh4; -using namespace dreavm::cpu::ir; -using namespace dreavm::emu; +using namespace dreavm::hw; +using namespace dreavm::jit; +using namespace dreavm::jit::frontend; +using namespace dreavm::jit::frontend::sh4; +using namespace dreavm::jit::ir; EmitCallback sh4::emit_callbacks[sh4::NUM_OPCODES] = { #define SH4_INSTR(name, instr_code, cycles, flags) &sh4::Emit_OP_##name, -#include "cpu/frontend/sh4/sh4_instr.inc" +#include "jit/frontend/sh4/sh4_instr.inc" #undef SH4_INSTR }; diff --git a/src/cpu/frontend/sh4/sh4_emit.h b/src/jit/frontend/sh4/sh4_emit.h similarity index 79% rename from src/cpu/frontend/sh4/sh4_emit.h rename to src/jit/frontend/sh4/sh4_emit.h index b1e71172..33fe8759 100644 --- a/src/cpu/frontend/sh4/sh4_emit.h +++ b/src/jit/frontend/sh4/sh4_emit.h @@ -1,10 +1,10 @@ #ifndef SH4_EMIT_H #define SH4_EMIT_H -#include "cpu/frontend/sh4/sh4_builder.h" +#include "jit/frontend/sh4/sh4_builder.h" namespace dreavm { -namespace cpu { +namespace jit { namespace frontend { namespace sh4 { @@ -12,7 +12,7 @@ typedef void (*EmitCallback)(SH4Builder &b, const FPUState &, const Instr &i); #define SH4_INSTR(name, instr_code, cycles, flags) \ void Emit_OP_##name(SH4Builder &b, const FPUState &fpu, const Instr &instr); -#include "cpu/frontend/sh4/sh4_instr.inc" +#include "jit/frontend/sh4/sh4_instr.inc" #undef SH4_INSTR extern EmitCallback emit_callbacks[NUM_OPCODES]; diff --git a/src/cpu/frontend/sh4/sh4_frontend.cc b/src/jit/frontend/sh4/sh4_frontend.cc similarity index 69% rename from src/cpu/frontend/sh4/sh4_frontend.cc rename to src/jit/frontend/sh4/sh4_frontend.cc index 47a4845c..ed9f5877 100644 --- a/src/cpu/frontend/sh4/sh4_frontend.cc +++ b/src/jit/frontend/sh4/sh4_frontend.cc @@ -1,9 +1,9 @@ -#include "cpu/frontend/sh4/sh4_frontend.h" +#include "jit/frontend/sh4/sh4_frontend.h" -using namespace dreavm::cpu; -using namespace dreavm::cpu::frontend::sh4; -using namespace dreavm::cpu::ir; -using namespace dreavm::emu; +using namespace dreavm::hw; +using namespace dreavm::jit; +using namespace dreavm::jit::frontend::sh4; +using namespace dreavm::jit::ir; SH4Frontend::SH4Frontend(Memory &memory) : Frontend(memory) {} diff --git a/src/cpu/frontend/sh4/sh4_frontend.h b/src/jit/frontend/sh4/sh4_frontend.h similarity index 61% rename from src/cpu/frontend/sh4/sh4_frontend.h rename to src/jit/frontend/sh4/sh4_frontend.h index addb3eab..86b6e896 100644 --- a/src/cpu/frontend/sh4/sh4_frontend.h +++ b/src/jit/frontend/sh4/sh4_frontend.h @@ -1,19 +1,18 @@ #ifndef SH4_FRONTEND_H #define SH4_FRONTEND_H -#include "cpu/frontend/frontend.h" -#include "cpu/frontend/sh4/sh4_builder.h" -#include "cpu/frontend/sh4/sh4_instr.h" -#include "cpu/sh4.h" +#include "jit/frontend/frontend.h" +#include "jit/frontend/sh4/sh4_builder.h" +#include "jit/frontend/sh4/sh4_instr.h" namespace dreavm { -namespace cpu { +namespace jit { namespace frontend { namespace sh4 { class SH4Frontend : public Frontend { public: - SH4Frontend(emu::Memory &memory); + SH4Frontend(hw::Memory &memory); std::unique_ptr BuildBlock(uint32_t addr, const void *guest_ctx); diff --git a/src/cpu/frontend/sh4/sh4_instr.cc b/src/jit/frontend/sh4/sh4_instr.cc similarity index 91% rename from src/cpu/frontend/sh4/sh4_instr.cc rename to src/jit/frontend/sh4/sh4_instr.cc index fdafcff8..37202291 100644 --- a/src/cpu/frontend/sh4/sh4_instr.cc +++ b/src/jit/frontend/sh4/sh4_instr.cc @@ -1,7 +1,7 @@ -#include "cpu/frontend/sh4/sh4_instr.h" +#include "jit/frontend/sh4/sh4_instr.h" namespace dreavm { -namespace cpu { +namespace jit { namespace frontend { namespace sh4 { @@ -9,7 +9,7 @@ InstrType instrs[NUM_OPCODES] = { #define SH4_INSTR(name, instr_code, cycles, flags) \ { #name, OP_##name, #instr_code, cycles, flags } \ , -#include "cpu/frontend/sh4/sh4_instr.inc" +#include "jit/frontend/sh4/sh4_instr.inc" #undef SH4_INSTR }; InstrType *instr_lookup[UINT16_MAX]; diff --git a/src/cpu/frontend/sh4/sh4_instr.h b/src/jit/frontend/sh4/sh4_instr.h similarity index 96% rename from src/cpu/frontend/sh4/sh4_instr.h rename to src/jit/frontend/sh4/sh4_instr.h index 5ed6718c..36a10d82 100644 --- a/src/cpu/frontend/sh4/sh4_instr.h +++ b/src/jit/frontend/sh4/sh4_instr.h @@ -1,16 +1,16 @@ #ifndef SH4_INSTR_H #define SH4_INSTR_H -#include "cpu/ir/ir_builder.h" +#include "jit/ir/ir_builder.h" namespace dreavm { -namespace cpu { +namespace jit { namespace frontend { namespace sh4 { enum Opcode { #define SH4_INSTR(name, instr_code, cycles, flags) OP_##name, -#include "cpu/frontend/sh4/sh4_instr.inc" +#include "jit/frontend/sh4/sh4_instr.inc" #undef SH4_INSTR NUM_OPCODES }; diff --git a/src/cpu/frontend/sh4/sh4_instr.inc b/src/jit/frontend/sh4/sh4_instr.inc similarity index 100% rename from src/cpu/frontend/sh4/sh4_instr.inc rename to src/jit/frontend/sh4/sh4_instr.inc diff --git a/src/cpu/ir/ir_builder.cc b/src/jit/ir/ir_builder.cc similarity index 99% rename from src/cpu/ir/ir_builder.cc rename to src/jit/ir/ir_builder.cc index 1c368fcc..f50c0f9d 100644 --- a/src/cpu/ir/ir_builder.cc +++ b/src/jit/ir/ir_builder.cc @@ -1,14 +1,14 @@ #include #include #include -#include "cpu/ir/ir_builder.h" +#include "jit/ir/ir_builder.h" -using namespace dreavm::cpu; -using namespace dreavm::cpu::ir; +using namespace dreavm::jit; +using namespace dreavm::jit::ir; -const char *dreavm::cpu::ir::Opnames[NUM_OPCODES] = { +const char *dreavm::jit::ir::Opnames[NUM_OPCODES] = { #define IR_OP(name) #name, -#include "cpu/ir/ir_ops.inc" +#include "jit/ir/ir_ops.inc" }; // diff --git a/src/cpu/ir/ir_builder.h b/src/jit/ir/ir_builder.h similarity index 99% rename from src/cpu/ir/ir_builder.h rename to src/jit/ir/ir_builder.h index 51b1819e..ed63ab96 100644 --- a/src/cpu/ir/ir_builder.h +++ b/src/jit/ir/ir_builder.h @@ -5,12 +5,12 @@ #include "core/core.h" namespace dreavm { -namespace cpu { +namespace jit { namespace ir { enum Opcode { #define IR_OP(name) OP_##name, -#include "cpu/ir/ir_ops.inc" +#include "jit/ir/ir_ops.inc" #undef IR_OP NUM_OPCODES }; diff --git a/src/cpu/ir/ir_ops.inc b/src/jit/ir/ir_ops.inc similarity index 100% rename from src/cpu/ir/ir_ops.inc rename to src/jit/ir/ir_ops.inc diff --git a/src/cpu/ir/passes/constant_propagation_pass.cc b/src/jit/ir/passes/constant_propagation_pass.cc similarity index 98% rename from src/cpu/ir/passes/constant_propagation_pass.cc rename to src/jit/ir/passes/constant_propagation_pass.cc index 326ad6c8..e12e9028 100644 --- a/src/cpu/ir/passes/constant_propagation_pass.cc +++ b/src/jit/ir/passes/constant_propagation_pass.cc @@ -1,11 +1,11 @@ #include #include #include "core/core.h" -#include "cpu/ir/passes/constant_propagation_pass.h" #include "emu/profiler.h" +#include "jit/ir/passes/constant_propagation_pass.h" -using namespace dreavm::cpu::ir; -using namespace dreavm::cpu::ir::passes; +using namespace dreavm::jit::ir; +using namespace dreavm::jit::ir::passes; typedef void (*FoldFn)(IRBuilder &, Block *, Instr *i); diff --git a/src/cpu/ir/passes/constant_propagation_pass.h b/src/jit/ir/passes/constant_propagation_pass.h similarity index 81% rename from src/cpu/ir/passes/constant_propagation_pass.h rename to src/jit/ir/passes/constant_propagation_pass.h index 41046a88..7e41f3c5 100644 --- a/src/cpu/ir/passes/constant_propagation_pass.h +++ b/src/jit/ir/passes/constant_propagation_pass.h @@ -1,10 +1,10 @@ #ifndef CONSTANT_PROPAGATION_PASS_H #define CONSTANT_PROPAGATION_PASS_H -#include "cpu/ir/passes/pass_runner.h" +#include "jit/ir/passes/pass_runner.h" namespace dreavm { -namespace cpu { +namespace jit { namespace ir { namespace passes { diff --git a/src/cpu/ir/passes/context_promotion_pass.cc b/src/jit/ir/passes/context_promotion_pass.cc similarity index 96% rename from src/cpu/ir/passes/context_promotion_pass.cc rename to src/jit/ir/passes/context_promotion_pass.cc index a19acbe4..c95f507e 100644 --- a/src/cpu/ir/passes/context_promotion_pass.cc +++ b/src/jit/ir/passes/context_promotion_pass.cc @@ -1,9 +1,9 @@ #include "core/core.h" -#include "cpu/ir/passes/context_promotion_pass.h" #include "emu/profiler.h" +#include "jit/ir/passes/context_promotion_pass.h" -using namespace dreavm::cpu::ir; -using namespace dreavm::cpu::ir::passes; +using namespace dreavm::jit::ir; +using namespace dreavm::jit::ir::passes; void ContextPromotionPass::Run(IRBuilder &builder) { PROFILER_RUNTIME("ContextPromotionPass::Run"); diff --git a/src/cpu/ir/passes/context_promotion_pass.h b/src/jit/ir/passes/context_promotion_pass.h similarity index 90% rename from src/cpu/ir/passes/context_promotion_pass.h rename to src/jit/ir/passes/context_promotion_pass.h index daaeb4e8..092ac89f 100644 --- a/src/cpu/ir/passes/context_promotion_pass.h +++ b/src/jit/ir/passes/context_promotion_pass.h @@ -2,10 +2,10 @@ #define CONTEXT_PROMOTION_PASS_H #include -#include "cpu/ir/passes/pass_runner.h" +#include "jit/ir/passes/pass_runner.h" namespace dreavm { -namespace cpu { +namespace jit { namespace ir { namespace passes { diff --git a/src/cpu/ir/passes/control_flow_analysis_pass.cc b/src/jit/ir/passes/control_flow_analysis_pass.cc similarity index 85% rename from src/cpu/ir/passes/control_flow_analysis_pass.cc rename to src/jit/ir/passes/control_flow_analysis_pass.cc index 26d7794f..ab91555f 100644 --- a/src/cpu/ir/passes/control_flow_analysis_pass.cc +++ b/src/jit/ir/passes/control_flow_analysis_pass.cc @@ -1,9 +1,9 @@ #include "core/core.h" -#include "cpu/ir/passes/control_flow_analysis_pass.h" #include "emu/profiler.h" +#include "jit/ir/passes/control_flow_analysis_pass.h" -using namespace dreavm::cpu::ir; -using namespace dreavm::cpu::ir::passes; +using namespace dreavm::jit::ir; +using namespace dreavm::jit::ir::passes; void ControlFlowAnalysisPass::Run(IRBuilder &builder) { PROFILER_RUNTIME("ControlFlowAnalysisPass::Run"); diff --git a/src/cpu/ir/passes/control_flow_analysis_pass.h b/src/jit/ir/passes/control_flow_analysis_pass.h similarity index 81% rename from src/cpu/ir/passes/control_flow_analysis_pass.h rename to src/jit/ir/passes/control_flow_analysis_pass.h index 236e2230..af7b0d2f 100644 --- a/src/cpu/ir/passes/control_flow_analysis_pass.h +++ b/src/jit/ir/passes/control_flow_analysis_pass.h @@ -1,10 +1,10 @@ #ifndef CONTROL_FLOW_ANALYSIS_PASS_H #define CONTROL_FLOW_ANALYSIS_PASS_H -#include "cpu/ir/passes/pass_runner.h" +#include "jit/ir/passes/pass_runner.h" namespace dreavm { -namespace cpu { +namespace jit { namespace ir { namespace passes { diff --git a/src/cpu/ir/passes/pass_runner.cc b/src/jit/ir/passes/pass_runner.cc similarity index 68% rename from src/cpu/ir/passes/pass_runner.cc rename to src/jit/ir/passes/pass_runner.cc index 86eb746b..b02dd2c5 100644 --- a/src/cpu/ir/passes/pass_runner.cc +++ b/src/jit/ir/passes/pass_runner.cc @@ -1,10 +1,10 @@ #include "core/core.h" -#include "cpu/ir/ir_builder.h" -#include "cpu/ir/passes/pass_runner.h" #include "emu/profiler.h" +#include "jit/ir/ir_builder.h" +#include "jit/ir/passes/pass_runner.h" -using namespace dreavm::cpu::ir; -using namespace dreavm::cpu::ir::passes; +using namespace dreavm::jit::ir; +using namespace dreavm::jit::ir::passes; PassRunner::PassRunner() {} diff --git a/src/cpu/ir/passes/pass_runner.h b/src/jit/ir/passes/pass_runner.h similarity index 90% rename from src/cpu/ir/passes/pass_runner.h rename to src/jit/ir/passes/pass_runner.h index 3fa82e81..ec6d3922 100644 --- a/src/cpu/ir/passes/pass_runner.h +++ b/src/jit/ir/passes/pass_runner.h @@ -3,10 +3,10 @@ #include #include -#include "cpu/ir/ir_builder.h" +#include "jit/ir/ir_builder.h" namespace dreavm { -namespace cpu { +namespace jit { namespace ir { namespace passes { diff --git a/src/cpu/ir/passes/register_allocation_pass.cc b/src/jit/ir/passes/register_allocation_pass.cc similarity index 98% rename from src/cpu/ir/passes/register_allocation_pass.cc rename to src/jit/ir/passes/register_allocation_pass.cc index 32bb959c..b9ad1741 100644 --- a/src/cpu/ir/passes/register_allocation_pass.cc +++ b/src/jit/ir/passes/register_allocation_pass.cc @@ -1,10 +1,10 @@ #include "core/core.h" -#include "cpu/ir/passes/register_allocation_pass.h" #include "emu/profiler.h" +#include "jit/ir/passes/register_allocation_pass.h" -using namespace dreavm::cpu::backend; -using namespace dreavm::cpu::ir; -using namespace dreavm::cpu::ir::passes; +using namespace dreavm::jit::backend; +using namespace dreavm::jit::ir; +using namespace dreavm::jit::ir::passes; static inline int GetOrdinal(const Instr *i) { return (int)i->tag(); } diff --git a/src/cpu/ir/passes/register_allocation_pass.h b/src/jit/ir/passes/register_allocation_pass.h similarity index 94% rename from src/cpu/ir/passes/register_allocation_pass.h rename to src/jit/ir/passes/register_allocation_pass.h index 955755ac..c448f3f3 100644 --- a/src/cpu/ir/passes/register_allocation_pass.h +++ b/src/jit/ir/passes/register_allocation_pass.h @@ -2,11 +2,11 @@ #define REGISTER_ALLOCATION_PASS_H #include "core/ring_buffer.h" -#include "cpu/backend/backend.h" -#include "cpu/ir/passes/pass_runner.h" +#include "jit/backend/backend.h" +#include "jit/ir/passes/pass_runner.h" namespace dreavm { -namespace cpu { +namespace jit { namespace ir { namespace passes { diff --git a/src/cpu/ir/passes/validate_pass.cc b/src/jit/ir/passes/validate_pass.cc similarity index 89% rename from src/cpu/ir/passes/validate_pass.cc rename to src/jit/ir/passes/validate_pass.cc index 910be881..aa646971 100644 --- a/src/cpu/ir/passes/validate_pass.cc +++ b/src/jit/ir/passes/validate_pass.cc @@ -1,9 +1,9 @@ #include "core/core.h" -#include "cpu/ir/passes/validate_pass.h" #include "emu/profiler.h" +#include "jit/ir/passes/validate_pass.h" -using namespace dreavm::cpu::ir; -using namespace dreavm::cpu::ir::passes; +using namespace dreavm::jit::ir; +using namespace dreavm::jit::ir::passes; void ValidatePass::Run(IRBuilder &builder) { PROFILER_RUNTIME("ValidatePass::Run"); diff --git a/src/cpu/ir/passes/validate_pass.h b/src/jit/ir/passes/validate_pass.h similarity index 85% rename from src/cpu/ir/passes/validate_pass.h rename to src/jit/ir/passes/validate_pass.h index 6cfdafd8..c6825227 100644 --- a/src/cpu/ir/passes/validate_pass.h +++ b/src/jit/ir/passes/validate_pass.h @@ -1,10 +1,10 @@ #ifndef VALIDATE_BLOCK_PASS_H #define VALIDATE_BLOCK_PASS_H -#include "cpu/ir/passes/pass_runner.h" +#include "jit/ir/passes/pass_runner.h" namespace dreavm { -namespace cpu { +namespace jit { namespace ir { namespace passes { diff --git a/src/cpu/runtime.cc b/src/jit/runtime.cc similarity index 82% rename from src/cpu/runtime.cc rename to src/jit/runtime.cc index 6178c642..ae4c4539 100644 --- a/src/cpu/runtime.cc +++ b/src/jit/runtime.cc @@ -1,19 +1,19 @@ -#include "cpu/backend/backend.h" -#include "cpu/frontend/frontend.h" -#include "cpu/ir/ir_builder.h" -#include "cpu/ir/passes/constant_propagation_pass.h" -#include "cpu/ir/passes/context_promotion_pass.h" -#include "cpu/ir/passes/control_flow_analysis_pass.h" -#include "cpu/ir/passes/register_allocation_pass.h" -#include "cpu/ir/passes/validate_pass.h" -#include "cpu/runtime.h" #include "emu/profiler.h" +#include "jit/backend/backend.h" +#include "jit/frontend/frontend.h" +#include "jit/ir/ir_builder.h" +#include "jit/ir/passes/constant_propagation_pass.h" +#include "jit/ir/passes/context_promotion_pass.h" +#include "jit/ir/passes/control_flow_analysis_pass.h" +#include "jit/ir/passes/register_allocation_pass.h" +#include "jit/ir/passes/validate_pass.h" +#include "jit/runtime.h" -using namespace dreavm::cpu; -using namespace dreavm::cpu::backend; -using namespace dreavm::cpu::ir; -using namespace dreavm::cpu::ir::passes; -using namespace dreavm::emu; +using namespace dreavm::hw; +using namespace dreavm::jit; +using namespace dreavm::jit::backend; +using namespace dreavm::jit::ir; +using namespace dreavm::jit::ir::passes; // executable code sits between 0x0c000000 and 0x0d000000 (16mb). each instr // is 2 bytes, making for a maximum of 0x1000000 >> 1 blocks diff --git a/src/cpu/runtime.h b/src/jit/runtime.h similarity index 73% rename from src/cpu/runtime.h rename to src/jit/runtime.h index f32c1103..ec5f1bc2 100644 --- a/src/cpu/runtime.h +++ b/src/jit/runtime.h @@ -1,11 +1,11 @@ #ifndef RUNTIME_H #define RUNTIME_H -#include "cpu/ir/passes/pass_runner.h" -#include "emu/memory.h" +#include "hw/memory.h" +#include "jit/ir/passes/pass_runner.h" namespace dreavm { -namespace cpu { +namespace jit { namespace backend { class Backend; @@ -21,7 +21,7 @@ class RuntimeBlock { virtual ~RuntimeBlock() {} int guest_cycles() { return guest_cycles_; } - virtual uint32_t Call(emu::Memory *memory, void *guest_ctx) = 0; + virtual uint32_t Call(hw::Memory *memory, void *guest_ctx) = 0; virtual void Dump() = 0; private: @@ -30,11 +30,11 @@ class RuntimeBlock { class Runtime { public: - Runtime(emu::Memory &memory, frontend::Frontend &frontend, + Runtime(hw::Memory &memory, frontend::Frontend &frontend, backend::Backend &backend); ~Runtime(); - emu::Memory &memory() { return memory_; } + hw::Memory &memory() { return memory_; } RuntimeBlock *GetBlock(uint32_t addr, const void *guest_ctx); void ResetBlocks(); @@ -42,7 +42,7 @@ class Runtime { private: RuntimeBlock *CompileBlock(uint32_t addr, const void *guest_ctx); - emu::Memory &memory_; + hw::Memory &memory_; frontend::Frontend &frontend_; backend::Backend &backend_; ir::passes::PassRunner pass_runner_; diff --git a/src/trace/trace.cc b/src/trace/trace.cc index b9eb8b6d..d98b7d8d 100644 --- a/src/trace/trace.cc +++ b/src/trace/trace.cc @@ -3,7 +3,7 @@ #include "trace/trace.h" using namespace dreavm::core; -using namespace dreavm::holly; +using namespace dreavm::hw::holly; using namespace dreavm::trace; void dreavm::trace::GetNextTraceFilename(char *filename, size_t size) { diff --git a/src/trace/trace.h b/src/trace/trace.h index e05e26fc..feecc76c 100644 --- a/src/trace/trace.h +++ b/src/trace/trace.h @@ -1,7 +1,7 @@ #ifndef TRACE_H #define TRACE_H -#include "holly/tile_accelerator.h" +#include "hw/holly/tile_accelerator.h" namespace dreavm { namespace trace { @@ -22,8 +22,8 @@ struct TraceCommand { // and patched to absolute pointers on read union { struct { - holly::TSP tsp; - holly::TCW tcw; + hw::holly::TSP tsp; + hw::holly::TCW tcw; uint32_t palette_size; const uint8_t *palette; uint32_t texture_size; @@ -38,9 +38,9 @@ struct TraceCommand { uint32_t pal_pxl_format; uint32_t video_width; uint32_t video_height; - holly::ISP_TSP bg_isp; - holly::TSP bg_tsp; - holly::TCW bg_tcw; + hw::holly::ISP_TSP bg_isp; + hw::holly::TSP bg_tsp; + hw::holly::TCW bg_tcw; float bg_depth; uint32_t bg_vertices_size; const uint8_t *bg_vertices; @@ -78,10 +78,10 @@ class TraceWriter { bool Open(const char *filename); void Close(); - void WriteInsertTexture(const holly::TSP &tsp, const holly::TCW &tcw, + void WriteInsertTexture(const hw::holly::TSP &tsp, const hw::holly::TCW &tcw, const uint8_t *palette, int palette_size, const uint8_t *texture, int texture_size); - void WriteRenderContext(holly::TileContext *tactx); + void WriteRenderContext(hw::holly::TileContext *tactx); private: FILE *file_; diff --git a/src/trace/trace_viewer.cc b/src/trace/trace_viewer.cc index d37a5f9a..510be3f3 100644 --- a/src/trace/trace_viewer.cc +++ b/src/trace/trace_viewer.cc @@ -1,12 +1,12 @@ #include #include "core/core.h" -#include "holly/tile_accelerator.h" +#include "hw/holly/tile_accelerator.h" #include "renderer/gl_backend.h" #include "trace/trace.h" #include "trace/trace_viewer.h" using namespace dreavm::core; -using namespace dreavm::holly; +using namespace dreavm::hw::holly; using namespace dreavm::renderer; using namespace dreavm::system; using namespace dreavm::trace; diff --git a/src/trace/trace_viewer.h b/src/trace/trace_viewer.h index 251e9b45..e82e4977 100644 --- a/src/trace/trace_viewer.h +++ b/src/trace/trace_viewer.h @@ -3,7 +3,7 @@ #include #include -#include "holly/tile_renderer.h" +#include "hw/holly/tile_renderer.h" #include "system/system.h" #include "trace/trace.h" @@ -11,25 +11,25 @@ namespace dreavm { namespace trace { struct TextureInst { - holly::TSP tsp; - holly::TCW tcw; + hw::holly::TSP tsp; + hw::holly::TCW tcw; const uint8_t *palette; const uint8_t *texture; renderer::TextureHandle handle; }; -class TraceTextureCache : public holly::TextureCache { +class TraceTextureCache : public hw::holly::TextureCache { public: - void AddTexture(const holly::TSP &tsp, holly::TCW &tcw, + void AddTexture(const hw::holly::TSP &tsp, hw::holly::TCW &tcw, const uint8_t *palette, const uint8_t *texture); - void RemoveTexture(const holly::TSP &tsp, holly::TCW &tcw); + void RemoveTexture(const hw::holly::TSP &tsp, hw::holly::TCW &tcw); renderer::TextureHandle GetTexture( - const holly::TSP &tsp, const holly::TCW &tcw, - holly::RegisterTextureCallback register_cb); + const hw::holly::TSP &tsp, const hw::holly::TCW &tcw, + hw::holly::RegisterTextureCallback register_cb); private: - std::unordered_map textures_; + std::unordered_map textures_; }; class TraceViewer { @@ -47,20 +47,21 @@ class TraceViewer { void RenderFrame(); int GetNumFrames(); - void CopyCommandToContext(const TraceCommand *cmd, holly::TileContext *ctx); + void CopyCommandToContext(const TraceCommand *cmd, + hw::holly::TileContext *ctx); void PrevContext(); void NextContext(); system::System sys_; TraceTextureCache texcache_; - holly::TileRenderer tile_renderer_; + hw::holly::TileRenderer tile_renderer_; renderer::Backend *rb_; TraceReader reader_; TraceCommand *current_cmd_; int num_frames_; int current_frame_; - holly::TileContext current_ctx_; + hw::holly::TileContext current_ctx_; }; } } diff --git a/test/sh4_test.cc b/test/sh4_test.cc index ffc1ab00..550cff5d 100644 --- a/test/sh4_test.cc +++ b/test/sh4_test.cc @@ -1,8 +1,8 @@ #include "sh4_test.h" -#include "cpu/sh4.h" +#include "jit/frontend/sh4/sh4_context.h" using namespace dreavm; -using namespace dreavm::cpu; +using namespace dreavm::jit::frontend::sh4; SH4CTXReg sh4ctx_reg[] = { #define SH4CTX(name, member, type) \ diff --git a/test/test_sh4.cc b/test/test_sh4.cc index adf34f28..68eee745 100644 --- a/test/test_sh4.cc +++ b/test/test_sh4.cc @@ -2,23 +2,25 @@ #include #include "gtest/gtest.h" #include "core/core.h" -#include "cpu/frontend/sh4/sh4_frontend.h" -#include "cpu/backend/interpreter/interpreter_backend.h" -#include "cpu/backend/x64/x64_backend.h" -#include "cpu/sh4.h" -#include "emu/memory.h" +#include "hw/sh4/sh4.h" +#include "hw/memory.h" +#include "jit/frontend/sh4/sh4_frontend.h" +#include "jit/backend/interpreter/interpreter_backend.h" +#include "jit/backend/x64/x64_backend.h" #include "sh4_test.h" using namespace dreavm; -using namespace dreavm::cpu; -using namespace dreavm::cpu::backend::interpreter; -using namespace dreavm::cpu::backend::x64; -using namespace dreavm::cpu::frontend::sh4; using namespace dreavm::core; -using namespace dreavm::emu; +using namespace dreavm::hw; +using namespace dreavm::hw::sh4; +using namespace dreavm::jit; +using namespace dreavm::jit::backend::interpreter; +using namespace dreavm::jit::backend::x64; +using namespace dreavm::jit::frontend::sh4; namespace dreavm { -namespace cpu { +namespace hw { +namespace sh4 { template void RunSH4Test(const SH4Test &test) { @@ -73,6 +75,7 @@ void RunSH4Test(const SH4Test &test) { } } } +} #define SH4_TEST(name, ...) \ TEST(sh4_interpreter, name) { \