示例#1
0
 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)));
     }
 }
示例#2
0
            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(")");
            }
示例#3
0
 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)));
     }
 }
示例#4
0
 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(")");
 }
示例#5
0
 public RelCx(CJUMP.Rel rel, Exp left, Exp right)
 {
     Relop = rel;
     Left = left;
     Right = right;
 }
示例#6
0
 public CJumpInt(CJUMP.Rel rel, Temp.Temp left, int right, Label label)
 {
     Relop = rel;
     Left = left;
     Right = right;
     Label = label;
 }
示例#7
0
 public Exp TranslateRelExp(CJUMP.Rel op, Exp left, Exp right)
 {
     return new RelCx(op, left, right);
 }
示例#8
0
 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)));
 }