i965/fs: Allow propagation of instructions with saturate flag to sel
When sel conditon is bounded within 0 and 1.0. This allows code as: mov.sat a b sel.ge dst a 0.25F To be propagated as: sel.ge.sat dst b 0.25F v3: Syntax clarifications in inst->saturate assignment (Matt Turner) Reviewed-by: Matt Turner <mattst88@gmail.com> Signed-off-by: Abdiel Janulgue <abdiel.janulgue@linux.intel.com>
This commit is contained in:
parent
0e2ba3ee82
commit
40aeb558ce
|
@ -43,6 +43,7 @@ struct acp_entry : public exec_node {
|
||||||
fs_reg dst;
|
fs_reg dst;
|
||||||
fs_reg src;
|
fs_reg src;
|
||||||
enum opcode opcode;
|
enum opcode opcode;
|
||||||
|
bool saturate;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct block_data {
|
struct block_data {
|
||||||
|
@ -344,11 +345,26 @@ fs_visitor::try_copy_propagate(fs_inst *inst, int arg, acp_entry *entry)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (entry->saturate) {
|
||||||
|
switch(inst->opcode) {
|
||||||
|
case BRW_OPCODE_SEL:
|
||||||
|
if (inst->src[1].file != IMM ||
|
||||||
|
inst->src[1].fixed_hw_reg.dw1.f < 0.0 ||
|
||||||
|
inst->src[1].fixed_hw_reg.dw1.f > 1.0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
inst->src[arg].file = entry->src.file;
|
inst->src[arg].file = entry->src.file;
|
||||||
inst->src[arg].reg = entry->src.reg;
|
inst->src[arg].reg = entry->src.reg;
|
||||||
inst->src[arg].reg_offset = entry->src.reg_offset;
|
inst->src[arg].reg_offset = entry->src.reg_offset;
|
||||||
inst->src[arg].subreg_offset = entry->src.subreg_offset;
|
inst->src[arg].subreg_offset = entry->src.subreg_offset;
|
||||||
inst->src[arg].stride *= entry->src.stride;
|
inst->src[arg].stride *= entry->src.stride;
|
||||||
|
inst->saturate = inst->saturate || entry->saturate;
|
||||||
|
|
||||||
if (!inst->src[arg].abs) {
|
if (!inst->src[arg].abs) {
|
||||||
inst->src[arg].abs = entry->src.abs;
|
inst->src[arg].abs = entry->src.abs;
|
||||||
|
@ -511,7 +527,6 @@ can_propagate_from(fs_inst *inst)
|
||||||
inst->src[0].file == UNIFORM ||
|
inst->src[0].file == UNIFORM ||
|
||||||
inst->src[0].file == IMM) &&
|
inst->src[0].file == IMM) &&
|
||||||
inst->src[0].type == inst->dst.type &&
|
inst->src[0].type == inst->dst.type &&
|
||||||
!inst->saturate &&
|
|
||||||
!inst->is_partial_write());
|
!inst->is_partial_write());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -566,6 +581,7 @@ fs_visitor::opt_copy_propagate_local(void *copy_prop_ctx, bblock_t *block,
|
||||||
entry->dst = inst->dst;
|
entry->dst = inst->dst;
|
||||||
entry->src = inst->src[0];
|
entry->src = inst->src[0];
|
||||||
entry->opcode = inst->opcode;
|
entry->opcode = inst->opcode;
|
||||||
|
entry->saturate = inst->saturate;
|
||||||
acp[entry->dst.reg % ACP_HASH_SIZE].push_tail(entry);
|
acp[entry->dst.reg % ACP_HASH_SIZE].push_tail(entry);
|
||||||
} else if (inst->opcode == SHADER_OPCODE_LOAD_PAYLOAD &&
|
} else if (inst->opcode == SHADER_OPCODE_LOAD_PAYLOAD &&
|
||||||
inst->dst.file == GRF) {
|
inst->dst.file == GRF) {
|
||||||
|
|
Loading…
Reference in New Issue