i965/fs: Emit a MOV instead of a SEL if the sources are the same.

One program affected.

instructions in affected programs:     436 -> 428 (-1.83%)

Reviewed-by: Paul Berry <stereotype441@gmail.com>
This commit is contained in:
Matt Turner 2013-10-27 17:09:41 -07:00
parent 4532cac06a
commit 9658b04fc4
1 changed files with 21 additions and 17 deletions

View File

@ -169,26 +169,30 @@ fs_visitor::opt_peephole_sel()
break;
}
/* Only the last source register can be a constant, so if the MOV in
* the "then" clause uses a constant, we need to put it in a
* temporary.
*/
fs_reg src0(then_mov[i]->src[0]);
if (src0.file == IMM) {
src0 = fs_reg(this, glsl_type::float_type);
src0.type = then_mov[i]->src[0].type;
mov_imm_inst[i] = MOV(src0, then_mov[i]->src[0]);
}
if (!then_mov[i]->src[0].equals(else_mov[i]->src[0])) {
/* Only the last source register can be a constant, so if the MOV
* in the "then" clause uses a constant, we need to put it in a
* temporary.
*/
fs_reg src0(then_mov[i]->src[0]);
if (src0.file == IMM) {
src0 = fs_reg(this, glsl_type::float_type);
src0.type = then_mov[i]->src[0].type;
mov_imm_inst[i] = MOV(src0, then_mov[i]->src[0]);
}
sel_inst[i] = SEL(then_mov[i]->dst, src0, else_mov[i]->src[0]);
sel_inst[i] = SEL(then_mov[i]->dst, src0, else_mov[i]->src[0]);
if (brw->gen == 6 && if_inst->conditional_mod) {
/* For Sandybridge with IF with embedded comparison */
sel_inst[i]->predicate = BRW_PREDICATE_NORMAL;
if (brw->gen == 6 && if_inst->conditional_mod) {
/* For Sandybridge with IF with embedded comparison */
sel_inst[i]->predicate = BRW_PREDICATE_NORMAL;
} else {
/* Separate CMP and IF instructions */
sel_inst[i]->predicate = if_inst->predicate;
sel_inst[i]->predicate_inverse = if_inst->predicate_inverse;
}
} else {
/* Separate CMP and IF instructions */
sel_inst[i]->predicate = if_inst->predicate;
sel_inst[i]->predicate_inverse = if_inst->predicate_inverse;
sel_inst[i] = MOV(then_mov[i]->dst, then_mov[i]->src[0]);
}
}