public VectorSTL<OpTpl> assignBitRange(Location location, VarnodeTpl vn, int bitoffset,
			int numbits, ExprTree rhs) {
		entry("assignBitRange", location, vn, bitoffset, numbits, rhs);
		String errmsg = "";
		if (numbits == 0) {
			errmsg = "Size of bitrange is zero";
		}
		int smallsize = (numbits + 7) / 8; // Size of input (output of rhs)
		boolean shiftneeded = (bitoffset != 0);
		boolean zextneeded = true;
		long mask = 2;
		mask = ~(((mask << (numbits - 1)) - 1) << bitoffset);

		if (vn.getSize().getType() == ConstTpl.const_type.real) {
			// If we know the size of the bitranged varnode, we can
			// do some immediate checks, and possibly simplify things
			int symsize = (int) vn.getSize().getReal();
			if (symsize > 0) {
				zextneeded = (symsize > smallsize);
			}
			symsize *= 8; // Convert to number of bits
			if ((bitoffset >= symsize) || (bitoffset + numbits > symsize)) {
				errmsg = "Assigned bitrange is bad";
			}
			else if ((bitoffset == 0) && (numbits == symsize)) {
				errmsg = "Assigning to bitrange is superfluous";
			}
		}

		if (errmsg.length() > 0) { // Was there an error condition
			reportError(location, errmsg); // Report the error
			VectorSTL<OpTpl> resops = rhs.ops; // Passthru old expression
			rhs.ops = null;
			return resops;
		}

		// We know what the size of the input has to be
		force_size(rhs.outvn, new ConstTpl(ConstTpl.const_type.real, smallsize), rhs.ops);

		ExprTree res;
		VarnodeTpl finalout = buildTruncatedVarnode(location, vn, bitoffset, numbits);
		if (finalout != null) {
			res = createOpOutUnary(location, finalout, OpCode.CPUI_COPY, rhs);
		}
		else {
			if (bitoffset + numbits > 64) {
				errmsg = "Assigned bitrange extends past first 64 bits";
			}
			res = new ExprTree(location, vn);
			appendOp(location, OpCode.CPUI_INT_AND, res, mask, 0);
			if (zextneeded) {
				createOp(location, OpCode.CPUI_INT_ZEXT, rhs);
			}
			if (shiftneeded) {
				appendOp(location, OpCode.CPUI_INT_LEFT, rhs, bitoffset, 4);
			}

			finalout = new VarnodeTpl(location, vn);
			res = createOpOut(location, finalout, OpCode.CPUI_INT_OR, res, rhs);
		}
		if (errmsg.length() > 0) {
			reportError(location, errmsg);
		}
		VectorSTL<OpTpl> resops = res.ops;
		res.ops = null;
		return resops;
	}
Handle a sleigh 'macro' invocation, returning the resulting p-code op templates (OpTpl)

@param location is the file/line where the macro is invoked
@param sym MacroSymbol is the macro symbol
@param param is the parsed list of operand expressions
@return a list of p-code op templates
Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/pcodeCPort/slgh_compile/PcodeCompile.java