<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Mon, Apr 30, 2018 at 7:18 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">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>
 src/intel/compiler/brw_fs_nir.<wbr>cpp | 34 ++++++++++++++++++++++++++++--<wbr>----<br>
 1 file changed, 28 insertions(+), 6 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..d590a00385 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,13 @@ fs_visitor::nir_emit_alu(const fs_builder &bld, nir_alu_instr *instr)<br>
    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>
+<br>
+      const uint32_t bit_size =  nir_src_bit_size(instr->src[0]<wbr>.src);<br>
+      if (bit_size > 32)<br>
          dest = bld.vgrf(BRW_REGISTER_TYPE_DF, 1);<br>
-      }<br>
+      else if (bit_size < 32)<br>
+         dest = bld.vgrf(BRW_REGISTER_TYPE_HF, 1);<br></blockquote><div><br></div><div>This is going to break for 8-bit.  Maybe add an assert?  For that matter, why not just use the type of src0 for the destination type?  How do 8-bit comparisons work?  Do they return a 16-bit value?<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+<br>
       brw_conditional_mod cond;<br>
       switch (instr->op) {<br>
       case nir_op_flt:<br>
@@ -1037,9 +1041,17 @@ fs_visitor::nir_emit_alu(const fs_builder &bld, nir_alu_instr *instr)<br>
       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>
+         bld.MOV(retype(result, BRW_REGISTER_TYPE_D),<br>
+                 retype(dest, BRW_REGISTER_TYPE_W));<br></blockquote><div><br></div><div>Maybe better to use brw_reg_type_from_bit_size so 8-bit gets automatically handled?<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
       }<br>
       break;<br>
    }<br>
@@ -1051,9 +1063,12 @@ fs_visitor::nir_emit_alu(const fs_builder &bld, nir_alu_instr *instr)<br>
    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>
+<br>
+      const uint32_t bit_size = nir_src_bit_size(instr->src[0]<wbr>.src);<br>
+      if (bit_size > 32)<br>
          dest = bld.vgrf(BRW_REGISTER_TYPE_UQ, 1);<br>
-      }<br>
+      else if (bit_size < 32)<br>
+         dest = bld.vgrf(BRW_REGISTER_TYPE_W, 1);<br>
<br>
       brw_conditional_mod cond;<br>
       switch (instr->op) {<br>
@@ -1075,8 +1090,15 @@ fs_visitor::nir_emit_alu(const fs_builder &bld, nir_alu_instr *instr)<br>
          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>
+         bld.MOV(retype(result, BRW_REGISTER_TYPE_D),<br>
+                 retype(dest, BRW_REGISTER_TYPE_W));<br>
       }<br>
       break;<br>
    }<br>
<span class="HOEnZb"><font color="#888888">-- <br>
2.14.1<br>
<br>
</font></span></blockquote></div><br></div></div>