From 14d2af4bdd9e6a4de7e92053e3ff179470e16e51 Mon Sep 17 00:00:00 2001 From: Sergio Pedri Date: Tue, 15 Dec 2020 23:52:44 +0100 Subject: [PATCH] Codegen improvements to Numerics.Clamp --- src/ImageSharp/Common/Helpers/Numerics.cs | 27 +++++++++++++++-------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/src/ImageSharp/Common/Helpers/Numerics.cs b/src/ImageSharp/Common/Helpers/Numerics.cs index 99d91168bb..b9ccfafe0e 100644 --- a/src/ImageSharp/Common/Helpers/Numerics.cs +++ b/src/ImageSharp/Common/Helpers/Numerics.cs @@ -425,7 +425,6 @@ namespace SixLabors.ImageSharp where T : unmanaged { ref T sRef = ref MemoryMarshal.GetReference(span); - ref Vector vsBase = ref Unsafe.As>(ref MemoryMarshal.GetReference(span)); var vmin = new Vector(min); var vmax = new Vector(max); @@ -433,25 +432,35 @@ namespace SixLabors.ImageSharp int m = Modulo4(n); int u = n - m; - for (int i = 0; i < u; i += 4) - { - ref Vector vs0 = ref Unsafe.Add(ref vsBase, i); - ref Vector vs1 = ref Unsafe.Add(ref vs0, 1); - ref Vector vs2 = ref Unsafe.Add(ref vs0, 2); - ref Vector vs3 = ref Unsafe.Add(ref vs0, 3); + ref Vector vs0 = ref Unsafe.As>(ref MemoryMarshal.GetReference(span)); + ref Vector vs1 = ref Unsafe.Add(ref vs0, 1); + ref Vector vs2 = ref Unsafe.Add(ref vs0, 2); + ref Vector vs3 = ref Unsafe.Add(ref vs0, 3); + ref Vector vsEnd = ref Unsafe.Add(ref vs0, u); + while (Unsafe.IsAddressLessThan(ref vs0, ref vsEnd)) + { vs0 = Vector.Min(Vector.Max(vmin, vs0), vmax); vs1 = Vector.Min(Vector.Max(vmin, vs1), vmax); vs2 = Vector.Min(Vector.Max(vmin, vs2), vmax); vs3 = Vector.Min(Vector.Max(vmin, vs3), vmax); + + vs0 = ref Unsafe.Add(ref vs0, 4); + vs1 = ref Unsafe.Add(ref vs1, 4); + vs2 = ref Unsafe.Add(ref vs2, 4); + vs3 = ref Unsafe.Add(ref vs3, 4); } if (m > 0) { - for (int i = u; i < n; i++) + vs0 = ref vsEnd; + vsEnd = ref Unsafe.Add(ref vsEnd, m); + + while (Unsafe.IsAddressLessThan(ref vs0, ref vsEnd)) { - ref Vector vs0 = ref Unsafe.Add(ref vsBase, i); vs0 = Vector.Min(Vector.Max(vmin, vs0), vmax); + + vs0 = ref Unsafe.Add(ref vs0, 1); } } }