summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/emumem.cpp
diff options
context:
space:
mode:
author Olivier Galibert <galibert@pobox.com>2020-05-19 17:53:14 +0200
committer Olivier Galibert <galibert@pobox.com>2020-05-19 18:34:11 +0200
commitbeb60b87210329da52391e3275b4ecc6825a3052 (patch)
tree984c622d9dd085e44b10e69a2e5aa8aab0bbf819 /src/emu/emumem.cpp
parentef8bb312d8b89201b09e3e5ba4c3b47c3dc7046f (diff)
emumem: Slight speedup [O. Galibert]
Diffstat (limited to 'src/emu/emumem.cpp')
-rw-r--r--src/emu/emumem.cpp28
1 files changed, 24 insertions, 4 deletions
diff --git a/src/emu/emumem.cpp b/src/emu/emumem.cpp
index f800d09c91f..edf76418e5a 100644
--- a/src/emu/emumem.cpp
+++ b/src/emu/emumem.cpp
@@ -80,6 +80,11 @@ void handler_entry::enumerate_references(handler_entry::reflist &refs) const
{
}
+template<int Width, int AddrShift, int Endian> void handler_entry_read<Width, AddrShift, Endian>::get_dispatch(handler_entry_read<Width, AddrShift, Endian> *const *&dispatch, offs_t &mask, u8 &shift) const
+{
+ fatalerror("get_dispatch called on non-dispatching class\n");
+}
+
template<int Width, int AddrShift, int Endian> void handler_entry_read<Width, AddrShift, Endian>::populate_nomirror(offs_t start, offs_t end, offs_t ostart, offs_t oend, handler_entry_read<Width, AddrShift, Endian> *handler)
{
fatalerror("populate called on non-dispatching class\n");
@@ -126,6 +131,11 @@ template<int Width, int AddrShift, int Endian> void handler_entry_read<Width, Ad
}
+template<int Width, int AddrShift, int Endian> void handler_entry_write<Width, AddrShift, Endian>::get_dispatch(handler_entry_write<Width, AddrShift, Endian> *const *&dispatch, offs_t &mask, u8 &shift) const
+{
+ fatalerror("get_dispatch called on non-dispatching class\n");
+}
+
template<int Width, int AddrShift, int Endian> void handler_entry_write<Width, AddrShift, Endian>::populate_nomirror(offs_t start, offs_t end, offs_t ostart, offs_t oend, handler_entry_write<Width, AddrShift, Endian> *handler)
{
fatalerror("populate called on non-dispatching class\n");
@@ -289,6 +299,13 @@ class address_space_specific : public address_space
static constexpr offs_t offset_to_byte(offs_t offset) { return AddrShift < 0 ? offset << iabs(AddrShift) : offset >> iabs(AddrShift); }
public:
+ handler_entry_read<Width, AddrShift, Endian> *const *m_dispatch_read;
+ handler_entry_write<Width, AddrShift, Endian> *const *m_dispatch_write;
+ offs_t m_mask_read;
+ offs_t m_mask_write;
+ u8 m_shift_read;
+ u8 m_shift_write;
+
std::string get_handler_string(read_or_write readorwrite, offs_t byteaddress) const override;
void dump_maps(std::vector<memory_entry> &read_map, std::vector<memory_entry> &write_map) const override;
@@ -503,6 +520,9 @@ public:
case 32: m_root_read = new handler_entry_read_dispatch<32, Width, AddrShift, Endian>(this, r, nullptr); m_root_write = new handler_entry_write_dispatch<32, Width, AddrShift, Endian>(this, r, nullptr); break;
default: fatalerror("Unhandled address bus width %d\n", address_width);
}
+
+ m_root_read->get_dispatch(m_dispatch_read, m_mask_read, m_shift_read);
+ m_root_write->get_dispatch(m_dispatch_write, m_mask_write, m_shift_write);
}
void *create_cache() override {
@@ -575,7 +595,7 @@ public:
{
g_profiler.start(PROFILER_MEMREAD);
- uX result = m_root_read->read(offset, mask);
+ uX result = dispatch_read<Width, AddrShift, Endian>(m_mask_read, m_shift_read, offset, mask, m_dispatch_read);;
g_profiler.stop();
return result;
@@ -586,7 +606,7 @@ public:
{
g_profiler.start(PROFILER_MEMREAD);
- uX result = m_root_read->read(offset, uX(0xffffffffffffffffU));
+ uX result = dispatch_read<Width, AddrShift, Endian>(m_mask_read, m_shift_read, offset, uX(0xffffffffffffffffU), m_dispatch_read);;
g_profiler.stop();
return result;
@@ -597,7 +617,7 @@ public:
{
g_profiler.start(PROFILER_MEMWRITE);
- m_root_write->write(offset, data, mask);
+ dispatch_write<Width, AddrShift, Endian>(m_mask_write, m_shift_write, offset, data, mask, m_dispatch_write);;
g_profiler.stop();
}
@@ -607,7 +627,7 @@ public:
{
g_profiler.start(PROFILER_MEMWRITE);
- m_root_write->write(offset, data, uX(0xffffffffffffffffU));
+ dispatch_write<Width, AddrShift, Endian>(m_mask_write, m_shift_write, offset, data, uX(0xffffffffffffffffU), m_dispatch_write);;
g_profiler.stop();
}