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