diff --git a/src/coreclr/jit/CMakeLists.txt b/src/coreclr/jit/CMakeLists.txt index 480d9d50350ddc..aa660321075890 100644 --- a/src/coreclr/jit/CMakeLists.txt +++ b/src/coreclr/jit/CMakeLists.txt @@ -402,6 +402,7 @@ set( JIT_ARM64_HEADERS emitfmtsarm64.h emitfmtsarm64sve.h hwintrinsiclistarm64.h + hwintrinsiclistarm64sve.h instrsarm64.h instrsarm64sve.h registerarm64.h diff --git a/src/coreclr/jit/hwintrinsiclistarm64.h b/src/coreclr/jit/hwintrinsiclistarm64.h index cb4c8269d61171..e334a20bd59fe1 100644 --- a/src/coreclr/jit/hwintrinsiclistarm64.h +++ b/src/coreclr/jit/hwintrinsiclistarm64.h @@ -802,6 +802,8 @@ HARDWARE_INTRINSIC(Sha256, ScheduleUpdate1, #endif // FEATURE_HW_INTRINSIC +#include "hwintrinsiclistarm64sve.h" + #undef HARDWARE_INTRINSIC // clang-format on diff --git a/src/coreclr/jit/hwintrinsiclistarm64sve.h b/src/coreclr/jit/hwintrinsiclistarm64sve.h new file mode 100644 index 00000000000000..f8263c40bb0c66 --- /dev/null +++ b/src/coreclr/jit/hwintrinsiclistarm64sve.h @@ -0,0 +1,24 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +/*****************************************************************************/ +#ifndef HARDWARE_INTRINSIC +#error Define HARDWARE_INTRINSIC before including this file +#endif +/*****************************************************************************/ + +// clang-format off + +#ifdef FEATURE_HW_INTRINSICS +// *************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** +// ISA Function name SIMD size NumArg EncodesExtraTypeArg Instructions Category Flags +// {TYP_BYTE, TYP_UBYTE, TYP_SHORT, TYP_USHORT, TYP_INT, TYP_UINT, TYP_LONG, TYP_ULONG, TYP_FLOAT, TYP_DOUBLE} +// *************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** +// SVE Intrinsics + + +#endif // FEATURE_HW_INTRINSIC + +#undef HARDWARE_INTRINSIC + +// clang-format on diff --git a/src/libraries/System.Private.CoreLib/src/ILLink/ILLink.Substitutions.NoArmIntrinsics.xml b/src/libraries/System.Private.CoreLib/src/ILLink/ILLink.Substitutions.NoArmIntrinsics.xml index 1da6f6d57d26e3..7d05d2b47a61fe 100644 --- a/src/libraries/System.Private.CoreLib/src/ILLink/ILLink.Substitutions.NoArmIntrinsics.xml +++ b/src/libraries/System.Private.CoreLib/src/ILLink/ILLink.Substitutions.NoArmIntrinsics.xml @@ -51,5 +51,11 @@ + + + + + + diff --git a/src/libraries/System.Private.CoreLib/src/System.Private.CoreLib.Shared.projitems b/src/libraries/System.Private.CoreLib/src/System.Private.CoreLib.Shared.projitems index e46bd04f7d6958..1213cb5d3cb22b 100644 --- a/src/libraries/System.Private.CoreLib/src/System.Private.CoreLib.Shared.projitems +++ b/src/libraries/System.Private.CoreLib/src/System.Private.CoreLib.Shared.projitems @@ -2632,6 +2632,7 @@ + @@ -2642,6 +2643,7 @@ + diff --git a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve.PlatformNotSupported.cs b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve.PlatformNotSupported.cs new file mode 100644 index 00000000000000..3eeb40d5d9de19 --- /dev/null +++ b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve.PlatformNotSupported.cs @@ -0,0 +1,34 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Diagnostics.CodeAnalysis; +using System.Runtime.CompilerServices; +using System.Runtime.Intrinsics; +using System.Numerics; + +namespace System.Runtime.Intrinsics.Arm +{ + /// + /// This class provides access to the ARM SVE hardware instructions via intrinsics + /// + [CLSCompliant(false)] + [System.Runtime.Versioning.RequiresPreviewFeaturesAttribute("Sve is in preview.")] +#if SYSTEM_PRIVATE_CORELIB + public +#else + internal +#endif + abstract class Sve : AdvSimd + { + internal Sve() { } + + public static new bool IsSupported { [Intrinsic] get { return false; } } + + public new abstract class Arm64 : AdvSimd.Arm64 + { + internal Arm64() { } + + public static new bool IsSupported { [Intrinsic] get { return false; } } + } + } +} diff --git a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve.cs b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve.cs new file mode 100644 index 00000000000000..7a71144e0bc33f --- /dev/null +++ b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve.cs @@ -0,0 +1,31 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Diagnostics.CodeAnalysis; +using System.Runtime.CompilerServices; +using System.Runtime.Intrinsics; +using System.Numerics; + +namespace System.Runtime.Intrinsics.Arm +{ + /// + /// This class provides access to the ARM SVE hardware instructions via intrinsics + /// + [Intrinsic] + [CLSCompliant(false)] + [System.Runtime.Versioning.RequiresPreviewFeaturesAttribute("Sve is in preview.")] + public abstract class Sve : AdvSimd + { + internal Sve() { } + + public static new bool IsSupported { get => IsSupported; } + + [Intrinsic] + public new abstract class Arm64 : AdvSimd.Arm64 + { + internal Arm64() { } + + public static new bool IsSupported { get => IsSupported; } + } + } +} diff --git a/src/libraries/System.Runtime.Intrinsics/ref/System.Runtime.Intrinsics.cs b/src/libraries/System.Runtime.Intrinsics/ref/System.Runtime.Intrinsics.cs index b3db125c2c7ece..1bc93d71e25e82 100644 --- a/src/libraries/System.Runtime.Intrinsics/ref/System.Runtime.Intrinsics.cs +++ b/src/libraries/System.Runtime.Intrinsics/ref/System.Runtime.Intrinsics.cs @@ -4142,6 +4142,19 @@ internal Arm64() { } public static new bool IsSupported { get { throw null; } } } } + [System.CLSCompliantAttribute(false)] + [System.Runtime.Versioning.RequiresPreviewFeaturesAttribute("Sve is in preview.")] + public abstract partial class Sve : System.Runtime.Intrinsics.Arm.AdvSimd + { + internal Sve() { } + public static new bool IsSupported { get { throw null; } } + + public new abstract partial class Arm64 : System.Runtime.Intrinsics.Arm.AdvSimd.Arm64 + { + internal Arm64() { } + public static new bool IsSupported { get { throw null; } } + } + } } namespace System.Runtime.Intrinsics.X86 { diff --git a/src/mono/mono/mini/mini.h b/src/mono/mono/mini/mini.h index cd2cad8e7dcece..8532f788e17ebb 100644 --- a/src/mono/mono/mini/mini.h +++ b/src/mono/mono/mini/mini.h @@ -2927,6 +2927,7 @@ typedef enum { MONO_CPU_ARM64_NEON = 1 << 4, MONO_CPU_ARM64_RDM = 1 << 5, MONO_CPU_ARM64_DP = 1 << 6, + MONO_CPU_ARM64_SVE = 1 << 7, #endif } MonoCPUFeatures; diff --git a/src/mono/mono/mini/simd-intrinsics.c b/src/mono/mono/mini/simd-intrinsics.c index 8955ede9b10506..948e2d86b8f2ac 100644 --- a/src/mono/mono/mini/simd-intrinsics.c +++ b/src/mono/mono/mini/simd-intrinsics.c @@ -3902,6 +3902,7 @@ static const IntrinGroup supported_arm_intrinsics [] = { { "Rdm", MONO_CPU_ARM64_RDM, rdm_methods, sizeof (rdm_methods) }, { "Sha1", MONO_CPU_ARM64_CRYPTO, sha1_methods, sizeof (sha1_methods) }, { "Sha256", MONO_CPU_ARM64_CRYPTO, sha256_methods, sizeof (sha256_methods) }, + { "Sve", MONO_CPU_ARM64_SVE, unsupported, sizeof (unsupported) }, }; static MonoInst* diff --git a/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs b/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs index 30adb388b9f1dc..48761b8619c353 100644 --- a/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs +++ b/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs @@ -2893,6 +2893,12 @@ ("SecureHashTernOpTest.template", new Dictionary { ["TestName"] = "ScheduleUpdate1_Vector128_UInt32", ["Isa"] = "Sha256", ["LoadIsa"] = "AdvSimd", ["Method"] = "ScheduleUpdate1", ["RetVectorType"] = "Vector128", ["RetBaseType"] = "UInt32", ["Op1VectorType"] = "Vector128", ["Op1BaseType"] = "UInt32", ["Op2VectorType"] = "Vector128", ["Op2BaseType"] = "UInt32", ["Op3VectorType"] = "Vector128", ["Op3BaseType"] = "UInt32", ["LargestVectorSize"] = "16", ["NextValueOp1"] = "0x00112233", ["NextValueOp2"] = "0x44556677", ["NextValueOp3"] = "0x8899AABB", ["ExpectedResult"] = "{0x248F1BDF, 0x248F1BDF, 0xB303DDBA, 0xF74821FE}"}), }; +(string templateFileName, Dictionary templateData)[] SveInputs = Array.Empty<(string templateFileName, Dictionary templateData)>(); +{ + //TODO-SVE: Add SVE tests +}; + + string projectName = args[0]; string templateDirectory = args[1]; string outputDirectory = args[2]; @@ -2910,6 +2916,7 @@ ProcessInputs("Rdm.Arm64", Rdm_Arm64Inputs); ProcessInputs("Sha1", Sha1Inputs); ProcessInputs("Sha256", Sha256Inputs); +ProcessInputs("Sve", SveInputs); void ProcessInputs(string groupName, (string templateFileName, Dictionary templateData)[] inputs) { diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Program.cs b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Program.cs index 08b254882aa74f..4ad42ce51fd0a1 100644 --- a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Program.cs +++ b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Program.cs @@ -21,6 +21,7 @@ public static void PrintSupportedIsa() TestLibrary.TestFramework.LogInformation($" Rdm: {Rdm.IsSupported}"); TestLibrary.TestFramework.LogInformation($" Sha1: {Sha1.IsSupported}"); TestLibrary.TestFramework.LogInformation($" Sha256: {Sha256.IsSupported}"); + TestLibrary.TestFramework.LogInformation($" Sve: {Sve.IsSupported}"); TestLibrary.TestFramework.LogInformation(string.Empty); } } diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Sve/Program.Sve.cs b/src/tests/JIT/HardwareIntrinsics/Arm/Sve/Program.Sve.cs new file mode 100644 index 00000000000000..35fb50d5efb903 --- /dev/null +++ b/src/tests/JIT/HardwareIntrinsics/Arm/Sve/Program.Sve.cs @@ -0,0 +1,16 @@ +// 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.Collections.Generic; + +namespace JIT.HardwareIntrinsics.Arm._Sve +{ + public static partial class Program + { + static Program() + { + JIT.HardwareIntrinsics.Arm.Program.PrintSupportedIsa(); + } + } +} diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Sve/Sve_r.csproj b/src/tests/JIT/HardwareIntrinsics/Arm/Sve/Sve_r.csproj new file mode 100644 index 00000000000000..0918724cfff289 --- /dev/null +++ b/src/tests/JIT/HardwareIntrinsics/Arm/Sve/Sve_r.csproj @@ -0,0 +1,14 @@ + + + true + + + Embedded + + + + + + + + diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Sve/Sve_ro.csproj b/src/tests/JIT/HardwareIntrinsics/Arm/Sve/Sve_ro.csproj new file mode 100644 index 00000000000000..a9d4a43b42ae16 --- /dev/null +++ b/src/tests/JIT/HardwareIntrinsics/Arm/Sve/Sve_ro.csproj @@ -0,0 +1,14 @@ + + + true + + + Embedded + True + + + + + + +