summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Turner <mattst88@gmail.com>2015-03-16 17:53:34 -0700
committerMatt Turner <mattst88@gmail.com>2015-04-24 11:39:01 -0700
commit0087cf23e8e399778e93369d67dd543e767ab526 (patch)
treed5172eb5c0320bc9bf2ff9d1601c3d5ad4b3db93
parentf251ea393bf3d01d242e2eb56cd0f2b0e140f7b2 (diff)
i965/fs: Allow 2-src math instructions to have immediate src1.
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
-rw-r--r--src/mesa/drivers/dri/i965/brw_fs_combine_constants.cpp12
-rw-r--r--src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp6
2 files changed, 11 insertions, 7 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 a51b726d4a..a5bacf4999 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_combine_constants.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs_combine_constants.cpp
@@ -62,9 +62,13 @@ could_coissue(const struct brw_device_info *devinfo, const fs_inst *inst)
* Returns true for instructions that don't support immediate sources.
*/
static bool
-must_promote_imm(const fs_inst *inst)
+must_promote_imm(const struct brw_device_info *devinfo, const fs_inst *inst)
{
switch (inst->opcode) {
+ case SHADER_OPCODE_POW:
+ case SHADER_OPCODE_INT_QUOTIENT:
+ case SHADER_OPCODE_INT_REMAINDER:
+ return devinfo->gen < 8;
case BRW_OPCODE_MAD:
case BRW_OPCODE_LRP:
return true;
@@ -207,7 +211,7 @@ fs_visitor::opt_combine_constants()
foreach_block_and_inst(block, fs_inst, inst, cfg) {
ip++;
- if (!could_coissue(devinfo, inst) && !must_promote_imm(inst))
+ if (!could_coissue(devinfo, inst) && !must_promote_imm(devinfo, inst))
continue;
for (int i = 0; i < inst->sources; i++) {
@@ -225,7 +229,7 @@ fs_visitor::opt_combine_constants()
imm->block = intersection;
imm->uses->push_tail(link(const_ctx, &inst->src[i]));
imm->uses_by_coissue += could_coissue(devinfo, inst);
- imm->must_promote = imm->must_promote || must_promote_imm(inst);
+ imm->must_promote = imm->must_promote || must_promote_imm(devinfo, inst);
imm->last_use_ip = ip;
} else {
imm = new_imm(&table, const_ctx);
@@ -235,7 +239,7 @@ fs_visitor::opt_combine_constants()
imm->uses->push_tail(link(const_ctx, &inst->src[i]));
imm->val = val;
imm->uses_by_coissue = could_coissue(devinfo, inst);
- imm->must_promote = must_promote_imm(inst);
+ imm->must_promote = must_promote_imm(devinfo, inst);
imm->first_use_ip = ip;
imm->last_use_ip = ip;
}
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 6b6565fec2..af54debc21 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp
@@ -502,9 +502,9 @@ fs_visitor::try_constant_propagate(fs_inst *inst, acp_entry *entry)
case SHADER_OPCODE_POW:
case SHADER_OPCODE_INT_QUOTIENT:
case SHADER_OPCODE_INT_REMAINDER:
- if (devinfo->gen < 8)
- break;
- /* fallthrough */
+ /* Allow constant propagation into src1 regardless of generation, and
+ * let constant combining promote the constant on Gen < 8.
+ */
case BRW_OPCODE_BFI1:
case BRW_OPCODE_ASR:
case BRW_OPCODE_SHL: