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:
parent
4532cac06a
commit
9658b04fc4
|
@ -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]);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue