From b93061adc14eaaf5e83e366f9fba507ad917308c Mon Sep 17 00:00:00 2001 From: Phoebe Owusu <91153139+ebepho@users.noreply.github.com> Date: Tue, 18 Jun 2024 10:19:21 -0700 Subject: [PATCH] Arm64/SVE: Implemented `RoundAwayFromZero`, `RoundToNearest`, `RouteToNegativeInfininty`, `RoundToPositiveInfinity`, `RoundToZero` (#103588) * Added ConverToInt32 and ConvertToUInt32 for float inputs. * Added flags to handle only low predicate registers. * Fix whitespace * Remove special codegen flag * Added new test template for operations with different return types. * Add new test template. * Added api for ConvertToInt32 and ConvertToUInt 32 for double. * Round SVE intrinsics for floats. * Completed Round SVE fp apis. --- src/coreclr/jit/hwintrinsiclistarm64sve.h | 5 + .../Arm/Sve.PlatformNotSupported.cs | 105 ++++++++++++++++++ .../src/System/Runtime/Intrinsics/Arm/Sve.cs | 105 ++++++++++++++++++ .../ref/System.Runtime.Intrinsics.cs | 11 ++ .../GenerateHWIntrinsicTests_Arm.cs | 11 ++ 5 files changed, 237 insertions(+) diff --git a/src/coreclr/jit/hwintrinsiclistarm64sve.h b/src/coreclr/jit/hwintrinsiclistarm64sve.h index 600c1c7d9eaaa..0540b68d54d38 100644 --- a/src/coreclr/jit/hwintrinsiclistarm64sve.h +++ b/src/coreclr/jit/hwintrinsiclistarm64sve.h @@ -169,6 +169,11 @@ HARDWARE_INTRINSIC(Sve, ReverseElement, HARDWARE_INTRINSIC(Sve, ReverseElement16, -1, -1, false, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_revh, INS_sve_revh, INS_sve_revh, INS_sve_revh, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation) HARDWARE_INTRINSIC(Sve, ReverseElement32, -1, -1, false, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_revw, INS_sve_revw, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation) HARDWARE_INTRINSIC(Sve, ReverseElement8, -1, -1, false, {INS_invalid, INS_invalid, INS_sve_revb, INS_sve_revb, INS_sve_revb, INS_sve_revb, INS_sve_revb, INS_sve_revb, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation) +HARDWARE_INTRINSIC(Sve, RoundAwayFromZero, -1, -1, false, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_frinta, INS_sve_frinta}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation) +HARDWARE_INTRINSIC(Sve, RoundToNearest, -1, -1, false, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_frintn, INS_sve_frintn}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation) +HARDWARE_INTRINSIC(Sve, RoundToNegativeInfinity, -1, -1, false, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_frintm, INS_sve_frintm}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation) +HARDWARE_INTRINSIC(Sve, RoundToPositiveInfinity, -1, -1, false, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_frintp, INS_sve_frintp}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation) +HARDWARE_INTRINSIC(Sve, RoundToZero, -1, -1, false, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_frintz, INS_sve_frintz}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation) HARDWARE_INTRINSIC(Sve, SaturatingDecrementBy16BitElementCount, -1, 3, true, {INS_invalid, INS_invalid, INS_sve_sqdech, INS_sve_uqdech, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_HasImmediateOperand|HW_Flag_HasEnumOperand|HW_Flag_SpecialCodeGen|HW_Flag_HasScalarInputVariant|HW_Flag_SpecialImport|HW_Flag_HasRMWSemantics) HARDWARE_INTRINSIC(Sve, SaturatingDecrementBy32BitElementCount, -1, 3, true, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_sqdecw, INS_sve_uqdecw, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_HasImmediateOperand|HW_Flag_HasEnumOperand|HW_Flag_SpecialCodeGen|HW_Flag_HasScalarInputVariant|HW_Flag_SpecialImport|HW_Flag_HasRMWSemantics) HARDWARE_INTRINSIC(Sve, SaturatingDecrementBy64BitElementCount, -1, 3, true, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_sqdecd, INS_sve_uqdecd, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_HasImmediateOperand|HW_Flag_HasEnumOperand|HW_Flag_SpecialCodeGen|HW_Flag_HasScalarInputVariant|HW_Flag_SpecialImport|HW_Flag_HasRMWSemantics) 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 index 493afebaab801..11c5ab6decf0c 100644 --- 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 @@ -4351,6 +4351,111 @@ internal Arm64() { } public static unsafe Vector ReverseElement8(Vector value) { throw new PlatformNotSupportedException(); } + /// RoundAwayFromZero : Round to nearest, ties away from zero + + /// + /// svfloat64_t svrinta[_f64]_m(svfloat64_t inactive, svbool_t pg, svfloat64_t op) + /// FRINTA Ztied.D, Pg/M, Zop.D + /// svfloat64_t svrinta[_f64]_x(svbool_t pg, svfloat64_t op) + /// FRINTA Ztied.D, Pg/M, Ztied.D + /// svfloat64_t svrinta[_f64]_z(svbool_t pg, svfloat64_t op) + /// + public static unsafe Vector RoundAwayFromZero(Vector value) { throw new PlatformNotSupportedException(); } + + /// + /// svfloat32_t svrinta[_f32]_m(svfloat32_t inactive, svbool_t pg, svfloat32_t op) + /// FRINTA Ztied.S, Pg/M, Zop.S + /// svfloat32_t svrinta[_f32]_x(svbool_t pg, svfloat32_t op) + /// FRINTA Ztied.S, Pg/M, Ztied.S + /// svfloat32_t svrinta[_f32]_z(svbool_t pg, svfloat32_t op) + /// + public static unsafe Vector RoundAwayFromZero(Vector value) { throw new PlatformNotSupportedException(); } + + + /// RoundToNearest : Round to nearest, ties to even + + /// + /// svfloat64_t svrintn[_f64]_m(svfloat64_t inactive, svbool_t pg, svfloat64_t op) + /// FRINTN Ztied.D, Pg/M, Zop.D + /// svfloat64_t svrintn[_f64]_x(svbool_t pg, svfloat64_t op) + /// FRINTN Ztied.D, Pg/M, Ztied.D + /// svfloat64_t svrintn[_f64]_z(svbool_t pg, svfloat64_t op) + /// + public static unsafe Vector RoundToNearest(Vector value) { throw new PlatformNotSupportedException(); } + + /// + /// svfloat32_t svrintn[_f32]_m(svfloat32_t inactive, svbool_t pg, svfloat32_t op) + /// FRINTN Ztied.S, Pg/M, Zop.S + /// svfloat32_t svrintn[_f32]_x(svbool_t pg, svfloat32_t op) + /// FRINTN Ztied.S, Pg/M, Ztied.S + /// svfloat32_t svrintn[_f32]_z(svbool_t pg, svfloat32_t op) + /// + public static unsafe Vector RoundToNearest(Vector value) { throw new PlatformNotSupportedException(); } + + + /// RoundToNegativeInfinity : Round towards -∞ + + /// + /// svfloat64_t svrintm[_f64]_m(svfloat64_t inactive, svbool_t pg, svfloat64_t op) + /// FRINTM Ztied.D, Pg/M, Zop.D + /// svfloat64_t svrintm[_f64]_x(svbool_t pg, svfloat64_t op) + /// FRINTM Ztied.D, Pg/M, Ztied.D + /// svfloat64_t svrintm[_f64]_z(svbool_t pg, svfloat64_t op) + /// + public static unsafe Vector RoundToNegativeInfinity(Vector value) { throw new PlatformNotSupportedException(); } + + /// + /// svfloat32_t svrintm[_f32]_m(svfloat32_t inactive, svbool_t pg, svfloat32_t op) + /// FRINTM Ztied.S, Pg/M, Zop.S + /// svfloat32_t svrintm[_f32]_x(svbool_t pg, svfloat32_t op) + /// FRINTM Ztied.S, Pg/M, Ztied.S + /// svfloat32_t svrintm[_f32]_z(svbool_t pg, svfloat32_t op) + /// + public static unsafe Vector RoundToNegativeInfinity(Vector value) { throw new PlatformNotSupportedException(); } + + + /// RoundToPositiveInfinity : Round towards +∞ + + /// + /// svfloat64_t svrintp[_f64]_m(svfloat64_t inactive, svbool_t pg, svfloat64_t op) + /// FRINTP Ztied.D, Pg/M, Zop.D + /// svfloat64_t svrintp[_f64]_x(svbool_t pg, svfloat64_t op) + /// FRINTP Ztied.D, Pg/M, Ztied.D + /// svfloat64_t svrintp[_f64]_z(svbool_t pg, svfloat64_t op) + /// + public static unsafe Vector RoundToPositiveInfinity(Vector value) { throw new PlatformNotSupportedException(); } + + /// + /// svfloat32_t svrintp[_f32]_m(svfloat32_t inactive, svbool_t pg, svfloat32_t op) + /// FRINTP Ztied.S, Pg/M, Zop.S + /// svfloat32_t svrintp[_f32]_x(svbool_t pg, svfloat32_t op) + /// FRINTP Ztied.S, Pg/M, Ztied.S + /// svfloat32_t svrintp[_f32]_z(svbool_t pg, svfloat32_t op) + /// + public static unsafe Vector RoundToPositiveInfinity(Vector value) { throw new PlatformNotSupportedException(); } + + + /// RoundToZero : Round towards zero + + /// + /// svfloat64_t svrintz[_f64]_m(svfloat64_t inactive, svbool_t pg, svfloat64_t op) + /// FRINTZ Ztied.D, Pg/M, Zop.D + /// svfloat64_t svrintz[_f64]_x(svbool_t pg, svfloat64_t op) + /// FRINTZ Ztied.D, Pg/M, Ztied.D + /// svfloat64_t svrintz[_f64]_z(svbool_t pg, svfloat64_t op) + /// + public static unsafe Vector RoundToZero(Vector value) { throw new PlatformNotSupportedException(); } + + /// + /// svfloat32_t svrintz[_f32]_m(svfloat32_t inactive, svbool_t pg, svfloat32_t op) + /// FRINTZ Ztied.S, Pg/M, Zop.S + /// svfloat32_t svrintz[_f32]_x(svbool_t pg, svfloat32_t op) + /// FRINTZ Ztied.S, Pg/M, Ztied.S + /// svfloat32_t svrintz[_f32]_z(svbool_t pg, svfloat32_t op) + /// + public static unsafe Vector RoundToZero(Vector value) { throw new PlatformNotSupportedException(); } + + /// Saturating decrement by number of halfword elements /// 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 index fba023cbb54c6..c8466368c8a41 100644 --- 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 @@ -4405,6 +4405,111 @@ internal Arm64() { } public static unsafe Vector ReverseElement8(Vector value) => ReverseElement8(value); + /// RoundAwayFromZero : Round to nearest, ties away from zero + + /// + /// svfloat64_t svrinta[_f64]_m(svfloat64_t inactive, svbool_t pg, svfloat64_t op) + /// FRINTA Ztied.D, Pg/M, Zop.D + /// svfloat64_t svrinta[_f64]_x(svbool_t pg, svfloat64_t op) + /// FRINTA Ztied.D, Pg/M, Ztied.D + /// svfloat64_t svrinta[_f64]_z(svbool_t pg, svfloat64_t op) + /// + public static unsafe Vector RoundAwayFromZero(Vector value) => RoundAwayFromZero(value); + + /// + /// svfloat32_t svrinta[_f32]_m(svfloat32_t inactive, svbool_t pg, svfloat32_t op) + /// FRINTA Ztied.S, Pg/M, Zop.S + /// svfloat32_t svrinta[_f32]_x(svbool_t pg, svfloat32_t op) + /// FRINTA Ztied.S, Pg/M, Ztied.S + /// svfloat32_t svrinta[_f32]_z(svbool_t pg, svfloat32_t op) + /// + public static unsafe Vector RoundAwayFromZero(Vector value) => RoundAwayFromZero(value); + + + /// RoundToNearest : Round to nearest, ties to even + + /// + /// svfloat64_t svrintn[_f64]_m(svfloat64_t inactive, svbool_t pg, svfloat64_t op) + /// FRINTN Ztied.D, Pg/M, Zop.D + /// svfloat64_t svrintn[_f64]_x(svbool_t pg, svfloat64_t op) + /// FRINTN Ztied.D, Pg/M, Ztied.D + /// svfloat64_t svrintn[_f64]_z(svbool_t pg, svfloat64_t op) + /// + public static unsafe Vector RoundToNearest(Vector value) => RoundToNearest(value); + + /// + /// svfloat32_t svrintn[_f32]_m(svfloat32_t inactive, svbool_t pg, svfloat32_t op) + /// FRINTN Ztied.S, Pg/M, Zop.S + /// svfloat32_t svrintn[_f32]_x(svbool_t pg, svfloat32_t op) + /// FRINTN Ztied.S, Pg/M, Ztied.S + /// svfloat32_t svrintn[_f32]_z(svbool_t pg, svfloat32_t op) + /// + public static unsafe Vector RoundToNearest(Vector value) => RoundToNearest(value); + + + /// RoundToNegativeInfinity : Round towards -∞ + + /// + /// svfloat64_t svrintm[_f64]_m(svfloat64_t inactive, svbool_t pg, svfloat64_t op) + /// FRINTM Ztied.D, Pg/M, Zop.D + /// svfloat64_t svrintm[_f64]_x(svbool_t pg, svfloat64_t op) + /// FRINTM Ztied.D, Pg/M, Ztied.D + /// svfloat64_t svrintm[_f64]_z(svbool_t pg, svfloat64_t op) + /// + public static unsafe Vector RoundToNegativeInfinity(Vector value) => RoundToNegativeInfinity(value); + + /// + /// svfloat32_t svrintm[_f32]_m(svfloat32_t inactive, svbool_t pg, svfloat32_t op) + /// FRINTM Ztied.S, Pg/M, Zop.S + /// svfloat32_t svrintm[_f32]_x(svbool_t pg, svfloat32_t op) + /// FRINTM Ztied.S, Pg/M, Ztied.S + /// svfloat32_t svrintm[_f32]_z(svbool_t pg, svfloat32_t op) + /// + public static unsafe Vector RoundToNegativeInfinity(Vector value) => RoundToNegativeInfinity(value); + + + /// RoundToPositiveInfinity : Round towards +∞ + + /// + /// svfloat64_t svrintp[_f64]_m(svfloat64_t inactive, svbool_t pg, svfloat64_t op) + /// FRINTP Ztied.D, Pg/M, Zop.D + /// svfloat64_t svrintp[_f64]_x(svbool_t pg, svfloat64_t op) + /// FRINTP Ztied.D, Pg/M, Ztied.D + /// svfloat64_t svrintp[_f64]_z(svbool_t pg, svfloat64_t op) + /// + public static unsafe Vector RoundToPositiveInfinity(Vector value) => RoundToPositiveInfinity(value); + + /// + /// svfloat32_t svrintp[_f32]_m(svfloat32_t inactive, svbool_t pg, svfloat32_t op) + /// FRINTP Ztied.S, Pg/M, Zop.S + /// svfloat32_t svrintp[_f32]_x(svbool_t pg, svfloat32_t op) + /// FRINTP Ztied.S, Pg/M, Ztied.S + /// svfloat32_t svrintp[_f32]_z(svbool_t pg, svfloat32_t op) + /// + public static unsafe Vector RoundToPositiveInfinity(Vector value) => RoundToPositiveInfinity(value); + + + /// RoundToZero : Round towards zero + + /// + /// svfloat64_t svrintz[_f64]_m(svfloat64_t inactive, svbool_t pg, svfloat64_t op) + /// FRINTZ Ztied.D, Pg/M, Zop.D + /// svfloat64_t svrintz[_f64]_x(svbool_t pg, svfloat64_t op) + /// FRINTZ Ztied.D, Pg/M, Ztied.D + /// svfloat64_t svrintz[_f64]_z(svbool_t pg, svfloat64_t op) + /// + public static unsafe Vector RoundToZero(Vector value) => RoundToZero(value); + + /// + /// svfloat32_t svrintz[_f32]_m(svfloat32_t inactive, svbool_t pg, svfloat32_t op) + /// FRINTZ Ztied.S, Pg/M, Zop.S + /// svfloat32_t svrintz[_f32]_x(svbool_t pg, svfloat32_t op) + /// FRINTZ Ztied.S, Pg/M, Ztied.S + /// svfloat32_t svrintz[_f32]_z(svbool_t pg, svfloat32_t op) + /// + public static unsafe Vector RoundToZero(Vector value) => RoundToZero(value); + + /// Saturating decrement by number of halfword elements /// 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 c8c4630779654..67e7507757cdb 100644 --- a/src/libraries/System.Runtime.Intrinsics/ref/System.Runtime.Intrinsics.cs +++ b/src/libraries/System.Runtime.Intrinsics/ref/System.Runtime.Intrinsics.cs @@ -4816,6 +4816,17 @@ internal Arm64() { } public static System.Numerics.Vector ReverseElement8(System.Numerics.Vector value) { throw null; } public static System.Numerics.Vector ReverseElement8(System.Numerics.Vector value) { throw null; } + public static System.Numerics.Vector RoundAwayFromZero(System.Numerics.Vector value) { throw null; } + public static System.Numerics.Vector RoundAwayFromZero(System.Numerics.Vector value) { throw null; } + public static System.Numerics.Vector RoundToNearest(System.Numerics.Vector value) { throw null; } + public static System.Numerics.Vector RoundToNearest(System.Numerics.Vector value) { throw null; } + public static System.Numerics.Vector RoundToNegativeInfinity(System.Numerics.Vector value) { throw null; } + public static System.Numerics.Vector RoundToNegativeInfinity(System.Numerics.Vector value) { throw null; } + public static System.Numerics.Vector RoundToPositiveInfinity(System.Numerics.Vector value) { throw null; } + public static System.Numerics.Vector RoundToPositiveInfinity(System.Numerics.Vector value) { throw null; } + public static System.Numerics.Vector RoundToZero(System.Numerics.Vector value) { throw null; } + public static System.Numerics.Vector RoundToZero(System.Numerics.Vector value) { throw null; } + public static int SaturatingDecrementBy16BitElementCount(int value, [ConstantExpected(Min = 1, Max = (byte)(16))] byte scale, [ConstantExpected] SveMaskPattern pattern = SveMaskPattern.All) { throw null; } public static long SaturatingDecrementBy16BitElementCount(long value, [ConstantExpected(Min = 1, Max = (byte)(16))] byte scale, [ConstantExpected] SveMaskPattern pattern = SveMaskPattern.All) { throw null; } public static uint SaturatingDecrementBy16BitElementCount(uint value, [ConstantExpected(Min = 1, Max = (byte)(16))] byte scale, [ConstantExpected] SveMaskPattern pattern = SveMaskPattern.All) { throw null; } diff --git a/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs b/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs index 6a1b0391cdaff..02e6ee69e228b 100644 --- a/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs +++ b/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs @@ -3881,6 +3881,17 @@ ("SveSimpleVecOpTest.template", new Dictionary { ["TestName"] = "SveReverseElement32_long", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ReverseElement32", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["ValidateIterResult"] = "result[i] != Helpers.ReverseElement32(firstOp[i])", ["GetIterResult"] = "Helpers.ReverseElement32(leftOp[i])"}), ("SveSimpleVecOpTest.template", new Dictionary { ["TestName"] = "SveReverseElement32_ulong", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ReverseElement32", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()", ["ValidateIterResult"] = "result[i] != Helpers.ReverseElement32(firstOp[i])", ["GetIterResult"] = "Helpers.ReverseElement32(leftOp[i])"}), + ("SveSimpleVecOpTest.template", new Dictionary { ["TestName"] = "Sve_RoundAwayFromZero_float", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "RoundAwayFromZero", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Single", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Single", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()", ["ValidateIterResult"] = "Helpers.RoundAwayFromZero(firstOp[i]) != result[i]", ["GetIterResult"] = "Helpers.RoundAwayFromZero(leftOp[i])"}), + ("SveSimpleVecOpTest.template", new Dictionary { ["TestName"] = "Sve_RoundAwayFromZero_double", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "RoundAwayFromZero", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Double", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Double", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()", ["ValidateIterResult"] = "Helpers.RoundAwayFromZero(firstOp[i]) != result[i]", ["GetIterResult"] = "Helpers.RoundAwayFromZero(leftOp[i])"}), + ("SveSimpleVecOpTest.template", new Dictionary { ["TestName"] = "Sve_RoundToNearest_float", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "RoundToNearest", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Single", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Single", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()", ["ValidateIterResult"] = "Helpers.RoundToNearest(firstOp[i]) != result[i]", ["GetIterResult"] = "Helpers.RoundToNearest(leftOp[i])"}), + ("SveSimpleVecOpTest.template", new Dictionary { ["TestName"] = "Sve_RoundToNearest_double", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "RoundToNearest", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Double", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Double", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()", ["ValidateIterResult"] = "Helpers.RoundToNearest(firstOp[i]) != result[i]", ["GetIterResult"] = "Helpers.RoundToNearest(leftOp[i])"}), + ("SveSimpleVecOpTest.template", new Dictionary { ["TestName"] = "Sve_RoundToNegativeInfinity_float", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "RoundToNegativeInfinity", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Single", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Single", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()", ["ValidateIterResult"] = "Helpers.RoundToNegativeInfinity(firstOp[i]) != result[i]", ["GetIterResult"] = "Helpers.RoundToNegativeInfinity(leftOp[i])"}), + ("SveSimpleVecOpTest.template", new Dictionary { ["TestName"] = "Sve_RoundToNegativeInfinity_double", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "RoundToNegativeInfinity", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Double", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Double", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()", ["ValidateIterResult"] = "Helpers.RoundToNegativeInfinity(firstOp[i]) != result[i]", ["GetIterResult"] = "Helpers.RoundToNegativeInfinity(leftOp[i])"}), + ("SveSimpleVecOpTest.template", new Dictionary { ["TestName"] = "Sve_RoundToPositiveInfinity_float", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "RoundToPositiveInfinity", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Single", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Single", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()", ["ValidateIterResult"] = "Helpers.RoundToPositiveInfinity(firstOp[i]) != result[i]", ["GetIterResult"] = "Helpers.RoundToPositiveInfinity(leftOp[i])"}), + ("SveSimpleVecOpTest.template", new Dictionary { ["TestName"] = "Sve_RoundToPositiveInfinity_double", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "RoundToPositiveInfinity", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Double", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Double", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()", ["ValidateIterResult"] = "Helpers.RoundToPositiveInfinity(firstOp[i]) != result[i]", ["GetIterResult"] = "Helpers.RoundToPositiveInfinity(leftOp[i])"}), + ("SveSimpleVecOpTest.template", new Dictionary { ["TestName"] = "Sve_RoundToZero_float", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "RoundToZero", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Single", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Single", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()", ["ValidateIterResult"] = "Helpers.RoundToZero(firstOp[i]) != result[i]", ["GetIterResult"] = "Helpers.RoundToZero(leftOp[i])"}), + ("SveSimpleVecOpTest.template", new Dictionary { ["TestName"] = "Sve_RoundToZero_double", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "RoundToZero", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Double", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Double", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()", ["ValidateIterResult"] = "Helpers.RoundToZero(firstOp[i]) != result[i]", ["GetIterResult"] = "Helpers.RoundToZero(leftOp[i])"}), + ("SveVecPairBinOpTest.template", new Dictionary { ["TestName"] = "SveTransposeEven_float", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "TransposeEven", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Single", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Single", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Single", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()", ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()", ["ValidateEntry"] = "result[i] != left[index * 2] || result[i + 1] != right[index * 2]"}), ("SveVecPairBinOpTest.template", new Dictionary { ["TestName"] = "SveTransposeEven_double", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "TransposeEven", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Double", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Double", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Double", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()", ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()", ["ValidateEntry"] = "result[i] != left[index * 2] || result[i + 1] != right[index * 2]"}), ("SveVecPairBinOpTest.template", new Dictionary { ["TestName"] = "SveTransposeEven_sbyte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "TransposeEven", ["RetVectorType"] = "Vector", ["RetBaseType"] = "SByte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "SByte", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["ValidateEntry"] = "result[i] != left[index * 2] || result[i + 1] != right[index * 2]"}),