diff --git a/src/ImageSharp/Common/Helpers/Numerics.cs b/src/ImageSharp/Common/Helpers/Numerics.cs index 6105422372..0147689117 100644 --- a/src/ImageSharp/Common/Helpers/Numerics.cs +++ b/src/ImageSharp/Common/Helpers/Numerics.cs @@ -748,5 +748,19 @@ namespace SixLabors.ImageSharp [MethodImpl(MethodImplOptions.AggressiveInlining)] public static float Lerp(float value1, float value2, float amount) => ((value2 - value1) * amount) + value1; + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static void Accumulate(ref Vector accumulator, Vector values) + { + Vector.Widen(values, out Vector shortLow, out Vector shortHigh); + + Vector.Widen(shortLow, out Vector intLow, out Vector intHigh); + accumulator += intLow; + accumulator += intHigh; + + Vector.Widen(shortHigh, out intLow, out intHigh); + accumulator += intLow; + accumulator += intHigh; + } } } diff --git a/src/ImageSharp/Formats/Png/Filters/PaethFilter.cs b/src/ImageSharp/Formats/Png/Filters/PaethFilter.cs index 7562c47558..6e7bb8fb1f 100644 --- a/src/ImageSharp/Formats/Png/Filters/PaethFilter.cs +++ b/src/ImageSharp/Formats/Png/Filters/PaethFilter.cs @@ -86,7 +86,7 @@ namespace SixLabors.ImageSharp.Formats.Png.Filters #if SUPPORTS_RUNTIME_INTRINSICS if (Vector.IsHardwareAccelerated) { - Vector sumAccumulator = Vector.Zero; + Vector sumAccumulator = Vector.Zero; for (int xLeft = x - bytesPerPixel; x + Vector.Count <= scanline.Length; xLeft += Vector.Count) { @@ -99,23 +99,12 @@ namespace SixLabors.ImageSharp.Formats.Png.Filters res.CopyTo(result.Slice(x + 1)); // + 1 to skip filter type x += Vector.Count; - Vector.Widen( - Vector.Abs(Vector.AsVectorSByte(res)), - out Vector shortLow, - out Vector shortHigh); - - Vector.Widen(shortLow, out Vector intLow, out Vector intHigh); - sumAccumulator += intLow; - sumAccumulator += intHigh; - - Vector.Widen(shortHigh, out intLow, out intHigh); - sumAccumulator += intLow; - sumAccumulator += intHigh; + Numerics.Accumulate(ref sumAccumulator, Vector.AsVectorByte(Vector.Abs(Vector.AsVectorSByte(res)))); } - for (int i = 0; i < Vector.Count; i++) + for (int i = 0; i < Vector.Count; i++) { - sum += sumAccumulator[i]; + sum += (int)sumAccumulator[i]; } } #endif