Mesa (master): i965/compaction: Support compaction of control flow instructions.

Matt Turner mattst88 at kemper.freedesktop.org
Thu Sep 25 18:26:24 UTC 2014


Module: Mesa
Branch: master
Commit: 6a4e84edfaa34ff776f9b15cd263ddd616119bb8
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=6a4e84edfaa34ff776f9b15cd263ddd616119bb8

Author: Matt Turner <mattst88 at gmail.com>
Date:   Wed Aug 27 18:57:55 2014 -0700

i965/compaction: Support compaction of control flow instructions.

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 at whitecape.org>
Reviewed-by: Jason Ekstrand <jason.ekstrand at intel.com>

---

 src/mesa/drivers/dri/i965/brw_eu_compact.c |   30 +++++++++++++++-------------
 1 file changed, 16 insertions(+), 14 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_eu_compact.c b/src/mesa/drivers/dri/i965/brw_eu_compact.c
index f1534d9..50420de 100644
--- a/src/mesa/drivers/dri/i965/brw_eu_compact.c
+++ b/src/mesa/drivers/dri/i965/brw_eu_compact.c
@@ -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;




More information about the mesa-commit mailing list