[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