summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Anholt <eric@anholt.net>2013-04-05 14:20:43 -0700
committerEric Anholt <eric@anholt.net>2013-10-10 15:54:15 -0700
commit097bf101c33ee14e4e163523dc4e4e0fbca9f051 (patch)
treed6f0e22cb8c221f7e89e2b6da9b863e91b6d31cb
parent4b821a97b5fcdc4c530d5455c43196be09830322 (diff)
i965/fs: Factor def[]/use[] setup out to a separate function.
These blocks are about to grow some more code, and the indentation was getting out of hand. v2 (Kenneth Graunke): Rebase, minor typo fixes and style changes. Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
-rw-r--r--src/mesa/drivers/dri/i965/brw_fs_live_variables.cpp57
-rw-r--r--src/mesa/drivers/dri/i965/brw_fs_live_variables.h2
2 files changed, 43 insertions, 16 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_fs_live_variables.cpp b/src/mesa/drivers/dri/i965/brw_fs_live_variables.cpp
index 099eeaa0bb..57b4d24925 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_live_variables.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs_live_variables.cpp
@@ -50,6 +50,35 @@ using namespace brw;
* 14.1 (p444).
*/
+void
+fs_live_variables::setup_one_read(bblock_t *block, fs_inst *inst,
+ int ip, fs_reg reg)
+{
+ int var = var_from_vgrf[reg.reg] + reg.reg_offset;
+
+ /* The use[] bitset marks when the block makes use of a variable (VGRF
+ * channel) without having completely defined that variable within the
+ * block.
+ */
+ if (!BITSET_TEST(bd[block->block_num].def, var))
+ BITSET_SET(bd[block->block_num].use, var);
+}
+
+void
+fs_live_variables::setup_one_write(bblock_t *block, fs_inst *inst,
+ int ip, fs_reg reg)
+{
+ int var = var_from_vgrf[reg.reg] + reg.reg_offset;
+
+ /* The def[] bitset marks when an initialization in a block completely
+ * screens off previous updates of that variable (VGRF channel).
+ */
+ if (inst->dst.file == GRF && !inst->is_partial_write()) {
+ if (!BITSET_TEST(bd[block->block_num].use, var))
+ BITSET_SET(bd[block->block_num].def, var);
+ }
+}
+
/**
* Sets up the use[] and def[] bitsets.
*
@@ -77,7 +106,9 @@ fs_live_variables::setup_def_use()
/* Set use[] for this instruction */
for (unsigned int i = 0; i < 3; i++) {
- if (inst->src[i].file != GRF)
+ fs_reg reg = inst->src[i];
+
+ if (reg.file != GRF)
continue;
int regs_read = 1;
@@ -85,26 +116,20 @@ fs_live_variables::setup_def_use()
* so just assume "all of them."
*/
if (inst->is_send_from_grf())
- regs_read = v->virtual_grf_sizes[inst->src[i].reg];
-
- for (int j = 0; j < regs_read; j++) {
- int var = var_from_vgrf[inst->src[i].reg] +
- inst->src[i].reg_offset + j;
+ regs_read = v->virtual_grf_sizes[reg.reg];
- if (!BITSET_TEST(bd[b].def, var))
- BITSET_SET(bd[b].use, var);
+ for (int i = 0; i < regs_read; i++) {
+ setup_one_read(block, inst, ip, reg);
+ reg.reg_offset++;
}
}
- /* Check for unconditional writes to whole registers. These
- * are the things that screen off preceding definitions of a
- * variable, and thus qualify for being in def[].
- */
- if (inst->dst.file == GRF && !inst->is_partial_write()) {
- int var = var_from_vgrf[inst->dst.reg] + inst->dst.reg_offset;
+ /* Set def[] for this instruction */
+ if (inst->dst.file == GRF) {
+ fs_reg reg = inst->dst;
for (int j = 0; j < inst->regs_written; j++) {
- if (!BITSET_TEST(bd[b].use, var + j))
- BITSET_SET(bd[b].def, var + j);
+ setup_one_write(block, inst, ip, reg);
+ reg.reg_offset++;
}
}
diff --git a/src/mesa/drivers/dri/i965/brw_fs_live_variables.h b/src/mesa/drivers/dri/i965/brw_fs_live_variables.h
index ab612cce16..a2abde2439 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_live_variables.h
+++ b/src/mesa/drivers/dri/i965/brw_fs_live_variables.h
@@ -59,6 +59,8 @@ public:
~fs_live_variables();
void setup_def_use();
+ void setup_one_read(bblock_t *block, fs_inst *inst, int ip, fs_reg reg);
+ void setup_one_write(bblock_t *block, fs_inst *inst, int ip, fs_reg reg);
void compute_live_variables();
fs_visitor *v;