summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorIan Romanick <[email protected]>2018-12-12 18:14:34 -0800
committerIan Romanick <[email protected]>2019-03-01 12:42:14 -0800
commitfb3ca9109cba6d814c2e3843e256b298cfd73661 (patch)
tree9dc09e525929034ac6b291bda5e2db8ecd521032 /src
parentc9d5bd050c31b6ca20610a5eadd27068bd5c190b (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.cpp11
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;