summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Olivier Galibert <galibert@pobox.com>2020-05-21 10:46:01 +0200
committer Olivier Galibert <galibert@pobox.com>2020-05-21 10:46:20 +0200
commit941e06150bef625cb8bf1d58139563bb5c828b2d (patch)
tree19faca21365d66e5480a9cf349d502cc676ca802
parentf739a74f08bdbdd2d45abb5f9fca2418ef4ab0f7 (diff)
emumem: Another slight speedup. masking before dispatch at top level is not needed because it's already done at the global mask level. [O. Galibert]
-rw-r--r--src/emu/emumem.cpp20
-rw-r--r--src/emu/emumem.h24
-rw-r--r--src/emu/emumem_hedr.h2
-rw-r--r--src/emu/emumem_hedr.ipp3
-rw-r--r--src/emu/emumem_hedw.h2
-rw-r--r--src/emu/emumem_hedw.ipp3
6 files changed, 21 insertions, 33 deletions
diff --git a/src/emu/emumem.cpp b/src/emu/emumem.cpp
index 1881bbbc013..af2aae5c104 100644
--- a/src/emu/emumem.cpp
+++ b/src/emu/emumem.cpp
@@ -80,7 +80,7 @@ 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
+template<int Width, int AddrShift, int Endian> void handler_entry_read<Width, AddrShift, Endian>::get_dispatch(handler_entry_read<Width, AddrShift, Endian> *const *&dispatch, u8 &shift) const
{
fatalerror("get_dispatch called on non-dispatching class\n");
}
@@ -131,7 +131,7 @@ 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
+template<int Width, int AddrShift, int Endian> void handler_entry_write<Width, AddrShift, Endian>::get_dispatch(handler_entry_write<Width, AddrShift, Endian> *const *&dispatch, u8 &shift) const
{
fatalerror("get_dispatch called on non-dispatching class\n");
}
@@ -301,8 +301,6 @@ class address_space_specific : public address_space
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;
@@ -521,8 +519,8 @@ public:
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);
+ m_root_read->get_dispatch(m_dispatch_read, m_shift_read);
+ m_root_write->get_dispatch(m_dispatch_write, m_shift_write);
}
void *create_cache() override {
@@ -530,7 +528,7 @@ public:
}
void *create_specific() override {
- return new memory_access_specific<Width, AddrShift, Endian>(*this, m_dispatch_read, m_mask_read, m_shift_read, m_dispatch_write, m_mask_write, m_shift_write);
+ return new memory_access_specific<Width, AddrShift, Endian>(*this, m_dispatch_read, m_shift_read, m_dispatch_write, m_shift_write);
}
void delayed_ref(handler_entry *e) {
@@ -597,25 +595,25 @@ public:
// native read
NativeType read_native(offs_t offset, NativeType mask)
{
- return dispatch_read<Width, AddrShift, Endian>(m_mask_read, m_shift_read, offset, mask, m_dispatch_read);;
+ return dispatch_read<Width, AddrShift, Endian>(offs_t(-1), m_shift_read, offset, mask, m_dispatch_read);;
}
// mask-less native read
NativeType read_native(offs_t offset)
{
- return dispatch_read<Width, AddrShift, Endian>(m_mask_read, m_shift_read, offset, uX(0xffffffffffffffffU), m_dispatch_read);;
+ return dispatch_read<Width, AddrShift, Endian>(offs_t(-1), m_shift_read, offset, uX(0xffffffffffffffffU), m_dispatch_read);;
}
// native write
void write_native(offs_t offset, NativeType data, NativeType mask)
{
- dispatch_write<Width, AddrShift, Endian>(m_mask_write, m_shift_write, offset, data, mask, m_dispatch_write);;
+ dispatch_write<Width, AddrShift, Endian>(offs_t(-1), m_shift_write, offset, data, mask, m_dispatch_write);;
}
// mask-less native write
void write_native(offs_t offset, NativeType data)
{
- dispatch_write<Width, AddrShift, Endian>(m_mask_write, m_shift_write, offset, data, uX(0xffffffffffffffffU), m_dispatch_write);;
+ dispatch_write<Width, AddrShift, Endian>(offs_t(-1), m_shift_write, offset, data, uX(0xffffffffffffffffU), m_dispatch_write);;
}
// virtual access to these functions
diff --git a/src/emu/emumem.h b/src/emu/emumem.h
index bc4063e671e..e2fcced391e 100644
--- a/src/emu/emumem.h
+++ b/src/emu/emumem.h
@@ -599,7 +599,7 @@ public:
virtual void detach(const std::unordered_set<handler_entry *> &handlers);
// Return the internal structures of the root dispatch
- virtual void get_dispatch(handler_entry_read<Width, AddrShift, Endian> *const *&dispatch, offs_t &mask, u8 &shift) const;
+ virtual void get_dispatch(handler_entry_read<Width, AddrShift, Endian> *const *&dispatch, u8 &shift) const;
};
// =====================-> The parent class of all write handlers
@@ -671,7 +671,7 @@ public:
virtual void detach(const std::unordered_set<handler_entry *> &handlers);
// Return the internal structures of the root dispatch
- virtual void get_dispatch(handler_entry_write<Width, AddrShift, Endian> *const *&dispatch, offs_t &mask, u8 &shift) const;
+ virtual void get_dispatch(handler_entry_write<Width, AddrShift, Endian> *const *&dispatch, u8 &shift) const;
};
// =====================-> Passthrough handler management structure
@@ -989,10 +989,8 @@ template<int Width, int AddrShift, int Endian> class memory_access_specific
public:
// construction/destruction
memory_access_specific(address_space &space,
- handler_entry_read <Width, AddrShift, Endian> *const *dispatch_read,
- offs_t mask_read, u8 shift_read,
- handler_entry_write<Width, AddrShift, Endian> *const *dispatch_write,
- offs_t mask_write, u8 shift_write);
+ handler_entry_read <Width, AddrShift, Endian> *const *dispatch_read, u8 shift_read,
+ handler_entry_write<Width, AddrShift, Endian> *const *dispatch_write, u8 shift_write);
// getters
@@ -1033,17 +1031,15 @@ private:
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;
NativeType read_native(offs_t address, NativeType mask = ~NativeType(0)) {
- return dispatch_read<Width, AddrShift, Endian>(m_mask_read, m_shift_read, address, mask, m_dispatch_read);;
+ return dispatch_read<Width, AddrShift, Endian>(offs_t(-1), m_shift_read, address, mask, m_dispatch_read);;
}
void write_native(offs_t address, NativeType data, NativeType mask = ~NativeType(0)) {
- dispatch_write<Width, AddrShift, Endian>(m_mask_write, m_shift_write, address, data, mask, m_dispatch_write);;
+ dispatch_write<Width, AddrShift, Endian>(offs_t(-1), m_shift_write, address, data, mask, m_dispatch_write);;
}
};
@@ -1934,16 +1930,12 @@ void memory_passthrough_handler::remove()
}
template<int Width, int AddrShift, int Endian> memory_access_specific<Width, AddrShift, Endian>::memory_access_specific(address_space &space,
- handler_entry_read <Width, AddrShift, Endian> *const *dispatch_read,
- offs_t mask_read, u8 shift_read,
- handler_entry_write<Width, AddrShift, Endian> *const *dispatch_write,
- offs_t mask_write, u8 shift_write)
+ handler_entry_read <Width, AddrShift, Endian> *const *dispatch_read, u8 shift_read,
+ handler_entry_write<Width, AddrShift, Endian> *const *dispatch_write, u8 shift_write)
: m_space(space),
m_addrmask(space.addrmask()),
m_dispatch_read(dispatch_read),
m_dispatch_write(dispatch_write),
- m_mask_read(mask_read),
- m_mask_write(mask_write),
m_shift_read(shift_read),
m_shift_write(shift_write)
{
diff --git a/src/emu/emumem_hedr.h b/src/emu/emumem_hedr.h
index 223c530c551..90dfab6d130 100644
--- a/src/emu/emumem_hedr.h
+++ b/src/emu/emumem_hedr.h
@@ -35,7 +35,7 @@ public:
void enumerate_references(handler_entry::reflist &refs) const override;
- virtual void get_dispatch(handler_entry_read<Width, AddrShift, Endian> *const *&dispatch, offs_t &mask, u8 &shift) const override;
+ virtual void get_dispatch(handler_entry_read<Width, AddrShift, Endian> *const *&dispatch, u8 &shift) const override;
protected:
static constexpr u32 LowBits = emu::detail::handler_entry_dispatch_lowbits(HighBits, Width, AddrShift);
diff --git a/src/emu/emumem_hedr.ipp b/src/emu/emumem_hedr.ipp
index 4e084587e06..1f4484d0a15 100644
--- a/src/emu/emumem_hedr.ipp
+++ b/src/emu/emumem_hedr.ipp
@@ -9,10 +9,9 @@
#include "emumem_hep.h"
#include "emumem_hedr.h"
-template<int HighBits, int Width, int AddrShift, int Endian> void handler_entry_read_dispatch<HighBits, Width, AddrShift, Endian>::get_dispatch(handler_entry_read<Width, AddrShift, Endian> *const *&dispatch, offs_t &mask, u8 &shift) const
+template<int HighBits, int Width, int AddrShift, int Endian> void handler_entry_read_dispatch<HighBits, Width, AddrShift, Endian>::get_dispatch(handler_entry_read<Width, AddrShift, Endian> *const *&dispatch, u8 &shift) const
{
dispatch = m_dispatch;
- mask = BITMASK;
shift = LowBits;
}
diff --git a/src/emu/emumem_hedw.h b/src/emu/emumem_hedw.h
index 7109c70c9cc..d0986893d6e 100644
--- a/src/emu/emumem_hedw.h
+++ b/src/emu/emumem_hedw.h
@@ -35,7 +35,7 @@ public:
void enumerate_references(handler_entry::reflist &refs) const override;
- virtual void get_dispatch(handler_entry_write<Width, AddrShift, Endian> *const *&dispatch, offs_t &mask, u8 &shift) const override;
+ virtual void get_dispatch(handler_entry_write<Width, AddrShift, Endian> *const *&dispatch, u8 &shift) const override;
protected:
static constexpr u32 LowBits = emu::detail::handler_entry_dispatch_lowbits(HighBits, Width, AddrShift);
diff --git a/src/emu/emumem_hedw.ipp b/src/emu/emumem_hedw.ipp
index bf2786a0749..23b0c70572b 100644
--- a/src/emu/emumem_hedw.ipp
+++ b/src/emu/emumem_hedw.ipp
@@ -10,10 +10,9 @@
#include "emumem_hedw.h"
-template<int HighBits, int Width, int AddrShift, int Endian> void handler_entry_write_dispatch<HighBits, Width, AddrShift, Endian>::get_dispatch(handler_entry_write<Width, AddrShift, Endian> *const *&dispatch, offs_t &mask, u8 &shift) const
+template<int HighBits, int Width, int AddrShift, int Endian> void handler_entry_write_dispatch<HighBits, Width, AddrShift, Endian>::get_dispatch(handler_entry_write<Width, AddrShift, Endian> *const *&dispatch, u8 &shift) const
{
dispatch = m_dispatch;
- mask = BITMASK;
shift = LowBits;
}