跳转序列的实现

时间:2014-10-21 15:11:20

标签: c mips pipeline

我正在尝试用 C 语言向我的管道模拟器实现跳转指令。我一直在阅读mips的J-Instruction,并看到它由26位imm和6位操作码构成。经过一些进一步的阅读后,我发现可以使用此

计算跳转指令的地址
PC <- PC31-28::IR25-0::00

我不完全确定如何用 C 语言实现这一点。在计算前阶段时,我一直在尝试类似下面的代码,但它对我不起作用。

if(idStage.instruction.type == J)
{
  ifStage.pc = ifStage << idStage.instruction.imm;
  ifStage.pc = IfStage << 2;
}

我怎样才能用 C 语言实现PC&lt; - PC31-28 :: IR25-0 :: 00?

1 个答案:

答案 0 :(得分:1)

这将是

  ifStage.pc = (ifStage.pc & 0xF0000000) | (idStage.instruction.imm << 2);

即:取当前PC,应用AND掩码保持位28..31,然后应用OR掩码,立即移位器2位置左侧。 假设idStage.instruction.imm是立即26位。如果它可以在高位(26..31)中保存“垃圾”,那么你将应用另一个AND掩码:

  ifStage.pc = (ifStage.pc & 0xF000) | ((idStage.instruction.imm & 0x3FFFFFF) << 2);