Skip to content

Commit

Permalink
Merge pull request #57 from xxuejie/calculate-branch-address-first
Browse files Browse the repository at this point in the history
refactor: calculate address first before cond operation
  • Loading branch information
xxuejie authored May 18, 2019
2 parents 1bcc105 + ec509d5 commit 985f8a7
Showing 1 changed file with 40 additions and 32 deletions.
72 changes: 40 additions & 32 deletions src/instructions/execute.rs
Original file line number Diff line number Diff line change
Expand Up @@ -257,69 +257,75 @@ pub fn execute<Mac: Machine>(inst: Instruction, machine: &mut Mac) -> Result<(),
}
insts::OP_BEQ => {
let i = Stype(inst);
let pc = machine.pc();
let rs1_value = &machine.registers()[i.rs1()];
let rs2_value = &machine.registers()[i.rs2()];
let condition = rs1_value.eq(&rs2_value);
let offset = condition.cond(
&Mac::REG::from_i32(i.immediate_s()),
&Mac::REG::from_usize(4),
let new_pc = condition.cond(
&Mac::REG::from_i32(i.immediate_s()).overflowing_add(&pc),
&Mac::REG::from_usize(4).overflowing_add(&pc),
);
Some(machine.pc().overflowing_add(&offset))
Some(new_pc)
}
insts::OP_BNE => {
let i = Stype(inst);
let pc = machine.pc();
let rs1_value = &machine.registers()[i.rs1()];
let rs2_value = &machine.registers()[i.rs2()];
let condition = rs1_value.ne(&rs2_value);
let offset = condition.cond(
&Mac::REG::from_i32(i.immediate_s()),
&Mac::REG::from_usize(4),
let new_pc = condition.cond(
&Mac::REG::from_i32(i.immediate_s()).overflowing_add(&pc),
&Mac::REG::from_usize(4).overflowing_add(&pc),
);
Some(machine.pc().overflowing_add(&offset))
Some(new_pc)
}
insts::OP_BLT => {
let i = Stype(inst);
let pc = machine.pc();
let rs1_value = &machine.registers()[i.rs1()];
let rs2_value = &machine.registers()[i.rs2()];
let condition = rs1_value.lt_s(&rs2_value);
let offset = condition.cond(
&Mac::REG::from_i32(i.immediate_s()),
&Mac::REG::from_usize(4),
let new_pc = condition.cond(
&Mac::REG::from_i32(i.immediate_s()).overflowing_add(&pc),
&Mac::REG::from_usize(4).overflowing_add(&pc),
);
Some(machine.pc().overflowing_add(&offset))
Some(new_pc)
}
insts::OP_BGE => {
let i = Stype(inst);
let pc = machine.pc();
let rs1_value = &machine.registers()[i.rs1()];
let rs2_value = &machine.registers()[i.rs2()];
let condition = rs1_value.ge_s(&rs2_value);
let offset = condition.cond(
&Mac::REG::from_i32(i.immediate_s()),
&Mac::REG::from_usize(4),
let new_pc = condition.cond(
&Mac::REG::from_i32(i.immediate_s()).overflowing_add(&pc),
&Mac::REG::from_usize(4).overflowing_add(&pc),
);
Some(machine.pc().overflowing_add(&offset))
Some(new_pc)
}
insts::OP_BLTU => {
let i = Stype(inst);
let pc = machine.pc();
let rs1_value = &machine.registers()[i.rs1()];
let rs2_value = &machine.registers()[i.rs2()];
let condition = rs1_value.lt(&rs2_value);
let offset = condition.cond(
&Mac::REG::from_i32(i.immediate_s()),
&Mac::REG::from_usize(4),
let new_pc = condition.cond(
&Mac::REG::from_i32(i.immediate_s()).overflowing_add(&pc),
&Mac::REG::from_usize(4).overflowing_add(&pc),
);
Some(machine.pc().overflowing_add(&offset))
Some(new_pc)
}
insts::OP_BGEU => {
let i = Stype(inst);
let pc = machine.pc();
let rs1_value = &machine.registers()[i.rs1()];
let rs2_value = &machine.registers()[i.rs2()];
let condition = rs1_value.ge(&rs2_value);
let offset = condition.cond(
&Mac::REG::from_i32(i.immediate_s()),
&Mac::REG::from_usize(4),
let new_pc = condition.cond(
&Mac::REG::from_i32(i.immediate_s()).overflowing_add(&pc),
&Mac::REG::from_usize(4).overflowing_add(&pc),
);
Some(machine.pc().overflowing_add(&offset))
Some(new_pc)
}
insts::OP_LUI => {
let i = Utype(inst);
Expand Down Expand Up @@ -611,23 +617,25 @@ pub fn execute<Mac: Machine>(inst: Instruction, machine: &mut Mac) -> Result<(),
}
insts::OP_RVC_BEQZ => {
let i = Stype(inst);
let pc = machine.pc();
let condition = machine.registers()[i.rs1()].eq(&Mac::REG::zero());
let next_pc_offset = condition.cond(
&Mac::REG::from_i32(i.immediate_s()),
&Mac::REG::from_usize(2),
let new_pc = condition.cond(
&Mac::REG::from_i32(i.immediate_s()).overflowing_add(&pc),
&Mac::REG::from_usize(2).overflowing_add(&pc),
);
Some(machine.pc().overflowing_add(&next_pc_offset))
Some(new_pc)
}
insts::OP_RVC_BNEZ => {
let i = Stype(inst);
let pc = machine.pc();
let condition = machine.registers()[i.rs1()]
.eq(&Mac::REG::zero())
.logical_not();
let next_pc_offset = condition.cond(
&Mac::REG::from_i32(i.immediate_s()),
&Mac::REG::from_usize(2),
let new_pc = condition.cond(
&Mac::REG::from_i32(i.immediate_s()).overflowing_add(&pc),
&Mac::REG::from_usize(2).overflowing_add(&pc),
);
Some(machine.pc().overflowing_add(&next_pc_offset))
Some(new_pc)
}
insts::OP_RVC_MV => {
let i = Rtype(inst);
Expand Down

0 comments on commit 985f8a7

Please sign in to comment.