From a08f9062a15dd35f2f5a13e2646b66cb38b3fc9f Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Wed, 4 Nov 2020 14:10:18 +0000 Subject: [PATCH] Unroll XYZWShuffle4Slice3 --- .../Common/Helpers/Shuffle/IShuffle4Slice3.cs | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/ImageSharp/Common/Helpers/Shuffle/IShuffle4Slice3.cs b/src/ImageSharp/Common/Helpers/Shuffle/IShuffle4Slice3.cs index 70800f9de2..083b0b2a96 100644 --- a/src/ImageSharp/Common/Helpers/Shuffle/IShuffle4Slice3.cs +++ b/src/ImageSharp/Common/Helpers/Shuffle/IShuffle4Slice3.cs @@ -65,9 +65,27 @@ namespace SixLabors.ImageSharp ref Byte3 dBase = ref Unsafe.As(ref MemoryMarshal.GetReference(dest)); int n = source.Length / 4; - for (int i = 0; i < n; i++) + int m = ImageMaths.Modulo4(n); + int u = n - m; + + ref Byte3 dEnd = ref Unsafe.Add(ref dBase, u); + + while (Unsafe.IsAddressLessThan(ref dBase, ref dEnd)) + { + Unsafe.Add(ref dBase, 0) = Unsafe.As(ref Unsafe.Add(ref sBase, 0)); + Unsafe.Add(ref dBase, 1) = Unsafe.As(ref Unsafe.Add(ref sBase, 1)); + Unsafe.Add(ref dBase, 2) = Unsafe.As(ref Unsafe.Add(ref sBase, 2)); + Unsafe.Add(ref dBase, 3) = Unsafe.As(ref Unsafe.Add(ref sBase, 3)); + dBase = ref Unsafe.Add(ref dBase, 4); + sBase = ref Unsafe.Add(ref sBase, 4); + } + + if (m > 0) { - Unsafe.Add(ref dBase, i) = Unsafe.As(ref Unsafe.Add(ref sBase, i)); + for (int i = u; i < n; i++) + { + Unsafe.Add(ref dBase, i) = Unsafe.As(ref Unsafe.Add(ref sBase, i)); + } } } }