summaryrefslogtreecommitdiffstats
path: root/src/mesa/drivers/dri
diff options
context:
space:
mode:
authorAbdiel Janulgue <abdiel.janulgue@linux.intel.com>2014-06-05 11:05:29 -0700
committerMatt Turner <mattst88@gmail.com>2014-06-09 11:19:45 -0700
commit609d00e13e1e3e61ce540c42250c35977d4bcaa1 (patch)
tree47d09eebb685ac32c57d28e4a6a9ba60fd1d67f5 /src/mesa/drivers/dri
parenta66660d2b75197814f5e36b9994b1e9eadff0a2e (diff)
downloadexternal_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.cpp17
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;