i965/compaction: Support compaction of control flow instructions.
authorMatt Turner <mattst88@gmail.com>
Thu, 28 Aug 2014 01:57:55 +0000 (18:57 -0700)
committerMatt Turner <mattst88@gmail.com>
Thu, 25 Sep 2014 18:02:36 +0000 (11:02 -0700)
We're currently emitting compactable control flow instruction the wrong
types, preventing their compaction. The next patch will fix this and
actually enable compaction.

On chips that cannot compact control flow instructions, attempts to find
a match in the datatype table will fail.

Acked-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Jason Ekstrand <jason.ekstrand@intel.com>
src/mesa/drivers/dri/i965/brw_eu_compact.c

index f1534d996eaef40d0f930db4f1282ce32c1d5cf0..50420deb47d424caff2a32d5cc6c47e08e83dbe8 100644 (file)
@@ -879,19 +879,6 @@ brw_try_compact_instruction(struct brw_context *brw, brw_compact_inst *dst,
 
    assert(brw_inst_cmpt_control(brw, src) == 0);
 
-   if (brw_inst_opcode(brw, src) == BRW_OPCODE_IF ||
-       brw_inst_opcode(brw, src) == BRW_OPCODE_IFF ||
-       brw_inst_opcode(brw, src) == BRW_OPCODE_ELSE ||
-       brw_inst_opcode(brw, src) == BRW_OPCODE_ENDIF ||
-       brw_inst_opcode(brw, src) == BRW_OPCODE_HALT ||
-       brw_inst_opcode(brw, src) == BRW_OPCODE_DO ||
-       brw_inst_opcode(brw, src) == BRW_OPCODE_WHILE) {
-      /* FINISHME: The fixup code below, and brw_set_uip_jip and friends, needs
-       * to be able to handle compacted flow control instructions..
-       */
-      return false;
-   }
-
    if (is_3src(brw_inst_opcode(brw, src))) {
       if (brw->gen >= 8) {
          memset(&temp, 0, sizeof(temp));
@@ -1380,8 +1367,23 @@ brw_compact_instructions(struct brw_compile *p, int start_offset,
       case BRW_OPCODE_ENDIF:
       case BRW_OPCODE_WHILE:
          if (brw->gen >= 7) {
-            update_uip_jip(brw, insn, this_old_ip, compacted_counts);
+            if (brw_inst_cmpt_control(brw, insn)) {
+               brw_inst uncompacted;
+               brw_uncompact_instruction(brw, &uncompacted,
+                                         (brw_compact_inst *)insn);
+
+               update_uip_jip(brw, &uncompacted, this_old_ip, compacted_counts);
+
+               bool ret = brw_try_compact_instruction(brw,
+                                                      (brw_compact_inst *)insn,
+                                                      &uncompacted);
+               assert(ret); (void)ret;
+            } else {
+               update_uip_jip(brw, insn, this_old_ip, compacted_counts);
+            }
          } else if (brw->gen == 6) {
+            assert(!brw_inst_cmpt_control(brw, insn));
+
             /* Jump Count is in units of compacted instructions on Gen6. */
             int jump_count_compacted = brw_inst_gen6_jump_count(brw, insn);
             int jump_count_uncompacted = jump_count_compacted / 2;