diff options
author | Eric Anholt <[email protected]> | 2010-10-14 11:11:29 -0700 |
---|---|---|
committer | Eric Anholt <[email protected]> | 2010-10-14 12:02:54 -0700 |
commit | d5599c0b6a22cd0bbc475ec715824660144d02a0 (patch) | |
tree | 77b590e5c11be5ad614e3de85d6b2669162bdd6d | |
parent | 1d33e940d2050f3d9180019f6ffd57f6fc295507 (diff) |
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.
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_fs.cpp | 26 | ||||
-rw-r--r-- | 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 41081c3b634..c92bb549600 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 d0e84da1aad..e0dfa6aed15 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, |