// $Id: MulArithOpExpr.java,v 1.1.1.1 1999/12/05 22:19:52 mpp Exp $

package IR2;

public class MulArithOpExpr extends ArithOpExpr {
  public MulArithOpExpr(RValue a1, RValue a2)
	throws SemanticTypeException { super(a1, a2); }

  public String node_name() { return "mul_arith_op_expr"; }

  public String desc() { return super.desc("*"); }

  protected int op_num() { return DelocalizedBinaryOpInstruction.MUL; }

  /* Algebraic simplification optimization. */
  public RValue algebraic_simplify() {
    arg1 = arg1.algebraic_simplify();
    arg2 = arg2.algebraic_simplify();
    /* 1 * i == i */
    if (arg1 instanceof IntImmedExpr && ((IntImmedExpr)arg1).get_value() == 1)
      return arg2;
    /* i * 1 == i */
    if (arg2 instanceof IntImmedExpr && ((IntImmedExpr)arg2).get_value() == 1)
      return arg1;
    /* 0 * i == 0 */
    if (arg1 instanceof IntImmedExpr && ((IntImmedExpr)arg1).get_value() == 0)
      return arg1;
    /* i * 0 == 0 */
    if (arg2 instanceof IntImmedExpr && ((IntImmedExpr)arg2).get_value() == 0)
      return arg2;
    /* i * 4 == i << 2 */
    if (arg2 instanceof IntImmedExpr && ((IntImmedExpr)arg2).get_value() == 4){
      try {
        return new ShlArithOpExpr(arg1, new IntImmedExpr(2));
      } catch (SemanticTypeException e) {
        /* can't happen */
      }
    }
    return this;
  }
}
