private Instruction disassembleNonDelaySlotInstruction(Program program, Address addr,
			int lengthOverride) {
		// Use lightweight disassembler for simple case
		DisassemblerContextImpl context = new DisassemblerContextImpl(program.getProgramContext());
		context.flowStart(addr);
		try {
			InstructionPrototype proto = program.getLanguage()
					.parse(new DumbMemBufferImpl(program.getMemory(), addr), context, false);
			if (lengthOverride > proto.getLength()) {
				lengthOverride = 0;
			}
			return resultListing.createInstruction(addr, proto,
				new DumbMemBufferImpl(program.getMemory(), addr),
				new ProgramProcessorContext(program.getProgramContext(), addr),
				Math.min(lengthOverride, proto.getLength()));
		}
		catch (Exception e) {
			program.getBookmarkManager()
					.setBookmark(addr, BookmarkType.ERROR, Disassembler.ERROR_BOOKMARK_CATEGORY,
						"Diff/Merge applied bad instruction");
		}
		return null;
	}
<CODE>performMergeInstruction</CODE> merges the indicated instruction
into the merge program. Before the instruction is created the bytes for
the instruction are copied from program2 to program1.
Corresponding code unit(s) must already be cleared in result program,
as well as having copied context-register value.
@param originInstruction the instruction to be merged
This instruction should be from the origin program.
@param originByteDiffs address set indicating addresses where the bytes differ
between program1 and program2.
The addresses in this set should be from program1.
@throws CodeUnitInsertionException if the instruction can't be created
in the merge program.
@throws MemoryAccessException if bytes can't be copied.
Ghidra/Features/Base/src/main/java/ghidra/program/util/ProgramMerge.java