From: Korey Sewell Date: Fri, 4 Feb 2011 05:08:17 +0000 (-0500) Subject: inorder: multi-issue branch resolution X-Git-Tag: stable_2012_02_02~614 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=8ac717ef4c22580516d54046f9c0c1048eb4da62;p=gem5.git inorder: multi-issue branch resolution Only execute (resolve) one branch per cycle because handling more than one is a little more complicated --- diff --git a/src/cpu/inorder/resources/execution_unit.cc b/src/cpu/inorder/resources/execution_unit.cc index 9ba7a64c7..cae007deb 100644 --- a/src/cpu/inorder/resources/execution_unit.cc +++ b/src/cpu/inorder/resources/execution_unit.cc @@ -41,7 +41,8 @@ using namespace ThePipeline; ExecutionUnit::ExecutionUnit(string res_name, int res_id, int res_width, int res_latency, InOrderCPU *_cpu, ThePipeline::Params *params) - : Resource(res_name, res_id, res_width, res_latency, _cpu) + : Resource(res_name, res_id, res_width, res_latency, _cpu), + lastExecuteTick(0), lastControlTick(0) { } void @@ -55,8 +56,6 @@ ExecutionUnit::regStats() .name(name() + ".predictedNotTakenIncorrect") .desc("Number of Branches Incorrectly Predicted As Not Taken)."); - lastExecuteCycle = curTick(); - executions .name(name() + ".executions") .desc("Number of Instructions Executed."); @@ -98,14 +97,22 @@ ExecutionUnit::execute(int slot_num) { case ExecuteInst: { - if (curTick() != lastExecuteCycle) { - lastExecuteCycle = curTick(); + if (curTick() != lastExecuteTick) { + lastExecuteTick = curTick(); } if (inst->isMemRef()) { panic("%s not configured to handle memory ops.\n", resName); } else if (inst->isControl()) { + if (lastControlTick == curTick()) { + DPRINTF(InOrderExecute, "Can not Execute More than One Control " + "Inst Per Cycle. Blocking Request.\n"); + exec_req->done(false); + return; + } + lastControlTick = curTick(); + // Evaluate Branch fault = inst->execute(); executions++; diff --git a/src/cpu/inorder/resources/execution_unit.hh b/src/cpu/inorder/resources/execution_unit.hh index 8be339f4a..a6694ddb5 100644 --- a/src/cpu/inorder/resources/execution_unit.hh +++ b/src/cpu/inorder/resources/execution_unit.hh @@ -74,7 +74,8 @@ class ExecutionUnit : public Resource { Stats::Scalar predictedCorrect; Stats::Formula mispredictPct; Stats::Scalar executions; - Tick lastExecuteCycle; + Tick lastExecuteTick; + Tick lastControlTick; };