diff options
-rw-r--r-- | src/intel/compiler/brw_fs.cpp | 11 |
1 files changed, 10 insertions, 1 deletions
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; |