Exemplo n.º 1
0
 static Tree.ESEQ DoExp(Tree.Expr e)
 {
     if (e is Tree.ESEQ)
     {
         return(DoExp((Tree.ESEQ)e));
     }
     else
     {
         return(ReorderExp(e));
     }
 }
Exemplo n.º 2
0
 public static StmExpList Reorder(Tree.ExpList exps)
 {
     if (exps == null)
     {
         return(NopNull);
     }
     else
     {
         Tree.Expr a = exps.Head;
         if (a is Tree.CALL)
         {
             Temp.Temp t = new Temp.Temp();
             Tree.Expr e = new Tree.ESEQ(new Tree.MOVE(new Tree.TEMP(t), a),
                                         new Tree.TEMP(t));
             return(Reorder(new Tree.ExpList(e, exps.Tail)));
         }
         else
         {
             Tree.ESEQ  aa = DoExp(a);
             StmExpList bb = Reorder(exps.Tail);
             if (Commute(bb.Stm, aa.Exp))
             {
                 return(new StmExpList(Seq(aa.Stm, bb.Stm),
                                       new Tree.ExpList(aa.Exp, bb.Exps)));
             }
             else
             {
                 Temp.Temp t = new Temp.Temp();
                 return(new StmExpList(
                            Seq(aa.Stm,
                                Seq(new Tree.MOVE(new Tree.TEMP(t), aa.Exp),
                                    bb.Stm)),
                            new Tree.ExpList(new Tree.TEMP(t), bb.Exps)));
             }
         }
     }
 }
Exemplo n.º 3
0
            public static Tree.ESEQ ReorderExp(Tree.Expr e)
            {
                StmExpList x = Reorder(e.Kids());

                return(new Tree.ESEQ(x.Stm, e.Build(x.Exps)));
            }
Exemplo n.º 4
0
 static bool Commute(Tree.Stm a, Tree.Expr b)
 {
     return(IsNop(a) ||
            b is Tree.NAME ||
            b is Tree.CONST);
 }