diff options
author | Matt Turner <[email protected]> | 2014-08-15 12:32:23 -0700 |
---|---|---|
committer | Matt Turner <[email protected]> | 2014-08-20 13:01:18 -0700 |
commit | 04895f5c601b240df547739da786b7c2b65bdd1e (patch) | |
tree | 969e300e96f004d85e645cab4062b4c2b675fe7f /src | |
parent | bde2a62af72847f6722180d0203f5b537d1df8ab (diff) |
i965/vec4: Allow reswizzling writemasks when swizzle is single-valued.
total instructions in shared programs: 4288033 -> 4266151 (-0.51%)
instructions in affected programs: 930915 -> 909033 (-2.35%)
Diffstat (limited to 'src')
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_vec4.cpp | 60 |
1 files changed, 33 insertions, 27 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_vec4.cpp b/src/mesa/drivers/dri/i965/brw_vec4.cpp index 5477fe6ab5f..ee61202c358 100644 --- a/src/mesa/drivers/dri/i965/brw_vec4.cpp +++ b/src/mesa/drivers/dri/i965/brw_vec4.cpp @@ -944,24 +944,27 @@ vec4_instruction::can_reswizzle_dst(int dst_writemask, return false; switch (opcode) { - case BRW_OPCODE_DP4: - case BRW_OPCODE_DP3: - case BRW_OPCODE_DP2: - return true; default: - /* Check if there happens to be no reswizzling required. */ - for (int c = 0; c < 4; c++) { - int bit = 1 << BRW_GET_SWZ(swizzle, c); - /* Skip components of the swizzle not used by the dst. */ - if (!(dst_writemask & (1 << c))) - continue; + if (!brw_is_single_value_swizzle(swizzle)) { + /* Check if there happens to be no reswizzling required. */ + for (int c = 0; c < 4; c++) { + int bit = 1 << BRW_GET_SWZ(swizzle, c); + /* Skip components of the swizzle not used by the dst. */ + if (!(dst_writemask & (1 << c))) + continue; - /* We don't do the reswizzling yet, so just sanity check that we - * don't have to. - */ - if (bit != (1 << c)) - return false; + /* We don't do the reswizzling yet, so just sanity check that we + * don't have to. + */ + if (bit != (1 << c)) + return false; + } + return true; } + /* fallthrough */ + case BRW_OPCODE_DP4: + case BRW_OPCODE_DP3: + case BRW_OPCODE_DP2: return true; } } @@ -979,6 +982,21 @@ vec4_instruction::reswizzle_dst(int dst_writemask, int swizzle) int new_writemask = 0; switch (opcode) { + default: + if (!brw_is_single_value_swizzle(swizzle)) { + for (int c = 0; c < 4; c++) { + /* Skip components of the swizzle not used by the dst. */ + if (!(dst_writemask & (1 << c))) + continue; + + /* We don't do the reswizzling yet, so just sanity check that we + * don't have to. + */ + assert((1 << BRW_GET_SWZ(swizzle, c)) == (1 << c)); + } + break; + } + /* fallthrough */ case BRW_OPCODE_DP4: case BRW_OPCODE_DP3: case BRW_OPCODE_DP2: @@ -995,18 +1013,6 @@ vec4_instruction::reswizzle_dst(int dst_writemask, int swizzle) } dst.writemask = new_writemask; break; - default: - for (int c = 0; c < 4; c++) { - /* Skip components of the swizzle not used by the dst. */ - if (!(dst_writemask & (1 << c))) - continue; - - /* We don't do the reswizzling yet, so just sanity check that we - * don't have to. - */ - assert((1 << BRW_GET_SWZ(swizzle, c)) == (1 << c)); - } - break; } } |