static void AddDfDependence(Instruction instrfrom, Instruction instrto, FromStage from, FromReg fromreg) { if (from == FromStage.DS) { ctx.forwarded.From_DFDS_EXDF = instrfrom; ctx.forwarded.To_DFDS_EXDF = instrto; ctx.forwards.DFDS_EXDF++; ctx.forwardvalues.DS_To_DF_RT_Value = ctx.pipelineregs.DS__WB_ALUout_LMD; ctx.forwardvalues.Use_DS_To_DF_RT = true; } else //from == FromStage.WB { ctx.forwarded.From_DSWB_EXDF = instrfrom; ctx.forwarded.To_DSWB_EXDF = instrto; ctx.forwards.DSWB_EXDF++; ctx.forwardvalues.WB_To_DF_RT_Value = fromreg == FromReg.RD ? ctx.registers[(int)instrfrom.rd] : ctx.registers[(int)instrfrom.rt]; ctx.forwardvalues.Use_WB_To_DF_RT = true; } }
static void AddExDependence(Instruction instrfrom, Instruction instrto, FromStage from, ToReg toreg, FromReg fromreg) { if (from == FromStage.DF) { ctx.forwarded.From_EXDF_RFEX = instrfrom; ctx.forwarded.To_EXDF_RFEX = instrto; ctx.forwards.EXDF_RFEX++; if (toreg == ToReg.RS || toreg == ToReg.BASEREG) //On the left of ALU { ctx.forwardvalues.DF_To_EX_Left_Value = ctx.DF_DS; ctx.forwardvalues.Use_DF_To_EX_Left = true; } else //toreg == ToReg.RT, on the right of ALU { ctx.forwardvalues.DF_To_EX_Right_Value = ctx.DF_DS; ctx.forwardvalues.Use_DF_To_EX_Right = true; } } else if (from == FromStage.DS) { ctx.forwarded.From_DFDS_RFEX = instrfrom; ctx.forwarded.To_DFDS_RFEX = instrto; ctx.forwards.DFDS_RFEX++; if (toreg == ToReg.RS || toreg == ToReg.BASEREG) //On the left of ALU { ctx.forwardvalues.DS_To_EX_Left_Value = ctx.pipelineregs.DS__WB_ALUout_LMD; ctx.forwardvalues.Use_DS_To_EX_Left = true; } else //toreg == ToReg.RT, on the right of ALU { ctx.forwardvalues.DS_To_EX_Right_Value = ctx.pipelineregs.DS__WB_ALUout_LMD; ctx.forwardvalues.Use_DS_To_EX_Right = true; } } else //from == FromStage.WB { ctx.forwarded.From_DSWB_RFEX = instrfrom; ctx.forwarded.To_DSWB_RFEX = instrto; ctx.forwards.DSWB_RFEX++; if (toreg == ToReg.RS || toreg == ToReg.BASEREG) //On the left of ALU { ctx.forwardvalues.WB_To_EX_Left_Value = fromreg == FromReg.RD ? ctx.registers[(int)instrfrom.rd] : ctx.registers[(int)instrfrom.rt]; ctx.forwardvalues.Use_WB_To_EX_Left = true; } else //toreg == ToReg.RT, on the right of ALU { ctx.forwardvalues.WB_To_EX_Right_Value = fromreg == FromReg.RD ? ctx.registers[(int)instrfrom.rd] : ctx.registers[(int)instrfrom.rt]; ctx.forwardvalues.Use_WB_To_EX_Right = true; } } }