When you src_reg(dst_reg(int_type)), you get a grf.xxxx (swizzle). But if you dst_reg(src_reg(int_type)), you get a grf.xyzw (writemask). By going the direction we did, we were writing more channels than were read, so we wouldn't register coalesce the ADD or MUL.
Right now the MOV is still baked into the emit, but I'm about to fix it for gen7. --- src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp index 8bd2fd8..ce07381 100644 --- a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp +++ b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp @@ -2716,18 +2716,18 @@ vec4_visitor::get_pull_constant_offset(vec4_instruction *inst, src_reg *reladdr, int reg_offset) { if (reladdr) { - src_reg index = src_reg(this, glsl_type::int_type); + dst_reg index = dst_reg(this, glsl_type::int_type); - emit_before(inst, ADD(dst_reg(index), *reladdr, src_reg(reg_offset))); + emit_before(inst, ADD(index, *reladdr, src_reg(reg_offset))); /* Pre-gen6, the message header uses byte offsets instead of vec4 * (16-byte) offset units. */ if (intel->gen < 6) { - emit_before(inst, MUL(dst_reg(index), index, src_reg(16))); + emit_before(inst, MUL(index, src_reg(index), src_reg(16))); } - return index; + return src_reg(index); } else { int message_header_scale = intel->gen < 6 ? 16 : 1; return src_reg(reg_offset * message_header_scale); -- 1.7.10.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev