summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Turner <mattst88@gmail.com>2014-03-25 15:28:17 -0700
committerMatt Turner <mattst88@gmail.com>2014-06-17 09:38:06 -0700
commit68b7b034292b561cb95d81acb08a502f5a840085 (patch)
tree2d452cfc48605b6c4f5086324721a468974cd593
parent856860db4a62bbe1cbcf63c68ce921b608ffae01 (diff)
i965/fs: Only consider real sources when comparing instructions.
-rw-r--r--src/mesa/drivers/dri/i965/brw_fs_cse.cpp19
1 files changed, 15 insertions, 4 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_fs_cse.cpp b/src/mesa/drivers/dri/i965/brw_fs_cse.cpp
index 3414d50d1f5..920bfeed221 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_cse.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs_cse.cpp
@@ -105,10 +105,20 @@ is_expression_commutative(enum opcode op)
}
static bool
-operands_match(enum opcode op, fs_reg *xs, fs_reg *ys)
+operands_match(fs_inst *a, fs_inst *b)
{
- if (!is_expression_commutative(op)) {
- return xs[0].equals(ys[0]) && xs[1].equals(ys[1]) && xs[2].equals(ys[2]);
+ fs_reg *xs = a->src;
+ fs_reg *ys = b->src;
+
+ if (!is_expression_commutative(a->opcode)) {
+ bool match = true;
+ for (int i = 0; i < a->sources; i++) {
+ if (!xs[i].equals(ys[i])) {
+ match = false;
+ break;
+ }
+ }
+ return match;
} else {
return (xs[0].equals(ys[0]) && xs[1].equals(ys[1])) ||
(xs[1].equals(ys[0]) && xs[0].equals(ys[1]));
@@ -124,7 +134,8 @@ instructions_match(fs_inst *a, fs_inst *b)
a->predicate_inverse == b->predicate_inverse &&
a->conditional_mod == b->conditional_mod &&
a->dst.type == b->dst.type &&
- operands_match(a->opcode, a->src, b->src);
+ a->sources == b->sources &&
+ operands_match(a, b);
}
bool