diff options
Diffstat (limited to 'src/core.rs')
| -rw-r--r-- | src/core.rs | 28 |
1 files changed, 20 insertions, 8 deletions
diff --git a/src/core.rs b/src/core.rs index 60d720b..6317c9e 100644 --- a/src/core.rs +++ b/src/core.rs @@ -168,7 +168,7 @@ pub fn lh(state: &mut CpuState, rd: usize, rs1: usize, imm: u32) { } pub fn lw(state: &mut CpuState, rd: usize, rs1: usize, imm: u32) { - let addr = (state.registers[rs1] + imm) as usize; + let addr = (state.registers[rs1].wrapping_add(imm)) as usize; let slice = state.memory.read_multiple_bytes(addr, 4, 99).unwrap(); let number = u32::from_le_bytes(slice[0..4].try_into().unwrap()); @@ -224,42 +224,54 @@ pub fn sw(state: &mut CpuState, rs1: usize, rs2: usize, imm: u32) { pub fn beq(state: &mut CpuState, rs1: usize, rs2: usize, imm: u32) { if state.registers[rs1] == state.registers[rs2] { - state.pc += imm; + state.pc = state.pc.wrapping_add(imm); + } else { + state.pc += 4; } } pub fn bne(state: &mut CpuState, rs1: usize, rs2: usize, imm: u32) { if state.registers[rs1] != state.registers[rs2] { - state.pc += imm; + state.pc = state.pc.wrapping_add(imm); + } else { + state.pc += 4; } } pub fn blt(state: &mut CpuState, rs1: usize, rs2: usize, imm: u32) { if (state.registers[rs1] as i32) < (state.registers[rs2] as i32) { - state.pc += imm; + state.pc = state.pc.wrapping_add(imm); + } else { + state.pc += 4; } } pub fn bge(state: &mut CpuState, rs1: usize, rs2: usize, imm: u32) { if (state.registers[rs1] as i32) >= (state.registers[rs2] as i32) { - state.pc += imm; + state.pc = state.pc.wrapping_add(imm); + } else { + state.pc += 4; } } pub fn bltu(state: &mut CpuState, rs1: usize, rs2: usize, imm: u32) { if state.registers[rs1] < state.registers[rs2] { - state.pc += imm; + state.pc = state.pc.wrapping_add(imm); + } else { + state.pc += 4; } } pub fn bgeu(state: &mut CpuState, rs1: usize, rs2: usize, imm: u32) { if state.registers[rs1] >= state.registers[rs2] { - state.pc += imm; + state.pc = state.pc.wrapping_add(imm); + } else { + state.pc += 4; } } pub fn jal(state: &mut CpuState, rd: usize, imm: u32) { state.registers[rd] = state.pc + 4; - state.pc += imm; + state.pc = state.pc.wrapping_add(imm); } pub fn jalr(state: &mut CpuState, rd: usize, rs1: usize, imm: u32) { |
