⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 completionunit.cpp

📁 ppc750 system design simulator using system c
💻 CPP
📖 第 1 页 / 共 3 页
字号:
					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 + -