1a2
> * Copyright 2014 Google, Inc.
1108,1121c1109,1129
< int count = 0;
< Addr oldpc;
< // Debug statement. Checks to make sure we're not
< // currently updating state while handling PC events.
< assert(!thread[tid]->noSquashFromTC && !thread[tid]->trapPending);
< do {
< oldpc = pc[tid].instAddr();
< cpu->system->pcEventQueue.service(thread[tid]->getTC());
< count++;
< } while (oldpc != pc[tid].instAddr());
< if (count > 1) {
< DPRINTF(Commit,
< "PC skip function event, stopping commit\n");
< break;
---
> bool onInstBoundary = !head_inst->isMicroop() ||
> head_inst->isLastMicroop() ||
> !head_inst->isDelayedCommit();
>
> if (onInstBoundary) {
> int count = 0;
> Addr oldpc;
> // Make sure we're not currently updating state while
> // handling PC events.
> assert(!thread[tid]->noSquashFromTC &&
> !thread[tid]->trapPending);
> do {
> oldpc = pc[tid].instAddr();
> cpu->system->pcEventQueue.service(thread[tid]->getTC());
> count++;
> } while (oldpc != pc[tid].instAddr());
> if (count > 1) {
> DPRINTF(Commit,
> "PC skip function event, stopping commit\n");
> break;
> }
1131,1133c1139,1140
< if (!interrupt && avoidQuiesceLiveLock &&
< (!head_inst->isMicroop() || head_inst->isLastMicroop()) &&
< cpu->checkInterrupts(cpu->tcBase(0)))
---
> if (!interrupt && avoidQuiesceLiveLock &&
> onInstBoundary && cpu->checkInterrupts(cpu->tcBase(0)))