From f7652ef0e03e2795d112580ddc8f6d8a39db4da2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 21 Nov 2023 12:04:03 -0800 Subject: [PATCH] [release/8.0-staging] Fix Vector512.CopyTo (#95026) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix Vector512.CopyTo * Also unify Vector * Handle float vectors too * Fix legacy vectors * Simplify the change * Update Vector_1.cs * Add tests * Fix build --------- Co-authored-by: MichaƂ Petryka <35800402+MichalPetryka@users.noreply.github.com> --- .../src/System/Runtime/Intrinsics/Vector512.cs | 6 ++---- .../tests/Vectors/Vector128Tests.cs | 16 ++++++++++++++++ .../tests/Vectors/Vector256Tests.cs | 16 ++++++++++++++++ .../tests/Vectors/Vector512Tests.cs | 16 ++++++++++++++++ .../tests/Vectors/Vector64Tests.cs | 16 ++++++++++++++++ 5 files changed, 66 insertions(+), 4 deletions(-) diff --git a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Vector512.cs b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Vector512.cs index f95c2d34c3c5f..824440a5bf2a7 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Vector512.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Vector512.cs @@ -441,8 +441,7 @@ public static void CopyTo(this Vector512 vector, T[] destination) ThrowHelper.ThrowArgumentException_DestinationTooShort(); } - ref byte address = ref Unsafe.As(ref MemoryMarshal.GetArrayDataReference(destination)); - Unsafe.WriteUnaligned(ref address, vector); + Unsafe.WriteUnaligned(ref Unsafe.As(ref destination[0]), vector); } /// Copies a to a given array starting at the specified index. @@ -468,8 +467,7 @@ public static void CopyTo(this Vector512 vector, T[] destination, int star ThrowHelper.ThrowArgumentException_DestinationTooShort(); } - ref byte address = ref Unsafe.As(ref MemoryMarshal.GetArrayDataReference(destination)); - Unsafe.WriteUnaligned(ref Unsafe.Add(ref address, startIndex), vector); + Unsafe.WriteUnaligned(ref Unsafe.As(ref destination[startIndex]), vector); } /// Copies a to a given span. diff --git a/src/libraries/System.Runtime.Intrinsics/tests/Vectors/Vector128Tests.cs b/src/libraries/System.Runtime.Intrinsics/tests/Vectors/Vector128Tests.cs index 3894d835a60b0..cf1f6cec9be38 100644 --- a/src/libraries/System.Runtime.Intrinsics/tests/Vectors/Vector128Tests.cs +++ b/src/libraries/System.Runtime.Intrinsics/tests/Vectors/Vector128Tests.cs @@ -4517,6 +4517,22 @@ public void Vector128SingleEqualsNonCanonicalNaNTest() } } + [Fact] + public void Vector128SingleCopyToTest() + { + float[] array = new float[4]; + Vector128.Create(2.0f).CopyTo(array); + Assert.True(array.AsSpan().SequenceEqual([2.0f, 2.0f, 2.0f, 2.0f])); + } + + [Fact] + public void Vector128SingleCopyToOffsetTest() + { + float[] array = new float[5]; + Vector128.Create(2.0f).CopyTo(array, 1); + Assert.True(array.AsSpan().SequenceEqual([0.0f, 2.0f, 2.0f, 2.0f, 2.0f])); + } + [Fact] public void IsSupportedByte() => TestIsSupported(); diff --git a/src/libraries/System.Runtime.Intrinsics/tests/Vectors/Vector256Tests.cs b/src/libraries/System.Runtime.Intrinsics/tests/Vectors/Vector256Tests.cs index 6bdc86bc46f43..95c05c50310fe 100644 --- a/src/libraries/System.Runtime.Intrinsics/tests/Vectors/Vector256Tests.cs +++ b/src/libraries/System.Runtime.Intrinsics/tests/Vectors/Vector256Tests.cs @@ -5539,6 +5539,22 @@ public void Vector256SingleEqualsNonCanonicalNaNTest() } } + [Fact] + public void Vector256SingleCopyToTest() + { + float[] array = new float[8]; + Vector256.Create(2.0f).CopyTo(array); + Assert.True(array.AsSpan().SequenceEqual([2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f])); + } + + [Fact] + public void Vector256SingleCopyToOffsetTest() + { + float[] array = new float[9]; + Vector256.Create(2.0f).CopyTo(array, 1); + Assert.True(array.AsSpan().SequenceEqual([0.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f])); + } + [Fact] public void IsSupportedByte() => TestIsSupported(); diff --git a/src/libraries/System.Runtime.Intrinsics/tests/Vectors/Vector512Tests.cs b/src/libraries/System.Runtime.Intrinsics/tests/Vectors/Vector512Tests.cs index 4922cf8cab858..2b97f49d91498 100644 --- a/src/libraries/System.Runtime.Intrinsics/tests/Vectors/Vector512Tests.cs +++ b/src/libraries/System.Runtime.Intrinsics/tests/Vectors/Vector512Tests.cs @@ -5016,6 +5016,22 @@ public void Vector512SingleEqualsNonCanonicalNaNTest() } } + [Fact] + public void Vector512SingleCopyToTest() + { + float[] array = new float[16]; + Vector512.Create(2.0f).CopyTo(array); + Assert.True(array.AsSpan().SequenceEqual([2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f])); + } + + [Fact] + public void Vector512SingleCopyToOffsetTest() + { + float[] array = new float[17]; + Vector512.Create(2.0f).CopyTo(array, 1); + Assert.True(array.AsSpan().SequenceEqual([0.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f])); + } + [Fact] public void IsSupportedByte() => TestIsSupported(); diff --git a/src/libraries/System.Runtime.Intrinsics/tests/Vectors/Vector64Tests.cs b/src/libraries/System.Runtime.Intrinsics/tests/Vectors/Vector64Tests.cs index 8596f3b0ff786..46aed6abbb06a 100644 --- a/src/libraries/System.Runtime.Intrinsics/tests/Vectors/Vector64Tests.cs +++ b/src/libraries/System.Runtime.Intrinsics/tests/Vectors/Vector64Tests.cs @@ -3937,6 +3937,22 @@ public void Vector64SingleEqualsNonCanonicalNaNTest() } } + [Fact] + public void Vector64SingleCopyToTest() + { + float[] array = new float[2]; + Vector64.Create(2.0f).CopyTo(array); + Assert.True(array.AsSpan().SequenceEqual([2.0f, 2.0f])); + } + + [Fact] + public void Vector64SingleCopyToOffsetTest() + { + float[] array = new float[3]; + Vector64.Create(2.0f).CopyTo(array, 1); + Assert.True(array.AsSpan().SequenceEqual([0.0f, 2.0f, 2.0f])); + } + [Fact] public void IsSupportedByte() => TestIsSupported();