ir_to_mesa: Implement ir_unop_logic_not using 1-x

Since our logic values are 0.0 (false) and 1.0 (true), 1.0 - x
accurately implements logical not.

Reviewed-by: Eric Anholt <eric@anholt.net>
This commit is contained in:
Ian Romanick 2011-07-30 10:48:10 -07:00
parent 3c9f172fe8
commit 6ad08989d7
1 changed files with 7 additions and 1 deletions

View File

@ -1135,7 +1135,13 @@ ir_to_mesa_visitor::visit(ir_expression *ir)
switch (ir->operation) {
case ir_unop_logic_not:
emit(ir, OPCODE_SEQ, result_dst, op[0], src_reg_for_float(0.0));
/* Previously 'SEQ dst, src, 0.0' was used for this. However, many
* older GPUs implement SEQ using multiple instructions (i915 uses two
* SGE instructions and a MUL instruction). Since our logic values are
* 0.0 and 1.0, 1-x also implements !x.
*/
op[0].negate = ~op[0].negate;
emit(ir, OPCODE_ADD, result_dst, op[0], src_reg_for_float(1.0));
break;
case ir_unop_neg:
op[0].negate = ~op[0].negate;