From: Ian Romanick Date: Thu, 13 Dec 2018 02:14:34 +0000 (-0800) Subject: intel/fs: Handle OR source modifiers in algebraic optimization X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=fb3ca9109cba6d814c2e3843e256b298cfd73661;p=mesa.git intel/fs: Handle OR source modifiers in algebraic optimization Found by inspection. Reviewed-by: Kenneth Graunke --- diff --git a/src/intel/compiler/brw_fs.cpp b/src/intel/compiler/brw_fs.cpp index 470c02145f6..c4c800c6c22 100644 --- a/src/intel/compiler/brw_fs.cpp +++ b/src/intel/compiler/brw_fs.cpp @@ -2596,7 +2596,16 @@ fs_visitor::opt_algebraic() case BRW_OPCODE_OR: if (inst->src[0].equals(inst->src[1]) || inst->src[1].is_zero()) { - inst->opcode = BRW_OPCODE_MOV; + /* On Gen8+, the OR instruction can have a source modifier that + * performs logical not on the operand. Cases of 'OR r0, ~r1, 0' + * or 'OR r0, ~r1, ~r1' should become a NOT instead of a MOV. + */ + if (inst->src[0].negate) { + inst->opcode = BRW_OPCODE_NOT; + inst->src[0].negate = false; + } else { + inst->opcode = BRW_OPCODE_MOV; + } inst->src[1] = reg_undef; progress = true; break;