public BinOpInt(BINOP.Op op, Temp.Temp dst, Temp.Temp left, int right) { Op = op; Dst = dst; Left = left; Right = right; }
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(")"); }
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)))); }
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)))); }
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); }
public BINOP(BINOP.Op b, Expr l, Expr r) { Binop = b; Left = l; Right = r; }
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; }
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))); }
public Exp TranslateCalculateExp(BINOP.Op op, Exp left, Exp right) { return new Ex(new BINOP(op, left.UnEx(), right.UnEx())); }
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))); }