diff options
author | Eric Anholt <[email protected]> | 2014-10-09 09:40:51 +0200 |
---|---|---|
committer | Eric Anholt <[email protected]> | 2014-10-10 15:03:12 +0200 |
commit | 7c474f9f2e5e3161ad27129844139ee14d916726 (patch) | |
tree | 45492022be70b4f857645f8ed2a23a043fde1e90 /src | |
parent | ac557b4c121e4ea42ebe7f222f1f40bc56fe3aae (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')
-rw-r--r-- | src/gallium/drivers/vc4/vc4_opt_algebraic.c | 24 |
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: |