<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>