<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Wed, May 2, 2018 at 3:48 AM, Iago Toral Quiroga <span dir="ltr"><<a href="mailto:itoral@igalia.com" target="_blank">itoral@igalia.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">NIR assumes that booleans are always 32-bit, but Intel hardware produces<br>
16-bit booleans for 16-bit comparisons. This means that we need to convert<br>
the 16-bit result to 32-bit.<br>
<br>
In the future we want to add an optimization pass to clean this up and<br>
hopefully remove the conversions.<br>
<br>
</span>v2 (Jason): use the type of the source for the temporary and use<br>
            brw_reg_type_from_bit_size for the conversion to 32-bit.<br>
---<br>
 src/intel/compiler/brw_fs_nir.<wbr>cpp | 42 ++++++++++++++++++++++++++++++<wbr>+--------<br>
 1 file changed, 34 insertions(+), 8 deletions(-)<br>
<br>
diff --git a/src/intel/compiler/brw_fs_<wbr>nir.cpp b/src/intel/compiler/brw_fs_<wbr>nir.cpp<br>
index b9d8ade4cf..f763dfa4f2 100644<br>
--- a/src/intel/compiler/brw_fs_<wbr>nir.cpp<br>
+++ b/src/intel/compiler/brw_fs_<wbr>nir.cpp<br>
@@ -1017,9 +1017,11 @@ fs_visitor::nir_emit_alu(const fs_builder &bld, nir_alu_instr *instr)<br>
<span class="">    case nir_op_feq:<br>
    case nir_op_fne: {<br>
       fs_reg dest = result;<br>
-      if (nir_src_bit_size(instr->src[<wbr>0].src) > 32) {<br>
</span>-         dest = bld.vgrf(BRW_REGISTER_TYPE_DF, 1);<br>
-      }<br>
+<br>
<span class="">+      const uint32_t bit_size =  nir_src_bit_size(instr->src[0]<wbr>.src);<br>
</span>+      if (bit_size != 32)<br>
+         dest = bld.vgrf(op[0].type, 1);<br>
<span class="">+<br>
       brw_conditional_mod cond;<br>
       switch (instr->op) {<br>
       case nir_op_flt:<br>
</span>@@ -1037,9 +1039,21 @@ fs_visitor::nir_emit_alu(const fs_builder &bld, nir_alu_instr *instr)<br>
<span class="">       default:<br>
          unreachable("bad opcode");<br>
       }<br>
+<br>
       bld.CMP(dest, op[0], op[1], cond);<br>
-      if (nir_src_bit_size(instr->src[<wbr>0].src) > 32) {<br>
+<br>
+      if (bit_size > 32) {<br>
          bld.MOV(result, subscript(dest, BRW_REGISTER_TYPE_UD, 0));<br>
+      } else if(bit_size < 32) {<br>
+         /* When we convert the result to 32-bit we need to be careful and do<br>
+          * it as a signed conversion to get sign extension (for 32-bit true)<br>
+          */<br>
</span>+         const brw_reg_type dst_type =<br>
+            brw_reg_type_from_bit_size(32, BRW_REGISTER_TYPE_D);<br></blockquote><div><br></div><div>I think you can just use BRW_REGISTER_TYPE_D here.  But whatever, this is ok too.<br><br></div><div>Reviewed-by: Jason Ekstrand <<a href="mailto:jason@jlekstrand.net">jason@jlekstrand.net</a>><br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+         const brw_reg_type src_type =<br>
+            brw_reg_type_from_bit_size(<wbr>bit_size, BRW_REGISTER_TYPE_D);<br>
+<br>
+         bld.MOV(retype(result, dst_type), retype(dest, src_type));<br>
       }<br>
       break;<br>
    }<br>
@@ -1051,9 +1065,10 @@ fs_visitor::nir_emit_alu(const fs_builder &bld, nir_alu_instr *instr)<br>
<span class="">    case nir_op_ieq:<br>
    case nir_op_ine: {<br>
       fs_reg dest = result;<br>
-      if (nir_src_bit_size(instr->src[<wbr>0].src) > 32) {<br>
</span>-         dest = bld.vgrf(BRW_REGISTER_TYPE_UQ, 1);<br>
-      }<br>
+<br>
<span class="">+      const uint32_t bit_size = nir_src_bit_size(instr->src[0]<wbr>.src);<br>
</span>+      if (bit_size != 32)<br>
+         dest = bld.vgrf(op[0].type, 1);<br>
<span class=""> <br>
       brw_conditional_mod cond;<br>
       switch (instr->op) {<br>
</span>@@ -1075,8 +1090,19 @@ fs_visitor::nir_emit_alu(const fs_builder &bld, nir_alu_instr *instr)<br>
<span class="">          unreachable("bad opcode");<br>
       }<br>
       bld.CMP(dest, op[0], op[1], cond);<br>
-      if (nir_src_bit_size(instr->src[<wbr>0].src) > 32) {<br>
+<br>
+      if (bit_size > 32) {<br>
          bld.MOV(result, subscript(dest, BRW_REGISTER_TYPE_UD, 0));<br>
+      } else if (bit_size < 32) {<br>
+         /* When we convert the result to 32-bit we need to be careful and do<br>
+          * it as a signed conversion to get sign extension (for 32-bit true)<br>
+          */<br>
</span>+         const brw_reg_type dst_type =<br>
+            brw_reg_type_from_bit_size(32, BRW_REGISTER_TYPE_D);<br>
+         const brw_reg_type src_type =<br>
+            brw_reg_type_from_bit_size(<wbr>bit_size, BRW_REGISTER_TYPE_D);<br>
+<br>
+         bld.MOV(retype(result, dst_type), retype(dest, src_type));<br>
       }<br>
       break;<br>
    }<br>
<span class="HOEnZb"><font color="#888888">-- <br>
2.14.1<br>
<br>
</font></span></blockquote></div><br></div></div>