And then the opt_combine_constants() pass will pull them out into registers. --- .../drivers/dri/i965/brw_fs_combine_constants.cpp | 22 +++++++++++++++++++--- .../drivers/dri/i965/brw_fs_copy_propagation.cpp | 6 ++++++ 2 files changed, 25 insertions(+), 3 deletions(-)
diff --git a/src/mesa/drivers/dri/i965/brw_fs_combine_constants.cpp b/src/mesa/drivers/dri/i965/brw_fs_combine_constants.cpp index eef6bb8..67c1663 100644 --- a/src/mesa/drivers/dri/i965/brw_fs_combine_constants.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs_combine_constants.cpp @@ -60,6 +60,18 @@ could_coissue(const fs_inst *inst) } } +static bool +must_promote_imm(const fs_inst *inst) +{ + switch (inst->opcode) { + case BRW_OPCODE_MAD: + case BRW_OPCODE_LRP: + return true; + default: + return false; + } +} + struct imm { bblock_t *block; float val; @@ -68,6 +80,7 @@ struct imm { uint16_t reg; uint16_t uses_by_coissue; + bool must_promote; }; struct table { @@ -118,10 +131,11 @@ fs_visitor::opt_combine_constants() cfg->calculate_idom(); /* Make a pass through all instructions and count the number of times each - * constant is used by coissueable instructions. + * constant is used by coissueable instructions or instructions that cannot + * take immediate arguments. */ foreach_block_and_inst(block, fs_inst, inst, cfg) { - if (!could_coissue(inst)) + if (!could_coissue(inst) && !must_promote_imm(inst)) continue; for (int i = 0; i < inst->sources; i++) { @@ -134,11 +148,13 @@ fs_visitor::opt_combine_constants() if (imm) { imm->block = cfg_t::intersect(block, imm->block); imm->uses_by_coissue += could_coissue(inst); + imm->must_promote = imm->must_promote || must_promote_imm(inst); } else { imm = new_imm(&table, const_ctx); imm->block = block; imm->val = val; imm->uses_by_coissue = could_coissue(inst); + imm->must_promote = must_promote_imm(inst); } } } @@ -149,7 +165,7 @@ fs_visitor::opt_combine_constants() for (int i = 0; i < table.len;) { struct imm *imm = &table.imm[i]; - if (imm->uses_by_coissue < 4) { + if (!imm->must_promote && imm->uses_by_coissue < 4) { table.imm[i] = table.imm[table.len - 1]; table.len--; continue; 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 e1989cb..0ee95cd 100644 --- a/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp @@ -563,6 +563,12 @@ fs_visitor::try_constant_propagate(fs_inst *inst, acp_entry *entry) progress = true; break; + case BRW_OPCODE_MAD: + case BRW_OPCODE_LRP: + inst->src[i] = val; + progress = true; + break; + default: break; } -- 2.0.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev