From a094b3a7d3537a6c5d2ad5c0c238ac4a34bead5b Mon Sep 17 00:00:00 2001 From: Logan McNaughton <848146+loganmc10@users.noreply.github.com> Date: Sat, 7 Oct 2023 21:00:09 -0600 Subject: [PATCH] jalr --- src/device/cpu_instructions.rs | 17 +++++++++-------- src/device/rsp_su_instructions.rs | 15 ++++++++------- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/src/device/cpu_instructions.rs b/src/device/cpu_instructions.rs index 24b3921..afc55d5 100644 --- a/src/device/cpu_instructions.rs +++ b/src/device/cpu_instructions.rs @@ -975,21 +975,22 @@ pub fn jr(device: &mut device::Device, opcode: u32) { } pub fn jalr(device: &mut device::Device, opcode: u32) { + let target = device.cpu.gpr[rs(opcode) as usize]; let in_delay_slot_taken = device::cpu::in_delay_slot_taken(device); - if !in_delay_slot_taken { - check_relative_idle_loop(device, opcode); - device.cpu.branch_state.state = device::cpu::State::Take; - device.cpu.branch_state.pc = device.cpu.gpr[rs(opcode) as usize]; - } else if !device::cpu::in_delay_slot(device) { - device.cpu.branch_state.state = device::cpu::State::NotTaken; - } - if in_delay_slot_taken { device.cpu.gpr[rd(opcode) as usize] = device.cpu.branch_state.pc + 4 } else { device.cpu.gpr[rd(opcode) as usize] = device.cpu.pc + 8 } + + if !in_delay_slot_taken { + check_relative_idle_loop(device, opcode); + device.cpu.branch_state.state = device::cpu::State::Take; + device.cpu.branch_state.pc = target; + } else if !device::cpu::in_delay_slot(device) { + device.cpu.branch_state.state = device::cpu::State::NotTaken; + } } pub fn sync(_device: &mut device::Device, _opcode: u32) {} diff --git a/src/device/rsp_su_instructions.rs b/src/device/rsp_su_instructions.rs index 697e2e9..8976dd0 100644 --- a/src/device/rsp_su_instructions.rs +++ b/src/device/rsp_su_instructions.rs @@ -306,21 +306,22 @@ pub fn jr(device: &mut device::Device, opcode: u32) { } pub fn jalr(device: &mut device::Device, opcode: u32) { + let target = device.rsp.cpu.gpr[rs(opcode) as usize]; let in_delay_slot_taken = device::rsp_cpu::in_delay_slot_taken(device); - if !in_delay_slot_taken { - device.rsp.cpu.branch_state.state = device::cpu::State::Take; - device.rsp.cpu.branch_state.pc = device.rsp.cpu.gpr[rs(opcode) as usize] - } else if !device::rsp_cpu::in_delay_slot(device) { - device.rsp.cpu.branch_state.state = device::cpu::State::NotTaken; - } - if in_delay_slot_taken { device.rsp.cpu.gpr[rd(opcode) as usize] = (device.rsp.cpu.branch_state.pc + 4) & 0xFFF } else { device.rsp.cpu.gpr[rd(opcode) as usize] = (device.rsp.regs2[device::rsp_interface::SP_PC_REG as usize] + 8) & 0xFFF } + + if !in_delay_slot_taken { + device.rsp.cpu.branch_state.state = device::cpu::State::Take; + device.rsp.cpu.branch_state.pc = target + } else if !device::rsp_cpu::in_delay_slot(device) { + device.rsp.cpu.branch_state.state = device::cpu::State::NotTaken; + } } pub fn break_(device: &mut device::Device, _opcode: u32) {