From 9888788cd4894c0c00f7373fc0cd6915941d638d Mon Sep 17 00:00:00 2001 From: David Li Date: Sun, 20 Dec 2015 15:14:52 -0500 Subject: Implement logic for RV32I branch instructions --- src/simulator.rs | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) (limited to 'src/simulator.rs') diff --git a/src/simulator.rs b/src/simulator.rs index bf39c5e..3ca11d9 100644 --- a/src/simulator.rs +++ b/src/simulator.rs @@ -120,7 +120,27 @@ impl Simulator { return; } isa::opcodes::BRANCH => { - + let target = ((pc as i32) + inst.sb_imm()) as usize; + let rs1 = core.registers.read_word(inst.rs1()); + let rs2 = core.registers.read_word(inst.rs2()); + if match inst.funct3() { + isa::funct3::BEQ => rs1 == rs2, + isa::funct3::BNE => rs1 != rs2, + isa::funct3::BLT => (rs1 as i32) < (rs2 as i32), + isa::funct3::BGE => (rs1 as i32) > (rs2 as i32), + isa::funct3::BLTU => rs1 < rs2, + isa::funct3::BGEU => rs1 > rs2, + _ => { + self.trap(core, Trap::IllegalInstruction { + address: pc, + instruction: inst, + }); + false + } + } { + core.pc = target; + return; + } }, isa::opcodes::INTEGER_IMMEDIATE => { let imm = inst.i_imm(); -- cgit v1.2.3