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));
      moveResult(target, true);
    }
  }
Executes {@code op} and sets {@code target} to the result. For most binary operations, the
types of {@code a} and {@code b} must be the same. Shift operations (like {@link
BinaryOp#SHIFT_LEFT}) require {@code b} to be an {@code int}, even when {@code a} is a {@code
long}.
android/android_framework/dex-maker/src/main/java/com/android/dx/Code.java