protected Set<Edge> computeOutEdges(Vertex from) {
		cachedVertices.add(from);
		Set<Edge> result = new HashSet<>();
		for (AssemblyConstructorSemantic sem : semantics.get(from.subtable)) {
			for (AssemblyResolvedPatterns rc : sem.patterns) {
				AssemblyPatternBlock pattern = rc.getContext();
				AssemblyPatternBlock outer = from.context.combine(pattern);
				if (outer == null) {
					continue;
				}
				if (sem.getConstructor().getNumOperands() == 0) {
					continue;
				}

				AssemblyResolvedPatterns orc = factory.contextOnly(outer, "For context transition");
				AssemblyResolvedPatterns irc = sem.applyContextChangesForward(Map.of(), orc);
				AssemblyPatternBlock inner = irc.getContext();

				Constructor ct = sem.getConstructor();
				for (int i = 0; i < ct.getNumOperands(); i++) {
					OperandSymbol op = ct.getOperand(i);
					TripleSymbol def = op.getDefiningSymbol();
					if (!(def instanceof SubtableSymbol)) {
						continue;
					}
					SubtableSymbol subtable = (SubtableSymbol) def;

					// TODO: Remove this check, eventually
					// NOTE: If pure recursion appears anywhere other than "instruction", this
					// check will prevent it from being handled.
					if (!from.subtable.equals(subtable.getName())) {
						continue;
					}

					Vertex dest = new Vertex(inner, subtable.getName());
					cachedVertices.add(dest);
					Edge e = new Edge(sem, i, from, dest);
					cachedEdges.add(e);
					result.add(e);
				}
			}
		}
		return result;
	}
Construct a new transition associated with the given constructor and operand index

@param sem the constructor semantic
@param op the operand index
Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/assembler/sleigh/sem/AssemblyContextGraph.java