st/glsl_to_tgsi: fix 64-bit integer bit shifts
Fix a bug that was caused by a type mismatch in the shift 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 Reviewed-by: Marek Olšák <marek.olsak@amd.com>
This commit is contained in:
@@ -2102,13 +2102,23 @@ glsl_to_tgsi_visitor::visit_expression(ir_expression* ir, st_src_reg *op)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case ir_binop_lshift:
|
case ir_binop_lshift:
|
||||||
if (native_integers) {
|
|
||||||
emit_asm(ir, TGSI_OPCODE_SHL, result_dst, op[0], op[1]);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case ir_binop_rshift:
|
case ir_binop_rshift:
|
||||||
if (native_integers) {
|
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;
|
break;
|
||||||
}
|
}
|
||||||
case ir_binop_bit_and:
|
case ir_binop_bit_and:
|
||||||
|
Reference in New Issue
Block a user