summaryrefslogtreecommitdiff
path: root/src/gallium/drivers/vc4/vc4_opt_algebraic.c
diff options
context:
space:
mode:
authorEric Anholt <eric@anholt.net>2014-10-09 09:40:51 +0200
committerEric Anholt <eric@anholt.net>2014-10-10 15:03:12 +0200
commit7c474f9f2e5e3161ad27129844139ee14d916726 (patch)
tree45492022be70b4f857645f8ed2a23a043fde1e90 /src/gallium/drivers/vc4/vc4_opt_algebraic.c
parentac557b4c121e4ea42ebe7f222f1f40bc56fe3aae (diff)
vc4: Optimize the other case of SEL_X_Y wih a 0 -> SEL_X_0(a).
Cleans up some output to be more obvious in a piglit test I'm looking at.
Diffstat (limited to 'src/gallium/drivers/vc4/vc4_opt_algebraic.c')
-rw-r--r--src/gallium/drivers/vc4/vc4_opt_algebraic.c24
1 files changed, 23 insertions, 1 deletions
diff --git a/src/gallium/drivers/vc4/vc4_opt_algebraic.c b/src/gallium/drivers/vc4/vc4_opt_algebraic.c
index c1144583f63..ec526fb3d18 100644
--- a/src/gallium/drivers/vc4/vc4_opt_algebraic.c
+++ b/src/gallium/drivers/vc4/vc4_opt_algebraic.c
@@ -174,7 +174,10 @@ qir_opt_algebraic(struct vc4_compile *c)
*/
replace_with_mov(c, inst, inst->src[1]);
progress = true;
- } else if (is_zero(c, defs, inst->src[1])) {
+ break;
+ }
+
+ if (is_zero(c, defs, inst->src[1])) {
/* Replace references to a 0 uniform value
* with the SEL_X_0 equivalent.
*/
@@ -183,7 +186,26 @@ qir_opt_algebraic(struct vc4_compile *c)
inst->src[1] = c->undef;
progress = true;
dump_to(c, inst);
+ break;
}
+
+ if (is_zero(c, defs, inst->src[0])) {
+ /* Replace references to a 0 uniform value
+ * with the SEL_X_0 equivalent, flipping the
+ * condition being evaluated since the operand
+ * order is flipped.
+ */
+ dump_from(c, inst);
+ inst->op -= QOP_SEL_X_Y_ZS;
+ inst->op ^= 1;
+ inst->op += QOP_SEL_X_0_ZS;
+ inst->src[0] = inst->src[1];
+ inst->src[1] = c->undef;
+ progress = true;
+ dump_to(c, inst);
+ break;
+ }
+
break;
case QOP_FSUB: