public JitVal subpiece(int size, int offset, JitVal v) {
		if (v instanceof JitConstVal c) {
			return new JitConstVal(size,
				OB_SUBPIECE.evaluateBinary(size, v.size(), c.value(), BigInteger.valueOf(offset)));
		}
		if (v instanceof JitVarnodeVar vv) {
			Varnode inVn = vv.varnode();
			Varnode outVn = subPieceVn(size, offset, inVn);
			return subpiece(outVn, offset, v);
		}
		throw new UnsupportedOperationException("unsupported subpiece of " + v);
	}
Compute the subpiece of a value.

<p>
The result is added to the use-def graph. The output varnode is computed from the input
varnode and the subpiece parameters. This is used to handle variable retrieval when an access
only include parts of a value previously written. Consider the x86 assembly:

<pre>
MOV RAX, qword ptr [...]
MOV dword ptr [...], EAX
</pre>

<p>
The second line reads {@code EAX}, which consists of only the lower part of {@code RAX}.
Thus, we synthesize a subpiece op. These are distinct from an actual {@link PcodeOp#SUBPIECE}
op, since we sometimes needs to filter out synthetic ops.

@param size the size of the output variable in bytes
@param offset the subpiece offset (number of bytes shifted right)
@param v the input value
@return the output value
Ghidra/Framework/Emulation/src/main/java/ghidra/pcode/emu/jit/analysis/JitDataFlowArithmetic.java