From 0087cf23e8e399778e93369d67dd543e767ab526 Mon Sep 17 00:00:00 2001 From: Matt Turner Date: Mon, 16 Mar 2015 17:53:34 -0700 Subject: i965/fs: Allow 2-src math instructions to have immediate src1. Reviewed-by: Kenneth Graunke --- src/mesa/drivers/dri/i965/brw_fs_combine_constants.cpp | 12 ++++++++---- src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp | 6 +++--- 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: -- cgit v1.2.3