private void checkInstructionDecodeFailure(EmulatorTestRunner testRunner) {
		// assume general error has already been logged
		String emuError = testRunner.getEmuError();
		if (emuError == null || (emuError.indexOf("Instruction decode failed") < 0) ||
			(emuError.indexOf("Uninitialized Memory") > 0)) {
			return;
		}

		Address currentAddr = testRunner.getCurrentAddress();

		// dump context register state if decode failure
		RegisterValue contextRegValue =
			testRunner.getEmulatorHelper().getEmulator().getContextRegisterValue();
		if (contextRegValue == null) {
			return;
		}
		StringBuilder buf = new StringBuilder("Context register state at: ");
		buf.append(currentAddr.toString(true));
		for (Register contextField : contextRegValue.getRegister().getChildRegisters()) {
			RegisterValue ctxValue = contextRegValue.getRegisterValue(contextField);
			String valueStr = ctxValue.getUnsignedValueIgnoreMask().toString(16);
			buf.append("\n  ");
			buf.append(contextField.getName());
			buf.append(" = 0x");
			buf.append(valueStr);
		}
		log(testRunner.getTestGroup(), buf.toString());

		// If parse OK within program - check for modified bytes within emu memory state
		Program program = testRunner.getProgram();
		boolean inDelaySlot = false;
		DumbMemBufferImpl memBuf = new DumbMemBufferImpl(program.getMemory(), currentAddr);
		DisassemblerContextImpl context = new DisassemblerContextImpl(program.getProgramContext());
		try {
			context.flowStart(currentAddr);
			context.setRegisterValue(contextRegValue);
			InstructionPrototype proto = language.parse(memBuf, context, false);
			int len = proto.getLength();
			if (proto.hasDelaySlots()) {
				// TODO: Avoid use of InstructionContext by just guessing at potential byte count
				len *= 3;
			}

			// check for memory modification
			byte[] emuBytes = testRunner.getEmulatorHelper().readMemory(currentAddr, len);
			byte[] programBytes = new byte[emuBytes.length];
			program.getMemory().getBytes(currentAddr, programBytes);
			if (!Arrays.equals(emuBytes, programBytes)) {
				buf = new StringBuilder(
					"Instruction bytes differ between program and emulator state at: ");
				buf.append(currentAddr.toString(true));
				if (inDelaySlot) {
					buf.append(" (includes delay-slots)");
				}
				buf.append("\n");
				buf.append("  Program Bytes:  ");
				buf.append(NumericUtilities.convertBytesToString(programBytes, " "));
				buf.append("\n");
				buf.append("  Emulator Bytes: ");
				buf.append(NumericUtilities.convertBytesToString(emuBytes, " "));
				log(testRunner.getTestGroup(), buf.toString());
			}
			else {
				log(testRunner.getTestGroup(),
					"Test unable to determine cause of instruction parse failure");
			}
			return; // if not byte difference - not sure what cause is
		}
		catch (UsrException e) {
			if (inDelaySlot) {
				log(testRunner.getTestGroup(),
					"Instruction parse error occurred in delay-slot at: " +
						memBuf.getAddress().toString(true));
			}
			// parse failed
		}

		// Run parse debug
		SleighDebugLogger logger =
			new SleighDebugLogger(memBuf, context, language, SleighDebugMode.VERBOSE);
		log(testRunner.getTestGroup(), logger.toString());

	}
Get symbol name which defines initial stack pointer offset
@return stack symbol or null
Ghidra/Features/Base/src/main/java/ghidra/test/processors/support/ProcessorEmulatorTestAdapter.java