Пример #1
0
        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);
        }
Пример #2
0
        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);
        }