use new shuffle to speed up affine matrix mappts
authormtklein <mtklein@chromium.org>
Thu, 10 Sep 2015 21:32:32 +0000 (14:32 -0700)
committerCommit bot <commit-bot@chromium.org>
Thu, 10 Sep 2015 21:32:32 +0000 (14:32 -0700)
sse: 25 -> 18
neon: 95 -> 86

BUG=skia:

Review URL: https://codereview.chromium.org/1333983002

src/opts/SkMatrix_opts.h
src/opts/SkNx_neon.h

index 3fb2701e88db1409c4258627d988a161ac70cd60..2d0a142cf1857209c9126f675c8a8dc62c5d529e 100644 (file)
@@ -89,12 +89,11 @@ static void matrix_affine(const SkMatrix& m, SkPoint* dst, const SkPoint* src, i
         }
         Sk4s trans4(tx, ty, tx, ty);
         Sk4s scale4(sx, sy, sx, sy);
-        Sk4s  skew4(kx, ky, kx, ky);    // applied to swizzle of src4
+        Sk4s  skew4(ky, kx, ky, kx);    // applied src4, then x/y swapped
         count >>= 1;
         for (int i = 0; i < count; ++i) {
             Sk4s src4 = Sk4s::Load(&src->fX);
-            Sk4s swz4(src[0].fY, src[0].fX, src[1].fY, src[1].fX);  // need ABCD -> BADC
-            (src4 * scale4 + swz4 * skew4 + trans4).store(&dst->fX);
+            (trans4 + src4 * scale4 + SkNx_shuffle<1,0,3,2>(src4 * skew4)).store(&dst->fX);
             src += 2;
             dst += 2;
         }
index cf149862c5791c8477bf17eb9d8e3a3e3039eac8..3d90f878a50a38f516b77698fa21770d410f08e7 100644 (file)
@@ -396,6 +396,11 @@ public:
 #undef SHIFT16
 #undef SHIFT8
 
+template <>
+inline SkNf<4,float> SkNx_shuffle_impl<SkNf<4,float>, 1,0,3,2>(const SkNf<4,float>& src) {
+    return vrev64q_f32(src.fVec);
+}
+
 }  // namespace
 
 #endif//SkNx_neon_DEFINED