Mesa (master): i965: Add a function for handling the move of boolean values to flag regs.

Eric Anholt anholt at kemper.freedesktop.org
Thu Oct 14 19:03:53 UTC 2010


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

Author: Eric Anholt <eric at anholt.net>
Date:   Thu Oct 14 11:11:29 2010 -0700

i965: Add a function for handling the move of boolean values to flag regs.

This will be a place to peephole comparisions directly to the flag
regs, and for now avoids using MOV with conditional mod on gen6, which
is now illegal.

---

 src/mesa/drivers/dri/i965/brw_fs.cpp |   26 ++++++++++++++++++--------
 src/mesa/drivers/dri/i965/brw_fs.h   |    1 +
 2 files changed, 19 insertions(+), 8 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp
index 41081c3..c92bb54 100644
--- a/src/mesa/drivers/dri/i965/brw_fs.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
@@ -969,10 +969,7 @@ fs_visitor::visit(ir_assignment *ir)
    assert(r.file != BAD_FILE);
 
    if (ir->condition) {
-      /* Get the condition bool into the predicate. */
-      ir->condition->accept(this);
-      inst = emit(fs_inst(BRW_OPCODE_CMP, reg_null, this->result, fs_reg(0)));
-      inst->conditional_mod = BRW_CONDITIONAL_NZ;
+      emit_bool_to_cond_code(ir->condition);
    }
 
    if (ir->lhs->type->is_scalar() ||
@@ -1343,6 +1340,22 @@ fs_visitor::visit(ir_constant *ir)
 }
 
 void
+fs_visitor::emit_bool_to_cond_code(ir_rvalue *ir)
+{
+
+   ir->accept(this);
+
+   if (intel->gen >= 6) {
+      fs_inst *inst = emit(fs_inst(BRW_OPCODE_AND, reg_null,
+				   this->result, fs_reg(1)));
+      inst->conditional_mod = BRW_CONDITIONAL_NZ;
+   } else {
+      fs_inst *inst = emit(fs_inst(BRW_OPCODE_MOV, reg_null, this->result));
+      inst->conditional_mod = BRW_CONDITIONAL_NZ;
+   }
+}
+
+void
 fs_visitor::visit(ir_if *ir)
 {
    fs_inst *inst;
@@ -1352,10 +1365,7 @@ fs_visitor::visit(ir_if *ir)
     */
    this->base_ir = ir->condition;
 
-   /* Generate the condition into the condition code. */
-   ir->condition->accept(this);
-   inst = emit(fs_inst(BRW_OPCODE_MOV, fs_reg(brw_null_reg()), this->result));
-   inst->conditional_mod = BRW_CONDITIONAL_NZ;
+   emit_bool_to_cond_code(ir->condition);
 
    inst = emit(fs_inst(BRW_OPCODE_IF));
    inst->predicated = true;
diff --git a/src/mesa/drivers/dri/i965/brw_fs.h b/src/mesa/drivers/dri/i965/brw_fs.h
index d0e84da..e0dfa6a 100644
--- a/src/mesa/drivers/dri/i965/brw_fs.h
+++ b/src/mesa/drivers/dri/i965/brw_fs.h
@@ -388,6 +388,7 @@ public:
    fs_inst *emit_texture_gen5(ir_texture *ir, fs_reg dst, fs_reg coordinate);
    fs_inst *emit_math(fs_opcodes op, fs_reg dst, fs_reg src0);
    fs_inst *emit_math(fs_opcodes op, fs_reg dst, fs_reg src0, fs_reg src1);
+   void emit_bool_to_cond_code(ir_rvalue *condition);
 
    void emit_fb_writes();
    void emit_assignment_writes(fs_reg &l, fs_reg &r,




More information about the mesa-commit mailing list