mirror of
https://github.com/gopher64/gopher64.git
synced 2026-07-11 01:25:20 +02:00
small opt
This commit is contained in:
@@ -127,6 +127,7 @@ impl Device {
|
||||
gpr: [0; 32],
|
||||
clock_rate: 0,
|
||||
pc: 0xBFC00000,
|
||||
pc_phys: 0,
|
||||
llbit: false,
|
||||
lo: 0,
|
||||
hi: 0,
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -49,18 +49,10 @@ pub fn bits_above_mask<T: Into<u64>>(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
|
||||
{
|
||||
|
||||
@@ -24,7 +24,6 @@ pub const MM_IS_VIEWER: usize = 0x13ff0000;
|
||||
pub enum AccessType {
|
||||
Write,
|
||||
Read,
|
||||
Lookup,
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone)]
|
||||
|
||||
+1
-3
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user