import java.util.*;
import java.io.*;
/**********************************
* @author Rohit E Iyer 09-221
* @date 25/02/2012
*
* AMP Practical No.3
* TITLE: Branch Prediction Logic
*----------------------------------
* Instructions
* like JC JA JB may branch or not
* This logic predicts branching on
* the basis of history
*
*-----------------------------------
* BranchPredictionLogic.java
* *******************************/
class Instruction
{
String inst;
int history;
Instruction()
{
history=0; // Assume Strongly Taken
}
}
class BranchPredictionLogic
{
public static void main(String args[]) throws Exception
{
int d,ch;
String his="Strongly Taken";
Instruction i1;
String HistoryArray[]={"Strongly Taken","Weakly Taken","Weakly Not Taken","Strongly Not Taken"};
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
System.out.println("Active Prefetch Queue A");
i1=new Instruction();
System.out.println("Enter instructions:");
while(true)
{
i1.inst=br.readLine();
if(isBranchInst(i1.inst)==true)
break;
}
System.out.println(i1.inst+" is a Branch Instruction");
System.out.println("\n\n***DECODE1 STAGE***");
System.out.println("*****Branch Target Buffer*****");
System.out.println("Source:----\nTarget:-----\nHistory: Strongly Taken");
do{
System.out.println("\n\n\n*****EXECUTE STAGE*****");
System.out.println("Does branch take place?? Enter 1 or 0 : ");
d=Integer.parseInt(br.readLine());
updateLogic(i1,d);
System.out.println("***New Branch Target Buffer***");
his=HistoryArray[i1.history];
System.out.println("Source:----\nTarget:----\nHistory: "+his);
System.out.println("Do you want to continue:(1/0): ");
ch=Integer.parseInt(br.readLine());
}while(ch!=0);
}
public static boolean isBranchInst(String x)
{
String jumpInstructions[]={"JC","JMP"};
for(int i=0;i<jumpInstructions.length;i++)
if(x.equals(jumpInstructions[i])==true)
return true;
return false;
}
public static void updateLogic(Instruction i,int n)
{
int history[]={0,1,2,3};
int historyAfterTaken[]={0,0,1,2};
int historyNotTaken[]={1,2,3,3};
if(n==1)
{
System.out.println("\nContents of B queue are valid!!!!!");
i.history=historyAfterTaken[i.history];
}
else if(n==0)
{
System.out.println("Contents of B queue not valid\nActive PrefetchQueue is A");
i.history=historyNotTaken[i.history];
}
}
}

No comments:
Post a Comment