From 6b3f0f7bd9d838b47b97aa676cbd6b3253dabb14 Mon Sep 17 00:00:00 2001 From: Dmitry Pentin Date: Tue, 14 Sep 2021 01:12:39 +0300 Subject: [PATCH] gfoidl fixes --- .../Formats/Jpeg/Components/Block8x8.cs | 10 +++++----- .../Jpeg/Components/Block8x8F.Intrinsic.cs | 6 +++--- .../Formats/Jpeg/Components/Block8x8F.cs | 4 ++-- .../Components/Encoder/HuffmanScanEncoder.cs | 9 +++++---- .../Jpeg/Components/FastFloatingPointDCT.cs | 4 ++-- .../Formats/Jpeg/Components/ZigZag.Intrinsic.cs | 14 ++++---------- .../Formats/Jpg/Block8x8Tests.cs | 16 ++++++++-------- 7 files changed, 29 insertions(+), 34 deletions(-) diff --git a/src/ImageSharp/Formats/Jpeg/Components/Block8x8.cs b/src/ImageSharp/Formats/Jpeg/Components/Block8x8.cs index 71077675d6..9cefedc1d2 100644 --- a/src/ImageSharp/Formats/Jpeg/Components/Block8x8.cs +++ b/src/ImageSharp/Formats/Jpeg/Components/Block8x8.cs @@ -172,7 +172,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components public static Block8x8 Load(Span data) { - Block8x8 result = default; + Unsafe.SkipInit(out Block8x8 result); result.LoadFrom(data); return result; } @@ -204,7 +204,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components { ref byte selfRef = ref Unsafe.As(ref this); ref byte destRef = ref MemoryMarshal.GetReference(MemoryMarshal.Cast(destination)); - Unsafe.CopyBlock(ref destRef, ref selfRef, Size * sizeof(short)); + Unsafe.CopyBlockUnaligned(ref destRef, ref selfRef, Size * sizeof(short)); } /// @@ -287,7 +287,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components /// Index of the last non-zero element. Returns -1 if all elements are equal to zero. /// [MethodImpl(InliningOptions.ShortMethod)] - public int GetLastNonZeroIndex() + public nint GetLastNonZeroIndex() { #if SUPPORTS_RUNTIME_INTRINSICS if (Avx2.IsSupported) @@ -298,7 +298,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components ref Vector256 mcuStride = ref Unsafe.As>(ref this); - for (int i = 3; i >= 0; i--) + for (nint i = 3; i >= 0; i--) { int areEqual = Avx2.MoveMask(Avx2.CompareEqual(Unsafe.Add(ref mcuStride, i), zero16).AsByte()); @@ -325,7 +325,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components else #endif { - int index = Size - 1; + nint index = Size - 1; ref short elemRef = ref Unsafe.As(ref this); while (index >= 0 && Unsafe.Add(ref elemRef, index) == 0) diff --git a/src/ImageSharp/Formats/Jpeg/Components/Block8x8F.Intrinsic.cs b/src/ImageSharp/Formats/Jpeg/Components/Block8x8F.Intrinsic.cs index 733d32892f..e788024721 100644 --- a/src/ImageSharp/Formats/Jpeg/Components/Block8x8F.Intrinsic.cs +++ b/src/ImageSharp/Formats/Jpeg/Components/Block8x8F.Intrinsic.cs @@ -46,7 +46,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components ref Vector256 destRef = ref dest.V01; - for (int i = 0; i < 8; i += 2) + for (nint i = 0; i < 8; i += 2) { Vector256 row0 = Avx.ConvertToVector256Int32(Avx.Multiply(Unsafe.Add(ref aBase, i + 0), Unsafe.Add(ref bBase, i + 0))); Vector256 row1 = Avx.ConvertToVector256Int32(Avx.Multiply(Unsafe.Add(ref aBase, i + 1), Unsafe.Add(ref bBase, i + 1))); @@ -54,7 +54,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components Vector256 row = Avx2.PackSignedSaturate(row0, row1); row = Avx2.PermuteVar8x32(row.AsInt32(), MultiplyIntoInt16ShuffleMask).AsInt16(); - Unsafe.Add(ref destRef, i / 2) = row; + Unsafe.Add(ref destRef, (IntPtr)((uint)i / 2)) = row; } } @@ -73,7 +73,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components Vector128 right = Sse2.ConvertToVector128Int32(Sse.Multiply(Unsafe.Add(ref aBase, i + 1), Unsafe.Add(ref bBase, i + 1))); Vector128 row = Sse2.PackSignedSaturate(left, right); - Unsafe.Add(ref destBase, i / 2) = row; + Unsafe.Add(ref destBase, (IntPtr)((uint)i / 2)) = row; } } diff --git a/src/ImageSharp/Formats/Jpeg/Components/Block8x8F.cs b/src/ImageSharp/Formats/Jpeg/Components/Block8x8F.cs index 24177c5564..986af34178 100644 --- a/src/ImageSharp/Formats/Jpeg/Components/Block8x8F.cs +++ b/src/ImageSharp/Formats/Jpeg/Components/Block8x8F.cs @@ -414,12 +414,12 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components if (Avx2.IsSupported) { MultiplyIntoInt16_Avx2(ref block, ref qt, ref dest); - ZigZag.ApplyZigZagOrderingAvx(ref dest); + ZigZag.ApplyZigZagOrderingAvx2(ref dest); } else if (Ssse3.IsSupported) { MultiplyIntoInt16_Sse2(ref block, ref qt, ref dest); - ZigZag.ApplyZigZagOrderingSse(ref dest); + ZigZag.ApplyZigZagOrderingSsse3(ref dest); } else #endif diff --git a/src/ImageSharp/Formats/Jpeg/Components/Encoder/HuffmanScanEncoder.cs b/src/ImageSharp/Formats/Jpeg/Components/Encoder/HuffmanScanEncoder.cs index 3e6b0e5f4d..35e0e26485 100644 --- a/src/ImageSharp/Formats/Jpeg/Components/Encoder/HuffmanScanEncoder.cs +++ b/src/ImageSharp/Formats/Jpeg/Components/Encoder/HuffmanScanEncoder.cs @@ -115,7 +115,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Encoder private bool IsFlushNeeded { [MethodImpl(MethodImplOptions.AggressiveInlining)] - get => this.emitWriteIndex < this.emitBuffer.Length / 2; + get => this.emitWriteIndex < (uint)this.emitBuffer.Length / 2; } /// @@ -408,15 +408,16 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Encoder // Emit the AC components. int[] acHuffTable = this.huffmanTables[(2 * (int)index) + 1].Values; - int lastValuableIndex = spectralBlock.GetLastNonZeroIndex(); + nint lastValuableIndex = spectralBlock.GetLastNonZeroIndex(); int runLength = 0; - for (int zig = 1; zig <= lastValuableIndex; zig++) + ref short blockRef = ref Unsafe.As(ref spectralBlock); + for (nint zig = 1; zig <= lastValuableIndex; zig++) { const int zeroRun1 = 1 << 4; const int zeroRun16 = 16 << 4; - int ac = spectralBlock[zig]; + int ac = Unsafe.Add(ref blockRef, zig); if (ac == 0) { runLength += zeroRun1; diff --git a/src/ImageSharp/Formats/Jpeg/Components/FastFloatingPointDCT.cs b/src/ImageSharp/Formats/Jpeg/Components/FastFloatingPointDCT.cs index 1c5cfc8d6a..4f7db7c59c 100644 --- a/src/ImageSharp/Formats/Jpeg/Components/FastFloatingPointDCT.cs +++ b/src/ImageSharp/Formats/Jpeg/Components/FastFloatingPointDCT.cs @@ -68,7 +68,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components /// Values are also scaled by 8 so DCT code won't do unnecessary division. /// /// - public static ReadOnlySpan DctReciprocalAdjustmentCoefficients => new float[] + public static readonly float[] DctReciprocalAdjustmentCoefficients = new float[] { 0.125f, 0.09011998f, 0.09567086f, 0.10630376f, 0.125f, 0.15909483f, 0.23096988f, 0.45306373f, 0.09011998f, 0.064972885f, 0.068974845f, 0.07664074f, 0.09011998f, 0.11470097f, 0.16652f, 0.32664075f, @@ -104,7 +104,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components public static void TransformFDCT(ref Block8x8F block) { #if SUPPORTS_RUNTIME_INTRINSICS - if (Avx.IsSupported || Sse.IsSupported) + if (Sse.IsSupported) { ForwardTransformSimd(ref block); } diff --git a/src/ImageSharp/Formats/Jpeg/Components/ZigZag.Intrinsic.cs b/src/ImageSharp/Formats/Jpeg/Components/ZigZag.Intrinsic.cs index 6fa776e2a8..6577739c1a 100644 --- a/src/ImageSharp/Formats/Jpeg/Components/ZigZag.Intrinsic.cs +++ b/src/ImageSharp/Formats/Jpeg/Components/ZigZag.Intrinsic.cs @@ -18,7 +18,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components #pragma warning restore SA1309 /// - /// Gets shuffle vectors for + /// Gets shuffle vectors for /// zig zag implementation. /// private static ReadOnlySpan SseShuffleMasks => new byte[] @@ -63,7 +63,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components }; /// - /// Gets shuffle vectors for + /// Gets shuffle vectors for /// zig zag implementation. /// private static ReadOnlySpan AvxShuffleMasks => new byte[] @@ -126,11 +126,8 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components /// /// Applies zig zag ordering for given 8x8 matrix using SSE cpu intrinsics. /// - /// - /// Requires Ssse3 support. - /// /// Input matrix. - public static unsafe void ApplyZigZagOrderingSse(ref Block8x8 block) + public static unsafe void ApplyZigZagOrderingSsse3(ref Block8x8 block) { DebugGuard.IsTrue(Ssse3.IsSupported, "Ssse3 support is required to run this operation!"); @@ -227,11 +224,8 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components /// /// Applies zig zag ordering for given 8x8 matrix using AVX cpu intrinsics. /// - /// - /// Requires Avx2 support. - /// /// Input matrix. - public static unsafe void ApplyZigZagOrderingAvx(ref Block8x8 block) + public static unsafe void ApplyZigZagOrderingAvx2(ref Block8x8 block) { DebugGuard.IsTrue(Avx2.IsSupported, "Avx2 support is required to run this operation!"); diff --git a/tests/ImageSharp.Tests/Formats/Jpg/Block8x8Tests.cs b/tests/ImageSharp.Tests/Formats/Jpg/Block8x8Tests.cs index 69375ae1b9..3737cce804 100644 --- a/tests/ImageSharp.Tests/Formats/Jpg/Block8x8Tests.cs +++ b/tests/ImageSharp.Tests/Formats/Jpg/Block8x8Tests.cs @@ -130,9 +130,9 @@ namespace SixLabors.ImageSharp.Tests.Formats.Jpg { Block8x8 data = default; - int expected = -1; + nint expected = -1; - int actual = data.GetLastNonZeroIndex(); + nint actual = data.GetLastNonZeroIndex(); Assert.Equal(expected, actual); } @@ -153,9 +153,9 @@ namespace SixLabors.ImageSharp.Tests.Formats.Jpg data[i] = 10; } - int expected = Block8x8.Size - 1; + nint expected = Block8x8.Size - 1; - int actual = data.GetLastNonZeroIndex(); + nint actual = data.GetLastNonZeroIndex(); Assert.Equal(expected, actual); } @@ -182,9 +182,9 @@ namespace SixLabors.ImageSharp.Tests.Formats.Jpg int setIndex = rng.Next(1, Block8x8.Size); data[setIndex] = (short)rng.Next(-2000, 2000); - int expected = setIndex; + nint expected = setIndex; - int actual = data.GetLastNonZeroIndex(); + nint actual = data.GetLastNonZeroIndex(); Assert.Equal(expected, actual); } @@ -219,7 +219,7 @@ namespace SixLabors.ImageSharp.Tests.Formats.Jpg int expected = lastIndex; - int actual = data.GetLastNonZeroIndex(); + nint actual = data.GetLastNonZeroIndex(); Assert.Equal(expected, actual); } @@ -265,7 +265,7 @@ namespace SixLabors.ImageSharp.Tests.Formats.Jpg int expected = secondChunkEnd; - int actual = data.GetLastNonZeroIndex(); + nint actual = data.GetLastNonZeroIndex(); Assert.True(expected == actual, $"Expected: {expected}\nActual: {actual}\nInput matrix: {data}"); }