[Mesa-dev] [PATCH 2/2] i965/vec4: Allow reswizzling writemasks when swizzle is single-valued.

Matt Turner mattst88 at gmail.com
Mon Aug 18 12:24:15 PDT 2014


total instructions in shared programs: 4288033 -> 4266151 (-0.51%)
instructions in affected programs:     930915 -> 909033 (-2.35%)
---
View under git show -w. Really just rearranging code.

 src/mesa/drivers/dri/i965/brw_vec4.cpp | 60 +++++++++++++++++++---------------
 1 file 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 c1363ca..155016d 100644
--- a/src/mesa/drivers/dri/i965/brw_vec4.cpp
+++ b/src/mesa/drivers/dri/i965/brw_vec4.cpp
@@ -946,24 +946,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;
    }
 }
@@ -981,6 +984,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:
@@ -997,18 +1015,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;
    }
 }
 
-- 
1.8.5.5



More information about the mesa-dev mailing list