<div dir="ltr"><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Mar 22, 2019 at 8:41 AM Samuel Pitoiset <<a href="mailto:samuel.pitoiset@gmail.com">samuel.pitoiset@gmail.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">This lowering isn't needed for RADV because AMDGCN has two<br>
instructions. It will be disabled for RADV in an upcoming series.<br>
<br>
While we are at it, factorize a little bit.<br>
<br>
Signed-off-by: Samuel Pitoiset <<a href="mailto:samuel.pitoiset@gmail.com" target="_blank">samuel.pitoiset@gmail.com</a>><br>
---<br>
 src/amd/vulkan/radv_shader.c                  |   1 +<br>
 src/compiler/Makefile.sources                 |   1 +<br>
 src/compiler/nir/meson.build                  |   1 +<br>
 src/compiler/nir/nir.h                        |   2 +<br>
 src/compiler/nir/nir_lower_frexp.c            | 214 ++++++++++++++++++<br>
 src/compiler/spirv/vtn_glsl450.c              | 137 +----------<br>
 src/freedreno/vulkan/tu_shader.c              |   1 +<br>
 .../drivers/freedreno/ir3/ir3_cmdline.c       |   1 +<br>
 src/intel/vulkan/anv_pipeline.c               |   2 +<br>
 9 files changed, 227 insertions(+), 133 deletions(-)<br>
 create mode 100644 src/compiler/nir/nir_lower_frexp.c<br>
<br>
diff --git a/src/amd/vulkan/radv_shader.c b/src/amd/vulkan/radv_shader.c<br>
index eecbc6ae759..19a807df199 100644<br>
--- a/src/amd/vulkan/radv_shader.c<br>
+++ b/src/amd/vulkan/radv_shader.c<br>
@@ -305,6 +305,7 @@ radv_shader_compile_to_nir(struct radv_device *device,<br>
<br>
                NIR_PASS_V(nir, nir_lower_system_values);<br>
                NIR_PASS_V(nir, nir_lower_clip_cull_distance_arrays);<br>
+               NIR_PASS_V(nir, nir_lower_frexp);<br>
        }<br>
<br>
        /* Vulkan uses the separate-shader linking model */<br>
diff --git a/src/compiler/Makefile.sources b/src/compiler/Makefile.sources<br>
index 722cfbb25a8..5ac4d0dc297 100644<br>
--- a/src/compiler/Makefile.sources<br>
+++ b/src/compiler/Makefile.sources<br>
@@ -242,6 +242,7 @@ NIR_FILES = \<br>
        nir/nir_lower_constant_initializers.c \<br>
        nir/nir_lower_double_ops.c \<br>
        nir/nir_lower_drawpixels.c \<br>
+       nir/nir_lower_frexp.c \<br>
        nir/nir_lower_global_vars_to_local.c \<br>
        nir/nir_lower_gs_intrinsics.c \<br>
        nir/nir_lower_load_const_to_scalar.c \<br>
diff --git a/src/compiler/nir/meson.build b/src/compiler/nir/meson.build<br>
index 4f1efb5c6d3..510e99c779b 100644<br>
--- a/src/compiler/nir/meson.build<br>
+++ b/src/compiler/nir/meson.build<br>
@@ -123,6 +123,7 @@ files_libnir = files(<br>
   'nir_lower_constant_initializers.c',<br>
   'nir_lower_double_ops.c',<br>
   'nir_lower_drawpixels.c',<br>
+  'nir_lower_frexp.c',<br>
   'nir_lower_global_vars_to_local.c',<br>
   'nir_lower_gs_intrinsics.c',<br>
   'nir_lower_load_const_to_scalar.c',<br>
diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h<br>
index 1da9874060b..b6a2ba7ec8c 100644<br>
--- a/src/compiler/nir/nir.h<br>
+++ b/src/compiler/nir/nir.h<br>
@@ -3253,6 +3253,8 @@ bool nir_lower_clip_vs(nir_shader *shader, unsigned ucp_enables, bool use_vars);<br>
 bool nir_lower_clip_fs(nir_shader *shader, unsigned ucp_enables);<br>
 bool nir_lower_clip_cull_distance_arrays(nir_shader *nir);<br>
<br>
+bool nir_lower_frexp(nir_shader *nir);<br>
+<br>
 void nir_lower_two_sided_color(nir_shader *shader);<br>
<br>
 bool nir_lower_clamp_color_outputs(nir_shader *shader);<br>
diff --git a/src/compiler/nir/nir_lower_frexp.c b/src/compiler/nir/nir_lower_frexp.c<br>
new file mode 100644<br>
index 00000000000..372451dcaae<br>
--- /dev/null<br>
+++ b/src/compiler/nir/nir_lower_frexp.c<br>
@@ -0,0 +1,214 @@<br>
+/*<br>
+ * Copyright © 2015 Intel Corporation<br>
+ * Copyright © 2019 Valve Corporation<br>
+ *<br>
+ * Permission is hereby granted, free of charge, to any person obtaining a<br>
+ * copy of this software and associated documentation files (the "Software"),<br>
+ * to deal in the Software without restriction, including without limitation<br>
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,<br>
+ * and/or sell copies of the Software, and to permit persons to whom the<br>
+ * Software is furnished to do so, subject to the following conditions:<br>
+ *<br>
+ * The above copyright notice and this permission notice (including the next<br>
+ * paragraph) shall be included in all copies or substantial portions of the<br>
+ * Software.<br>
+ *<br>
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR<br>
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,<br>
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL<br>
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER<br>
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING<br>
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS<br>
+ * IN THE SOFTWARE.<br>
+ *<br>
+ * Authors:<br>
+ *    Jason Ekstrand (<a href="mailto:jason@jlekstrand.net" target="_blank">jason@jlekstrand.net</a>)<br>
+ *    Samuel Pitoiset (<a href="mailto:samuel.pitoiset@gmail.com" target="_blank">samuel.pitoiset@gmail.com</a>><br>
+ */<br>
+<br>
+#include "nir.h"<br>
+#include "nir_builder.h"<br>
+<br>
+static nir_ssa_def *<br>
+lower_frexp_sig(nir_builder *b, nir_ssa_def *x)<br>
+{<br>
+   nir_ssa_def *abs_x = nir_fabs(b, x);<br>
+   nir_ssa_def *zero = nir_imm_floatN_t(b, 0, x->bit_size);<br>
+   nir_ssa_def *sign_mantissa_mask, *exponent_value;<br>
+   nir_ssa_def *is_not_zero = nir_fne(b, abs_x, zero);<br>
+<br>
+   switch (x->bit_size) {<br>
+   case 16:<br>
+      /* Half-precision floating-point values are stored as<br>
+       *   1 sign bit;<br>
+       *   5 exponent bits;<br>
+       *   10 mantissa bits.<br>
+       *<br>
+       * An exponent shift of 10 will shift the mantissa out, leaving only the<br>
+       * exponent and sign bit (which itself may be zero, if the absolute value<br>
+       * was taken before the bitcast and shift).<br>
+       */<br>
+      sign_mantissa_mask = nir_imm_intN_t(b, 0x83ffu, 16);<br>
+      /* Exponent of floating-point values in the range [0.5, 1.0). */<br>
+      exponent_value = nir_imm_intN_t(b, 0x3800u, 16);<br>
+      break;<br>
+   case 32:<br>
+      /* Single-precision floating-point values are stored as<br>
+       *   1 sign bit;<br>
+       *   8 exponent bits;<br>
+       *   23 mantissa bits.<br>
+       *<br>
+       * An exponent shift of 23 will shift the mantissa out, leaving only the<br>
+       * exponent and sign bit (which itself may be zero, if the absolute value<br>
+       * was taken before the bitcast and shift.<br>
+       */<br>
+      sign_mantissa_mask = nir_imm_int(b, 0x807fffffu);<br>
+      /* Exponent of floating-point values in the range [0.5, 1.0). */<br>
+      exponent_value = nir_imm_int(b, 0x3f000000u);<br>
+      break;<br>
+   case 64:<br>
+      /* Double-precision floating-point values are stored as<br>
+       *   1 sign bit;<br>
+       *   11 exponent bits;<br>
+       *   52 mantissa bits.<br>
+       *<br>
+       * An exponent shift of 20 will shift the remaining mantissa bits out,<br>
+       * leaving only the exponent and sign bit (which itself may be zero, if<br>
+       * the absolute value was taken before the bitcast and shift.<br>
+       */<br>
+      sign_mantissa_mask = nir_imm_int(b, 0x800fffffu);<br>
+      /* Exponent of floating-point values in the range [0.5, 1.0). */<br>
+      exponent_value = nir_imm_int(b, 0x3fe00000u);<br>
+      break;<br>
+   default:<br>
+      unreachable("Invalid bitsize");<br>
+   }<br>
+<br>
+   if (x->bit_size == 64) {<br>
+      /* We only need to deal with the exponent so first we extract the upper<br>
+       * 32 bits using nir_unpack_64_2x32_split_y.<br>
+       */<br>
+      nir_ssa_def *upper_x = nir_unpack_64_2x32_split_y(b, x);<br>
+      nir_ssa_def *zero32 = nir_imm_float(b, 0.0f);<br></blockquote><div><br></div><div>I think an integer would be more appropreate here.  It doesn't actually matter but a 32-bit float isn't what we want.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
+<br>
+      nir_ssa_def *new_upper =<br>
+         nir_ior(b, nir_iand(b, upper_x, sign_mantissa_mask),<br>
+                    nir_bcsel(b, is_not_zero, exponent_value, zero32));<br>
+<br>
+      nir_ssa_def *lower_x = nir_unpack_64_2x32_split_x(b, x);<br>
+<br>
+      return nir_pack_64_2x32_split(b, lower_x, new_upper);<br>
+   } else {<br>
+      return nir_ior(b, nir_iand(b, x, sign_mantissa_mask),<br>
+                        nir_bcsel(b, is_not_zero, exponent_value, zero));<br>
+   }<br>
+}<br>
+<br>
+static nir_ssa_def *<br>
+lower_frexp_exp(nir_builder *b, nir_ssa_def *x)<br>
+{<br>
+   nir_ssa_def *abs_x = nir_fabs(b, x);<br>
+   nir_ssa_def *zero = nir_imm_floatN_t(b, 0, x->bit_size);<br>
+   nir_ssa_def *is_not_zero = nir_fne(b, abs_x, zero);<br>
+   nir_ssa_def *exponent;<br>
+<br>
+   switch (x->bit_size) {<br>
+   case 16: {<br>
+      nir_ssa_def *exponent_shift = nir_imm_int(b, 10);<br>
+      nir_ssa_def *exponent_bias = nir_imm_intN_t(b, -14, 16);<br>
+<br>
+      /* Significand return must be of the same type as the input, but the<br>
+       * exponent must be a 32-bit integer.<br>
+       */<br>
+      exponent = nir_i2i32(b, nir_iadd(b, nir_ushr(b, abs_x, exponent_shift),<br>
+                              nir_bcsel(b, is_not_zero, exponent_bias, zero)));<br>
+      break;<br>
+   }<br>
+   case 32: {<br>
+      nir_ssa_def *exponent_shift = nir_imm_int(b, 23);<br>
+      nir_ssa_def *exponent_bias = nir_imm_int(b, -126);<br>
+<br>
+      exponent = nir_iadd(b, nir_ushr(b, abs_x, exponent_shift),<br>
+                             nir_bcsel(b, is_not_zero, exponent_bias, zero));<br>
+      break;<br>
+   }<br>
+   case 64: {<br>
+      nir_ssa_def *exponent_shift = nir_imm_int(b, 20);<br>
+      nir_ssa_def *exponent_bias = nir_imm_int(b, -1022);<br>
+<br>
+      nir_ssa_def *zero32 = nir_imm_float(b, 0.0f);<br></blockquote><div><br></div><div>Again, this should be an integer.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
+      nir_ssa_def *abs_upper_x = nir_unpack_64_2x32_split_y(b, abs_x);<br>
+<br>
+      exponent = nir_iadd(b, nir_ushr(b, abs_upper_x, exponent_shift),<br>
+                             nir_bcsel(b, is_not_zero, exponent_bias, zero32));<br>
+      break;<br>
+   }<br>
+   default:<br>
+      unreachable("Invalid bitsize");<br>
+   }<br>
+<br>
+   return exponent;<br></blockquote><div><br></div><div>Just return from within the switch.</div><div><br></div><div>With the above fixed,<br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
+}<br>
+<br>
+static nir_ssa_def *<br>
+lower_frexp(nir_builder *b, nir_alu_instr *alu_instr)<br>
+{<br>
+   switch (alu_instr->op) {<br>
+   case nir_op_frexp_sig:<br>
+      return lower_frexp_sig(b, nir_ssa_for_alu_src(b, alu_instr, 0));<br>
+   case nir_op_frexp_exp:<br>
+      return lower_frexp_exp(b, nir_ssa_for_alu_src(b, alu_instr, 0));<br>
+   default:<br>
+      break;<br>
+   }<br>
+   return NULL;<br>
+}<br></blockquote><div><br></div><div>No reason for a helper function.  Just inline it.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
+<br>
+static bool<br>
+lower_frexp_impl(nir_function_impl *impl)<br>
+{<br>
+   bool progress = false;<br>
+<br>
+   nir_builder b;<br>
+   nir_builder_init(&b, impl);<br>
+<br>
+   nir_foreach_block(block, impl) {<br>
+      nir_foreach_instr_safe(instr, block) {<br>
+         if (instr->type != nir_instr_type_alu)<br>
+            continue;<br>
+<br>
+         nir_alu_instr *alu_instr = nir_instr_as_alu(instr);<br>
+         b.cursor = nir_before_instr(instr);<br>
+<br>
+         nir_ssa_def *lower = lower_frexp(&b, alu_instr);<br>
+         if (!lower)<br>
+            continue;<br>
+<br>
+         nir_ssa_def_rewrite_uses(&alu_instr->dest.dest.ssa,<br>
+                                  nir_src_for_ssa(lower));<br>
+         nir_instr_remove(instr);<br>
+         progress = true;<br>
+      }<br>
+   }<br>
+<br>
+   return progress;<br>
+}<br>
+<br>
+bool<br>
+nir_lower_frexp(nir_shader *shader)<br>
+{<br>
+   bool progress = false;<br>
+<br>
+   nir_foreach_function(function, shader) {<br>
+      if (!function->impl)<br>
+         continue;<br>
+<br>
+      if (lower_frexp_impl(function->impl)) {<br>
+         progress = true;<br>
+         nir_metadata_preserve(function->impl, nir_metadata_block_index |<br>
+                                               nir_metadata_dominance);<br></blockquote><div><br></div><div>Metadata handling should go in the _impl function in case we ever want to call that function directly.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
+      }<br>
+   }<br>
+<br>
+   return progress;<br>
+}<br>
diff --git a/src/compiler/spirv/vtn_glsl450.c b/src/compiler/spirv/vtn_glsl450.c<br>
index 59ff4b88485..ead2afff1a0 100644<br>
--- a/src/compiler/spirv/vtn_glsl450.c<br>
+++ b/src/compiler/spirv/vtn_glsl450.c<br>
@@ -385,123 +385,6 @@ build_atan2(nir_builder *b, nir_ssa_def *y, nir_ssa_def *x)<br>
                     nir_fneg(b, arc), arc);<br>
 }<br>
<br>
-static nir_ssa_def *<br>
-build_frexp16(nir_builder *b, nir_ssa_def *x, nir_ssa_def **exponent)<br>
-{<br>
-   assert(x->bit_size == 16);<br>
-<br>
-   nir_ssa_def *abs_x = nir_fabs(b, x);<br>
-   nir_ssa_def *zero = nir_imm_floatN_t(b, 0, 16);<br>
-<br>
-   /* Half-precision floating-point values are stored as<br>
-    *   1 sign bit;<br>
-    *   5 exponent bits;<br>
-    *   10 mantissa bits.<br>
-    *<br>
-    * An exponent shift of 10 will shift the mantissa out, leaving only the<br>
-    * exponent and sign bit (which itself may be zero, if the absolute value<br>
-    * was taken before the bitcast and shift).<br>
-    */<br>
-   nir_ssa_def *exponent_shift = nir_imm_int(b, 10);<br>
-   nir_ssa_def *exponent_bias = nir_imm_intN_t(b, -14, 16);<br>
-<br>
-   nir_ssa_def *sign_mantissa_mask = nir_imm_intN_t(b, 0x83ffu, 16);<br>
-<br>
-   /* Exponent of floating-point values in the range [0.5, 1.0). */<br>
-   nir_ssa_def *exponent_value = nir_imm_intN_t(b, 0x3800u, 16);<br>
-<br>
-   nir_ssa_def *is_not_zero = nir_fne(b, abs_x, zero);<br>
-<br>
-   /* Significand return must be of the same type as the input, but the<br>
-    * exponent must be a 32-bit integer.<br>
-    */<br>
-   *exponent =<br>
-      nir_i2i32(b,<br>
-                nir_iadd(b, nir_ushr(b, abs_x, exponent_shift),<br>
-                            nir_bcsel(b, is_not_zero, exponent_bias, zero)));<br>
-<br>
-   return nir_ior(b, nir_iand(b, x, sign_mantissa_mask),<br>
-                     nir_bcsel(b, is_not_zero, exponent_value, zero));<br>
-}<br>
-<br>
-static nir_ssa_def *<br>
-build_frexp32(nir_builder *b, nir_ssa_def *x, nir_ssa_def **exponent)<br>
-{<br>
-   nir_ssa_def *abs_x = nir_fabs(b, x);<br>
-   nir_ssa_def *zero = nir_imm_float(b, 0.0f);<br>
-<br>
-   /* Single-precision floating-point values are stored as<br>
-    *   1 sign bit;<br>
-    *   8 exponent bits;<br>
-    *   23 mantissa bits.<br>
-    *<br>
-    * An exponent shift of 23 will shift the mantissa out, leaving only the<br>
-    * exponent and sign bit (which itself may be zero, if the absolute value<br>
-    * was taken before the bitcast and shift.<br>
-    */<br>
-   nir_ssa_def *exponent_shift = nir_imm_int(b, 23);<br>
-   nir_ssa_def *exponent_bias = nir_imm_int(b, -126);<br>
-<br>
-   nir_ssa_def *sign_mantissa_mask = nir_imm_int(b, 0x807fffffu);<br>
-<br>
-   /* Exponent of floating-point values in the range [0.5, 1.0). */<br>
-   nir_ssa_def *exponent_value = nir_imm_int(b, 0x3f000000u);<br>
-<br>
-   nir_ssa_def *is_not_zero = nir_fne(b, abs_x, zero);<br>
-<br>
-   *exponent =<br>
-      nir_iadd(b, nir_ushr(b, abs_x, exponent_shift),<br>
-                  nir_bcsel(b, is_not_zero, exponent_bias, zero));<br>
-<br>
-   return nir_ior(b, nir_iand(b, x, sign_mantissa_mask),<br>
-                     nir_bcsel(b, is_not_zero, exponent_value, zero));<br>
-}<br>
-<br>
-static nir_ssa_def *<br>
-build_frexp64(nir_builder *b, nir_ssa_def *x, nir_ssa_def **exponent)<br>
-{<br>
-   nir_ssa_def *abs_x = nir_fabs(b, x);<br>
-   nir_ssa_def *zero = nir_imm_double(b, 0.0);<br>
-   nir_ssa_def *zero32 = nir_imm_float(b, 0.0f);<br>
-<br>
-   /* Double-precision floating-point values are stored as<br>
-    *   1 sign bit;<br>
-    *   11 exponent bits;<br>
-    *   52 mantissa bits.<br>
-    *<br>
-    * We only need to deal with the exponent so first we extract the upper 32<br>
-    * bits using nir_unpack_64_2x32_split_y.<br>
-    */<br>
-   nir_ssa_def *upper_x = nir_unpack_64_2x32_split_y(b, x);<br>
-   nir_ssa_def *abs_upper_x = nir_unpack_64_2x32_split_y(b, abs_x);<br>
-<br>
-   /* An exponent shift of 20 will shift the remaining mantissa bits out,<br>
-    * leaving only the exponent and sign bit (which itself may be zero, if the<br>
-    * absolute value was taken before the bitcast and shift.<br>
-    */<br>
-   nir_ssa_def *exponent_shift = nir_imm_int(b, 20);<br>
-   nir_ssa_def *exponent_bias = nir_imm_int(b, -1022);<br>
-<br>
-   nir_ssa_def *sign_mantissa_mask = nir_imm_int(b, 0x800fffffu);<br>
-<br>
-   /* Exponent of floating-point values in the range [0.5, 1.0). */<br>
-   nir_ssa_def *exponent_value = nir_imm_int(b, 0x3fe00000u);<br>
-<br>
-   nir_ssa_def *is_not_zero = nir_fne(b, abs_x, zero);<br>
-<br>
-   *exponent =<br>
-      nir_iadd(b, nir_ushr(b, abs_upper_x, exponent_shift),<br>
-                  nir_bcsel(b, is_not_zero, exponent_bias, zero32));<br>
-<br>
-   nir_ssa_def *new_upper =<br>
-      nir_ior(b, nir_iand(b, upper_x, sign_mantissa_mask),<br>
-                 nir_bcsel(b, is_not_zero, exponent_value, zero32));<br>
-<br>
-   nir_ssa_def *lower_x = nir_unpack_64_2x32_split_x(b, x);<br>
-<br>
-   return nir_pack_64_2x32_split(b, lower_x, new_upper);<br>
-}<br>
-<br>
 static nir_op<br>
 vtn_nir_alu_op_for_spirv_glsl_opcode(struct vtn_builder *b,<br>
                                      enum GLSLstd450 opcode)<br>
@@ -782,28 +665,16 @@ handle_glsl450_alu(struct vtn_builder *b, enum GLSLstd450 entrypoint,<br>
       return;<br>
<br>
    case GLSLstd450Frexp: {<br>
-      nir_ssa_def *exponent;<br>
-      if (src[0]->bit_size == 64)<br>
-         val->ssa->def = build_frexp64(nb, src[0], &exponent);<br>
-      else if (src[0]->bit_size == 32)<br>
-         val->ssa->def = build_frexp32(nb, src[0], &exponent);<br>
-      else<br>
-         val->ssa->def = build_frexp16(nb, src[0], &exponent);<br>
+      nir_ssa_def *exponent = nir_frexp_exp(nb, src[0]);<br>
+      val->ssa->def = nir_frexp_sig(nb, src[0]);<br>
       nir_store_deref(nb, vtn_nir_deref(b, w[6]), exponent, 0xf);<br>
       return;<br>
    }<br>
<br>
    case GLSLstd450FrexpStruct: {<br>
       vtn_assert(glsl_type_is_struct_or_ifc(val->ssa->type));<br>
-      if (src[0]->bit_size == 64)<br>
-         val->ssa->elems[0]->def = build_frexp64(nb, src[0],<br>
-                                                 &val->ssa->elems[1]->def);<br>
-      else if (src[0]->bit_size == 32)<br>
-         val->ssa->elems[0]->def = build_frexp32(nb, src[0],<br>
-                                                 &val->ssa->elems[1]->def);<br>
-      else<br>
-         val->ssa->elems[0]->def = build_frexp16(nb, src[0],<br>
-                                                 &val->ssa->elems[1]->def);<br>
+      val->ssa->elems[0]->def = nir_frexp_sig(nb, src[0]);<br>
+      val->ssa->elems[1]->def = nir_frexp_exp(nb, src[0]);<br>
       return;<br>
    }<br>
<br>
diff --git a/src/freedreno/vulkan/tu_shader.c b/src/freedreno/vulkan/tu_shader.c<br>
index 2a70136ba7f..c2fdff9953e 100644<br>
--- a/src/freedreno/vulkan/tu_shader.c<br>
+++ b/src/freedreno/vulkan/tu_shader.c<br>
@@ -173,6 +173,7 @@ tu_shader_create(struct tu_device *dev,<br>
                             ir3_glsl_type_size);<br>
<br>
    NIR_PASS_V(nir, nir_lower_system_values);<br>
+   NIR_PASS_V(nir, nir_lower_frexp);<br>
    NIR_PASS_V(nir, nir_lower_io, nir_var_all, ir3_glsl_type_size, 0);<br>
<br>
    nir_shader_gather_info(nir, entry_point->impl);<br>
diff --git a/src/gallium/drivers/freedreno/ir3/ir3_cmdline.c b/src/gallium/drivers/freedreno/ir3/ir3_cmdline.c<br>
index 2892e7c9c8d..1481c08df14 100644<br>
--- a/src/gallium/drivers/freedreno/ir3/ir3_cmdline.c<br>
+++ b/src/gallium/drivers/freedreno/ir3/ir3_cmdline.c<br>
@@ -181,6 +181,7 @@ load_glsl(unsigned num_files, char* const* files, gl_shader_stage stage)<br>
                        ir3_glsl_type_size);<br>
<br>
        NIR_PASS_V(nir, nir_lower_system_values);<br>
+       NIR_PASS_V(nir, nir_lower_frexp);<br>
        NIR_PASS_V(nir, nir_lower_io, nir_var_all, ir3_glsl_type_size, 0);<br>
        NIR_PASS_V(nir, gl_nir_lower_samplers, prog);<br>
<br>
diff --git a/src/intel/vulkan/anv_pipeline.c b/src/intel/vulkan/anv_pipeline.c<br>
index e9319f5efef..90942a4524a 100644<br>
--- a/src/intel/vulkan/anv_pipeline.c<br>
+++ b/src/intel/vulkan/anv_pipeline.c<br>
@@ -226,6 +226,8 @@ anv_shader_compile_to_nir(struct anv_device *device,<br>
    NIR_PASS_V(nir, nir_lower_io_to_temporaries,<br>
               entry_point->impl, true, false);<br>
<br>
+   NIR_PASS_V(nir, nir_lower_frexp);<br>
+<br>
    /* Vulkan uses the separate-shader linking model */<br>
    nir->info.separate_shader = true;<br>
<br>
-- <br>
2.21.0<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></blockquote></div></div>