i965/fs: Refactor try_emit_saturate

v3: Since the fs backend can emit saturate as a separate instruction, there is
    no need to detect for min/max instructions and to rewrite the instruction tree
    accordingly. On the other hand, we don't need to emit a separate saturated
    mov either when the expression generating src can do saturate directly.
v4: Add can_do_saturate() check before enabling saturate modifer (Ken)

Reviewed-by: Matt Turner <mattst88@gmail.com>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
Signed-off-by: Abdiel Janulgue <abdiel.janulgue@linux.intel.com>
This commit is contained in:
Abdiel Janulgue 2014-06-16 12:28:00 -07:00
parent b2c0c35907
commit cbd225057a

View file

@ -267,17 +267,14 @@ fs_visitor::emit_minmax(enum brw_conditional_mod conditionalmod, const fs_reg &d
}
}
/* Instruction selection: Produce a MOV.sat instead of
* MIN(MAX(val, 0), 1) when possible.
*/
bool
fs_visitor::try_emit_saturate(ir_expression *ir)
{
ir_rvalue *sat_val = ir->as_rvalue_to_saturate();
if (!sat_val)
if (ir->operation != ir_unop_saturate)
return false;
ir_rvalue *sat_val = ir->operands[0];
fs_inst *pre_inst = (fs_inst *) this->instructions.get_tail();
sat_val->accept(this);
@ -285,21 +282,17 @@ fs_visitor::try_emit_saturate(ir_expression *ir)
fs_inst *last_inst = (fs_inst *) this->instructions.get_tail();
/* If the last instruction from our accept() didn't generate our
* src, generate a saturated MOV
/* If the last instruction from our accept() generated our
* src, just set the saturate flag instead of emmitting a separate mov.
*/
fs_inst *modify = get_instruction_generating_reg(pre_inst, last_inst, src);
if (!modify || modify->regs_written != 1) {
this->result = fs_reg(this, ir->type);
fs_inst *inst = emit(MOV(this->result, src));
inst->saturate = true;
} else {
if (modify && modify->regs_written == 1 && modify->can_do_saturate()) {
modify->saturate = true;
this->result = src;
return true;
}
return true;
return false;
}
bool