399c399,411
< curStaticInst = StaticInst::decode(makeExtMI(inst, thread->readPC()));
---
> //If we're not in the middle of a macro instruction
> if (!curMacroStaticInst) {
> StaticInstPtr instPtr = StaticInst::decode(makeExtMI(inst, thread->getTC()));
> if (instPtr->isMacroOp()) {
> curMacroStaticInst = instPtr;
> curStaticInst = curMacroStaticInst->fetchMicroOp(0);
> } else {
> curStaticInst = instPtr;
> }
> } else {
> //Read the next micro op from the macro op
> curStaticInst = curMacroStaticInst->fetchMicroOp(thread->readMicroPC());
> }
400a413
>
449,452c462,482
< }
< else {
< // go to the next instruction
< thread->setPC(thread->readNextPC());
---
> } else {
> //If we're at the last micro op for this instruction
> if (curStaticInst->isLastMicroOp()) {
> //We should be working with a macro op
> assert(curMacroStaticInst);
> //Close out this macro op, and clean up the
> //microcode state
> curMacroStaticInst = StaticInst::nullStaticInstPtr;
> thread->setMicroPC(0);
> thread->setNextMicroPC(1);
> }
> //If we're still in a macro op
> if (curMacroStaticInst) {
> //Advance the micro pc
> thread->setMicroPC(thread->readNextMicroPC());
> //Advance the "next" micro pc. Note that there are no delay
> //slots, and micro ops are "word" addressed.
> thread->setNextMicroPC(thread->readNextMicroPC() + 1);
> } else {
> // go to the next instruction
> thread->setPC(thread->readNextPC());
454,456c484,486
< thread->setNextPC(thread->readNextNPC());
< thread->setNextNPC(thread->readNextNPC() + sizeof(MachInst));
< assert(thread->readNextPC() != thread->readNextNPC());
---
> thread->setNextPC(thread->readNextNPC());
> thread->setNextNPC(thread->readNextNPC() + sizeof(MachInst));
> assert(thread->readNextPC() != thread->readNextNPC());
458c488
< thread->setNextPC(thread->readNextPC() + sizeof(MachInst));
---
> thread->setNextPC(thread->readNextPC() + sizeof(MachInst));
460c490
<
---
> }