On 14 December 2011 02:33, Kenneth Graunke <span dir="ltr">&lt;<a href="mailto:kenneth@whitecape.org">kenneth@whitecape.org</a>&gt;</span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="im">On 12/13/2011 03:35 PM, Paul Berry wrote:<br>
&gt; The Sandy Bridge PRM, volume 4, part 2, section 5.3.10 (&quot;5.3.10<br>
&gt; Register Region Restrictions&quot;) contains the following restriction on<br>
&gt; the execution size and operand width of instructions:<br>
&gt;<br>
&gt;    &quot;3. ExecSize must be equal to or greater than Width.&quot;<br>
&gt;<br>
&gt; When emitting an IF instruction in single program flow mode on Gen6+,<br>
&gt; we use an ExecSize of 1, therefore the Width of each operand must also<br>
&gt; be 1.<br>
&gt;<br>
&gt; The operands of an IF instruction are not actually used for their<br>
&gt; normal purpose on Gen6+ (which is probably the reason this wasn&#39;t<br>
&gt; causing a GPU hang), but nonetheless it seems prudent to follow this<br>
&gt; rule.<br>
<br>
</div>I&#39;m not actually sure what you&#39;re trying to say here.  The IF statement<br>
is different on Gen4-5, Gen6, and Gen7, so I&#39;m unclear what &quot;normal&quot; is.<br></blockquote><div><br>Tell you what, I&#39;ll just delete that last paragraph out of the commit message.  It wasn&#39;t really adding much content anyway.<br>
 </div><blockquote class="gmail_quote" style="margin:0pt 0pt 0pt 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
I think the point is that the ARF null register doesn&#39;t have a value, so<br>
null&lt;0,1,0&gt; is just as good as null&lt;4,4,1&gt; or null&lt;8,8,1&gt;.  Either way<br>
you get nothing and write nothing.  So width is irrelevant other than<br>
dodging this assertion.<br>
<br>
If we weren&#39;t guessing execution size based on the register widths, I&#39;d<br>
prefer to just change the null reg to have width 1.  But since we do,<br>
that would be a royal pain, and this is nice and simple.  I&#39;m definitely<br>
in favor of this patch.<br></blockquote><div><br>Agreed.  The whole &quot;guessing execution size&quot; thing has always troubled me, but I haven&#39;t thought of a good alternative.<br> </div><blockquote class="gmail_quote" style="margin:0pt 0pt 0pt 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">

<br>
Reviewed-by: Kenneth Graunke &lt;<a href="mailto:kenneth@whitecape.org">kenneth@whitecape.org</a>&gt;<br>
<div class="HOEnZb"><div class="h5"><br>
&gt; This patch unconditionally uses 1-wide null operands for Gen6+<br>
&gt; IF instructions, rather than the standard null operand, which is 8<br>
&gt; components wide.<br>
&gt; ---<br>
&gt;  src/mesa/drivers/dri/i965/brw_eu_emit.c |    8 ++++----<br>
&gt;  1 files changed, 4 insertions(+), 4 deletions(-)<br>
&gt;<br>
&gt; diff --git a/src/mesa/drivers/dri/i965/brw_eu_emit.c b/src/mesa/drivers/dri/i965/brw_eu_emit.c<br>
&gt; index a46a81b..d48753c 100644<br>
&gt; --- a/src/mesa/drivers/dri/i965/brw_eu_emit.c<br>
&gt; +++ b/src/mesa/drivers/dri/i965/brw_eu_emit.c<br>
&gt; @@ -941,11 +941,11 @@ brw_IF(struct brw_compile *p, GLuint execute_size)<br>
&gt;     } else if (intel-&gt;gen == 6) {<br>
&gt;        brw_set_dest(p, insn, brw_imm_w(0));<br>
&gt;        insn-&gt;bits1.branch_gen6.jump_count = 0;<br>
&gt; -      brw_set_src0(p, insn, retype(brw_null_reg(), BRW_REGISTER_TYPE_D));<br>
&gt; -      brw_set_src1(p, insn, retype(brw_null_reg(), BRW_REGISTER_TYPE_D));<br>
&gt; +      brw_set_src0(p, insn, vec1(retype(brw_null_reg(), BRW_REGISTER_TYPE_D)));<br>
&gt; +      brw_set_src1(p, insn, vec1(retype(brw_null_reg(), BRW_REGISTER_TYPE_D)));<br>
&gt;     } else {<br>
&gt; -      brw_set_dest(p, insn, retype(brw_null_reg(), BRW_REGISTER_TYPE_D));<br>
&gt; -      brw_set_src0(p, insn, retype(brw_null_reg(), BRW_REGISTER_TYPE_D));<br>
&gt; +      brw_set_dest(p, insn, vec1(retype(brw_null_reg(), BRW_REGISTER_TYPE_D)));<br>
&gt; +      brw_set_src0(p, insn, vec1(retype(brw_null_reg(), BRW_REGISTER_TYPE_D)));<br>
&gt;        brw_set_src1(p, insn, brw_imm_ud(0));<br>
&gt;        insn-&gt;bits3.break_cont.jip = 0;<br>
&gt;        insn-&gt;bits3.break_cont.uip = 0;<br>
<br>
</div></div></blockquote></div><br>