* Shift operations (like {@link BinaryOp#SHIFT_LEFT}) require {@code b} to
* be an {@code int}, even when {@code a} is a {@code long}.
*/
public <T1, T2> void op(BinaryOp op, Local<T1> target, Local<T1> a, Local<T2> b) {
Rop rop = op.rop(StdTypeList.make(a.type.ropType, b.type.ropType));
RegisterSpecList sources = RegisterSpecList.make(a.spec(), b.spec());
if (rop.getBranchingness() == BRANCH_NONE) {
addInstruction(new PlainInsn(rop, sourcePosition, target.spec(), sources));
} else {
addInstruction(new ThrowingInsn(rop, sourcePosition, sources, catches));