[Mesa-dev] [PATCH 10/50] glsl: Add "built-in" functions to do uint_to_fp64(uint)

Dave Airlie airlied at gmail.com
Tue Mar 13 04:24:35 UTC 2018


From: Elie Tournier <tournier.elie at gmail.com>

Signed-off-by: Elie Tournier <elie.tournier at collabora.com>
---
 src/compiler/glsl/builtin_float64.h     | 71 +++++++++++++++++++++++++++++++++
 src/compiler/glsl/builtin_functions.cpp |  4 ++
 src/compiler/glsl/builtin_functions.h   |  3 ++
 src/compiler/glsl/float64.glsl          | 22 ++++++++++
 src/compiler/glsl/glcpp/glcpp-parse.y   |  1 +
 5 files changed, 101 insertions(+)

diff --git a/src/compiler/glsl/builtin_float64.h b/src/compiler/glsl/builtin_float64.h
index 2dcaba40..c200447 100644
--- a/src/compiler/glsl/builtin_float64.h
+++ b/src/compiler/glsl/builtin_float64.h
@@ -5283,3 +5283,74 @@ fp64_to_uint(void *mem_ctx, builtin_available_predicate avail)
    sig->replace_parameters(&sig_parameters);
    return sig;
 }
+ir_function_signature *
+uint_to_fp64(void *mem_ctx, builtin_available_predicate avail)
+{
+   ir_function_signature *const sig =
+      new(mem_ctx) ir_function_signature(glsl_type::uvec2_type, avail);
+   ir_factory body(&sig->body, mem_ctx);
+   sig->is_defined = true;
+
+   exec_list sig_parameters;
+
+   ir_variable *const r0872 = new(mem_ctx) ir_variable(glsl_type::uint_type, "a", ir_var_function_in);
+   sig_parameters.push_tail(r0872);
+   ir_variable *const r0873 = body.make_temp(glsl_type::uvec2_type, "return_value");
+   /* IF CONDITION */
+   ir_expression *const r0875 = equal(r0872, body.constant(0u));
+   ir_if *f0874 = new(mem_ctx) ir_if(operand(r0875).val);
+   exec_list *const f0874_parent_instructions = body.instructions;
+
+      /* THEN INSTRUCTIONS */
+      body.instructions = &f0874->then_instructions;
+
+      body.emit(assign(r0873, ir_constant::zero(mem_ctx, glsl_type::uvec2_type), 0x03));
+
+
+      /* ELSE INSTRUCTIONS */
+      body.instructions = &f0874->else_instructions;
+
+      ir_variable *const r0876 = body.make_temp(glsl_type::int_type, "assignment_tmp");
+      ir_expression *const r0877 = equal(r0872, body.constant(0u));
+      ir_expression *const r0878 = expr(ir_unop_find_msb, r0872);
+      ir_expression *const r0879 = sub(body.constant(int(31)), r0878);
+      ir_expression *const r087A = expr(ir_triop_csel, r0877, body.constant(int(32)), r0879);
+      body.emit(assign(r0876, add(r087A, body.constant(int(21))), 0x01));
+
+      ir_variable *const r087B = new(mem_ctx) ir_variable(glsl_type::uvec2_type, "z", ir_var_auto);
+      body.emit(r087B);
+      ir_expression *const r087C = sub(body.constant(int(1074)), r0876);
+      ir_expression *const r087D = expr(ir_unop_i2u, r087C);
+      ir_expression *const r087E = lshift(r087D, body.constant(int(20)));
+      ir_expression *const r087F = less(r0876, body.constant(int(32)));
+      ir_expression *const r0880 = neg(r0876);
+      ir_expression *const r0881 = bit_and(r0880, body.constant(int(31)));
+      ir_expression *const r0882 = rshift(r0872, r0881);
+      ir_expression *const r0883 = equal(r0876, body.constant(int(0)));
+      ir_expression *const r0884 = less(r0876, body.constant(int(64)));
+      ir_expression *const r0885 = add(r0876, body.constant(int(-32)));
+      ir_expression *const r0886 = lshift(r0872, r0885);
+      ir_expression *const r0887 = expr(ir_triop_csel, r0884, r0886, body.constant(0u));
+      ir_expression *const r0888 = expr(ir_triop_csel, r0883, body.constant(0u), r0887);
+      ir_expression *const r0889 = expr(ir_triop_csel, r087F, r0882, r0888);
+      body.emit(assign(r087B, add(r087E, r0889), 0x02));
+
+      ir_expression *const r088A = less(r0876, body.constant(int(32)));
+      ir_expression *const r088B = lshift(r0872, r0876);
+      ir_expression *const r088C = equal(r0876, body.constant(int(0)));
+      ir_expression *const r088D = expr(ir_triop_csel, r088C, r0872, body.constant(0u));
+      body.emit(assign(r087B, expr(ir_triop_csel, r088A, r088B, r088D), 0x01));
+
+      body.emit(assign(r0873, r087B, 0x03));
+
+
+   body.instructions = f0874_parent_instructions;
+   body.emit(f0874);
+
+   /* END IF */
+
+   body.emit(ret(r0873));
+
+   sig->replace_parameters(&sig_parameters);
+   return sig;
+}
diff --git a/src/compiler/glsl/builtin_functions.cpp b/src/compiler/glsl/builtin_functions.cpp
index a0fc9bc..20051b1 100644
--- a/src/compiler/glsl/builtin_functions.cpp
+++ b/src/compiler/glsl/builtin_functions.cpp
@@ -3374,6 +3374,10 @@ builtin_builder::create_builtins()
                 generate_ir::fp64_to_uint(mem_ctx, integer_functions_supported),
                 NULL);
 
+   add_function("__builtin_uint_to_fp64",
+                generate_ir::uint_to_fp64(mem_ctx, integer_functions_supported),
+                NULL);
+
 #undef F
 #undef FI
 #undef FIUD_VEC
diff --git a/src/compiler/glsl/builtin_functions.h b/src/compiler/glsl/builtin_functions.h
index f99e3b7..a9674dc 100644
--- a/src/compiler/glsl/builtin_functions.h
+++ b/src/compiler/glsl/builtin_functions.h
@@ -91,6 +91,9 @@ fmul64(void *mem_ctx, builtin_available_predicate avail);
 ir_function_signature *
 fp64_to_uint(void *mem_ctx, builtin_available_predicate avail);
 
+ir_function_signature *
+uint_to_fp64(void *mem_ctx, builtin_available_predicate avail);
+
 }
 
 #endif /* BULITIN_FUNCTIONS_H */
diff --git a/src/compiler/glsl/float64.glsl b/src/compiler/glsl/float64.glsl
index a738b60..befaf29 100644
--- a/src/compiler/glsl/float64.glsl
+++ b/src/compiler/glsl/float64.glsl
@@ -790,3 +790,25 @@ fp64_to_uint(uvec2 a)
 
    return mix(z, expt, (aSign != 0u) && (z != 0u));
 }
+
+uvec2
+uint_to_fp64(uint a)
+{
+   if (a == 0u)
+      return uvec2(0u, 0u);
+
+   int shiftDist = countLeadingZeros32(a) + 21;
+
+   uint aHigh = 0u;
+   uint aLow = 0u;
+   int negCount = (- shiftDist) & 31;
+
+   aHigh = mix(0u, a<< shiftDist - 32, shiftDist < 64);
+   aLow = 0u;
+   aHigh = mix(aHigh, 0u, shiftDist == 0);
+   aLow = mix(aLow, a, shiftDist ==0);
+   aHigh = mix(aHigh, a >> negCount, shiftDist < 32);
+   aLow = mix(aLow, a << shiftDist, shiftDist < 32);
+
+   return packFloat64(0u, 0x432 - shiftDist, aHigh, aLow);
+}
diff --git a/src/compiler/glsl/glcpp/glcpp-parse.y b/src/compiler/glsl/glcpp/glcpp-parse.y
index 37ab758..826ed01 100644
--- a/src/compiler/glsl/glcpp/glcpp-parse.y
+++ b/src/compiler/glsl/glcpp/glcpp-parse.y
@@ -2376,6 +2376,7 @@ _glcpp_parser_handle_version_declaration(glcpp_parser_t *parser, intmax_t versio
          add_builtin_define(parser, "__have_builtin_builtin_fadd64", 1);
          add_builtin_define(parser, "__have_builtin_builtin_fmul64", 1);
          add_builtin_define(parser, "__have_builtin_builtin_fp64_to_uint", 1);
+         add_builtin_define(parser, "__have_builtin_builtin_uint_to_fp64", 1);
       }
    }
 
-- 
2.9.5



More information about the mesa-dev mailing list