public MaskedLong multiply(MaskedLong that) {
		if (this.isFullyDefined() && that.isFullyDefined()) {
			return fromMaskAndValue(-1, this.val * that.val);
		}
		else if (that.isFullyDefined()) {
			// If it's a power of 2, re-write as bit shift
			if (Long.bitCount(that.val) == 1) {
				return this.shiftLeft(Long.numberOfTrailingZeros(that.val));
			}
		}
		else if (this.isFullyDefined()) {
			if (Long.bitCount(this.val) == 1) {
				return that.shiftLeft(Long.numberOfTrailingZeros(this.val));
			}
		}

		// TODO: Distinguish size, don't knows, from don't cares.
		// Assume unknown bits to the left are actually don't cares. That is, they specify the size
		// of the "field"
		int thisSize = Long.numberOfTrailingZeros(~this.msk);
		int thatSize = Long.numberOfTrailingZeros(~that.msk);
		if (thisSize + Long.numberOfLeadingZeros(this.msk) == Long.SIZE) {
			if (thatSize + Long.numberOfLeadingZeros(that.msk) == Long.SIZE) {
				int newSize = thisSize + thatSize;
				return fromMaskAndValue(~(-1L << newSize), this.val * that.val);
			}
		}

		throw new UnsupportedOperationException("Cannot multiply unknown values, yet.");
		// TODO: Work this using a bitwise algorithm, if *really* needed.
	}
Compute the arithmetic product of this and another masked long

@param that the other masked long.
@return the result.
Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/assembler/sleigh/expr/MaskedLong.java