示例#1
0
 void Trace(Tree.StmList l)
 {
     for (; ;)
     {
         Tree.LABEL lab = (Tree.LABEL)l.Head;
         Table.Remove(lab.Label);
         Tree.StmList last = GetLast(l);
         Tree.Stm     s    = last.Tail.Head;
         if (s is Tree.JUMP)
         {
             Tree.JUMP    j      = (Tree.JUMP)s;
             Tree.StmList target = (Tree.StmList)Table[j.Targets.Head];
             if (j.Targets.Tail == null && target != null)
             {
                 last.Tail = target;
                 l         = target;
             }
             else
             {
                 last.Tail.Tail = GetNext();
                 return;
             }
         }
         else if (s is Tree.CJUMP)
         {
             Tree.CJUMP   j = (Tree.CJUMP)s;
             Tree.StmList t = (Tree.StmList)Table[j.IfTrue];
             Tree.StmList f = (Tree.StmList)Table[j.IfFalse];
             if (f != null)
             {
                 last.Tail.Tail = f;
                 l = f;
             }
             else if (t != null)
             {
                 last.Tail.Head = new Tree.CJUMP(Tree.CJUMP.NotRel(j.Relop),
                                                 j.Left, j.Right,
                                                 j.IfFalse, j.IfTrue);
                 last.Tail.Tail = t;
                 l = t;
             }
             else
             {
                 Temp.Label ff = new Temp.Label();
                 last.Tail.Head = new Tree.CJUMP(j.Relop, j.Left, j.Right,
                                                 j.IfTrue, ff);
                 last.Tail.Tail = new Tree.StmList(new Tree.LABEL(ff),
                                                   new Tree.StmList(new Tree.JUMP(j.IfFalse),
                                                                    GetNext()));
                 return;
             }
         }
         else
         {
             throw new FatalError("Bad basic block in TraceSchedule");
         }
     }
 }
示例#2
0
 static Tree.StmList Linear(Tree.Stm s, Tree.StmList l)
 {
     if (s is Tree.SEQ)
     {
         return(Linear((Tree.SEQ)s, l));
     }
     else
     {
         return(new Tree.StmList(s, l));
     }
 }
示例#3
0
 static Tree.Stm Seq(Tree.Stm a, Tree.Stm b)
 {
     if (IsNop(a))
     {
         return(b);
     }
     else if (IsNop(b))
     {
         return(a);
     }
     else
     {
         return(new Tree.SEQ(a, b));
     }
 }
示例#4
0
 static Tree.Stm DoStm(Tree.Stm s)
 {
     if (s is Tree.SEQ)
     {
         return(DoStm((Tree.SEQ)s));
     }
     else if (s is Tree.MOVE)
     {
         return(DoStm((Tree.MOVE)s));
     }
     else if (s is Tree.EXP)
     {
         return(DoStm((Tree.EXP)s));
     }
     else
     {
         return(ReorderStm(s));
     }
 }
示例#5
0
 static public Tree.StmList Linearize(Tree.Stm s)
 {
     return(Linear(DoStm(s), null));
 }
示例#6
0
 private void AddStm(Tree.Stm s)
 {
     LastStm = LastStm.Tail = new Tree.StmList(s, null);
 }
示例#7
0
 static Tree.ESEQ DoExp(Tree.ESEQ e)
 {
     Tree.Stm  stms = DoStm(e.Stm);
     Tree.ESEQ b    = DoExp(e.Exp);
     return(new Tree.ESEQ(Seq(stms, b.Stm), b.Exp));
 }
示例#8
0
            static Tree.Stm ReorderStm(Tree.Stm s)
            {
                StmExpList x = Reorder(s.Kids());

                return(Seq(x.Stm, s.Build(x.Exps)));
            }
示例#9
0
 static bool Commute(Tree.Stm a, Tree.Expr b)
 {
     return(IsNop(a) ||
            b is Tree.NAME ||
            b is Tree.CONST);
 }
示例#10
0
 static bool IsNop(Tree.Stm a)
 {
     return(a is Tree.EXP &&
            ((Tree.EXP)a).Exp is Tree.CONST);
 }
示例#11
0
 public StmExpList(Tree.Stm s, Tree.ExpList e)
 {
     Stm = s; Exps = e;
 }
示例#12
0
文件: Canon.cs 项目: Nxun/Naive-Tiger
 public StmExpList(Tree.Stm s, Tree.ExpList e)
 {
     Stm = s; Exps = e;
 }