Browse Source

Move reduce sum to numerics

pull/2356/head
Brian Popow 3 years ago
parent
commit
7483802692
  1. 14
      src/ImageSharp/Common/Helpers/Numerics.cs
  2. 15
      src/ImageSharp/Formats/Webp/Lossy/LossyUtils.cs

14
src/ImageSharp/Common/Helpers/Numerics.cs

@ -5,6 +5,7 @@ using System.Numerics;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Intrinsics;
using System.Runtime.Intrinsics.Arm;
using System.Runtime.Intrinsics.X86;
namespace SixLabors.ImageSharp;
@ -808,6 +809,19 @@ internal static class Numerics
return Sse2.ConvertToInt32(vsum);
}
/// <summary>
/// Reduces elements of the vector into one sum.
/// </summary>
/// <param name="accumulator">The accumulator to reduce.</param>
/// <returns>The sum of all elements.</returns>
[MethodImpl(InliningOptions.ShortMethod)]
public static int ReduceSumArm(Vector128<uint> accumulator)
{
Vector128<ulong> sum2 = AdvSimd.AddPairwiseWidening(accumulator);
Vector64<uint> sum3 = AdvSimd.Add(sum2.GetLower().AsUInt32(), sum2.GetUpper().AsUInt32());
return (int)AdvSimd.Extract(sum3, 0);
}
/// <summary>
/// Reduces even elements of the vector into one sum.
/// </summary>

15
src/ImageSharp/Formats/Webp/Lossy/LossyUtils.cs

@ -226,7 +226,7 @@ internal static class LossyUtils
sum = AccumulateSSE16Neon(a.Slice(y * WebpConstants.Bps), b.Slice(y * WebpConstants.Bps), sum);
}
return ReduceSum(sum);
return Numerics.ReduceSumArm(sum);
}
[MethodImpl(InliningOptions.ShortMethod)]
@ -238,7 +238,7 @@ internal static class LossyUtils
sum = AccumulateSSE16Neon(a.Slice(y * WebpConstants.Bps), b.Slice(y * WebpConstants.Bps), sum);
}
return ReduceSum(sum);
return Numerics.ReduceSumArm(sum);
}
[MethodImpl(InliningOptions.ShortMethod)]
@ -255,7 +255,8 @@ internal static class LossyUtils
// pair-wise adds and widen.
Vector128<uint> sum1 = AdvSimd.AddPairwiseWidening(prod1);
Vector128<uint> sum2 = AdvSimd.AddPairwiseWidening(prod2);
return ReduceSum(AdvSimd.Add(sum1, sum2));
return Numerics.ReduceSumArm(AdvSimd.Add(sum1, sum2));
}
// Load all 4x4 pixels into a single Vector128<uint>
@ -273,14 +274,6 @@ internal static class LossyUtils
}
}
[MethodImpl(InliningOptions.ShortMethod)]
private static int ReduceSum(Vector128<uint> sum)
{
Vector128<ulong> sum2 = AdvSimd.AddPairwiseWidening(sum);
Vector64<uint> sum3 = AdvSimd.Add(sum2.GetLower().AsUInt32(), sum2.GetUpper().AsUInt32());
return (int)AdvSimd.Extract(sum3, 0);
}
[MethodImpl(InliningOptions.ShortMethod)]
private static Vector128<uint> AccumulateSSE16Neon(Span<byte> a, Span<byte> b, Vector128<uint> sum)
{

Loading…
Cancel
Save