i965/fs: Use instruction execution sizes instead of heuristics
authorJason Ekstrand <jason.ekstrand@intel.com>
Sat, 16 Aug 2014 18:34:56 +0000 (11:34 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Tue, 30 Sep 2014 17:29:15 +0000 (10:29 -0700)
Signed-off-by: Jason Ekstrand <jason.ekstrand@intel.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
src/mesa/drivers/dri/i965/brw_fs.cpp
src/mesa/drivers/dri/i965/brw_fs_live_variables.cpp
src/mesa/drivers/dri/i965/brw_schedule_instructions.cpp

index 0fe9cdd86e451a15bd8bcb59acb8a03bbf403566..2f4ce5bd1581c5f45da65c4e757db1cad3932115 100644 (file)
@@ -2426,8 +2426,7 @@ fs_visitor::compute_to_mrf()
       int mrf_high;
       if (inst->dst.reg & BRW_MRF_COMPR4) {
         mrf_high = mrf_low + 4;
-      } else if (dispatch_width == 16 &&
-                (!inst->force_uncompressed && !inst->force_sechalf)) {
+      } else if (inst->exec_size == 16) {
         mrf_high = mrf_low + 1;
       } else {
         mrf_high = mrf_low;
@@ -2517,9 +2516,7 @@ fs_visitor::compute_to_mrf()
 
            if (scan_inst->dst.reg & BRW_MRF_COMPR4) {
               scan_mrf_high = scan_mrf_low + 4;
-           } else if (dispatch_width == 16 &&
-                      (!scan_inst->force_uncompressed &&
-                       !scan_inst->force_sechalf)) {
+           } else if (scan_inst->exec_size == 16) {
               scan_mrf_high = scan_mrf_low + 1;
            } else {
               scan_mrf_high = scan_mrf_low;
@@ -2675,10 +2672,6 @@ static void
 clear_deps_for_inst_src(fs_inst *inst, int dispatch_width, bool *deps,
                         int first_grf, int grf_len)
 {
-   bool inst_simd16 = (dispatch_width > 8 &&
-                       !inst->force_uncompressed &&
-                       !inst->force_sechalf);
-
    /* Clear the flag for registers that actually got read (as expected). */
    for (int i = 0; i < inst->sources; i++) {
       int grf;
@@ -2694,7 +2687,7 @@ clear_deps_for_inst_src(fs_inst *inst, int dispatch_width, bool *deps,
       if (grf >= first_grf &&
           grf < first_grf + grf_len) {
          deps[grf - first_grf] = false;
-         if (inst_simd16)
+         if (inst->exec_size == 16)
             deps[grf - first_grf + 1] = false;
       }
    }
@@ -2749,10 +2742,6 @@ fs_visitor::insert_gen4_pre_send_dependency_workarounds(bblock_t *block,
          return;
       }
 
-      bool scan_inst_simd16 = (dispatch_width > 8 &&
-                               !scan_inst->force_uncompressed &&
-                               !scan_inst->force_sechalf);
-
       /* We insert our reads as late as possible on the assumption that any
        * instruction but a MOV that might have left us an outstanding
        * dependency has more latency than a MOV.
@@ -2766,7 +2755,7 @@ fs_visitor::insert_gen4_pre_send_dependency_workarounds(bblock_t *block,
                 needs_dep[reg - first_write_grf]) {
                inst->insert_before(block, DEP_RESOLVE_MOV(reg));
                needs_dep[reg - first_write_grf] = false;
-               if (scan_inst_simd16)
+               if (scan_inst->exec_size == 16)
                   needs_dep[reg - first_write_grf + 1] = false;
             }
          }
index e5936e023c671f37175bc623ef624e843c4b2dd4..ea3c0d125cd9dced82af46192bc85b73ab17ccf2 100644 (file)
@@ -85,11 +85,11 @@ fs_live_variables::setup_one_read(bblock_t *block, fs_inst *inst,
     * would get stomped by the first decode as well.
     */
    int end_ip = ip;
-   if (v->dispatch_width == 16 && (reg.stride == 0 ||
-                                   reg.type == BRW_REGISTER_TYPE_UW ||
-                                   reg.type == BRW_REGISTER_TYPE_W ||
-                                   reg.type == BRW_REGISTER_TYPE_UB ||
-                                   reg.type == BRW_REGISTER_TYPE_B)) {
+   if (inst->exec_size == 16 && (reg.stride == 0 ||
+                                 reg.type == BRW_REGISTER_TYPE_UW ||
+                                 reg.type == BRW_REGISTER_TYPE_W ||
+                                 reg.type == BRW_REGISTER_TYPE_UB ||
+                                 reg.type == BRW_REGISTER_TYPE_B)) {
       end_ip++;
    }
 
index 5e8c98a36dfd88259d370a2d7e6297085c130532..f0d941fc35b9e83403899f4ab71b65b1a69d9a3d 100644 (file)
@@ -747,9 +747,7 @@ instruction_scheduler::add_barrier_deps(schedule_node *n)
 bool
 fs_instruction_scheduler::is_compressed(fs_inst *inst)
 {
-   return (v->dispatch_width == 16 &&
-          !inst->force_uncompressed &&
-          !inst->force_sechalf);
+   return inst->exec_size == 16;
 }
 
 void