/*
* Copyright 2013 Guidewire Software, Inc.
*/
package gw.internal.gosu.ir.compiler.bytecode.expression;
import gw.internal.gosu.ir.compiler.bytecode.AbstractBytecodeCompiler;
import gw.internal.gosu.ir.compiler.bytecode.IRBytecodeContext;
import gw.internal.gosu.ir.compiler.bytecode.IRBytecodeCompiler;
import gw.lang.ir.expression.IRArithmeticExpression;
import gw.lang.ir.IRType;
import gw.internal.ext.org.objectweb.asm.Opcodes;
public class IRArithmeticExpressionCompiler extends AbstractBytecodeCompiler {
public static void compile( IRArithmeticExpression expression, IRBytecodeContext context ) {
IRBytecodeCompiler.compileIRExpression( expression.getLhs(), context );
IRBytecodeCompiler.compileIRExpression( expression.getRhs(), context );
context.getMv().visitInsn( getInstruction( expression.getType(), expression.getOp() ) );
}
protected static int getInstruction( IRType type, IRArithmeticExpression.Operation op ) {
switch(op) {
case Addition:
return getIns( Opcodes.IADD, type );
case Subtraction:
return getIns( Opcodes.ISUB, type );
case Multiplication:
return getIns( Opcodes.IMUL, type );
case Division:
return getIns( Opcodes.IDIV, type );
case Remainder:
return getIns( Opcodes.IREM, type );
case ShiftLeft:
return getIns( Opcodes.ISHL, type );
case ShiftRight:
return getIns( Opcodes.ISHR, type );
case UnsignedShiftRight:
return getIns( Opcodes.IUSHR, type );
case BitwiseAnd:
return getIns( Opcodes.IAND, type );
case BitwiseOr:
return getIns( Opcodes.IOR, type );
case BitwiseXor:
return getIns( Opcodes.IXOR, type );
default:
throw new IllegalArgumentException("Unrecognized operation " + op);
}
}
}