📄 completionunit.cpp
字号:
if(Debug(DebugCompletionUnit)) cout << name() << ": Write Back rr" << (int) robEntry.extra.systemRegister.tags.resultTag << " to r" << dstReg << endl;#endif outWriteBack[writeBackPort] = true; outWriteBackRegisterNumber[writeBackPort] = dstReg; outWriteBackRenameNumber[writeBackPort] = robEntry.extra.systemRegister.tags.resultTag; writeBackPort++; } if(robEntry.extra.systemRegister.tags.LRTag >= 0) { /* Instruction has to write into LR */#ifdef DEBUG if(Debug(DebugCompletionUnit)) cout << name() << ": Write Back LR rename buffer #" << (int) robEntry.extra.systemRegister.tags.LRTag << endl;#endif outWriteBackLR[writeBackLRPort] = true; outWriteBackLRRenameNumber[writeBackLRPort] = robEntry.extra.systemRegister.tags.LRTag; writeBackLRPort++; } if(robEntry.extra.systemRegister.tags.CTRTag >= 0) { /* Instruction has to write into CTR */#ifdef DEBUG if(Debug(DebugCompletionUnit)) cout << name() << ": Write Back CTR rename buffer #" << (int) robEntry.extra.systemRegister.tags.CTRTag << endl;#endif outWriteBackCTR[writeBackCTRPort] = true; outWriteBackCTRRenameNumber[writeBackCTRPort] = robEntry.extra.systemRegister.tags.CTRTag; writeBackCTRPort++; } if(robEntry.extra.systemRegister.tags.CRTag >= 0) { /* Instruction has to write a CR field */#ifdef DEBUG if(Debug(DebugCompletionUnit)) cout << name() << ": Write Back CR rename buffer #" << (int) robEntry.extra.systemRegister.tags.CRTag << endl;#endif outWriteBackCR[writeBackCRPort] = true; outWriteBackCRRenameNumber[writeBackCRPort] = robEntry.extra.systemRegister.tags.CRTag; outWriteBackCRFieldNumber[writeBackCRPort] = registersBinding->GetField(robEntry.extra.systemRegister.tags.CRTag); writeBackCRPort++; } if(robEntry.extra.systemRegister.writeCR) { /* Instruction has to write into CR (with a binary mask) */ writeCR = true; outCRM = robEntry.extra.systemRegister.crm; outCR = robEntry.extra.systemRegister.cr; } break; } } outWriteCR = writeCR; #ifdef DEBUG if(Debug(DebugCompletionUnit)) cout << name() << ": " << writeBackPort << " registers written back" << endl;#endif /* Don't write on unused write back ports */ for(; writeBackPort < nWriteBackPorts; writeBackPort++) outWriteBack[writeBackPort] = false; for(; writeBackFloatingPointPort < nWriteBackFloatingPointPorts; writeBackFloatingPointPort++) outWriteBackFloatingPoint[writeBackFloatingPointPort] = false; for(; writeBackCRPort < nWriteBackCRPorts; writeBackCRPort++) outWriteBackCR[writeBackCRPort] = false; for(; writeBackLRPort < nWriteBackLRPorts; writeBackLRPort++) outWriteBackLR[writeBackLRPort] = false; for(; writeBackCTRPort < nWriteBackCTRPorts; writeBackCTRPort++) outWriteBackCTR[writeBackCTRPort] = false; for(; memoryWriteBackPort < nMemoryWriteBackPorts; memoryWriteBackPort++) outMemoryWriteBack[memoryWriteBackPort] = false; outWriteCarry = writeCarry; outWriteOverflow = writeOverflow; nInstructionsToRetire = nInstructionsToWriteBack; /* Retire */#ifdef DEBUG if(Debug(DebugCompletionUnit)) if(nInstructionsToRetire > 0) cout << name() << ": Retiring " << nInstructionsToRetire << " instructions" << endl; #endif nRetiredInstructions += nInstructionsToRetire; bool clearInterlock = false; for(i = 0; i < nInstructionsToRetire; i++) { /* Get a reorder buffer entry (from the oldest to the newest) */ ReorderBufferEntry& robEntry = rob->GetTail(); programCounter = robEntry.nia; switch(robEntry.unitIdent) { case IntegerUnitIdent:#ifdef DEBUG if(Debug(DebugCompletionUnit)) { cout << name() << ": Retiring instruction (tag = " << (int) robEntry.extra.integer.tags.tag << ") (" << robEntry.dbgInstructionCounter << ") "; ppc_disassemble_to_stream(robEntry.dbgInstruction, robEntry.dbgProgramCounter, stdout); cout << endl; }#endif#ifdef TRACE if(Trace(TraceCompletionUnit)) { trace_file->Begin("retire"); trace_file->Value("number", robEntry.dbgInstructionCounter); trace_file->Value("pc", robEntry.dbgProgramCounter); trace_file->End("retire"); }#endif#ifdef EMULATE /* Emulator code begins */ ppc_execute_check_path(robEntry.inst, robEntry.instPC); /* Emulator code ends */#endif /* Free the rename buffers */ if(robEntry.extra.integer.tags.resultTag >= 0) registersBinding->FreeRenameBuffer(robEntry.extra.integer.tags.resultTag); if(robEntry.extra.integer.tags.CRTag >= 0) registersBinding->FreeCRRenameBuffer(robEntry.extra.integer.tags.CRTag); break; case FloatingPointUnitIdent:#ifdef DEBUG if(Debug(DebugCompletionUnit)) { cout << name() << ": Retiring instruction (tag = " << (int) robEntry.extra.floatingPoint.tags.tag << ") (" << robEntry.dbgInstructionCounter << ") "; ppc_disassemble_to_stream(robEntry.dbgInstruction, robEntry.dbgProgramCounter, stdout); cout << endl; }#endif#ifdef EMULATE /* Emulator code begins */ ppc_execute_check_path(robEntry.inst, robEntry.instPC); /* Emulator code ends */#endif /* Free the rename buffers */ if(robEntry.extra.floatingPoint.tags.resultTag >= 0) registersBinding->FreeFloatingPointRenameBuffer(robEntry.extra.floatingPoint.tags.resultTag); if(robEntry.extra.floatingPoint.tags.CRTag >= 0) registersBinding->FreeCRRenameBuffer(robEntry.extra.floatingPoint.tags.CRTag); break; case LoadStoreUnitIdent:#ifdef DEBUG if(Debug(DebugCompletionUnit)) { cout << name() << ": Retiring instruction (tag = " << (int) robEntry.extra.loadStore.tags.tag << ") (" << robEntry.dbgInstructionCounter << ") "; ppc_disassemble_to_stream(robEntry.dbgInstruction, robEntry.dbgProgramCounter, stdout); cout << endl; }#endif#ifdef EMULATE /* Emulator code begins */ ppc_execute_check_path(robEntry.inst, robEntry.instPC); /* Emulator code ends */#endif /* Free the rename buffers */ if(robEntry.extra.loadStore.tags.resultTags[0] >= 0) { if(robEntry.extra.loadStore.floatingPoint) { registersBinding->FreeFloatingPointRenameBuffer(robEntry.extra.loadStore.tags.resultTags[0]); } else { registersBinding->FreeRenameBuffer(robEntry.extra.loadStore.tags.resultTags[0]); } } if(robEntry.extra.loadStore.tags.resultTags[1] >= 0) registersBinding->FreeRenameBuffer(robEntry.extra.loadStore.tags.resultTags[1]); break; case BranchUnitIdent:#ifdef DEBUG if(Debug(DebugCompletionUnit)) { cout << name() << ": Retiring instruction (tag = " << (int) robEntry.extra.branch.tags.tag << ") (" << robEntry.dbgInstructionCounter << ") "; ppc_disassemble_to_stream(robEntry.dbgInstruction, robEntry.dbgProgramCounter, stdout); cout << endl; }#endif#ifdef EMULATE /* Emulator code begins */ ppc_execute_check_path(robEntry.inst, robEntry.instPC); /* Emulator code ends */#endif /* Free the rename buffers */ if(robEntry.extra.branch.tags.LRTag >= 0) registersBinding->FreeLRRenameBuffer(robEntry.extra.branch.tags.LRTag); if(robEntry.extra.branch.tags.CTRTag >= 0) registersBinding->FreeCTRRenameBuffer(robEntry.extra.branch.tags.CTRTag); break; case SystemRegisterUnitIdent:#ifdef DEBUG if(Debug(DebugCompletionUnit)) { cout << name() << ": Retiring instruction (tag = " << (int) robEntry.extra.systemRegister.tags.tag << ") (" << robEntry.dbgInstructionCounter << ") "; ppc_disassemble_to_stream(robEntry.dbgInstruction, robEntry.dbgProgramCounter, stdout); cout << endl; }#endif#ifdef EMULATE /* Emulator code begins */ ppc_execute_check_path(robEntry.inst, robEntry.instPC); /* Emulator code ends */#endif /* Free the rename buffers */ if(robEntry.extra.systemRegister.tags.resultTag >= 0) registersBinding->FreeRenameBuffer(robEntry.extra.systemRegister.tags.resultTag); if(robEntry.extra.systemRegister.tags.LRTag >= 0) registersBinding->FreeLRRenameBuffer(robEntry.extra.systemRegister.tags.LRTag); if(robEntry.extra.systemRegister.tags.CTRTag >= 0) registersBinding->FreeCTRRenameBuffer(robEntry.extra.systemRegister.tags.CTRTag); if(robEntry.extra.systemRegister.tags.CRTag >= 0) registersBinding->FreeCRRenameBuffer(robEntry.extra.systemRegister.tags.CRTag); if(robEntry.extra.systemRegister.interlock) { /* Clear the interlock bit */ clearInterlock = true; } break; } rob->ReleaseTail(); } outClearInterlock = clearInterlock; bool integerExecute[nIntegerUnit]; bool floatingPointExecute[nFloatingPointUnits]; bool systemRegisterExecute = false; /* Allow an execution serialized instruction to execute if it is the oldest instruction */ for(i = 0; i < nIntegerUnit; i++) integerExecute[i] = false; for(i = 0; i < nFloatingPointUnits; i++) floatingPointExecute[i] = false; if(!rob->Empty()) { ReorderBufferEntry& robEntry = rob->GetTail(); if(!robEntry.finished && robEntry.executionSerialized) { /* Instruction that is execution serialized is the oldest instruction into the reorder buffer */ switch(robEntry.unitIdent) { case IntegerUnitIdent:#ifdef DEBUG if(Debug(DebugCompletionUnit)) cout << name() << ": integer execution serialized instruction is ready to be executed (tag =" << (int) rob->GetIndex(robEntry) << ")" << endl;#endif integerExecute[robEntry.extra.integer.unitNumber] = true; outIntegerExecuteTag[robEntry.extra.integer.unitNumber] = robEntry.extra.integer.tags.tag; break; case FloatingPointUnitIdent:#ifdef DEBUG if(Debug(DebugCompletionUnit)) cout << name() << ": floating point execution serialized instruction is ready to be executed (tag =" << (int) rob->GetIndex(robEntry) << ")" << endl;#endif floatingPointExecute[robEntry.extra.floatingPoint.unitNumber] = true; outFloatingPointExecuteTag[robEntry.extra.floatingPoint.unitNumber] = robEntry.extra.floatingPoint.tags.tag; break; case SystemRegisterUnitIdent:#ifdef DEBUG if(Debug(DebugCompletionUnit)) cout << name() << ": system register execution serialized instruction is ready to be executed (tag =" << (int) rob->GetIndex(robEntry) << ")" << endl;#endif systemRegisterExecute = true; outSystemRegisterExecuteTag = robEntry.extra.systemRegister.tags.tag; break; } } } for(i = 0; i < nIntegerUnit; i++) outIntegerExecute[i] = integerExecute[i]; for(i = 0; i < nFloatingPointUnits; i++) outFloatingPointExecute[i] = floatingPointExecute[i]; outSystemRegisterExecute = systemRegisterExecute; /* Wake up decode process of the dispatch unit */ outDecode = rob->GetFreeSpace() > 0; }void CompletionUnit::Finish(){ int i; /* Validate the rename buffers */ for(i = 0; i < nIntegerUnit; i++) { if(inIntegerResultValid[i]) { /* An integer unit produced a rename buffer */#ifdef DEBUG if(Debug(DebugCompletionUnit)) cout << name() << ": integer unit " << i << " produce rename buffer #" << (int) inIntegerResultTag[i] << endl;#endif /* Validate the rename buffer */ registersBinding->ValidateRenameBuffer(inIntegerResultTag[i]); } if(inIntegerResultCRValid[i]) { /* An integer unit produced a CR field rename buffer */#ifdef DEBUG if(Debug(DebugCompletionUnit)) cout << name() << ": integer unit " << i << " produce cr rename buffer #" << (int) inIntegerResultCRTag[i] << endl;#endif /* Validate the CR field rename buffer */ registersBinding->ValidateCRRenameBuffer(inIntegerResultCRTag[i]); } } for(i = 0; i < nFloatingPointUnits; i++) { if(inFloatingPointResultValid[i]) { /* A floating point unit produced a floating point rename buffer */#ifdef DEBUG if(Debug(DebugCompletionUnit)) cout << name() << ": floating point unit " << i << " produce floating point rename buffer #" << (int) inFloatingPointResultTag[i] << endl;#endif /* Validate the floating point rename buffer */ registersBinding->ValidateFloatingPointRenameBuffer(inFloatingPointResultTag[i]); } if(inFloatingPointResultCRValid[i]) { /* A floating point unit produced a CR field rename buffer */#ifdef DEBUG if(Debug(DebugCompletionUnit)) cout << name() << ": floating point unit " << i << " produce cr rename buffer #" << (int) inFloatingPointResultCRTag[i] << endl;#endif /* Validate the CR field rename buffer */ registersBinding->ValidateCRRenameBuffer(inFloatingPointResultCRTag[i]); } } if(inLoadStoreFloatingPointResultValid)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -