[Mesa-dev] [PATCH 04/13] i965/fs_inst: Add an is_copy_payload helper
Jason Ekstrand
jason at jlekstrand.net
Wed Apr 1 18:19:15 PDT 2015
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
More information about the mesa-dev
mailing list