diff --git a/src/ImageSharp/Formats/Jpeg/Components/Block8x8F.cs b/src/ImageSharp/Formats/Jpeg/Components/Block8x8F.cs index 30bb59f1ba..87b8d8fb22 100644 --- a/src/ImageSharp/Formats/Jpeg/Components/Block8x8F.cs +++ b/src/ImageSharp/Formats/Jpeg/Components/Block8x8F.cs @@ -561,53 +561,20 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components var vadd = Vector256.Create(.5F); var vone = Vector256.Create(1f); - // V0 - Vector256 vs0 = Unsafe.As>(ref a.V0L); - Vector256 voff0 = Avx.Multiply(Avx.Min(Avx.Max(vnegOne, vs0), vone), vadd); - Vector256 v0 = Avx.Divide(vs0, Unsafe.As>(ref b.V0L)); - Unsafe.As>(ref a.V0L) = Avx.Add(v0, voff0); - - // V1 - Vector256 vs1 = Unsafe.As>(ref a.V1L); - Vector256 voff1 = Avx.Multiply(Avx.Min(Avx.Max(vnegOne, vs1), vone), vadd); - Vector256 v1 = Avx.Divide(vs1, Unsafe.As>(ref b.V1L)); - Unsafe.As>(ref a.V1L) = Avx.Add(v1, voff1); - - // V2 - Vector256 vs2 = Unsafe.As>(ref a.V2L); - Vector256 voff2 = Avx.Multiply(Avx.Min(Avx.Max(vnegOne, vs2), vone), vadd); - Vector256 v2 = Avx.Divide(vs2, Unsafe.As>(ref b.V2L)); - Unsafe.As>(ref a.V2L) = Avx.Add(v2, voff2); - - // V3 - Vector256 vs3 = Unsafe.As>(ref a.V3L); - Vector256 voff3 = Avx.Multiply(Avx.Min(Avx.Max(vnegOne, vs3), vone), vadd); - Vector256 v3 = Avx.Divide(vs3, Unsafe.As>(ref b.V3L)); - Unsafe.As>(ref a.V3L) = Avx.Add(v3, voff3); - - // V4 - Vector256 vs4 = Unsafe.As>(ref a.V4L); - Vector256 voff4 = Avx.Multiply(Avx.Min(Avx.Max(vnegOne, vs4), vone), vadd); - Vector256 v4 = Avx.Divide(vs4, Unsafe.As>(ref b.V4L)); - Unsafe.As>(ref a.V4L) = Avx.Add(v4, voff4); - - // V5 - Vector256 vs5 = Unsafe.As>(ref a.V5L); - Vector256 voff5 = Avx.Multiply(Avx.Min(Avx.Max(vnegOne, vs5), vone), vadd); - Vector256 v5 = Avx.Divide(vs5, Unsafe.As>(ref b.V5L)); - Unsafe.As>(ref a.V5L) = Avx.Add(v5, voff5); - - // V6 - Vector256 vs6 = Unsafe.As>(ref a.V6L); - Vector256 voff6 = Avx.Multiply(Avx.Min(Avx.Max(vnegOne, vs6), vone), vadd); - Vector256 v6 = Avx.Divide(vs6, Unsafe.As>(ref b.V6L)); - Unsafe.As>(ref a.V6L) = Avx.Add(v6, voff6); - - // V7 - Vector256 vs7 = Unsafe.As>(ref a.V7L); - Vector256 voff7 = Avx.Multiply(Avx.Min(Avx.Max(vnegOne, vs7), vone), vadd); - Vector256 v7 = Avx.Divide(vs7, Unsafe.As>(ref b.V7L)); - Unsafe.As>(ref a.V7L) = Avx.Add(v7, voff7); + ref Vector256 aBase = ref Unsafe.AsRef(Unsafe.As>(ref a.V0L)); + ref Vector256 bBase = ref Unsafe.AsRef(Unsafe.As>(ref b.V0L)); + ref Vector256 aEnd = ref Unsafe.Add(ref aBase, 8); + + while (Unsafe.IsAddressLessThan(ref aBase, ref aEnd)) + { + Vector256 va = Unsafe.Add(ref aBase, 0); + Vector256 voff = Avx.Multiply(Avx.Min(Avx.Max(vnegOne, va), vone), vadd); + Vector256 vdiv = Avx.Divide(va, Unsafe.Add(ref bBase, 0)); + Unsafe.Add(ref aBase, 0) = Avx.Add(Avx.Divide(va, Unsafe.Add(ref bBase, 0)), voff); + + aBase = ref Unsafe.Add(ref aBase, 1); + bBase = ref Unsafe.Add(ref bBase, 1); + } } else #endif