<div dir="ltr"><div>Reviewed-by: Jason Ekstrand <<a href="mailto:jason@jlekstrand.net">jason@jlekstrand.net</a>><br></div><br><div class="gmail_quote"><div dir="ltr">On Wed, Jan 16, 2019 at 1:32 AM Francisco Jerez <<a href="mailto:currojerez@riseup.net">currojerez@riseup.net</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">The docs are fairly incomplete and inconsistent about it, but this<br>
seems to be the reason why half-float destinations are required to be<br>
DWORD-aligned on BDW+ projects.  This way the regioning lowering pass<br>
will make sure that the destination components of W to HF and HF to W<br>
conversions are aligned like the corresponding conversion operation<br>
with 32-bit execution data type.<br>
---<br>
 src/intel/compiler/brw_ir_fs.h | 21 +++++++++++++++++++++<br>
 1 file changed, 21 insertions(+)<br>
<br>
diff --git a/src/intel/compiler/brw_ir_fs.h b/src/intel/compiler/brw_ir_fs.h<br>
index 3c23fb375e4..08e3d83d910 100644<br>
--- a/src/intel/compiler/brw_ir_fs.h<br>
+++ b/src/intel/compiler/brw_ir_fs.h<br>
@@ -477,6 +477,27 @@ get_exec_type(const fs_inst *inst)<br>
<br>
    assert(exec_type != BRW_REGISTER_TYPE_B);<br>
<br>
+   /* Promotion of the execution type to 32-bit for conversions from or to<br>
+    * half-float seems to be consistent with the following text from the<br>
+    * Cherryview PRM Vol. 7, "Execution Data Type":<br>
+    *<br>
+    * "When single precision and half precision floats are mixed between<br>
+    *  source operands or between source and destination operand [..] single<br>
+    *  precision float is the execution datatype."<br>
+    *<br>
+    * and from "Register Region Restrictions":<br>
+    *<br>
+    * "Conversion between Integer and HF (Half Float) must be DWord aligned<br>
+    *  and strided by a DWord on the destination."<br>
+    */<br>
+   if (type_sz(exec_type) == 2 &&<br>
+       inst->dst.type != exec_type) {<br>
+      if (exec_type == BRW_REGISTER_TYPE_HF)<br>
+         exec_type = BRW_REGISTER_TYPE_F;<br>
+      else if (inst->dst.type == BRW_REGISTER_TYPE_HF)<br>
+         exec_type = BRW_REGISTER_TYPE_D;<br>
+   }<br>
+<br>
    return exec_type;<br>
 }<br>
<br>
-- <br>
2.19.2<br>
<br>
_______________________________________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org" target="_blank">mesa-dev@lists.freedesktop.org</a><br>
<a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer" target="_blank">https://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
</blockquote></div></div>