Example #1
0
 public BinOpInt(BINOP.Op op, Temp.Temp dst, Temp.Temp left, int right)
 {
     Op = op;
     Dst = dst;
     Left = left;
     Right = right;
 }
Example #2
0
            void PrintExp(BINOP e, int d)
            {
                Indent(d); Say("BINOP(");
                switch (e.Binop)
                {
                case BINOP.Op.Plus: Say("PLUS"); break;

                case BINOP.Op.Minus: Say("MINUS"); break;

                case BINOP.Op.Times: Say("MUL"); break;

                case BINOP.Op.Divide: Say("DIV"); break;

                case BINOP.Op.And: Say("AND"); break;

                case BINOP.Op.Or: Say("OR"); break;

                case BINOP.Op.LShift: Say("LSHIFT"); break;

                case BINOP.Op.RShift: Say("RSHIFT"); break;

                case BINOP.Op.ArShift: Say("ARSHIFT"); break;

                case BINOP.Op.Xor: Say("XOR"); break;

                default:
                    throw new FatalError("Print.PrintExp.BINOP");
                }
                SayLn(",");
                PrintExp(e.Left, d + 1); SayLn(","); PrintExp(e.Right, d + 1); Say(")");
            }
Example #3
0
            public Exp TranslateSubscriptVar(Exp var, Exp index)
            {
                Expr array_addr = var.UnEx();
                Expr array_offset;

                if (index.UnEx() is CONST)
                {
                    array_offset = new CONST(((CONST)index.UnEx()).Value * Frame.WordSize());
                }
                else
                {
                    array_offset = new BINOP(BINOP.Op.Times, index.UnEx(), new CONST(Frame.WordSize()));
                }
                return(new Ex(new MEM(new BINOP(BINOP.Op.Plus, array_addr, array_offset))));
            }
Example #4
0
            public Exp TranslateRecordExp(Level home, List <Exp> field)
            {
                Temp.Temp addr  = new Temp.Temp();
                Expr      alloc = home.Frame.ExternalCall("_record",
                                                          new Tree.ExpList(new CONST(
                                                                               (field.Count == 0 ? 1 : field.Count) * home.Frame.WordSize()), null));
                Stm init = new EXP(new CONST(0));

                for (int i = field.Count - 1; i >= 0; --i)
                {
                    Expr offset = new BINOP(BINOP.Op.Plus, new TEMP(addr), new CONST(i * home.Frame.WordSize()));
                    Expr v      = field[i].UnEx();
                    init = new SEQ(new MOVE(new MEM(offset), v), init);
                }
                return(new Ex(new ESEQ(new SEQ(new MOVE(new TEMP(addr), alloc), init), new TEMP(addr))));
            }
Example #5
0
            Temp.Temp TranslateExpr(BINOP expr)
            {
                Temp.Temp result = new Temp.Temp();
                if (expr.Right is CONST)
                {
                    InstrList.Add(new BinOpInt(expr.Binop, result, TranslateExpr(expr.Left), (expr.Right as CONST).Value));
                }
                else if (expr.Left is CONST)
                {
                    switch (expr.Binop)
                    {
                    case BINOP.Op.Plus:
                    case BINOP.Op.Times:
                        InstrList.Add(new BinOpInt(expr.Binop, result, TranslateExpr(expr.Right), (expr.Left as CONST).Value));
                        break;

                    case BINOP.Op.Minus:
                        InstrList.Add(new BinOpInt(expr.Binop, result, TranslateExpr(expr.Right), (expr.Left as CONST).Value));
                        InstrList.Add(new BinOp(expr.Binop, result, MipsFrame.Reg[0], result));
                        break;

                    case BINOP.Op.Divide:
                        InstrList.Add(new BinOp(expr.Binop, result, TranslateExpr(expr.Right), TranslateExpr(expr.Left)));
                        break;

                    default:
                        throw new FatalError("Error in Quadruple: TranslateExpr(BINOP)");
                        break;
                    }
                }
                else
                {
                    InstrList.Add(new BinOp(expr.Binop, result, TranslateExpr(expr.Left), TranslateExpr(expr.Right)));
                }
                return(result);
            }
Example #6
0
 public BINOP(BINOP.Op b, Expr l, Expr r)
 {
     Binop = b;
     Left = l;
     Right = r;
 }
Example #7
0
 void PrintExp(BINOP e, int d)
 {
     Indent(d); Say("BINOP(");
     switch (e.Binop)
     {
         case BINOP.Op.Plus: Say("PLUS"); break;
         case BINOP.Op.Minus: Say("MINUS"); break;
         case BINOP.Op.Times: Say("MUL"); break;
         case BINOP.Op.Divide: Say("DIV"); break;
         case BINOP.Op.And: Say("AND"); break;
         case BINOP.Op.Or: Say("OR"); break;
         case BINOP.Op.LShift: Say("LSHIFT"); break;
         case BINOP.Op.RShift: Say("RSHIFT"); break;
         case BINOP.Op.ArShift: Say("ARSHIFT"); break;
         case BINOP.Op.Xor: Say("XOR"); break;
         default:
             throw new FatalError("Print.PrintExp.BINOP");
     }
     SayLn(",");
     PrintExp(e.Left, d + 1); SayLn(","); PrintExp(e.Right, d + 1); Say(")");
 }
Example #8
0
 Temp.Temp TranslateExpr(BINOP expr)
 {
     Temp.Temp result = new Temp.Temp();
     if (expr.Right is CONST)
         InstrList.Add(new BinOpInt(expr.Binop, result, TranslateExpr(expr.Left), (expr.Right as CONST).Value));
     else if (expr.Left is CONST)
     {
         switch (expr.Binop)
         {
             case BINOP.Op.Plus:
             case BINOP.Op.Times:
                 InstrList.Add(new BinOpInt(expr.Binop, result, TranslateExpr(expr.Right), (expr.Left as CONST).Value));
                 break;
             case BINOP.Op.Minus:
                 InstrList.Add(new BinOpInt(expr.Binop, result, TranslateExpr(expr.Right), (expr.Left as CONST).Value));
                 InstrList.Add(new BinOp(expr.Binop, result, MipsFrame.Reg[0], result));
                 break;
             case BINOP.Op.Divide:
                 InstrList.Add(new BinOp(expr.Binop, result, TranslateExpr(expr.Right), TranslateExpr(expr.Left)));
                 break;
             default:
                 throw new FatalError("Error in Quadruple: TranslateExpr(BINOP)");
                 break;
         }
     }
     else
         InstrList.Add(new BinOp(expr.Binop, result, TranslateExpr(expr.Left), TranslateExpr(expr.Right)));
     return result;
 }
Example #9
0
 public Exp TranslateRecordExp(Level home, List<Exp> field)
 {
     Temp.Temp addr = new Temp.Temp();
     Expr alloc = home.Frame.ExternalCall("_record",
         new Tree.ExpList(new CONST(
             (field.Count == 0 ? 1 : field.Count) * home.Frame.WordSize()), null));
     Stm init = new EXP(new CONST(0));
     for (int i = field.Count - 1; i >= 0; --i)
     {
         Expr offset = new BINOP(BINOP.Op.Plus, new TEMP(addr), new CONST(i * home.Frame.WordSize()));
         Expr v = field[i].UnEx();
         init = new SEQ(new MOVE(new MEM(offset), v), init);
     }
     return new Ex(new ESEQ(new SEQ(new MOVE(new TEMP(addr), alloc), init), new TEMP(addr)));
 }
Example #10
0
 public Exp TranslateCalculateExp(BINOP.Op op, Exp left, Exp right)
 {
     return new Ex(new BINOP(op, left.UnEx(), right.UnEx()));
 }
Example #11
0
 public Exp TranslateSubscriptVar(Exp var, Exp index)
 {
     Expr array_addr = var.UnEx();
     Expr array_offset;
     if (index.UnEx() is CONST)
         array_offset = new CONST(((CONST)index.UnEx()).Value * Frame.WordSize());
     else
         array_offset = new BINOP(BINOP.Op.Times, index.UnEx(), new CONST(Frame.WordSize()));
     return new Ex(new MEM(new BINOP(BINOP.Op.Plus, array_addr, array_offset)));
 }