[Mesa-dev] [PATCH v2 2/2] st/glsl_to_tgsi: fix 64-bit integer bit shifts

Marek Olšák maraeo at gmail.com
Fri Mar 31 08:56:29 UTC 2017


For the series:

Reviewed-by: Marek Olšák <marek.olsak at amd.com>

Marek

On Fri, Mar 31, 2017 at 10:03 AM, Nicolai Hähnle <nhaehnle at gmail.com> wrote:
> From: Nicolai Hähnle <nicolai.haehnle at amd.com>
>
> Fix a bug that was caused by a type mismatch in the shfit count between
> GLSL and TGSI. I briefly considered adjusting the TGSI semantics, but
> since both LLVM and AMD GCN require both arguments to be of the same type,
> it makes more sense to keep TGSI as-is -- it reflects the underlying
> implementation better.
>
> I'm also sending out piglit tests that expose this error.
>
> v2: use the right number of components for the temporary register
> ---
> There are vector-by-vector shifts, so a full vec4 may be needed, but
> let's do without when we can.
> ---
>  src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 20 +++++++++++++++-----
>  1 file changed, 15 insertions(+), 5 deletions(-)
>
> diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> index 369dff7..7da08da 100644
> --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> @@ -2095,27 +2095,37 @@ glsl_to_tgsi_visitor::visit_expression(ir_expression* ir, st_src_reg *op)
>        if (native_integers) {
>           emit_asm(ir, TGSI_OPCODE_NOT, result_dst, op[0]);
>           break;
>        }
>     case ir_unop_u2f:
>        if (native_integers) {
>           emit_asm(ir, TGSI_OPCODE_U2F, result_dst, op[0]);
>           break;
>        }
>     case ir_binop_lshift:
> -      if (native_integers) {
> -         emit_asm(ir, TGSI_OPCODE_SHL, result_dst, op[0], op[1]);
> -         break;
> -      }
>     case ir_binop_rshift:
>        if (native_integers) {
> -         emit_asm(ir, TGSI_OPCODE_ISHR, result_dst, op[0], op[1]);
> +         unsigned opcode = ir->operation == ir_binop_lshift ? TGSI_OPCODE_SHL
> +                                                            : TGSI_OPCODE_ISHR;
> +         st_src_reg count;
> +
> +         if (glsl_base_type_is_64bit(op[0].type)) {
> +            /* GLSL shift operations have 32-bit shift counts, but TGSI uses
> +             * 64 bits.
> +             */
> +            count = get_temp(glsl_type::u64vec(ir->operands[1]->type->components()));
> +            emit_asm(ir, TGSI_OPCODE_U2I64, st_dst_reg(count), op[1]);
> +         } else {
> +            count = op[1];
> +         }
> +
> +         emit_asm(ir, opcode, result_dst, op[0], count);
>           break;
>        }
>     case ir_binop_bit_and:
>        if (native_integers) {
>           emit_asm(ir, TGSI_OPCODE_AND, result_dst, op[0], op[1]);
>           break;
>        }
>     case ir_binop_bit_xor:
>        if (native_integers) {
>           emit_asm(ir, TGSI_OPCODE_XOR, result_dst, op[0], op[1]);
> --
> 2.9.3
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list