completing the previous commit
This commit is contained in:
		
							parent
							
								
									aed6b8ea20
								
							
						
					
					
						commit
						7f1c3f36ce
					
				| 
						 | 
				
			
			@ -215,18 +215,6 @@ void sendTimerPacket(int tid, bool compulsory) {
 | 
			
		|||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
bool isThreadBeyondNumberOfCores(int threadID)
 | 
			
		||||
{
 | 
			
		||||
	int index;
 | 
			
		||||
	for(index=0; index < MaxNumActiveThreads; index++)
 | 
			
		||||
	{
 | 
			
		||||
		if(threadMapping[index] == (unsigned int)threadID)
 | 
			
		||||
			return false;
 | 
			
		||||
		if(isThreadActive[index] == false)
 | 
			
		||||
			return false;
 | 
			
		||||
	}
 | 
			
		||||
	return true;
 | 
			
		||||
}
 | 
			
		||||
int findThreadMapping(unsigned int id)
 | 
			
		||||
{
 | 
			
		||||
	int index;
 | 
			
		||||
| 
						 | 
				
			
			@ -235,10 +223,9 @@ int findThreadMapping(unsigned int id)
 | 
			
		|||
		if(threadMapping[index] == id)
 | 
			
		||||
			return index;
 | 
			
		||||
	}
 | 
			
		||||
//	cout<<"FATAL ERROR : ThreadMapping cannot resolve " << id << endl;
 | 
			
		||||
	return 1;
 | 
			
		||||
//	fflush(stdout);
 | 
			
		||||
//	exit(0);
 | 
			
		||||
	cout<<"FATAL ERROR : ThreadMapping cannot resolve";
 | 
			
		||||
	fflush(stdout);
 | 
			
		||||
	exit(0);
 | 
			
		||||
}
 | 
			
		||||
#define cmp(a)	(rtn_name->find(a) != string::npos)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -270,19 +257,10 @@ int findParentSegment(long parent)
 | 
			
		|||
			return index;
 | 
			
		||||
	}
 | 
			
		||||
	cout<<"FATAL ERROR--- cannot find parent\n";
 | 
			
		||||
	return 0;
 | 
			
		||||
	return -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
VOID ThreadStart(THREADID threadid, CONTEXT *ctxt, INT32 flags, VOID *v) {
 | 
			
		||||
cout << "threadstart() : tid = " << threadid << " " << isThreadBeyondNumberOfCores((int)threadid) << endl;
 | 
			
		||||
	if(isThreadBeyondNumberOfCores((int)threadid)) {
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if(threadid != 45) {
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	PIN_MutexLock(&mainLockForPintool);
 | 
			
		||||
	numThreads++;
 | 
			
		||||
	livethreads++;
 | 
			
		||||
| 
						 | 
				
			
			@ -316,7 +294,6 @@ cout << "threadstart() : tid = " << threadid << " " << isThreadBeyondNumberOfCor
 | 
			
		|||
	fflush(stdout);
 | 
			
		||||
	pumpingStatus[i] = true;
 | 
			
		||||
	threadid = findThreadMapping(threadid);
 | 
			
		||||
	cout << "app thread mapped to tejas thread " << threadid << endl;
 | 
			
		||||
	tst->onThread_start(threadid);
 | 
			
		||||
	while (tst->analysisFn(threadid, parent, CHILD_START, PIN_GetParentTid()) == -1) {
 | 
			
		||||
				PIN_Yield();
 | 
			
		||||
| 
						 | 
				
			
			@ -347,9 +324,6 @@ VOID ThreadFini(THREADID tid, const CONTEXT *ctxt, INT32 flags, VOID *v) {
 | 
			
		|||
 | 
			
		||||
//Pass a memory read record
 | 
			
		||||
VOID RecordMemRead(THREADID tid, VOID * ip, VOID * addr) {
 | 
			
		||||
 | 
			
		||||
	if(tid != 45)
 | 
			
		||||
		return;
 | 
			
		||||
	tid= findThreadMapping(tid);
 | 
			
		||||
	if (!isActive(tid))
 | 
			
		||||
		return;
 | 
			
		||||
| 
						 | 
				
			
			@ -376,9 +350,6 @@ VOID RecordMemRead(THREADID tid, VOID * ip, VOID * addr) {
 | 
			
		|||
// Pass a memory write record
 | 
			
		||||
VOID RecordMemWrite(THREADID tid, VOID * ip, VOID * addr) {
 | 
			
		||||
 | 
			
		||||
	if(tid != 45)
 | 
			
		||||
		return;
 | 
			
		||||
 | 
			
		||||
	tid= findThreadMapping(tid);
 | 
			
		||||
	if (!isActive(tid))
 | 
			
		||||
		return;
 | 
			
		||||
| 
						 | 
				
			
			@ -403,9 +374,6 @@ VOID RecordMemWrite(THREADID tid, VOID * ip, VOID * addr) {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
VOID BrnFun(THREADID tid, ADDRINT tadr, BOOL taken, VOID *ip) {
 | 
			
		||||
 | 
			
		||||
	if(tid != 45)
 | 
			
		||||
		return;
 | 
			
		||||
	tid= findThreadMapping(tid);
 | 
			
		||||
	if (!isActive(tid))
 | 
			
		||||
		return;
 | 
			
		||||
| 
						 | 
				
			
			@ -570,37 +538,20 @@ VOID printip(THREADID tid, VOID *ip, char *asmString) {
 | 
			
		|||
				instructionIgnorePhase = true;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
		if(numInsToSimulate > 0)
 | 
			
		||||
		if(numInsToSimulate > 0 && totalNumCISC >= (numInsToIgnore + numInsToSimulate))
 | 
			
		||||
		{
 | 
			
		||||
			bool subsetDone = false;
 | 
			
		||||
//			for(int i = 0; i < MaxNumActiveThreads; i++)
 | 
			
		||||
//			{
 | 
			
		||||
//				if(numCISC[i] >= (numInsToIgnore + numInsToSimulate))
 | 
			
		||||
//				{
 | 
			
		||||
//					subsetDone = true;
 | 
			
		||||
//					break;
 | 
			
		||||
//				}
 | 
			
		||||
//			}
 | 
			
		||||
			if(numCISC[0] >= (numInsToIgnore + numInsToSimulate))
 | 
			
		||||
			{
 | 
			
		||||
				subsetDone = true;
 | 
			
		||||
			// Now, we will write -2 packet in shared memory.
 | 
			
		||||
			// This will ensure that complete emulator (PIN) gets stopped.
 | 
			
		||||
			while (tst->onSubset_finish((int)tid, (numCISC[tid])) == -1) {
 | 
			
		||||
				PIN_Yield();
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if(subsetDone)
 | 
			
		||||
			{
 | 
			
		||||
				// Now, we will write -2 packet in shared memory.
 | 
			
		||||
				// This will ensure that complete emulator (PIN) gets stopped.
 | 
			
		||||
				while (tst->onSubset_finish((int)tid, (numCISC[tid])) == -1) {
 | 
			
		||||
					PIN_Yield();
 | 
			
		||||
				}
 | 
			
		||||
			cout<<"subset finish called by thread "<<tid<<endl;
 | 
			
		||||
			fflush(stdout);
 | 
			
		||||
 | 
			
		||||
				cout<<"subset finish called by thread "<<tid<<endl;
 | 
			
		||||
				fflush(stdout);
 | 
			
		||||
 | 
			
		||||
				tst->setSubsetsimComplete(true);
 | 
			
		||||
				// threadAlive[tid] = false;
 | 
			
		||||
				waitForThreadsAndTerminatePin();
 | 
			
		||||
			}
 | 
			
		||||
			tst->setSubsetsimComplete(true);
 | 
			
		||||
			// threadAlive[tid] = false;
 | 
			
		||||
			waitForThreadsAndTerminatePin();
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
| 
						 | 
				
			
			@ -713,13 +664,8 @@ void Image(IMG img,VOID *v) {
 | 
			
		|||
// Pin calls this function every time a new instruction is encountered
 | 
			
		||||
VOID Instruction(INS ins, VOID *v) {
 | 
			
		||||
 | 
			
		||||
	int tid = IARG_THREAD_ID;
 | 
			
		||||
	//cout << "thread = " << tid << endl;
 | 
			
		||||
	if(isThreadBeyondNumberOfCores(tid))
 | 
			
		||||
		return;
 | 
			
		||||
	//int tid = IARG_THREAD_ID;
 | 
			
		||||
 | 
			
		||||
	if(tid != 45)
 | 
			
		||||
		return;
 | 
			
		||||
 | 
			
		||||
	char *asmChar = NULL;
 | 
			
		||||
	if(traceMethod==File) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -64,9 +64,9 @@ public class CoreConfig
 | 
			
		|||
	public int ROBSize;
 | 
			
		||||
	public int IWSize;
 | 
			
		||||
	public int IntRegFileSize;
 | 
			
		||||
	public int FloatRegFileSize;
 | 
			
		||||
	public int VectorRegFileSize;
 | 
			
		||||
	public int IntArchRegNum;
 | 
			
		||||
	public int FloatArchRegNum;
 | 
			
		||||
	public int VectorArchRegNum;
 | 
			
		||||
	
 | 
			
		||||
	public int BranchMispredPenalty;
 | 
			
		||||
	
 | 
			
		||||
| 
						 | 
				
			
			@ -78,8 +78,21 @@ public class CoreConfig
 | 
			
		|||
	public int FloatALUNum;
 | 
			
		||||
	public int FloatMulNum;
 | 
			
		||||
	public int FloatDivNum;
 | 
			
		||||
	public int JumpNum;
 | 
			
		||||
	public int MemoryNum;
 | 
			
		||||
	public int IntVectorALUNum;
 | 
			
		||||
	public int IntVectorMulNum;
 | 
			
		||||
	public int FloatVectorALUNum;
 | 
			
		||||
	public int FloatVectorMulNum;
 | 
			
		||||
	public int FMANum;
 | 
			
		||||
	public int BranchNum;
 | 
			
		||||
	public int LoadNum;
 | 
			
		||||
	public int LoadAGUNum;
 | 
			
		||||
	public int StoreNum;
 | 
			
		||||
	public int StoreAGUNum;
 | 
			
		||||
	public int AESNum;
 | 
			
		||||
	public int VectorStringNum;
 | 
			
		||||
	public int BitScanNum;
 | 
			
		||||
	public int VectorShuffleNum;
 | 
			
		||||
	public int LEANum;
 | 
			
		||||
	
 | 
			
		||||
	public int IntALULatency;
 | 
			
		||||
	public int IntMulLatency;
 | 
			
		||||
| 
						 | 
				
			
			@ -87,8 +100,21 @@ public class CoreConfig
 | 
			
		|||
	public int FloatALULatency;
 | 
			
		||||
	public int FloatMulLatency;
 | 
			
		||||
	public int FloatDivLatency;
 | 
			
		||||
	public int JumpLatency;
 | 
			
		||||
	public int MemoryLatency;
 | 
			
		||||
	public int IntVectorALULatency;
 | 
			
		||||
	public int IntVectorMulLatency;
 | 
			
		||||
	public int FloatVectorALULatency;
 | 
			
		||||
	public int FloatVectorMulLatency;
 | 
			
		||||
	public int FMALatency;
 | 
			
		||||
	public int BranchLatency;
 | 
			
		||||
	public int LoadLatency;
 | 
			
		||||
	public int LoadAGULatency;
 | 
			
		||||
	public int StoreLatency;
 | 
			
		||||
	public int StoreAGULatency;
 | 
			
		||||
	public int AESLatency;
 | 
			
		||||
	public int VectorStringLatency;
 | 
			
		||||
	public int BitScanLatency;
 | 
			
		||||
	public int VectorShuffleLatency;
 | 
			
		||||
	public int LEALatency;
 | 
			
		||||
	
 | 
			
		||||
	public int IntALUReciprocalOfThroughput;
 | 
			
		||||
	public int IntMulReciprocalOfThroughput;
 | 
			
		||||
| 
						 | 
				
			
			@ -96,8 +122,21 @@ public class CoreConfig
 | 
			
		|||
	public int FloatALUReciprocalOfThroughput;
 | 
			
		||||
	public int FloatMulReciprocalOfThroughput;
 | 
			
		||||
	public int FloatDivReciprocalOfThroughput;
 | 
			
		||||
	public int JumpReciprocalOfThroughput;
 | 
			
		||||
	public int MemoryReciprocalOfThroughput;
 | 
			
		||||
	public int IntVectorALUReciprocalOfThroughput;
 | 
			
		||||
	public int IntVectorMulReciprocalOfThroughput;
 | 
			
		||||
	public int FloatVectorALUReciprocalOfThroughput;
 | 
			
		||||
	public int FloatVectorMulReciprocalOfThroughput;
 | 
			
		||||
	public int FMAReciprocalOfThroughput;
 | 
			
		||||
	public int BranchReciprocalOfThroughput;
 | 
			
		||||
	public int LoadReciprocalOfThroughput;
 | 
			
		||||
	public int LoadAGUReciprocalOfThroughput;
 | 
			
		||||
	public int StoreReciprocalOfThroughput;
 | 
			
		||||
	public int StoreAGUReciprocalOfThroughput;
 | 
			
		||||
	public int AESReciprocalOfThroughput;
 | 
			
		||||
	public int VectorStringReciprocalOfThroughput;
 | 
			
		||||
	public int BitScanReciprocalOfThroughput;
 | 
			
		||||
	public int VectorShuffleReciprocalOfThroughput;
 | 
			
		||||
	public int LEAReciprocalOfThroughput;
 | 
			
		||||
	
 | 
			
		||||
	public int[] IntALUPortNumbers;
 | 
			
		||||
	public int[] IntMulPortNumbers;
 | 
			
		||||
| 
						 | 
				
			
			@ -105,8 +144,21 @@ public class CoreConfig
 | 
			
		|||
	public int[] FloatALUPortNumbers;
 | 
			
		||||
	public int[] FloatMulPortNumbers;
 | 
			
		||||
	public int[] FloatDivPortNumbers;
 | 
			
		||||
	public int[] JumpPortNumbers;
 | 
			
		||||
	public int[] MemoryPortNumbers;
 | 
			
		||||
	public int[] IntVectorALUPortNumbers;
 | 
			
		||||
	public int[] IntVectorMulPortNumbers;
 | 
			
		||||
	public int[] FloatVectorALUPortNumbers;
 | 
			
		||||
	public int[] FloatVectorMulPortNumbers;
 | 
			
		||||
	public int[] FMAPortNumbers;
 | 
			
		||||
	public int[] BranchPortNumbers;
 | 
			
		||||
	public int[] LoadPortNumbers;
 | 
			
		||||
	public int[] LoadAGUPortNumbers;
 | 
			
		||||
	public int[] StorePortNumbers;
 | 
			
		||||
	public int[] StoreAGUPortNumbers;
 | 
			
		||||
	public int[] AESPortNumbers;
 | 
			
		||||
	public int[] VectorStringPortNumbers;
 | 
			
		||||
	public int[] BitScanPortNumbers;
 | 
			
		||||
	public int[] VectorShufflePortNumbers;
 | 
			
		||||
	public int[] LEAPortNumbers;
 | 
			
		||||
	
 | 
			
		||||
	public Vector<CacheConfig> coreCacheList = new Vector<CacheConfig>();
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -122,20 +174,39 @@ public class CoreConfig
 | 
			
		|||
	public EnergyConfig intRATPower;
 | 
			
		||||
	public EnergyConfig floatRATPower;
 | 
			
		||||
	public EnergyConfig intFreeListPower;
 | 
			
		||||
	public EnergyConfig floatFreeListPower;
 | 
			
		||||
	public EnergyConfig vectorFreeListPower;
 | 
			
		||||
	public EnergyConfig lsqPower;
 | 
			
		||||
	public EnergyConfig intRegFilePower;
 | 
			
		||||
	public EnergyConfig floatRegFilePower;
 | 
			
		||||
	public EnergyConfig vectorRegFilePower;
 | 
			
		||||
	public EnergyConfig iwPower;
 | 
			
		||||
	public EnergyConfig robPower;
 | 
			
		||||
	public EnergyConfig intALUPower;
 | 
			
		||||
	public EnergyConfig floatALUPower;
 | 
			
		||||
	public EnergyConfig complexALUPower;
 | 
			
		||||
	public EnergyConfig resultsBroadcastBusPower;
 | 
			
		||||
	public EnergyConfig iTLBPower;
 | 
			
		||||
	public EnergyConfig dTLBPower;
 | 
			
		||||
	public EnergyConfig sTLBPower;
 | 
			
		||||
	
 | 
			
		||||
	public EnergyConfig IntALUPower;
 | 
			
		||||
	public EnergyConfig IntMulPower;
 | 
			
		||||
	public EnergyConfig IntDivPower;
 | 
			
		||||
	public EnergyConfig FloatALUPower;
 | 
			
		||||
	public EnergyConfig FloatMulPower;
 | 
			
		||||
	public EnergyConfig FloatDivPower;
 | 
			
		||||
	public EnergyConfig IntVectorALUPower;
 | 
			
		||||
	public EnergyConfig IntVectorMulPower;
 | 
			
		||||
	public EnergyConfig FloatVectorALUPower;
 | 
			
		||||
	public EnergyConfig FloatVectorMulPower;
 | 
			
		||||
	public EnergyConfig FMAPower;
 | 
			
		||||
	public EnergyConfig BranchPower;
 | 
			
		||||
	public EnergyConfig LoadPower;
 | 
			
		||||
	public EnergyConfig LoadAGUPower;
 | 
			
		||||
	public EnergyConfig StorePower;
 | 
			
		||||
	public EnergyConfig StoreAGUPower;
 | 
			
		||||
	public EnergyConfig AESPower;
 | 
			
		||||
	public EnergyConfig VectorStringPower;
 | 
			
		||||
	public EnergyConfig BitScanPower;
 | 
			
		||||
	public EnergyConfig VectorShufflePower;
 | 
			
		||||
	public EnergyConfig LEAPower;
 | 
			
		||||
	
 | 
			
		||||
	public int getICacheLatency() {
 | 
			
		||||
		int latency = 0;
 | 
			
		||||
		
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -506,7 +506,7 @@ public class XMLParser
 | 
			
		|||
				
 | 
			
		||||
				Element freelistElmnt = (Element)(renameElmnt.getElementsByTagName("FreeList")).item(0);
 | 
			
		||||
				core.intFreeListPower = getEnergyConfig((Element)freelistElmnt.getElementsByTagName("Integer").item(0));
 | 
			
		||||
				core.floatFreeListPower = getEnergyConfig((Element)freelistElmnt.getElementsByTagName("Float").item(0));			
 | 
			
		||||
				core.vectorFreeListPower = getEnergyConfig((Element)freelistElmnt.getElementsByTagName("Float").item(0));			
 | 
			
		||||
				
 | 
			
		||||
				Element registerFileElmnt = (Element)(coreElmnt.getElementsByTagName("RegisterFile")).item(0);
 | 
			
		||||
				
 | 
			
		||||
| 
						 | 
				
			
			@ -515,10 +515,10 @@ public class XMLParser
 | 
			
		|||
				core.IntArchRegNum = Integer.parseInt(getImmediateString("IntArchRegNum", integerRegisterFileElmnt));
 | 
			
		||||
				core.intRegFilePower = getEnergyConfig(integerRegisterFileElmnt);
 | 
			
		||||
				
 | 
			
		||||
				Element floatRegisterFileElmnt = (Element)(registerFileElmnt.getElementsByTagName("Float")).item(0);
 | 
			
		||||
				core.FloatRegFileSize = Integer.parseInt(getImmediateString("FloatRegFileSize", floatRegisterFileElmnt));
 | 
			
		||||
				core.FloatArchRegNum = Integer.parseInt(getImmediateString("FloatArchRegNum", floatRegisterFileElmnt));
 | 
			
		||||
				core.floatRegFilePower = getEnergyConfig(floatRegisterFileElmnt);
 | 
			
		||||
				Element vectorRegisterFileElmnt = (Element)(registerFileElmnt.getElementsByTagName("Vector")).item(0);
 | 
			
		||||
				core.VectorRegFileSize = Integer.parseInt(getImmediateString("VectorRegFileSize", vectorRegisterFileElmnt));
 | 
			
		||||
				core.VectorArchRegNum = Integer.parseInt(getImmediateString("VectorArchRegNum", vectorRegisterFileElmnt));
 | 
			
		||||
				core.vectorRegFilePower = getEnergyConfig(vectorRegisterFileElmnt);
 | 
			
		||||
				
 | 
			
		||||
				core.ExecutionCoreNumPorts = Integer.parseInt(coreElmnt.getElementsByTagName("ExecutionCoreNumPorts").item(0).getFirstChild().getNodeValue());
 | 
			
		||||
				
 | 
			
		||||
| 
						 | 
				
			
			@ -531,6 +531,7 @@ public class XMLParser
 | 
			
		|||
				{
 | 
			
		||||
					core.IntALUPortNumbers[j] = Integer.parseInt(intALUElmnt.getElementsByTagName("PortNumber").item(j).getFirstChild().getNodeValue());
 | 
			
		||||
				}
 | 
			
		||||
				core.IntALUPower = getEnergyConfig(intALUElmnt);
 | 
			
		||||
				
 | 
			
		||||
				Element intMulElmnt = (Element)(coreElmnt.getElementsByTagName("IntMul")).item(0);
 | 
			
		||||
				core.IntMulNum = Integer.parseInt(getImmediateString("Num", intMulElmnt));
 | 
			
		||||
| 
						 | 
				
			
			@ -541,6 +542,7 @@ public class XMLParser
 | 
			
		|||
				{
 | 
			
		||||
					core.IntMulPortNumbers[j] = Integer.parseInt(intMulElmnt.getElementsByTagName("PortNumber").item(j).getFirstChild().getNodeValue());
 | 
			
		||||
				}
 | 
			
		||||
				core.IntMulPower = getEnergyConfig(intMulElmnt);
 | 
			
		||||
				
 | 
			
		||||
				Element intDivElmnt = (Element)(coreElmnt.getElementsByTagName("IntDiv")).item(0);
 | 
			
		||||
				core.IntDivNum = Integer.parseInt(getImmediateString("Num", intDivElmnt));
 | 
			
		||||
| 
						 | 
				
			
			@ -551,6 +553,7 @@ public class XMLParser
 | 
			
		|||
				{
 | 
			
		||||
					core.IntDivPortNumbers[j] = Integer.parseInt(intDivElmnt.getElementsByTagName("PortNumber").item(j).getFirstChild().getNodeValue());
 | 
			
		||||
				}
 | 
			
		||||
				core.IntDivPower = getEnergyConfig(intDivElmnt);
 | 
			
		||||
				
 | 
			
		||||
				Element floatALUElmnt = (Element)(coreElmnt.getElementsByTagName("FloatALU")).item(0);
 | 
			
		||||
				core.FloatALUNum = Integer.parseInt(getImmediateString("Num", floatALUElmnt));
 | 
			
		||||
| 
						 | 
				
			
			@ -561,6 +564,7 @@ public class XMLParser
 | 
			
		|||
				{
 | 
			
		||||
					core.FloatALUPortNumbers[j] = Integer.parseInt(floatALUElmnt.getElementsByTagName("PortNumber").item(j).getFirstChild().getNodeValue());
 | 
			
		||||
				}
 | 
			
		||||
				core.FloatALUPower = getEnergyConfig(floatALUElmnt);
 | 
			
		||||
				
 | 
			
		||||
				Element floatMulElmnt = (Element)(coreElmnt.getElementsByTagName("FloatMul")).item(0);
 | 
			
		||||
				core.FloatMulNum = Integer.parseInt(getImmediateString("Num", floatMulElmnt));
 | 
			
		||||
| 
						 | 
				
			
			@ -571,6 +575,7 @@ public class XMLParser
 | 
			
		|||
				{
 | 
			
		||||
					core.FloatMulPortNumbers[j] = Integer.parseInt(floatMulElmnt.getElementsByTagName("PortNumber").item(j).getFirstChild().getNodeValue());
 | 
			
		||||
				}
 | 
			
		||||
				core.FloatMulPower = getEnergyConfig(floatMulElmnt);
 | 
			
		||||
				
 | 
			
		||||
				Element floatDivElmnt = (Element)(coreElmnt.getElementsByTagName("FloatDiv")).item(0);
 | 
			
		||||
				core.FloatDivNum = Integer.parseInt(getImmediateString("Num", floatDivElmnt));
 | 
			
		||||
| 
						 | 
				
			
			@ -581,30 +586,172 @@ public class XMLParser
 | 
			
		|||
				{
 | 
			
		||||
					core.FloatDivPortNumbers[j] = Integer.parseInt(floatDivElmnt.getElementsByTagName("PortNumber").item(j).getFirstChild().getNodeValue());
 | 
			
		||||
				}
 | 
			
		||||
				core.FloatDivPower = getEnergyConfig(floatDivElmnt);
 | 
			
		||||
				
 | 
			
		||||
				Element jumpElmnt = (Element)(coreElmnt.getElementsByTagName("Jump")).item(0);
 | 
			
		||||
				core.JumpNum = Integer.parseInt(getImmediateString("Num", jumpElmnt));
 | 
			
		||||
				core.JumpLatency = Integer.parseInt(getImmediateString("Latency", jumpElmnt));
 | 
			
		||||
				core.JumpReciprocalOfThroughput = Integer.parseInt(getImmediateString("ReciprocalOfThroughput", jumpElmnt));
 | 
			
		||||
				core.JumpPortNumbers = new int[core.JumpNum];
 | 
			
		||||
				for(int j = 0; j < core.JumpNum; j++)
 | 
			
		||||
				Element intVectorALUElmnt = (Element)(coreElmnt.getElementsByTagName("IntVectorALU")).item(0);
 | 
			
		||||
				core.IntVectorALUNum = Integer.parseInt(getImmediateString("Num", intVectorALUElmnt));
 | 
			
		||||
				core.IntVectorALULatency = Integer.parseInt(getImmediateString("Latency", intVectorALUElmnt));
 | 
			
		||||
				core.IntVectorALUReciprocalOfThroughput = Integer.parseInt(getImmediateString("ReciprocalOfThroughput", intVectorALUElmnt));
 | 
			
		||||
				core.IntVectorALUPortNumbers = new int[core.IntVectorALUNum];
 | 
			
		||||
				for(int j = 0; j < core.IntVectorALUNum; j++)
 | 
			
		||||
				{
 | 
			
		||||
					core.JumpPortNumbers[j] = Integer.parseInt(jumpElmnt.getElementsByTagName("PortNumber").item(j).getFirstChild().getNodeValue());
 | 
			
		||||
					core.IntVectorALUPortNumbers[j] = Integer.parseInt(intVectorALUElmnt.getElementsByTagName("PortNumber").item(j).getFirstChild().getNodeValue());
 | 
			
		||||
				}
 | 
			
		||||
				core.IntVectorALUPower = getEnergyConfig(intVectorALUElmnt);
 | 
			
		||||
				
 | 
			
		||||
				Element memoryElmnt = (Element)(coreElmnt.getElementsByTagName("Memory")).item(0);
 | 
			
		||||
				core.MemoryNum = Integer.parseInt(getImmediateString("Num", memoryElmnt));
 | 
			
		||||
				core.MemoryLatency = Integer.parseInt(getImmediateString("Latency", memoryElmnt));
 | 
			
		||||
				core.MemoryReciprocalOfThroughput = Integer.parseInt(getImmediateString("ReciprocalOfThroughput", memoryElmnt));
 | 
			
		||||
				core.MemoryPortNumbers = new int[core.MemoryNum];
 | 
			
		||||
				for(int j = 0; j < core.MemoryNum; j++)
 | 
			
		||||
				Element intVectorMulElmnt = (Element)(coreElmnt.getElementsByTagName("IntVectorMul")).item(0);
 | 
			
		||||
				core.IntVectorMulNum = Integer.parseInt(getImmediateString("Num", intVectorMulElmnt));
 | 
			
		||||
				core.IntVectorMulLatency = Integer.parseInt(getImmediateString("Latency", intVectorMulElmnt));
 | 
			
		||||
				core.IntVectorMulReciprocalOfThroughput = Integer.parseInt(getImmediateString("ReciprocalOfThroughput", intVectorMulElmnt));
 | 
			
		||||
				core.IntVectorMulPortNumbers = new int[core.IntVectorMulNum];
 | 
			
		||||
				for(int j = 0; j < core.IntVectorMulNum; j++)
 | 
			
		||||
				{
 | 
			
		||||
					core.MemoryPortNumbers[j] = Integer.parseInt(memoryElmnt.getElementsByTagName("PortNumber").item(j).getFirstChild().getNodeValue());
 | 
			
		||||
					core.IntVectorMulPortNumbers[j] = Integer.parseInt(intVectorMulElmnt.getElementsByTagName("PortNumber").item(j).getFirstChild().getNodeValue());
 | 
			
		||||
				}
 | 
			
		||||
				core.IntVectorMulPower = getEnergyConfig(intVectorMulElmnt);
 | 
			
		||||
				
 | 
			
		||||
				core.intALUPower = getEnergyConfig(intALUElmnt);
 | 
			
		||||
				core.floatALUPower = getEnergyConfig(floatALUElmnt);
 | 
			
		||||
				core.complexALUPower = getEnergyConfig(intMulElmnt);
 | 
			
		||||
				Element floatVectorALUElmnt = (Element)(coreElmnt.getElementsByTagName("FloatVectorALU")).item(0);
 | 
			
		||||
				core.FloatVectorALUNum = Integer.parseInt(getImmediateString("Num", floatVectorALUElmnt));
 | 
			
		||||
				core.FloatVectorALULatency = Integer.parseInt(getImmediateString("Latency", floatVectorALUElmnt));
 | 
			
		||||
				core.FloatVectorALUReciprocalOfThroughput = Integer.parseInt(getImmediateString("ReciprocalOfThroughput", floatVectorALUElmnt));
 | 
			
		||||
				core.FloatVectorALUPortNumbers = new int[core.FloatVectorALUNum];
 | 
			
		||||
				for(int j = 0; j < core.FloatVectorALUNum; j++)
 | 
			
		||||
				{
 | 
			
		||||
					core.FloatVectorALUPortNumbers[j] = Integer.parseInt(floatVectorALUElmnt.getElementsByTagName("PortNumber").item(j).getFirstChild().getNodeValue());
 | 
			
		||||
				}
 | 
			
		||||
				core.FloatVectorALUPower = getEnergyConfig(floatVectorALUElmnt);
 | 
			
		||||
				
 | 
			
		||||
				Element floatVectorMulElmnt = (Element)(coreElmnt.getElementsByTagName("FloatVectorMul")).item(0);
 | 
			
		||||
				core.FloatVectorMulNum = Integer.parseInt(getImmediateString("Num", floatVectorMulElmnt));
 | 
			
		||||
				core.FloatVectorMulLatency = Integer.parseInt(getImmediateString("Latency", floatVectorMulElmnt));
 | 
			
		||||
				core.FloatVectorMulReciprocalOfThroughput = Integer.parseInt(getImmediateString("ReciprocalOfThroughput", floatVectorMulElmnt));
 | 
			
		||||
				core.FloatVectorMulPortNumbers = new int[core.FloatVectorMulNum];
 | 
			
		||||
				for(int j = 0; j < core.FloatVectorMulNum; j++)
 | 
			
		||||
				{
 | 
			
		||||
					core.FloatVectorMulPortNumbers[j] = Integer.parseInt(floatVectorMulElmnt.getElementsByTagName("PortNumber").item(j).getFirstChild().getNodeValue());
 | 
			
		||||
				}
 | 
			
		||||
				core.FloatVectorMulPower = getEnergyConfig(floatVectorMulElmnt);
 | 
			
		||||
				
 | 
			
		||||
				Element FMAElmnt = (Element)(coreElmnt.getElementsByTagName("FMA")).item(0);
 | 
			
		||||
				core.FMANum = Integer.parseInt(getImmediateString("Num", FMAElmnt));
 | 
			
		||||
				core.FMALatency = Integer.parseInt(getImmediateString("Latency", FMAElmnt));
 | 
			
		||||
				core.FMAReciprocalOfThroughput = Integer.parseInt(getImmediateString("ReciprocalOfThroughput", FMAElmnt));
 | 
			
		||||
				core.FMAPortNumbers = new int[core.FMANum];
 | 
			
		||||
				for(int j = 0; j < core.FMANum; j++)
 | 
			
		||||
				{
 | 
			
		||||
					core.FMAPortNumbers[j] = Integer.parseInt(FMAElmnt.getElementsByTagName("PortNumber").item(j).getFirstChild().getNodeValue());
 | 
			
		||||
				}
 | 
			
		||||
				core.FMAPower = getEnergyConfig(FMAElmnt);
 | 
			
		||||
				
 | 
			
		||||
				Element branchElmnt = (Element)(coreElmnt.getElementsByTagName("Branch")).item(0);
 | 
			
		||||
				core.BranchNum = Integer.parseInt(getImmediateString("Num", branchElmnt));
 | 
			
		||||
				core.BranchLatency = Integer.parseInt(getImmediateString("Latency", branchElmnt));
 | 
			
		||||
				core.BranchReciprocalOfThroughput = Integer.parseInt(getImmediateString("ReciprocalOfThroughput", branchElmnt));
 | 
			
		||||
				core.BranchPortNumbers = new int[core.BranchNum];
 | 
			
		||||
				for(int j = 0; j < core.BranchNum; j++)
 | 
			
		||||
				{
 | 
			
		||||
					core.BranchPortNumbers[j] = Integer.parseInt(branchElmnt.getElementsByTagName("PortNumber").item(j).getFirstChild().getNodeValue());
 | 
			
		||||
				}
 | 
			
		||||
				core.BranchPower = getEnergyConfig(branchElmnt);
 | 
			
		||||
				
 | 
			
		||||
				Element loadElmnt = (Element)(coreElmnt.getElementsByTagName("Load")).item(0);
 | 
			
		||||
				core.LoadNum = Integer.parseInt(getImmediateString("Num", loadElmnt));
 | 
			
		||||
				core.LoadLatency = Integer.parseInt(getImmediateString("Latency", loadElmnt));
 | 
			
		||||
				core.LoadReciprocalOfThroughput = Integer.parseInt(getImmediateString("ReciprocalOfThroughput", loadElmnt));
 | 
			
		||||
				core.LoadPortNumbers = new int[core.LoadNum];
 | 
			
		||||
				for(int j = 0; j < core.LoadNum; j++)
 | 
			
		||||
				{
 | 
			
		||||
					core.LoadPortNumbers[j] = Integer.parseInt(loadElmnt.getElementsByTagName("PortNumber").item(j).getFirstChild().getNodeValue());
 | 
			
		||||
				}
 | 
			
		||||
				core.LoadPower = getEnergyConfig(loadElmnt);
 | 
			
		||||
				
 | 
			
		||||
				Element loadAGUElmnt = (Element)(coreElmnt.getElementsByTagName("LoadAGU")).item(0);
 | 
			
		||||
				core.LoadAGUNum = Integer.parseInt(getImmediateString("Num", loadAGUElmnt));
 | 
			
		||||
				core.LoadAGULatency = Integer.parseInt(getImmediateString("Latency", loadAGUElmnt));
 | 
			
		||||
				core.LoadAGUReciprocalOfThroughput = Integer.parseInt(getImmediateString("ReciprocalOfThroughput", loadAGUElmnt));
 | 
			
		||||
				core.LoadAGUPortNumbers = new int[core.LoadAGUNum];
 | 
			
		||||
				for(int j = 0; j < core.LoadAGUNum; j++)
 | 
			
		||||
				{
 | 
			
		||||
					core.LoadAGUPortNumbers[j] = Integer.parseInt(loadAGUElmnt.getElementsByTagName("PortNumber").item(j).getFirstChild().getNodeValue());
 | 
			
		||||
				}
 | 
			
		||||
				core.LoadAGUPower = getEnergyConfig(loadAGUElmnt);
 | 
			
		||||
				
 | 
			
		||||
				Element storeElmnt = (Element)(coreElmnt.getElementsByTagName("Store")).item(0);
 | 
			
		||||
				core.StoreNum = Integer.parseInt(getImmediateString("Num", storeElmnt));
 | 
			
		||||
				core.StoreLatency = Integer.parseInt(getImmediateString("Latency", storeElmnt));
 | 
			
		||||
				core.StoreReciprocalOfThroughput = Integer.parseInt(getImmediateString("ReciprocalOfThroughput", storeElmnt));
 | 
			
		||||
				core.StorePortNumbers = new int[core.StoreNum];
 | 
			
		||||
				for(int j = 0; j < core.StoreNum; j++)
 | 
			
		||||
				{
 | 
			
		||||
					core.StorePortNumbers[j] = Integer.parseInt(storeElmnt.getElementsByTagName("PortNumber").item(j).getFirstChild().getNodeValue());
 | 
			
		||||
				}
 | 
			
		||||
				core.StorePower = getEnergyConfig(storeElmnt);
 | 
			
		||||
				
 | 
			
		||||
				Element storeAGUElmnt = (Element)(coreElmnt.getElementsByTagName("StoreAGU")).item(0);
 | 
			
		||||
				core.StoreAGUNum = Integer.parseInt(getImmediateString("Num", storeAGUElmnt));
 | 
			
		||||
				core.StoreAGULatency = Integer.parseInt(getImmediateString("Latency", storeAGUElmnt));
 | 
			
		||||
				core.StoreAGUReciprocalOfThroughput = Integer.parseInt(getImmediateString("ReciprocalOfThroughput", storeAGUElmnt));
 | 
			
		||||
				core.StoreAGUPortNumbers = new int[core.StoreAGUNum];
 | 
			
		||||
				for(int j = 0; j < core.StoreAGUNum; j++)
 | 
			
		||||
				{
 | 
			
		||||
					core.StoreAGUPortNumbers[j] = Integer.parseInt(storeAGUElmnt.getElementsByTagName("PortNumber").item(j).getFirstChild().getNodeValue());
 | 
			
		||||
				}
 | 
			
		||||
				core.StoreAGUPower = getEnergyConfig(storeAGUElmnt);
 | 
			
		||||
				
 | 
			
		||||
				Element aesElmnt = (Element)(coreElmnt.getElementsByTagName("AES")).item(0);
 | 
			
		||||
				core.AESNum = Integer.parseInt(getImmediateString("Num", aesElmnt));
 | 
			
		||||
				core.AESLatency = Integer.parseInt(getImmediateString("Latency", aesElmnt));
 | 
			
		||||
				core.AESReciprocalOfThroughput = Integer.parseInt(getImmediateString("ReciprocalOfThroughput", aesElmnt));
 | 
			
		||||
				core.AESPortNumbers = new int[core.AESNum];
 | 
			
		||||
				for(int j = 0; j < core.AESNum; j++)
 | 
			
		||||
				{
 | 
			
		||||
					core.AESPortNumbers[j] = Integer.parseInt(aesElmnt.getElementsByTagName("PortNumber").item(j).getFirstChild().getNodeValue());
 | 
			
		||||
				}
 | 
			
		||||
				core.AESPower = getEnergyConfig(aesElmnt);
 | 
			
		||||
				
 | 
			
		||||
				Element vectorStringElmnt = (Element)(coreElmnt.getElementsByTagName("VectorString")).item(0);
 | 
			
		||||
				core.VectorStringNum = Integer.parseInt(getImmediateString("Num", vectorStringElmnt));
 | 
			
		||||
				core.VectorStringLatency = Integer.parseInt(getImmediateString("Latency", vectorStringElmnt));
 | 
			
		||||
				core.VectorStringReciprocalOfThroughput = Integer.parseInt(getImmediateString("ReciprocalOfThroughput", vectorStringElmnt));
 | 
			
		||||
				core.VectorStringPortNumbers = new int[core.VectorStringNum];
 | 
			
		||||
				for(int j = 0; j < core.VectorStringNum; j++)
 | 
			
		||||
				{
 | 
			
		||||
					core.VectorStringPortNumbers[j] = Integer.parseInt(vectorStringElmnt.getElementsByTagName("PortNumber").item(j).getFirstChild().getNodeValue());
 | 
			
		||||
				}
 | 
			
		||||
				core.VectorStringPower = getEnergyConfig(vectorStringElmnt);
 | 
			
		||||
				
 | 
			
		||||
				Element bitScanElmnt = (Element)(coreElmnt.getElementsByTagName("BitScan")).item(0);
 | 
			
		||||
				core.BitScanNum = Integer.parseInt(getImmediateString("Num", bitScanElmnt));
 | 
			
		||||
				core.BitScanLatency = Integer.parseInt(getImmediateString("Latency", bitScanElmnt));
 | 
			
		||||
				core.BitScanReciprocalOfThroughput = Integer.parseInt(getImmediateString("ReciprocalOfThroughput", bitScanElmnt));
 | 
			
		||||
				core.BitScanPortNumbers = new int[core.BitScanNum];
 | 
			
		||||
				for(int j = 0; j < core.BitScanNum; j++)
 | 
			
		||||
				{
 | 
			
		||||
					core.BitScanPortNumbers[j] = Integer.parseInt(bitScanElmnt.getElementsByTagName("PortNumber").item(j).getFirstChild().getNodeValue());
 | 
			
		||||
				}
 | 
			
		||||
				core.BitScanPower = getEnergyConfig(bitScanElmnt);
 | 
			
		||||
				
 | 
			
		||||
				Element vectorShuffleElmnt = (Element)(coreElmnt.getElementsByTagName("VectorShuffle")).item(0);
 | 
			
		||||
				core.VectorShuffleNum = Integer.parseInt(getImmediateString("Num", vectorShuffleElmnt));
 | 
			
		||||
				core.VectorShuffleLatency = Integer.parseInt(getImmediateString("Latency", vectorShuffleElmnt));
 | 
			
		||||
				core.VectorShuffleReciprocalOfThroughput = Integer.parseInt(getImmediateString("ReciprocalOfThroughput", vectorShuffleElmnt));
 | 
			
		||||
				core.VectorShufflePortNumbers = new int[core.VectorShuffleNum];
 | 
			
		||||
				for(int j = 0; j < core.VectorShuffleNum; j++)
 | 
			
		||||
				{
 | 
			
		||||
					core.VectorShufflePortNumbers[j] = Integer.parseInt(vectorShuffleElmnt.getElementsByTagName("PortNumber").item(j).getFirstChild().getNodeValue());
 | 
			
		||||
				}
 | 
			
		||||
				core.VectorShufflePower = getEnergyConfig(vectorShuffleElmnt);
 | 
			
		||||
				
 | 
			
		||||
				Element leaElmnt = (Element)(coreElmnt.getElementsByTagName("LEA")).item(0);
 | 
			
		||||
				core.LEANum = Integer.parseInt(getImmediateString("Num", leaElmnt));
 | 
			
		||||
				core.LEALatency = Integer.parseInt(getImmediateString("Latency", leaElmnt));
 | 
			
		||||
				core.LEAReciprocalOfThroughput = Integer.parseInt(getImmediateString("ReciprocalOfThroughput", leaElmnt));
 | 
			
		||||
				core.LEAPortNumbers = new int[core.LEANum];
 | 
			
		||||
				for(int j = 0; j < core.LEANum; j++)
 | 
			
		||||
				{
 | 
			
		||||
					core.LEAPortNumbers[j] = Integer.parseInt(leaElmnt.getElementsByTagName("PortNumber").item(j).getFirstChild().getNodeValue());
 | 
			
		||||
				}
 | 
			
		||||
				core.LEAPower = getEnergyConfig(leaElmnt);
 | 
			
		||||
							
 | 
			
		||||
				//set Branch Predictor Parameters
 | 
			
		||||
				core.branchPredictor = new BranchPredictorConfig();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -245,7 +245,7 @@ TDP = 112W
 | 
			
		|||
			</IntDiv>
 | 
			
		||||
			
 | 
			
		||||
			<FloatALU>
 | 
			
		||||
				<Num>1</Num>
 | 
			
		||||
				<Num>0</Num>
 | 
			
		||||
				<Latency>3</Latency>
 | 
			
		||||
				<ReciprocalOfThroughput>1</ReciprocalOfThroughput>
 | 
			
		||||
				<PortNumber>1</PortNumber>
 | 
			
		||||
| 
						 | 
				
			
			@ -254,7 +254,7 @@ TDP = 112W
 | 
			
		|||
			</FloatALU>
 | 
			
		||||
			
 | 
			
		||||
			<FloatMul>
 | 
			
		||||
				<Num>1</Num>
 | 
			
		||||
				<Num>0</Num>
 | 
			
		||||
				<Latency>5</Latency>
 | 
			
		||||
				<ReciprocalOfThroughput>1</ReciprocalOfThroughput>
 | 
			
		||||
				<PortNumber>0</PortNumber>
 | 
			
		||||
| 
						 | 
				
			
			@ -271,7 +271,69 @@ TDP = 112W
 | 
			
		|||
				<DynamicEnergy>0.6514</DynamicEnergy>			
 | 
			
		||||
			</FloatDiv>
 | 
			
		||||
			
 | 
			
		||||
			<Jump>
 | 
			
		||||
			<IntVectorALU>
 | 
			
		||||
				<Num>3</Num>
 | 
			
		||||
				<Latency>3</Latency>
 | 
			
		||||
				<ReciprocalOfThroughput>1</ReciprocalOfThroughput>
 | 
			
		||||
				<PortNumber>0</PortNumber>
 | 
			
		||||
				<PortNumber>1</PortNumber>
 | 
			
		||||
				<PortNumber>5</PortNumber>
 | 
			
		||||
				<LeakageEnergy>0.0271</LeakageEnergy>
 | 
			
		||||
				<DynamicEnergy>0.6514</DynamicEnergy>			
 | 
			
		||||
			</IntVectorALU>
 | 
			
		||||
			
 | 
			
		||||
			<IntVectorMul>
 | 
			
		||||
				<Num>2</Num>
 | 
			
		||||
				<Latency>3</Latency>
 | 
			
		||||
				<ReciprocalOfThroughput>1</ReciprocalOfThroughput>
 | 
			
		||||
				<PortNumber>0</PortNumber>
 | 
			
		||||
				<PortNumber>1</PortNumber>
 | 
			
		||||
				<LeakageEnergy>0.0271</LeakageEnergy>
 | 
			
		||||
				<DynamicEnergy>0.6514</DynamicEnergy>			
 | 
			
		||||
			</IntVectorMul>
 | 
			
		||||
			
 | 
			
		||||
			<FloatVectorALU>
 | 
			
		||||
				<Num>0</Num>
 | 
			
		||||
				<Latency>3</Latency>
 | 
			
		||||
				<ReciprocalOfThroughput>1</ReciprocalOfThroughput>
 | 
			
		||||
				<PortNumber>0</PortNumber>
 | 
			
		||||
				<PortNumber>1</PortNumber>
 | 
			
		||||
				<PortNumber>5</PortNumber>
 | 
			
		||||
				<LeakageEnergy>0.0271</LeakageEnergy>
 | 
			
		||||
				<DynamicEnergy>0.6514</DynamicEnergy>			
 | 
			
		||||
			</FloatVectorALU>
 | 
			
		||||
			
 | 
			
		||||
			<FloatVectorMul>
 | 
			
		||||
				<Num>0</Num>
 | 
			
		||||
				<Latency>3</Latency>
 | 
			
		||||
				<ReciprocalOfThroughput>1</ReciprocalOfThroughput>
 | 
			
		||||
				<PortNumber>0</PortNumber>
 | 
			
		||||
				<PortNumber>1</PortNumber>
 | 
			
		||||
				<LeakageEnergy>0.0271</LeakageEnergy>
 | 
			
		||||
				<DynamicEnergy>0.6514</DynamicEnergy>			
 | 
			
		||||
			</FloatVectorMul>
 | 
			
		||||
			
 | 
			
		||||
			<FMA>
 | 
			
		||||
				<Num>2</Num>
 | 
			
		||||
				<FPALULatency>4</FPALULatency>
 | 
			
		||||
				<FPMulLatency>4</FPMulLatency>
 | 
			
		||||
				<FPVectorALULatency>4</FPVectorALULatency>
 | 
			
		||||
				<FPVectorMulLatency>4</FPVectorMulLatency>
 | 
			
		||||
				<FMALatency>4</FMALatency>
 | 
			
		||||
				<VectorFMALatency>4</VectorFMALatency>
 | 
			
		||||
				<FPALUReciprocalOfThroughput>3</FPALUReciprocalOfThroughput>
 | 
			
		||||
				<FPMulReciprocalOfThroughput>3</FPMulReciprocalOfThroughput>
 | 
			
		||||
				<FPVectorALUReciprocalOfThroughput>3</FPVectorALUReciprocalOfThroughput>
 | 
			
		||||
				<FPVectorMulReciprocalOfThroughput>3</FPVectorMulReciprocalOfThroughput>
 | 
			
		||||
				<FMAReciprocalOfThroughput>3</FMAReciprocalOfThroughput>
 | 
			
		||||
				<VectorFMAReciprocalOfThroughput>3</VectorFMAReciprocalOfThroughput>
 | 
			
		||||
				<PortNumber>0</PortNumber>
 | 
			
		||||
				<PortNumber>1</PortNumber>
 | 
			
		||||
				<LeakageEnergy>0.0271</LeakageEnergy>
 | 
			
		||||
				<DynamicEnergy>0.6514</DynamicEnergy>			
 | 
			
		||||
			</FMA>
 | 
			
		||||
			
 | 
			
		||||
			<Branch>
 | 
			
		||||
				<Num>2</Num>
 | 
			
		||||
				<Latency>1</Latency>
 | 
			
		||||
				<ReciprocalOfThroughput>1</ReciprocalOfThroughput>
 | 
			
		||||
| 
						 | 
				
			
			@ -279,19 +341,90 @@ TDP = 112W
 | 
			
		|||
				<PortNumber>6</PortNumber>
 | 
			
		||||
				<LeakageEnergy>0.0271</LeakageEnergy>
 | 
			
		||||
				<DynamicEnergy>0.6514</DynamicEnergy>			
 | 
			
		||||
			</Jump>
 | 
			
		||||
			</Branch>
 | 
			
		||||
			
 | 
			
		||||
			<Memory>
 | 
			
		||||
				<Num>4</Num>
 | 
			
		||||
			<Load>
 | 
			
		||||
				<Num>2</Num>
 | 
			
		||||
				<Latency>1</Latency>
 | 
			
		||||
				<ReciprocalOfThroughput>1</ReciprocalOfThroughput>
 | 
			
		||||
				<PortNumber>2</PortNumber>
 | 
			
		||||
				<PortNumber>3</PortNumber>
 | 
			
		||||
				<LeakageEnergy>0.0271</LeakageEnergy>
 | 
			
		||||
				<DynamicEnergy>0.6514</DynamicEnergy>			
 | 
			
		||||
			</Load>
 | 
			
		||||
			
 | 
			
		||||
			<LoadAGU>
 | 
			
		||||
				<Num>2</Num>
 | 
			
		||||
				<Latency>1</Latency>
 | 
			
		||||
				<ReciprocalOfThroughput>1</ReciprocalOfThroughput>
 | 
			
		||||
				<PortNumber>2</PortNumber>
 | 
			
		||||
				<PortNumber>3</PortNumber>
 | 
			
		||||
				<LeakageEnergy>0.0271</LeakageEnergy>
 | 
			
		||||
				<DynamicEnergy>0.6514</DynamicEnergy>			
 | 
			
		||||
			</LoadAGU>
 | 
			
		||||
			
 | 
			
		||||
			<Store>
 | 
			
		||||
				<Num>1</Num>
 | 
			
		||||
				<Latency>1</Latency>
 | 
			
		||||
				<ReciprocalOfThroughput>1</ReciprocalOfThroughput>
 | 
			
		||||
				<PortNumber>4</PortNumber>
 | 
			
		||||
				<LeakageEnergy>0.0271</LeakageEnergy>
 | 
			
		||||
				<DynamicEnergy>0.6514</DynamicEnergy>			
 | 
			
		||||
			</Store>
 | 
			
		||||
			
 | 
			
		||||
			<StoreAGU>
 | 
			
		||||
				<Num>1</Num>
 | 
			
		||||
				<Latency>1</Latency>
 | 
			
		||||
				<ReciprocalOfThroughput>1</ReciprocalOfThroughput>
 | 
			
		||||
				<PortNumber>7</PortNumber>
 | 
			
		||||
				<LeakageEnergy>0.0271</LeakageEnergy>
 | 
			
		||||
				<DynamicEnergy>0.6514</DynamicEnergy>			
 | 
			
		||||
			</Memory>
 | 
			
		||||
			</StoreAGU>
 | 
			
		||||
			
 | 
			
		||||
			<AES>
 | 
			
		||||
				<Num>1</Num>
 | 
			
		||||
				<Latency>24</Latency>
 | 
			
		||||
				<ReciprocalOfThroughput>12</ReciprocalOfThroughput>
 | 
			
		||||
				<PortNumber>0</PortNumber>
 | 
			
		||||
				<LeakageEnergy>0.0271</LeakageEnergy>
 | 
			
		||||
				<DynamicEnergy>0.6514</DynamicEnergy>			
 | 
			
		||||
			</AES>
 | 
			
		||||
			
 | 
			
		||||
			<VectorString>
 | 
			
		||||
				<Num>1</Num>
 | 
			
		||||
				<Latency>24</Latency>
 | 
			
		||||
				<ReciprocalOfThroughput>12</ReciprocalOfThroughput>
 | 
			
		||||
				<PortNumber>0</PortNumber>
 | 
			
		||||
				<LeakageEnergy>0.0271</LeakageEnergy>
 | 
			
		||||
				<DynamicEnergy>0.6514</DynamicEnergy>			
 | 
			
		||||
			</VectorString>
 | 
			
		||||
			
 | 
			
		||||
			<BitScan>
 | 
			
		||||
				<Num>1</Num>
 | 
			
		||||
				<Latency>24</Latency>
 | 
			
		||||
				<ReciprocalOfThroughput>12</ReciprocalOfThroughput>
 | 
			
		||||
				<PortNumber>1</PortNumber>
 | 
			
		||||
				<LeakageEnergy>0.0271</LeakageEnergy>
 | 
			
		||||
				<DynamicEnergy>0.6514</DynamicEnergy>			
 | 
			
		||||
			</BitScan>
 | 
			
		||||
			
 | 
			
		||||
			<VectorShuffle>
 | 
			
		||||
				<Num>1</Num>
 | 
			
		||||
				<Latency>24</Latency>
 | 
			
		||||
				<ReciprocalOfThroughput>12</ReciprocalOfThroughput>
 | 
			
		||||
				<PortNumber>5</PortNumber>
 | 
			
		||||
				<LeakageEnergy>0.0271</LeakageEnergy>
 | 
			
		||||
				<DynamicEnergy>0.6514</DynamicEnergy>			
 | 
			
		||||
			</VectorShuffle>
 | 
			
		||||
			
 | 
			
		||||
			<LEA>
 | 
			
		||||
				<Num>1</Num>
 | 
			
		||||
				<Latency>24</Latency>
 | 
			
		||||
				<ReciprocalOfThroughput>12</ReciprocalOfThroughput>
 | 
			
		||||
				<PortNumber>5</PortNumber>
 | 
			
		||||
				<LeakageEnergy>0.0271</LeakageEnergy>
 | 
			
		||||
				<DynamicEnergy>0.6514</DynamicEnergy>			
 | 
			
		||||
			</LEA>
 | 
			
		||||
			
 | 
			
		||||
			<ResultsBroadcastBus>
 | 
			
		||||
				<LeakageEnergy>0.0239</LeakageEnergy>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,15 +0,0 @@
 | 
			
		|||
package emulatorinterface.translator.visaHandler;
 | 
			
		||||
 | 
			
		||||
import emulatorinterface.DynamicInstructionBuffer;
 | 
			
		||||
import generic.Instruction;
 | 
			
		||||
import generic.InstructionTable;
 | 
			
		||||
 | 
			
		||||
public class Mov implements DynamicInstructionHandler 
 | 
			
		||||
{
 | 
			
		||||
	public int handle(int microOpIndex, 
 | 
			
		||||
			Instruction microOp, DynamicInstructionBuffer dynamicInstructionBuffer) 
 | 
			
		||||
	{
 | 
			
		||||
		//nothing to be done in such cases
 | 
			
		||||
		return ++microOpIndex;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,15 +0,0 @@
 | 
			
		|||
package emulatorinterface.translator.visaHandler;
 | 
			
		||||
 | 
			
		||||
import emulatorinterface.DynamicInstructionBuffer;
 | 
			
		||||
import generic.Instruction;
 | 
			
		||||
import generic.InstructionTable;
 | 
			
		||||
 | 
			
		||||
public class Xchg implements DynamicInstructionHandler 
 | 
			
		||||
{
 | 
			
		||||
	public int handle(int microOpIndex, 
 | 
			
		||||
			Instruction microOp, DynamicInstructionBuffer dynamicInstructionBuffer) 
 | 
			
		||||
	{
 | 
			
		||||
		//nothing to be done in such cases
 | 
			
		||||
		return ++microOpIndex;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,63 +0,0 @@
 | 
			
		|||
/*****************************************************************************
 | 
			
		||||
				Tejas Simulator
 | 
			
		||||
------------------------------------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
   Copyright [2010] [Indian Institute of Technology, Delhi]
 | 
			
		||||
   Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
   you may not use this file except in compliance with the License.
 | 
			
		||||
   You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
       http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
   Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
   distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
   See the License for the specific language governing permissions and
 | 
			
		||||
   limitations under the License.
 | 
			
		||||
------------------------------------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
	Contributors:  Prathmesh Kallurkar
 | 
			
		||||
*****************************************************************************/
 | 
			
		||||
 | 
			
		||||
package emulatorinterface.translator.x86.instruction;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
import emulatorinterface.translator.InvalidInstructionException;
 | 
			
		||||
import emulatorinterface.translator.x86.registers.Registers;
 | 
			
		||||
import emulatorinterface.translator.x86.registers.TempRegisterNum;
 | 
			
		||||
import generic.Instruction;
 | 
			
		||||
import generic.Operand;
 | 
			
		||||
import generic.InstructionList;
 | 
			
		||||
import generic.OperandType;
 | 
			
		||||
 | 
			
		||||
public class ConvertFloatToInteger implements X86StaticInstructionHandler 
 | 
			
		||||
{
 | 
			
		||||
	public void handle(long instructionPointer, 
 | 
			
		||||
			Operand operand1, Operand operand2, Operand operand3,
 | 
			
		||||
			InstructionList instructionArrayList,
 | 
			
		||||
			TempRegisterNum tempRegisterNum) 
 | 
			
		||||
					throws InvalidInstructionException
 | 
			
		||||
	{
 | 
			
		||||
		if((operand1!=null && operand1.getOperandType()==OperandType.integerRegister) && 
 | 
			
		||||
			(operand2!=null && operand2.getOperandType()==OperandType.floatRegister ) && 
 | 
			
		||||
			operand3==null)
 | 
			
		||||
		{
 | 
			
		||||
			instructionArrayList.appendInstruction(Instruction.getMoveInstruction(operand1, operand2));
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		else if((operand1!=null && operand1.getOperandType()==OperandType.integerRegister) && 
 | 
			
		||||
			(operand2!=null && operand2.getOperandType()==OperandType.memory ) && 
 | 
			
		||||
			operand3==null)
 | 
			
		||||
		{
 | 
			
		||||
			// Load from memory to integer register directly
 | 
			
		||||
			instructionArrayList.appendInstruction(Instruction.getLoadInstruction(operand2, operand1));
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			//misc.Error.showErrorAndExit("incorrect format : " + "\nop1=" + operand1 + "\nop2=" + operand2 + "\nop3=" + operand3);
 | 
			
		||||
			misc.Error.invalidOperation("Convert Floating Point to Integer", operand1, operand2, operand3);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,63 +0,0 @@
 | 
			
		|||
/*****************************************************************************
 | 
			
		||||
				Tejas Simulator
 | 
			
		||||
------------------------------------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
   Copyright [2010] [Indian Institute of Technology, Delhi]
 | 
			
		||||
   Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
   you may not use this file except in compliance with the License.
 | 
			
		||||
   You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
       http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
   Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
   distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
   See the License for the specific language governing permissions and
 | 
			
		||||
   limitations under the License.
 | 
			
		||||
------------------------------------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
	Contributors:  Prathmesh Kallurkar
 | 
			
		||||
*****************************************************************************/
 | 
			
		||||
 | 
			
		||||
package emulatorinterface.translator.x86.instruction;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
import emulatorinterface.translator.InvalidInstructionException;
 | 
			
		||||
import emulatorinterface.translator.x86.registers.Registers;
 | 
			
		||||
import emulatorinterface.translator.x86.registers.TempRegisterNum;
 | 
			
		||||
import generic.Instruction;
 | 
			
		||||
import generic.Operand;
 | 
			
		||||
import generic.InstructionList;
 | 
			
		||||
import generic.OperandType;
 | 
			
		||||
 | 
			
		||||
public class ConvertIntegerToFloat implements X86StaticInstructionHandler 
 | 
			
		||||
{
 | 
			
		||||
	public void handle(long instructionPointer, 
 | 
			
		||||
			Operand operand1, Operand operand2, Operand operand3,
 | 
			
		||||
			InstructionList instructionArrayList,
 | 
			
		||||
			TempRegisterNum tempRegisterNum) 
 | 
			
		||||
					throws InvalidInstructionException
 | 
			
		||||
	{
 | 
			
		||||
		if((operand1!=null && operand1.getOperandType()==OperandType.floatRegister) && 
 | 
			
		||||
			(operand2!=null && operand2.getOperandType()==OperandType.integerRegister ) && 
 | 
			
		||||
			operand3==null)
 | 
			
		||||
		{
 | 
			
		||||
			instructionArrayList.appendInstruction(Instruction.getMoveInstruction(operand1, operand2));
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		else if((operand1!=null && operand1.getOperandType()==OperandType.floatRegister) && 
 | 
			
		||||
			(operand2!=null && operand2.getOperandType()==OperandType.memory ) && 
 | 
			
		||||
			operand3==null)
 | 
			
		||||
		{
 | 
			
		||||
			// Load from memory to integer register directly
 | 
			
		||||
			instructionArrayList.appendInstruction(Instruction.getLoadInstruction(operand2, operand1));
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			//misc.Error.showErrorAndExit("incorrect format : " + "\nop1=" + operand1 + "\nop2=" + operand2 + "\nop3=" + operand3);
 | 
			
		||||
			misc.Error.invalidOperation("Convert Integer to Floating point", operand1, operand2, operand3);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -836,7 +836,7 @@ public class InstructionClassTable {
 | 
			
		|||
		
 | 
			
		||||
		
 | 
			
		||||
		/*
 | 
			
		||||
		 * TODO cache directives like flush, no-allocate, prefetch
 | 
			
		||||
		 * TODO cache directives like flush, no-allocate
 | 
			
		||||
		 * atomic memory operations
 | 
			
		||||
		 * input and output from/ to ports
 | 
			
		||||
		 * interrupts
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,76 +0,0 @@
 | 
			
		|||
/*****************************************************************************
 | 
			
		||||
				Tejas Simulator
 | 
			
		||||
------------------------------------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
   Copyright [2010] [Indian Institute of Technology, Delhi]
 | 
			
		||||
   Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
   you may not use this file except in compliance with the License.
 | 
			
		||||
   You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
       http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
   Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
   distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
   See the License for the specific language governing permissions and
 | 
			
		||||
   limitations under the License.
 | 
			
		||||
------------------------------------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
	Contributors:  Prathmesh Kallurkar
 | 
			
		||||
*****************************************************************************/
 | 
			
		||||
 | 
			
		||||
package emulatorinterface.translator.x86.instruction;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
import emulatorinterface.translator.InvalidInstructionException;
 | 
			
		||||
import emulatorinterface.translator.x86.registers.Registers;
 | 
			
		||||
import emulatorinterface.translator.x86.registers.TempRegisterNum;
 | 
			
		||||
import generic.Instruction;
 | 
			
		||||
import generic.Operand;
 | 
			
		||||
import generic.InstructionList;
 | 
			
		||||
 | 
			
		||||
public class SSEALU implements X86StaticInstructionHandler 
 | 
			
		||||
{
 | 
			
		||||
	public void handle(long instructionPointer, 
 | 
			
		||||
			Operand operand1, Operand operand2, Operand operand3,
 | 
			
		||||
			InstructionList instructionArrayList,
 | 
			
		||||
			TempRegisterNum tempRegisterNum)
 | 
			
		||||
					throws InvalidInstructionException
 | 
			
		||||
	{
 | 
			
		||||
 | 
			
		||||
		if(operand1.isFloatRegisterOperand() && operand2.isFloatRegisterOperand() &&
 | 
			
		||||
				operand3==null)
 | 
			
		||||
		{
 | 
			
		||||
			//operand1 = operand1 + operand2
 | 
			
		||||
			instructionArrayList.appendInstruction(Instruction.getFloatingPointALU(operand1,
 | 
			
		||||
					operand2, operand1));
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		else if(operand1.isFloatRegisterOperand() && operand2.isFloatRegisterOperand() &&
 | 
			
		||||
				operand3.isFloatRegisterOperand())
 | 
			
		||||
		{
 | 
			
		||||
			//operand1 = operand2 + operand3
 | 
			
		||||
			instructionArrayList.appendInstruction(Instruction.getFloatingPointALU(operand2,
 | 
			
		||||
					operand3, operand1));
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		else if(operand1.isFloatRegisterOperand() && operand2.isMemoryOperand() &&
 | 
			
		||||
				operand3==null)
 | 
			
		||||
		{
 | 
			
		||||
			//tempFloatRegister = [operand2]
 | 
			
		||||
			Operand tempFloatRegister = Registers.getTempFloatReg(tempRegisterNum);
 | 
			
		||||
	
 | 
			
		||||
			instructionArrayList.appendInstruction(Instruction.getLoadInstruction(operand2,
 | 
			
		||||
					tempFloatRegister));
 | 
			
		||||
			
 | 
			
		||||
			//operand1 = operand1 +/- tempFloatRegister
 | 
			
		||||
			instructionArrayList.appendInstruction(Instruction.getFloatingPointALU(operand1,
 | 
			
		||||
					tempFloatRegister, operand1));
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			misc.Error.invalidOperation("SSE ALU Operation", operand1, operand2, operand3);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,52 +0,0 @@
 | 
			
		|||
package emulatorinterface.translator.x86.instruction;
 | 
			
		||||
 | 
			
		||||
import emulatorinterface.translator.InvalidInstructionException;
 | 
			
		||||
import emulatorinterface.translator.x86.registers.Registers;
 | 
			
		||||
import emulatorinterface.translator.x86.registers.TempRegisterNum;
 | 
			
		||||
import generic.Instruction;
 | 
			
		||||
import generic.InstructionList;
 | 
			
		||||
import generic.Operand;
 | 
			
		||||
 | 
			
		||||
public class SSEComparePackedData implements X86StaticInstructionHandler {
 | 
			
		||||
	
 | 
			
		||||
	public void handle(long instructionPointer, 
 | 
			
		||||
			Operand operand1, Operand operand2, Operand operand3,
 | 
			
		||||
			InstructionList instructionArrayList,
 | 
			
		||||
			TempRegisterNum tempRegisterNum)
 | 
			
		||||
					throws InvalidInstructionException
 | 
			
		||||
	{
 | 
			
		||||
		if(operand1!=null && operand2!=null && operand3==null) {
 | 
			
		||||
			Operand srcOperand, dstOperand;
 | 
			
		||||
			
 | 
			
		||||
			// src operand into temporary
 | 
			
		||||
			if(operand2.isMemoryOperand()) {
 | 
			
		||||
				Operand tmp = Registers.getTempFloatReg(tempRegisterNum);
 | 
			
		||||
				instructionArrayList.appendInstruction(
 | 
			
		||||
					Instruction.getLoadInstruction(operand2, tmp));
 | 
			
		||||
				srcOperand = tmp;
 | 
			
		||||
			} else {
 | 
			
		||||
				srcOperand = operand2;
 | 
			
		||||
			}
 | 
			
		||||
			
 | 
			
		||||
			// dst operand into temporary
 | 
			
		||||
			if(operand1.isMemoryOperand()) {
 | 
			
		||||
				Operand tmp = Registers.getTempFloatReg(tempRegisterNum);
 | 
			
		||||
				instructionArrayList.appendInstruction(
 | 
			
		||||
					Instruction.getLoadInstruction(operand1, tmp));
 | 
			
		||||
				dstOperand = tmp;
 | 
			
		||||
			} else {
 | 
			
		||||
				dstOperand = operand1;
 | 
			
		||||
			}
 | 
			
		||||
			
 | 
			
		||||
			// perform the floating point compare
 | 
			
		||||
			instructionArrayList.appendInstruction(
 | 
			
		||||
				Instruction.getFloatingPointALU(srcOperand, dstOperand, dstOperand));
 | 
			
		||||
			
 | 
			
		||||
			// if the original destination operand was memory, then store the result back
 | 
			
		||||
			if(operand1.isMemoryOperand()) {
 | 
			
		||||
				instructionArrayList.appendInstruction(
 | 
			
		||||
						Instruction.getStoreInstruction(operand1, dstOperand));
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,67 +0,0 @@
 | 
			
		|||
/*****************************************************************************
 | 
			
		||||
				Tejas Simulator
 | 
			
		||||
------------------------------------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
   Copyright [2010] [Indian Institute of Technology, Delhi]
 | 
			
		||||
   Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
   you may not use this file except in compliance with the License.
 | 
			
		||||
   You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
       http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
   Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
   distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
   See the License for the specific language governing permissions and
 | 
			
		||||
   limitations under the License.
 | 
			
		||||
------------------------------------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
	Contributors:  Prathmesh Kallurkar
 | 
			
		||||
*****************************************************************************/
 | 
			
		||||
 | 
			
		||||
package emulatorinterface.translator.x86.instruction;
 | 
			
		||||
 | 
			
		||||
import emulatorinterface.translator.InvalidInstructionException;
 | 
			
		||||
import emulatorinterface.translator.x86.registers.Registers;
 | 
			
		||||
import emulatorinterface.translator.x86.registers.TempRegisterNum;
 | 
			
		||||
import generic.Instruction;
 | 
			
		||||
import generic.InstructionLinkedList;
 | 
			
		||||
import generic.Operand;
 | 
			
		||||
import generic.InstructionList;
 | 
			
		||||
 | 
			
		||||
public class SSEDivision implements X86StaticInstructionHandler 
 | 
			
		||||
{
 | 
			
		||||
	public void handle(long instructionPointer, 
 | 
			
		||||
			Operand operand1, Operand operand2, Operand operand3,
 | 
			
		||||
			InstructionList instructionArrayList,
 | 
			
		||||
			TempRegisterNum tempRegisterNum) 
 | 
			
		||||
					throws InvalidInstructionException
 | 
			
		||||
	{
 | 
			
		||||
		if(operand1.isFloatRegisterOperand() && operand2.isFloatRegisterOperand() &&
 | 
			
		||||
				operand3==null)
 | 
			
		||||
		{
 | 
			
		||||
			//operand1 = operand1 / operand2
 | 
			
		||||
			instructionArrayList.appendInstruction(Instruction.getFloatingPointDivision(operand1,
 | 
			
		||||
					operand2, operand1));
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		else if(operand1.isFloatRegisterOperand() && operand2.isMemoryOperand() &&
 | 
			
		||||
				operand3==null)
 | 
			
		||||
		{
 | 
			
		||||
			//tempFloatRegister = [operand2]
 | 
			
		||||
			Operand tempFloatRegister = Registers.getTempFloatReg(tempRegisterNum);
 | 
			
		||||
			
 | 
			
		||||
			instructionArrayList.appendInstruction(Instruction.getLoadInstruction(operand2,
 | 
			
		||||
					tempFloatRegister));
 | 
			
		||||
			
 | 
			
		||||
			//operand1 = operand1 / tempFloatRegister
 | 
			
		||||
			instructionArrayList.appendInstruction(Instruction.getFloatingPointDivision(operand1,
 | 
			
		||||
					tempFloatRegister, operand1));
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			misc.Error.invalidOperation("SSE Division", operand1, operand2, operand3);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,68 +0,0 @@
 | 
			
		|||
/*****************************************************************************
 | 
			
		||||
				Tejas Simulator
 | 
			
		||||
------------------------------------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
   Copyright [2010] [Indian Institute of Technology, Delhi]
 | 
			
		||||
   Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
   you may not use this file except in compliance with the License.
 | 
			
		||||
   You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
       http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
   Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
   distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
   See the License for the specific language governing permissions and
 | 
			
		||||
   limitations under the License.
 | 
			
		||||
------------------------------------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
	Contributors:  Prathmesh Kallurkar
 | 
			
		||||
*****************************************************************************/
 | 
			
		||||
 | 
			
		||||
package emulatorinterface.translator.x86.instruction;
 | 
			
		||||
 | 
			
		||||
import emulatorinterface.translator.InvalidInstructionException;
 | 
			
		||||
import emulatorinterface.translator.x86.registers.TempRegisterNum;
 | 
			
		||||
import generic.Instruction;
 | 
			
		||||
import generic.InstructionLinkedList;
 | 
			
		||||
import generic.Operand;
 | 
			
		||||
import generic.InstructionList;
 | 
			
		||||
 | 
			
		||||
public class SSEMove implements X86StaticInstructionHandler 
 | 
			
		||||
{
 | 
			
		||||
	public void handle(long instructionPointer, 
 | 
			
		||||
			Operand operand1, Operand operand2, Operand operand3,
 | 
			
		||||
			InstructionList instructionArrayList,
 | 
			
		||||
			TempRegisterNum tempRegisterNum) 
 | 
			
		||||
					throws InvalidInstructionException
 | 
			
		||||
	{
 | 
			
		||||
		if(operand1.isFloatRegisterOperand() && operand2.isFloatRegisterOperand()
 | 
			
		||||
				&& operand3==null)
 | 
			
		||||
		{
 | 
			
		||||
			//If both operands are registers use a simple move operation.
 | 
			
		||||
			instructionArrayList.appendInstruction(Instruction.getMoveInstruction(operand1,
 | 
			
		||||
					operand2));
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		else if(operand1.isFloatRegisterOperand() && operand2.isMemoryOperand() 
 | 
			
		||||
				&& operand3==null)
 | 
			
		||||
		{
 | 
			
		||||
			//If the source operand is a memory location then use a load operation
 | 
			
		||||
			instructionArrayList.appendInstruction(Instruction.getLoadInstruction(operand2,
 | 
			
		||||
					operand1));
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		else if(operand1.isMemoryOperand() && operand2.isFloatRegisterOperand() 
 | 
			
		||||
				&& operand3==null)
 | 
			
		||||
		{
 | 
			
		||||
			//If the destination operand is a memory location, its a store operation
 | 
			
		||||
			instructionArrayList.appendInstruction(Instruction.getStoreInstruction(operand1,
 | 
			
		||||
					operand2));
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			misc.Error.invalidOperation("SSE Move", operand1, operand2, operand3);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,66 +0,0 @@
 | 
			
		|||
/*****************************************************************************
 | 
			
		||||
				Tejas Simulator
 | 
			
		||||
------------------------------------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
   Copyright [2010] [Indian Institute of Technology, Delhi]
 | 
			
		||||
   Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
   you may not use this file except in compliance with the License.
 | 
			
		||||
   You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
       http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
   Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
   distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
   See the License for the specific language governing permissions and
 | 
			
		||||
   limitations under the License.
 | 
			
		||||
------------------------------------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
	Contributors:  Prathmesh Kallurkar
 | 
			
		||||
*****************************************************************************/
 | 
			
		||||
 | 
			
		||||
package emulatorinterface.translator.x86.instruction;
 | 
			
		||||
 | 
			
		||||
import emulatorinterface.translator.InvalidInstructionException;
 | 
			
		||||
import emulatorinterface.translator.x86.registers.Registers;
 | 
			
		||||
import emulatorinterface.translator.x86.registers.TempRegisterNum;
 | 
			
		||||
import generic.Instruction;
 | 
			
		||||
import generic.InstructionLinkedList;
 | 
			
		||||
import generic.Operand;
 | 
			
		||||
import generic.InstructionList;
 | 
			
		||||
 | 
			
		||||
public class SSEMultiplication implements X86StaticInstructionHandler 
 | 
			
		||||
{
 | 
			
		||||
	public void handle(long instructionPointer, 
 | 
			
		||||
			Operand operand1, Operand operand2, Operand operand3,
 | 
			
		||||
			InstructionList instructionArrayList,
 | 
			
		||||
			TempRegisterNum tempRegisterNum)
 | 
			
		||||
					throws InvalidInstructionException
 | 
			
		||||
	{
 | 
			
		||||
		if(operand1.isFloatRegisterOperand() && operand2.isFloatRegisterOperand() &&
 | 
			
		||||
				operand3==null)
 | 
			
		||||
		{
 | 
			
		||||
			//operand1 = operand1 * operand2
 | 
			
		||||
			instructionArrayList.appendInstruction(Instruction.getFloatingPointMultiplication(operand1,
 | 
			
		||||
					operand2, operand1));
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		else if(operand1.isFloatRegisterOperand() && operand2.isMemoryOperand() &&
 | 
			
		||||
				operand3==null)
 | 
			
		||||
		{
 | 
			
		||||
			//tempFloatRegister = [operand2]
 | 
			
		||||
			Operand tempFloatRegister = Registers.getTempFloatReg(tempRegisterNum);
 | 
			
		||||
			instructionArrayList.appendInstruction(Instruction.getLoadInstruction(operand2,
 | 
			
		||||
					tempFloatRegister));
 | 
			
		||||
			
 | 
			
		||||
			//operand1 = operand1 * tempFloatRegister
 | 
			
		||||
			instructionArrayList.appendInstruction(Instruction.getFloatingPointMultiplication(operand1,
 | 
			
		||||
					tempFloatRegister, operand1));
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			misc.Error.invalidOperation("SSE Multiplication", operand1, operand2, operand3);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,67 +0,0 @@
 | 
			
		|||
/*****************************************************************************
 | 
			
		||||
				Tejas Simulator
 | 
			
		||||
------------------------------------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
   Copyright [2010] [Indian Institute of Technology, Delhi]
 | 
			
		||||
   Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
   you may not use this file except in compliance with the License.
 | 
			
		||||
   You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
       http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
   Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
   distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
   See the License for the specific language governing permissions and
 | 
			
		||||
   limitations under the License.
 | 
			
		||||
------------------------------------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
	Contributors:  Prathmesh Kallurkar
 | 
			
		||||
*****************************************************************************/
 | 
			
		||||
 | 
			
		||||
package emulatorinterface.translator.x86.instruction;
 | 
			
		||||
 | 
			
		||||
import emulatorinterface.translator.InvalidInstructionException;
 | 
			
		||||
import emulatorinterface.translator.x86.operand.OperandTranslator;
 | 
			
		||||
import emulatorinterface.translator.x86.registers.TempRegisterNum;
 | 
			
		||||
import generic.Instruction;
 | 
			
		||||
import generic.Operand;
 | 
			
		||||
import generic.InstructionList;
 | 
			
		||||
 | 
			
		||||
public class ShiftOperationThreeOperand implements X86StaticInstructionHandler 
 | 
			
		||||
{
 | 
			
		||||
	public void handle(long instructionPointer, 
 | 
			
		||||
			Operand operand1, Operand operand2, Operand operand3,
 | 
			
		||||
			InstructionList instructionArrayList,
 | 
			
		||||
			TempRegisterNum tempRegisterNum) 
 | 
			
		||||
					throws InvalidInstructionException
 | 
			
		||||
	{
 | 
			
		||||
		if(
 | 
			
		||||
		   (operand1.isIntegerRegisterOperand() || operand1.isMemoryOperand()) &&
 | 
			
		||||
		   (operand2.isIntegerRegisterOperand()) &&
 | 
			
		||||
		   (operand3.isIntegerRegisterOperand() || operand3.isImmediateOperand()))
 | 
			
		||||
		{
 | 
			
		||||
			Operand destination;
 | 
			
		||||
			if(operand1.isMemoryOperand())
 | 
			
		||||
			{
 | 
			
		||||
				destination = OperandTranslator.getLocationToStoreValue(operand1, tempRegisterNum);
 | 
			
		||||
			}
 | 
			
		||||
			else
 | 
			
		||||
			{
 | 
			
		||||
				destination = operand1;
 | 
			
		||||
			}
 | 
			
		||||
			
 | 
			
		||||
			instructionArrayList.appendInstruction(Instruction.getIntALUInstruction(
 | 
			
		||||
					operand2, operand3, destination));
 | 
			
		||||
			
 | 
			
		||||
			if(operand1.isMemoryOperand())
 | 
			
		||||
			{
 | 
			
		||||
				instructionArrayList.appendInstruction(Instruction.getStoreInstruction(operand1, destination));
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			misc.Error.invalidOperation("Shift operation three operands", operand1, operand2, operand3);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,74 +0,0 @@
 | 
			
		|||
/*****************************************************************************
 | 
			
		||||
				Tejas Simulator
 | 
			
		||||
------------------------------------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
   Copyright [2010] [Indian Institute of Technology, Delhi]
 | 
			
		||||
   Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
   you may not use this file except in compliance with the License.
 | 
			
		||||
   You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
       http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
   Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
   distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
   See the License for the specific language governing permissions and
 | 
			
		||||
   limitations under the License.
 | 
			
		||||
------------------------------------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
	Contributors:  Prathmesh Kallurkar
 | 
			
		||||
*****************************************************************************/
 | 
			
		||||
 | 
			
		||||
package emulatorinterface.translator.x86.instruction;
 | 
			
		||||
 | 
			
		||||
import emulatorinterface.translator.InvalidInstructionException;
 | 
			
		||||
import emulatorinterface.translator.x86.operand.OperandTranslator;
 | 
			
		||||
import emulatorinterface.translator.x86.registers.TempRegisterNum;
 | 
			
		||||
import generic.Instruction;
 | 
			
		||||
import generic.Operand;
 | 
			
		||||
import generic.InstructionLinkedList;
 | 
			
		||||
import generic.InstructionList;
 | 
			
		||||
 | 
			
		||||
public class SingleOperandIntALU implements X86StaticInstructionHandler 
 | 
			
		||||
{
 | 
			
		||||
	public void handle(long instructionPointer, 
 | 
			
		||||
			Operand operand1, Operand operand2, Operand operand3,
 | 
			
		||||
			InstructionList instructionArrayList,
 | 
			
		||||
			TempRegisterNum tempRegisterNum) 
 | 
			
		||||
					throws InvalidInstructionException
 | 
			
		||||
	{
 | 
			
		||||
		if(
 | 
			
		||||
		(operand1.isIntegerRegisterOperand() || operand1.isMemoryOperand()) &&
 | 
			
		||||
		 operand2==null && operand3==null)
 | 
			
		||||
		{
 | 
			
		||||
			Operand operand1ValueOperand;
 | 
			
		||||
			
 | 
			
		||||
			//get value-operand for operand1
 | 
			
		||||
			if(operand1.isMemoryOperand())
 | 
			
		||||
			{
 | 
			
		||||
				operand1ValueOperand = OperandTranslator.getLocationToStoreValue(operand1, tempRegisterNum);
 | 
			
		||||
				instructionArrayList.appendInstruction(Instruction.getLoadInstruction(operand1, operand1ValueOperand));
 | 
			
		||||
			}
 | 
			
		||||
			else
 | 
			
		||||
			{
 | 
			
		||||
				operand1ValueOperand = operand1;
 | 
			
		||||
			}
 | 
			
		||||
			
 | 
			
		||||
 | 
			
		||||
			//Perform integer alu operation
 | 
			
		||||
			instructionArrayList.appendInstruction(Instruction.getIntALUInstruction(
 | 
			
		||||
					null, operand1ValueOperand, operand1ValueOperand));
 | 
			
		||||
 | 
			
		||||
			
 | 
			
		||||
			//If operand1 is a memory operand, then perform a store operation too
 | 
			
		||||
			if(operand1.isMemoryOperand())
 | 
			
		||||
			{
 | 
			
		||||
				instructionArrayList.appendInstruction(Instruction.getStoreInstruction(operand1, operand1ValueOperand));
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			misc.Error.invalidOperation("Integer ALU Operation involving a single operand !!", operand1, operand2, operand3);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -104,7 +104,7 @@ public class ObjParser
 | 
			
		|||
		
 | 
			
		||||
		// Branch address
 | 
			
		||||
		Operand branchAddress = Operand.getImmediateOperand();
 | 
			
		||||
		staticBranchMicroOp = Instruction.getBranchInstruction(branchAddress);
 | 
			
		||||
		staticBranchMicroOp = Instruction.getBranchInstruction(branchAddress, Registers.getEFlagsRegister());
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	/**
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -157,8 +157,7 @@ public class OperandTranslator
 | 
			
		|||
		{
 | 
			
		||||
			misc.Error.showErrorAndExit("\n\tIllegal arguments to a memory address : " 
 | 
			
		||||
					+ operandStr + " !!");
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		}		
 | 
			
		||||
		
 | 
			
		||||
		Operand base, offset, index,scale;
 | 
			
		||||
		String indexStr = null, scaleStr = null;
 | 
			
		||||
| 
						 | 
				
			
			@ -353,4 +352,40 @@ public class OperandTranslator
 | 
			
		|||
		
 | 
			
		||||
		return tempMemoryRegister;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public static Operand processSourceMemoryOperand(Operand sourceOperand,
 | 
			
		||||
			InstructionList instructionArrayList,
 | 
			
		||||
			TempRegisterNum tempRegisterNum,
 | 
			
		||||
			boolean loadingInteger)
 | 
			
		||||
	{
 | 
			
		||||
		Operand operandAddressOperand = OperandTranslator.getLocationToStoreValue(sourceOperand, tempRegisterNum);
 | 
			
		||||
		instructionArrayList.appendInstruction(Instruction.getLoadAGUInstruction(sourceOperand.getMemoryLocationFirstOperand(), sourceOperand.getMemoryLocationSecondOperand(), operandAddressOperand));
 | 
			
		||||
		Operand operandValueOperand;
 | 
			
		||||
		if(loadingInteger)
 | 
			
		||||
			operandValueOperand = Registers.getTempIntReg(tempRegisterNum);
 | 
			
		||||
		else
 | 
			
		||||
			operandValueOperand = Registers.getTempFloatReg(tempRegisterNum);
 | 
			
		||||
		instructionArrayList.appendInstruction(Instruction.getLoadInstruction(operandAddressOperand, operandValueOperand));
 | 
			
		||||
		return operandValueOperand;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public static void processSourceMemoryOperand(Operand sourceOperand,
 | 
			
		||||
			Operand destinationOperand,
 | 
			
		||||
			InstructionList instructionArrayList,
 | 
			
		||||
			TempRegisterNum tempRegisterNum)
 | 
			
		||||
	{
 | 
			
		||||
		Operand operandAddressOperand = OperandTranslator.getLocationToStoreValue(sourceOperand, tempRegisterNum);
 | 
			
		||||
		instructionArrayList.appendInstruction(Instruction.getLoadAGUInstruction(sourceOperand.getMemoryLocationFirstOperand(), sourceOperand.getMemoryLocationSecondOperand(), operandAddressOperand));
 | 
			
		||||
		instructionArrayList.appendInstruction(Instruction.getLoadInstruction(operandAddressOperand, destinationOperand));
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public static void processDestinationMemoryOperand(Operand sourceOperand,
 | 
			
		||||
			Operand destinationOperand,
 | 
			
		||||
			InstructionList instructionArrayList,
 | 
			
		||||
			TempRegisterNum tempRegisterNum)
 | 
			
		||||
	{
 | 
			
		||||
		Operand operandAddressOperand = OperandTranslator.getLocationToStoreValue(destinationOperand, tempRegisterNum);
 | 
			
		||||
		instructionArrayList.appendInstruction(Instruction.getStoreAGUInstruction(destinationOperand.getMemoryLocationFirstOperand(), destinationOperand.getMemoryLocationSecondOperand(), operandAddressOperand));
 | 
			
		||||
		instructionArrayList.appendInstruction(Instruction.getStoreInstruction(operandAddressOperand, sourceOperand));
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -168,6 +168,7 @@ public class Registers
 | 
			
		|||
		floatRegistersHashTable.put("tempFloat1", new Long(26));
 | 
			
		||||
		floatRegistersHashTable.put("tempFloat2", new Long(27));
 | 
			
		||||
		floatRegistersHashTable.put("tempFloat3", new Long(28));
 | 
			
		||||
		floatRegistersHashTable.put("MXCSR", new Long(29));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	
 | 
			
		||||
| 
						 | 
				
			
			@ -315,6 +316,11 @@ public class Registers
 | 
			
		|||
 	{
 | 
			
		||||
 		return Operand.getIntegerRegister(encodeRegister("rax"));
 | 
			
		||||
 	}
 | 
			
		||||
 	
 | 
			
		||||
 	public static Operand getDataRegister()
 | 
			
		||||
 	{
 | 
			
		||||
 		return Operand.getIntegerRegister(encodeRegister("rdx"));
 | 
			
		||||
 	}
 | 
			
		||||
 | 
			
		||||
 	public static Operand getTopFPRegister()
 | 
			
		||||
 	{
 | 
			
		||||
| 
						 | 
				
			
			@ -389,11 +395,26 @@ public class Registers
 | 
			
		|||
		return Operand.getIntegerRegister(encodeRegister("rbp"));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public static Operand getBaseIndexRegister() 
 | 
			
		||||
	{
 | 
			
		||||
		return Operand.getIntegerRegister(encodeRegister("rbx"));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public static Operand getEFlagsRegister() 
 | 
			
		||||
	{
 | 
			
		||||
		return Operand.getIntegerRegister(encodeRegister("eflags"));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public static Operand getFloatingPointControlWord() 
 | 
			
		||||
	{
 | 
			
		||||
		return Operand.getIntegerRegister(encodeRegister("FP_CWORD"));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public static Operand getMXCSR() 
 | 
			
		||||
	{
 | 
			
		||||
		return Operand.getFloatRegister(encodeRegister("MXCSR"));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public static int getMaxIntegerRegisters() {
 | 
			
		||||
		checkAndCreateRegisterHashTable();
 | 
			
		||||
		return integerRegistersHashTable.size();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -207,16 +207,16 @@ public class Core extends SimulationElement{
 | 
			
		|||
		return coreConfig.DecodeWidth;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public int getFloatingPointRegisterFileSize() {
 | 
			
		||||
		return coreConfig.FloatRegFileSize;
 | 
			
		||||
	public int getVectorRegisterFileSize() {
 | 
			
		||||
		return coreConfig.VectorRegFileSize;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public int getIntegerRegisterFileSize() {
 | 
			
		||||
		return coreConfig.IntRegFileSize;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public int getNFloatingPointArchitecturalRegisters() {
 | 
			
		||||
		return coreConfig.FloatArchRegNum;
 | 
			
		||||
	public int getNVectorArchitecturalRegisters() {
 | 
			
		||||
		return coreConfig.VectorArchRegNum;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public int getNIntegerArchitecturalRegisters() {
 | 
			
		||||
| 
						 | 
				
			
			@ -327,8 +327,8 @@ public class Core extends SimulationElement{
 | 
			
		|||
		return coreConfig.intFreeListPower;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public EnergyConfig getFpFreeListPower() {
 | 
			
		||||
		return coreConfig.floatFreeListPower;
 | 
			
		||||
	public EnergyConfig getVectorFreeListPower() {
 | 
			
		||||
		return coreConfig.vectorFreeListPower;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public EnergyConfig getLsqPower() {
 | 
			
		||||
| 
						 | 
				
			
			@ -339,8 +339,8 @@ public class Core extends SimulationElement{
 | 
			
		|||
		return coreConfig.intRegFilePower;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public EnergyConfig getFpRegFilePower() {
 | 
			
		||||
		return coreConfig.floatRegFilePower;
 | 
			
		||||
	public EnergyConfig getVectorRegFilePower() {
 | 
			
		||||
		return coreConfig.vectorRegFilePower;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public EnergyConfig getIwPower() {
 | 
			
		||||
| 
						 | 
				
			
			@ -351,18 +351,6 @@ public class Core extends SimulationElement{
 | 
			
		|||
		return coreConfig.robPower;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public EnergyConfig getIntALUPower() {
 | 
			
		||||
		return coreConfig.intALUPower;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public EnergyConfig getFloatALUPower() {
 | 
			
		||||
		return coreConfig.floatALUPower;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public EnergyConfig getComplexALUPower() {
 | 
			
		||||
		return coreConfig.complexALUPower;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public EnergyConfig getResultsBroadcastBusPower() {
 | 
			
		||||
		return coreConfig.resultsBroadcastBusPower;
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -374,6 +362,10 @@ public class Core extends SimulationElement{
 | 
			
		|||
	public EnergyConfig getdTLBPower() {
 | 
			
		||||
		return coreConfig.dTLBPower;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public CoreConfig getCoreConfig() {
 | 
			
		||||
		return coreConfig;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void setComInterface(CommunicationInterface comInterface) {
 | 
			
		||||
		this.comInterface = comInterface;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -22,6 +22,7 @@ package generic;
 | 
			
		|||
 | 
			
		||||
import java.io.Serializable;
 | 
			
		||||
 | 
			
		||||
import emulatorinterface.translator.x86.registers.Registers;
 | 
			
		||||
import main.CustomObjectPool;
 | 
			
		||||
 | 
			
		||||
public class Instruction implements Serializable
 | 
			
		||||
| 
						 | 
				
			
			@ -146,13 +147,6 @@ public class Instruction implements Serializable
 | 
			
		|||
		return ins;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public static Instruction getMoveInstruction(Operand destinationOperand, Operand sourceOperand)
 | 
			
		||||
	{
 | 
			
		||||
		Instruction ins = CustomObjectPool.getInstructionPool().borrowObject();
 | 
			
		||||
		ins.set(OperationType.mov, sourceOperand, null, destinationOperand);
 | 
			
		||||
		return ins;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public static Instruction getNOPInstruction()
 | 
			
		||||
	{
 | 
			
		||||
		Instruction ins = CustomObjectPool.getInstructionPool().borrowObject();
 | 
			
		||||
| 
						 | 
				
			
			@ -178,13 +172,6 @@ public class Instruction implements Serializable
 | 
			
		|||
		return ins;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public static Instruction getExchangeInstruction(Operand operand1, Operand operand2)
 | 
			
		||||
	{
 | 
			
		||||
		Instruction ins = CustomObjectPool.getInstructionPool().borrowObject();
 | 
			
		||||
		ins.set(OperationType.xchg, operand1, operand2, null);
 | 
			
		||||
		return ins;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public static Instruction getInterruptInstruction(Operand interruptNumber)
 | 
			
		||||
	{
 | 
			
		||||
		Instruction ins = CustomObjectPool.getInstructionPool().borrowObject();
 | 
			
		||||
| 
						 | 
				
			
			@ -219,11 +206,67 @@ public class Instruction implements Serializable
 | 
			
		|||
		return ins;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
	public static Instruction getBranchInstruction(Operand newInstructionAddress)
 | 
			
		||||
	public static Instruction getIntVectorALU(Operand sourceOperand1, 
 | 
			
		||||
			Operand sourceOperand2, Operand destinationOperand)
 | 
			
		||||
	{
 | 
			
		||||
		Instruction ins = CustomObjectPool.getInstructionPool().borrowObject();
 | 
			
		||||
		ins.set(OperationType.branch, newInstructionAddress, null, null);
 | 
			
		||||
		ins.set(OperationType.integerVectorALU, sourceOperand1, sourceOperand2,
 | 
			
		||||
				destinationOperand);
 | 
			
		||||
		return ins;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public static Instruction getIntVectorMul(Operand sourceOperand1, 
 | 
			
		||||
			Operand sourceOperand2, Operand destinationOperand)
 | 
			
		||||
	{
 | 
			
		||||
		Instruction ins = CustomObjectPool.getInstructionPool().borrowObject();
 | 
			
		||||
		ins.set(OperationType.integerVectorMul, sourceOperand1, sourceOperand2,
 | 
			
		||||
				destinationOperand);
 | 
			
		||||
		return ins;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public static Instruction getFloatVectorALU(Operand sourceOperand1, 
 | 
			
		||||
			Operand sourceOperand2, Operand destinationOperand)
 | 
			
		||||
	{
 | 
			
		||||
		Instruction ins = CustomObjectPool.getInstructionPool().borrowObject();
 | 
			
		||||
		ins.set(OperationType.floatVectorALU, sourceOperand1, sourceOperand2,
 | 
			
		||||
				destinationOperand);
 | 
			
		||||
		return ins;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public static Instruction getFloatVectorMul(Operand sourceOperand1, 
 | 
			
		||||
			Operand sourceOperand2, Operand destinationOperand)
 | 
			
		||||
	{
 | 
			
		||||
		Instruction ins = CustomObjectPool.getInstructionPool().borrowObject();
 | 
			
		||||
		ins.set(OperationType.floatVectorMul, sourceOperand1, sourceOperand2,
 | 
			
		||||
				destinationOperand);
 | 
			
		||||
		return ins;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	/*
 | 
			
		||||
	 * dest = dest + (src1 * src2)
 | 
			
		||||
	 */
 | 
			
		||||
	public static Instruction getFMA(Operand sourceOperand1, 
 | 
			
		||||
			Operand sourceOperand2, Operand destinationOperand)
 | 
			
		||||
	{
 | 
			
		||||
		Instruction ins = CustomObjectPool.getInstructionPool().borrowObject();
 | 
			
		||||
		ins.set(OperationType.FMA, sourceOperand1, sourceOperand2,
 | 
			
		||||
				destinationOperand);
 | 
			
		||||
		return ins;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public static Instruction getVectorFMA(Operand sourceOperand1, 
 | 
			
		||||
			Operand sourceOperand2, Operand destinationOperand)
 | 
			
		||||
	{
 | 
			
		||||
		Instruction ins = CustomObjectPool.getInstructionPool().borrowObject();
 | 
			
		||||
		ins.set(OperationType.vectorFMA, sourceOperand1, sourceOperand2,
 | 
			
		||||
				destinationOperand);
 | 
			
		||||
		return ins;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public static Instruction getBranchInstruction(Operand newInstructionAddress, Operand EFlagsRegister)
 | 
			
		||||
	{
 | 
			
		||||
		Instruction ins = CustomObjectPool.getInstructionPool().borrowObject();
 | 
			
		||||
		ins.set(OperationType.branch, newInstructionAddress, EFlagsRegister, null);
 | 
			
		||||
		return ins;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
| 
						 | 
				
			
			@ -241,6 +284,13 @@ public class Instruction implements Serializable
 | 
			
		|||
		return ins;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public static Instruction getLoadAGUInstruction(Operand sourceOperand1, Operand sourceOperand2, Operand destinationRegister)
 | 
			
		||||
	{
 | 
			
		||||
		Instruction ins = CustomObjectPool.getInstructionPool().borrowObject();
 | 
			
		||||
		ins.set(OperationType.loadAGU, sourceOperand1, sourceOperand2, destinationRegister);
 | 
			
		||||
		return ins;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public static Instruction getStoreInstruction(Operand memoryLocation, Operand sourceOperand)
 | 
			
		||||
	{
 | 
			
		||||
		Instruction ins = CustomObjectPool.getInstructionPool().borrowObject();
 | 
			
		||||
| 
						 | 
				
			
			@ -248,6 +298,99 @@ public class Instruction implements Serializable
 | 
			
		|||
		return ins;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public static Instruction getStoreAGUInstruction(Operand sourceOperand1, Operand sourceOperand2, Operand destinationRegister)
 | 
			
		||||
	{
 | 
			
		||||
		Instruction ins = CustomObjectPool.getInstructionPool().borrowObject();
 | 
			
		||||
		ins.set(OperationType.storeAGU, sourceOperand1, sourceOperand2, destinationRegister);
 | 
			
		||||
		return ins;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public static Instruction getAES(Operand sourceOperand1, 
 | 
			
		||||
			Operand sourceOperand2, Operand destinationOperand)//TODO AES is 2 operand or 3 operand?
 | 
			
		||||
	{
 | 
			
		||||
		Instruction ins = CustomObjectPool.getInstructionPool().borrowObject();
 | 
			
		||||
		ins.set(OperationType.AES, sourceOperand1, sourceOperand2,
 | 
			
		||||
				destinationOperand);
 | 
			
		||||
		return ins;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public static Instruction getVectorString(Operand sourceOperand1, 
 | 
			
		||||
			Operand sourceOperand2, Operand destinationOperand)
 | 
			
		||||
	{
 | 
			
		||||
		Instruction ins = CustomObjectPool.getInstructionPool().borrowObject();
 | 
			
		||||
		ins.set(OperationType.vectorString, sourceOperand1, sourceOperand2,
 | 
			
		||||
				destinationOperand);
 | 
			
		||||
		return ins;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public static Instruction getBitScan(Operand sourceOperand1, Operand destinationOperand)
 | 
			
		||||
	{
 | 
			
		||||
		Instruction ins = CustomObjectPool.getInstructionPool().borrowObject();
 | 
			
		||||
		ins.set(OperationType.bitScan, sourceOperand1, null,
 | 
			
		||||
				destinationOperand);
 | 
			
		||||
		return ins;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public static Instruction getVectorShuffle(Operand sourceOperand1, 
 | 
			
		||||
			Operand sourceOperand2, Operand destinationOperand)
 | 
			
		||||
	{
 | 
			
		||||
		Instruction ins = CustomObjectPool.getInstructionPool().borrowObject();
 | 
			
		||||
		ins.set(OperationType.vectorShuffle, sourceOperand1, sourceOperand2,
 | 
			
		||||
				destinationOperand);
 | 
			
		||||
		return ins;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public static Instruction getLEA(Operand sourceOperand1, 
 | 
			
		||||
			Operand sourceOperand2, Operand destinationOperand)
 | 
			
		||||
	{
 | 
			
		||||
		Instruction ins = CustomObjectPool.getInstructionPool().borrowObject();
 | 
			
		||||
		ins.set(OperationType.LEA, sourceOperand1, null,
 | 
			
		||||
				destinationOperand);
 | 
			
		||||
		return ins;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public static Instruction getCPUIDInstruction()
 | 
			
		||||
	{
 | 
			
		||||
		Instruction ins = CustomObjectPool.getInstructionPool().borrowObject();
 | 
			
		||||
		ins.set(OperationType.cpuid, null, null, null);
 | 
			
		||||
		return ins;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public static Instruction getMFenceInstruction()
 | 
			
		||||
	{
 | 
			
		||||
		Instruction ins = CustomObjectPool.getInstructionPool().borrowObject();
 | 
			
		||||
		ins.set(OperationType.mfence, null, null, null);
 | 
			
		||||
		return ins;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public static Instruction getSFenceInstruction()
 | 
			
		||||
	{
 | 
			
		||||
		Instruction ins = CustomObjectPool.getInstructionPool().borrowObject();
 | 
			
		||||
		ins.set(OperationType.sfence, null, null, null);
 | 
			
		||||
		return ins;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public static Instruction getLFenceInstruction()
 | 
			
		||||
	{
 | 
			
		||||
		Instruction ins = CustomObjectPool.getInstructionPool().borrowObject();
 | 
			
		||||
		ins.set(OperationType.lfence, null, null, null);
 | 
			
		||||
		return ins;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public static Instruction getReadPrefetch(Operand memoryLocation, Operand cacheLevelToPrefetchTo)
 | 
			
		||||
	{
 | 
			
		||||
		Instruction ins = CustomObjectPool.getInstructionPool().borrowObject();
 | 
			
		||||
		ins.set(OperationType.read_prefetch, memoryLocation, cacheLevelToPrefetchTo, null);
 | 
			
		||||
		return ins;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public static Instruction getWritePrefetch(Operand memoryLocation)
 | 
			
		||||
	{
 | 
			
		||||
		Instruction ins = CustomObjectPool.getInstructionPool().borrowObject();
 | 
			
		||||
		ins.set(OperationType.write_prefetch, memoryLocation, null, null);
 | 
			
		||||
		return ins;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public long getCISCProgramCounter()
 | 
			
		||||
	{
 | 
			
		||||
		return ciscProgramCounter;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -67,7 +67,7 @@ public class Operand implements Serializable
 | 
			
		|||
		floatRegisterOperands = new Operand[Registers.getMaxFloatRegisters()];
 | 
			
		||||
		for(int i=0; i<Registers.getMaxFloatRegisters(); i++) {
 | 
			
		||||
			floatRegisterOperands[i] = new Operand();
 | 
			
		||||
			floatRegisterOperands[i].type = OperandType.floatRegister;
 | 
			
		||||
			floatRegisterOperands[i].type = OperandType.vectorRegister;
 | 
			
		||||
			floatRegisterOperands[i].value = i;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
| 
						 | 
				
			
			@ -241,7 +241,7 @@ public class Operand implements Serializable
 | 
			
		|||
	
 | 
			
		||||
	public boolean isFloatRegisterOperand()
 | 
			
		||||
	{
 | 
			
		||||
		return (this.type == OperandType.floatRegister);
 | 
			
		||||
		return (this.type == OperandType.vectorRegister);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	private void set(OperandType operandType, long  operandValue)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -24,7 +24,7 @@ package generic;
 | 
			
		|||
public enum OperandType 
 | 
			
		||||
{
 | 
			
		||||
	integerRegister,
 | 
			
		||||
	floatRegister,
 | 
			
		||||
	vectorRegister,
 | 
			
		||||
	immediate,
 | 
			
		||||
	inValid,
 | 
			
		||||
	memory
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -31,14 +31,36 @@ public enum OperationType
 | 
			
		|||
	floatALU,
 | 
			
		||||
	floatMul,
 | 
			
		||||
	floatDiv,
 | 
			
		||||
	integerVectorALU,
 | 
			
		||||
	integerVectorMul,
 | 
			
		||||
	floatVectorALU,
 | 
			
		||||
	floatVectorMul,
 | 
			
		||||
	FMA,
 | 
			
		||||
	vectorFMA,
 | 
			
		||||
	load,
 | 
			
		||||
	loadAGU,
 | 
			
		||||
	store,
 | 
			
		||||
	storeAGU,
 | 
			
		||||
	jump,
 | 
			
		||||
	branch,
 | 
			
		||||
	mov,
 | 
			
		||||
	xchg,
 | 
			
		||||
	//integerMov,
 | 
			
		||||
	//floatMov,
 | 
			
		||||
	//xchg,
 | 
			
		||||
	AES,
 | 
			
		||||
	vectorString,
 | 
			
		||||
	bitScan,
 | 
			
		||||
	vectorShuffle,
 | 
			
		||||
	LEA,
 | 
			
		||||
	acceleratedOp,
 | 
			
		||||
	nop,
 | 
			
		||||
	
 | 
			
		||||
	cpuid,
 | 
			
		||||
	mfence,
 | 
			
		||||
	sfence,
 | 
			
		||||
	lfence,
 | 
			
		||||
	
 | 
			
		||||
	read_prefetch,
 | 
			
		||||
	write_prefetch,
 | 
			
		||||
	//TODO Software interrupt can also be modelled as a far jump
 | 
			
		||||
	interrupt,
 | 
			
		||||
	no_of_types,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -345,6 +345,8 @@ public class Statistics {
 | 
			
		|||
				outputFileWriter.write("Memory Requests\t=\t" + coreMemSys[i].getNumberOfMemoryRequests() + "\n");
 | 
			
		||||
				outputFileWriter.write("Loads\t\t=\t" + coreMemSys[i].getNumberOfLoads() + "\n");
 | 
			
		||||
				outputFileWriter.write("Stores\t\t=\t" + coreMemSys[i].getNumberOfStores() + "\n");
 | 
			
		||||
				outputFileWriter.write("Software read prefetches\t\t=\t" + coreMemSys[i].getNumberOfSoftwareReadPrefetches() + "\n");
 | 
			
		||||
				outputFileWriter.write("Software write prefetches\t\t=\t" + coreMemSys[i].getNumberOfSoftwareWritePrefetches() + "\n");
 | 
			
		||||
				outputFileWriter.write("LSQ forwardings\t=\t" + coreMemSys[i].getNumberOfValueForwardings() + "\n");
 | 
			
		||||
				
 | 
			
		||||
				printCacheStatistics("iTLB[" + i + "]", coreMemSys[i].getiTLB().getTlbHits(), coreMemSys[i].getiTLB().getTlbMisses());
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -239,7 +239,9 @@ public abstract class CoreMemorySystem extends SimulationElement
 | 
			
		|||
	
 | 
			
		||||
	public abstract long getNumberOfMemoryRequests();	
 | 
			
		||||
	public abstract long getNumberOfLoads();	
 | 
			
		||||
	public abstract long getNumberOfStores();	
 | 
			
		||||
	public abstract long getNumberOfStores();		
 | 
			
		||||
	public abstract long getNumberOfSoftwareReadPrefetches();	
 | 
			
		||||
	public abstract long getNumberOfSoftwareWritePrefetches();	
 | 
			
		||||
	public abstract long getNumberOfValueForwardings();
 | 
			
		||||
	public abstract void setNumberOfMemoryRequests(long numMemoryRequests);	
 | 
			
		||||
	public abstract void setNumberOfLoads(long numLoads);	
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -46,6 +46,8 @@ public class LSQ extends SimulationElement
 | 
			
		|||
	public long noOfMemRequests = 0;
 | 
			
		||||
	public long NoOfLd = 0;
 | 
			
		||||
	public long NoOfSt = 0;
 | 
			
		||||
	public long NoOfSoftwareReadPrefetch = 0;
 | 
			
		||||
	public long NoOfSoftwareWritePrefetch = 0;
 | 
			
		||||
	public long NoOfForwards = 0; // Total number of forwards made by the LSQ
 | 
			
		||||
 | 
			
		||||
	long numAccesses;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -16,10 +16,6 @@ public class ExecutionCore {
 | 
			
		|||
	boolean[] portUsedThisCycle;
 | 
			
		||||
	int numPorts;
 | 
			
		||||
	
 | 
			
		||||
	long numIntALUAccesses;
 | 
			
		||||
	long numFloatALUAccesses;
 | 
			
		||||
	long numComplexALUAccesses;
 | 
			
		||||
	
 | 
			
		||||
	public ExecutionCore(Core core)
 | 
			
		||||
	{
 | 
			
		||||
		this.core = core;
 | 
			
		||||
| 
						 | 
				
			
			@ -29,75 +25,297 @@ public class ExecutionCore {
 | 
			
		|||
		FUs = new FunctionalUnit[FunctionalUnitType.values().length][];
 | 
			
		||||
		
 | 
			
		||||
		//int ALUs
 | 
			
		||||
		FUs[FunctionalUnitType.integerALU.ordinal()] = new FunctionalUnit[coreConfig.IntALUNum];
 | 
			
		||||
		for(int i = 0; i < coreConfig.IntALUNum; i++)
 | 
			
		||||
		if(coreConfig.IntALUNum > 0)
 | 
			
		||||
		{
 | 
			
		||||
			FunctionalUnit FU = new FunctionalUnit(FunctionalUnitType.integerALU, coreConfig.IntALULatency,
 | 
			
		||||
					coreConfig.IntALUReciprocalOfThroughput, coreConfig.IntALUPortNumbers[i]);
 | 
			
		||||
			FUs[FunctionalUnitType.integerALU.ordinal()][i] = FU;
 | 
			
		||||
			FUs[FunctionalUnitType.integerALU.ordinal()] = new FunctionalUnit[coreConfig.IntALUNum];
 | 
			
		||||
			for(int i = 0; i < coreConfig.IntALUNum; i++)
 | 
			
		||||
			{
 | 
			
		||||
				int[] latency = {coreConfig.IntALULatency};
 | 
			
		||||
				int[] reciprocalOfThroughput = {coreConfig.IntALUReciprocalOfThroughput};
 | 
			
		||||
				FunctionalUnit FU = new FunctionalUnit(FunctionalUnitType.integerALU, 1, latency,
 | 
			
		||||
						reciprocalOfThroughput, coreConfig.IntALUPortNumbers[i]);
 | 
			
		||||
				FUs[FunctionalUnitType.integerALU.ordinal()][i] = FU;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		//int Muls
 | 
			
		||||
		FUs[FunctionalUnitType.integerMul.ordinal()] = new FunctionalUnit[coreConfig.IntMulNum];
 | 
			
		||||
		for(int i = 0; i < coreConfig.IntMulNum; i++)
 | 
			
		||||
		if(coreConfig.IntMulNum > 0)
 | 
			
		||||
		{
 | 
			
		||||
			FunctionalUnit FU = new FunctionalUnit(FunctionalUnitType.integerMul, coreConfig.IntMulLatency,
 | 
			
		||||
					coreConfig.IntMulReciprocalOfThroughput, coreConfig.IntMulPortNumbers[i]);
 | 
			
		||||
			FUs[FunctionalUnitType.integerMul.ordinal()][i] = FU;
 | 
			
		||||
			FUs[FunctionalUnitType.integerMul.ordinal()] = new FunctionalUnit[coreConfig.IntMulNum];
 | 
			
		||||
			for(int i = 0; i < coreConfig.IntMulNum; i++)
 | 
			
		||||
			{
 | 
			
		||||
				int[] latency = {coreConfig.IntMulLatency};
 | 
			
		||||
				int[] reciprocalOfThroughput = {coreConfig.IntMulReciprocalOfThroughput};
 | 
			
		||||
				FunctionalUnit FU = new FunctionalUnit(FunctionalUnitType.integerMul, 1, latency,
 | 
			
		||||
						reciprocalOfThroughput, coreConfig.IntMulPortNumbers[i]);
 | 
			
		||||
				FUs[FunctionalUnitType.integerMul.ordinal()][i] = FU;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		//int Divs
 | 
			
		||||
		FUs[FunctionalUnitType.integerDiv.ordinal()] = new FunctionalUnit[coreConfig.IntDivNum];
 | 
			
		||||
		for(int i = 0; i < coreConfig.IntDivNum; i++)
 | 
			
		||||
		if(coreConfig.IntDivNum > 0)
 | 
			
		||||
		{
 | 
			
		||||
			FunctionalUnit FU = new FunctionalUnit(FunctionalUnitType.integerDiv, coreConfig.IntDivLatency,
 | 
			
		||||
					coreConfig.IntDivReciprocalOfThroughput, coreConfig.IntDivPortNumbers[i]);
 | 
			
		||||
			FUs[FunctionalUnitType.integerDiv.ordinal()][i] = FU;
 | 
			
		||||
			FUs[FunctionalUnitType.integerDiv.ordinal()] = new FunctionalUnit[coreConfig.IntDivNum];
 | 
			
		||||
			for(int i = 0; i < coreConfig.IntDivNum; i++)
 | 
			
		||||
			{
 | 
			
		||||
				int[] latency = {coreConfig.IntDivLatency};
 | 
			
		||||
				int[] reciprocalOfThroughput = {coreConfig.IntDivReciprocalOfThroughput};
 | 
			
		||||
				FunctionalUnit FU = new FunctionalUnit(FunctionalUnitType.integerDiv, 1, latency,
 | 
			
		||||
						reciprocalOfThroughput, coreConfig.IntDivPortNumbers[i]);
 | 
			
		||||
				FUs[FunctionalUnitType.integerDiv.ordinal()][i] = FU;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		//float ALUs
 | 
			
		||||
		FUs[FunctionalUnitType.floatALU.ordinal()] = new FunctionalUnit[coreConfig.FloatALUNum];
 | 
			
		||||
		for(int i = 0; i < coreConfig.FloatALUNum; i++)
 | 
			
		||||
		if(coreConfig.FloatALUNum > 0)
 | 
			
		||||
		{
 | 
			
		||||
			FunctionalUnit FU = new FunctionalUnit(FunctionalUnitType.floatALU, coreConfig.FloatALULatency,
 | 
			
		||||
					coreConfig.FloatALUReciprocalOfThroughput, coreConfig.FloatALUPortNumbers[i]);
 | 
			
		||||
			FUs[FunctionalUnitType.floatALU.ordinal()][i] = FU;
 | 
			
		||||
			FUs[FunctionalUnitType.floatALU.ordinal()] = new FunctionalUnit[coreConfig.FloatALUNum];
 | 
			
		||||
			for(int i = 0; i < coreConfig.FloatALUNum; i++)
 | 
			
		||||
			{
 | 
			
		||||
				int[] latency = {coreConfig.FloatALULatency};
 | 
			
		||||
				int[] reciprocalOfThroughput = {coreConfig.FloatALUReciprocalOfThroughput};
 | 
			
		||||
				FunctionalUnit FU = new FunctionalUnit(FunctionalUnitType.floatALU, 1, latency,
 | 
			
		||||
						reciprocalOfThroughput, coreConfig.FloatALUPortNumbers[i]);
 | 
			
		||||
				FUs[FunctionalUnitType.floatALU.ordinal()][i] = FU;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		//float Muls
 | 
			
		||||
		FUs[FunctionalUnitType.floatMul.ordinal()] = new FunctionalUnit[coreConfig.FloatMulNum];
 | 
			
		||||
		for(int i = 0; i < coreConfig.FloatMulNum; i++)
 | 
			
		||||
		if(coreConfig.FloatMulNum > 0)
 | 
			
		||||
		{
 | 
			
		||||
			FunctionalUnit FU = new FunctionalUnit(FunctionalUnitType.floatMul, coreConfig.FloatMulLatency,
 | 
			
		||||
					coreConfig.FloatMulReciprocalOfThroughput, coreConfig.FloatMulPortNumbers[i]);
 | 
			
		||||
			FUs[FunctionalUnitType.floatMul.ordinal()][i] = FU;
 | 
			
		||||
			FUs[FunctionalUnitType.floatMul.ordinal()] = new FunctionalUnit[coreConfig.FloatMulNum];
 | 
			
		||||
			for(int i = 0; i < coreConfig.FloatMulNum; i++)
 | 
			
		||||
			{
 | 
			
		||||
				int[] latency = {coreConfig.FloatMulLatency};
 | 
			
		||||
				int[] reciprocalOfThroughput = {coreConfig.FloatMulReciprocalOfThroughput};
 | 
			
		||||
				FunctionalUnit FU = new FunctionalUnit(FunctionalUnitType.floatMul, 1, latency,
 | 
			
		||||
						reciprocalOfThroughput, coreConfig.FloatMulPortNumbers[i]);
 | 
			
		||||
				FUs[FunctionalUnitType.floatMul.ordinal()][i] = FU;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		//float Divs
 | 
			
		||||
		FUs[FunctionalUnitType.floatDiv.ordinal()] = new FunctionalUnit[coreConfig.FloatDivNum];
 | 
			
		||||
		for(int i = 0; i < coreConfig.FloatDivNum; i++)
 | 
			
		||||
		if(coreConfig.FloatDivNum > 0)
 | 
			
		||||
		{
 | 
			
		||||
			FunctionalUnit FU = new FunctionalUnit(FunctionalUnitType.floatDiv, coreConfig.FloatDivLatency,
 | 
			
		||||
					coreConfig.FloatDivReciprocalOfThroughput, coreConfig.FloatDivPortNumbers[i]);
 | 
			
		||||
			FUs[FunctionalUnitType.floatDiv.ordinal()][i] = FU;
 | 
			
		||||
			FUs[FunctionalUnitType.floatDiv.ordinal()] = new FunctionalUnit[coreConfig.FloatDivNum];
 | 
			
		||||
			for(int i = 0; i < coreConfig.FloatDivNum; i++)
 | 
			
		||||
			{
 | 
			
		||||
				int[] latency = {coreConfig.FloatDivLatency};
 | 
			
		||||
				int[] reciprocalOfThroughput = {coreConfig.FloatDivReciprocalOfThroughput};
 | 
			
		||||
				FunctionalUnit FU = new FunctionalUnit(FunctionalUnitType.floatDiv, 1, latency,
 | 
			
		||||
						reciprocalOfThroughput, coreConfig.FloatDivPortNumbers[i]);
 | 
			
		||||
				FUs[FunctionalUnitType.floatDiv.ordinal()][i] = FU;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		//jump
 | 
			
		||||
		FUs[FunctionalUnitType.jump.ordinal()] = new FunctionalUnit[coreConfig.JumpNum];
 | 
			
		||||
		for(int i = 0; i < coreConfig.JumpNum; i++)
 | 
			
		||||
		//FMA
 | 
			
		||||
		if(coreConfig.FMANum > 0)
 | 
			
		||||
		{
 | 
			
		||||
			FunctionalUnit FU = new FunctionalUnit(FunctionalUnitType.jump, coreConfig.JumpLatency,
 | 
			
		||||
					coreConfig.JumpReciprocalOfThroughput, coreConfig.JumpPortNumbers[i]);
 | 
			
		||||
			FUs[FunctionalUnitType.jump.ordinal()][i] = FU;
 | 
			
		||||
			FUs[FunctionalUnitType.FMA.ordinal()] = new FunctionalUnit[coreConfig.FMANum];
 | 
			
		||||
			for(int i = 0; i < coreConfig.FMANum; i++)
 | 
			
		||||
			{
 | 
			
		||||
				int[] latency = {coreConfig.FloatALULatency, coreConfig.FloatMulLatency, coreConfig.FloatVectorALULatency, coreConfig.FloatVectorMulLatency};
 | 
			
		||||
				int[] reciprocalOfThroughput = {coreConfig.FloatALUReciprocalOfThroughput, coreConfig.FloatMulReciprocalOfThroughput, coreConfig.FloatVectorALUReciprocalOfThroughput, coreConfig.FloatVectorMulReciprocalOfThroughput};
 | 
			
		||||
				FunctionalUnit FU = new FunctionalUnit(FunctionalUnitType.FMA, 4, latency,
 | 
			
		||||
						reciprocalOfThroughput, coreConfig.FMAPortNumbers[i]);
 | 
			
		||||
				FUs[FunctionalUnitType.FMA.ordinal()][i] = FU;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		//memory
 | 
			
		||||
		FUs[FunctionalUnitType.memory.ordinal()] = new FunctionalUnit[coreConfig.MemoryNum];
 | 
			
		||||
		for(int i = 0; i < coreConfig.MemoryNum; i++)
 | 
			
		||||
		//int vector ALUs
 | 
			
		||||
		if(coreConfig.IntVectorALUNum > 0)
 | 
			
		||||
		{
 | 
			
		||||
			FunctionalUnit FU = new FunctionalUnit(FunctionalUnitType.memory, coreConfig.MemoryLatency,
 | 
			
		||||
					coreConfig.MemoryReciprocalOfThroughput, coreConfig.MemoryPortNumbers[i]);
 | 
			
		||||
			FUs[FunctionalUnitType.memory.ordinal()][i] = FU;
 | 
			
		||||
			FUs[FunctionalUnitType.integerVectorALU.ordinal()] = new FunctionalUnit[coreConfig.IntVectorALUNum];
 | 
			
		||||
			for(int i = 0; i < coreConfig.IntVectorALUNum; i++)
 | 
			
		||||
			{
 | 
			
		||||
				int[] latency = {coreConfig.IntVectorALULatency};
 | 
			
		||||
				int[] reciprocalOfThroughput = {coreConfig.IntVectorALUReciprocalOfThroughput};
 | 
			
		||||
				FunctionalUnit FU = new FunctionalUnit(FunctionalUnitType.integerVectorALU, 1, latency,
 | 
			
		||||
						reciprocalOfThroughput, coreConfig.IntVectorALUPortNumbers[i]);
 | 
			
		||||
				FUs[FunctionalUnitType.integerVectorALU.ordinal()][i] = FU;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		//int vector Muls
 | 
			
		||||
		if(coreConfig.IntVectorMulNum > 0)
 | 
			
		||||
		{
 | 
			
		||||
			FUs[FunctionalUnitType.integerVectorMul.ordinal()] = new FunctionalUnit[coreConfig.IntVectorMulNum];
 | 
			
		||||
			for(int i = 0; i < coreConfig.IntVectorMulNum; i++)
 | 
			
		||||
			{
 | 
			
		||||
				int[] latency = {coreConfig.IntVectorMulLatency};
 | 
			
		||||
				int[] reciprocalOfThroughput = {coreConfig.IntVectorMulReciprocalOfThroughput};
 | 
			
		||||
				FunctionalUnit FU = new FunctionalUnit(FunctionalUnitType.integerVectorMul, 1, latency,
 | 
			
		||||
						reciprocalOfThroughput, coreConfig.IntVectorMulPortNumbers[i]);
 | 
			
		||||
				FUs[FunctionalUnitType.integerVectorMul.ordinal()][i] = FU;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		//float vector ALUs
 | 
			
		||||
		if(coreConfig.FloatVectorALUNum > 0)
 | 
			
		||||
		{
 | 
			
		||||
			FUs[FunctionalUnitType.floatVectorALU.ordinal()] = new FunctionalUnit[coreConfig.FloatVectorALUNum];
 | 
			
		||||
			for(int i = 0; i < coreConfig.FloatVectorALUNum; i++)
 | 
			
		||||
			{
 | 
			
		||||
				int[] latency = {coreConfig.FloatVectorALULatency};
 | 
			
		||||
				int[] reciprocalOfThroughput = {coreConfig.FloatVectorALUReciprocalOfThroughput};
 | 
			
		||||
				FunctionalUnit FU = new FunctionalUnit(FunctionalUnitType.floatVectorALU, 1, latency,
 | 
			
		||||
						reciprocalOfThroughput, coreConfig.FloatVectorALUPortNumbers[i]);
 | 
			
		||||
				FUs[FunctionalUnitType.floatVectorALU.ordinal()][i] = FU;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		//float vector Muls
 | 
			
		||||
		if(coreConfig.FloatVectorMulNum > 0)
 | 
			
		||||
		{
 | 
			
		||||
			FUs[FunctionalUnitType.floatVectorMul.ordinal()] = new FunctionalUnit[coreConfig.FloatVectorMulNum];
 | 
			
		||||
			for(int i = 0; i < coreConfig.FloatVectorMulNum; i++)
 | 
			
		||||
			{
 | 
			
		||||
				int[] latency = {coreConfig.FloatVectorMulLatency};
 | 
			
		||||
				int[] reciprocalOfThroughput = {coreConfig.FloatVectorMulReciprocalOfThroughput};
 | 
			
		||||
				FunctionalUnit FU = new FunctionalUnit(FunctionalUnitType.floatVectorMul, 1, latency,
 | 
			
		||||
						reciprocalOfThroughput, coreConfig.FloatVectorMulPortNumbers[i]);
 | 
			
		||||
				FUs[FunctionalUnitType.floatVectorMul.ordinal()][i] = FU;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		//branch
 | 
			
		||||
		if(coreConfig.BranchNum > 0)
 | 
			
		||||
		{
 | 
			
		||||
			FUs[FunctionalUnitType.branch.ordinal()] = new FunctionalUnit[coreConfig.BranchNum];
 | 
			
		||||
			for(int i = 0; i < coreConfig.BranchNum; i++)
 | 
			
		||||
			{
 | 
			
		||||
				int[] latency = {coreConfig.BranchLatency};
 | 
			
		||||
				int[] reciprocalOfThroughput = {coreConfig.BranchReciprocalOfThroughput};
 | 
			
		||||
				FunctionalUnit FU = new FunctionalUnit(FunctionalUnitType.branch, 1, latency,
 | 
			
		||||
						reciprocalOfThroughput, coreConfig.BranchPortNumbers[i]);
 | 
			
		||||
				FUs[FunctionalUnitType.branch.ordinal()][i] = FU;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		//load
 | 
			
		||||
		if(coreConfig.LoadNum > 0)
 | 
			
		||||
		{
 | 
			
		||||
			FUs[FunctionalUnitType.load.ordinal()] = new FunctionalUnit[coreConfig.LoadNum];
 | 
			
		||||
			for(int i = 0; i < coreConfig.LoadNum; i++)
 | 
			
		||||
			{
 | 
			
		||||
				int[] latency = {coreConfig.LoadLatency};
 | 
			
		||||
				int[] reciprocalOfThroughput = {coreConfig.LoadReciprocalOfThroughput};
 | 
			
		||||
				FunctionalUnit FU = new FunctionalUnit(FunctionalUnitType.load, 1, latency,
 | 
			
		||||
						reciprocalOfThroughput, coreConfig.LoadPortNumbers[i]);
 | 
			
		||||
				FUs[FunctionalUnitType.load.ordinal()][i] = FU;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		//load AGU
 | 
			
		||||
		if(coreConfig.LoadAGUNum > 0)
 | 
			
		||||
		{
 | 
			
		||||
			FUs[FunctionalUnitType.loadAGU.ordinal()] = new FunctionalUnit[coreConfig.LoadAGUNum];
 | 
			
		||||
			for(int i = 0; i < coreConfig.LoadAGUNum; i++)
 | 
			
		||||
			{
 | 
			
		||||
				int[] latency = {coreConfig.LoadAGULatency};
 | 
			
		||||
				int[] reciprocalOfThroughput = {coreConfig.LoadAGUReciprocalOfThroughput};
 | 
			
		||||
				FunctionalUnit FU = new FunctionalUnit(FunctionalUnitType.loadAGU, 1, latency,
 | 
			
		||||
						reciprocalOfThroughput, coreConfig.LoadAGUPortNumbers[i]);
 | 
			
		||||
				FUs[FunctionalUnitType.loadAGU.ordinal()][i] = FU;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		//load
 | 
			
		||||
		if(coreConfig.StoreNum > 0)
 | 
			
		||||
		{
 | 
			
		||||
			FUs[FunctionalUnitType.store.ordinal()] = new FunctionalUnit[coreConfig.StoreNum];
 | 
			
		||||
			for(int i = 0; i < coreConfig.StoreNum; i++)
 | 
			
		||||
			{
 | 
			
		||||
				int[] latency = {coreConfig.StoreLatency};
 | 
			
		||||
				int[] reciprocalOfThroughput = {coreConfig.StoreReciprocalOfThroughput};
 | 
			
		||||
				FunctionalUnit FU = new FunctionalUnit(FunctionalUnitType.store, 1, latency,
 | 
			
		||||
						reciprocalOfThroughput, coreConfig.StorePortNumbers[i]);
 | 
			
		||||
				FUs[FunctionalUnitType.store.ordinal()][i] = FU;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		//load AGU
 | 
			
		||||
		if(coreConfig.StoreAGUNum > 0)
 | 
			
		||||
		{
 | 
			
		||||
			FUs[FunctionalUnitType.storeAGU.ordinal()] = new FunctionalUnit[coreConfig.StoreAGUNum];
 | 
			
		||||
			for(int i = 0; i < coreConfig.StoreAGUNum; i++)
 | 
			
		||||
			{
 | 
			
		||||
				int[] latency = {coreConfig.StoreAGULatency};
 | 
			
		||||
				int[] reciprocalOfThroughput = {coreConfig.StoreAGUReciprocalOfThroughput};
 | 
			
		||||
				FunctionalUnit FU = new FunctionalUnit(FunctionalUnitType.storeAGU, 1, latency,
 | 
			
		||||
						reciprocalOfThroughput, coreConfig.StoreAGUPortNumbers[i]);
 | 
			
		||||
				FUs[FunctionalUnitType.storeAGU.ordinal()][i] = FU;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		//AES
 | 
			
		||||
		if(coreConfig.AESNum > 0)
 | 
			
		||||
		{
 | 
			
		||||
			FUs[FunctionalUnitType.AES.ordinal()] = new FunctionalUnit[coreConfig.AESNum];
 | 
			
		||||
			for(int i = 0; i < coreConfig.AESNum; i++)
 | 
			
		||||
			{
 | 
			
		||||
				int[] latency = {coreConfig.AESLatency};
 | 
			
		||||
				int[] reciprocalOfThroughput = {coreConfig.AESReciprocalOfThroughput};
 | 
			
		||||
				FunctionalUnit FU = new FunctionalUnit(FunctionalUnitType.AES, 1, latency,
 | 
			
		||||
						reciprocalOfThroughput, coreConfig.AESPortNumbers[i]);
 | 
			
		||||
				FUs[FunctionalUnitType.AES.ordinal()][i] = FU;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		//Vector String
 | 
			
		||||
		if(coreConfig.VectorStringNum > 0)
 | 
			
		||||
		{
 | 
			
		||||
			FUs[FunctionalUnitType.vectorString.ordinal()] = new FunctionalUnit[coreConfig.VectorStringNum];
 | 
			
		||||
			for(int i = 0; i < coreConfig.VectorStringNum; i++)
 | 
			
		||||
			{
 | 
			
		||||
				int[] latency = {coreConfig.VectorStringLatency};
 | 
			
		||||
				int[] reciprocalOfThroughput = {coreConfig.VectorStringReciprocalOfThroughput};
 | 
			
		||||
				FunctionalUnit FU = new FunctionalUnit(FunctionalUnitType.vectorString, 1, latency,
 | 
			
		||||
						reciprocalOfThroughput, coreConfig.VectorStringPortNumbers[i]);
 | 
			
		||||
				FUs[FunctionalUnitType.vectorString.ordinal()][i] = FU;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		//bit scan
 | 
			
		||||
		if(coreConfig.BitScanNum > 0)
 | 
			
		||||
		{
 | 
			
		||||
			FUs[FunctionalUnitType.bitScan.ordinal()] = new FunctionalUnit[coreConfig.BitScanNum];
 | 
			
		||||
			for(int i = 0; i < coreConfig.BitScanNum; i++)
 | 
			
		||||
			{
 | 
			
		||||
				int[] latency = {coreConfig.BitScanLatency};
 | 
			
		||||
				int[] reciprocalOfThroughput = {coreConfig.BitScanReciprocalOfThroughput};
 | 
			
		||||
				FunctionalUnit FU = new FunctionalUnit(FunctionalUnitType.bitScan, 1, latency,
 | 
			
		||||
						reciprocalOfThroughput, coreConfig.BitScanPortNumbers[i]);
 | 
			
		||||
				FUs[FunctionalUnitType.bitScan.ordinal()][i] = FU;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		//vector shuffle
 | 
			
		||||
		if(coreConfig.VectorShuffleNum > 0)
 | 
			
		||||
		{
 | 
			
		||||
			FUs[FunctionalUnitType.vectorShuffle.ordinal()] = new FunctionalUnit[coreConfig.VectorShuffleNum];
 | 
			
		||||
			for(int i = 0; i < coreConfig.VectorShuffleNum; i++)
 | 
			
		||||
			{
 | 
			
		||||
				int[] latency = {coreConfig.VectorShuffleLatency};
 | 
			
		||||
				int[] reciprocalOfThroughput = {coreConfig.VectorShuffleReciprocalOfThroughput};
 | 
			
		||||
				FunctionalUnit FU = new FunctionalUnit(FunctionalUnitType.vectorShuffle, 1, latency,
 | 
			
		||||
						reciprocalOfThroughput, coreConfig.VectorShufflePortNumbers[i]);
 | 
			
		||||
				FUs[FunctionalUnitType.vectorShuffle.ordinal()][i] = FU;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		//LEA
 | 
			
		||||
		if(coreConfig.LEANum > 0)
 | 
			
		||||
		{
 | 
			
		||||
			FUs[FunctionalUnitType.LEA.ordinal()] = new FunctionalUnit[coreConfig.LEANum];
 | 
			
		||||
			for(int i = 0; i < coreConfig.LEANum; i++)
 | 
			
		||||
			{
 | 
			
		||||
				int[] latency = {coreConfig.LEALatency};
 | 
			
		||||
				int[] reciprocalOfThroughput = {coreConfig.LEAReciprocalOfThroughput};
 | 
			
		||||
				FunctionalUnit FU = new FunctionalUnit(FunctionalUnitType.LEA, 1, latency,
 | 
			
		||||
						reciprocalOfThroughput, coreConfig.LEAPortNumbers[i]);
 | 
			
		||||
				FUs[FunctionalUnitType.LEA.ordinal()][i] = FU;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		this.numPorts = coreConfig.ExecutionCoreNumPorts;
 | 
			
		||||
| 
						 | 
				
			
			@ -108,12 +326,17 @@ public class ExecutionCore {
 | 
			
		|||
	//						negative of the FU instance is returned
 | 
			
		||||
	//else, the earliest time, at which an FU of the type becomes available, is returned
 | 
			
		||||
	
 | 
			
		||||
	public long requestFU(FunctionalUnitType FUType)
 | 
			
		||||
	public long requestFU(FunctionalUnitType FUType, int functionality)
 | 
			
		||||
	{
 | 
			
		||||
		if(FUs[FUType.ordinal()] == null || FUs[FUType.ordinal()].length == 0)
 | 
			
		||||
		{
 | 
			
		||||
			return Long.MAX_VALUE;
 | 
			
		||||
		}		
 | 
			
		||||
		
 | 
			
		||||
		long currentTime = GlobalClock.getCurrentTime();
 | 
			
		||||
		long stepSize = core.getStepSize();
 | 
			
		||||
		
 | 
			
		||||
		long timeTillAvailable = FUs[FUType.ordinal()][0].getTimeWhenFUAvailable();
 | 
			
		||||
		long timeTillAvailable = Long.MAX_VALUE;
 | 
			
		||||
		
 | 
			
		||||
		for(int i = 0; i < FUs[FUType.ordinal()].length; i++)
 | 
			
		||||
		{
 | 
			
		||||
| 
						 | 
				
			
			@ -130,21 +353,9 @@ public class ExecutionCore {
 | 
			
		|||
			if(canUse == true)
 | 
			
		||||
			{
 | 
			
		||||
				FUs[FUType.ordinal()][i].setTimeWhenFUAvailable(currentTime
 | 
			
		||||
						+ FUs[FUType.ordinal()][i].getReciprocalOfThroughput()*stepSize);
 | 
			
		||||
						+ FUs[FUType.ordinal()][i].getReciprocalOfThroughput(functionality)*stepSize);
 | 
			
		||||
				
 | 
			
		||||
				if(FUType == FunctionalUnitType.integerALU)
 | 
			
		||||
				{
 | 
			
		||||
					//TODO this is overcounting in case of pipelined FUs
 | 
			
		||||
					incrementIntALUAccesses(FUs[FUType.ordinal()][i].getLatency());
 | 
			
		||||
				}
 | 
			
		||||
				else if(FUType == FunctionalUnitType.floatALU)
 | 
			
		||||
				{
 | 
			
		||||
					incrementFloatALUAccesses(FUs[FUType.ordinal()][i].getLatency());
 | 
			
		||||
				}
 | 
			
		||||
				else
 | 
			
		||||
				{
 | 
			
		||||
					incrementComplexALUAccesses(FUs[FUType.ordinal()][i].getLatency());
 | 
			
		||||
				}
 | 
			
		||||
				FUs[FUType.ordinal()][i].incrementNoOfCyclesBusy(FUs[FUType.ordinal()][i].getLatency(functionality));
 | 
			
		||||
				
 | 
			
		||||
				portUsedThisCycle[FUs[FUType.ordinal()][i].getPortNumber()] = true;
 | 
			
		||||
				
 | 
			
		||||
| 
						 | 
				
			
			@ -159,9 +370,9 @@ public class ExecutionCore {
 | 
			
		|||
		return timeTillAvailable;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public int getFULatency(FunctionalUnitType FUType)
 | 
			
		||||
	public int getFULatency(FunctionalUnitType FUType, int functionality)
 | 
			
		||||
	{
 | 
			
		||||
		return FUs[FUType.ordinal()][0].getLatency();
 | 
			
		||||
		return FUs[FUType.ordinal()][0].getLatency(functionality);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public int getNumberOfUnits(FunctionalUnitType FUType)
 | 
			
		||||
| 
						 | 
				
			
			@ -174,34 +385,114 @@ public class ExecutionCore {
 | 
			
		|||
		return FUs[_FUType.ordinal()][_FUInstance].getTimeWhenFUAvailable();
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	void incrementIntALUAccesses(int incrementBy)
 | 
			
		||||
	{
 | 
			
		||||
		numIntALUAccesses += incrementBy;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	void incrementFloatALUAccesses(int incrementBy)
 | 
			
		||||
	{
 | 
			
		||||
		numFloatALUAccesses += incrementBy;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	void incrementComplexALUAccesses(int incrementBy)
 | 
			
		||||
	{
 | 
			
		||||
		numComplexALUAccesses += incrementBy;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public EnergyConfig calculateAndPrintEnergy(FileWriter outputFileWriter, String componentName) throws IOException
 | 
			
		||||
	{
 | 
			
		||||
		EnergyConfig totalPower = new EnergyConfig(0, 0);
 | 
			
		||||
		EnergyConfig intALUPower = new EnergyConfig(core.getIntALUPower(), numIntALUAccesses);
 | 
			
		||||
		totalPower.add(totalPower, intALUPower);
 | 
			
		||||
		EnergyConfig floatALUPower = new EnergyConfig(core.getFloatALUPower(), numFloatALUAccesses);
 | 
			
		||||
		totalPower.add(totalPower, floatALUPower);
 | 
			
		||||
		EnergyConfig complexALUPower = new EnergyConfig(core.getComplexALUPower(), numComplexALUAccesses);
 | 
			
		||||
		totalPower.add(totalPower, complexALUPower);
 | 
			
		||||
		
 | 
			
		||||
		intALUPower.printEnergyStats(outputFileWriter, componentName + ".intALU");
 | 
			
		||||
		floatALUPower.printEnergyStats(outputFileWriter, componentName + ".floatALU");
 | 
			
		||||
		complexALUPower.printEnergyStats(outputFileWriter, componentName + ".complexALU");
 | 
			
		||||
		for(int i = 0; i < FUs.length; i++)
 | 
			
		||||
		{
 | 
			
		||||
			if(FUs[i] != null && FUs[i].length > 0)
 | 
			
		||||
			{
 | 
			
		||||
				FunctionalUnitType FUType = FUs[i][0].getFUType();
 | 
			
		||||
				for(int j = 0; j < FUs[i].length; j++)
 | 
			
		||||
				{
 | 
			
		||||
					EnergyConfig FUPower = new EnergyConfig(0, 0);
 | 
			
		||||
					
 | 
			
		||||
					switch(FUType)
 | 
			
		||||
					{
 | 
			
		||||
					case integerALU : {
 | 
			
		||||
						FUPower = new EnergyConfig(core.getCoreConfig().IntALUPower, FUs[i][j].getNoOfCyclesBusy());
 | 
			
		||||
						break;
 | 
			
		||||
					}
 | 
			
		||||
					case integerMul : {
 | 
			
		||||
						FUPower = new EnergyConfig(core.getCoreConfig().IntMulPower, FUs[i][j].getNoOfCyclesBusy());
 | 
			
		||||
						break;
 | 
			
		||||
					}
 | 
			
		||||
					case integerDiv : {
 | 
			
		||||
						FUPower = new EnergyConfig(core.getCoreConfig().IntDivPower, FUs[i][j].getNoOfCyclesBusy());
 | 
			
		||||
						break;
 | 
			
		||||
					}
 | 
			
		||||
					case floatALU : {
 | 
			
		||||
						FUPower = new EnergyConfig(core.getCoreConfig().FloatALUPower, FUs[i][j].getNoOfCyclesBusy());
 | 
			
		||||
						break;
 | 
			
		||||
					}
 | 
			
		||||
					case floatMul : {
 | 
			
		||||
						FUPower = new EnergyConfig(core.getCoreConfig().FloatMulPower, FUs[i][j].getNoOfCyclesBusy());
 | 
			
		||||
						break;
 | 
			
		||||
					}
 | 
			
		||||
					case floatDiv : {
 | 
			
		||||
						FUPower = new EnergyConfig(core.getCoreConfig().FloatDivPower, FUs[i][j].getNoOfCyclesBusy());
 | 
			
		||||
						break;
 | 
			
		||||
					}
 | 
			
		||||
					case integerVectorALU : {
 | 
			
		||||
						FUPower = new EnergyConfig(core.getCoreConfig().IntVectorALUPower, FUs[i][j].getNoOfCyclesBusy());
 | 
			
		||||
						break;
 | 
			
		||||
					}
 | 
			
		||||
					case integerVectorMul : {
 | 
			
		||||
						FUPower = new EnergyConfig(core.getCoreConfig().IntVectorMulPower, FUs[i][j].getNoOfCyclesBusy());
 | 
			
		||||
						break;
 | 
			
		||||
					}
 | 
			
		||||
					case floatVectorALU : {
 | 
			
		||||
						FUPower = new EnergyConfig(core.getCoreConfig().FloatVectorALUPower, FUs[i][j].getNoOfCyclesBusy());
 | 
			
		||||
						break;
 | 
			
		||||
					}
 | 
			
		||||
					case floatVectorMul : {
 | 
			
		||||
						FUPower = new EnergyConfig(core.getCoreConfig().FloatVectorMulPower, FUs[i][j].getNoOfCyclesBusy());
 | 
			
		||||
						break;
 | 
			
		||||
					}
 | 
			
		||||
					case FMA : {
 | 
			
		||||
						FUPower = new EnergyConfig(core.getCoreConfig().FMAPower, FUs[i][j].getNoOfCyclesBusy());
 | 
			
		||||
						break;
 | 
			
		||||
					}
 | 
			
		||||
					case branch : {
 | 
			
		||||
						FUPower = new EnergyConfig(core.getCoreConfig().BranchPower, FUs[i][j].getNoOfCyclesBusy());
 | 
			
		||||
						break;
 | 
			
		||||
					}
 | 
			
		||||
					case load : {
 | 
			
		||||
						FUPower = new EnergyConfig(core.getCoreConfig().LoadPower, FUs[i][j].getNoOfCyclesBusy());
 | 
			
		||||
						break;
 | 
			
		||||
					}
 | 
			
		||||
					case loadAGU : {
 | 
			
		||||
						FUPower = new EnergyConfig(core.getCoreConfig().LoadAGUPower, FUs[i][j].getNoOfCyclesBusy());
 | 
			
		||||
						break;
 | 
			
		||||
					}
 | 
			
		||||
					case store : {
 | 
			
		||||
						FUPower = new EnergyConfig(core.getCoreConfig().StorePower, FUs[i][j].getNoOfCyclesBusy());
 | 
			
		||||
						break;
 | 
			
		||||
					}
 | 
			
		||||
					case storeAGU : {
 | 
			
		||||
						FUPower = new EnergyConfig(core.getCoreConfig().StoreAGUPower, FUs[i][j].getNoOfCyclesBusy());
 | 
			
		||||
						break;
 | 
			
		||||
					}
 | 
			
		||||
					case AES : {
 | 
			
		||||
						FUPower = new EnergyConfig(core.getCoreConfig().AESPower, FUs[i][j].getNoOfCyclesBusy());
 | 
			
		||||
						break;
 | 
			
		||||
					}
 | 
			
		||||
					case vectorString : {
 | 
			
		||||
						FUPower = new EnergyConfig(core.getCoreConfig().VectorStringPower, FUs[i][j].getNoOfCyclesBusy());
 | 
			
		||||
						break;
 | 
			
		||||
					}
 | 
			
		||||
					case bitScan : {
 | 
			
		||||
						FUPower = new EnergyConfig(core.getCoreConfig().BitScanPower, FUs[i][j].getNoOfCyclesBusy());
 | 
			
		||||
						break;
 | 
			
		||||
					}
 | 
			
		||||
					case vectorShuffle : {
 | 
			
		||||
						FUPower = new EnergyConfig(core.getCoreConfig().VectorShufflePower, FUs[i][j].getNoOfCyclesBusy());
 | 
			
		||||
						break;
 | 
			
		||||
					}
 | 
			
		||||
					case LEA : {
 | 
			
		||||
						FUPower = new EnergyConfig(core.getCoreConfig().LEAPower, FUs[i][j].getNoOfCyclesBusy());
 | 
			
		||||
						break;
 | 
			
		||||
					}
 | 
			
		||||
					default : {
 | 
			
		||||
						misc.Error.showErrorAndExit("trying to compute power consumed of unknown FU Type " + FUType);
 | 
			
		||||
					}
 | 
			
		||||
					}				
 | 
			
		||||
					
 | 
			
		||||
					totalPower.add(FUPower);
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		return totalPower;
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,17 +4,29 @@ package pipeline;
 | 
			
		|||
public class FunctionalUnit {
 | 
			
		||||
	
 | 
			
		||||
	FunctionalUnitType FUType;
 | 
			
		||||
	int latency;
 | 
			
		||||
	int reciprocalOfThroughput;
 | 
			
		||||
	int numFunctionalities;
 | 
			
		||||
	/*
 | 
			
		||||
	 * FMA can do float ALU, float Mul, float vector ALU, float vector Mul, FMA, vector FMA
 | 
			
		||||
	 */
 | 
			
		||||
	int[] latency;
 | 
			
		||||
	int[] reciprocalOfThroughput;
 | 
			
		||||
	long timeWhenFUAvailable;
 | 
			
		||||
	int portNumber;
 | 
			
		||||
	
 | 
			
		||||
	public FunctionalUnit(FunctionalUnitType FUType, int latency,
 | 
			
		||||
			int reciprocalOfThroughput, int portNumber)
 | 
			
		||||
	long noOfCyclesBusy;
 | 
			
		||||
	
 | 
			
		||||
	public FunctionalUnit(FunctionalUnitType FUType, int numFunctionalities, int[] latency,
 | 
			
		||||
			int[] reciprocalOfThroughput, int portNumber)
 | 
			
		||||
	{
 | 
			
		||||
		this.FUType = FUType;
 | 
			
		||||
		this.latency = latency;
 | 
			
		||||
		this.reciprocalOfThroughput = reciprocalOfThroughput;
 | 
			
		||||
		this.numFunctionalities = numFunctionalities;
 | 
			
		||||
		this.latency = new int[numFunctionalities];
 | 
			
		||||
		this.reciprocalOfThroughput = new int[numFunctionalities];
 | 
			
		||||
		for(int i = 0; i < numFunctionalities; i++)
 | 
			
		||||
		{
 | 
			
		||||
			this.latency[i] = latency[i];
 | 
			
		||||
			this.reciprocalOfThroughput[i] = reciprocalOfThroughput[i];
 | 
			
		||||
		}
 | 
			
		||||
		this.timeWhenFUAvailable = 0;
 | 
			
		||||
		this.portNumber = portNumber;
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -23,12 +35,12 @@ public class FunctionalUnit {
 | 
			
		|||
		return FUType;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public int getLatency() {
 | 
			
		||||
		return latency;
 | 
			
		||||
	public int getLatency(int functionality) {
 | 
			
		||||
		return latency[functionality];
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public int getReciprocalOfThroughput() {
 | 
			
		||||
		return reciprocalOfThroughput;
 | 
			
		||||
	public int getReciprocalOfThroughput(int functionality) {
 | 
			
		||||
		return reciprocalOfThroughput[functionality];
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public long getTimeWhenFUAvailable() {
 | 
			
		||||
| 
						 | 
				
			
			@ -43,4 +55,12 @@ public class FunctionalUnit {
 | 
			
		|||
		return portNumber;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public long getNoOfCyclesBusy() {
 | 
			
		||||
		return noOfCyclesBusy;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void incrementNoOfCyclesBusy(long noOfCyclesBusy) {
 | 
			
		||||
		this.noOfCyclesBusy += noOfCyclesBusy;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,12 +5,25 @@ public enum FunctionalUnitType {
 | 
			
		|||
	inValid,
 | 
			
		||||
	integerALU,
 | 
			
		||||
	integerMul,
 | 
			
		||||
	integerDiv,
 | 
			
		||||
	integerDiv/*approximated as a single instruction exercising a single FU, though data sheets speak of multiple micro-ops*/,
 | 
			
		||||
	floatALU,
 | 
			
		||||
	floatMul,
 | 
			
		||||
	floatDiv,
 | 
			
		||||
	memory,
 | 
			
		||||
	jump,
 | 
			
		||||
	FMA,
 | 
			
		||||
	integerVectorALU,
 | 
			
		||||
	integerVectorMul,
 | 
			
		||||
	floatVectorALU,
 | 
			
		||||
	floatVectorMul,
 | 
			
		||||
	load,
 | 
			
		||||
	loadAGU,
 | 
			
		||||
	store,
 | 
			
		||||
	storeAGU,
 | 
			
		||||
	branch,
 | 
			
		||||
	AES,
 | 
			
		||||
	vectorString,
 | 
			
		||||
	bitScan,
 | 
			
		||||
	vectorShuffle,
 | 
			
		||||
	LEA,
 | 
			
		||||
	no_of_types
 | 
			
		||||
	
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -7,48 +7,108 @@ import generic.OperationType;
 | 
			
		|||
 */
 | 
			
		||||
public class OpTypeToFUTypeMapping {
 | 
			
		||||
	
 | 
			
		||||
	public static FunctionalUnitType getFUType(OperationType opType)
 | 
			
		||||
	public static FunctionalUnitType[] intALUFUs = {FunctionalUnitType.integerALU};
 | 
			
		||||
	public static FunctionalUnitType[] intMulFUs = {FunctionalUnitType.integerMul};
 | 
			
		||||
	public static FunctionalUnitType[] intDivFUs = {FunctionalUnitType.integerDiv};
 | 
			
		||||
	public static FunctionalUnitType[] floatALUFUs = {FunctionalUnitType.floatALU, FunctionalUnitType.FMA};
 | 
			
		||||
	public static FunctionalUnitType[] floatMulFUs = {FunctionalUnitType.floatMul, FunctionalUnitType.FMA};
 | 
			
		||||
	public static FunctionalUnitType[] floatDivFUs = {FunctionalUnitType.floatDiv};
 | 
			
		||||
	public static FunctionalUnitType[] intVectorALUFUs = {FunctionalUnitType.integerVectorALU};
 | 
			
		||||
	public static FunctionalUnitType[] intVectorMulFUs = {FunctionalUnitType.integerVectorMul};
 | 
			
		||||
	public static FunctionalUnitType[] floatVectorALUFUs = {FunctionalUnitType.floatVectorALU, FunctionalUnitType.FMA};
 | 
			
		||||
	public static FunctionalUnitType[] floatVectorMulFUs = {FunctionalUnitType.floatVectorMul, FunctionalUnitType.FMA};
 | 
			
		||||
	public static FunctionalUnitType[] FMAFUs = {FunctionalUnitType.FMA};
 | 
			
		||||
	public static FunctionalUnitType[] VectorFMAFUs = {FunctionalUnitType.FMA};
 | 
			
		||||
	public static FunctionalUnitType[] loadFUs = {FunctionalUnitType.load};
 | 
			
		||||
	public static FunctionalUnitType[] loadAGUFUs = {FunctionalUnitType.loadAGU};
 | 
			
		||||
	public static FunctionalUnitType[] storeFUs = {FunctionalUnitType.store};
 | 
			
		||||
	public static FunctionalUnitType[] storeAGUFUs = {FunctionalUnitType.storeAGU};
 | 
			
		||||
	public static FunctionalUnitType[] branchFUs = {FunctionalUnitType.branch};
 | 
			
		||||
	public static FunctionalUnitType[] AESFUs = {FunctionalUnitType.AES};
 | 
			
		||||
	public static FunctionalUnitType[] vectorStringFUs = {FunctionalUnitType.vectorString};
 | 
			
		||||
	public static FunctionalUnitType[] bitScanFUs = {FunctionalUnitType.bitScan};
 | 
			
		||||
	public static FunctionalUnitType[] vectorShuffleFUs = {FunctionalUnitType.vectorShuffle};
 | 
			
		||||
	public static FunctionalUnitType[] LEAFUs = {FunctionalUnitType.LEA};
 | 
			
		||||
	public static FunctionalUnitType[] invalidFUs = {FunctionalUnitType.inValid};
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
	public static FunctionalUnitType[] getFUType(OperationType opType)
 | 
			
		||||
	{
 | 
			
		||||
		switch(opType)
 | 
			
		||||
		{
 | 
			
		||||
			case integerALU	:	{
 | 
			
		||||
									return FunctionalUnitType.integerALU;
 | 
			
		||||
									return intALUFUs;
 | 
			
		||||
								}
 | 
			
		||||
			case integerMul	:	{
 | 
			
		||||
									return FunctionalUnitType.integerMul;
 | 
			
		||||
									return intMulFUs;
 | 
			
		||||
								}
 | 
			
		||||
			case integerDiv	:	{
 | 
			
		||||
									return FunctionalUnitType.integerDiv;
 | 
			
		||||
									return intDivFUs;
 | 
			
		||||
								}
 | 
			
		||||
			case floatALU	:	{
 | 
			
		||||
									return FunctionalUnitType.floatALU;
 | 
			
		||||
									return floatALUFUs;
 | 
			
		||||
								}
 | 
			
		||||
			case floatMul	:	{
 | 
			
		||||
									return FunctionalUnitType.floatMul;
 | 
			
		||||
									return floatMulFUs;
 | 
			
		||||
								}
 | 
			
		||||
			case floatDiv	:	{
 | 
			
		||||
									return FunctionalUnitType.floatDiv;
 | 
			
		||||
									return floatDivFUs;
 | 
			
		||||
								}
 | 
			
		||||
			case integerVectorALU	:	{
 | 
			
		||||
									return intVectorALUFUs;
 | 
			
		||||
								}
 | 
			
		||||
			case integerVectorMul	:	{
 | 
			
		||||
									return intVectorMulFUs;
 | 
			
		||||
								}
 | 
			
		||||
			case floatVectorALU	:	{
 | 
			
		||||
									return floatVectorALUFUs;
 | 
			
		||||
								}
 | 
			
		||||
			case floatVectorMul	:	{
 | 
			
		||||
									return floatVectorMulFUs;
 | 
			
		||||
								}
 | 
			
		||||
			case FMA :			{
 | 
			
		||||
									return FMAFUs;
 | 
			
		||||
								}
 | 
			
		||||
			case vectorFMA :	{
 | 
			
		||||
									return VectorFMAFUs;
 | 
			
		||||
								}
 | 
			
		||||
			case read_prefetch:
 | 
			
		||||
			case load		:	{
 | 
			
		||||
									return FunctionalUnitType.memory;
 | 
			
		||||
									return loadFUs;
 | 
			
		||||
								}
 | 
			
		||||
			case loadAGU		:	{
 | 
			
		||||
									return loadAGUFUs;
 | 
			
		||||
								}
 | 
			
		||||
			case write_prefetch:
 | 
			
		||||
			case store		:	{
 | 
			
		||||
									return FunctionalUnitType.memory;
 | 
			
		||||
									return storeFUs;
 | 
			
		||||
								}
 | 
			
		||||
			case storeAGU	:	{
 | 
			
		||||
									return storeAGUFUs;
 | 
			
		||||
								}
 | 
			
		||||
			case jump		:	{
 | 
			
		||||
									return FunctionalUnitType.jump;
 | 
			
		||||
									return branchFUs;
 | 
			
		||||
								}
 | 
			
		||||
			case branch		:	{
 | 
			
		||||
									return FunctionalUnitType.jump;
 | 
			
		||||
									return branchFUs;
 | 
			
		||||
								}
 | 
			
		||||
			case mov		:	{
 | 
			
		||||
									return FunctionalUnitType.integerALU;
 | 
			
		||||
			case AES		:	{
 | 
			
		||||
									return AESFUs;
 | 
			
		||||
								}
 | 
			
		||||
			case xchg		:	{
 | 
			
		||||
									return FunctionalUnitType.integerALU;
 | 
			
		||||
			case vectorString		:	{
 | 
			
		||||
									return vectorStringFUs;
 | 
			
		||||
								}
 | 
			
		||||
			case bitScan		:	{
 | 
			
		||||
									return bitScanFUs;
 | 
			
		||||
								}
 | 
			
		||||
			case vectorShuffle		:	{
 | 
			
		||||
									return vectorShuffleFUs;
 | 
			
		||||
								}
 | 
			
		||||
			case LEA		:	{
 | 
			
		||||
									return LEAFUs;
 | 
			
		||||
								}
 | 
			
		||||
			default			:	{
 | 
			
		||||
									return FunctionalUnitType.inValid;
 | 
			
		||||
									return invalidFUs;
 | 
			
		||||
								}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,6 +2,7 @@ package pipeline.multi_issue_inorder;
 | 
			
		|||
 | 
			
		||||
import java.io.FileWriter;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
 | 
			
		||||
import config.EnergyConfig;
 | 
			
		||||
import config.SimulationConfig;
 | 
			
		||||
| 
						 | 
				
			
			@ -34,6 +35,8 @@ public class DecodeUnit_MII extends SimulationElement{
 | 
			
		|||
	
 | 
			
		||||
	long instCtr; //for debug
 | 
			
		||||
	
 | 
			
		||||
	public HashMap<Long, FunctionalUnitType> assignedFUType;
 | 
			
		||||
	
 | 
			
		||||
	public DecodeUnit_MII(Core core, MultiIssueInorderExecutionEngine execEngine)
 | 
			
		||||
	{
 | 
			
		||||
		/*
 | 
			
		||||
| 
						 | 
				
			
			@ -52,6 +55,8 @@ public class DecodeUnit_MII extends SimulationElement{
 | 
			
		|||
		lastValidIPSeen = -1;
 | 
			
		||||
		
 | 
			
		||||
		instCtr = 0;
 | 
			
		||||
		
 | 
			
		||||
		assignedFUType = new HashMap<Long, FunctionalUnitType>();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	
 | 
			
		||||
| 
						 | 
				
			
			@ -83,11 +88,63 @@ public class DecodeUnit_MII extends SimulationElement{
 | 
			
		|||
				}
 | 
			
		||||
				
 | 
			
		||||
				//check for structural hazards
 | 
			
		||||
				FunctionalUnitType[] FUType = OpTypeToFUTypeMapping.getFUType(ins.getOperationType());
 | 
			
		||||
				long FURequest = 0;
 | 
			
		||||
				if(OpTypeToFUTypeMapping.getFUType(ins.getOperationType()) != FunctionalUnitType.inValid)
 | 
			
		||||
				
 | 
			
		||||
				//int functionality = 6;
 | 
			
		||||
				FunctionalUnitType assignedFUType = FunctionalUnitType.inValid;
 | 
			
		||||
				
 | 
			
		||||
				if(FUType[0] != FunctionalUnitType.inValid)
 | 
			
		||||
				{
 | 
			
		||||
					FURequest = containingExecutionEngine.getExecutionCore().requestFU(
 | 
			
		||||
							OpTypeToFUTypeMapping.getFUType(ins.getOperationType()));
 | 
			
		||||
					for(int i = 0; i < FUType.length; i++)
 | 
			
		||||
					{
 | 
			
		||||
						/*
 | 
			
		||||
						if(FUType[i].compareTo(FunctionalUnitType.FMA) != 0)
 | 
			
		||||
						{
 | 
			
		||||
							functionality = 0;		
 | 
			
		||||
						}
 | 
			
		||||
						else
 | 
			
		||||
						{
 | 
			
		||||
							switch(opType)
 | 
			
		||||
							{
 | 
			
		||||
								case floatALU:	{
 | 
			
		||||
													functionality = 0;
 | 
			
		||||
													break;
 | 
			
		||||
												}
 | 
			
		||||
								case floatMul:	{
 | 
			
		||||
													functionality = 1;
 | 
			
		||||
													break;
 | 
			
		||||
												}
 | 
			
		||||
								case floatVectorALU:	{
 | 
			
		||||
													functionality = 2;
 | 
			
		||||
													break;
 | 
			
		||||
												}
 | 
			
		||||
								case floatVectorMul:	{
 | 
			
		||||
													functionality = 3;
 | 
			
		||||
													break;
 | 
			
		||||
												}
 | 
			
		||||
								case FMA:	{
 | 
			
		||||
													functionality = 4;
 | 
			
		||||
													break;
 | 
			
		||||
												}
 | 
			
		||||
								case vectorFMA:	{
 | 
			
		||||
													functionality = 5;
 | 
			
		||||
													break;
 | 
			
		||||
												}
 | 
			
		||||
								default : 		{
 | 
			
		||||
													misc.Error.showErrorAndExit("requesting unsupported operation " + opType + " from an FMA");
 | 
			
		||||
												}
 | 
			
		||||
							}
 | 
			
		||||
						}
 | 
			
		||||
						*/
 | 
			
		||||
						
 | 
			
		||||
						FURequest = containingExecutionEngine.getExecutionCore().requestFU(FUType[i], 0);
 | 
			
		||||
						if(FURequest <= 0)
 | 
			
		||||
						{
 | 
			
		||||
							assignedFUType = FUType[i];
 | 
			
		||||
							break;
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				
 | 
			
		||||
					if(FURequest > 0)
 | 
			
		||||
					{
 | 
			
		||||
| 
						 | 
				
			
			@ -96,27 +153,14 @@ public class DecodeUnit_MII extends SimulationElement{
 | 
			
		|||
				}
 | 
			
		||||
				
 | 
			
		||||
				incrementNumDecodes(1);
 | 
			
		||||
   				
 | 
			
		||||
				
 | 
			
		||||
				this.assignedFUType.put(ins.getSerialNo(), assignedFUType);
 | 
			
		||||
				
 | 
			
		||||
				//add destination register of ins to list of outstanding registers
 | 
			
		||||
				if(ins.getOperationType() == OperationType.load)
 | 
			
		||||
				{
 | 
			
		||||
					addToValueReadyArray(ins.getDestinationOperand(), Long.MAX_VALUE);
 | 
			
		||||
				}
 | 
			
		||||
				else if(ins.getOperationType() == OperationType.xchg)
 | 
			
		||||
				{
 | 
			
		||||
					addToValueReadyArray(ins.getSourceOperand1(),
 | 
			
		||||
							GlobalClock.getCurrentTime()
 | 
			
		||||
								+ containingExecutionEngine.getExecutionCore().getFULatency(
 | 
			
		||||
										OpTypeToFUTypeMapping.getFUType(ins.getOperationType())));
 | 
			
		||||
					if(ins.getSourceOperand1().getValue() != ins.getSourceOperand2().getValue()
 | 
			
		||||
							|| ins.getSourceOperand1().getOperandType() != ins.getSourceOperand2().getOperandType())
 | 
			
		||||
					{
 | 
			
		||||
						addToValueReadyArray(ins.getSourceOperand2(),
 | 
			
		||||
								GlobalClock.getCurrentTime()
 | 
			
		||||
									+ containingExecutionEngine.getExecutionCore().getFULatency(
 | 
			
		||||
											OpTypeToFUTypeMapping.getFUType(ins.getOperationType())));
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				else
 | 
			
		||||
				{
 | 
			
		||||
					if(ins.getDestinationOperand() != null)
 | 
			
		||||
| 
						 | 
				
			
			@ -124,7 +168,7 @@ public class DecodeUnit_MII extends SimulationElement{
 | 
			
		|||
						addToValueReadyArray(ins.getDestinationOperand(),
 | 
			
		||||
											GlobalClock.getCurrentTime()
 | 
			
		||||
												+ containingExecutionEngine.getExecutionCore().getFULatency(
 | 
			
		||||
														OpTypeToFUTypeMapping.getFUType(ins.getOperationType())));
 | 
			
		||||
														assignedFUType, 0));
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -63,13 +63,16 @@ public class ExecUnitIn_MII extends SimulationElement{
 | 
			
		|||
			ins = idExLatch.peek(0);
 | 
			
		||||
			if(ins!=null)
 | 
			
		||||
			{
 | 
			
		||||
				FunctionalUnitType FUType = OpTypeToFUTypeMapping.getFUType(ins.getOperationType());
 | 
			
		||||
				FunctionalUnitType FUType = containingExecutionEngine.getDecodeUnitIn().assignedFUType.get(ins.getSerialNo());
 | 
			
		||||
				long lat = 1;
 | 
			
		||||
				
 | 
			
		||||
				if(FUType != FunctionalUnitType.memory
 | 
			
		||||
				if(FUType != FunctionalUnitType.load
 | 
			
		||||
						&& FUType != FunctionalUnitType.loadAGU
 | 
			
		||||
						&& FUType != FunctionalUnitType.store
 | 
			
		||||
						&& FUType != FunctionalUnitType.storeAGU
 | 
			
		||||
						&& FUType != FunctionalUnitType.inValid)
 | 
			
		||||
				{
 | 
			
		||||
					lat = containingExecutionEngine.getExecutionCore().getFULatency(FUType);
 | 
			
		||||
					lat = containingExecutionEngine.getExecutionCore().getFULatency(FUType, 0);
 | 
			
		||||
				}
 | 
			
		||||
				/*
 | 
			
		||||
				 * memory address computation for loads/stores happens in this cycle
 | 
			
		||||
| 
						 | 
				
			
			@ -86,8 +89,9 @@ public class ExecUnitIn_MII extends SimulationElement{
 | 
			
		|||
				exMemLatch.add(ins, idExLatch.getInstructionCompletesAt(ins) + lat);
 | 
			
		||||
				idExLatch.poll();
 | 
			
		||||
				
 | 
			
		||||
				if(ins.getDestinationOperand() != null
 | 
			
		||||
						|| ins.getOperationType() == OperationType.xchg)
 | 
			
		||||
				containingExecutionEngine.getDecodeUnitIn().assignedFUType.remove(ins.getSerialNo());
 | 
			
		||||
				
 | 
			
		||||
				if(ins.getDestinationOperand() != null)
 | 
			
		||||
				{
 | 
			
		||||
					incrementResultsBroadcastBusAccesses(1);
 | 
			
		||||
				}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -52,7 +52,7 @@ public class FetchUnitIn_MII extends SimulationElement
 | 
			
		|||
		this.ifId_latch = execEngine.getIfIdLatch();
 | 
			
		||||
		
 | 
			
		||||
		this.fetchBufferCapacity = (int)(core.getIssueWidth()
 | 
			
		||||
				* (SystemConfig.core[core.getCore_number()].getICacheLatency()/core.getStepSize()));
 | 
			
		||||
				* SystemConfig.core[core.getCore_number()].getICacheLatency());
 | 
			
		||||
		this.fetchBuffer = new Instruction[this.fetchBufferCapacity];
 | 
			
		||||
		this.fetchFillCount=0;
 | 
			
		||||
		this.fetchBufferIndex=0;
 | 
			
		||||
| 
						 | 
				
			
			@ -71,22 +71,17 @@ public class FetchUnitIn_MII extends SimulationElement
 | 
			
		|||
	
 | 
			
		||||
	public void fillFetchBuffer(MultiIssueInorderPipeline inorderPipeline)
 | 
			
		||||
	{
 | 
			
		||||
		if(inputToPipeline.isEmpty())
 | 
			
		||||
			return;
 | 
			
		||||
		
 | 
			
		||||
		Instruction newInstruction=null;
 | 
			
		||||
		for(int i=(this.fetchBufferIndex+this.fetchFillCount)%this.fetchBufferCapacity;this.fetchFillCount<this.fetchBufferCapacity
 | 
			
		||||
				;i = (i+1)%this.fetchBufferCapacity){
 | 
			
		||||
			
 | 
			
		||||
			if(containingExecutionEngine.multiIssueInorderCoreMemorySystem.getiCache().isBusy(newInstruction.getCISCProgramCounter())){
 | 
			
		||||
			if(inputToPipeline.isEmpty()
 | 
			
		||||
					|| containingExecutionEngine.multiIssueInorderCoreMemorySystem.getiCache().isBusy(inputToPipeline.peek(0).getCISCProgramCounter())){
 | 
			
		||||
				break;
 | 
			
		||||
			}
 | 
			
		||||
			
 | 
			
		||||
			newInstruction = inputToPipeline.pollFirst();
 | 
			
		||||
			
 | 
			
		||||
			if(newInstruction == null)
 | 
			
		||||
				return;
 | 
			
		||||
			
 | 
			
		||||
			if(newInstruction.getOperationType() == OperationType.load ||
 | 
			
		||||
					newInstruction.getOperationType() == OperationType.store)
 | 
			
		||||
			{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -11,8 +11,10 @@ import memorysystem.CoreMemorySystem;
 | 
			
		|||
public class InorderCoreMemorySystem_MII extends CoreMemorySystem {
 | 
			
		||||
	
 | 
			
		||||
	MultiIssueInorderExecutionEngine containingExecEngine;
 | 
			
		||||
	public int numOfLoads=0;
 | 
			
		||||
	public long numOfStores;
 | 
			
		||||
	public long numOfLoads=0;
 | 
			
		||||
	public long numOfStores=0;
 | 
			
		||||
	public long NoOfSoftwareReadPrefetch = 0;
 | 
			
		||||
	public long NoOfSoftwareWritePrefetch = 0;
 | 
			
		||||
	public InorderCoreMemorySystem_MII(Core core)
 | 
			
		||||
	{
 | 
			
		||||
		super(core);
 | 
			
		||||
| 
						 | 
				
			
			@ -191,4 +193,14 @@ public class InorderCoreMemorySystem_MII extends CoreMemorySystem {
 | 
			
		|||
		
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public long getNumberOfSoftwareReadPrefetches() {
 | 
			
		||||
		return NoOfSoftwareReadPrefetch;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public long getNumberOfSoftwareWritePrefetches() {
 | 
			
		||||
		return NoOfSoftwareWritePrefetch;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,6 +2,8 @@ package pipeline.multi_issue_inorder;
 | 
			
		|||
 | 
			
		||||
import config.SimulationConfig;
 | 
			
		||||
import memorysystem.AddressCarryingEvent;
 | 
			
		||||
import memorysystem.Cache;
 | 
			
		||||
import pipeline.outoforder.OutOrderCoreMemorySystem;
 | 
			
		||||
import generic.Core;
 | 
			
		||||
import generic.Event;
 | 
			
		||||
import generic.EventQueue;
 | 
			
		||||
| 
						 | 
				
			
			@ -77,6 +79,46 @@ public class MemUnitIn_MII extends SimulationElement{
 | 
			
		|||
						break;
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				if(ins.getOperationType() == OperationType.read_prefetch)
 | 
			
		||||
				{
 | 
			
		||||
					Cache cacheToPrefetchTo = containingExecutionEngine.getCoreMemorySystem().getL1Cache();
 | 
			
		||||
					for(int i = 2; i <= ins.getSourceOperand2().getValue(); i++)
 | 
			
		||||
					{
 | 
			
		||||
						cacheToPrefetchTo = cacheToPrefetchTo.nextLevel;
 | 
			
		||||
					}
 | 
			
		||||
					
 | 
			
		||||
					long addr = ins.getSourceOperand1MemValue();
 | 
			
		||||
					
 | 
			
		||||
					if(cacheToPrefetchTo.isBusy(addr))
 | 
			
		||||
						break;
 | 
			
		||||
					
 | 
			
		||||
					AddressCarryingEvent addressEvent = new AddressCarryingEvent(core.getEventQueue(),
 | 
			
		||||
							0, containingExecutionEngine.getCoreMemorySystem(), cacheToPrefetchTo, RequestType.Cache_Read, addr);
 | 
			
		||||
					
 | 
			
		||||
					cacheToPrefetchTo.getPort().put(addressEvent);
 | 
			
		||||
					
 | 
			
		||||
					((InorderCoreMemorySystem_MII)containingExecutionEngine.getCoreMemorySystem()).NoOfSoftwareReadPrefetch++;
 | 
			
		||||
				}
 | 
			
		||||
				if(ins.getOperationType() == OperationType.write_prefetch)
 | 
			
		||||
				{
 | 
			
		||||
					Cache cacheToPrefetchTo = containingExecutionEngine.getCoreMemorySystem().getL1Cache();
 | 
			
		||||
					
 | 
			
		||||
					long addr = ins.getSourceOperand1MemValue();
 | 
			
		||||
					
 | 
			
		||||
					if(cacheToPrefetchTo.isBusy(addr))
 | 
			
		||||
						break;
 | 
			
		||||
					
 | 
			
		||||
					AddressCarryingEvent addressEvent = new AddressCarryingEvent(core.getEventQueue(),
 | 
			
		||||
							0, containingExecutionEngine.getCoreMemorySystem(), cacheToPrefetchTo, RequestType.Cache_Write, addr);
 | 
			
		||||
					/*
 | 
			
		||||
					 * setting as cache write is an approximation
 | 
			
		||||
					 * this would dirty the cache line, and that should actually not happen
 | 
			
		||||
					 */
 | 
			
		||||
					
 | 
			
		||||
					cacheToPrefetchTo.getPort().put(addressEvent);
 | 
			
		||||
					
 | 
			
		||||
					((InorderCoreMemorySystem_MII)containingExecutionEngine.getCoreMemorySystem()).NoOfSoftwareWritePrefetch++;
 | 
			
		||||
				}
 | 
			
		||||
				
 | 
			
		||||
				if(ins.getSerialNo() != instCtr && ins.getOperationType() != OperationType.inValid)
 | 
			
		||||
				{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -82,7 +82,7 @@ public class MultiIssueInorderExecutionEngine extends ExecutionEngine{
 | 
			
		|||
		l2accesses=0;
 | 
			
		||||
		
 | 
			
		||||
		valueReadyInteger = new long[core.getNIntegerArchitecturalRegisters()];
 | 
			
		||||
		valueReadyFloat = new long[core.getNFloatingPointArchitecturalRegisters()];
 | 
			
		||||
		valueReadyFloat = new long[core.getNVectorArchitecturalRegisters()];
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public int getNumPipelines() {
 | 
			
		||||
| 
						 | 
				
			
			@ -129,7 +129,7 @@ public class MultiIssueInorderExecutionEngine extends ExecutionEngine{
 | 
			
		|||
		
 | 
			
		||||
		if (execComplete == true)
 | 
			
		||||
		{
 | 
			
		||||
			core.setCoreCyclesTaken(GlobalClock.getCurrentTime()/core.getStepSize());
 | 
			
		||||
			core.setCoreCyclesTaken(GlobalClock.getCurrentTime());
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	public boolean getExecutionComplete(){
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -94,16 +94,7 @@ public class WriteBackUnitIn_MII extends SimulationElement{
 | 
			
		|||
				
 | 
			
		||||
				//write-back
 | 
			
		||||
				incrementNumRegFileAccesses(ins.getDestinationOperand(), 1);
 | 
			
		||||
				if(ins.getOperationType() == OperationType.xchg)
 | 
			
		||||
				{
 | 
			
		||||
					incrementNumRegFileAccesses(ins.getSourceOperand1(), 1);
 | 
			
		||||
					if(ins.getSourceOperand1().getValue() != ins.getSourceOperand2().getValue()
 | 
			
		||||
							|| ins.getSourceOperand1().getOperandType() != ins.getSourceOperand2().getOperandType())
 | 
			
		||||
					{
 | 
			
		||||
						incrementNumRegFileAccesses(ins.getSourceOperand2(), 1);
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				
 | 
			
		||||
								
 | 
			
		||||
				if(ins.getSerialNo() != instCtr && ins.getOperationType() != OperationType.inValid)
 | 
			
		||||
				{
 | 
			
		||||
					misc.Error.showErrorAndExit("wb out of order!!");
 | 
			
		||||
| 
						 | 
				
			
			@ -169,7 +160,7 @@ public class WriteBackUnitIn_MII extends SimulationElement{
 | 
			
		|||
		EnergyConfig totalPower = new EnergyConfig(0, 0);
 | 
			
		||||
		EnergyConfig intRegFilePower = new EnergyConfig(core.getIntRegFilePower(), numIntRegFileAccesses);
 | 
			
		||||
		totalPower.add(totalPower, intRegFilePower);
 | 
			
		||||
		EnergyConfig floatRegFilePower = new EnergyConfig(core.getFpRegFilePower(), numFloatRegFileAccesses);
 | 
			
		||||
		EnergyConfig floatRegFilePower = new EnergyConfig(core.getVectorRegFilePower(), numFloatRegFileAccesses);
 | 
			
		||||
		totalPower.add(totalPower, floatRegFilePower);
 | 
			
		||||
		
 | 
			
		||||
		intRegFilePower.printEnergyStats(outputFileWriter, componentName + ".int");
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -65,6 +65,12 @@ public class DecodeLogic extends SimulationElement {
 | 
			
		|||
					break;
 | 
			
		||||
				}
 | 
			
		||||
				
 | 
			
		||||
				if(constrainedBySerialization(headInstruction) == true)
 | 
			
		||||
				{
 | 
			
		||||
					containingExecutionEngine.setToStall6(true);
 | 
			
		||||
					break;
 | 
			
		||||
				}
 | 
			
		||||
				
 | 
			
		||||
				if(headInstruction.getOperationType() == OperationType.load ||
 | 
			
		||||
						headInstruction.getOperationType() == OperationType.store)
 | 
			
		||||
				{
 | 
			
		||||
| 
						 | 
				
			
			@ -95,9 +101,31 @@ public class DecodeLogic extends SimulationElement {
 | 
			
		|||
			
 | 
			
		||||
			containingExecutionEngine.setToStall3(false);
 | 
			
		||||
			containingExecutionEngine.setToStall4(false);
 | 
			
		||||
			containingExecutionEngine.setToStall6(false);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	private boolean constrainedBySerialization(Instruction headInstruction) {
 | 
			
		||||
		
 | 
			
		||||
		if(containingExecutionEngine.getReorderBuffer().getNumCPUIDsInBuffer() > 0)
 | 
			
		||||
			return true;
 | 
			
		||||
		
 | 
			
		||||
		if(containingExecutionEngine.getReorderBuffer().getNumMFencesInBuffer() > 0
 | 
			
		||||
				&& (headInstruction.getOperationType() == OperationType.load
 | 
			
		||||
					|| headInstruction.getOperationType() == OperationType.store))
 | 
			
		||||
			return true;
 | 
			
		||||
		
 | 
			
		||||
		if(containingExecutionEngine.getReorderBuffer().getNumSFencesInBuffer() > 0
 | 
			
		||||
				&& (headInstruction.getOperationType() == OperationType.store))
 | 
			
		||||
			return true;
 | 
			
		||||
		
 | 
			
		||||
		if(containingExecutionEngine.getReorderBuffer().getNumLFencesInBuffer() > 0
 | 
			
		||||
				&& (headInstruction.getOperationType() == OperationType.load))
 | 
			
		||||
			return true;
 | 
			
		||||
		
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ReorderBufferEntry makeROBEntries(Instruction newInstruction)
 | 
			
		||||
	{
 | 
			
		||||
		if(newInstruction != null)
 | 
			
		||||
| 
						 | 
				
			
			@ -122,6 +150,26 @@ public class DecodeLogic extends SimulationElement {
 | 
			
		|||
						newROBEntry);
 | 
			
		||||
			}
 | 
			
		||||
			
 | 
			
		||||
			if(newInstruction.getOperationType() == OperationType.cpuid)
 | 
			
		||||
			{
 | 
			
		||||
				containingExecutionEngine.getReorderBuffer().incrementNumCPUIDsInBuffer();
 | 
			
		||||
			}
 | 
			
		||||
			
 | 
			
		||||
			if(newInstruction.getOperationType() == OperationType.mfence)
 | 
			
		||||
			{
 | 
			
		||||
				containingExecutionEngine.getReorderBuffer().incrementNumMFencesInBuffer();
 | 
			
		||||
			}
 | 
			
		||||
			
 | 
			
		||||
			if(newInstruction.getOperationType() == OperationType.sfence)
 | 
			
		||||
			{
 | 
			
		||||
				containingExecutionEngine.getReorderBuffer().incrementNumSFencesInBuffer();
 | 
			
		||||
			}
 | 
			
		||||
			
 | 
			
		||||
			if(newInstruction.getOperationType() == OperationType.lfence)
 | 
			
		||||
			{
 | 
			
		||||
				containingExecutionEngine.getReorderBuffer().incrementNumLFencesInBuffer();
 | 
			
		||||
			}
 | 
			
		||||
			
 | 
			
		||||
			return newROBEntry;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -89,8 +89,7 @@ public class ExecutionLogic extends SimulationElement {
 | 
			
		|||
		reorderBufferEntry.setExecuted(true);
 | 
			
		||||
		
 | 
			
		||||
		//wake up dependent instructions
 | 
			
		||||
		if(reorderBufferEntry.getInstruction().getDestinationOperand() != null
 | 
			
		||||
				|| reorderBufferEntry.getInstruction().getOperationType() == OperationType.xchg)
 | 
			
		||||
		if(reorderBufferEntry.getInstruction().getDestinationOperand() != null)
 | 
			
		||||
		{
 | 
			
		||||
			performBroadCast(reorderBufferEntry);
 | 
			
		||||
			incrementResultsBroadcastBusAccesses(1);
 | 
			
		||||
| 
						 | 
				
			
			@ -125,20 +124,6 @@ public class ExecutionLogic extends SimulationElement {
 | 
			
		|||
									reorderBufferEntry.getThreadID(),
 | 
			
		||||
									(reorderBufferEntry.pos + 1)%ROB.MaxROBSize);
 | 
			
		||||
		}
 | 
			
		||||
		else if(reorderBufferEntry.getInstruction().getOperationType() == OperationType.xchg)
 | 
			
		||||
		{
 | 
			
		||||
			WakeUpLogic.wakeUpLogic(core,
 | 
			
		||||
									reorderBufferEntry.getInstruction().getSourceOperand1().getOperandType(),
 | 
			
		||||
									reorderBufferEntry.getOperand1PhyReg1(),
 | 
			
		||||
									reorderBufferEntry.getThreadID(),
 | 
			
		||||
									(reorderBufferEntry.pos + 1)%ROB.MaxROBSize);
 | 
			
		||||
			
 | 
			
		||||
			WakeUpLogic.wakeUpLogic(core,
 | 
			
		||||
									reorderBufferEntry.getInstruction().getSourceOperand2().getOperandType(),
 | 
			
		||||
									reorderBufferEntry.getOperand2PhyReg1(),
 | 
			
		||||
									reorderBufferEntry.getThreadID(),
 | 
			
		||||
									(reorderBufferEntry.pos + 1)%ROB.MaxROBSize);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	void incrementResultsBroadcastBusAccesses(int incrementBy)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,7 @@
 | 
			
		|||
package pipeline.outoforder;
 | 
			
		||||
 | 
			
		||||
import config.SimulationConfig;
 | 
			
		||||
import emulatorinterface.translator.x86.registers.Registers;
 | 
			
		||||
import main.ArchitecturalComponent;
 | 
			
		||||
import main.CustomObjectPool;
 | 
			
		||||
import memorysystem.AddressCarryingEvent;
 | 
			
		||||
| 
						 | 
				
			
			@ -76,7 +77,8 @@ public class FetchLogic extends SimulationElement {
 | 
			
		|||
				!execEngine.isToStall2() &&
 | 
			
		||||
				!execEngine.isToStall3() &&
 | 
			
		||||
				!execEngine.isToStall4() &&
 | 
			
		||||
				!execEngine.isToStall5())
 | 
			
		||||
				!execEngine.isToStall5() &&
 | 
			
		||||
				!execEngine.isToStall6())
 | 
			
		||||
		{
 | 
			
		||||
			//add instructions, for whom "fetch" from iCache has completed, to fetch buffer
 | 
			
		||||
			//decode stage reads from this buffer
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -9,6 +9,8 @@ import generic.GlobalClock;
 | 
			
		|||
import generic.Instruction;
 | 
			
		||||
import generic.OperationType;
 | 
			
		||||
import generic.RequestType;
 | 
			
		||||
import memorysystem.AddressCarryingEvent;
 | 
			
		||||
import memorysystem.Cache;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * represents an entry in the instruction window
 | 
			
		||||
| 
						 | 
				
			
			@ -104,8 +106,8 @@ public class IWEntry {
 | 
			
		|||
	
 | 
			
		||||
	boolean issueOthers()
 | 
			
		||||
	{
 | 
			
		||||
		FunctionalUnitType FUType = OpTypeToFUTypeMapping.getFUType(opType);
 | 
			
		||||
		if(FUType == FunctionalUnitType.inValid)
 | 
			
		||||
		FunctionalUnitType[] FUType = OpTypeToFUTypeMapping.getFUType(opType);
 | 
			
		||||
		if(FUType[0] == FunctionalUnitType.inValid)
 | 
			
		||||
		{
 | 
			
		||||
			associatedROBEntry.setIssued(true);
 | 
			
		||||
			associatedROBEntry.setFUInstance(0);
 | 
			
		||||
| 
						 | 
				
			
			@ -119,8 +121,166 @@ public class IWEntry {
 | 
			
		|||
		long FURequest = 0;	//will be <= 0 if an FU was obtained
 | 
			
		||||
		//will be > 0 otherwise, indicating how long before
 | 
			
		||||
		//	an FU of the type will be available
 | 
			
		||||
		
 | 
			
		||||
		FunctionalUnitType assignedFUType = FunctionalUnitType.no_of_types;
 | 
			
		||||
 | 
			
		||||
		FURequest = execEngine.getExecutionCore().requestFU(FUType);
 | 
			
		||||
		for(int i = 0; i < FUType.length; i++)
 | 
			
		||||
		{
 | 
			
		||||
			FURequest = execEngine.getExecutionCore().requestFU(FUType[i], 0);
 | 
			
		||||
			if(FURequest <= 0)
 | 
			
		||||
			{
 | 
			
		||||
				assignedFUType = FUType[i];
 | 
			
		||||
				break;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		if(FURequest <= 0)
 | 
			
		||||
		{
 | 
			
		||||
			if(opType != OperationType.load
 | 
			
		||||
					&& opType != OperationType.store
 | 
			
		||||
					&& opType != OperationType.read_prefetch
 | 
			
		||||
					&& opType != OperationType.write_prefetch)
 | 
			
		||||
			{
 | 
			
		||||
				associatedROBEntry.setIssued(true);
 | 
			
		||||
				associatedROBEntry.setFUInstance((int) ((-1) * FURequest));
 | 
			
		||||
				
 | 
			
		||||
				//remove IW entry
 | 
			
		||||
				instructionWindow.removeFromWindow(this);			
 | 
			
		||||
			
 | 
			
		||||
				core.getEventQueue().addEvent(
 | 
			
		||||
						new BroadCastEvent(
 | 
			
		||||
								GlobalClock.getCurrentTime() + (execEngine.getExecutionCore().getFULatency(
 | 
			
		||||
										assignedFUType, 0) - 1) * core.getStepSize(),
 | 
			
		||||
								null, 
 | 
			
		||||
								execEngine.getExecuter(),
 | 
			
		||||
								RequestType.BROADCAST,
 | 
			
		||||
								associatedROBEntry));
 | 
			
		||||
				
 | 
			
		||||
				core.getEventQueue().addEvent(
 | 
			
		||||
						new ExecCompleteEvent(
 | 
			
		||||
								null,
 | 
			
		||||
								GlobalClock.getCurrentTime() + execEngine.getExecutionCore().getFULatency(
 | 
			
		||||
										assignedFUType, 0) * core.getStepSize(),
 | 
			
		||||
								null, 
 | 
			
		||||
								execEngine.getExecuter(),
 | 
			
		||||
								RequestType.EXEC_COMPLETE,
 | 
			
		||||
								associatedROBEntry));
 | 
			
		||||
			}
 | 
			
		||||
			else if(opType == OperationType.read_prefetch)
 | 
			
		||||
			{
 | 
			
		||||
				Cache cacheToPrefetchTo = execEngine.getCoreMemorySystem().getL1Cache();
 | 
			
		||||
				for(int i = 2; i <= associatedROBEntry.getInstruction().getSourceOperand2().getValue(); i++)
 | 
			
		||||
				{
 | 
			
		||||
					cacheToPrefetchTo = cacheToPrefetchTo.nextLevel;
 | 
			
		||||
				}
 | 
			
		||||
				
 | 
			
		||||
				long addr = associatedROBEntry.getInstruction().getSourceOperand1MemValue();
 | 
			
		||||
				
 | 
			
		||||
				if(cacheToPrefetchTo.isBusy(addr))
 | 
			
		||||
					return false;
 | 
			
		||||
				
 | 
			
		||||
				AddressCarryingEvent addressEvent = new AddressCarryingEvent(execEngine.getCore().getEventQueue(),
 | 
			
		||||
						0, execEngine.getCoreMemorySystem(), cacheToPrefetchTo, RequestType.Cache_Read, addr);
 | 
			
		||||
				
 | 
			
		||||
				cacheToPrefetchTo.getPort().put(addressEvent);
 | 
			
		||||
				
 | 
			
		||||
				associatedROBEntry.setIssued(true);
 | 
			
		||||
				associatedROBEntry.setExecuted(true);
 | 
			
		||||
				associatedROBEntry.setWriteBackDone1(true);
 | 
			
		||||
				associatedROBEntry.setWriteBackDone2(true);
 | 
			
		||||
				
 | 
			
		||||
				associatedROBEntry.setFUInstance((int) ((-1) * FURequest));
 | 
			
		||||
				
 | 
			
		||||
				//remove IW entry
 | 
			
		||||
				instructionWindow.removeFromWindow(this);
 | 
			
		||||
				
 | 
			
		||||
				((OutOrderCoreMemorySystem)execEngine.getCoreMemorySystem()).getLsqueue().NoOfSoftwareReadPrefetch++;
 | 
			
		||||
				
 | 
			
		||||
				return true;
 | 
			
		||||
			}
 | 
			
		||||
			else if(opType == OperationType.write_prefetch)
 | 
			
		||||
			{
 | 
			
		||||
				Cache cacheToPrefetchTo = execEngine.getCoreMemorySystem().getL1Cache();
 | 
			
		||||
				
 | 
			
		||||
				long addr = associatedROBEntry.getInstruction().getSourceOperand1MemValue();
 | 
			
		||||
				
 | 
			
		||||
				if(cacheToPrefetchTo.isBusy(addr))
 | 
			
		||||
					return false;
 | 
			
		||||
				
 | 
			
		||||
				AddressCarryingEvent addressEvent = new AddressCarryingEvent(execEngine.getCore().getEventQueue(),
 | 
			
		||||
						0, execEngine.getCoreMemorySystem(), cacheToPrefetchTo, RequestType.Cache_Write, addr);
 | 
			
		||||
				/*
 | 
			
		||||
				 * setting as cache write is an approximation
 | 
			
		||||
				 * this would dirty the cache line, and that should actually not happen
 | 
			
		||||
				 */
 | 
			
		||||
				
 | 
			
		||||
				cacheToPrefetchTo.getPort().put(addressEvent);
 | 
			
		||||
				
 | 
			
		||||
				associatedROBEntry.setIssued(true);
 | 
			
		||||
				associatedROBEntry.setExecuted(true);
 | 
			
		||||
				associatedROBEntry.setWriteBackDone1(true);
 | 
			
		||||
				associatedROBEntry.setWriteBackDone2(true);
 | 
			
		||||
				
 | 
			
		||||
				associatedROBEntry.setFUInstance((int) ((-1) * FURequest));
 | 
			
		||||
				
 | 
			
		||||
				//remove IW entry
 | 
			
		||||
				instructionWindow.removeFromWindow(this);
 | 
			
		||||
				
 | 
			
		||||
				((OutOrderCoreMemorySystem)execEngine.getCoreMemorySystem()).getLsqueue().NoOfSoftwareWritePrefetch++;
 | 
			
		||||
				
 | 
			
		||||
				return true;
 | 
			
		||||
			}
 | 
			
		||||
/*		
 | 
			
		||||
		int functionality = 6;
 | 
			
		||||
		FunctionalUnitType assignedFUType = FunctionalUnitType.no_of_types;
 | 
			
		||||
 | 
			
		||||
		for(int i = 0; i < FUType.length; i++)
 | 
			
		||||
		{
 | 
			
		||||
			if(FUType[i].compareTo(FunctionalUnitType.FMA) != 0)
 | 
			
		||||
			{
 | 
			
		||||
				functionality = 0;		
 | 
			
		||||
			}
 | 
			
		||||
			else
 | 
			
		||||
			{
 | 
			
		||||
				switch(opType)
 | 
			
		||||
				{
 | 
			
		||||
					case floatALU:	{
 | 
			
		||||
										functionality = 0;
 | 
			
		||||
										break;
 | 
			
		||||
									}
 | 
			
		||||
					case floatMul:	{
 | 
			
		||||
										functionality = 1;
 | 
			
		||||
										break;
 | 
			
		||||
									}
 | 
			
		||||
					case floatVectorALU:	{
 | 
			
		||||
										functionality = 2;
 | 
			
		||||
										break;
 | 
			
		||||
									}
 | 
			
		||||
					case floatVectorMul:	{
 | 
			
		||||
										functionality = 3;
 | 
			
		||||
										break;
 | 
			
		||||
									}
 | 
			
		||||
					case FMA:	{
 | 
			
		||||
										functionality = 4;
 | 
			
		||||
										break;
 | 
			
		||||
									}
 | 
			
		||||
					case vectorFMA:	{
 | 
			
		||||
										functionality = 5;
 | 
			
		||||
										break;
 | 
			
		||||
									}
 | 
			
		||||
					default : 		{
 | 
			
		||||
										misc.Error.showErrorAndExit("requesting unsupported operation " + opType + " from an FMA");
 | 
			
		||||
									}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			
 | 
			
		||||
			FURequest = execEngine.getExecutionCore().requestFU(FUType[i], functionality);
 | 
			
		||||
			if(FURequest <= 0)
 | 
			
		||||
			{
 | 
			
		||||
				assignedFUType = FUType[i];
 | 
			
		||||
				break;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		if(FURequest <= 0)
 | 
			
		||||
		{
 | 
			
		||||
| 
						 | 
				
			
			@ -135,7 +295,7 @@ public class IWEntry {
 | 
			
		|||
				core.getEventQueue().addEvent(
 | 
			
		||||
						new BroadCastEvent(
 | 
			
		||||
								GlobalClock.getCurrentTime() + (execEngine.getExecutionCore().getFULatency(
 | 
			
		||||
										OpTypeToFUTypeMapping.getFUType(opType)) - 1) * core.getStepSize(),
 | 
			
		||||
										assignedFUType, functionality) - 1) * core.getStepSize(),
 | 
			
		||||
								null, 
 | 
			
		||||
								execEngine.getExecuter(),
 | 
			
		||||
								RequestType.BROADCAST,
 | 
			
		||||
| 
						 | 
				
			
			@ -145,13 +305,13 @@ public class IWEntry {
 | 
			
		|||
						new ExecCompleteEvent(
 | 
			
		||||
								null,
 | 
			
		||||
								GlobalClock.getCurrentTime() + execEngine.getExecutionCore().getFULatency(
 | 
			
		||||
										OpTypeToFUTypeMapping.getFUType(opType)) * core.getStepSize(),
 | 
			
		||||
										assignedFUType, functionality) * core.getStepSize(),
 | 
			
		||||
								null, 
 | 
			
		||||
								execEngine.getExecuter(),
 | 
			
		||||
								RequestType.EXEC_COMPLETE,
 | 
			
		||||
								associatedROBEntry));
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
			if(SimulationConfig.debugMode)
 | 
			
		||||
			{
 | 
			
		||||
				System.out.println("issue : " + GlobalClock.getCurrentTime()/core.getStepSize() + " : "  + associatedROBEntry.getInstruction());
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -45,7 +45,11 @@ public class IWPushLogic extends SimulationElement {
 | 
			
		|||
			if(headROBEntry != null)
 | 
			
		||||
			{
 | 
			
		||||
				if(headROBEntry.getInstruction().getOperationType() == OperationType.inValid ||
 | 
			
		||||
						headROBEntry.getInstruction().getOperationType() == OperationType.nop)
 | 
			
		||||
						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);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -28,7 +28,7 @@ public class OperandAvailabilityChecker {
 | 
			
		|||
		}
 | 
			
		||||
		
 | 
			
		||||
		if(tempOpndType == OperandType.integerRegister ||
 | 
			
		||||
				tempOpndType == OperandType.floatRegister)
 | 
			
		||||
				tempOpndType == OperandType.vectorRegister)
 | 
			
		||||
		{
 | 
			
		||||
			RenameTable tempRN;
 | 
			
		||||
			if(tempOpndType	== OperandType.integerRegister)
 | 
			
		||||
| 
						 | 
				
			
			@ -37,7 +37,7 @@ public class OperandAvailabilityChecker {
 | 
			
		|||
			}
 | 
			
		||||
			else
 | 
			
		||||
			{
 | 
			
		||||
				tempRN = execEngine.getFloatingPointRenameTable();
 | 
			
		||||
				tempRN = execEngine.getVectorRenameTable();
 | 
			
		||||
			}
 | 
			
		||||
			
 | 
			
		||||
			if(tempRN.getAssociatedRegisterFile().getValueValid(phyReg1) == true
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -232,4 +232,18 @@ public class OutOrderCoreMemorySystem extends CoreMemorySystem {
 | 
			
		|||
		getLsqueue().NoOfForwards = numValueForwardings;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public long getNumberOfSoftwareReadPrefetches() {
 | 
			
		||||
		return getLsqueue().NoOfSoftwareReadPrefetch;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public long getNumberOfSoftwareWritePrefetches() {
 | 
			
		||||
		return getLsqueue().NoOfSoftwareWritePrefetch;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -35,9 +35,9 @@ public class OutOrderExecutionEngine extends ExecutionEngine {
 | 
			
		|||
	private ReorderBuffer reorderBuffer;
 | 
			
		||||
	private InstructionWindow instructionWindow;
 | 
			
		||||
	private RegisterFile integerRegisterFile;
 | 
			
		||||
	private RegisterFile floatingPointRegisterFile;
 | 
			
		||||
	private RegisterFile vectorRegisterFile;
 | 
			
		||||
	private RenameTable integerRenameTable;
 | 
			
		||||
	private RenameTable floatingPointRenameTable;
 | 
			
		||||
	private RenameTable vectorRenameTable;
 | 
			
		||||
 | 
			
		||||
	//Core-specific memory system (a set of LSQ, TLB and L1 cache)
 | 
			
		||||
	private OutOrderCoreMemorySystem outOrderCoreMemorySystem;
 | 
			
		||||
| 
						 | 
				
			
			@ -61,6 +61,9 @@ public class OutOrderExecutionEngine extends ExecutionEngine {
 | 
			
		|||
	private boolean toStall5;					//if branch mis-predicted
 | 
			
		||||
	//fetcher stall
 | 
			
		||||
 | 
			
		||||
	private boolean toStall6;					//decode is stalled because of a preceding serialization instruction
 | 
			
		||||
	//fetcher stall
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	public long prevCycles;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -75,8 +78,8 @@ public class OutOrderExecutionEngine extends ExecutionEngine {
 | 
			
		|||
		instructionWindow = new InstructionWindow(core, this);
 | 
			
		||||
		integerRegisterFile = new RegisterFile(core, core.getIntegerRegisterFileSize());
 | 
			
		||||
		integerRenameTable = new RenameTable(this, core.getNIntegerArchitecturalRegisters(), core.getIntegerRegisterFileSize(), integerRegisterFile, core.getNo_of_input_pipes());
 | 
			
		||||
		floatingPointRegisterFile = new RegisterFile(core, core.getFloatingPointRegisterFileSize());
 | 
			
		||||
		floatingPointRenameTable = new RenameTable(this, core.getNFloatingPointArchitecturalRegisters(), core.getFloatingPointRegisterFileSize(), floatingPointRegisterFile, core.getNo_of_input_pipes());
 | 
			
		||||
		vectorRegisterFile = new RegisterFile(core, core.getVectorRegisterFileSize());
 | 
			
		||||
		vectorRenameTable = new RenameTable(this, core.getNVectorArchitecturalRegisters(), core.getVectorRegisterFileSize(), vectorRegisterFile, core.getNo_of_input_pipes());
 | 
			
		||||
 | 
			
		||||
		fetchBuffer = new GenericCircularQueue(Instruction.class, core.getDecodeWidth());
 | 
			
		||||
		fetcher = new FetchLogic(core, this);
 | 
			
		||||
| 
						 | 
				
			
			@ -95,6 +98,7 @@ public class OutOrderExecutionEngine extends ExecutionEngine {
 | 
			
		|||
		toStall3 = false;
 | 
			
		||||
		toStall4 = false;
 | 
			
		||||
		toStall5 = false;
 | 
			
		||||
		toStall6 = false;
 | 
			
		||||
		prevCycles=0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -110,12 +114,12 @@ public class OutOrderExecutionEngine extends ExecutionEngine {
 | 
			
		|||
		return decoder;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public RegisterFile getFloatingPointRegisterFile() {
 | 
			
		||||
		return floatingPointRegisterFile;
 | 
			
		||||
	public RegisterFile getVectorRegisterFile() {
 | 
			
		||||
		return vectorRegisterFile;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public RenameTable getFloatingPointRenameTable() {
 | 
			
		||||
		return floatingPointRenameTable;
 | 
			
		||||
	public RenameTable getVectorRenameTable() {
 | 
			
		||||
		return vectorRenameTable;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public RegisterFile getIntegerRegisterFile() {
 | 
			
		||||
| 
						 | 
				
			
			@ -178,6 +182,14 @@ public class OutOrderExecutionEngine extends ExecutionEngine {
 | 
			
		|||
		this.toStall5 = toStall5;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public boolean isToStall6() {
 | 
			
		||||
		return toStall6;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void setToStall6(boolean toStall6) {
 | 
			
		||||
		this.toStall6 = toStall6;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public GenericCircularQueue<Instruction> getFetchBuffer() {
 | 
			
		||||
		return fetchBuffer;
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -253,7 +265,7 @@ public class OutOrderExecutionEngine extends ExecutionEngine {
 | 
			
		|||
		EnergyConfig intRegFilePower =  getIntegerRegisterFile().calculateAndPrintEnergy(outputFileWriter, componentName + ".intRegFile");
 | 
			
		||||
		totalPower.add(totalPower, intRegFilePower);
 | 
			
		||||
 | 
			
		||||
		EnergyConfig floatRegFilePower =  getFloatingPointRegisterFile().calculateAndPrintEnergy(outputFileWriter, componentName + ".floatRegFile");
 | 
			
		||||
		EnergyConfig floatRegFilePower =  getVectorRegisterFile().calculateAndPrintEnergy(outputFileWriter, componentName + ".floatRegFile");
 | 
			
		||||
		totalPower.add(totalPower, floatRegFilePower);
 | 
			
		||||
 | 
			
		||||
		EnergyConfig iwPower =  getInstructionWindow().calculateAndPrintEnergy(outputFileWriter, componentName + ".InstrWindow");
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -92,7 +92,7 @@ public class RegisterFile extends SimulationElement{
 | 
			
		|||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			totalPower = new EnergyConfig(core.getFpRegFilePower(), numAccesses);
 | 
			
		||||
			totalPower = new EnergyConfig(core.getVectorRegFilePower(), numAccesses);
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		totalPower.printEnergyStats(outputFileWriter, componentName);		
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -106,16 +106,14 @@ public class RenameLogic extends SimulationElement {
 | 
			
		|||
	 */
 | 
			
		||||
	private void processOperand1(ReorderBufferEntry reorderBufferEntry)
 | 
			
		||||
	{
 | 
			
		||||
		if(reorderBufferEntry.getInstruction().getOperationType() == OperationType.xchg)
 | 
			
		||||
		{
 | 
			
		||||
			//handled in processDestOperand()
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		Operand tempOpnd = reorderBufferEntry.getInstruction().getSourceOperand1();
 | 
			
		||||
		if(tempOpnd == null ||
 | 
			
		||||
				reorderBufferEntry.getInstruction().getOperationType() == OperationType.inValid ||
 | 
			
		||||
				reorderBufferEntry.getInstruction().getOperationType() == OperationType.nop)
 | 
			
		||||
				reorderBufferEntry.getInstruction().getOperationType() == OperationType.nop ||
 | 
			
		||||
				reorderBufferEntry.getInstruction().getOperationType() == OperationType.cpuid ||
 | 
			
		||||
				reorderBufferEntry.getInstruction().getOperationType() == OperationType.mfence ||
 | 
			
		||||
				reorderBufferEntry.getInstruction().getOperationType() == OperationType.sfence ||
 | 
			
		||||
				reorderBufferEntry.getInstruction().getOperationType() == OperationType.lfence)
 | 
			
		||||
		{
 | 
			
		||||
			reorderBufferEntry.setOperand1PhyReg1(-1);
 | 
			
		||||
			reorderBufferEntry.setOperand1PhyReg2(-1);
 | 
			
		||||
| 
						 | 
				
			
			@ -130,10 +128,10 @@ public class RenameLogic extends SimulationElement {
 | 
			
		|||
			reorderBufferEntry.setOperand1PhyReg1(execEngine.getIntegerRenameTable().getPhysicalRegister(threadID, archReg));
 | 
			
		||||
			reorderBufferEntry.setOperand1PhyReg2(-1);
 | 
			
		||||
		}
 | 
			
		||||
		else if(tempOpndType == OperandType.floatRegister)
 | 
			
		||||
		else if(tempOpndType == OperandType.vectorRegister)
 | 
			
		||||
		{
 | 
			
		||||
			archReg = (int) tempOpnd.getValue();
 | 
			
		||||
			reorderBufferEntry.setOperand1PhyReg1(execEngine.getFloatingPointRenameTable().getPhysicalRegister(threadID, archReg));
 | 
			
		||||
			reorderBufferEntry.setOperand1PhyReg1(execEngine.getVectorRenameTable().getPhysicalRegister(threadID, archReg));
 | 
			
		||||
			reorderBufferEntry.setOperand1PhyReg2(-1);
 | 
			
		||||
		}
 | 
			
		||||
		else if(tempOpndType == OperandType.memory)
 | 
			
		||||
| 
						 | 
				
			
			@ -155,9 +153,9 @@ public class RenameLogic extends SimulationElement {
 | 
			
		|||
				{
 | 
			
		||||
					reorderBufferEntry.setOperand1PhyReg1(execEngine.getIntegerRenameTable().getPhysicalRegister(threadID, archReg));
 | 
			
		||||
				}
 | 
			
		||||
				else if(tempOpndType == OperandType.floatRegister)
 | 
			
		||||
				else if(tempOpndType == OperandType.vectorRegister)
 | 
			
		||||
				{
 | 
			
		||||
					reorderBufferEntry.setOperand1PhyReg1(execEngine.getFloatingPointRenameTable().getPhysicalRegister(threadID, archReg));
 | 
			
		||||
					reorderBufferEntry.setOperand1PhyReg1(execEngine.getVectorRenameTable().getPhysicalRegister(threadID, archReg));
 | 
			
		||||
				}
 | 
			
		||||
				else
 | 
			
		||||
				{
 | 
			
		||||
| 
						 | 
				
			
			@ -179,9 +177,9 @@ public class RenameLogic extends SimulationElement {
 | 
			
		|||
				{
 | 
			
		||||
					reorderBufferEntry.setOperand1PhyReg2(execEngine.getIntegerRenameTable().getPhysicalRegister(threadID, archReg));
 | 
			
		||||
				}
 | 
			
		||||
				else if(tempOpndType == OperandType.floatRegister)
 | 
			
		||||
				else if(tempOpndType == OperandType.vectorRegister)
 | 
			
		||||
				{
 | 
			
		||||
					reorderBufferEntry.setOperand1PhyReg2(execEngine.getFloatingPointRenameTable().getPhysicalRegister(threadID, archReg));
 | 
			
		||||
					reorderBufferEntry.setOperand1PhyReg2(execEngine.getVectorRenameTable().getPhysicalRegister(threadID, archReg));
 | 
			
		||||
				}
 | 
			
		||||
				else
 | 
			
		||||
				{
 | 
			
		||||
| 
						 | 
				
			
			@ -201,17 +199,15 @@ public class RenameLogic extends SimulationElement {
 | 
			
		|||
	 */
 | 
			
		||||
	private void processOperand2(ReorderBufferEntry reorderBufferEntry)
 | 
			
		||||
	{
 | 
			
		||||
		if(reorderBufferEntry.getInstruction().getOperationType() == OperationType.xchg)
 | 
			
		||||
		{
 | 
			
		||||
			//handled in processDestOperand()
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		Operand tempOpnd = reorderBufferEntry.getInstruction().getSourceOperand2();
 | 
			
		||||
		
 | 
			
		||||
		if(tempOpnd == null ||
 | 
			
		||||
				reorderBufferEntry.getInstruction().getOperationType() == OperationType.inValid ||
 | 
			
		||||
				reorderBufferEntry.getInstruction().getOperationType() == OperationType.nop)
 | 
			
		||||
				reorderBufferEntry.getInstruction().getOperationType() == OperationType.nop ||
 | 
			
		||||
				reorderBufferEntry.getInstruction().getOperationType() == OperationType.cpuid ||
 | 
			
		||||
				reorderBufferEntry.getInstruction().getOperationType() == OperationType.mfence ||
 | 
			
		||||
				reorderBufferEntry.getInstruction().getOperationType() == OperationType.sfence ||
 | 
			
		||||
				reorderBufferEntry.getInstruction().getOperationType() == OperationType.lfence)
 | 
			
		||||
		{
 | 
			
		||||
			reorderBufferEntry.setOperand2PhyReg1(-1);
 | 
			
		||||
			reorderBufferEntry.setOperand2PhyReg2(-1);
 | 
			
		||||
| 
						 | 
				
			
			@ -226,10 +222,10 @@ public class RenameLogic extends SimulationElement {
 | 
			
		|||
			reorderBufferEntry.setOperand2PhyReg1(execEngine.getIntegerRenameTable().getPhysicalRegister(threadID, archReg));
 | 
			
		||||
			reorderBufferEntry.setOperand2PhyReg2(-1);
 | 
			
		||||
		}
 | 
			
		||||
		else if(tempOpndType == OperandType.floatRegister)
 | 
			
		||||
		else if(tempOpndType == OperandType.vectorRegister)
 | 
			
		||||
		{
 | 
			
		||||
			archReg = (int) tempOpnd.getValue();
 | 
			
		||||
			reorderBufferEntry.setOperand2PhyReg1(execEngine.getFloatingPointRenameTable().getPhysicalRegister(threadID, archReg));
 | 
			
		||||
			reorderBufferEntry.setOperand2PhyReg1(execEngine.getVectorRenameTable().getPhysicalRegister(threadID, archReg));
 | 
			
		||||
			reorderBufferEntry.setOperand2PhyReg2(-1);
 | 
			
		||||
		}
 | 
			
		||||
		else if(tempOpndType == OperandType.memory)
 | 
			
		||||
| 
						 | 
				
			
			@ -251,9 +247,9 @@ public class RenameLogic extends SimulationElement {
 | 
			
		|||
				{
 | 
			
		||||
					reorderBufferEntry.setOperand2PhyReg1(execEngine.getIntegerRenameTable().getPhysicalRegister(threadID, archReg));
 | 
			
		||||
				}
 | 
			
		||||
				else if(tempOpndType == OperandType.floatRegister)
 | 
			
		||||
				else if(tempOpndType == OperandType.vectorRegister)
 | 
			
		||||
				{
 | 
			
		||||
					reorderBufferEntry.setOperand2PhyReg1(execEngine.getFloatingPointRenameTable().getPhysicalRegister(threadID, archReg));
 | 
			
		||||
					reorderBufferEntry.setOperand2PhyReg1(execEngine.getVectorRenameTable().getPhysicalRegister(threadID, archReg));
 | 
			
		||||
				}
 | 
			
		||||
				else
 | 
			
		||||
				{
 | 
			
		||||
| 
						 | 
				
			
			@ -275,9 +271,9 @@ public class RenameLogic extends SimulationElement {
 | 
			
		|||
				{
 | 
			
		||||
					reorderBufferEntry.setOperand2PhyReg2(execEngine.getIntegerRenameTable().getPhysicalRegister(threadID, archReg));
 | 
			
		||||
				}
 | 
			
		||||
				else if(tempOpndType == OperandType.floatRegister)
 | 
			
		||||
				else if(tempOpndType == OperandType.vectorRegister)
 | 
			
		||||
				{
 | 
			
		||||
					reorderBufferEntry.setOperand2PhyReg2(execEngine.getFloatingPointRenameTable().getPhysicalRegister(threadID, archReg));
 | 
			
		||||
					reorderBufferEntry.setOperand2PhyReg2(execEngine.getVectorRenameTable().getPhysicalRegister(threadID, archReg));
 | 
			
		||||
				}
 | 
			
		||||
				else
 | 
			
		||||
				{
 | 
			
		||||
| 
						 | 
				
			
			@ -299,7 +295,11 @@ public class RenameLogic extends SimulationElement {
 | 
			
		|||
	private boolean canDestOperandBeProcessed(ReorderBufferEntry reorderBufferEntry)
 | 
			
		||||
	{
 | 
			
		||||
		if(reorderBufferEntry.getInstruction().getOperationType() == OperationType.inValid ||
 | 
			
		||||
				reorderBufferEntry.getInstruction().getOperationType() == OperationType.nop)
 | 
			
		||||
				reorderBufferEntry.getInstruction().getOperationType() == OperationType.nop ||
 | 
			
		||||
				reorderBufferEntry.getInstruction().getOperationType() == OperationType.cpuid ||
 | 
			
		||||
				reorderBufferEntry.getInstruction().getOperationType() == OperationType.mfence ||
 | 
			
		||||
				reorderBufferEntry.getInstruction().getOperationType() == OperationType.sfence ||
 | 
			
		||||
				reorderBufferEntry.getInstruction().getOperationType() == OperationType.lfence)
 | 
			
		||||
		{
 | 
			
		||||
			return true;
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -307,43 +307,22 @@ public class RenameLogic extends SimulationElement {
 | 
			
		|||
		int numIntRegsRequired = 0;
 | 
			
		||||
		int numFloatRegsRequired = 0;
 | 
			
		||||
		
 | 
			
		||||
		if(reorderBufferEntry.getInstruction().getOperationType() == OperationType.xchg)
 | 
			
		||||
		
 | 
			
		||||
		Operand tempOpnd = reorderBufferEntry.getInstruction().getDestinationOperand();
 | 
			
		||||
		if(tempOpnd != null)
 | 
			
		||||
		{
 | 
			
		||||
			if(reorderBufferEntry.getInstruction().getSourceOperand1().getOperandType() == OperandType.integerRegister)
 | 
			
		||||
			if(tempOpnd.getOperandType() == OperandType.integerRegister)
 | 
			
		||||
			{
 | 
			
		||||
				numIntRegsRequired++;
 | 
			
		||||
			}
 | 
			
		||||
			else if(reorderBufferEntry.getInstruction().getSourceOperand1().getOperandType() == OperandType.floatRegister)
 | 
			
		||||
			else if(tempOpnd.getOperandType() == OperandType.vectorRegister)
 | 
			
		||||
			{
 | 
			
		||||
				numFloatRegsRequired++;
 | 
			
		||||
			}
 | 
			
		||||
			if(reorderBufferEntry.getInstruction().getSourceOperand2().getOperandType() == OperandType.integerRegister)
 | 
			
		||||
			{
 | 
			
		||||
				numIntRegsRequired++;
 | 
			
		||||
			}
 | 
			
		||||
			else if(reorderBufferEntry.getInstruction().getSourceOperand2().getOperandType() == OperandType.floatRegister)
 | 
			
		||||
			{
 | 
			
		||||
				numFloatRegsRequired++;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			Operand tempOpnd = reorderBufferEntry.getInstruction().getDestinationOperand();
 | 
			
		||||
			if(tempOpnd != null)
 | 
			
		||||
			{
 | 
			
		||||
				if(tempOpnd.getOperandType() == OperandType.integerRegister)
 | 
			
		||||
				{
 | 
			
		||||
					numIntRegsRequired++;
 | 
			
		||||
				}
 | 
			
		||||
				else if(tempOpnd.getOperandType() == OperandType.floatRegister)
 | 
			
		||||
				{
 | 
			
		||||
					numFloatRegsRequired++;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
			
 | 
			
		||||
		if(numIntRegsRequired <= execEngine.getIntegerRenameTable().getAvailableListSize()
 | 
			
		||||
				&& numFloatRegsRequired <= execEngine.getFloatingPointRenameTable().getAvailableListSize())
 | 
			
		||||
				&& numFloatRegsRequired <= execEngine.getVectorRenameTable().getAvailableListSize())
 | 
			
		||||
		{
 | 
			
		||||
			return true;
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -361,46 +340,21 @@ public class RenameLogic extends SimulationElement {
 | 
			
		|||
		Operand tempOpnd;
 | 
			
		||||
		OperandType tempOpndType;
 | 
			
		||||
		
 | 
			
		||||
		if(reorderBufferEntry.getInstruction().getOperationType() == OperationType.xchg)
 | 
			
		||||
		{
 | 
			
		||||
			tempOpnd = reorderBufferEntry.getInstruction().getSourceOperand1();
 | 
			
		||||
			tempOpndType = tempOpnd.getOperandType();
 | 
			
		||||
			
 | 
			
		||||
			boolean op1handled = handleIntFloat(reorderBufferEntry, 2);
 | 
			
		||||
			
 | 
			
		||||
			if(op1handled == true)
 | 
			
		||||
			{
 | 
			
		||||
				tempOpnd = reorderBufferEntry.getInstruction().getSourceOperand2();
 | 
			
		||||
				tempOpndType = tempOpnd.getOperandType();
 | 
			
		||||
				
 | 
			
		||||
				if(tempOpndType == reorderBufferEntry.getInstruction().getSourceOperand1().getOperandType() &&
 | 
			
		||||
						tempOpnd.getValue() == reorderBufferEntry.getInstruction().getSourceOperand1().getValue())
 | 
			
		||||
				{
 | 
			
		||||
					//of the form xchg rx, rx
 | 
			
		||||
					reorderBufferEntry.setOperand2PhyReg1(reorderBufferEntry.getOperand1PhyReg1());
 | 
			
		||||
					return true;
 | 
			
		||||
				}
 | 
			
		||||
				
 | 
			
		||||
				return handleIntFloat(reorderBufferEntry, 3);
 | 
			
		||||
			}
 | 
			
		||||
			else
 | 
			
		||||
			{
 | 
			
		||||
				return false;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		
 | 
			
		||||
		tempOpnd = reorderBufferEntry.getInstruction().getDestinationOperand();
 | 
			
		||||
		if(tempOpnd == null ||
 | 
			
		||||
				reorderBufferEntry.getInstruction().getOperationType() == OperationType.inValid ||
 | 
			
		||||
				reorderBufferEntry.getInstruction().getOperationType() == OperationType.nop)
 | 
			
		||||
				reorderBufferEntry.getInstruction().getOperationType() == OperationType.nop ||
 | 
			
		||||
				reorderBufferEntry.getInstruction().getOperationType() == OperationType.cpuid ||
 | 
			
		||||
				reorderBufferEntry.getInstruction().getOperationType() == OperationType.mfence ||
 | 
			
		||||
				reorderBufferEntry.getInstruction().getOperationType() == OperationType.sfence ||
 | 
			
		||||
				reorderBufferEntry.getInstruction().getOperationType() == OperationType.lfence)
 | 
			
		||||
		{
 | 
			
		||||
			return true;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		tempOpndType = tempOpnd.getOperandType();
 | 
			
		||||
		if(tempOpndType != OperandType.integerRegister &&
 | 
			
		||||
				tempOpndType != OperandType.floatRegister)
 | 
			
		||||
				tempOpndType != OperandType.vectorRegister)
 | 
			
		||||
		{
 | 
			
		||||
			return true;
 | 
			
		||||
		}		
 | 
			
		||||
| 
						 | 
				
			
			@ -444,7 +398,7 @@ public class RenameLogic extends SimulationElement {
 | 
			
		|||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			tempRN = execEngine.getFloatingPointRenameTable();
 | 
			
		||||
			tempRN = execEngine.getVectorRenameTable();
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		int r = tempRN.allocatePhysicalRegister(threadID, registerNumber);
 | 
			
		||||
| 
						 | 
				
			
			@ -486,18 +440,15 @@ public class RenameLogic extends SimulationElement {
 | 
			
		|||
	
 | 
			
		||||
	void checkOperand1Availability()
 | 
			
		||||
	{
 | 
			
		||||
		if(reorderBufferEntry.getInstruction().getOperationType() == OperationType.xchg)
 | 
			
		||||
		{
 | 
			
		||||
			//handled in processDestOperand()
 | 
			
		||||
			reorderBufferEntry.setOperand1Available(true);
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		Operand tempOpnd = instruction.getSourceOperand1();
 | 
			
		||||
		
 | 
			
		||||
		if(tempOpnd == null
 | 
			
		||||
				|| reorderBufferEntry.getInstruction().getOperationType() == OperationType.inValid
 | 
			
		||||
				|| reorderBufferEntry.getInstruction().getOperationType() == OperationType.nop
 | 
			
		||||
				|| reorderBufferEntry.getInstruction().getOperationType() == OperationType.cpuid
 | 
			
		||||
				|| reorderBufferEntry.getInstruction().getOperationType() == OperationType.mfence
 | 
			
		||||
				|| reorderBufferEntry.getInstruction().getOperationType() == OperationType.sfence
 | 
			
		||||
				|| reorderBufferEntry.getInstruction().getOperationType() == OperationType.lfence
 | 
			
		||||
				|| tempOpnd.getOperandType() == OperandType.immediate)
 | 
			
		||||
		{
 | 
			
		||||
			reorderBufferEntry.setOperand1Available(true);
 | 
			
		||||
| 
						 | 
				
			
			@ -510,7 +461,7 @@ public class RenameLogic extends SimulationElement {
 | 
			
		|||
		
 | 
			
		||||
		OperandType tempOpndType = tempOpnd.getOperandType();
 | 
			
		||||
		if(tempOpndType == OperandType.integerRegister ||
 | 
			
		||||
				tempOpndType == OperandType.floatRegister)
 | 
			
		||||
				tempOpndType == OperandType.vectorRegister)
 | 
			
		||||
		{		
 | 
			
		||||
			if(opndAvailable[0] == true)
 | 
			
		||||
			{
 | 
			
		||||
| 
						 | 
				
			
			@ -527,18 +478,15 @@ public class RenameLogic extends SimulationElement {
 | 
			
		|||
	
 | 
			
		||||
	void checkOperand2Availability()
 | 
			
		||||
	{
 | 
			
		||||
		if(reorderBufferEntry.getInstruction().getOperationType() == OperationType.xchg)
 | 
			
		||||
		{
 | 
			
		||||
			//handled in processDestOperand()
 | 
			
		||||
			reorderBufferEntry.setOperand2Available(true);
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		Operand tempOpnd = reorderBufferEntry.getInstruction().getSourceOperand2();
 | 
			
		||||
		
 | 
			
		||||
		if(tempOpnd == null
 | 
			
		||||
				|| reorderBufferEntry.getInstruction().getOperationType() == OperationType.inValid
 | 
			
		||||
				|| reorderBufferEntry.getInstruction().getOperationType() == OperationType.nop
 | 
			
		||||
				|| reorderBufferEntry.getInstruction().getOperationType() == OperationType.cpuid
 | 
			
		||||
				|| reorderBufferEntry.getInstruction().getOperationType() == OperationType.mfence
 | 
			
		||||
				|| reorderBufferEntry.getInstruction().getOperationType() == OperationType.sfence
 | 
			
		||||
				|| reorderBufferEntry.getInstruction().getOperationType() == OperationType.lfence
 | 
			
		||||
				|| tempOpnd.getOperandType() == OperandType.immediate)
 | 
			
		||||
		{
 | 
			
		||||
			reorderBufferEntry.setOperand2Available(true);
 | 
			
		||||
| 
						 | 
				
			
			@ -551,7 +499,7 @@ public class RenameLogic extends SimulationElement {
 | 
			
		|||
		
 | 
			
		||||
		OperandType tempOpndType = tempOpnd.getOperandType();
 | 
			
		||||
		if(tempOpndType == OperandType.integerRegister ||
 | 
			
		||||
				tempOpndType == OperandType.floatRegister)
 | 
			
		||||
				tempOpndType == OperandType.vectorRegister)
 | 
			
		||||
		{
 | 
			
		||||
			if(opndAvailable[0] == true)
 | 
			
		||||
			{
 | 
			
		||||
| 
						 | 
				
			
			@ -574,7 +522,7 @@ public class RenameLogic extends SimulationElement {
 | 
			
		|||
	public EnergyConfig calculateAndPrintEnergy(FileWriter outputFileWriter, String componentName) throws IOException
 | 
			
		||||
	{
 | 
			
		||||
		EnergyConfig intRenamePower = execEngine.getIntegerRenameTable().calculateAndPrintEnergy(outputFileWriter, (componentName + ".Int"));
 | 
			
		||||
		EnergyConfig floatRenamePower = execEngine.getFloatingPointRenameTable().calculateAndPrintEnergy(outputFileWriter, (componentName + ".Float"));
 | 
			
		||||
		EnergyConfig floatRenamePower = execEngine.getVectorRenameTable().calculateAndPrintEnergy(outputFileWriter, (componentName + ".Float"));
 | 
			
		||||
		
 | 
			
		||||
		EnergyConfig totalPower = new EnergyConfig(0, 0);
 | 
			
		||||
		totalPower.add(totalPower,  intRenamePower);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -110,6 +110,10 @@ public class RenameTable extends SimulationElement{
 | 
			
		|||
		}
 | 
			
		||||
		
 | 
			
		||||
		int newPhyReg = removeFromAvailableList();
 | 
			
		||||
		if(archReg > 63)
 | 
			
		||||
		{
 | 
			
		||||
			System.out.println();
 | 
			
		||||
		}
 | 
			
		||||
		int oldPhyReg = this.archToPhyMapping[threadID][archReg];
 | 
			
		||||
		this.archReg[newPhyReg] = archReg;
 | 
			
		||||
		this.threadID[newPhyReg] = threadID;
 | 
			
		||||
| 
						 | 
				
			
			@ -266,7 +270,7 @@ public class RenameTable extends SimulationElement{
 | 
			
		|||
		else
 | 
			
		||||
		{
 | 
			
		||||
			RATpower = new EnergyConfig(execEngine.getContainingCore().getFpRATPower(), numRATAccesses);
 | 
			
		||||
			freeListPower = new EnergyConfig(execEngine.getContainingCore().getFpFreeListPower(), numFreeListAccesses);
 | 
			
		||||
			freeListPower = new EnergyConfig(execEngine.getContainingCore().getVectorFreeListPower(), numFreeListAccesses);
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		EnergyConfig totalPower = new EnergyConfig(0, 0);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -36,11 +36,17 @@ public class ReorderBuffer extends SimulationElement{
 | 
			
		|||
	int head;
 | 
			
		||||
	int tail;
 | 
			
		||||
	
 | 
			
		||||
	int numCPUIDsInBuffer;
 | 
			
		||||
	int numMFencesInBuffer;
 | 
			
		||||
	int numSFencesInBuffer;
 | 
			
		||||
	int numLFencesInBuffer;
 | 
			
		||||
	
 | 
			
		||||
	int stall1Count;
 | 
			
		||||
	int stall2Count;
 | 
			
		||||
	int stall3Count;
 | 
			
		||||
	int stall4Count;
 | 
			
		||||
	int stall5Count;
 | 
			
		||||
	int stall6Count;
 | 
			
		||||
	long branchCount;
 | 
			
		||||
	long mispredCount;
 | 
			
		||||
	long jumpCount;
 | 
			
		||||
| 
						 | 
				
			
			@ -68,11 +74,17 @@ public class ReorderBuffer extends SimulationElement{
 | 
			
		|||
			ROB[i] = new ReorderBufferEntry(i, execEngine);
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		numCPUIDsInBuffer = 0;
 | 
			
		||||
		numMFencesInBuffer = 0;
 | 
			
		||||
		numSFencesInBuffer = 0;
 | 
			
		||||
		numLFencesInBuffer = 0;
 | 
			
		||||
		
 | 
			
		||||
		stall1Count = 0;
 | 
			
		||||
		stall2Count = 0;
 | 
			
		||||
		stall3Count = 0;
 | 
			
		||||
		stall4Count = 0;
 | 
			
		||||
		stall5Count = 0;
 | 
			
		||||
		stall6Count = 0;
 | 
			
		||||
		mispredCount = 0;
 | 
			
		||||
		branchCount = 0;
 | 
			
		||||
		lastValidIPSeen = -1;
 | 
			
		||||
| 
						 | 
				
			
			@ -167,6 +179,10 @@ public class ReorderBuffer extends SimulationElement{
 | 
			
		|||
		{
 | 
			
		||||
			stall5Count++;
 | 
			
		||||
		}
 | 
			
		||||
		if(execEngine.isToStall6())
 | 
			
		||||
		{
 | 
			
		||||
			stall6Count++;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		if(execEngine.isToStall5() == true /*pipeline stalled due to branch mis-prediction*/)
 | 
			
		||||
		{
 | 
			
		||||
| 
						 | 
				
			
			@ -283,6 +299,26 @@ public class ReorderBuffer extends SimulationElement{
 | 
			
		|||
					execEngine.getCoreMemorySystem().issueLSQCommit(first);
 | 
			
		||||
				}
 | 
			
		||||
				
 | 
			
		||||
				if(firstInstruction.getOperationType() == OperationType.cpuid)
 | 
			
		||||
				{
 | 
			
		||||
					decrementNumCPUIDsInBuffer();
 | 
			
		||||
				}
 | 
			
		||||
				
 | 
			
		||||
				if(firstInstruction.getOperationType() == OperationType.mfence)
 | 
			
		||||
				{
 | 
			
		||||
					decrementNumMFencesInBuffer();
 | 
			
		||||
				}
 | 
			
		||||
				
 | 
			
		||||
				if(firstInstruction.getOperationType() == OperationType.sfence)
 | 
			
		||||
				{
 | 
			
		||||
					decrementNumSFencesInBuffer();
 | 
			
		||||
				}
 | 
			
		||||
				
 | 
			
		||||
				if(firstInstruction.getOperationType() == OperationType.lfence)
 | 
			
		||||
				{
 | 
			
		||||
					decrementNumLFencesInBuffer();
 | 
			
		||||
				}
 | 
			
		||||
				
 | 
			
		||||
				if(EmulatorConfig.storeExecutionTraceInAFile == true)
 | 
			
		||||
				{
 | 
			
		||||
					writeInstructionToFile(firstInstruction);
 | 
			
		||||
| 
						 | 
				
			
			@ -539,6 +575,54 @@ public class ReorderBuffer extends SimulationElement{
 | 
			
		|||
		}
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public int getNumCPUIDsInBuffer() {
 | 
			
		||||
		return numCPUIDsInBuffer;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void incrementNumCPUIDsInBuffer() {
 | 
			
		||||
		this.numCPUIDsInBuffer++;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void decrementNumCPUIDsInBuffer() {
 | 
			
		||||
		this.numCPUIDsInBuffer--;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public int getNumMFencesInBuffer() {
 | 
			
		||||
		return numMFencesInBuffer;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void incrementNumMFencesInBuffer() {
 | 
			
		||||
		this.numMFencesInBuffer++;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void decrementNumMFencesInBuffer() {
 | 
			
		||||
		this.numMFencesInBuffer--;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public int getNumSFencesInBuffer() {
 | 
			
		||||
		return numSFencesInBuffer;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void incrementNumSFencesInBuffer() {
 | 
			
		||||
		this.numSFencesInBuffer++;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void decrementNumSFencesInBuffer() {
 | 
			
		||||
		this.numSFencesInBuffer--;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public int getNumLFencesInBuffer() {
 | 
			
		||||
		return numLFencesInBuffer;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void incrementNumLFencesInBuffer() {
 | 
			
		||||
		this.numLFencesInBuffer++;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void decrementNumLFencesInBuffer() {
 | 
			
		||||
		this.numLFencesInBuffer--;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public int getMaxROBSize()
 | 
			
		||||
	{
 | 
			
		||||
		return MaxROBSize;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -148,17 +148,7 @@ public class WakeUpLogic {
 | 
			
		|||
			
 | 
			
		||||
			if(ROBEntry.getPhysicalDestinationRegister() == physicalRegister &&
 | 
			
		||||
					ROBEntry.getInstruction().getDestinationOperand() != null &&
 | 
			
		||||
					ROBEntry.getInstruction().getDestinationOperand().getOperandType() == opndType
 | 
			
		||||
					||
 | 
			
		||||
					ROBEntry.getInstruction().getOperationType() == OperationType.xchg &&
 | 
			
		||||
					ROBEntry.getInstruction().getSourceOperand1() != null &&
 | 
			
		||||
					ROBEntry.getInstruction().getSourceOperand1().getOperandType() == opndType &&
 | 
			
		||||
					ROBEntry.getOperand1PhyReg1() == physicalRegister
 | 
			
		||||
					||
 | 
			
		||||
					ROBEntry.getInstruction().getOperationType() == OperationType.xchg &&
 | 
			
		||||
					ROBEntry.getInstruction().getSourceOperand2() != null &&
 | 
			
		||||
					ROBEntry.getInstruction().getSourceOperand2().getOperandType() == opndType &&
 | 
			
		||||
					ROBEntry.getOperand2PhyReg1() == physicalRegister)
 | 
			
		||||
					ROBEntry.getInstruction().getDestinationOperand().getOperandType() == opndType)
 | 
			
		||||
			{
 | 
			
		||||
				//this particular instruction also writes to the same register as the one that initiated
 | 
			
		||||
				//the wake-up. all subsequent consumers of this register should not be woken up.
 | 
			
		||||
| 
						 | 
				
			
			@ -183,9 +173,9 @@ public class WakeUpLogic {
 | 
			
		|||
		{
 | 
			
		||||
			execEngine.getIntegerRenameTable().setValueValid(true, physicalRegister);
 | 
			
		||||
		}
 | 
			
		||||
		else if(opndType == OperandType.floatRegister)
 | 
			
		||||
		else if(opndType == OperandType.vectorRegister)
 | 
			
		||||
		{
 | 
			
		||||
			execEngine.getFloatingPointRenameTable().setValueValid(true, physicalRegister);
 | 
			
		||||
			execEngine.getVectorRenameTable().setValueValid(true, physicalRegister);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -75,18 +75,6 @@ public class WriteBackLogic extends SimulationElement {
 | 
			
		|||
					writeToRFAndAddToAvailableList(buffer[i].getInstruction().getDestinationOperand(),
 | 
			
		||||
													buffer[i].getPhysicalDestinationRegister());
 | 
			
		||||
				}
 | 
			
		||||
				else if(buffer[i].getInstruction().getOperationType() == OperationType.xchg)
 | 
			
		||||
				{
 | 
			
		||||
					writeToRFAndAddToAvailableList(buffer[i].getInstruction().getSourceOperand1(),
 | 
			
		||||
													buffer[i].getOperand1PhyReg1());
 | 
			
		||||
					
 | 
			
		||||
					if(buffer[i].getInstruction().getSourceOperand1().getOperandType() != buffer[i].getInstruction().getSourceOperand2().getOperandType() ||
 | 
			
		||||
							buffer[i].getOperand1PhyReg1() != buffer[i].getOperand2PhyReg1())
 | 
			
		||||
					{
 | 
			
		||||
						writeToRFAndAddToAvailableList(buffer[i].getInstruction().getSourceOperand2(),
 | 
			
		||||
													buffer[i].getOperand2PhyReg1());
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				if(SimulationConfig.debugMode)
 | 
			
		||||
				{
 | 
			
		||||
| 
						 | 
				
			
			@ -119,13 +107,13 @@ public class WriteBackLogic extends SimulationElement {
 | 
			
		|||
			}
 | 
			
		||||
			else if(destOpnd.isFloatRegisterOperand())
 | 
			
		||||
			{
 | 
			
		||||
				tempRN = execEngine.getFloatingPointRenameTable();
 | 
			
		||||
				tempRN = execEngine.getVectorRenameTable();
 | 
			
		||||
				if(tempRN.getMappingValid(physicalRegister) == false)
 | 
			
		||||
				{
 | 
			
		||||
					tempRN.addToAvailableList(physicalRegister);
 | 
			
		||||
				}
 | 
			
		||||
				tempRN.setValueValid(true, physicalRegister);
 | 
			
		||||
				execEngine.getFloatingPointRegisterFile().setValueValid(true, physicalRegister);
 | 
			
		||||
				execEngine.getVectorRegisterFile().setValueValid(true, physicalRegister);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue