diff options
author | Abdiel Janulgue <abdiel.janulgue@linux.intel.com> | 2014-06-05 11:05:29 -0700 |
---|---|---|
committer | Matt Turner <mattst88@gmail.com> | 2014-06-09 11:19:45 -0700 |
commit | 609d00e13e1e3e61ce540c42250c35977d4bcaa1 (patch) | |
tree | 47d09eebb685ac32c57d28e4a6a9ba60fd1d67f5 /src/mesa/drivers/dri | |
parent | a66660d2b75197814f5e36b9994b1e9eadff0a2e (diff) | |
download | external_mesa3d-609d00e13e1e3e61ce540c42250c35977d4bcaa1.zip external_mesa3d-609d00e13e1e3e61ce540c42250c35977d4bcaa1.tar.gz external_mesa3d-609d00e13e1e3e61ce540c42250c35977d4bcaa1.tar.bz2 |
i965/fs: skip copy-propate for logical instructions with negated src entries
The negation source modifier on src registers has changed meaning in Broadwell when
used with logical operations. Don't copy propagate when negate src modifier is set
and when the destination instruction is a logical op.
Reviewed-by: Matt Turner <mattst88@gmail.com>
Signed-off-by: Abdiel Janulgue <abdiel.janulgue@linux.intel.com>
Diffstat (limited to 'src/mesa/drivers/dri')
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp b/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp index d3d59aa..158d0ba 100644 --- a/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp @@ -272,6 +272,15 @@ fs_copy_prop_dataflow::dump_block_data() const } } +static bool +is_logic_op(enum opcode opcode) +{ + return (opcode == BRW_OPCODE_AND || + opcode == BRW_OPCODE_OR || + opcode == BRW_OPCODE_XOR || + opcode == BRW_OPCODE_NOT); +} + bool fs_visitor::try_copy_propagate(fs_inst *inst, int arg, acp_entry *entry) { @@ -330,6 +339,14 @@ fs_visitor::try_copy_propagate(fs_inst *inst, int arg, acp_entry *entry) if (has_source_modifiers && entry->dst.type != inst->src[arg].type) return false; + if (brw->gen >= 8) { + if (entry->src.negate) { + if (is_logic_op(inst->opcode)) { + return false; + } + } + } + inst->src[arg].file = entry->src.file; inst->src[arg].reg = entry->src.reg; inst->src[arg].reg_offset = entry->src.reg_offset; |