diff options
author | Ian Romanick <[email protected]> | 2018-12-12 18:14:34 -0800 |
---|---|---|
committer | Ian Romanick <[email protected]> | 2019-03-01 12:42:14 -0800 |
commit | fb3ca9109cba6d814c2e3843e256b298cfd73661 (patch) | |
tree | 9dc09e525929034ac6b291bda5e2db8ecd521032 /src | |
parent | c9d5bd050c31b6ca20610a5eadd27068bd5c190b (diff) |
intel/fs: Handle OR source modifiers in algebraic optimization
Found by inspection.
Reviewed-by: Kenneth Graunke <[email protected]>
Diffstat (limited to 'src')
-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; |