mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-21 13:40:16 +01:00
i965: Implement b2f and b2i using negation.
Booleans are represented as 0/-1 on modern hardware which means we can just negate them to convert them into a numeric type. Negation has the benefit that it can be implemented using a source modifier which can easily be propagated into some other instruction. shader-db results on HSW: total instructions in shared programs: 6349082 -> 6346693 (-0.04%) instructions in affected programs: 40948 -> 38559 (-5.83%) helped: 123 HURT: 1 GAINED: 1 LOST: 0 Reviewed-by: Matt Turner <mattst88@gmail.com>
This commit is contained in:
parent
8fba933ca2
commit
3ee2daf23d
2 changed files with 2 additions and 9 deletions
|
|
@ -968,10 +968,8 @@ fs_visitor::nir_emit_alu(const fs_builder &bld, nir_alu_instr *instr)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case nir_op_b2i:
|
case nir_op_b2i:
|
||||||
bld.AND(result, op[0], fs_reg(1));
|
|
||||||
break;
|
|
||||||
case nir_op_b2f:
|
case nir_op_b2f:
|
||||||
bld.AND(retype(result, BRW_REGISTER_TYPE_UD), op[0], fs_reg(0x3f800000u));
|
bld.MOV(result, negate(op[0]));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case nir_op_f2b:
|
case nir_op_f2b:
|
||||||
|
|
|
||||||
|
|
@ -1733,16 +1733,11 @@ vec4_visitor::visit(ir_expression *ir)
|
||||||
emit(MOV(result_dst, op[0]));
|
emit(MOV(result_dst, op[0]));
|
||||||
break;
|
break;
|
||||||
case ir_unop_b2i:
|
case ir_unop_b2i:
|
||||||
emit(AND(result_dst, op[0], src_reg(1)));
|
|
||||||
break;
|
|
||||||
case ir_unop_b2f:
|
case ir_unop_b2f:
|
||||||
if (devinfo->gen <= 5) {
|
if (devinfo->gen <= 5) {
|
||||||
resolve_bool_comparison(ir->operands[0], &op[0]);
|
resolve_bool_comparison(ir->operands[0], &op[0]);
|
||||||
}
|
}
|
||||||
op[0].type = BRW_REGISTER_TYPE_D;
|
emit(MOV(result_dst, negate(op[0])));
|
||||||
result_dst.type = BRW_REGISTER_TYPE_D;
|
|
||||||
emit(AND(result_dst, op[0], src_reg(0x3f800000u)));
|
|
||||||
result_dst.type = BRW_REGISTER_TYPE_F;
|
|
||||||
break;
|
break;
|
||||||
case ir_unop_f2b:
|
case ir_unop_f2b:
|
||||||
emit(CMP(result_dst, op[0], src_reg(0.0f), BRW_CONDITIONAL_NZ));
|
emit(CMP(result_dst, op[0], src_reg(0.0f), BRW_CONDITIONAL_NZ));
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue