102 lines
2.6 KiB
Java
Executable File
102 lines
2.6 KiB
Java
Executable File
package pipeline.outoforder;
|
|
|
|
import config.SimulationConfig;
|
|
import generic.Core;
|
|
import generic.Event;
|
|
import generic.EventQueue;
|
|
import generic.GenericCircularQueue;
|
|
import generic.GlobalClock;
|
|
import generic.OperationType;
|
|
import generic.PortType;
|
|
import generic.SimulationElement;
|
|
|
|
public class IWPushLogic extends SimulationElement {
|
|
|
|
Core core;
|
|
OutOrderExecutionEngine execEngine;
|
|
GenericCircularQueue<ReorderBufferEntry> renameBuffer;
|
|
InstructionWindow IW;
|
|
int renameWidth;
|
|
|
|
public IWPushLogic(Core core, OutOrderExecutionEngine execEngine)
|
|
{
|
|
super(PortType.Unlimited, -1, -1 , -1, -1);
|
|
this.core = core;
|
|
this.execEngine = execEngine;
|
|
renameBuffer = execEngine.getRenameBuffer();
|
|
IW = execEngine.getInstructionWindow();
|
|
renameWidth = core.getRenameWidth();
|
|
}
|
|
|
|
/*
|
|
* for each instruction in the renameBuffer, if there is place in the IW, make an entry
|
|
* else, indicate that all preceding stages must stall from the next cycle
|
|
*/
|
|
public void performIWPush()
|
|
{
|
|
if(execEngine.isToStall5() == true /*pipeline stalled due to branch mis-prediction*/)
|
|
{
|
|
return;
|
|
}
|
|
|
|
for(int i = 0; i < renameWidth; i++)
|
|
{
|
|
ReorderBufferEntry headROBEntry = renameBuffer.peek(0);
|
|
if(headROBEntry != null)
|
|
{
|
|
if(headROBEntry.getInstruction().getOperationType() == OperationType.inValid ||
|
|
headROBEntry.getInstruction().getOperationType() == OperationType.nop ||
|
|
headROBEntry.getInstruction().getOperationType() == OperationType.cpuid ||
|
|
headROBEntry.getInstruction().getOperationType() == OperationType.mfence ||
|
|
headROBEntry.getInstruction().getOperationType() == OperationType.sfence ||
|
|
headROBEntry.getInstruction().getOperationType() == OperationType.lfence)
|
|
{
|
|
//need not be added to instruction window
|
|
headROBEntry.setIssued(true);
|
|
headROBEntry.setExecuted(true);
|
|
headROBEntry.setWriteBackDone1(true);
|
|
headROBEntry.setWriteBackDone2(true);
|
|
}
|
|
else
|
|
{
|
|
if(IW.isFull())
|
|
{
|
|
execEngine.setToStall1(true);
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
if(headROBEntry.isRenameDone() == false)
|
|
{
|
|
misc.Error.showErrorAndExit("cannot push an instruction that hasn't been renamed");
|
|
}
|
|
|
|
if(SimulationConfig.debugMode)
|
|
{
|
|
System.out.println("IW push : " + GlobalClock.getCurrentTime()/core.getStepSize() + " : " + headROBEntry.getInstruction());
|
|
}
|
|
|
|
//add to IW
|
|
IW.addToWindow(headROBEntry);
|
|
}
|
|
}
|
|
|
|
//remove from rename buffer
|
|
renameBuffer.dequeue();
|
|
|
|
execEngine.setToStall1(false);
|
|
}
|
|
else
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void handleEvent(EventQueue eventQ, Event event) {
|
|
|
|
}
|
|
|
|
}
|