[Mesa-dev] [PATCH 16/50] glsl: Add "built-in" functions to do trunc(fp64) (v2)
Dave Airlie
airlied at gmail.com
Tue Mar 13 04:24:41 UTC 2018
From: Elie Tournier <tournier.elie at gmail.com>
v2: use mix.
Signed-off-by: Elie Tournier <elie.tournier at collabora.com>
---
src/compiler/glsl/builtin_float64.h | 62 +++++++++++++++++++++++++++++++++
src/compiler/glsl/builtin_functions.cpp | 4 +++
src/compiler/glsl/builtin_functions.h | 3 ++
src/compiler/glsl/float64.glsl | 21 +++++++++++
src/compiler/glsl/glcpp/glcpp-parse.y | 1 +
5 files changed, 91 insertions(+)
diff --git a/src/compiler/glsl/builtin_float64.h b/src/compiler/glsl/builtin_float64.h
index 6fbe12d..f0222e1 100644
--- a/src/compiler/glsl/builtin_float64.h
+++ b/src/compiler/glsl/builtin_float64.h
@@ -6635,3 +6635,65 @@ fsqrt64(void *mem_ctx, builtin_available_predicate avail)
sig->replace_parameters(&sig_parameters);
return sig;
}
+ir_function_signature *
+ftrunc64(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 r0A28 = new(mem_ctx) ir_variable(glsl_type::uvec2_type, "a", ir_var_function_in);
+ sig_parameters.push_tail(r0A28);
+ ir_variable *const r0A29 = new(mem_ctx) ir_variable(glsl_type::uint_type, "zHi", ir_var_auto);
+ body.emit(r0A29);
+ ir_variable *const r0A2A = new(mem_ctx) ir_variable(glsl_type::uint_type, "zLo", ir_var_auto);
+ body.emit(r0A2A);
+ ir_variable *const r0A2B = body.make_temp(glsl_type::int_type, "assignment_tmp");
+ ir_expression *const r0A2C = rshift(swizzle_y(r0A28), body.constant(int(20)));
+ ir_expression *const r0A2D = bit_and(r0A2C, body.constant(2047u));
+ ir_expression *const r0A2E = expr(ir_unop_u2i, r0A2D);
+ body.emit(assign(r0A2B, add(r0A2E, body.constant(int(-1023))), 0x01));
+
+ ir_variable *const r0A2F = body.make_temp(glsl_type::int_type, "assignment_tmp");
+ body.emit(assign(r0A2F, sub(body.constant(int(52)), r0A2B), 0x01));
+
+ ir_expression *const r0A30 = gequal(r0A2F, body.constant(int(32)));
+ ir_expression *const r0A31 = lshift(body.constant(4294967295u), r0A2F);
+ ir_expression *const r0A32 = expr(ir_triop_csel, r0A30, body.constant(0u), r0A31);
+ body.emit(assign(r0A2A, bit_and(r0A32, swizzle_x(r0A28)), 0x01));
+
+ ir_expression *const r0A33 = less(r0A2F, body.constant(int(33)));
+ ir_expression *const r0A34 = add(r0A2F, body.constant(int(-32)));
+ ir_expression *const r0A35 = lshift(body.constant(4294967295u), r0A34);
+ ir_expression *const r0A36 = expr(ir_triop_csel, r0A33, body.constant(4294967295u), r0A35);
+ body.emit(assign(r0A29, bit_and(r0A36, swizzle_y(r0A28)), 0x01));
+
+ ir_variable *const r0A37 = body.make_temp(glsl_type::uint_type, "mix_retval");
+ ir_expression *const r0A38 = less(body.constant(int(52)), r0A2B);
+ ir_expression *const r0A39 = less(r0A2B, body.constant(int(0)));
+ ir_expression *const r0A3A = expr(ir_triop_csel, r0A39, body.constant(0u), r0A2A);
+ body.emit(assign(r0A37, expr(ir_triop_csel, r0A38, swizzle_x(r0A28), r0A3A), 0x01));
+
+ body.emit(assign(r0A2A, r0A37, 0x01));
+
+ ir_variable *const r0A3B = body.make_temp(glsl_type::uint_type, "mix_retval");
+ ir_expression *const r0A3C = less(body.constant(int(52)), r0A2B);
+ ir_expression *const r0A3D = less(r0A2B, body.constant(int(0)));
+ ir_expression *const r0A3E = expr(ir_triop_csel, r0A3D, body.constant(0u), r0A29);
+ body.emit(assign(r0A3B, expr(ir_triop_csel, r0A3C, swizzle_y(r0A28), r0A3E), 0x01));
+
+ body.emit(assign(r0A29, r0A3B, 0x01));
+
+ ir_variable *const r0A3F = body.make_temp(glsl_type::uvec2_type, "vec_ctor");
+ body.emit(assign(r0A3F, r0A37, 0x01));
+
+ body.emit(assign(r0A3F, r0A3B, 0x02));
+
+ body.emit(ret(r0A3F));
+
+ sig->replace_parameters(&sig_parameters);
+ return sig;
+}
diff --git a/src/compiler/glsl/builtin_functions.cpp b/src/compiler/glsl/builtin_functions.cpp
index d919873..02618e0 100644
--- a/src/compiler/glsl/builtin_functions.cpp
+++ b/src/compiler/glsl/builtin_functions.cpp
@@ -3398,6 +3398,10 @@ builtin_builder::create_builtins()
generate_ir::fsqrt64(mem_ctx, integer_functions_supported),
NULL);
+ add_function("__builtin_ftrunc64",
+ generate_ir::ftrunc64(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 2f72f51..4a6b922 100644
--- a/src/compiler/glsl/builtin_functions.h
+++ b/src/compiler/glsl/builtin_functions.h
@@ -109,6 +109,9 @@ fp32_to_fp64(void *mem_ctx, builtin_available_predicate avail);
ir_function_signature *
fsqrt64(void *mem_ctx, builtin_available_predicate avail);
+ir_function_signature *
+ftrunc64(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 c03f0f6..d47a9bd 100644
--- a/src/compiler/glsl/float64.glsl
+++ b/src/compiler/glsl/float64.glsl
@@ -1289,3 +1289,24 @@ fsqrt64(uvec2 a)
return fp32_to_fp64(sqrt(fp64_to_fp32(a)));
}
+
+uvec2
+ftrunc64(uvec2 a)
+{
+ int aExp = extractFloat64Exp(a);
+ uint zLo;
+ uint zHi;
+
+ int unbiasedExp = aExp - 1023;
+ int fracBits = 52 - unbiasedExp;
+ uint maskLo = mix(~0u << fracBits, 0u, fracBits >= 32);
+ uint maskHi = mix(~0u << (fracBits - 32), ~0u, fracBits < 33);
+ zLo = maskLo & a.x;
+ zHi = maskHi & a.y;
+
+ zLo = mix(zLo, 0u, unbiasedExp < 0);
+ zHi = mix(zHi, 0u, unbiasedExp < 0);
+ zLo = mix(zLo, a.x, unbiasedExp > 52);
+ zHi = mix(zHi, a.y, unbiasedExp > 52);
+ return uvec2(zLo, zHi);
+}
diff --git a/src/compiler/glsl/glcpp/glcpp-parse.y b/src/compiler/glsl/glcpp/glcpp-parse.y
index d2411c5..6d8156e 100644
--- a/src/compiler/glsl/glcpp/glcpp-parse.y
+++ b/src/compiler/glsl/glcpp/glcpp-parse.y
@@ -2382,6 +2382,7 @@ _glcpp_parser_handle_version_declaration(glcpp_parser_t *parser, intmax_t versio
add_builtin_define(parser, "__have_builtin_builtin_fp64_to_fp32", 1);
add_builtin_define(parser, "__have_builtin_builtin_fp32_to_fp64", 1);
add_builtin_define(parser, "__have_builtin_builtin_fsqrt64", 1);
+ add_builtin_define(parser, "__have_builtin_builtin_ftrunc64", 1);
}
}
--
2.9.5
More information about the mesa-dev
mailing list