diff options
author | Eric Anholt <[email protected]> | 2015-02-12 14:17:21 -0800 |
---|---|---|
committer | Eric Anholt <[email protected]> | 2015-02-12 16:33:16 -0800 |
commit | 3f1e1287fd960966eee8b12a75c8a8f62e11cdd2 (patch) | |
tree | 9415b611ac95698b0d383b6565ac36a34178d358 /src/gallium/drivers/vc4/vc4_qir.c | |
parent | 4413861dd835cf8b9143f3032b670635bd217bf6 (diff) |
vc4: Make SF be a flag on the QIR instructions.
Right now the places that used to emit a mov.sf just put the SF on the
previous instruction when it generated the source of the SF value. Even
without optimization to push the sf up further (and kill thus potentially
kill more MOVs), this gets us:
total uniforms in shared programs: 13455 -> 13457 (0.01%)
uniforms in affected programs: 3 -> 5 (66.67%)
total instructions in shared programs: 40296 -> 40198 (-0.24%)
instructions in affected programs: 12595 -> 12497 (-0.78%)
Diffstat (limited to 'src/gallium/drivers/vc4/vc4_qir.c')
-rw-r--r-- | src/gallium/drivers/vc4/vc4_qir.c | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/src/gallium/drivers/vc4/vc4_qir.c b/src/gallium/drivers/vc4/vc4_qir.c index feb585d69ae..9e0ee1f0ae5 100644 --- a/src/gallium/drivers/vc4/vc4_qir.c +++ b/src/gallium/drivers/vc4/vc4_qir.c @@ -59,7 +59,6 @@ static const struct qir_op_info qir_op_info[] = { [QOP_XOR] = { "xor", 1, 2 }, [QOP_NOT] = { "not", 1, 1 }, - [QOP_SF] = { "sf", 0, 1 }, [QOP_SEL_X_0_NS] = { "fsel_x_0_ns", 1, 1, false, true }, [QOP_SEL_X_0_NC] = { "fsel_x_0_nc", 1, 1, false, true }, [QOP_SEL_X_0_ZS] = { "fsel_x_0_zs", 1, 1, false, true }, @@ -282,7 +281,9 @@ qir_print_reg(struct vc4_compile *c, struct qreg reg, bool write) void qir_dump_inst(struct vc4_compile *c, struct qinst *inst) { - fprintf(stderr, "%s ", qir_get_op_name(inst->op)); + fprintf(stderr, "%s%s ", + qir_get_op_name(inst->op), + inst->sf ? ".sf" : ""); qir_print_reg(c, inst->dst, true); for (int i = 0; i < qir_get_op_nsrc(inst->op); i++) { @@ -416,6 +417,20 @@ qir_get_stage_name(enum qstage stage) return names[stage]; } +void +qir_SF(struct vc4_compile *c, struct qreg src) +{ + assert(!is_empty_list(&c->instructions)); + struct qinst *last_inst = (struct qinst *)c->instructions.prev; + if (last_inst->dst.file != src.file || + last_inst->dst.index != src.index || + qir_is_multi_instruction(last_inst)) { + src = qir_MOV(c, src); + last_inst = (struct qinst *)c->instructions.prev; + } + last_inst->sf = true; +} + #define OPTPASS(func) \ do { \ bool stage_progress = func(c); \ |