protected IRExpression compile_impl() {
    IType type = _expr().getType();

    // Push LHS (parser guarantees type is int or long)
    IRExpression lhs = ExpressionTransformer.compile(_expr().getLHS(), _cc());

    // Push RHS (parser guarantees type is int)
    IRExpression rhs = ExpressionTransformer.compile(_expr().getRHS(), _cc());

    // Do the bitshift
    IRArithmeticExpression.Operation op;
    if (_expr().getOperator().equals("<<") || _expr().getOperator().equals("<<=")) {
      op = IRArithmeticExpression.Operation.ShiftLeft;
    } else if (_expr().getOperator().equals(">>") || _expr().getOperator().equals(">>=")) {
      op = IRArithmeticExpression.Operation.ShiftRight;
    } else if (_expr().getOperator().equals(">>>") || _expr().getOperator().equals(">>>=")) {
      op = IRArithmeticExpression.Operation.UnsignedShiftRight;
    } else {
      throw new IllegalStateException(
          "Unrecognized BitshiftExpression operator " + _expr().getOperator());
    }

    if (isIntType(type) || type == JavaTypes.pLONG()) {
      return new IRArithmeticExpression(getDescriptor(type), lhs, rhs, op);
    } else {
      throw new IllegalStateException("Expression type not handled: " + type.getName());
    }
  }
  protected IRExpression compile_impl() {
    IRExpression lhs =
        IRArgConverter.castOrConvertIfNecessary(
            IRTypeConstants.pBOOLEAN(), ExpressionTransformer.compile(_expr().getLHS(), _cc()));
    IRExpression rhs =
        IRArgConverter.castOrConvertIfNecessary(
            IRTypeConstants.pBOOLEAN(), ExpressionTransformer.compile(_expr().getRHS(), _cc()));

    return new IRConditionalOrExpression(lhs, rhs);
  }
  protected IRExpression compile_impl() {
    // Push LHS (parser guarantees type is int or long)
    IRExpression lhs = ExpressionTransformer.compile(_expr().getLHS(), _cc());

    // Push RHS (parser guarantees type is int)
    IRExpression rhs = ExpressionTransformer.compile(_expr().getRHS(), _cc());

    verifyTypes();

    return new IRArithmeticExpression(getDescriptor(_expr().getType()), lhs, rhs, getOp());
  }
 protected IRExpression compile_impl() {
   IRExpression typeArg = pushType(_expr().getType());
   IRExpression idValueArg = ExpressionTransformer.compile(_expr().getArgs()[0], _cc());
   idValueArg = boxValue(_expr().getArgs()[0].getType(), idValueArg);
   return checkCast(
       _expr().getType(),
       callStaticMethod(
           ObjectLiteralExpressionTransformer.class,
           "getObjectFromTypeAndId",
           new Class[] {IType.class, Object.class},
           exprList(typeArg, idValueArg)));
 }