i965/vs: Refactor min/max handling to share code.
authorKenneth Graunke <kenneth@whitecape.org>
Mon, 8 Oct 2012 17:45:08 +0000 (10:45 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Thu, 1 Nov 2012 21:29:21 +0000 (14:29 -0700)
v2: Properly use "conditionalmod" pre-Gen6, rather than the incorrectly
copy-and-pasted "BRW_CONDITIONAL_G".

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Eric Anholt <eric@anholt.net>
src/mesa/drivers/dri/i965/brw_vec4.h
src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp

index 402e67ab8188e2f1d1c7d136cf06df4b49b33a71..e4dcbc4330959b59b412c7be8ddee6d4892baeba 100644 (file)
@@ -373,6 +373,8 @@ public:
    void emit_bool_comparison(unsigned int op, dst_reg dst, src_reg src0, src_reg src1);
    void emit_if_gen6(ir_if *ir);
 
+   void emit_minmax(uint32_t condmod, dst_reg dst, src_reg src0, src_reg src1);
+
    void emit_block_move(dst_reg *dst, src_reg *src,
                        const struct glsl_type *type, uint32_t predicate);
 
index f2bf35f7e348c25a316148a8c1598cd7d803bf76..713427b66da55cd274f258151617d4395682e7b5 100644 (file)
@@ -998,6 +998,23 @@ vec4_visitor::emit_bool_comparison(unsigned int op,
    emit(AND(dst, src_reg(dst), src_reg(0x1)));
 }
 
+void
+vec4_visitor::emit_minmax(uint32_t conditionalmod, dst_reg dst,
+                          src_reg src0, src_reg src1)
+{
+   vec4_instruction *inst;
+
+   if (intel->gen >= 6) {
+      inst = emit(BRW_OPCODE_SEL, dst, src0, src1);
+      inst->conditional_mod = conditionalmod;
+   } else {
+      emit(CMP(dst, src0, src1, conditionalmod));
+
+      inst = emit(BRW_OPCODE_SEL, dst, src0, src1);
+      inst->predicate = BRW_PREDICATE_NORMAL;
+   }
+}
+
 void
 vec4_visitor::visit(ir_expression *ir)
 {
@@ -1272,26 +1289,10 @@ vec4_visitor::visit(ir_expression *ir)
       break;
 
    case ir_binop_min:
-      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;
-      }
+      emit_minmax(BRW_CONDITIONAL_L, result_dst, op[0], op[1]);
       break;
    case ir_binop_max:
-      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;
-      }
+      emit_minmax(BRW_CONDITIONAL_G, result_dst, op[0], op[1]);
       break;
 
    case ir_binop_pow: