From 7325f699dbd7e44a07f10937d5d6f54ccbde2ecb Mon Sep 17 00:00:00 2001 From: Emma Anholt Date: Wed, 22 Mar 2023 14:07:09 -0700 Subject: [PATCH] glsl: Drop frontend lowering of 32-bit frexp. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit All the users should now be calling the appropriate NIR lowering function. Reviewed-by: Alyssa Rosenzweig Reviewed-by: Marek Olšák Part-of: --- src/compiler/glsl/builtin_functions.cpp | 63 +++---------------- src/compiler/glsl/ir_validate.cpp | 1 - .../glsl/tests/lower_precision_test.py | 2 +- 3 files changed, 9 insertions(+), 57 deletions(-) diff --git a/src/compiler/glsl/builtin_functions.cpp b/src/compiler/glsl/builtin_functions.cpp index c8279809853..97e37e49f4d 100644 --- a/src/compiler/glsl/builtin_functions.cpp +++ b/src/compiler/glsl/builtin_functions.cpp @@ -4753,10 +4753,10 @@ builtin_builder::create_builtins() _frexp(glsl_type::vec2_type, glsl_type::ivec2_type), _frexp(glsl_type::vec3_type, glsl_type::ivec3_type), _frexp(glsl_type::vec4_type, glsl_type::ivec4_type), - _dfrexp(glsl_type::double_type, glsl_type::int_type), - _dfrexp(glsl_type::dvec2_type, glsl_type::ivec2_type), - _dfrexp(glsl_type::dvec3_type, glsl_type::ivec3_type), - _dfrexp(glsl_type::dvec4_type, glsl_type::ivec4_type), + _frexp(glsl_type::double_type, glsl_type::int_type), + _frexp(glsl_type::dvec2_type, glsl_type::ivec2_type), + _frexp(glsl_type::dvec3_type, glsl_type::ivec3_type), + _frexp(glsl_type::dvec4_type, glsl_type::ivec4_type), NULL); add_function("uaddCarry", _uaddCarry(glsl_type::uint_type), @@ -7768,11 +7768,13 @@ builtin_builder::_ldexp(const glsl_type *x_type, const glsl_type *exp_type) } ir_function_signature * -builtin_builder::_dfrexp(const glsl_type *x_type, const glsl_type *exp_type) +builtin_builder::_frexp(const glsl_type *x_type, const glsl_type *exp_type) { ir_variable *x = in_highp_var(x_type, "x"); ir_variable *exponent = out_var(exp_type, "exp"); - MAKE_SIG(x_type, fp64, 2, x, exponent); + MAKE_SIG(x_type, x_type->is_double() ? fp64 : gpu_shader5_or_es31_or_integer_functions, + 2, x, exponent); + sig->return_precision = GLSL_PRECISION_HIGH; body.emit(assign(exponent, expr(ir_unop_frexp_exp, x))); @@ -7780,55 +7782,6 @@ builtin_builder::_dfrexp(const glsl_type *x_type, const glsl_type *exp_type) return sig; } -ir_function_signature * -builtin_builder::_frexp(const glsl_type *x_type, const glsl_type *exp_type) -{ - ir_variable *x = in_highp_var(x_type, "x"); - ir_variable *exponent = out_highp_var(exp_type, "exp"); - MAKE_SIG(x_type, gpu_shader5_or_es31_or_integer_functions, 2, x, exponent); - sig->return_precision = GLSL_PRECISION_HIGH; - - const unsigned vec_elem = x_type->vector_elements; - const glsl_type *bvec = glsl_type::get_instance(GLSL_TYPE_BOOL, vec_elem, 1); - const glsl_type *uvec = glsl_type::get_instance(GLSL_TYPE_UINT, vec_elem, 1); - - /* Single-precision floating-point values are stored as - * 1 sign bit; - * 8 exponent bits; - * 23 mantissa bits. - * - * An exponent shift of 23 will shift the mantissa out, leaving only the - * exponent and sign bit (which itself may be zero, if the absolute value - * was taken before the bitcast and shift. - */ - ir_constant *exponent_shift = imm(23); - ir_constant *exponent_bias = imm(-126, vec_elem); - - ir_constant *sign_mantissa_mask = imm(0x807fffffu, vec_elem); - - /* Exponent of floating-point values in the range [0.5, 1.0). */ - ir_constant *exponent_value = imm(0x3f000000u, vec_elem); - - ir_variable *is_not_zero = body.make_temp(bvec, "is_not_zero"); - body.emit(assign(is_not_zero, nequal(abs(x), imm(0.0f, vec_elem)))); - - /* Since abs(x) ensures that the sign bit is zero, we don't need to bitcast - * to unsigned integers to ensure that 1 bits aren't shifted in. - */ - body.emit(assign(exponent, rshift(bitcast_f2i(abs(x)), exponent_shift))); - body.emit(assign(exponent, add(exponent, csel(is_not_zero, exponent_bias, - imm(0, vec_elem))))); - - ir_variable *bits = body.make_temp(uvec, "bits"); - body.emit(assign(bits, bitcast_f2u(x))); - body.emit(assign(bits, bit_and(bits, sign_mantissa_mask))); - body.emit(assign(bits, bit_or(bits, csel(is_not_zero, exponent_value, - imm(0u, vec_elem))))); - body.emit(ret(bitcast_u2f(bits))); - - return sig; -} - ir_function_signature * builtin_builder::_uaddCarry(const glsl_type *type) { diff --git a/src/compiler/glsl/ir_validate.cpp b/src/compiler/glsl/ir_validate.cpp index decb4d20a0e..de431cc6e53 100644 --- a/src/compiler/glsl/ir_validate.cpp +++ b/src/compiler/glsl/ir_validate.cpp @@ -696,7 +696,6 @@ ir_validate::visit_leave(ir_expression *ir) case ir_unop_frexp_sig: assert(ir->operands[0]->type->is_float_32_64()); - assert(ir->type->is_double()); break; case ir_unop_frexp_exp: assert(ir->operands[0]->type->is_float_32_64()); diff --git a/src/compiler/glsl/tests/lower_precision_test.py b/src/compiler/glsl/tests/lower_precision_test.py index 95de388c215..7e4f4921424 100644 --- a/src/compiler/glsl/tests/lower_precision_test.py +++ b/src/compiler/glsl/tests/lower_precision_test.py @@ -981,7 +981,7 @@ TESTS = [ color2 = y + 1; } """, - r'assign \(x\) \(var_ref compiler_temp@2\) \(expression uint bitcast_f2u \(expression float f162f'), + r'expression int16_t i2imp \(expression int frexp_exp \(expression float f162f'), Test("ldexp", """ #version 310 es