@Override
	default JitType generateBinOpRunCode(JitCodeGenerator gen, T op, JitBlock block, JitType lType,
			JitType rType, MethodVisitor rv) {
		Label lblTrue = new Label();
		Label lblDone = new Label();

		rType = TypeConversions.forceUniformZExt(rType, lType, rv);
		switch (rType) {
			case IntJitType t -> generateIntJump(lblTrue, rv);
			case LongJitType t -> generateLongJump(lblTrue, rv);
			case MpIntJitType t -> Unfinished.TODO("MpInt");
			default -> throw new AssertionError();
		}
		JitType outType = op.type().resolve(gen.getTypeModel().typeOf(op.out()));
		TypeConversions.generateLdcFalse(outType, rv);
		rv.visitJumpInsn(GOTO, lblDone);
		rv.visitLabel(lblTrue);
		TypeConversions.generateLdcTrue(outType, rv);
		rv.visitLabel(lblDone);

		return outType;
	}
{@inheritDoc}

<p>
This reduces the implementation to a flag for signedness, the opcode for the conditional jump
on integer operands, and the opcode for a conditional jump after the comparison of longs. The
JVM, does not provide conditional jumps on long operands, so we must first compare the longs,
pushing an int onto the stack, and then conditionally jumping on that. This pattern is
similar for unsigned comparison of integers.
Ghidra/Framework/Emulation/src/main/java/ghidra/pcode/emu/jit/gen/op/CompareIntBinOpGen.java