public AssemblyPatternBlock assign(AssemblyPatternBlock that) {
		int newOffset = Math.min(this.offset, that.offset);
		int bufLen = Math.max(this.length(), that.length()) - newOffset;

		byte[] newMask = new byte[bufLen];
		byte[] newVals = new byte[bufLen];

		int diff = this.offset - newOffset;
		for (int i = 0; i < this.mask.length; i++) {
			newMask[diff + i] = this.mask[i];
			newVals[diff + i] = this.vals[i];
		}
		diff = that.offset - newOffset;
		for (int i = 0; i < that.mask.length; i++) {
			byte mask = that.mask[i];
			byte clearMask = (byte) ~mask;
			newMask[diff + i] |= mask;
			newVals[diff + i] = (byte) ((that.vals[i] & mask) | (newVals[diff + i] & clearMask));
		}
		return new AssemblyPatternBlock(newOffset, newMask, newVals);
	}
Combine this pattern block with another given block

<p>
The two blocks are combined regardless if their corresponding defined bits agree. When blocks
are combined, their bytes are aligned according to their shifts, and the defined bits are
taken from either block. If neither block defines a bit (i.e., the mask bit at that position
is 0 for both input blocks), then the output has an undefined bit in the corresponding
position. If both blocks define the bit, but they have opposite values, then the value from
<code>that</code> takes precedence.

@see RegisterValue#combineValues(RegisterValue)

@param that the other block
@return the new combined block
Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/assembler/sleigh/sem/AssemblyPatternBlock.java