i965/fs: Make emit_if_gen6 never fall back to emit_bool_to_cond_code.
authorKenneth Graunke <kenneth@whitecape.org>
Thu, 4 Sep 2014 07:18:44 +0000 (00:18 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Mon, 8 Sep 2014 22:43:51 +0000 (15:43 -0700)
Matt and I believe that Sandybridge actually uses 0xFFFFFFFF for a
"true" comparison result, similar to Ivybridge.  This matches the
internal documentation, and empirical results, but contradicts the PRM.

So, the comment is inaccurate, and we can actually just handle these
directly without ever needing to fall through to the condition code
path.

Also, the vec4 backend has always done it this way, and has apparently
been working fine.  This patch makes the FS backend match the vec4
backend's behavior.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Matt Turner <mattst88@gmail.com>
src/mesa/drivers/dri/i965/brw_fs_visitor.cpp

index 6ca4530ec7647456b36a7e7894bbb7b153fd124a..b1177a5770e40410c87cd7bae75a5a619ed63f5f 100644 (file)
@@ -2378,14 +2378,24 @@ fs_visitor::emit_if_gen6(ir_if *ir)
 
       switch (expr->operation) {
       case ir_unop_logic_not:
+         emit(IF(op[0], fs_reg(0), BRW_CONDITIONAL_Z));
+         return;
+
       case ir_binop_logic_xor:
+         emit(IF(op[0], op[1], BRW_CONDITIONAL_NZ));
+         return;
+
       case ir_binop_logic_or:
+         temp = fs_reg(this, glsl_type::bool_type);
+         emit(OR(temp, op[0], op[1]));
+         emit(IF(temp, fs_reg(0), BRW_CONDITIONAL_NZ));
+         return;
+
       case ir_binop_logic_and:
-         /* For operations on bool arguments, only the low bit of the bool is
-          * valid, and the others are undefined.  Fall back to the condition
-          * code path.
-          */
-         break;
+         temp = fs_reg(this, glsl_type::bool_type);
+         emit(AND(temp, op[0], op[1]));
+         emit(IF(temp, fs_reg(0), BRW_CONDITIONAL_NZ));
+         return;
 
       case ir_unop_f2b:
         inst = emit(BRW_OPCODE_IF, reg_null_f, op[0], fs_reg(0));
@@ -2432,9 +2442,8 @@ fs_visitor::emit_if_gen6(ir_if *ir)
       }
    }
 
-   emit_bool_to_cond_code(ir->condition);
-   fs_inst *inst = emit(BRW_OPCODE_IF);
-   inst->predicate = BRW_PREDICATE_NORMAL;
+   ir->condition->accept(this);
+   emit(IF(this->result, fs_reg(0), BRW_CONDITIONAL_NZ));
 }
 
 /**