i965/fs: Allow 2-src math instructions to have immediate src1.
authorMatt Turner <mattst88@gmail.com>
Tue, 17 Mar 2015 00:53:34 +0000 (17:53 -0700)
committerMatt Turner <mattst88@gmail.com>
Fri, 24 Apr 2015 18:39:01 +0000 (11:39 -0700)
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/mesa/drivers/dri/i965/brw_fs_combine_constants.cpp
src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp

index a51b726d4a4a8ce13d89c337a99b4791fa0449ed..a5bacf499907902d065189e75779e0dc4595388f 100644 (file)
@@ -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;
          }
index 6b6565fec204a1217072e5f266a8fe77d4be8f52..af54debc213930f76364c594d4c281fdf98f40f4 100644 (file)
@@ -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: