protected T evaluateOp(Program program, PcodeOp op, Map<Varnode, T> already) {
		OpBehavior b = OpBehaviorFactory.getOpBehavior(op.getOpcode());
		if (b == null) {
			return badOp(op);
		}
		if (b instanceof UnaryOpBehavior unOp) {
			return evaluateUnaryOp(program, op, unOp, already);
		}
		if (b instanceof BinaryOpBehavior binOp) {
			return evaluateBinaryOp(program, op, binOp, already);
		}
		switch (op.getOpcode()) {
			case PcodeOp.LOAD:
				return evaluateLoad(program, op, already);
			case PcodeOp.PTRADD:
				return evaluatePtrAdd(program, op, already);
			case PcodeOp.PTRSUB:
				return evaluatePtrSub(program, op, already);
			default:
				return badOp(op);
		}
	}
Like {@link #evaluateOp(Program, PcodeOp)}, but uses a cache

@param program the program defining the static context
@param op the op whose output to evaluate
@param already a cache of already-evaluated varnodes and their values
@return the output value
Ghidra/Debug/ProposedUtils/src/main/java/ghidra/pcode/eval/AbstractVarnodeEvaluator.java