private void TranslateStm(CJUMP stm) { if (stm.Left is CONST) { Temp.Temp r = TranslateExpr(stm.Right); if (stm.Relop == CJUMP.Rel.Equal || stm.Relop == CJUMP.Rel.NotEqual) { InstrList.Add(new CJumpInt(stm.Relop, r, (stm.Left as CONST).Value, new Label(stm.IfTrue))); } else { InstrList.Add(new CJumpInt(CJUMP.NotRel(stm.Relop), r, (stm.Left as CONST).Value, new Label(stm.IfTrue))); } } else if (stm.Right is CONST) { Temp.Temp l = TranslateExpr(stm.Left); InstrList.Add(new CJumpInt(stm.Relop, l, (stm.Right as CONST).Value, new Label(stm.IfTrue))); } else { Temp.Temp l = TranslateExpr(stm.Left); Temp.Temp r = TranslateExpr(stm.Right); InstrList.Add(new CJump(stm.Relop, l, r, new Label(stm.IfTrue))); } }
void PrintStm(CJUMP s, int d) { Indent(d); Say("CJUMP("); switch (s.Relop) { case CJUMP.Rel.Equal: Say("EQ"); break; case CJUMP.Rel.NotEqual: Say("NE"); break; case CJUMP.Rel.LessThan: Say("LT"); break; case CJUMP.Rel.GreaterThan: Say("GT"); break; case CJUMP.Rel.LessEqual: Say("LE"); break; case CJUMP.Rel.GreaterEqual: Say("GE"); break; case CJUMP.Rel.UnsignedLT: Say("ULT"); break; case CJUMP.Rel.UnsignedLE: Say("ULE"); break; case CJUMP.Rel.UnsignedGT: Say("UGT"); break; case CJUMP.Rel.UnsignedGE: Say("UGE"); break; default: throw new FatalError("Print.PrintStm.CJUMP"); } SayLn(","); PrintExp(s.Left, d + 1); SayLn(","); PrintExp(s.Right, d + 1); SayLn(","); Indent(d + 1); Say(s.IfTrue.ToString()); Say(","); Say(s.IfFalse.ToString()); Say(")"); }
private void TranslateStm(CJUMP stm) { if (stm.Left is CONST) { Temp.Temp r = TranslateExpr(stm.Right); if (stm.Relop == CJUMP.Rel.Equal || stm.Relop == CJUMP.Rel.NotEqual) InstrList.Add(new CJumpInt(stm.Relop, r, (stm.Left as CONST).Value, new Label(stm.IfTrue))); else InstrList.Add(new CJumpInt(CJUMP.NotRel(stm.Relop), r, (stm.Left as CONST).Value, new Label(stm.IfTrue))); } else if (stm.Right is CONST) { Temp.Temp l = TranslateExpr(stm.Left); InstrList.Add(new CJumpInt(stm.Relop, l, (stm.Right as CONST).Value, new Label(stm.IfTrue))); } else { Temp.Temp l = TranslateExpr(stm.Left); Temp.Temp r = TranslateExpr(stm.Right); InstrList.Add(new CJump(stm.Relop, l, r, new Label(stm.IfTrue))); } }
public RelCx(CJUMP.Rel rel, Exp left, Exp right) { Relop = rel; Left = left; Right = right; }
public CJumpInt(CJUMP.Rel rel, Temp.Temp left, int right, Label label) { Relop = rel; Left = left; Right = right; Label = label; }
public Exp TranslateRelExp(CJUMP.Rel op, Exp left, Exp right) { return new RelCx(op, left, right); }
public Exp TranslateStringRelExp(CJUMP.Rel op, Exp left, Exp right) { Expr comp = Frame.ExternalCall("_strcmp", new Tree.ExpList(left.UnEx(), new Tree.ExpList(right.UnEx(), null))); return new RelCx(op, new Ex(comp), new Ex(new CONST(0))); }