Facebook Badge

Monday, February 27, 2012

Simulate Pentium's Branch Prediction Logic


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