[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