Mesa (master): i965: Add EU emit support for gen6' s new IF instruction with comparison.

Eric Anholt anholt at kemper.freedesktop.org
Wed Oct 20 04:33:57 UTC 2010


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

Author: Eric Anholt <eric at anholt.net>
Date:   Tue Oct 19 12:55:04 2010 -0700

i965: Add EU emit support for gen6's new IF instruction with comparison.

---

 src/mesa/drivers/dri/i965/brw_eu.h      |    2 ++
 src/mesa/drivers/dri/i965/brw_eu_emit.c |   30 +++++++++++++++++++++++++++++-
 2 files changed, 31 insertions(+), 1 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_eu.h b/src/mesa/drivers/dri/i965/brw_eu.h
index 7cac4a7..8ffa7c7 100644
--- a/src/mesa/drivers/dri/i965/brw_eu.h
+++ b/src/mesa/drivers/dri/i965/brw_eu.h
@@ -927,6 +927,8 @@ void brw_dp_WRITE_16( struct brw_compile *p,
  */
 struct brw_instruction *brw_IF(struct brw_compile *p, 
 			       GLuint execute_size);
+struct brw_instruction *brw_IF_gen6(struct brw_compile *p, uint32_t conditional,
+				    struct brw_reg src0, struct brw_reg src1);
 
 struct brw_instruction *brw_ELSE(struct brw_compile *p, 
 				 struct brw_instruction *if_insn);
diff --git a/src/mesa/drivers/dri/i965/brw_eu_emit.c b/src/mesa/drivers/dri/i965/brw_eu_emit.c
index a1fead0..7348924 100644
--- a/src/mesa/drivers/dri/i965/brw_eu_emit.c
+++ b/src/mesa/drivers/dri/i965/brw_eu_emit.c
@@ -831,6 +831,7 @@ struct brw_instruction *brw_IF(struct brw_compile *p, GLuint execute_size)
       brw_set_src1(insn, brw_imm_d(0x0));
    } else {
       brw_set_dest(insn, brw_imm_w(0));
+      insn->bits1.branch_gen6.jump_count = 0;
       brw_set_src0(insn, brw_null_reg());
       brw_set_src1(insn, brw_null_reg());
    }
@@ -847,6 +848,29 @@ struct brw_instruction *brw_IF(struct brw_compile *p, GLuint execute_size)
    return insn;
 }
 
+struct brw_instruction *
+brw_IF_gen6(struct brw_compile *p, uint32_t conditional,
+	    struct brw_reg src0, struct brw_reg src1)
+{
+   struct brw_instruction *insn;
+
+   insn = next_insn(p, BRW_OPCODE_IF);
+
+   brw_set_dest(insn, brw_imm_w(0));
+   insn->header.execution_size = BRW_EXECUTE_8;
+   insn->bits1.branch_gen6.jump_count = 0;
+   brw_set_src0(insn, src0);
+   brw_set_src1(insn, src1);
+
+   assert(insn->header.compression_control == BRW_COMPRESSION_NONE);
+   assert(insn->header.predicate_control == BRW_PREDICATE_NONE);
+   insn->header.destreg__conditionalmod = conditional;
+
+   if (!p->single_program_flow)
+       insn->header.thread_control = BRW_THREAD_SWITCH;
+
+   return insn;
+}
 
 struct brw_instruction *brw_ELSE(struct brw_compile *p, 
 				 struct brw_instruction *if_insn)
@@ -872,6 +896,7 @@ struct brw_instruction *brw_ELSE(struct brw_compile *p,
       brw_set_src1(insn, brw_imm_d(0x0));
    } else {
       brw_set_dest(insn, brw_imm_w(0));
+      insn->bits1.branch_gen6.jump_count = 0;
       brw_set_src0(insn, brw_null_reg());
       brw_set_src1(insn, brw_null_reg());
    }
@@ -940,7 +965,10 @@ void brw_ENDIF(struct brw_compile *p,
       insn->header.mask_control = BRW_MASK_ENABLE;
       insn->header.thread_control = BRW_THREAD_SWITCH;
 
-      assert(patch_insn->bits3.if_else.jump_count == 0);
+      if (intel->gen < 6)
+	 assert(patch_insn->bits3.if_else.jump_count == 0);
+      else
+	 assert(patch_insn->bits1.branch_gen6.jump_count == 0);
 
       /* Patch the if or else instructions to point at this or the next
        * instruction respectively.




More information about the mesa-commit mailing list