From d6aeba1501e391f17d6b5f5c605e9ba8e0711eb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=BCnther=20Foidl?= Date: Mon, 20 Mar 2023 22:57:16 +0100 Subject: [PATCH] Switched from for-loop to if + do-while in Vp8LHistogram --- src/ImageSharp/Formats/Webp/Lossless/Vp8LHistogram.cs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/ImageSharp/Formats/Webp/Lossless/Vp8LHistogram.cs b/src/ImageSharp/Formats/Webp/Lossless/Vp8LHistogram.cs index 3df979f96b..765c84e602 100644 --- a/src/ImageSharp/Formats/Webp/Lossless/Vp8LHistogram.cs +++ b/src/ImageSharp/Formats/Webp/Lossless/Vp8LHistogram.cs @@ -513,14 +513,14 @@ internal sealed class Vp8LHistogram : IDeepCloneable DebugGuard.MustBeGreaterThanOrEqualTo(b.Length, count, nameof(b.Length)); DebugGuard.MustBeGreaterThanOrEqualTo(output.Length, count, nameof(output.Length)); - if (Avx2.IsSupported) + if (Avx2.IsSupported && count >= 32) { ref uint aRef = ref MemoryMarshal.GetReference(a); ref uint bRef = ref MemoryMarshal.GetReference(b); ref uint outputRef = ref MemoryMarshal.GetReference(output); - nuint idx; - for (idx = 0; idx <= (uint)count - 32; idx += 32) + nuint idx = 0; + do { // Load values. Vector256 a0 = Unsafe.As>(ref Unsafe.Add(ref aRef, idx)); @@ -538,7 +538,9 @@ internal sealed class Vp8LHistogram : IDeepCloneable Unsafe.As>(ref Unsafe.Add(ref outputRef, idx + 8)) = Avx2.Add(a1, b1); Unsafe.As>(ref Unsafe.Add(ref outputRef, idx + 16)) = Avx2.Add(a2, b2); Unsafe.As>(ref Unsafe.Add(ref outputRef, idx + 24)) = Avx2.Add(a3, b3); + idx += 32; } + while (idx <= (uint)count - 32); int i = (int)idx; for (; i < count; i++)