@Override
	public JitType afterLeft(JitCodeGenerator gen, JitIntCarryOp op, JitType lType, JitType rType,
			MethodVisitor rv) {
		/**
		 * There are two strategies to use here depending on whether or not there's room to capture
		 * the carry bit. If there's not room, we have to compare the sum to one of the input
		 * operands. If the sum is less, then we can conclude there was a carry. For that strategy,
		 * we will need to keep a copy of the left operand, so duplicate it.
		 * 
		 * On the other hand, if there is room to capture the carry, we can just add the two
		 * operands and extract the carry bit. There is no need to duplicate the left operand.
		 */
		lType = TypeConversions.forceUniformZExt(lType, rType, rv);
		switch (lType) {
			case IntJitType(int size) when size == Integer.BYTES -> rv.visitInsn(DUP);
			case IntJitType lt -> {
			}
			case LongJitType(int size) when size == Long.BYTES -> rv.visitInsn(DUP2);
			case LongJitType lt -> {
			}
			case MpIntJitType lt -> TODO("MpInt");
			default -> throw new AssertionError();
		}
		return lType;
	}
Similar strategy as for INT_ADD. In fact, we call its per-leg logic.
Ghidra/Framework/Emulation/src/main/java/ghidra/pcode/emu/jit/gen/op/IntCarryOpGen.java