<div dir="ltr">Would it be easier to split it into two instructions in NIR and just implement the two conversions in the back-end?  I suppose structuring things this way, it's probably fairly easy to just do it in the back-end.  I guess that's ok.<br><br><div class="gmail_quote"><div dir="ltr">On Tue, Dec 4, 2018 at 1:17 AM Iago Toral Quiroga <<a href="mailto:itoral@igalia.com">itoral@igalia.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Signed-off-by: Samuel Iglesias Gonsálvez <<a href="mailto:siglesias@igalia.com" target="_blank">siglesias@igalia.com</a>><br>
---<br>
 src/intel/compiler/brw_fs_nir.cpp | 41 +++++++++++++++++++++++++++++++<br>
 1 file changed, 41 insertions(+)<br>
<br>
diff --git a/src/intel/compiler/brw_fs_nir.cpp b/src/intel/compiler/brw_fs_nir.cpp<br>
index 6eb68794f58..7294f49ddc0 100644<br>
--- a/src/intel/compiler/brw_fs_nir.cpp<br>
+++ b/src/intel/compiler/brw_fs_nir.cpp<br>
@@ -796,6 +796,47 @@ fs_visitor::nir_emit_alu(const fs_builder &bld, nir_alu_instr *instr)<br>
    case nir_op_f2f64:<br>
    case nir_op_f2i64:<br>
    case nir_op_f2u64:<br>
+      /* BDW PRM, vol02, Command Reference Instructions, mov - MOVE:<br>
+       *<br>
+       *   "There is no direct conversion from HF to DF or DF to HF.<br>
+       *    Use two instructions and F (Float) as an intermediate type.<br>
+       *<br>
+       *    There is no direct conversion from HF to Q/UQ or Q/UQ to HF.<br>
+       *    Use two instructions and F (Float) or a word integer type<br>
+       *    or a DWord integer type as an intermediate type."<br>
+       */<br>
+      if (nir_src_bit_size(instr->src[0].src) == 16) {<br>
+         fs_reg tmp = bld.vgrf(BRW_REGISTER_TYPE_F, 1);<br>
+         inst = bld.MOV(tmp, op[0]);<br>
+         inst->saturate = instr->dest.saturate;<br>
+         op[0] = tmp;<br>
+      }<br>
+<br>
+      /* CHV PRM, vol07, 3D Media GPGPU Engine, Register Region Restrictions:<br>
+       *<br>
+       *    "When source or destination is 64b (...), regioning in Align1<br>
+       *     must follow these rules:<br>
+       *<br>
+       *     1. Source and destination horizontal stride must be aligned to<br>
+       *        the same qword.<br>
+       *     (...)"<br>
+       *<br>
+       * This means that conversions from bit-sizes smaller than 64-bit to<br>
+       * 64-bit need to have the source data elements aligned to 64-bit.<br>
+       * This restriction does not apply to BDW and later.<br>
+       */<br>
+      if (type_sz(result.type) == 8 && type_sz(op[0].type) < 8 &&<br>
+          (devinfo->is_cherryview || gen_device_info_is_9lp(devinfo))) {<br>
+         fs_reg tmp = bld.vgrf(result.type, 1);<br>
+         tmp = subscript(tmp, op[0].type, 0);<br>
+         inst = bld.MOV(tmp, op[0]);<br>
+         op[0] = tmp;<br>
+      }<br>
+<br>
+      inst = bld.MOV(result, op[0]);<br>
+      inst->saturate = instr->dest.saturate;<br>
+      break;<br>
+<br>
    case nir_op_i2f64:<br>
    case nir_op_i2i64:<br>
    case nir_op_u2f64:<br>
-- <br>
2.17.1<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>