[Mesa-dev] [PATCH 06/11] i965/vec4: Fix handling of multiple register reads and writes in opt_cse().
Francisco Jerez
currojerez at riseup.net
Fri Mar 20 07:50:41 PDT 2015
---
src/mesa/drivers/dri/i965/brw_vec4_cse.cpp | 25 +++++++++++++++++--------
1 file changed, 17 insertions(+), 8 deletions(-)
diff --git a/src/mesa/drivers/dri/i965/brw_vec4_cse.cpp b/src/mesa/drivers/dri/i965/brw_vec4_cse.cpp
index 76c3132..596300b 100644
--- a/src/mesa/drivers/dri/i965/brw_vec4_cse.cpp
+++ b/src/mesa/drivers/dri/i965/brw_vec4_cse.cpp
@@ -116,6 +116,7 @@ instructions_match(vec4_instruction *a, vec4_instruction *b)
a->conditional_mod == b->conditional_mod &&
a->dst.type == b->dst.type &&
a->dst.writemask == b->dst.writemask &&
+ a->regs_written == b->regs_written &&
operands_match(a, b);
}
@@ -162,21 +163,29 @@ vec4_visitor::opt_cse_local(bblock_t *block)
*/
bool no_existing_temp = entry->tmp.file == BAD_FILE;
if (no_existing_temp && !entry->generator->dst.is_null()) {
- entry->tmp = src_reg(this, glsl_type::float_type);
- entry->tmp.type = inst->dst.type;
- entry->tmp.swizzle = BRW_SWIZZLE_XYZW;
+ entry->tmp = retype(src_reg(GRF, alloc.allocate(
+ entry->generator->regs_written),
+ NULL), inst->dst.type);
+
+ for (unsigned i = 0; i < entry->generator->regs_written; ++i) {
+ vec4_instruction *copy = MOV(offset(entry->generator->dst, i),
+ offset(entry->tmp, i));
+ entry->generator->insert_after(block, copy);
+ }
- vec4_instruction *copy = MOV(entry->generator->dst, entry->tmp);
- entry->generator->insert_after(block, copy);
entry->generator->dst = dst_reg(entry->tmp);
}
/* dest <- temp */
if (!inst->dst.is_null()) {
assert(inst->dst.type == entry->tmp.type);
- vec4_instruction *copy = MOV(inst->dst, entry->tmp);
- copy->force_writemask_all = inst->force_writemask_all;
- inst->insert_before(block, copy);
+
+ for (unsigned i = 0; i < inst->regs_written; ++i) {
+ vec4_instruction *copy = MOV(offset(inst->dst, i),
+ offset(entry->tmp, i));
+ copy->force_writemask_all = inst->force_writemask_all;
+ inst->insert_before(block, copy);
+ }
}
/* Set our iterator so that next time through the loop inst->next
--
2.1.3
More information about the mesa-dev
mailing list