use new shuffle to speed up affine matrix mappts

sse: 25 -> 18
neon: 95 -> 86

BUG=skia:

Review URL: https://codereview.chromium.org/1333983002
This commit is contained in:
mtklein 2015-09-10 14:32:32 -07:00 committed by Commit bot
parent 2bd5d02472
commit e70afc9f48
2 changed files with 7 additions and 3 deletions

View 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;
}

View 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