inorder: multi-issue branch resolution

Only execute (resolve) one branch per cycle because handling more than one is
a little more complicated
This commit is contained in:
Korey Sewell 2011-02-04 00:08:17 -05:00
parent be17617990
commit 8ac717ef4c
2 changed files with 14 additions and 6 deletions

View file

@ -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++;

View file

@ -74,7 +74,8 @@ class ExecutionUnit : public Resource {
Stats::Scalar predictedCorrect;
Stats::Formula mispredictPct;
Stats::Scalar executions;
Tick lastExecuteCycle;
Tick lastExecuteTick;
Tick lastControlTick;
};