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 ; }
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; }
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号 } }