This allows us to combine code in CSE and register coalesce --- src/mesa/drivers/dri/i965/brw_fs.cpp | 14 ++++++++++++++ src/mesa/drivers/dri/i965/brw_fs_cse.cpp | 18 +----------------- src/mesa/drivers/dri/i965/brw_fs_register_coalesce.cpp | 14 +------------- src/mesa/drivers/dri/i965/brw_ir_fs.h | 1 + 4 files changed, 17 insertions(+), 30 deletions(-)
diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp index 852abbe..4c29cf1 100644 --- a/src/mesa/drivers/dri/i965/brw_fs.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp @@ -517,6 +517,20 @@ fs_inst::is_send_from_grf() const } bool +fs_inst::is_copy_payload() const +{ + fs_reg reg = this->src[0]; + if (reg.file != GRF || reg.reg_offset != 0 || reg.stride == 0) + return false; + + for (int i = 1; i < this->sources; i++) + if (!this->src[i].equals(::offset(reg, i))) + return false; + + return true; +} + +bool fs_inst::can_do_source_mods(struct brw_context *brw) { if (brw->gen == 6 && is_math()) diff --git a/src/mesa/drivers/dri/i965/brw_fs_cse.cpp b/src/mesa/drivers/dri/i965/brw_fs_cse.cpp index 61837d2..a8aeebf 100644 --- a/src/mesa/drivers/dri/i965/brw_fs_cse.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs_cse.cpp @@ -43,22 +43,6 @@ struct aeb_entry : public exec_node { } static bool -is_copy_payload(const fs_inst *inst) -{ - const int reg = inst->src[0].reg; - if (inst->src[0].reg_offset != 0) - return false; - - for (int i = 1; i < inst->sources; i++) { - if (inst->src[i].reg != reg || - inst->src[i].reg_offset != i) { - return false; - } - } - return true; -} - -static bool is_expression(const fs_inst *const inst) { switch (inst->opcode) { @@ -102,7 +86,7 @@ is_expression(const fs_inst *const inst) case SHADER_OPCODE_COS: return inst->mlen < 2; case SHADER_OPCODE_LOAD_PAYLOAD: - return !is_copy_payload(inst); + return !inst->is_copy_payload(); default: return inst->is_send_from_grf() && !inst->has_side_effects(); } diff --git a/src/mesa/drivers/dri/i965/brw_fs_register_coalesce.cpp b/src/mesa/drivers/dri/i965/brw_fs_register_coalesce.cpp index e3cf2db..884acec 100644 --- a/src/mesa/drivers/dri/i965/brw_fs_register_coalesce.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs_register_coalesce.cpp @@ -64,18 +64,6 @@ is_nop_mov(const fs_inst *inst) } static bool -is_copy_payload(const fs_inst *inst) -{ - fs_reg reg = inst->src[0]; - - for (int i = 0; i < inst->sources; i++) - if (!inst->src[i].equals(offset(reg, i))) - return false; - - return true; -} - -static bool is_coalesce_candidate(const fs_visitor *v, const fs_inst *inst) { if ((inst->opcode != BRW_OPCODE_MOV && @@ -99,7 +87,7 @@ is_coalesce_candidate(const fs_visitor *v, const fs_inst *inst) if (v->alloc.sizes[inst->src[0].reg] != inst->regs_written) return false; - if (!is_copy_payload(inst)) { + if (!inst->is_copy_payload()) { return false; } } diff --git a/src/mesa/drivers/dri/i965/brw_ir_fs.h b/src/mesa/drivers/dri/i965/brw_ir_fs.h index 9ef1261..c4f5540 100644 --- a/src/mesa/drivers/dri/i965/brw_ir_fs.h +++ b/src/mesa/drivers/dri/i965/brw_ir_fs.h @@ -223,6 +223,7 @@ public: bool overwrites_reg(const fs_reg ®) const; bool is_send_from_grf() const; bool is_partial_write() const; + bool is_copy_payload() const; int regs_read(int arg) const; bool can_do_source_mods(struct brw_context *brw); -- 2.3.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev