private void EmitProcess(Translate.ProcFrag f) { // //Temp.TempMap map = new Temp.CombineMap(f.Frame, new Temp.DefaultMap()); //Tree.Print pt = new Tree.Print(_writer, map); //pt.PrintStm(f.Body); // Tree.StmList stms = Canon.Canon.Linearize(f.Body); Canon.BasicBlocks b = new Canon.BasicBlocks(stms); Tree.StmList traced = (new Canon.TraceSchedule(b)).Stms; Quadruple.Quadruple threeAddr = new Quadruple.Quadruple(f.Frame as Mips.MipsFrame); threeAddr.CodeGenerate(traced); threeAddr.InstrList = (f.Frame as Mips.MipsFrame).ProcessEntryExit2(threeAddr.InstrList); Block.BuildBlocks buildBlocks = new Block.BuildBlocks(threeAddr.InstrList); // //Quadruple.Print print = new Quadruple.Print(_writer); //print.print(buildBlocks.Blocks); // RegisterAllocate.RegisterAllocate reg = new RegisterAllocate.RegisterAllocate((f.Frame as Mips.MipsFrame), buildBlocks.Blocks, f.Frame.Registers()); reg.Allocate(); List <Quadruple.TExp> instrList = new List <Quadruple.TExp>(); foreach (Block.BasicBlock blk in reg.Blocks) { instrList.AddRange(blk.List); } instrList = (f.Frame as Mips.MipsFrame).ProcessEntryExit3(instrList); CodeGenerate.CodeGen gen = new CodeGenerate.CodeGen(instrList, reg.TempToNode, (f.Frame as Mips.MipsFrame)); gen.CodeGenerate(_writer); }
private void EmitProcess(Translate.ProcFrag f) { // //Temp.TempMap map = new Temp.CombineMap(f.Frame, new Temp.DefaultMap()); //Tree.Print pt = new Tree.Print(_writer, map); //pt.PrintStm(f.Body); // Tree.StmList stms = Canon.Canon.Linearize(f.Body); Canon.BasicBlocks b = new Canon.BasicBlocks(stms); Tree.StmList traced = (new Canon.TraceSchedule(b)).Stms; Quadruple.Quadruple threeAddr = new Quadruple.Quadruple(f.Frame as Mips.MipsFrame); threeAddr.CodeGenerate(traced); threeAddr.InstrList = (f.Frame as Mips.MipsFrame).ProcessEntryExit2(threeAddr.InstrList); Block.BuildBlocks buildBlocks = new Block.BuildBlocks(threeAddr.InstrList); // //Quadruple.Print print = new Quadruple.Print(_writer); //print.print(buildBlocks.Blocks); // RegisterAllocate.RegisterAllocate reg = new RegisterAllocate.RegisterAllocate((f.Frame as Mips.MipsFrame), buildBlocks.Blocks, f.Frame.Registers()); reg.Allocate(); List<Quadruple.TExp> instrList = new List<Quadruple.TExp>(); foreach (Block.BasicBlock blk in reg.Blocks) { instrList.AddRange(blk.List); } instrList = (f.Frame as Mips.MipsFrame).ProcessEntryExit3(instrList); CodeGenerate.CodeGen gen = new CodeGenerate.CodeGen(instrList, reg.TempToNode, (f.Frame as Mips.MipsFrame)); gen.CodeGenerate(_writer); }