From cb96c84100c2ca0b86adaceec7674d8d48b93a98 Mon Sep 17 00:00:00 2001 From: Logan McNaughton <848146+loganmc10@users.noreply.github.com> Date: Sat, 7 Oct 2023 19:23:44 -0600 Subject: [PATCH] small opt --- src/device.rs | 1 + src/device/cpu.rs | 2 ++ src/device/cpu_instructions.rs | 26 +++++--------------------- src/device/memory.rs | 1 - src/device/tlb.rs | 4 +--- 5 files changed, 9 insertions(+), 25 deletions(-) diff --git a/src/device.rs b/src/device.rs index 6b3fcb18..8b624243 100644 --- a/src/device.rs +++ b/src/device.rs @@ -127,6 +127,7 @@ impl Device { gpr: [0; 32], clock_rate: 0, pc: 0xBFC00000, + pc_phys: 0, llbit: false, lo: 0, hi: 0, diff --git a/src/device/cpu.rs b/src/device/cpu.rs index e56db382..f037b96b 100644 --- a/src/device/cpu.rs +++ b/src/device/cpu.rs @@ -22,6 +22,7 @@ pub struct Cpu { pub branch_state: BranchState, pub gpr: [u64; 32], pub pc: u64, + pub pc_phys: u64, pub lo: u64, pub hi: u64, pub running: u8, @@ -241,6 +242,7 @@ pub fn run(device: &mut device::Device) { if err { continue; // TLB exception } + device.cpu.pc_phys = phys_address; if cached { device::cache::icache_fetch(device, phys_address) } else { diff --git a/src/device/cpu_instructions.rs b/src/device/cpu_instructions.rs index 301c7035..24b39211 100644 --- a/src/device/cpu_instructions.rs +++ b/src/device/cpu_instructions.rs @@ -49,18 +49,10 @@ pub fn bits_above_mask>(x: T) -> u64 { } pub fn check_relative_idle_loop(device: &mut device::Device, opcode: u32) { - let (phys_address, _, err) = device::memory::translate_address( - device, - device.cpu.pc, - device::memory::AccessType::Lookup, - ); - if err { - return; - } if imm(opcode) as i16 == -1 - && device.memory.fast_read[(phys_address >> 16) as usize]( + && device.memory.fast_read[(device.cpu.pc_phys >> 16) as usize]( device, - phys_address + 4, + device.cpu.pc_phys + 4, device::memory::AccessSize::Word, ) == 0 { @@ -69,18 +61,10 @@ pub fn check_relative_idle_loop(device: &mut device::Device, opcode: u32) { } pub fn check_absolute_idle_loop(device: &mut device::Device, opcode: u32) { - let (phys_address, _, err) = device::memory::translate_address( - device, - device.cpu.pc, - device::memory::AccessType::Lookup, - ); - if err { - return; - } - if (opcode & 0x3FFFFFF) as u64 == (phys_address & 0x0FFFFFFF) >> 2 - && device.memory.fast_read[(phys_address >> 16) as usize]( + if (opcode & 0x3FFFFFF) as u64 == (device.cpu.pc_phys & 0x0FFFFFFF) >> 2 + && device.memory.fast_read[(device.cpu.pc_phys >> 16) as usize]( device, - phys_address + 4, + device.cpu.pc_phys + 4, device::memory::AccessSize::Word, ) == 0 { diff --git a/src/device/memory.rs b/src/device/memory.rs index 39c0f0a4..829f1f83 100644 --- a/src/device/memory.rs +++ b/src/device/memory.rs @@ -24,7 +24,6 @@ pub const MM_IS_VIEWER: usize = 0x13ff0000; pub enum AccessType { Write, Read, - Lookup, } #[derive(Copy, Clone)] diff --git a/src/device/tlb.rs b/src/device/tlb.rs index 35d8e7a8..8caee882 100644 --- a/src/device/tlb.rs +++ b/src/device/tlb.rs @@ -261,9 +261,7 @@ pub fn get_physical_address( } } - if access_type != device::memory::AccessType::Lookup { - device::exceptions::tlb_miss_exception(device, address, access_type) - } + device::exceptions::tlb_miss_exception(device, address, access_type); return (0, false, true); }