From 22a488d75559c5babb17c6f32f28fd2758727a3d Mon Sep 17 00:00:00 2001 From: EgorBo Date: Wed, 20 Jul 2022 15:22:04 +0200 Subject: [PATCH 1/4] Enable NI_Vector256_Create on AVX1 --- src/coreclr/jit/hwintrinsic.cpp | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/coreclr/jit/hwintrinsic.cpp b/src/coreclr/jit/hwintrinsic.cpp index 00bd37ec5112fb..159d07d2363df9 100644 --- a/src/coreclr/jit/hwintrinsic.cpp +++ b/src/coreclr/jit/hwintrinsic.cpp @@ -319,6 +319,10 @@ NamedIntrinsic HWIntrinsicInfo::lookupId(Compiler* comp, // ISA is unsupported. For Vector256 this is when AVX2 is unsupported since integer types // can't get properly accelerated. + + // We support some Vector256 intrinsics on AVX-only CPUs + bool isLimittedVector256Isa = false; + if (isa == InstructionSet_Vector128) { if (!comp->IsBaselineSimdIsaSupported()) @@ -331,7 +335,14 @@ NamedIntrinsic HWIntrinsicInfo::lookupId(Compiler* comp, { if (!comp->compOpportunisticallyDependsOn(InstructionSet_AVX2)) { - return NI_Illegal; + if (comp->compOpportunisticallyDependsOn(InstructionSet_AVX)) + { + isLimittedVector256Isa = true; + } + else + { + return NI_Illegal; + } } } #elif defined(TARGET_ARM64) @@ -362,7 +373,14 @@ NamedIntrinsic HWIntrinsicInfo::lookupId(Compiler* comp, if (strcmp(methodName, intrinsicInfo.name) == 0) { - return intrinsicInfo.id; + NamedIntrinsic ni = intrinsicInfo.id; + + // on AVX1-only CPUs we only support NI_Vector256_Create intrinsic in Vector256 + if (isLimittedVector256Isa && (ni != NI_Vector256_Create)) + { + return NI_Illegal; + } + return ni; } } From f6f2cbf347c3e421b92639c47dd7de2c62ca5f64 Mon Sep 17 00:00:00 2001 From: EgorBo Date: Wed, 20 Jul 2022 15:40:48 +0200 Subject: [PATCH 2/4] Add test --- .../JitBlue/Runtime_72506/Runtime_72506.cs | 49 +++++++++++++++++++ .../Runtime_72506/Runtime_72506.csproj | 19 +++++++ 2 files changed, 68 insertions(+) create mode 100644 src/tests/JIT/Regression/JitBlue/Runtime_72506/Runtime_72506.cs create mode 100644 src/tests/JIT/Regression/JitBlue/Runtime_72506/Runtime_72506.csproj diff --git a/src/tests/JIT/Regression/JitBlue/Runtime_72506/Runtime_72506.cs b/src/tests/JIT/Regression/JitBlue/Runtime_72506/Runtime_72506.cs new file mode 100644 index 00000000000000..42e917af8c78a3 --- /dev/null +++ b/src/tests/JIT/Regression/JitBlue/Runtime_72506/Runtime_72506.cs @@ -0,0 +1,49 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Runtime.CompilerServices; +using System.Runtime.Intrinsics; + +public class Runtime_72506 +{ + private static int retCode = 100; + + public static int Main() + { + // float + AssertEqual(Vector256.Create(1f).ToString(), "<1, 1, 1, 1, 1, 1, 1, 1>"); + AssertEqual(Vector256.CreateScalar(1f).ToString(), "<1, 0, 0, 0, 0, 0, 0, 0>"); + AssertEqual(Vector256.CreateScalarUnsafe(1f).ToScalar().ToString(), "1"); + AssertEqual(Vector256.Create(0.0f, 1, 2, 3, 4, 5, 6, 7).ToString(), "<0, 1, 2, 3, 4, 5, 6, 7>"); + + // double + AssertEqual(Vector256.Create(1.0).ToString(), "<1, 1, 1, 1>"); + AssertEqual(Vector256.CreateScalar(1.0).ToString(), "<1, 0, 0, 0>"); + AssertEqual(Vector256.CreateScalarUnsafe(1.0).ToScalar().ToString(), "1"); + AssertEqual(Vector256.Create(0.0, 1, 2, 3).ToString(), "<0, 1, 2, 3>"); + + // ushort + AssertEqual(Vector256.Create((ushort)1).ToString(), "<1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1>"); + AssertEqual(Vector256.CreateScalar((ushort)1).ToString(), "<1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0>"); + AssertEqual(Vector256.CreateScalarUnsafe((ushort)1).ToScalar().ToString(), "1"); + AssertEqual(Vector256.Create((ushort)0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15).ToString(), "<0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15>"); + + // long + AssertEqual(Vector256.Create((long)1).ToString(), "<1, 1, 1, 1>"); + AssertEqual(Vector256.CreateScalar((long)1).ToString(), "<1, 0, 0, 0>"); + AssertEqual(Vector256.CreateScalarUnsafe((long)1).ToScalar().ToString(), "1"); + AssertEqual(Vector256.Create((long)0, 1, 2, 3).ToString(), "<0, 1, 2, 3>"); + return retCode; + } + + [MethodImpl(MethodImplOptions.NoInlining)] + private static void AssertEqual(string s1, string s2) + { + if (s1 != s2) + { + Console.WriteLine($"{s1} != {s2}"); + retCode++; + } + } +} diff --git a/src/tests/JIT/Regression/JitBlue/Runtime_72506/Runtime_72506.csproj b/src/tests/JIT/Regression/JitBlue/Runtime_72506/Runtime_72506.csproj new file mode 100644 index 00000000000000..e0a6ef450d92e2 --- /dev/null +++ b/src/tests/JIT/Regression/JitBlue/Runtime_72506/Runtime_72506.csproj @@ -0,0 +1,19 @@ + + + Exe + True + + + + + + + + + \ No newline at end of file From c17297c8c027a490cc84eae4d6955df9b42ad2c3 Mon Sep 17 00:00:00 2001 From: EgorBo Date: Wed, 20 Jul 2022 16:10:03 +0200 Subject: [PATCH 3/4] Fix build & fix typo --- src/coreclr/jit/hwintrinsic.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/coreclr/jit/hwintrinsic.cpp b/src/coreclr/jit/hwintrinsic.cpp index 159d07d2363df9..13023b9e4201a3 100644 --- a/src/coreclr/jit/hwintrinsic.cpp +++ b/src/coreclr/jit/hwintrinsic.cpp @@ -319,9 +319,8 @@ NamedIntrinsic HWIntrinsicInfo::lookupId(Compiler* comp, // ISA is unsupported. For Vector256 this is when AVX2 is unsupported since integer types // can't get properly accelerated. - // We support some Vector256 intrinsics on AVX-only CPUs - bool isLimittedVector256Isa = false; + bool isLimitedVector256Isa = false; if (isa == InstructionSet_Vector128) { @@ -337,7 +336,7 @@ NamedIntrinsic HWIntrinsicInfo::lookupId(Compiler* comp, { if (comp->compOpportunisticallyDependsOn(InstructionSet_AVX)) { - isLimittedVector256Isa = true; + isLimitedVector256Isa = true; } else { @@ -375,11 +374,13 @@ NamedIntrinsic HWIntrinsicInfo::lookupId(Compiler* comp, { NamedIntrinsic ni = intrinsicInfo.id; +#if defined(TARGET_XARCH) // on AVX1-only CPUs we only support NI_Vector256_Create intrinsic in Vector256 - if (isLimittedVector256Isa && (ni != NI_Vector256_Create)) + if (isLimitedVector256Isa && (ni != NI_Vector256_Create)) { return NI_Illegal; } +#endif return ni; } } From cce7e2bede1ef22ad5e9b05754ea855471e7daae Mon Sep 17 00:00:00 2001 From: EgorBo Date: Wed, 20 Jul 2022 19:14:31 +0200 Subject: [PATCH 4/4] Remove recursive calls from Vector_.Create --- .../System/Runtime/Intrinsics/Vector128.cs | 648 ++++-------- .../System/Runtime/Intrinsics/Vector256.cs | 924 +++++++----------- .../src/System/Runtime/Intrinsics/Vector64.cs | 430 +++----- 3 files changed, 659 insertions(+), 1343 deletions(-) diff --git a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Vector128.cs b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Vector128.cs index b161fc782558f2..ded1be5db52466 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Vector128.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Vector128.cs @@ -742,37 +742,26 @@ public static unsafe Vector128 Create(T value) [Intrinsic] public static unsafe Vector128 Create(byte value) { - if (Sse2.IsSupported || AdvSimd.IsSupported) - { - return Create(value); - } - - return SoftwareFallback(value); - - static Vector128 SoftwareFallback(byte value) - { - byte* pResult = stackalloc byte[16] - { - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - }; - - return Unsafe.AsRef>(pResult); - } + byte* pResult = stackalloc byte[16] + { + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + }; + return Unsafe.AsRef>(pResult); } /// Creates a new instance with all elements initialized to the specified value. @@ -782,23 +771,12 @@ static Vector128 SoftwareFallback(byte value) [Intrinsic] public static unsafe Vector128 Create(double value) { - if (Sse2.IsSupported || AdvSimd.IsSupported) + double* pResult = stackalloc double[2] { - return Create(value); - } - - return SoftwareFallback(value); - - static Vector128 SoftwareFallback(double value) - { - double* pResult = stackalloc double[2] - { - value, - value, - }; - - return Unsafe.AsRef>(pResult); - } + value, + value, + }; + return Unsafe.AsRef>(pResult); } /// Creates a new instance with all elements initialized to the specified value. @@ -808,29 +786,18 @@ static Vector128 SoftwareFallback(double value) [Intrinsic] public static unsafe Vector128 Create(short value) { - if (Sse2.IsSupported || AdvSimd.IsSupported) - { - return Create(value); - } - - return SoftwareFallback(value); - - static Vector128 SoftwareFallback(short value) - { - short* pResult = stackalloc short[8] - { - value, - value, - value, - value, - value, - value, - value, - value, - }; - - return Unsafe.AsRef>(pResult); - } + short* pResult = stackalloc short[8] + { + value, + value, + value, + value, + value, + value, + value, + value, + }; + return Unsafe.AsRef>(pResult); } /// Creates a new instance with all elements initialized to the specified value. @@ -840,25 +807,14 @@ static Vector128 SoftwareFallback(short value) [Intrinsic] public static unsafe Vector128 Create(int value) { - if (Sse2.IsSupported || AdvSimd.IsSupported) + int* pResult = stackalloc int[4] { - return Create(value); - } - - return SoftwareFallback(value); - - static Vector128 SoftwareFallback(int value) - { - int* pResult = stackalloc int[4] - { - value, - value, - value, - value, - }; - - return Unsafe.AsRef>(pResult); - } + value, + value, + value, + value, + }; + return Unsafe.AsRef>(pResult); } /// Creates a new instance with all elements initialized to the specified value. @@ -868,23 +824,12 @@ static Vector128 SoftwareFallback(int value) [Intrinsic] public static unsafe Vector128 Create(long value) { - if (Sse2.X64.IsSupported || AdvSimd.Arm64.IsSupported) - { - return Create(value); - } - - return SoftwareFallback(value); - - static Vector128 SoftwareFallback(long value) + long* pResult = stackalloc long[2] { - long* pResult = stackalloc long[2] - { - value, - value, - }; - - return Unsafe.AsRef>(pResult); - } + value, + value, + }; + return Unsafe.AsRef>(pResult); } /// Creates a new instance with all elements initialized to the specified value. @@ -893,21 +838,11 @@ static Vector128 SoftwareFallback(long value) [Intrinsic] public static unsafe Vector128 Create(nint value) { - if (Sse2.IsSupported || AdvSimd.IsSupported) - { - return Create(value); - } - - return SoftwareFallback(value); - - static Vector128 SoftwareFallback(nint value) - { #if TARGET_64BIT - return Create((long)value).AsNInt(); + return Create((long)value).AsNInt(); #else - return Create((int)value).AsNInt(); + return Create((int)value).AsNInt(); #endif - } } /// Creates a new instance with all elements initialized to the specified value. @@ -917,21 +852,11 @@ static Vector128 SoftwareFallback(nint value) [CLSCompliant(false)] public static unsafe Vector128 Create(nuint value) { - if (Sse2.IsSupported || AdvSimd.IsSupported) - { - return Create(value); - } - - return SoftwareFallback(value); - - static Vector128 SoftwareFallback(nuint value) - { #if TARGET_64BIT - return Create((ulong)value).AsNUInt(); + return Create((ulong)value).AsNUInt(); #else - return Create((uint)value).AsNUInt(); + return Create((uint)value).AsNUInt(); #endif - } } /// Creates a new instance with all elements initialized to the specified value. @@ -942,37 +867,26 @@ static Vector128 SoftwareFallback(nuint value) [CLSCompliant(false)] public static unsafe Vector128 Create(sbyte value) { - if (Sse2.IsSupported || AdvSimd.IsSupported) - { - return Create(value); - } - - return SoftwareFallback(value); - - static Vector128 SoftwareFallback(sbyte value) - { - sbyte* pResult = stackalloc sbyte[16] - { - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - }; - - return Unsafe.AsRef>(pResult); - } + sbyte* pResult = stackalloc sbyte[16] + { + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + }; + return Unsafe.AsRef>(pResult); } /// Creates a new instance with all elements initialized to the specified value. @@ -982,25 +896,14 @@ static Vector128 SoftwareFallback(sbyte value) [Intrinsic] public static unsafe Vector128 Create(float value) { - if (Sse2.IsSupported || AdvSimd.IsSupported) + float* pResult = stackalloc float[4] { - return Create(value); - } - - return SoftwareFallback(value); - - static Vector128 SoftwareFallback(float value) - { - float* pResult = stackalloc float[4] - { - value, - value, - value, - value, - }; - - return Unsafe.AsRef>(pResult); - } + value, + value, + value, + value, + }; + return Unsafe.AsRef>(pResult); } /// Creates a new instance with all elements initialized to the specified value. @@ -1011,29 +914,18 @@ static Vector128 SoftwareFallback(float value) [CLSCompliant(false)] public static unsafe Vector128 Create(ushort value) { - if (Sse2.IsSupported || AdvSimd.IsSupported) - { - return Create(value); - } - - return SoftwareFallback(value); - - static Vector128 SoftwareFallback(ushort value) - { - ushort* pResult = stackalloc ushort[8] - { - value, - value, - value, - value, - value, - value, - value, - value, - }; - - return Unsafe.AsRef>(pResult); - } + ushort* pResult = stackalloc ushort[8] + { + value, + value, + value, + value, + value, + value, + value, + value, + }; + return Unsafe.AsRef>(pResult); } /// Creates a new instance with all elements initialized to the specified value. @@ -1044,25 +936,14 @@ static Vector128 SoftwareFallback(ushort value) [CLSCompliant(false)] public static unsafe Vector128 Create(uint value) { - if (Sse2.IsSupported || AdvSimd.IsSupported) - { - return Create(value); - } - - return SoftwareFallback(value); - - static Vector128 SoftwareFallback(uint value) + uint* pResult = stackalloc uint[4] { - uint* pResult = stackalloc uint[4] - { - value, - value, - value, - value, - }; - - return Unsafe.AsRef>(pResult); - } + value, + value, + value, + value, + }; + return Unsafe.AsRef>(pResult); } /// Creates a new instance with all elements initialized to the specified value. @@ -1073,23 +954,12 @@ static Vector128 SoftwareFallback(uint value) [CLSCompliant(false)] public static unsafe Vector128 Create(ulong value) { - if (Sse2.X64.IsSupported || AdvSimd.Arm64.IsSupported) - { - return Create(value); - } - - return SoftwareFallback(value); - - static Vector128 SoftwareFallback(ulong value) + ulong* pResult = stackalloc ulong[2] { - ulong* pResult = stackalloc ulong[2] - { - value, - value, - }; - - return Unsafe.AsRef>(pResult); - } + value, + value, + }; + return Unsafe.AsRef>(pResult); } /// Creates a new from a given array. @@ -1168,37 +1038,26 @@ public static Vector128 Create(ReadOnlySpan values) [Intrinsic] public static unsafe Vector128 Create(byte e0, byte e1, byte e2, byte e3, byte e4, byte e5, byte e6, byte e7, byte e8, byte e9, byte e10, byte e11, byte e12, byte e13, byte e14, byte e15) { - if (Sse2.IsSupported || AdvSimd.IsSupported) - { - return Create(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15); - } - - return SoftwareFallback(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15); - - static Vector128 SoftwareFallback(byte e0, byte e1, byte e2, byte e3, byte e4, byte e5, byte e6, byte e7, byte e8, byte e9, byte e10, byte e11, byte e12, byte e13, byte e14, byte e15) - { - byte* pResult = stackalloc byte[16] - { - e0, - e1, - e2, - e3, - e4, - e5, - e6, - e7, - e8, - e9, - e10, - e11, - e12, - e13, - e14, - e15, - }; - - return Unsafe.AsRef>(pResult); - } + byte* pResult = stackalloc byte[16] + { + e0, + e1, + e2, + e3, + e4, + e5, + e6, + e7, + e8, + e9, + e10, + e11, + e12, + e13, + e14, + e15, + }; + return Unsafe.AsRef>(pResult); } /// Creates a new instance with each element initialized to the corresponding specified value. @@ -1209,23 +1068,12 @@ static Vector128 SoftwareFallback(byte e0, byte e1, byte e2, byte e3, byte [Intrinsic] public static unsafe Vector128 Create(double e0, double e1) { - if (Sse2.IsSupported || AdvSimd.IsSupported) + double* pResult = stackalloc double[2] { - return Create(e0, e1); - } - - return SoftwareFallback(e0, e1); - - static Vector128 SoftwareFallback(double e0, double e1) - { - double* pResult = stackalloc double[2] - { - e0, - e1, - }; - - return Unsafe.AsRef>(pResult); - } + e0, + e1, + }; + return Unsafe.AsRef>(pResult); } /// Creates a new instance with each element initialized to the corresponding specified value. @@ -1242,29 +1090,18 @@ static Vector128 SoftwareFallback(double e0, double e1) [Intrinsic] public static unsafe Vector128 Create(short e0, short e1, short e2, short e3, short e4, short e5, short e6, short e7) { - if (Sse2.IsSupported || AdvSimd.IsSupported) - { - return Create(e0, e1, e2, e3, e4, e5, e6, e7); - } - - return SoftwareFallback(e0, e1, e2, e3, e4, e5, e6, e7); - - static Vector128 SoftwareFallback(short e0, short e1, short e2, short e3, short e4, short e5, short e6, short e7) - { - short* pResult = stackalloc short[8] - { - e0, - e1, - e2, - e3, - e4, - e5, - e6, - e7, - }; - - return Unsafe.AsRef>(pResult); - } + short* pResult = stackalloc short[8] + { + e0, + e1, + e2, + e3, + e4, + e5, + e6, + e7, + }; + return Unsafe.AsRef>(pResult); } /// Creates a new instance with each element initialized to the corresponding specified value. @@ -1277,25 +1114,14 @@ static Vector128 SoftwareFallback(short e0, short e1, short e2, short e3, [Intrinsic] public static unsafe Vector128 Create(int e0, int e1, int e2, int e3) { - if (Sse2.IsSupported || AdvSimd.IsSupported) - { - return Create(e0, e1, e2, e3); - } - - return SoftwareFallback(e0, e1, e2, e3); - - static Vector128 SoftwareFallback(int e0, int e1, int e2, int e3) + int* pResult = stackalloc int[4] { - int* pResult = stackalloc int[4] - { - e0, - e1, - e2, - e3, - }; - - return Unsafe.AsRef>(pResult); - } + e0, + e1, + e2, + e3, + }; + return Unsafe.AsRef>(pResult); } /// Creates a new instance with each element initialized to the corresponding specified value. @@ -1306,23 +1132,12 @@ static Vector128 SoftwareFallback(int e0, int e1, int e2, int e3) [Intrinsic] public static unsafe Vector128 Create(long e0, long e1) { - if (Sse2.X64.IsSupported || AdvSimd.Arm64.IsSupported) + long* pResult = stackalloc long[2] { - return Create(e0, e1); - } - - return SoftwareFallback(e0, e1); - - static Vector128 SoftwareFallback(long e0, long e1) - { - long* pResult = stackalloc long[2] - { - e0, - e1, - }; - - return Unsafe.AsRef>(pResult); - } + e0, + e1, + }; + return Unsafe.AsRef>(pResult); } /// Creates a new instance with each element initialized to the corresponding specified value. @@ -1348,37 +1163,26 @@ static Vector128 SoftwareFallback(long e0, long e1) [CLSCompliant(false)] public static unsafe Vector128 Create(sbyte e0, sbyte e1, sbyte e2, sbyte e3, sbyte e4, sbyte e5, sbyte e6, sbyte e7, sbyte e8, sbyte e9, sbyte e10, sbyte e11, sbyte e12, sbyte e13, sbyte e14, sbyte e15) { - if (Sse2.IsSupported || AdvSimd.IsSupported) - { - return Create(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15); - } - - return SoftwareFallback(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15); - - static Vector128 SoftwareFallback(sbyte e0, sbyte e1, sbyte e2, sbyte e3, sbyte e4, sbyte e5, sbyte e6, sbyte e7, sbyte e8, sbyte e9, sbyte e10, sbyte e11, sbyte e12, sbyte e13, sbyte e14, sbyte e15) - { - sbyte* pResult = stackalloc sbyte[16] - { - e0, - e1, - e2, - e3, - e4, - e5, - e6, - e7, - e8, - e9, - e10, - e11, - e12, - e13, - e14, - e15, - }; - - return Unsafe.AsRef>(pResult); - } + sbyte* pResult = stackalloc sbyte[16] + { + e0, + e1, + e2, + e3, + e4, + e5, + e6, + e7, + e8, + e9, + e10, + e11, + e12, + e13, + e14, + e15, + }; + return Unsafe.AsRef>(pResult); } /// Creates a new instance with each element initialized to the corresponding specified value. @@ -1391,25 +1195,14 @@ static Vector128 SoftwareFallback(sbyte e0, sbyte e1, sbyte e2, sbyte e3, [Intrinsic] public static unsafe Vector128 Create(float e0, float e1, float e2, float e3) { - if (Sse2.IsSupported || AdvSimd.IsSupported) - { - return Create(e0, e1, e2, e3); - } - - return SoftwareFallback(e0, e1, e2, e3); - - static Vector128 SoftwareFallback(float e0, float e1, float e2, float e3) + float* pResult = stackalloc float[4] { - float* pResult = stackalloc float[4] - { - e0, - e1, - e2, - e3, - }; - - return Unsafe.AsRef>(pResult); - } + e0, + e1, + e2, + e3, + }; + return Unsafe.AsRef>(pResult); } /// Creates a new instance with each element initialized to the corresponding specified value. @@ -1427,29 +1220,18 @@ static Vector128 SoftwareFallback(float e0, float e1, float e2, float e3) [CLSCompliant(false)] public static unsafe Vector128 Create(ushort e0, ushort e1, ushort e2, ushort e3, ushort e4, ushort e5, ushort e6, ushort e7) { - if (Sse2.IsSupported || AdvSimd.IsSupported) - { - return Create(e0, e1, e2, e3, e4, e5, e6, e7); - } - - return SoftwareFallback(e0, e1, e2, e3, e4, e5, e6, e7); - - static Vector128 SoftwareFallback(ushort e0, ushort e1, ushort e2, ushort e3, ushort e4, ushort e5, ushort e6, ushort e7) - { - ushort* pResult = stackalloc ushort[8] - { - e0, - e1, - e2, - e3, - e4, - e5, - e6, - e7, - }; - - return Unsafe.AsRef>(pResult); - } + ushort* pResult = stackalloc ushort[8] + { + e0, + e1, + e2, + e3, + e4, + e5, + e6, + e7, + }; + return Unsafe.AsRef>(pResult); } /// Creates a new instance with each element initialized to the corresponding specified value. @@ -1463,25 +1245,14 @@ static Vector128 SoftwareFallback(ushort e0, ushort e1, ushort e2, ushor [CLSCompliant(false)] public static unsafe Vector128 Create(uint e0, uint e1, uint e2, uint e3) { - if (Sse2.IsSupported || AdvSimd.IsSupported) - { - return Create(e0, e1, e2, e3); - } - - return SoftwareFallback(e0, e1, e2, e3); - - static Vector128 SoftwareFallback(uint e0, uint e1, uint e2, uint e3) + uint* pResult = stackalloc uint[4] { - uint* pResult = stackalloc uint[4] - { - e0, - e1, - e2, - e3, - }; - - return Unsafe.AsRef>(pResult); - } + e0, + e1, + e2, + e3, + }; + return Unsafe.AsRef>(pResult); } /// Creates a new instance with each element initialized to the corresponding specified value. @@ -1493,23 +1264,12 @@ static Vector128 SoftwareFallback(uint e0, uint e1, uint e2, uint e3) [CLSCompliant(false)] public static unsafe Vector128 Create(ulong e0, ulong e1) { - if (Sse2.X64.IsSupported || AdvSimd.Arm64.IsSupported) - { - return Create(e0, e1); - } - - return SoftwareFallback(e0, e1); - - static Vector128 SoftwareFallback(ulong e0, ulong e1) + ulong* pResult = stackalloc ulong[2] { - ulong* pResult = stackalloc ulong[2] - { - e0, - e1, - }; - - return Unsafe.AsRef>(pResult); - } + e0, + e1, + }; + return Unsafe.AsRef>(pResult); } /// Creates a new instance from two instances. diff --git a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Vector256.cs b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Vector256.cs index 68a8653ac62e23..e689f361ea4f66 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Vector256.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Vector256.cs @@ -690,53 +690,42 @@ public static unsafe Vector256 Create(T value) [Intrinsic] public static unsafe Vector256 Create(byte value) { - if (Avx.IsSupported) - { - return Create(value); - } - - return SoftwareFallback(value); - - static Vector256 SoftwareFallback(byte value) - { - byte* pResult = stackalloc byte[32] - { - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - }; - - return Unsafe.AsRef>(pResult); - } + byte* pResult = stackalloc byte[32] + { + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + }; + return Unsafe.AsRef>(pResult); } /// Creates a new instance with all elements initialized to the specified value. @@ -746,25 +735,14 @@ static Vector256 SoftwareFallback(byte value) [Intrinsic] public static unsafe Vector256 Create(double value) { - if (Avx.IsSupported) - { - return Create(value); - } - - return SoftwareFallback(value); - - static Vector256 SoftwareFallback(double value) + double* pResult = stackalloc double[4] { - double* pResult = stackalloc double[4] - { - value, - value, - value, - value, - }; - - return Unsafe.AsRef>(pResult); - } + value, + value, + value, + value, + }; + return Unsafe.AsRef>(pResult); } /// Creates a new instance with all elements initialized to the specified value. @@ -774,37 +752,26 @@ static Vector256 SoftwareFallback(double value) [Intrinsic] public static unsafe Vector256 Create(short value) { - if (Avx.IsSupported) - { - return Create(value); - } - - return SoftwareFallback(value); - - static Vector256 SoftwareFallback(short value) - { - short* pResult = stackalloc short[16] - { - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - }; - - return Unsafe.AsRef>(pResult); - } + short* pResult = stackalloc short[16] + { + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + }; + return Unsafe.AsRef>(pResult); } /// Creates a new instance with all elements initialized to the specified value. @@ -814,29 +781,18 @@ static Vector256 SoftwareFallback(short value) [Intrinsic] public static unsafe Vector256 Create(int value) { - if (Avx.IsSupported) - { - return Create(value); - } - - return SoftwareFallback(value); - - static Vector256 SoftwareFallback(int value) - { - int* pResult = stackalloc int[8] - { - value, - value, - value, - value, - value, - value, - value, - value, - }; - - return Unsafe.AsRef>(pResult); - } + int* pResult = stackalloc int[8] + { + value, + value, + value, + value, + value, + value, + value, + value, + }; + return Unsafe.AsRef>(pResult); } /// Creates a new instance with all elements initialized to the specified value. @@ -846,25 +802,14 @@ static Vector256 SoftwareFallback(int value) [Intrinsic] public static unsafe Vector256 Create(long value) { - if (Sse2.X64.IsSupported && Avx.IsSupported) - { - return Create(value); - } - - return SoftwareFallback(value); - - static Vector256 SoftwareFallback(long value) + long* pResult = stackalloc long[4] { - long* pResult = stackalloc long[4] - { - value, - value, - value, - value, - }; - - return Unsafe.AsRef>(pResult); - } + value, + value, + value, + value, + }; + return Unsafe.AsRef>(pResult); } /// Creates a new instance with all elements initialized to the specified value. @@ -873,21 +818,11 @@ static Vector256 SoftwareFallback(long value) [Intrinsic] public static unsafe Vector256 Create(nint value) { - if (Avx.IsSupported) - { - return Create(value); - } - - return SoftwareFallback(value); - - static Vector256 SoftwareFallback(nint value) - { #if TARGET_64BIT - return Create((long)value).AsNInt(); + return Create((long)value).AsNInt(); #else - return Create((int)value).AsNInt(); + return Create((int)value).AsNInt(); #endif - } } /// Creates a new instance with all elements initialized to the specified value. @@ -897,21 +832,11 @@ static Vector256 SoftwareFallback(nint value) [CLSCompliant(false)] public static unsafe Vector256 Create(nuint value) { - if (Avx.IsSupported) - { - return Create(value); - } - - return SoftwareFallback(value); - - static Vector256 SoftwareFallback(nuint value) - { #if TARGET_64BIT - return Create((ulong)value).AsNUInt(); + return Create((ulong)value).AsNUInt(); #else - return Create((uint)value).AsNUInt(); + return Create((uint)value).AsNUInt(); #endif - } } /// Creates a new instance with all elements initialized to the specified value. @@ -922,53 +847,42 @@ static Vector256 SoftwareFallback(nuint value) [CLSCompliant(false)] public static unsafe Vector256 Create(sbyte value) { - if (Avx.IsSupported) - { - return Create(value); - } - - return SoftwareFallback(value); - - static Vector256 SoftwareFallback(sbyte value) - { - sbyte* pResult = stackalloc sbyte[32] - { - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - }; - - return Unsafe.AsRef>(pResult); - } + sbyte* pResult = stackalloc sbyte[32] + { + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + }; + return Unsafe.AsRef>(pResult); } /// Creates a new instance with all elements initialized to the specified value. @@ -978,29 +892,18 @@ static Vector256 SoftwareFallback(sbyte value) [Intrinsic] public static unsafe Vector256 Create(float value) { - if (Avx.IsSupported) - { - return Create(value); - } - - return SoftwareFallback(value); - - static Vector256 SoftwareFallback(float value) - { - float* pResult = stackalloc float[8] - { - value, - value, - value, - value, - value, - value, - value, - value, - }; - - return Unsafe.AsRef>(pResult); - } + float* pResult = stackalloc float[8] + { + value, + value, + value, + value, + value, + value, + value, + value, + }; + return Unsafe.AsRef>(pResult); } /// Creates a new instance with all elements initialized to the specified value. @@ -1011,37 +914,26 @@ static Vector256 SoftwareFallback(float value) [CLSCompliant(false)] public static unsafe Vector256 Create(ushort value) { - if (Avx.IsSupported) - { - return Create(value); - } - - return SoftwareFallback(value); - - static Vector256 SoftwareFallback(ushort value) - { - ushort* pResult = stackalloc ushort[16] - { - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - value, - }; - - return Unsafe.AsRef>(pResult); - } + ushort* pResult = stackalloc ushort[16] + { + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + value, + }; + return Unsafe.AsRef>(pResult); } /// Creates a new instance with all elements initialized to the specified value. @@ -1052,29 +944,18 @@ static Vector256 SoftwareFallback(ushort value) [CLSCompliant(false)] public static unsafe Vector256 Create(uint value) { - if (Avx.IsSupported) - { - return Create(value); - } - - return SoftwareFallback(value); - - static Vector256 SoftwareFallback(uint value) - { - uint* pResult = stackalloc uint[8] - { - value, - value, - value, - value, - value, - value, - value, - value, - }; - - return Unsafe.AsRef>(pResult); - } + uint* pResult = stackalloc uint[8] + { + value, + value, + value, + value, + value, + value, + value, + value, + }; + return Unsafe.AsRef>(pResult); } /// Creates a new instance with all elements initialized to the specified value. @@ -1085,25 +966,14 @@ static Vector256 SoftwareFallback(uint value) [CLSCompliant(false)] public static unsafe Vector256 Create(ulong value) { - if (Sse2.X64.IsSupported && Avx.IsSupported) - { - return Create(value); - } - - return SoftwareFallback(value); - - static Vector256 SoftwareFallback(ulong value) + ulong* pResult = stackalloc ulong[4] { - ulong* pResult = stackalloc ulong[4] - { - value, - value, - value, - value, - }; - - return Unsafe.AsRef>(pResult); - } + value, + value, + value, + value, + }; + return Unsafe.AsRef>(pResult); } /// Creates a new from a given array. @@ -1198,53 +1068,42 @@ public static Vector256 Create(ReadOnlySpan values) [Intrinsic] public static unsafe Vector256 Create(byte e0, byte e1, byte e2, byte e3, byte e4, byte e5, byte e6, byte e7, byte e8, byte e9, byte e10, byte e11, byte e12, byte e13, byte e14, byte e15, byte e16, byte e17, byte e18, byte e19, byte e20, byte e21, byte e22, byte e23, byte e24, byte e25, byte e26, byte e27, byte e28, byte e29, byte e30, byte e31) { - if (Avx.IsSupported) - { - return Create(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31); - } - - return SoftwareFallback(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31); - - static Vector256 SoftwareFallback(byte e0, byte e1, byte e2, byte e3, byte e4, byte e5, byte e6, byte e7, byte e8, byte e9, byte e10, byte e11, byte e12, byte e13, byte e14, byte e15, byte e16, byte e17, byte e18, byte e19, byte e20, byte e21, byte e22, byte e23, byte e24, byte e25, byte e26, byte e27, byte e28, byte e29, byte e30, byte e31) - { - byte* pResult = stackalloc byte[32] - { - e0, - e1, - e2, - e3, - e4, - e5, - e6, - e7, - e8, - e9, - e10, - e11, - e12, - e13, - e14, - e15, - e16, - e17, - e18, - e19, - e20, - e21, - e22, - e23, - e24, - e25, - e26, - e27, - e28, - e29, - e30, - e31, - }; - - return Unsafe.AsRef>(pResult); - } + byte* pResult = stackalloc byte[32] + { + e0, + e1, + e2, + e3, + e4, + e5, + e6, + e7, + e8, + e9, + e10, + e11, + e12, + e13, + e14, + e15, + e16, + e17, + e18, + e19, + e20, + e21, + e22, + e23, + e24, + e25, + e26, + e27, + e28, + e29, + e30, + e31, + }; + return Unsafe.AsRef>(pResult); } /// Creates a new instance with each element initialized to the corresponding specified value. @@ -1257,25 +1116,14 @@ static Vector256 SoftwareFallback(byte e0, byte e1, byte e2, byte e3, byte [Intrinsic] public static unsafe Vector256 Create(double e0, double e1, double e2, double e3) { - if (Avx.IsSupported) + double* pResult = stackalloc double[4] { - return Create(e0, e1, e2, e3); - } - - return SoftwareFallback(e0, e1, e2, e3); - - static Vector256 SoftwareFallback(double e0, double e1, double e2, double e3) - { - double* pResult = stackalloc double[4] - { - e0, - e1, - e2, - e3, - }; - - return Unsafe.AsRef>(pResult); - } + e0, + e1, + e2, + e3, + }; + return Unsafe.AsRef>(pResult); } /// Creates a new instance with each element initialized to the corresponding specified value. @@ -1300,37 +1148,26 @@ static Vector256 SoftwareFallback(double e0, double e1, double e2, doubl [Intrinsic] public static unsafe Vector256 Create(short e0, short e1, short e2, short e3, short e4, short e5, short e6, short e7, short e8, short e9, short e10, short e11, short e12, short e13, short e14, short e15) { - if (Avx.IsSupported) - { - return Create(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15); - } - - return SoftwareFallback(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15); - - static Vector256 SoftwareFallback(short e0, short e1, short e2, short e3, short e4, short e5, short e6, short e7, short e8, short e9, short e10, short e11, short e12, short e13, short e14, short e15) - { - short* pResult = stackalloc short[16] - { - e0, - e1, - e2, - e3, - e4, - e5, - e6, - e7, - e8, - e9, - e10, - e11, - e12, - e13, - e14, - e15, - }; - - return Unsafe.AsRef>(pResult); - } + short* pResult = stackalloc short[16] + { + e0, + e1, + e2, + e3, + e4, + e5, + e6, + e7, + e8, + e9, + e10, + e11, + e12, + e13, + e14, + e15, + }; + return Unsafe.AsRef>(pResult); } /// Creates a new instance with each element initialized to the corresponding specified value. @@ -1347,29 +1184,18 @@ static Vector256 SoftwareFallback(short e0, short e1, short e2, short e3, [Intrinsic] public static unsafe Vector256 Create(int e0, int e1, int e2, int e3, int e4, int e5, int e6, int e7) { - if (Avx.IsSupported) - { - return Create(e0, e1, e2, e3, e4, e5, e6, e7); - } - - return SoftwareFallback(e0, e1, e2, e3, e4, e5, e6, e7); - - static Vector256 SoftwareFallback(int e0, int e1, int e2, int e3, int e4, int e5, int e6, int e7) - { - int* pResult = stackalloc int[8] - { - e0, - e1, - e2, - e3, - e4, - e5, - e6, - e7, - }; - - return Unsafe.AsRef>(pResult); - } + int* pResult = stackalloc int[8] + { + e0, + e1, + e2, + e3, + e4, + e5, + e6, + e7, + }; + return Unsafe.AsRef>(pResult); } /// Creates a new instance with each element initialized to the corresponding specified value. @@ -1382,25 +1208,14 @@ static Vector256 SoftwareFallback(int e0, int e1, int e2, int e3, int e4, i [Intrinsic] public static unsafe Vector256 Create(long e0, long e1, long e2, long e3) { - if (Sse2.X64.IsSupported && Avx.IsSupported) - { - return Create(e0, e1, e2, e3); - } - - return SoftwareFallback(e0, e1, e2, e3); - - static Vector256 SoftwareFallback(long e0, long e1, long e2, long e3) + long* pResult = stackalloc long[4] { - long* pResult = stackalloc long[4] - { - e0, - e1, - e2, - e3, - }; - - return Unsafe.AsRef>(pResult); - } + e0, + e1, + e2, + e3, + }; + return Unsafe.AsRef>(pResult); } /// Creates a new instance with each element initialized to the corresponding specified value. @@ -1442,53 +1257,42 @@ static Vector256 SoftwareFallback(long e0, long e1, long e2, long e3) [CLSCompliant(false)] public static unsafe Vector256 Create(sbyte e0, sbyte e1, sbyte e2, sbyte e3, sbyte e4, sbyte e5, sbyte e6, sbyte e7, sbyte e8, sbyte e9, sbyte e10, sbyte e11, sbyte e12, sbyte e13, sbyte e14, sbyte e15, sbyte e16, sbyte e17, sbyte e18, sbyte e19, sbyte e20, sbyte e21, sbyte e22, sbyte e23, sbyte e24, sbyte e25, sbyte e26, sbyte e27, sbyte e28, sbyte e29, sbyte e30, sbyte e31) { - if (Avx.IsSupported) - { - return Create(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31); - } - - return SoftwareFallback(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31); - - static Vector256 SoftwareFallback(sbyte e0, sbyte e1, sbyte e2, sbyte e3, sbyte e4, sbyte e5, sbyte e6, sbyte e7, sbyte e8, sbyte e9, sbyte e10, sbyte e11, sbyte e12, sbyte e13, sbyte e14, sbyte e15, sbyte e16, sbyte e17, sbyte e18, sbyte e19, sbyte e20, sbyte e21, sbyte e22, sbyte e23, sbyte e24, sbyte e25, sbyte e26, sbyte e27, sbyte e28, sbyte e29, sbyte e30, sbyte e31) - { - sbyte* pResult = stackalloc sbyte[32] - { - e0, - e1, - e2, - e3, - e4, - e5, - e6, - e7, - e8, - e9, - e10, - e11, - e12, - e13, - e14, - e15, - e16, - e17, - e18, - e19, - e20, - e21, - e22, - e23, - e24, - e25, - e26, - e27, - e28, - e29, - e30, - e31, - }; - - return Unsafe.AsRef>(pResult); - } + sbyte* pResult = stackalloc sbyte[32] + { + e0, + e1, + e2, + e3, + e4, + e5, + e6, + e7, + e8, + e9, + e10, + e11, + e12, + e13, + e14, + e15, + e16, + e17, + e18, + e19, + e20, + e21, + e22, + e23, + e24, + e25, + e26, + e27, + e28, + e29, + e30, + e31, + }; + return Unsafe.AsRef>(pResult); } /// Creates a new instance with each element initialized to the corresponding specified value. @@ -1505,29 +1309,18 @@ static Vector256 SoftwareFallback(sbyte e0, sbyte e1, sbyte e2, sbyte e3, [Intrinsic] public static unsafe Vector256 Create(float e0, float e1, float e2, float e3, float e4, float e5, float e6, float e7) { - if (Avx.IsSupported) - { - return Create(e0, e1, e2, e3, e4, e5, e6, e7); - } - - return SoftwareFallback(e0, e1, e2, e3, e4, e5, e6, e7); - - static Vector256 SoftwareFallback(float e0, float e1, float e2, float e3, float e4, float e5, float e6, float e7) - { - float* pResult = stackalloc float[8] - { - e0, - e1, - e2, - e3, - e4, - e5, - e6, - e7, - }; - - return Unsafe.AsRef>(pResult); - } + float* pResult = stackalloc float[8] + { + e0, + e1, + e2, + e3, + e4, + e5, + e6, + e7, + }; + return Unsafe.AsRef>(pResult); } /// Creates a new instance with each element initialized to the corresponding specified value. @@ -1553,37 +1346,26 @@ static Vector256 SoftwareFallback(float e0, float e1, float e2, float e3, [CLSCompliant(false)] public static unsafe Vector256 Create(ushort e0, ushort e1, ushort e2, ushort e3, ushort e4, ushort e5, ushort e6, ushort e7, ushort e8, ushort e9, ushort e10, ushort e11, ushort e12, ushort e13, ushort e14, ushort e15) { - if (Avx.IsSupported) - { - return Create(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15); - } - - return SoftwareFallback(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15); - - static Vector256 SoftwareFallback(ushort e0, ushort e1, ushort e2, ushort e3, ushort e4, ushort e5, ushort e6, ushort e7, ushort e8, ushort e9, ushort e10, ushort e11, ushort e12, ushort e13, ushort e14, ushort e15) - { - ushort* pResult = stackalloc ushort[16] - { - e0, - e1, - e2, - e3, - e4, - e5, - e6, - e7, - e8, - e9, - e10, - e11, - e12, - e13, - e14, - e15, - }; - - return Unsafe.AsRef>(pResult); - } + ushort* pResult = stackalloc ushort[16] + { + e0, + e1, + e2, + e3, + e4, + e5, + e6, + e7, + e8, + e9, + e10, + e11, + e12, + e13, + e14, + e15, + }; + return Unsafe.AsRef>(pResult); } /// Creates a new instance with each element initialized to the corresponding specified value. @@ -1601,29 +1383,18 @@ static Vector256 SoftwareFallback(ushort e0, ushort e1, ushort e2, ushor [CLSCompliant(false)] public static unsafe Vector256 Create(uint e0, uint e1, uint e2, uint e3, uint e4, uint e5, uint e6, uint e7) { - if (Avx.IsSupported) - { - return Create(e0, e1, e2, e3, e4, e5, e6, e7); - } - - return SoftwareFallback(e0, e1, e2, e3, e4, e5, e6, e7); - - static Vector256 SoftwareFallback(uint e0, uint e1, uint e2, uint e3, uint e4, uint e5, uint e6, uint e7) - { - uint* pResult = stackalloc uint[8] - { - e0, - e1, - e2, - e3, - e4, - e5, - e6, - e7, - }; - - return Unsafe.AsRef>(pResult); - } + uint* pResult = stackalloc uint[8] + { + e0, + e1, + e2, + e3, + e4, + e5, + e6, + e7, + }; + return Unsafe.AsRef>(pResult); } /// Creates a new instance with each element initialized to the corresponding specified value. @@ -1637,25 +1408,14 @@ static Vector256 SoftwareFallback(uint e0, uint e1, uint e2, uint e3, uint [CLSCompliant(false)] public static unsafe Vector256 Create(ulong e0, ulong e1, ulong e2, ulong e3) { - if (Sse2.X64.IsSupported && Avx.IsSupported) - { - return Create(e0, e1, e2, e3); - } - - return SoftwareFallback(e0, e1, e2, e3); - - static Vector256 SoftwareFallback(ulong e0, ulong e1, ulong e2, ulong e3) + ulong* pResult = stackalloc ulong[4] { - ulong* pResult = stackalloc ulong[4] - { - e0, - e1, - e2, - e3, - }; - - return Unsafe.AsRef>(pResult); - } + e0, + e1, + e2, + e3, + }; + return Unsafe.AsRef>(pResult); } /// Creates a new instance from two instances. diff --git a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Vector64.cs b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Vector64.cs index 018d2d70f848e0..0c16cf2488a137 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Vector64.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Vector64.cs @@ -543,29 +543,18 @@ public static unsafe Vector64 Create(T value) [Intrinsic] public static unsafe Vector64 Create(byte value) { - if (AdvSimd.IsSupported) - { - return Create(value); - } - - return SoftwareFallback(value); - - static Vector64 SoftwareFallback(byte value) - { - byte* pResult = stackalloc byte[8] - { - value, - value, - value, - value, - value, - value, - value, - value, - }; - - return Unsafe.AsRef>(pResult); - } + byte* pResult = stackalloc byte[8] + { + value, + value, + value, + value, + value, + value, + value, + value, + }; + return Unsafe.AsRef>(pResult); } /// Creates a new instance with all elements initialized to the specified value. @@ -574,17 +563,7 @@ static Vector64 SoftwareFallback(byte value) [Intrinsic] public static unsafe Vector64 Create(double value) { - if (AdvSimd.IsSupported) - { - return Create(value); - } - - return SoftwareFallback(value); - - static Vector64 SoftwareFallback(double value) - { - return Unsafe.As>(ref value); - } + return Unsafe.As>(ref value); } /// Creates a new instance with all elements initialized to the specified value. @@ -594,25 +573,14 @@ static Vector64 SoftwareFallback(double value) [Intrinsic] public static unsafe Vector64 Create(short value) { - if (AdvSimd.IsSupported) + short* pResult = stackalloc short[4] { - return Create(value); - } - - return SoftwareFallback(value); - - static Vector64 SoftwareFallback(short value) - { - short* pResult = stackalloc short[4] - { - value, - value, - value, - value, - }; - - return Unsafe.AsRef>(pResult); - } + value, + value, + value, + value, + }; + return Unsafe.AsRef>(pResult); } /// Creates a new instance with all elements initialized to the specified value. @@ -622,23 +590,12 @@ static Vector64 SoftwareFallback(short value) [Intrinsic] public static unsafe Vector64 Create(int value) { - if (AdvSimd.IsSupported) + int* pResult = stackalloc int[2] { - return Create(value); - } - - return SoftwareFallback(value); - - static Vector64 SoftwareFallback(int value) - { - int* pResult = stackalloc int[2] - { - value, - value, - }; - - return Unsafe.AsRef>(pResult); - } + value, + value, + }; + return Unsafe.AsRef>(pResult); } /// Creates a new instance with all elements initialized to the specified value. @@ -647,17 +604,7 @@ static Vector64 SoftwareFallback(int value) [Intrinsic] public static unsafe Vector64 Create(long value) { - if (AdvSimd.Arm64.IsSupported) - { - return Create(value); - } - - return SoftwareFallback(value); - - static Vector64 SoftwareFallback(long value) - { - return Unsafe.As>(ref value); - } + return Unsafe.As>(ref value); } /// Creates a new instance with all elements initialized to the specified value. @@ -666,21 +613,11 @@ static Vector64 SoftwareFallback(long value) [Intrinsic] public static unsafe Vector64 Create(nint value) { - if (AdvSimd.Arm64.IsSupported) - { - return Create(value); - } - - return SoftwareFallback(value); - - static Vector64 SoftwareFallback(nint value) - { #if TARGET_64BIT - return Create((long)value).AsNInt(); + return Create((long)value).AsNInt(); #else - return Create((int)value).AsNInt(); + return Create((int)value).AsNInt(); #endif - } } /// Creates a new instance with all elements initialized to the specified value. @@ -690,21 +627,11 @@ static Vector64 SoftwareFallback(nint value) [CLSCompliant(false)] public static unsafe Vector64 Create(nuint value) { - if (AdvSimd.Arm64.IsSupported) - { - return Create(value); - } - - return SoftwareFallback(value); - - static Vector64 SoftwareFallback(nuint value) - { #if TARGET_64BIT - return Create((ulong)value).AsNUInt(); + return Create((ulong)value).AsNUInt(); #else - return Create((uint)value).AsNUInt(); + return Create((uint)value).AsNUInt(); #endif - } } /// Creates a new instance with all elements initialized to the specified value. @@ -715,29 +642,18 @@ static Vector64 SoftwareFallback(nuint value) [CLSCompliant(false)] public static unsafe Vector64 Create(sbyte value) { - if (AdvSimd.IsSupported) - { - return Create(value); - } - - return SoftwareFallback(value); - - static Vector64 SoftwareFallback(sbyte value) - { - sbyte* pResult = stackalloc sbyte[8] - { - value, - value, - value, - value, - value, - value, - value, - value, - }; - - return Unsafe.AsRef>(pResult); - } + sbyte* pResult = stackalloc sbyte[8] + { + value, + value, + value, + value, + value, + value, + value, + value, + }; + return Unsafe.AsRef>(pResult); } /// Creates a new instance with all elements initialized to the specified value. @@ -746,23 +662,12 @@ static Vector64 SoftwareFallback(sbyte value) [Intrinsic] public static unsafe Vector64 Create(float value) { - if (AdvSimd.IsSupported) - { - return Create(value); - } - - return SoftwareFallback(value); - - static Vector64 SoftwareFallback(float value) + float* pResult = stackalloc float[2] { - float* pResult = stackalloc float[2] - { - value, - value, - }; - - return Unsafe.AsRef>(pResult); - } + value, + value, + }; + return Unsafe.AsRef>(pResult); } /// Creates a new instance with all elements initialized to the specified value. @@ -773,25 +678,14 @@ static Vector64 SoftwareFallback(float value) [CLSCompliant(false)] public static unsafe Vector64 Create(ushort value) { - if (AdvSimd.IsSupported) + ushort* pResult = stackalloc ushort[4] { - return Create(value); - } - - return SoftwareFallback(value); - - static Vector64 SoftwareFallback(ushort value) - { - ushort* pResult = stackalloc ushort[4] - { - value, - value, - value, - value, - }; - - return Unsafe.AsRef>(pResult); - } + value, + value, + value, + value, + }; + return Unsafe.AsRef>(pResult); } /// Creates a new instance with all elements initialized to the specified value. @@ -802,23 +696,12 @@ static Vector64 SoftwareFallback(ushort value) [CLSCompliant(false)] public static unsafe Vector64 Create(uint value) { - if (AdvSimd.IsSupported) + uint* pResult = stackalloc uint[2] { - return Create(value); - } - - return SoftwareFallback(value); - - static Vector64 SoftwareFallback(uint value) - { - uint* pResult = stackalloc uint[2] - { - value, - value, - }; - - return Unsafe.AsRef>(pResult); - } + value, + value, + }; + return Unsafe.AsRef>(pResult); } /// Creates a new instance with all elements initialized to the specified value. @@ -828,17 +711,7 @@ static Vector64 SoftwareFallback(uint value) [CLSCompliant(false)] public static unsafe Vector64 Create(ulong value) { - if (AdvSimd.Arm64.IsSupported) - { - return Create(value); - } - - return SoftwareFallback(value); - - static Vector64 SoftwareFallback(ulong value) - { - return Unsafe.As>(ref value); - } + return Unsafe.As>(ref value); } /// Creates a new from a given array. @@ -909,29 +782,18 @@ public static Vector64 Create(ReadOnlySpan values) [Intrinsic] public static unsafe Vector64 Create(byte e0, byte e1, byte e2, byte e3, byte e4, byte e5, byte e6, byte e7) { - if (AdvSimd.IsSupported) - { - return Create(e0, e1, e2, e3, e4, e5, e6, e7); - } - - return SoftwareFallback(e0, e1, e2, e3, e4, e5, e6, e7); - - static Vector64 SoftwareFallback(byte e0, byte e1, byte e2, byte e3, byte e4, byte e5, byte e6, byte e7) - { - byte* pResult = stackalloc byte[8] - { - e0, - e1, - e2, - e3, - e4, - e5, - e6, - e7, - }; - - return Unsafe.AsRef>(pResult); - } + byte* pResult = stackalloc byte[8] + { + e0, + e1, + e2, + e3, + e4, + e5, + e6, + e7, + }; + return Unsafe.AsRef>(pResult); } /// Creates a new instance with each element initialized to the corresponding specified value. @@ -944,25 +806,14 @@ static Vector64 SoftwareFallback(byte e0, byte e1, byte e2, byte e3, byte [Intrinsic] public static unsafe Vector64 Create(short e0, short e1, short e2, short e3) { - if (AdvSimd.IsSupported) - { - return Create(e0, e1, e2, e3); - } - - return SoftwareFallback(e0, e1, e2, e3); - - static Vector64 SoftwareFallback(short e0, short e1, short e2, short e3) + short* pResult = stackalloc short[4] { - short* pResult = stackalloc short[4] - { - e0, - e1, - e2, - e3, - }; - - return Unsafe.AsRef>(pResult); - } + e0, + e1, + e2, + e3, + }; + return Unsafe.AsRef>(pResult); } /// Creates a new instance with each element initialized to the corresponding specified value. @@ -973,23 +824,12 @@ static Vector64 SoftwareFallback(short e0, short e1, short e2, short e3) [Intrinsic] public static unsafe Vector64 Create(int e0, int e1) { - if (AdvSimd.IsSupported) + int* pResult = stackalloc int[2] { - return Create(e0, e1); - } - - return SoftwareFallback(e0, e1); - - static Vector64 SoftwareFallback(int e0, int e1) - { - int* pResult = stackalloc int[2] - { - e0, - e1, - }; - - return Unsafe.AsRef>(pResult); - } + e0, + e1, + }; + return Unsafe.AsRef>(pResult); } /// Creates a new instance with each element initialized to the corresponding specified value. @@ -1007,29 +847,18 @@ static Vector64 SoftwareFallback(int e0, int e1) [CLSCompliant(false)] public static unsafe Vector64 Create(sbyte e0, sbyte e1, sbyte e2, sbyte e3, sbyte e4, sbyte e5, sbyte e6, sbyte e7) { - if (AdvSimd.IsSupported) - { - return Create(e0, e1, e2, e3, e4, e5, e6, e7); - } - - return SoftwareFallback(e0, e1, e2, e3, e4, e5, e6, e7); - - static Vector64 SoftwareFallback(sbyte e0, sbyte e1, sbyte e2, sbyte e3, sbyte e4, sbyte e5, sbyte e6, sbyte e7) - { - sbyte* pResult = stackalloc sbyte[8] - { - e0, - e1, - e2, - e3, - e4, - e5, - e6, - e7, - }; - - return Unsafe.AsRef>(pResult); - } + sbyte* pResult = stackalloc sbyte[8] + { + e0, + e1, + e2, + e3, + e4, + e5, + e6, + e7, + }; + return Unsafe.AsRef>(pResult); } /// Creates a new instance with each element initialized to the corresponding specified value. @@ -1039,23 +868,12 @@ static Vector64 SoftwareFallback(sbyte e0, sbyte e1, sbyte e2, sbyte e3, [Intrinsic] public static unsafe Vector64 Create(float e0, float e1) { - if (AdvSimd.IsSupported) + float* pResult = stackalloc float[2] { - return Create(e0, e1); - } - - return SoftwareFallback(e0, e1); - - static Vector64 SoftwareFallback(float e0, float e1) - { - float* pResult = stackalloc float[2] - { - e0, - e1, - }; - - return Unsafe.AsRef>(pResult); - } + e0, + e1, + }; + return Unsafe.AsRef>(pResult); } /// Creates a new instance with each element initialized to the corresponding specified value. @@ -1069,25 +887,14 @@ static Vector64 SoftwareFallback(float e0, float e1) [CLSCompliant(false)] public static unsafe Vector64 Create(ushort e0, ushort e1, ushort e2, ushort e3) { - if (AdvSimd.IsSupported) - { - return Create(e0, e1, e2, e3); - } - - return SoftwareFallback(e0, e1, e2, e3); - - static Vector64 SoftwareFallback(ushort e0, ushort e1, ushort e2, ushort e3) + ushort* pResult = stackalloc ushort[4] { - ushort* pResult = stackalloc ushort[4] - { - e0, - e1, - e2, - e3, - }; - - return Unsafe.AsRef>(pResult); - } + e0, + e1, + e2, + e3, + }; + return Unsafe.AsRef>(pResult); } /// Creates a new instance with each element initialized to the corresponding specified value. @@ -1099,23 +906,12 @@ static Vector64 SoftwareFallback(ushort e0, ushort e1, ushort e2, ushort [CLSCompliant(false)] public static unsafe Vector64 Create(uint e0, uint e1) { - if (AdvSimd.IsSupported) - { - return Create(e0, e1); - } - - return SoftwareFallback(e0, e1); - - static Vector64 SoftwareFallback(uint e0, uint e1) + uint* pResult = stackalloc uint[2] { - uint* pResult = stackalloc uint[2] - { - e0, - e1, - }; - - return Unsafe.AsRef>(pResult); - } + e0, + e1, + }; + return Unsafe.AsRef>(pResult); } /// Creates a new instance with the first element initialized to the specified value and the remaining elements initialized to zero.