void print(BinOpInt exp) { Out.Write("BinOp "); switch (exp.Op) { case BINOP.Op.Plus: Out.Write('+'); break; case BINOP.Op.Minus: Out.Write('-'); break; case BINOP.Op.Times: Out.Write('*'); break; case BINOP.Op.Divide: Out.Write('/'); break; default: Out.Write(exp.Op); break; } Out.WriteLine(' ' + exp.Dst.ToString() + ' ' + exp.Left + ' ' + exp.Right); }
void Write(BinOpInt exp) { Out.Write('\t'); switch (exp.Op) { case BINOP.Op.Plus: Out.Write("add"); Out.WriteLine(' ' + GetColor(exp.Dst) + ", " + GetColor(exp.Left) + ", " + exp.Right); break; case BINOP.Op.Minus: Out.Write("sub"); Out.WriteLine(' ' + GetColor(exp.Dst) + ", " + GetColor(exp.Left) + ", " + exp.Right); break; case BINOP.Op.Times: if ((exp.Right & (exp.Right - 1)) == 0) { Out.Write("sll"); Out.WriteLine(' ' + GetColor(exp.Dst) + ", " + GetColor(exp.Left) + ", " + Log2(exp.Right)); } else { Out.Write("mul"); Out.WriteLine(' ' + GetColor(exp.Dst) + ", " + GetColor(exp.Left) + ", " + exp.Right); } break; case BINOP.Op.Divide: if ((exp.Right & (exp.Right - 1)) == 0) { Out.Write("sra"); Out.WriteLine(' ' + GetColor(exp.Dst) + ", " + GetColor(exp.Left) + ", " + Log2(exp.Right)); } else { Out.Write("div"); Out.WriteLine(' ' + GetColor(exp.Dst) + ", " + GetColor(exp.Left) + ", " + exp.Right); } break; default: throw new FatalError("Error at BinOpI_R in Codegen"); } }