glsl_to_tgsi: don't use the negate modifier in integer ops after bitcast

This bug is uncovered by glsl/lower_if_to_cond_assign.
I don't know if it can be reproduced in any other way.

Cc: <mesa-stable@lists.freedesktop.org>
Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
This commit is contained in:
Marek Olšák 2016-07-03 14:33:55 +02:00
parent e300696304
commit ead7736821
1 changed files with 7 additions and 5 deletions

View File

@ -1958,12 +1958,14 @@ glsl_to_tgsi_visitor::visit_expression(ir_expression* ir, st_src_reg *op)
emit_asm(ir, TGSI_OPCODE_TRUNC, result_dst, op[0]);
break;
case ir_unop_bitcast_f2i:
result_src = op[0];
result_src.type = GLSL_TYPE_INT;
break;
case ir_unop_bitcast_f2u:
result_src = op[0];
result_src.type = GLSL_TYPE_UINT;
/* Make sure we don't propagate the negate modifier to integer opcodes. */
if (op[0].negate)
emit_asm(ir, TGSI_OPCODE_MOV, result_dst, op[0]);
else
result_src = op[0];
result_src.type = ir->operation == ir_unop_bitcast_f2i ? GLSL_TYPE_INT :
GLSL_TYPE_UINT;
break;
case ir_unop_bitcast_i2f:
case ir_unop_bitcast_u2f: