On Thu, Jun 5, 2014 at 11:05 AM, Abdiel Janulgue <abdiel.janul...@linux.intel.com> wrote: > On Broadwell, this reduces the instruction to a single operation when NOT is > used with > a logical instruction. > > Signed-off-by: Abdiel Janulgue <abdiel.janul...@linux.intel.com> > --- > src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp | 17 +++++++++++++---- > 1 file changed, 13 insertions(+), 4 deletions(-) > > diff --git a/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp > b/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp > index aa506f5..54d2cb4 100644 > --- a/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp > +++ b/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp > @@ -341,7 +341,11 @@ fs_visitor::try_copy_propagate(fs_inst *inst, int arg, > acp_entry *entry) > return false; > > if (brw->gen >= 8) { > - if (entry->src.negate) { > + if (entry->opcode == BRW_OPCODE_NOT) { > + if (!is_logic_op(inst->opcode)) { > + return false; > + } > + } else if (entry->src.negate) { > if (is_logic_op(inst->opcode)) { > return false; > } > @@ -359,6 +363,10 @@ fs_visitor::try_copy_propagate(fs_inst *inst, int arg, > acp_entry *entry) > inst->src[arg].negate ^= entry->src.negate; > } > > + if (brw->gen >=8 && entry->opcode == BRW_OPCODE_NOT) {
Space between >= and 8. Also, there's a bit of code immediately before this: if (!inst->src[arg].abs) { inst->src[arg].abs = entry->src.abs; inst->src[arg].negate ^= entry->src.negate; } I wonder how this might interfere? The Bspec explicitly describes how abs and negate work before Broadwell, and how negate works after Broadwell, but no mention of abs on Broadwell. I guess we'll need to check. > + inst->src[arg].negate ^= !entry->src.negate; > + } > + > return true; > } > > @@ -498,9 +506,10 @@ fs_visitor::try_constant_propagate(fs_inst *inst, > acp_entry *entry) > } > > static bool > -can_propagate_from(fs_inst *inst) > +can_propagate_from(struct brw_context *brw, fs_inst *inst) > { > - return (inst->opcode == BRW_OPCODE_MOV && > + return ((inst->opcode == BRW_OPCODE_MOV || > + (inst->opcode == BRW_OPCODE_NOT && brw->gen >=8)) && Space between >= and 8. > inst->dst.file == GRF && > ((inst->src[0].file == GRF && > (inst->src[0].reg != inst->dst.reg || > @@ -566,7 +575,7 @@ fs_visitor::opt_copy_propagate_local(void *copy_prop_ctx, > bblock_t *block, > /* If this instruction's source could potentially be folded into the > * operand of another instruction, add it to the ACP. > */ > - if (can_propagate_from(inst)) { > + if (can_propagate_from(brw, inst)) { > acp_entry *entry = ralloc(copy_prop_ctx, acp_entry); > entry->dst = inst->dst; > entry->src = inst->src[0]; > -- > 1.9.1 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev