diff --git a/src/ImageSharp/Common/Helpers/SimdUtils.ExtendedIntrinsics.cs b/src/ImageSharp/Common/Helpers/SimdUtils.ExtendedIntrinsics.cs
index 7d07dcaaed..3c2f189cf6 100644
--- a/src/ImageSharp/Common/Helpers/SimdUtils.ExtendedIntrinsics.cs
+++ b/src/ImageSharp/Common/Helpers/SimdUtils.ExtendedIntrinsics.cs
@@ -3,7 +3,6 @@
using System.Numerics;
using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
// ReSharper disable MemberHidesStaticFromOuterClass
namespace SixLabors.ImageSharp;
@@ -35,148 +34,5 @@ internal static partial class SimdUtils
dest1 = Vector.ConvertToSingle(i1);
dest2 = Vector.ConvertToSingle(i2);
}
-
- ///
- /// as many elements as possible, slicing them down (keeping the remainder).
- ///
- [MethodImpl(InliningOptions.ShortMethod)]
- internal static void ByteToNormalizedFloatReduce(
- ref ReadOnlySpan source,
- ref Span dest)
- {
- DebugGuard.IsTrue(source.Length == dest.Length, nameof(source), "Input spans must be of same length!");
-
- if (!IsAvailable)
- {
- return;
- }
-
- int remainder = Numerics.ModuloP2(source.Length, Vector.Count);
- int adjustedCount = source.Length - remainder;
-
- if (adjustedCount > 0)
- {
- ByteToNormalizedFloat(source[..adjustedCount], dest[..adjustedCount]);
-
- source = source[adjustedCount..];
- dest = dest[adjustedCount..];
- }
- }
-
- ///
- /// as many elements as possible, slicing them down (keeping the remainder).
- ///
- [MethodImpl(InliningOptions.ShortMethod)]
- internal static void NormalizedFloatToByteSaturateReduce(
- ref ReadOnlySpan source,
- ref Span dest)
- {
- DebugGuard.IsTrue(source.Length == dest.Length, nameof(source), "Input spans must be of same length!");
-
- if (!IsAvailable)
- {
- return;
- }
-
- int remainder = Numerics.ModuloP2(source.Length, Vector.Count);
- int adjustedCount = source.Length - remainder;
-
- if (adjustedCount > 0)
- {
- NormalizedFloatToByteSaturate(source[..adjustedCount], dest[..adjustedCount]);
-
- source = source[adjustedCount..];
- dest = dest[adjustedCount..];
- }
- }
-
- ///
- /// Implementation , which is faster on new RyuJIT runtime.
- ///
- internal static void ByteToNormalizedFloat(ReadOnlySpan source, Span dest)
- {
- DebugVerifySpanInput(source, dest, Vector.Count);
-
- nuint n = dest.VectorCount();
-
- ref Vector sourceBase = ref Unsafe.As>(ref MemoryMarshal.GetReference(source));
- ref Vector destBase = ref Unsafe.As>(ref MemoryMarshal.GetReference(dest));
-
- for (nuint i = 0; i < n; i++)
- {
- Vector b = Unsafe.Add(ref sourceBase, i);
-
- Vector.Widen(b, out Vector s0, out Vector s1);
- Vector.Widen(s0, out Vector w0, out Vector w1);
- Vector.Widen(s1, out Vector w2, out Vector w3);
-
- Vector f0 = ConvertToSingle(w0);
- Vector f1 = ConvertToSingle(w1);
- Vector f2 = ConvertToSingle(w2);
- Vector f3 = ConvertToSingle(w3);
-
- ref Vector d = ref Unsafe.Add(ref destBase, i * 4);
- d = f0;
- Unsafe.Add(ref d, 1) = f1;
- Unsafe.Add(ref d, 2) = f2;
- Unsafe.Add(ref d, 3) = f3;
- }
- }
-
- ///
- /// Implementation of , which is faster on new .NET runtime.
- ///
- internal static void NormalizedFloatToByteSaturate(
- ReadOnlySpan source,
- Span dest)
- {
- DebugVerifySpanInput(source, dest, Vector.Count);
-
- nuint n = dest.VectorCount();
-
- ref Vector sourceBase =
- ref Unsafe.As>(ref MemoryMarshal.GetReference(source));
- ref Vector destBase = ref Unsafe.As>(ref MemoryMarshal.GetReference(dest));
-
- for (nuint i = 0; i < n; i++)
- {
- ref Vector s = ref Unsafe.Add(ref sourceBase, i * 4);
-
- Vector f0 = s;
- Vector f1 = Unsafe.Add(ref s, 1);
- Vector f2 = Unsafe.Add(ref s, 2);
- Vector f3 = Unsafe.Add(ref s, 3);
-
- Vector w0 = ConvertToUInt32(f0);
- Vector w1 = ConvertToUInt32(f1);
- Vector w2 = ConvertToUInt32(f2);
- Vector w3 = ConvertToUInt32(f3);
-
- var u0 = Vector.Narrow(w0, w1);
- var u1 = Vector.Narrow(w2, w3);
-
- Unsafe.Add(ref destBase, i) = Vector.Narrow(u0, u1);
- }
- }
-
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- private static Vector ConvertToUInt32(Vector vf)
- {
- var maxBytes = new Vector(255f);
- vf *= maxBytes;
- vf += new Vector(0.5f);
- vf = Vector.Min(Vector.Max(vf, Vector.Zero), maxBytes);
- var vi = Vector.ConvertToInt32(vf);
- return Vector.AsVectorUInt32(vi);
- }
-
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- private static Vector ConvertToSingle(Vector u)
- {
- var vi = Vector.AsVectorInt32(u);
- var v = Vector.ConvertToSingle(vi);
- v *= new Vector(1f / 255f);
- return v;
- }
}
}
diff --git a/src/ImageSharp/Common/Helpers/SimdUtils.FallbackIntrinsics128.cs b/src/ImageSharp/Common/Helpers/SimdUtils.FallbackIntrinsics128.cs
index 90b313fb90..fcf441c476 100644
--- a/src/ImageSharp/Common/Helpers/SimdUtils.FallbackIntrinsics128.cs
+++ b/src/ImageSharp/Common/Helpers/SimdUtils.FallbackIntrinsics128.cs
@@ -39,30 +39,6 @@ internal static partial class SimdUtils
}
}
- ///
- /// as many elements as possible, slicing them down (keeping the remainder).
- ///
- [MethodImpl(InliningOptions.ShortMethod)]
- internal static void NormalizedFloatToByteSaturateReduce(
- ref ReadOnlySpan source,
- ref Span dest)
- {
- DebugGuard.IsTrue(source.Length == dest.Length, nameof(source), "Input spans must be of same length!");
-
- int remainder = Numerics.Modulo4(source.Length);
- int adjustedCount = source.Length - remainder;
-
- if (adjustedCount > 0)
- {
- NormalizedFloatToByteSaturate(
- source[..adjustedCount],
- dest[..adjustedCount]);
-
- source = source[adjustedCount..];
- dest = dest[adjustedCount..];
- }
- }
-
///
/// Implementation of using .
///
@@ -95,43 +71,6 @@ internal static partial class SimdUtils
}
}
- ///
- /// Implementation of using .
- ///
- [MethodImpl(InliningOptions.ColdPath)]
- internal static void NormalizedFloatToByteSaturate(
- ReadOnlySpan source,
- Span dest)
- {
- DebugVerifySpanInput(source, dest, 4);
-
- uint count = (uint)source.Length / 4;
- if (count == 0)
- {
- return;
- }
-
- ref Vector4 sBase = ref Unsafe.As(ref MemoryMarshal.GetReference(source));
- ref ByteVector4 dBase = ref Unsafe.As(ref MemoryMarshal.GetReference(dest));
-
- var half = new Vector4(0.5f);
- var maxBytes = new Vector4(255f);
-
- for (nuint i = 0; i < count; i++)
- {
- Vector4 s = Unsafe.Add(ref sBase, i);
- s *= maxBytes;
- s += half;
- s = Numerics.Clamp(s, Vector4.Zero, maxBytes);
-
- ref ByteVector4 d = ref Unsafe.Add(ref dBase, i);
- d.X = (byte)s.X;
- d.Y = (byte)s.Y;
- d.Z = (byte)s.Z;
- d.W = (byte)s.W;
- }
- }
-
[StructLayout(LayoutKind.Sequential)]
private struct ByteVector4
{
diff --git a/tests/ImageSharp.Benchmarks/Bulk/FromVector4.cs b/tests/ImageSharp.Benchmarks/Bulk/FromVector4.cs
index dff687fa12..53c26a57ea 100644
--- a/tests/ImageSharp.Benchmarks/Bulk/FromVector4.cs
+++ b/tests/ImageSharp.Benchmarks/Bulk/FromVector4.cs
@@ -64,24 +64,6 @@ public abstract class FromVector4
public class FromVector4Rgba32 : FromVector4
{
- [Benchmark]
- public void FallbackIntrinsics128()
- {
- Span sBytes = MemoryMarshal.Cast(this.Source.GetSpan());
- Span dFloats = MemoryMarshal.Cast(this.Destination.GetSpan());
-
- SimdUtils.FallbackIntrinsics128.NormalizedFloatToByteSaturate(sBytes, dFloats);
- }
-
- [Benchmark]
- public void ExtendedIntrinsic()
- {
- Span sBytes = MemoryMarshal.Cast(this.Source.GetSpan());
- Span dFloats = MemoryMarshal.Cast(this.Destination.GetSpan());
-
- SimdUtils.ExtendedIntrinsics.NormalizedFloatToByteSaturate(sBytes, dFloats);
- }
-
[Benchmark]
public void UseHwIntrinsics()
{
diff --git a/tests/ImageSharp.Benchmarks/Bulk/ToVector4_Rgba32.cs b/tests/ImageSharp.Benchmarks/Bulk/ToVector4_Rgba32.cs
index 1ceae84140..9c7ecbc491 100644
--- a/tests/ImageSharp.Benchmarks/Bulk/ToVector4_Rgba32.cs
+++ b/tests/ImageSharp.Benchmarks/Bulk/ToVector4_Rgba32.cs
@@ -30,15 +30,6 @@ public class ToVector4_Rgba32 : ToVector4
this.source.GetSpan(),
this.destination.GetSpan());
- [Benchmark]
- public void ExtendedIntrinsics()
- {
- Span sBytes = MemoryMarshal.Cast(this.source.GetSpan());
- Span dFloats = MemoryMarshal.Cast(this.destination.GetSpan());
-
- SimdUtils.ExtendedIntrinsics.ByteToNormalizedFloat(sBytes, dFloats);
- }
-
[Benchmark]
public void HwIntrinsics()
{
diff --git a/tests/ImageSharp.Tests/Common/SimdUtilsTests.cs b/tests/ImageSharp.Tests/Common/SimdUtilsTests.cs
index 2003716796..e9e4550b04 100644
--- a/tests/ImageSharp.Tests/Common/SimdUtilsTests.cs
+++ b/tests/ImageSharp.Tests/Common/SimdUtilsTests.cs
@@ -122,12 +122,6 @@ public partial class SimdUtilsTests
count,
(s, d) => SimdUtils.FallbackIntrinsics128.ByteToNormalizedFloat(s.Span, d.Span));
- [Theory]
- [MemberData(nameof(ArraySizesDivisibleBy32))]
- public void ExtendedIntrinsics_BulkConvertByteToNormalizedFloat(int count) => TestImpl_BulkConvertByteToNormalizedFloat(
- count,
- (s, d) => SimdUtils.ExtendedIntrinsics.ByteToNormalizedFloat(s.Span, d.Span));
-
[Theory]
[MemberData(nameof(ArraySizesDivisibleBy32))]
public void HwIntrinsics_BulkConvertByteToNormalizedFloat(int count)
@@ -166,18 +160,6 @@ public partial class SimdUtilsTests
Assert.Equal(expected, result, new ApproximateFloatComparer(1e-5f));
}
- [Theory]
- [MemberData(nameof(ArraySizesDivisibleBy4))]
- public void FallbackIntrinsics128_BulkConvertNormalizedFloatToByteClampOverflows(int count) => TestImpl_BulkConvertNormalizedFloatToByteClampOverflows(
- count,
- (s, d) => SimdUtils.FallbackIntrinsics128.NormalizedFloatToByteSaturate(s.Span, d.Span));
-
- [Theory]
- [MemberData(nameof(ArraySizesDivisibleBy32))]
- public void ExtendedIntrinsics_BulkConvertNormalizedFloatToByteClampOverflows(int count) => TestImpl_BulkConvertNormalizedFloatToByteClampOverflows(
- count,
- (s, d) => SimdUtils.ExtendedIntrinsics.NormalizedFloatToByteSaturate(s.Span, d.Span));
-
[Theory]
[InlineData(1234)]
public void ExtendedIntrinsics_ConvertToSingle(short scale)