ir_to_mesa: Implement ir_unop_logic_not using 1-x
authorIan Romanick <ian.d.romanick@intel.com>
Sat, 30 Jul 2011 17:48:10 +0000 (10:48 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Tue, 16 Aug 2011 21:09:40 +0000 (14:09 -0700)
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>
src/mesa/program/ir_to_mesa.cpp

index 1ef609fe15d7f03498e13123a7ac57ca8c2ab3c1..f03ea7a95e0b24b695670312a8b2ec576900f63a 100644 (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;