Mesa (master): i965/vs: Use the embedded-comparison SEL on gen6+, like the FS does.

Eric Anholt anholt at kemper.freedesktop.org
Mon Jan 23 21:06:42 UTC 2012


Module: Mesa
Branch: master
Commit: 1fde76b8771350933d0a0b562ff1bd91e8340ac5
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=1fde76b8771350933d0a0b562ff1bd91e8340ac5

Author: Eric Anholt <eric at anholt.net>
Date:   Wed Jan 18 12:58:45 2012 -0800

i965/vs: Use the embedded-comparison SEL on gen6+, like the FS does.

Shaves a few instructions off of the VS in Lightsmark, but no
statistically significant performance difference on gen7 (n=5).

Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>

---

 src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp |   22 ++++++++++++++++------
 1 files changed, 16 insertions(+), 6 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
index 06bde92..2436bc9 100644
--- a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
+++ b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
@@ -1285,16 +1285,26 @@ vec4_visitor::visit(ir_expression *ir)
       break;
 
    case ir_binop_min:
-      emit(CMP(result_dst, op[0], op[1], BRW_CONDITIONAL_L));
+      if (intel->gen >= 6) {
+	 inst = emit(BRW_OPCODE_SEL, result_dst, op[0], op[1]);
+	 inst->conditional_mod = BRW_CONDITIONAL_L;
+      } else {
+	 emit(CMP(result_dst, op[0], op[1], BRW_CONDITIONAL_L));
 
-      inst = emit(BRW_OPCODE_SEL, result_dst, op[0], op[1]);
-      inst->predicate = BRW_PREDICATE_NORMAL;
+	 inst = emit(BRW_OPCODE_SEL, result_dst, op[0], op[1]);
+	 inst->predicate = BRW_PREDICATE_NORMAL;
+      }
       break;
    case ir_binop_max:
-      emit(CMP(result_dst, op[0], op[1], BRW_CONDITIONAL_G));
+      if (intel->gen >= 6) {
+	 inst = emit(BRW_OPCODE_SEL, result_dst, op[0], op[1]);
+	 inst->conditional_mod = BRW_CONDITIONAL_G;
+      } else {
+	 emit(CMP(result_dst, op[0], op[1], BRW_CONDITIONAL_G));
 
-      inst = emit(BRW_OPCODE_SEL, result_dst, op[0], op[1]);
-      inst->predicate = BRW_PREDICATE_NORMAL;
+	 inst = emit(BRW_OPCODE_SEL, result_dst, op[0], op[1]);
+	 inst->predicate = BRW_PREDICATE_NORMAL;
+      }
       break;
 
    case ir_binop_pow:




More information about the mesa-commit mailing list