From: Ian Romanick <ian.d.roman...@intel.com> On SNB+, the Boolean result is always 0 or ~0, so MOV.nz produces the same effect as AND.nz. However, later cmod propagation passes can handle the MOV.nz, but they cannot handle the AND.nz because the source is not generated by a CMP.
It's worth noting that this commit was a lot more effective before commit bb22aa0 (i965/fs: Ignore type in cmod prop if scan_inst is CMP.). Without that commit, this commit improved ~2,500 shaders on each affected platform, including Sandy Bridge. Ivy Bridge (0x0166): total instructions in shared programs: 6291794 -> 6291668 (-0.00%) instructions in affected programs: 41207 -> 41081 (-0.31%) helped: 154 HURT: 28 Haswell (0x0426): total instructions in shared programs: 5779180 -> 5779054 (-0.00%) instructions in affected programs: 37210 -> 37084 (-0.34%) helped: 154 HURT: 28 Broadwell (0x162E): total instructions in shared programs: 6823014 -> 6822848 (-0.00%) instructions in affected programs: 40195 -> 40029 (-0.41%) helped: 164 HURT: 28 No change on GM45, Iron Lake, Sandy Bridge, Ivy Bridge with NIR, or Haswell with NIR. Signed-off-by: Ian Romanick <ian.d.roman...@intel.com> --- src/mesa/drivers/dri/i965/brw_fs_visitor.cpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp index 2f1d49c..e39dab3 100644 --- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp @@ -2591,7 +2591,14 @@ fs_visitor::emit_bool_to_cond_code(ir_rvalue *ir) if (!expr || expr->operation == ir_binop_ubo_load) { ir->accept(this); - fs_inst *inst = emit(AND(reg_null_d, this->result, fs_reg(1))); + fs_inst *inst; + + if (brw->gen <= 5) { + inst = emit(AND(reg_null_d, this->result, fs_reg(1))); + } else { + inst = emit(MOV(reg_null_d, this->result)); + } + inst->conditional_mod = BRW_CONDITIONAL_NZ; return; } @@ -2618,7 +2625,11 @@ fs_visitor::emit_bool_to_cond_code_of_reg(ir_expression *expr, fs_reg op[3]) switch (expr->operation) { case ir_unop_logic_not: - inst = emit(AND(reg_null_d, op[0], fs_reg(1))); + if (brw->gen <= 5) { + inst = emit(AND(reg_null_d, op[0], fs_reg(1))); + } else { + inst = emit(MOV(reg_null_d, op[0])); + } inst->conditional_mod = BRW_CONDITIONAL_Z; break; -- 2.1.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev