public MaskedLong invOr(MaskedLong that) throws SolverException {
		long newMsk = this.msk & that.msk;
		long newVal = this.val;

		// Check for the error case
		if ((newMsk & ~this.val & that.val) != 0) {
			throw new SolverException("1 | X == 0 cannot be solved.");
		}

		// This time, we must be wary the masks.
		// Make 1,1 give x (this will also get everything where that==1)
		newMsk &= ~(that.msk & that.val);
		// Make x,0 give 0 (this will also get everything where this==0)
		newMsk |= (this.msk & ~this.val);

		// Remask taken care of by constructor.
		return fromMaskAndValue(newMsk, newVal);
	}
Solves the expression A | B = C, for B, given C and A

<p>
To handle unknown bits, the solution is derived from the following truth table, where
{@code *} indicates no solution:

<pre>{@code
  0 x 1 <= A (that)
0 0 0 *
x x x x
1 1 x x
^
B (this)
}</pre>

@param that the other masked long ({@code B}).
@return the result.
@throws SolverException if not solution exists.
Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/assembler/sleigh/expr/MaskedLong.java