<div dir="ltr"><div>I think maybe it would be better if we put all this in nir_opcodes.py instead. Again, I'd like to make sure that for every opcode, what it does is right next to the definition instead of buried in nir_constant_expressions.py.</div><div><br></div><div>Also, I don't see anywhere in the series where you handle different rounding modes for fadd, fsub, fmul, etc.<br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Dec 18, 2018 at 11:35 AM Samuel Iglesias Gonsálvez <<a href="mailto:siglesias@igalia.com">siglesias@igalia.com</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">Signed-off-by: Samuel Iglesias Gonsálvez <<a href="mailto:siglesias@igalia.com" target="_blank">siglesias@igalia.com</a>><br>
---<br>
 src/compiler/nir/nir_constant_expressions.py | 46 +++++++++++++++++---<br>
 1 file changed, 41 insertions(+), 5 deletions(-)<br>
<br>
diff --git a/src/compiler/nir/nir_constant_expressions.py b/src/compiler/nir/nir_constant_expressions.py<br>
index dc2132df0d0..84cf819e921 100644<br>
--- a/src/compiler/nir/nir_constant_expressions.py<br>
+++ b/src/compiler/nir/nir_constant_expressions.py<br>
@@ -64,6 +64,7 @@ template = """\<br>
 #include "util/rounding.h" /* for _mesa_roundeven */<br>
 #include "util/half_float.h"<br>
 #include "util/bigmath.h"<br>
+#include "util/double.h"<br>
 #include "nir_constant_expressions.h"<br>
<br>
 /**<br>
@@ -324,7 +325,15 @@ struct ${type}${width}_vec {<br>
          % elif input_types[j] == "float16":<br>
             _mesa_half_to_float(_src[${j}].u16[${k}]),<br>
          % else:<br>
-            _src[${j}].${get_const_field(input_types[j])}[${k}],<br>
+            % if ("rtne" in op.rounding_mode) and ("float" in input_types[j]) and ("int" in output_type):<br>
+               % if "float32" in input_types[j]:<br>
+                  _mesa_roundevenf(_src[${j}].${get_const_field(input_types[j])}[${k}]),<br>
+               % else:<br>
+                  _mesa_roundeven(_src[${j}].${get_const_field(input_types[j])}[${k}]),<br>
+               % endif<br>
+            % else:<br>
+               _src[${j}].${get_const_field(input_types[j])}[${k}],<br>
+            % endif<br>
          % endif<br>
       % endfor<br>
       % for k in range(op.input_sizes[j], 4):<br>
@@ -353,8 +362,27 @@ struct ${type}${width}_vec {<br>
                const float src${j} =<br>
                   _mesa_half_to_float(_src[${j}].u16[_i]);<br>
             % else:<br>
-               const ${input_types[j]}_t src${j} =<br>
-                  _src[${j}].${get_const_field(input_types[j])}[_i];<br>
+               % if ("rtne" in op.rounding_mode) and ("float" in input_types[j]) and ("int" in output_type):<br>
+                  % if "float32" in input_types[j]:<br>
+                     const ${input_types[j]}_t src${j} =<br>
+                        _mesa_roundevenf(_src[${j}].${get_const_field(input_types[j])}[_i]);<br>
+                  % else:<br>
+                     const ${input_types[j]}_t src${j} =<br>
+                        _mesa_roundeven(_src[${j}].${get_const_field(input_types[j])}[_i]);<br>
+<br>
+                  % endif<br>
+               % elif ("float64" in input_types[j]) and ("float32" in output_type):<br>
+                  % if ("rtz" in op.rounding_mode):<br>
+                     const ${input_types[j]}_t src${j} =<br>
+                        _mesa_double_to_float_rtz(_src[${j}].${get_const_field(input_types[j])}[_i]);<br>
+                  % else:<br>
+                     const ${input_types[j]}_t src${j} =<br>
+                        _mesa_double_to_float_rtne(_src[${j}].${get_const_field(input_types[j])}[_i]);<br>
+                  % endif<br>
+               % else:<br>
+                  const ${input_types[j]}_t src${j} =<br>
+                     _src[${j}].${get_const_field(input_types[j])}[_i];<br>
+               % endif<br>
             % endif<br>
          % endfor<br>
<br>
@@ -378,7 +406,11 @@ struct ${type}${width}_vec {<br>
             ## Sanitize the C value to a proper NIR 0/-1 bool<br>
             _dst_val.${get_const_field(output_type)}[_i] = -(int)dst;<br>
          % elif output_type == "float16":<br>
-            _dst_val.u16[_i] = _mesa_float_to_half(dst);<br>
+            % if "rtz" in op.rounding_mode:<br>
+               _dst_val.u16[_i] = _mesa_float_to_float16_rtz(dst);<br>
+            % else:<br>
+               _dst_val.u16[_i] = _mesa_float_to_float16_rtne(dst);<br>
+            % endif<br>
          % else:<br>
             _dst_val.${get_const_field(output_type)}[_i] = dst;<br>
          % endif<br>
@@ -416,7 +448,11 @@ struct ${type}${width}_vec {<br>
             ## Sanitize the C value to a proper NIR 0/-1 bool<br>
             _dst_val.${get_const_field(output_type)}[${k}] = -(int)dst.${"xyzw"[k]};<br>
          % elif output_type == "float16":<br>
-            _dst_val.u16[${k}] = _mesa_float_to_half(dst.${"xyzw"[k]});<br>
+            % if "rtz" in op.rounding_mode:<br>
+               _dst_val.u16[${k}] = _mesa_float_to_float16_rtz(dst.${"xyzw"[k]});<br>
+            % else:<br>
+               _dst_val.u16[${k}] = _mesa_float_to_float16_rtne(dst.${"xyzw"[k]});<br>
+            % endif<br>
          % else:<br>
             _dst_val.${get_const_field(output_type)}[${k}] = dst.${"xyzw"[k]};<br>
          % endif<br>
-- <br>
2.19.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>