[perf] core: arm7tdmi: Re-arange some fields inside of CPU

Also, clean up some of the cfg(debug) mess

benchmark report:

run_60_frames           time:   [110.61 ms 111.01 ms 111.42 ms]
                        change: [-7.1171% -6.5425% -5.9132%] (p = 0.00 < 0.05)
                        Performance has improved.


Former-commit-id: 9cb82e483c8a78632d0deae20adca9fc1843a76b
Former-commit-id: 6d9be5ddaf72f2b9c02063fa067f2ffbaea4fdb6
This commit is contained in:
Michel Heily 2020-11-24 00:54:18 +02:00
parent 586a5bf16c
commit cb2b97e0c7

View file

@ -82,11 +82,37 @@ pub struct SavedCpuState {
pub cpsr: RegPSR, pub cpsr: RegPSR,
pub(super) spsr: RegPSR, pub(super) spsr: RegPSR,
pub(super) banks: Box<BankedRegisters>, pub(super) banks: BankedRegisters,
pub(super) bs_carry_out: bool, pub(super) bs_carry_out: bool,
} }
#[derive(Clone, Debug)]
#[cfg(feature = "debugger")]
struct DebuggerInfo {
last_executed: Option<DecodedInstruction>,
/// store the gpr before executing an instruction to show diff in the Display impl
gpr_previous: [u32; 15],
breakpoints: Vec<u32>,
verbose: bool,
trace_opcodes: bool,
trace_exceptions: bool,
}
#[cfg(feature = "debugger")]
impl Default for DebuggerInfo {
fn default() -> DebuggerInfo {
DebuggerInfo {
last_executed: None,
gpr_previous: [0; 15],
breakpoints: Vec::new(),
verbose: false,
trace_opcodes: false,
trace_exceptions: false,
}
}
}
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
pub struct Core<I: MemoryInterface> { pub struct Core<I: MemoryInterface> {
pub(super) bus: Shared<I>, pub(super) bus: Shared<I>,
@ -102,21 +128,10 @@ pub struct Core<I: MemoryInterface> {
// Todo - do I still need this? // Todo - do I still need this?
pub(super) bs_carry_out: bool, pub(super) bs_carry_out: bool,
pub(super) banks: Box<BankedRegisters>, // Putting these in a box so the most-used Cpu fields in the same cacheline pub(super) banks: BankedRegisters,
#[cfg(feature = "debugger")] #[cfg(feature = "debugger")]
pub last_executed: Option<DecodedInstruction>, pub dbg_info: DebuggerInfo,
/// store the gpr before executing an instruction to show diff in the Display impl
#[cfg(feature = "debugger")]
gpr_previous: [u32; 15],
#[cfg(feature = "debugger")]
pub breakpoints: Vec<u32>,
#[cfg(feature = "debugger")]
pub verbose: bool,
#[cfg(feature = "debugger")]
pub trace_opcodes: bool,
#[cfg(feature = "debugger")]
pub trace_exceptions: bool,
} }
impl<I: MemoryInterface> Core<I> { impl<I: MemoryInterface> Core<I> {
@ -130,21 +145,11 @@ impl<I: MemoryInterface> Core<I> {
next_fetch_access: MemoryAccess::NonSeq, next_fetch_access: MemoryAccess::NonSeq,
cpsr, cpsr,
spsr: Default::default(), spsr: Default::default(),
banks: Box::new(BankedRegisters::default()), banks: BankedRegisters::default(),
bs_carry_out: false, bs_carry_out: false,
#[cfg(feature = "debugger")] #[cfg(feature = "debugger")]
last_executed: None, dbg_info: DebuggerInfo::default(),
#[cfg(feature = "debugger")]
gpr_previous: [0; 15],
#[cfg(feature = "debugger")]
breakpoints: Vec::new(),
#[cfg(feature = "debugger")]
verbose: false,
#[cfg(feature = "debugger")]
trace_opcodes: false,
#[cfg(feature = "debugger")]
trace_exceptions: false,
} }
} }
@ -168,17 +173,7 @@ impl<I: MemoryInterface> Core<I> {
// savestate does not keep debugger related information, so just reinitialize to default // savestate does not keep debugger related information, so just reinitialize to default
#[cfg(feature = "debugger")] #[cfg(feature = "debugger")]
last_executed: None, dbg_info: DebuggerInfo::default(),
#[cfg(feature = "debugger")]
gpr_previous: [0; 15],
#[cfg(feature = "debugger")]
breakpoints: Vec::new(),
#[cfg(feature = "debugger")]
verbose: false,
#[cfg(feature = "debugger")]
trace_opcodes: false,
#[cfg(feature = "debugger")]
trace_exceptions: false,
} }
} }