예제 #1
0
       	public void SpillToStack(Temp n, ARGU argu,int vRegister)
	    {//如果转换之前HLOAD的第一个寄存器是注定要溢出的,那么用v0或v1先存放HLOAD进来的值,然后把该值溢出到栈里
	     Proc currProc = (Proc)argu;
		 String t1 = currProc.GetReg(Integer.parseInt(n.f1.f0.tokenImage));
		 if(t1.equals("OverFlow"))
		 {
		   if( !currProc.StackRecorder.contains(Integer.parseInt(n.f1.f0.tokenImage)))
		   {
		    OutPut.con(" ASTORE " + " SPILLEDARG " + currProc.StackRecorder.size()+ " " + RegPlan.RegList[vRegister+4] + "\n");
		    currProc.StackRecorder.add(Integer.parseInt(n.f1.f0.tokenImage));
		   }
		   else  
			OutPut.con(" ASTORE " + " SPILLEDARG " + currProc.StackRecorder.indexOf(Integer.parseInt(n.f1.f0.tokenImage))+ " " + RegPlan.RegList[vRegister+4] + "\n");
		 }
		 return ;
	    }
예제 #2
0
		public String ReadTemp(Temp n,ARGU argu, int vRegister)
	   {
         Proc currProc = (Proc)argu;
		 String t1 = currProc.GetReg(Integer.parseInt(n.f1.f0.tokenImage));
		 if(t1.equals("OverFlow"))
		 {
		  	OutPut.con(" ALOAD " + RegPlan.RegList[vRegister+4] + " SPILLEDARG " +currProc.StackRecorder.indexOf(Integer.parseInt(n.f1.f0.tokenImage))+ "\n");
			return RegPlan.RegList[vRegister+4];
		 }
		 else//如果当前temp 要占用寄存器的话
            return t1;
	   }
예제 #3
0
	public void FuncBegin(String funcName,ARGU argu,int ParaNum, int MaxStack, int MaxPara)
	{//函数开始,保存所有的寄存器
		Proc currProc = (Proc)argu;
		Vector<String> Registers= currProc.TakenRegs();
		OutPut.con(funcName + " [ " + ParaNum + " ] [ " + MaxStack + " ] [ " +MaxPara+ " ]\n");
		for(int i=4;i<ParaNum;i++)
	      currProc.StackRecorder.add(i);//放父函数传进来的参数
		if(ParaNum-4>0)//如果参数数目大于4,因为大于4的参数都要放到栈里面,所以存放寄存器的栈要接着存放参数的栈单元即为f1-3的位置往下增长,这里f1代表参数数目
		{
		 int i,j;
		 for(i=ParaNum-4,j=0;i<ParaNum-4+Registers.size();i++,j++)
		 {
		   OutPut.con(" ASTORE " + " SPILLEDARG " + i + " " + Registers.get(j) + "\n");
		   currProc.StackRecorder.add(-1);
		 }//存放所有使用的寄存器但除了a0-a3,因为不是temp溢出,所以不用存放temp号,这里用-1代替temp号
		 for(j=0;j<currProc.ParaStack.size();j++,i++)
		 {
		   OutPut.con(" ASTORE " + " SPILLEDARG " + i + " " + currProc.ParaStack.get(j) + "\n");
		   currProc.StackRecorder.add(-1);
		 }//存放a0->a3,因为不是temp溢出,所以不用存放temp号,这里用-1代替temp号
		}
		else
		{
			int i,j; 
		   for(i=0,j=0;i<Registers.size();i++,j++)
		  {
		    OutPut.con(" ASTORE " + " SPILLEDARG " + i + " " + Registers.get(j) + "\n");	
		    currProc.StackRecorder.add(-1);
		  }//如果参数数目小于等于4,因为参数都不放到栈里面,所以存放寄存器的栈从0开始增长即可
		  for(j=0;j<currProc.ParaStack.size();j++,i++)
		  {
			OutPut.con(" ASTORE " + " SPILLEDARG " + i + " " + currProc.ParaStack.get(j) + "\n");
		    currProc.StackRecorder.add(-1);
		  }//存放a0->a3,因为不是temp溢出,所以不用存放temp号,这里用-1代替temp号
		}
	}