ir3: lower relevant 8-bit ALU ops in nir_lower_bit_size
The nir_lower_bit_size pass is used to properly adapt specific 8-bit ALU operations for correct behavior. In those cases inputs are converted to 16 bits and the result is converted back down to 8 bits. Signed-off-by: Zan Dobersek <zdobersek@igalia.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/29875>
This commit is contained in:
@@ -161,21 +161,48 @@ ir3_nir_should_vectorize_mem(unsigned align_mul, unsigned align_offset,
|
|||||||
static unsigned
|
static unsigned
|
||||||
ir3_lower_bit_size(const nir_instr *instr, UNUSED void *data)
|
ir3_lower_bit_size(const nir_instr *instr, UNUSED void *data)
|
||||||
{
|
{
|
||||||
if (instr->type != nir_instr_type_intrinsic)
|
if (instr->type == nir_instr_type_intrinsic) {
|
||||||
return 0;
|
nir_intrinsic_instr *intrinsic = nir_instr_as_intrinsic(instr);
|
||||||
|
switch (intrinsic->intrinsic) {
|
||||||
|
case nir_intrinsic_exclusive_scan:
|
||||||
|
case nir_intrinsic_inclusive_scan:
|
||||||
|
case nir_intrinsic_quad_broadcast:
|
||||||
|
case nir_intrinsic_quad_swap_diagonal:
|
||||||
|
case nir_intrinsic_quad_swap_horizontal:
|
||||||
|
case nir_intrinsic_quad_swap_vertical:
|
||||||
|
case nir_intrinsic_reduce:
|
||||||
|
return intrinsic->def.bit_size == 8 ? 16 : 0;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
nir_intrinsic_instr *intrinsic = nir_instr_as_intrinsic(instr);
|
if (instr->type == nir_instr_type_alu) {
|
||||||
switch (intrinsic->intrinsic) {
|
nir_alu_instr *alu = nir_instr_as_alu(instr);
|
||||||
case nir_intrinsic_exclusive_scan:
|
switch (alu->op) {
|
||||||
case nir_intrinsic_inclusive_scan:
|
case nir_op_iabs:
|
||||||
case nir_intrinsic_quad_broadcast:
|
case nir_op_iadd_sat:
|
||||||
case nir_intrinsic_quad_swap_diagonal:
|
case nir_op_imax:
|
||||||
case nir_intrinsic_quad_swap_horizontal:
|
case nir_op_imin:
|
||||||
case nir_intrinsic_quad_swap_vertical:
|
case nir_op_ineg:
|
||||||
case nir_intrinsic_reduce:
|
case nir_op_ishl:
|
||||||
return intrinsic->def.bit_size == 8 ? 16 : 0;
|
case nir_op_ishr:
|
||||||
default:
|
case nir_op_isub_sat:
|
||||||
break;
|
case nir_op_uadd_sat:
|
||||||
|
case nir_op_umax:
|
||||||
|
case nir_op_umin:
|
||||||
|
case nir_op_ushr:
|
||||||
|
return alu->def.bit_size == 8 ? 16 : 0;
|
||||||
|
case nir_op_ieq:
|
||||||
|
case nir_op_ige:
|
||||||
|
case nir_op_ilt:
|
||||||
|
case nir_op_ine:
|
||||||
|
case nir_op_uge:
|
||||||
|
case nir_op_ult:
|
||||||
|
return nir_src_bit_size(alu->src[0].src) == 8 ? 16 : 0;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
Reference in New Issue
Block a user