From 36d0aeadc3e13dd95c1c03a9b88a2fdd3c963c6e Mon Sep 17 00:00:00 2001 From: TIHan Date: Mon, 13 May 2024 13:25:06 -0700 Subject: [PATCH 01/22] Initial work for sve loadvectorx APIs --- src/coreclr/jit/hwintrinsiclistarm64sve.h | 3 + .../src/System/Runtime/Intrinsics/Arm/Sve.cs | 218 ++++++++++++++++++ 2 files changed, 221 insertions(+) diff --git a/src/coreclr/jit/hwintrinsiclistarm64sve.h b/src/coreclr/jit/hwintrinsiclistarm64sve.h index 7de99a516427ca..7bb2c641ecaf3e 100644 --- a/src/coreclr/jit/hwintrinsiclistarm64sve.h +++ b/src/coreclr/jit/hwintrinsiclistarm64sve.h @@ -89,6 +89,9 @@ HARDWARE_INTRINSIC(Sve, LoadVectorUInt16ZeroExtendToUInt32, HARDWARE_INTRINSIC(Sve, LoadVectorUInt16ZeroExtendToUInt64, -1, 2, false, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_ld1h, INS_invalid, INS_invalid}, HW_Category_MemoryLoad, HW_Flag_Scalable|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation) HARDWARE_INTRINSIC(Sve, LoadVectorUInt32ZeroExtendToInt64, -1, 2, false, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_ld1w, INS_invalid, INS_invalid, INS_invalid}, HW_Category_MemoryLoad, HW_Flag_Scalable|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation) HARDWARE_INTRINSIC(Sve, LoadVectorUInt32ZeroExtendToUInt64, -1, 2, false, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_ld1w, INS_invalid, INS_invalid}, HW_Category_MemoryLoad, HW_Flag_Scalable|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation) +HARDWARE_INTRINSIC(Sve, LoadVectorx2, -1, 2, true, {INS_sve_ld2b, INS_sve_ld2b, INS_sve_ld2h, INS_sve_ld2h, INS_sve_ld2w, INS_sve_ld2w, INS_sve_ld2d, INS_sve_ld2d, INS_sve_ld2w, INS_sve_ld2d}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_MultiReg|HW_Flag_MaskedOperation) +HARDWARE_INTRINSIC(Sve, LoadVectorx3, -1, 2, true, {INS_sve_ld3b, INS_sve_ld3b, INS_sve_ld3h, INS_sve_ld3h, INS_sve_ld3w, INS_sve_ld3w, INS_sve_ld3d, INS_sve_ld3d, INS_sve_ld3w, INS_sve_ld3d}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_MultiReg|HW_Flag_MaskedOperation) +HARDWARE_INTRINSIC(Sve, LoadVectorx4, -1, 2, true, {INS_sve_ld4b, INS_sve_ld4b, INS_sve_ld4h, INS_sve_ld4h, INS_sve_ld4w, INS_sve_ld4w, INS_sve_ld4d, INS_sve_ld4d, INS_sve_ld4w, INS_sve_ld4d}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_MultiReg|HW_Flag_MaskedOperation) HARDWARE_INTRINSIC(Sve, Max, -1, -1, false, {INS_sve_smax, INS_sve_umax, INS_sve_smax, INS_sve_umax, INS_sve_smax, INS_sve_umax, INS_sve_smax, INS_sve_umax, INS_sve_fmax, INS_sve_fmax}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_HasRMWSemantics) HARDWARE_INTRINSIC(Sve, MaxAcross, -1, -1, false, {INS_sve_smaxv, INS_sve_umaxv, INS_sve_smaxv, INS_sve_umaxv, INS_sve_smaxv, INS_sve_umaxv, INS_sve_smaxv, INS_sve_umaxv, INS_sve_fmaxv, INS_sve_fmaxv}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation) HARDWARE_INTRINSIC(Sve, MaxNumber, -1, -1, false, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_fmaxnm, INS_sve_fmaxnm}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_HasRMWSemantics) 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 8546a9a58b7d56..e63331419155cb 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 @@ -1480,6 +1480,224 @@ internal Arm64() { } /// public static unsafe Vector LoadVectorUInt32ZeroExtendToUInt64(Vector mask, uint* address) => LoadVectorUInt32ZeroExtendToUInt64(mask, address); + /// LoadVectorx2 : Load two-element tuples into two vectors + + /// + /// svuint8x2_t svld2[_u8](svbool_t pg, const uint8_t *base) + /// LD2B {Zresult0.B, Zresult1.B}, Pg/Z, [Xarray, Xindex] + /// LD2B {Zresult0.B, Zresult1.B}, Pg/Z, [Xbase, #0, MUL VL] + /// + public static unsafe (Vector, Vector) LoadVectorx2(Vector mask, byte* address) => LoadVectorx2(mask, address); + + /// + /// svfloat64x2_t svld2[_f64](svbool_t pg, const float64_t *base) + /// LD2D {Zresult0.D, Zresult1.D}, Pg/Z, [Xarray, Xindex, LSL #3] + /// LD2D {Zresult0.D, Zresult1.D}, Pg/Z, [Xbase, #0, MUL VL] + /// + public static unsafe (Vector, Vector) LoadVectorx2(Vector mask, double* address) => LoadVectorx2(mask, address); + + /// + /// svint16x2_t svld2[_s16](svbool_t pg, const int16_t *base) + /// LD2H {Zresult0.H, Zresult1.H}, Pg/Z, [Xarray, Xindex, LSL #1] + /// LD2H {Zresult0.H, Zresult1.H}, Pg/Z, [Xbase, #0, MUL VL] + /// + public static unsafe (Vector, Vector) LoadVectorx2(Vector mask, short* address) => LoadVectorx2(mask, address); + + /// + /// svint32x2_t svld2[_s32](svbool_t pg, const int32_t *base) + /// LD2W {Zresult0.S, Zresult1.S}, Pg/Z, [Xarray, Xindex, LSL #2] + /// LD2W {Zresult0.S, Zresult1.S}, Pg/Z, [Xbase, #0, MUL VL] + /// + public static unsafe (Vector, Vector) LoadVectorx2(Vector mask, int* address) => LoadVectorx2(mask, address); + + /// + /// svint64x2_t svld2[_s64](svbool_t pg, const int64_t *base) + /// LD2D {Zresult0.D, Zresult1.D}, Pg/Z, [Xarray, Xindex, LSL #3] + /// LD2D {Zresult0.D, Zresult1.D}, Pg/Z, [Xbase, #0, MUL VL] + /// + public static unsafe (Vector, Vector) LoadVectorx2(Vector mask, long* address) => LoadVectorx2(mask, address); + + /// + /// svint8x2_t svld2[_s8](svbool_t pg, const int8_t *base) + /// LD2B {Zresult0.B, Zresult1.B}, Pg/Z, [Xarray, Xindex] + /// LD2B {Zresult0.B, Zresult1.B}, Pg/Z, [Xbase, #0, MUL VL] + /// + public static unsafe (Vector, Vector) LoadVectorx2(Vector mask, sbyte* address) => LoadVectorx2(mask, address); + + /// + /// svfloat32x2_t svld2[_f32](svbool_t pg, const float32_t *base) + /// LD2W {Zresult0.S, Zresult1.S}, Pg/Z, [Xarray, Xindex, LSL #2] + /// LD2W {Zresult0.S, Zresult1.S}, Pg/Z, [Xbase, #0, MUL VL] + /// + public static unsafe (Vector, Vector) LoadVectorx2(Vector mask, float* address) => LoadVectorx2(mask, address); + + /// + /// svuint16x2_t svld2[_u16](svbool_t pg, const uint16_t *base) + /// LD2H {Zresult0.H, Zresult1.H}, Pg/Z, [Xarray, Xindex, LSL #1] + /// LD2H {Zresult0.H, Zresult1.H}, Pg/Z, [Xbase, #0, MUL VL] + /// + public static unsafe (Vector, Vector) LoadVectorx2(Vector mask, ushort* address) => LoadVectorx2(mask, address); + + /// + /// svuint32x2_t svld2[_u32](svbool_t pg, const uint32_t *base) + /// LD2W {Zresult0.S, Zresult1.S}, Pg/Z, [Xarray, Xindex, LSL #2] + /// LD2W {Zresult0.S, Zresult1.S}, Pg/Z, [Xbase, #0, MUL VL] + /// + public static unsafe (Vector, Vector) LoadVectorx2(Vector mask, uint* address) => LoadVectorx2(mask, address); + + /// + /// svuint64x2_t svld2[_u64](svbool_t pg, const uint64_t *base) + /// LD2D {Zresult0.D, Zresult1.D}, Pg/Z, [Xarray, Xindex, LSL #3] + /// LD2D {Zresult0.D, Zresult1.D}, Pg/Z, [Xbase, #0, MUL VL] + /// + public static unsafe (Vector, Vector) LoadVectorx2(Vector mask, ulong* address) => LoadVectorx2(mask, address); + + + /// LoadVectorx3 : Load three-element tuples into three vectors + + /// + /// svuint8x3_t svld3[_u8](svbool_t pg, const uint8_t *base) + /// LD3B {Zresult0.B - Zresult2.B}, Pg/Z, [Xarray, Xindex] + /// LD3B {Zresult0.B - Zresult2.B}, Pg/Z, [Xbase, #0, MUL VL] + /// + public static unsafe (Vector, Vector, Vector) LoadVectorx3(Vector mask, byte* address) => LoadVectorx3(mask, address); + + /// + /// svfloat64x3_t svld3[_f64](svbool_t pg, const float64_t *base) + /// LD3D {Zresult0.D - Zresult2.D}, Pg/Z, [Xarray, Xindex, LSL #3] + /// LD3D {Zresult0.D - Zresult2.D}, Pg/Z, [Xbase, #0, MUL VL] + /// + public static unsafe (Vector, Vector, Vector) LoadVectorx3(Vector mask, double* address) => LoadVectorx3(mask, address); + + /// + /// svint16x3_t svld3[_s16](svbool_t pg, const int16_t *base) + /// LD3H {Zresult0.H - Zresult2.H}, Pg/Z, [Xarray, Xindex, LSL #1] + /// LD3H {Zresult0.H - Zresult2.H}, Pg/Z, [Xbase, #0, MUL VL] + /// + public static unsafe (Vector, Vector, Vector) LoadVectorx3(Vector mask, short* address) => LoadVectorx3(mask, address); + + /// + /// svint32x3_t svld3[_s32](svbool_t pg, const int32_t *base) + /// LD3W {Zresult0.S - Zresult2.S}, Pg/Z, [Xarray, Xindex, LSL #2] + /// LD3W {Zresult0.S - Zresult2.S}, Pg/Z, [Xbase, #0, MUL VL] + /// + public static unsafe (Vector, Vector, Vector) LoadVectorx3(Vector mask, int* address) => LoadVectorx3(mask, address); + + /// + /// svint64x3_t svld3[_s64](svbool_t pg, const int64_t *base) + /// LD3D {Zresult0.D - Zresult2.D}, Pg/Z, [Xarray, Xindex, LSL #3] + /// LD3D {Zresult0.D - Zresult2.D}, Pg/Z, [Xbase, #0, MUL VL] + /// + public static unsafe (Vector, Vector, Vector) LoadVectorx3(Vector mask, long* address) => LoadVectorx3(mask, address); + + /// + /// svint8x3_t svld3[_s8](svbool_t pg, const int8_t *base) + /// LD3B {Zresult0.B - Zresult2.B}, Pg/Z, [Xarray, Xindex] + /// LD3B {Zresult0.B - Zresult2.B}, Pg/Z, [Xbase, #0, MUL VL] + /// + public static unsafe (Vector, Vector, Vector) LoadVectorx3(Vector mask, sbyte* address) => LoadVectorx3(mask, address); + + /// + /// svfloat32x3_t svld3[_f32](svbool_t pg, const float32_t *base) + /// LD3W {Zresult0.S - Zresult2.S}, Pg/Z, [Xarray, Xindex, LSL #2] + /// LD3W {Zresult0.S - Zresult2.S}, Pg/Z, [Xbase, #0, MUL VL] + /// + public static unsafe (Vector, Vector, Vector) LoadVectorx3(Vector mask, float* address) => LoadVectorx3(mask, address); + + /// + /// svuint16x3_t svld3[_u16](svbool_t pg, const uint16_t *base) + /// LD3H {Zresult0.H - Zresult2.H}, Pg/Z, [Xarray, Xindex, LSL #1] + /// LD3H {Zresult0.H - Zresult2.H}, Pg/Z, [Xbase, #0, MUL VL] + /// + public static unsafe (Vector, Vector, Vector) LoadVectorx3(Vector mask, ushort* address) => LoadVectorx3(mask, address); + + /// + /// svuint32x3_t svld3[_u32](svbool_t pg, const uint32_t *base) + /// LD3W {Zresult0.S - Zresult2.S}, Pg/Z, [Xarray, Xindex, LSL #2] + /// LD3W {Zresult0.S - Zresult2.S}, Pg/Z, [Xbase, #0, MUL VL] + /// + public static unsafe (Vector, Vector, Vector) LoadVectorx3(Vector mask, uint* address) => LoadVectorx3(mask, address); + + /// + /// svuint64x3_t svld3[_u64](svbool_t pg, const uint64_t *base) + /// LD3D {Zresult0.D - Zresult2.D}, Pg/Z, [Xarray, Xindex, LSL #3] + /// LD3D {Zresult0.D - Zresult2.D}, Pg/Z, [Xbase, #0, MUL VL] + /// + public static unsafe (Vector, Vector, Vector) LoadVectorx3(Vector mask, ulong* address) => LoadVectorx3(mask, address); + + + /// LoadVectorx4 : Load four-element tuples into four vectors + + /// + /// svuint8x4_t svld4[_u8](svbool_t pg, const uint8_t *base) + /// LD4B {Zresult0.B - Zresult3.B}, Pg/Z, [Xarray, Xindex] + /// LD4B {Zresult0.B - Zresult3.B}, Pg/Z, [Xbase, #0, MUL VL] + /// + public static unsafe (Vector, Vector, Vector, Vector) LoadVectorx4(Vector mask, byte* address) => LoadVectorx4(mask, address); + + /// + /// svfloat64x4_t svld4[_f64](svbool_t pg, const float64_t *base) + /// LD4D {Zresult0.D - Zresult3.D}, Pg/Z, [Xarray, Xindex, LSL #3] + /// LD4D {Zresult0.D - Zresult3.D}, Pg/Z, [Xbase, #0, MUL VL] + /// + public static unsafe (Vector, Vector, Vector, Vector) LoadVectorx4(Vector mask, double* address) => LoadVectorx4(mask, address); + + /// + /// svint16x4_t svld4[_s16](svbool_t pg, const int16_t *base) + /// LD4H {Zresult0.H - Zresult3.H}, Pg/Z, [Xarray, Xindex, LSL #1] + /// LD4H {Zresult0.H - Zresult3.H}, Pg/Z, [Xbase, #0, MUL VL] + /// + public static unsafe (Vector, Vector, Vector, Vector) LoadVectorx4(Vector mask, short* address) => LoadVectorx4(mask, address); + + /// + /// svint32x4_t svld4[_s32](svbool_t pg, const int32_t *base) + /// LD4W {Zresult0.S - Zresult3.S}, Pg/Z, [Xarray, Xindex, LSL #2] + /// LD4W {Zresult0.S - Zresult3.S}, Pg/Z, [Xbase, #0, MUL VL] + /// + public static unsafe (Vector, Vector, Vector, Vector) LoadVectorx4(Vector mask, int* address) => LoadVectorx4(mask, address); + + /// + /// svint64x4_t svld4[_s64](svbool_t pg, const int64_t *base) + /// LD4D {Zresult0.D - Zresult3.D}, Pg/Z, [Xarray, Xindex, LSL #3] + /// LD4D {Zresult0.D - Zresult3.D}, Pg/Z, [Xbase, #0, MUL VL] + /// + public static unsafe (Vector, Vector, Vector, Vector) LoadVectorx4(Vector mask, long* address) => LoadVectorx4(mask, address); + + /// + /// svint8x4_t svld4[_s8](svbool_t pg, const int8_t *base) + /// LD4B {Zresult0.B - Zresult3.B}, Pg/Z, [Xarray, Xindex] + /// LD4B {Zresult0.B - Zresult3.B}, Pg/Z, [Xbase, #0, MUL VL] + /// + public static unsafe (Vector, Vector, Vector, Vector) LoadVectorx4(Vector mask, sbyte* address) => LoadVectorx4(mask, address); + + /// + /// svfloat32x4_t svld4[_f32](svbool_t pg, const float32_t *base) + /// LD4W {Zresult0.S - Zresult3.S}, Pg/Z, [Xarray, Xindex, LSL #2] + /// LD4W {Zresult0.S - Zresult3.S}, Pg/Z, [Xbase, #0, MUL VL] + /// + public static unsafe (Vector, Vector, Vector, Vector) LoadVectorx4(Vector mask, float* address) => LoadVectorx4(mask, address); + + /// + /// svuint16x4_t svld4[_u16](svbool_t pg, const uint16_t *base) + /// LD4H {Zresult0.H - Zresult3.H}, Pg/Z, [Xarray, Xindex, LSL #1] + /// LD4H {Zresult0.H - Zresult3.H}, Pg/Z, [Xbase, #0, MUL VL] + /// + public static unsafe (Vector, Vector, Vector, Vector) LoadVectorx4(Vector mask, ushort* address) => LoadVectorx4(mask, address); + + /// + /// svuint32x4_t svld4[_u32](svbool_t pg, const uint32_t *base) + /// LD4W {Zresult0.S - Zresult3.S}, Pg/Z, [Xarray, Xindex, LSL #2] + /// LD4W {Zresult0.S - Zresult3.S}, Pg/Z, [Xbase, #0, MUL VL] + /// + public static unsafe (Vector, Vector, Vector, Vector) LoadVectorx4(Vector mask, uint* address) => LoadVectorx4(mask, address); + + /// + /// svuint64x4_t svld4[_u64](svbool_t pg, const uint64_t *base) + /// LD4D {Zresult0.D - Zresult3.D}, Pg/Z, [Xarray, Xindex, LSL #3] + /// LD4D {Zresult0.D - Zresult3.D}, Pg/Z, [Xbase, #0, MUL VL] + /// + public static unsafe (Vector, Vector, Vector, Vector) LoadVectorx4(Vector mask, ulong* address) => LoadVectorx4(mask, address); + /// Max : Maximum /// From b50e4ff9c25273282cfcb6d4e9f6b2bede15676f Mon Sep 17 00:00:00 2001 From: TIHan Date: Mon, 13 May 2024 13:26:14 -0700 Subject: [PATCH 02/22] Formatting --- .../src/System/Runtime/Intrinsics/Arm/Sve.cs | 2 ++ 1 file changed, 2 insertions(+) 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 e63331419155cb..49b82d2bf09256 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 @@ -1480,6 +1480,7 @@ internal Arm64() { } /// public static unsafe Vector LoadVectorUInt32ZeroExtendToUInt64(Vector mask, uint* address) => LoadVectorUInt32ZeroExtendToUInt64(mask, address); + /// LoadVectorx2 : Load two-element tuples into two vectors /// @@ -1698,6 +1699,7 @@ internal Arm64() { } /// public static unsafe (Vector, Vector, Vector, Vector) LoadVectorx4(Vector mask, ulong* address) => LoadVectorx4(mask, address); + /// Max : Maximum /// From 9672e984b02a6b403858d49263b42d6c500c5017 Mon Sep 17 00:00:00 2001 From: TIHan Date: Mon, 13 May 2024 13:32:16 -0700 Subject: [PATCH 03/22] Added loadvectorx* intrinsic tests --- .../GenerateHWIntrinsicTests_Arm.cs | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs b/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs index e555939e03852c..8569bb4dcbb53f 100644 --- a/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs +++ b/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs @@ -3107,6 +3107,37 @@ ("SveLoadMaskedUnOpTest.template", new Dictionary { ["TestName"] = "SveLoadVectorUInt32ZeroExtendToInt64", ["Isa"] = "Sve", ["Method"] = "LoadVectorUInt32ZeroExtendToInt64", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2BaseType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["ValidateIterResult"] = "firstOp[i] != result[i]"}), ("SveLoadMaskedUnOpTest.template", new Dictionary { ["TestName"] = "SveLoadVectorUInt32ZeroExtendToUInt64", ["Isa"] = "Sve", ["Method"] = "LoadVectorUInt32ZeroExtendToUInt64", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt64", ["Op2BaseType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["ValidateIterResult"] = "firstOp[i] != result[i]"}), + ("SveLoadVectorx2.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_float", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector_Vector",["RetBaseType"] = "Single_Single",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Single", ["Op2BaseType"] = "Single", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()", ["ValidateIterResult"] = "false",}), + ("SveLoadVectorx2.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_double", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector_Vector",["RetBaseType"] = "Double_Double",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Double", ["Op2BaseType"] = "Double", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()", ["ValidateIterResult"] = "false",}), + ("SveLoadVectorx2.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_sbyte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector_Vector",["RetBaseType"] = "SByte_SByte",["Op1VectorType"] = "Vector",["Op1BaseType"] = "SByte", ["Op2BaseType"] = "SByte", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["ValidateIterResult"] = "false",}), + ("SveLoadVectorx2.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_short", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector_Vector",["RetBaseType"] = "Int16_Int16",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Int16", ["Op2BaseType"] = "Int16", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["ValidateIterResult"] = "false",}), + ("SveLoadVectorx2.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_int", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector_Vector",["RetBaseType"] = "Int32_Int32",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Int32", ["Op2BaseType"] = "Int32", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["ValidateIterResult"] = "false",}), + ("SveLoadVectorx2.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_long", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector_Vector",["RetBaseType"] = "Int64_Int64",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Int64", ["Op2BaseType"] = "Int64", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["ValidateIterResult"] = "false",}), + ("SveLoadVectorx2.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_byte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector_Vector",["RetBaseType"] = "Byte_Byte",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Byte", ["Op2BaseType"] = "Byte", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetByte()", ["ValidateIterResult"] = "false",}), + ("SveLoadVectorx2.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_ushort", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector_Vector",["RetBaseType"] = "UInt16_UInt16",["Op1VectorType"] = "Vector",["Op1BaseType"] = "UInt16", ["Op2BaseType"] = "UInt16", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["ValidateIterResult"] = "false",}), + ("SveLoadVectorx2.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_uint", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector_Vector",["RetBaseType"] = "UInt32_UInt32",["Op1VectorType"] = "Vector",["Op1BaseType"] = "UInt32", ["Op2BaseType"] = "UInt32", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["ValidateIterResult"] = "false",}), + ("SveLoadVectorx2.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_ulong", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector_Vector",["RetBaseType"] = "UInt64_UInt64",["Op1VectorType"] = "Vector",["Op1BaseType"] = "UInt64", ["Op2BaseType"] = "UInt64", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()", ["ValidateIterResult"] = "false",}), + ("SveLoadVectorx3.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_float", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector_Vector_Vector",["RetBaseType"] = "Single_Single_Single",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Single", ["Op2BaseType"] = "Single", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()", ["ValidateIterResult"] = "false",}), + ("SveLoadVectorx3.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_double", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector_Vector_Vector",["RetBaseType"] = "Double_Double_Double",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Double", ["Op2BaseType"] = "Double", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()", ["ValidateIterResult"] = "false",}), + ("SveLoadVectorx3.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_sbyte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector_Vector_Vector",["RetBaseType"] = "SByte_SByte_SByte",["Op1VectorType"] = "Vector",["Op1BaseType"] = "SByte", ["Op2BaseType"] = "SByte", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["ValidateIterResult"] = "false",}), + ("SveLoadVectorx3.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_short", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector_Vector_Vector",["RetBaseType"] = "Int16_Int16_Int16",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Int16", ["Op2BaseType"] = "Int16", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["ValidateIterResult"] = "false",}), + ("SveLoadVectorx3.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_int", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector_Vector_Vector",["RetBaseType"] = "Int32_Int32_Int32",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Int32", ["Op2BaseType"] = "Int32", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["ValidateIterResult"] = "false",}), + ("SveLoadVectorx3.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_long", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector_Vector_Vector",["RetBaseType"] = "Int64_Int64_Int64",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Int64", ["Op2BaseType"] = "Int64", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["ValidateIterResult"] = "false",}), + ("SveLoadVectorx3.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_byte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector_Vector_Vector",["RetBaseType"] = "Byte_Byte_Byte",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Byte", ["Op2BaseType"] = "Byte", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetByte()", ["ValidateIterResult"] = "false",}), + ("SveLoadVectorx3.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_ushort", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector_Vector_Vector",["RetBaseType"] = "UInt16_UInt16_UInt16",["Op1VectorType"] = "Vector",["Op1BaseType"] = "UInt16", ["Op2BaseType"] = "UInt16", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["ValidateIterResult"] = "false",}), + ("SveLoadVectorx3.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_uint", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector_Vector_Vector",["RetBaseType"] = "UInt32_UInt32_UInt32",["Op1VectorType"] = "Vector",["Op1BaseType"] = "UInt32", ["Op2BaseType"] = "UInt32", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["ValidateIterResult"] = "false",}), + ("SveLoadVectorx3.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_ulong", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector_Vector_Vector",["RetBaseType"] = "UInt64_UInt64_UInt64",["Op1VectorType"] = "Vector",["Op1BaseType"] = "UInt64", ["Op2BaseType"] = "UInt64", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()", ["ValidateIterResult"] = "false",}), + ("SveLoadVectorx4.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_float", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector_Vector_Vector_Vector",["RetBaseType"] = "Single_Single_Single_Single",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Single", ["Op2BaseType"] = "Single", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()", ["ValidateIterResult"] = "false",}), + ("SveLoadVectorx4.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_double", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector_Vector_Vector_Vector",["RetBaseType"] = "Double_Double_Double_Double",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Double", ["Op2BaseType"] = "Double", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()", ["ValidateIterResult"] = "false",}), + ("SveLoadVectorx4.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_sbyte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector_Vector_Vector_Vector",["RetBaseType"] = "SByte_SByte_SByte_SByte",["Op1VectorType"] = "Vector",["Op1BaseType"] = "SByte", ["Op2BaseType"] = "SByte", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["ValidateIterResult"] = "false",}), + ("SveLoadVectorx4.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_short", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector_Vector_Vector_Vector",["RetBaseType"] = "Int16_Int16_Int16_Int16",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Int16", ["Op2BaseType"] = "Int16", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["ValidateIterResult"] = "false",}), + ("SveLoadVectorx4.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_int", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector_Vector_Vector_Vector",["RetBaseType"] = "Int32_Int32_Int32_Int32",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Int32", ["Op2BaseType"] = "Int32", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["ValidateIterResult"] = "false",}), + ("SveLoadVectorx4.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_long", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector_Vector_Vector_Vector",["RetBaseType"] = "Int64_Int64_Int64_Int64",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Int64", ["Op2BaseType"] = "Int64", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["ValidateIterResult"] = "false",}), + ("SveLoadVectorx4.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_byte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector_Vector_Vector_Vector",["RetBaseType"] = "Byte_Byte_Byte_Byte",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Byte", ["Op2BaseType"] = "Byte", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetByte()", ["ValidateIterResult"] = "false",}), + ("SveLoadVectorx4.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_ushort", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector_Vector_Vector_Vector",["RetBaseType"] = "UInt16_UInt16_UInt16_UInt16",["Op1VectorType"] = "Vector",["Op1BaseType"] = "UInt16", ["Op2BaseType"] = "UInt16", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["ValidateIterResult"] = "false",}), + ("SveLoadVectorx4.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_uint", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector_Vector_Vector_Vector",["RetBaseType"] = "UInt32_UInt32_UInt32_UInt32",["Op1VectorType"] = "Vector",["Op1BaseType"] = "UInt32", ["Op2BaseType"] = "UInt32", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["ValidateIterResult"] = "false",}), + ("SveLoadVectorx4.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_ulong", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector_Vector_Vector_Vector",["RetBaseType"] = "UInt64_UInt64_UInt64_UInt64",["Op1VectorType"] = "Vector",["Op1BaseType"] = "UInt64", ["Op2BaseType"] = "UInt64", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()", ["ValidateIterResult"] = "false",}), + ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve_Max_float", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "Max", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Single", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Single", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Single", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()", ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()", ["ValidateIterResult"] = "Helpers.Max(left[i], right[i]) != result[i]", ["GetIterResult"] = "Helpers.Max(left[i], right[i])"}), ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve_Max_double", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "Max", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Double", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Double", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Double", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()", ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()", ["ValidateIterResult"] = "Helpers.Max(left[i], right[i]) != result[i]", ["GetIterResult"] = "Helpers.Max(left[i], right[i])"}), ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve_Max_sbyte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "Max", ["RetVectorType"] = "Vector", ["RetBaseType"] = "SByte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "SByte", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["ValidateIterResult"] = "Helpers.Max(left[i], right[i]) != result[i]", ["GetIterResult"] = "Helpers.Max(left[i], right[i])"}), From ac509ac71eb3db11bb642664c32c16744c625676 Mon Sep 17 00:00:00 2001 From: TIHan Date: Mon, 13 May 2024 13:39:39 -0700 Subject: [PATCH 04/22] Change test template name --- .../GenerateHWIntrinsicTests_Arm.cs | 60 +++++++++---------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs b/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs index 8569bb4dcbb53f..5b3b316e9abf5f 100644 --- a/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs +++ b/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs @@ -3107,36 +3107,36 @@ ("SveLoadMaskedUnOpTest.template", new Dictionary { ["TestName"] = "SveLoadVectorUInt32ZeroExtendToInt64", ["Isa"] = "Sve", ["Method"] = "LoadVectorUInt32ZeroExtendToInt64", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2BaseType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["ValidateIterResult"] = "firstOp[i] != result[i]"}), ("SveLoadMaskedUnOpTest.template", new Dictionary { ["TestName"] = "SveLoadVectorUInt32ZeroExtendToUInt64", ["Isa"] = "Sve", ["Method"] = "LoadVectorUInt32ZeroExtendToUInt64", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt64", ["Op2BaseType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["ValidateIterResult"] = "firstOp[i] != result[i]"}), - ("SveLoadVectorx2.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_float", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector_Vector",["RetBaseType"] = "Single_Single",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Single", ["Op2BaseType"] = "Single", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()", ["ValidateIterResult"] = "false",}), - ("SveLoadVectorx2.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_double", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector_Vector",["RetBaseType"] = "Double_Double",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Double", ["Op2BaseType"] = "Double", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()", ["ValidateIterResult"] = "false",}), - ("SveLoadVectorx2.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_sbyte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector_Vector",["RetBaseType"] = "SByte_SByte",["Op1VectorType"] = "Vector",["Op1BaseType"] = "SByte", ["Op2BaseType"] = "SByte", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["ValidateIterResult"] = "false",}), - ("SveLoadVectorx2.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_short", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector_Vector",["RetBaseType"] = "Int16_Int16",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Int16", ["Op2BaseType"] = "Int16", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["ValidateIterResult"] = "false",}), - ("SveLoadVectorx2.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_int", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector_Vector",["RetBaseType"] = "Int32_Int32",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Int32", ["Op2BaseType"] = "Int32", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["ValidateIterResult"] = "false",}), - ("SveLoadVectorx2.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_long", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector_Vector",["RetBaseType"] = "Int64_Int64",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Int64", ["Op2BaseType"] = "Int64", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["ValidateIterResult"] = "false",}), - ("SveLoadVectorx2.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_byte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector_Vector",["RetBaseType"] = "Byte_Byte",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Byte", ["Op2BaseType"] = "Byte", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetByte()", ["ValidateIterResult"] = "false",}), - ("SveLoadVectorx2.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_ushort", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector_Vector",["RetBaseType"] = "UInt16_UInt16",["Op1VectorType"] = "Vector",["Op1BaseType"] = "UInt16", ["Op2BaseType"] = "UInt16", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["ValidateIterResult"] = "false",}), - ("SveLoadVectorx2.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_uint", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector_Vector",["RetBaseType"] = "UInt32_UInt32",["Op1VectorType"] = "Vector",["Op1BaseType"] = "UInt32", ["Op2BaseType"] = "UInt32", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["ValidateIterResult"] = "false",}), - ("SveLoadVectorx2.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_ulong", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector_Vector",["RetBaseType"] = "UInt64_UInt64",["Op1VectorType"] = "Vector",["Op1BaseType"] = "UInt64", ["Op2BaseType"] = "UInt64", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()", ["ValidateIterResult"] = "false",}), - ("SveLoadVectorx3.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_float", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector_Vector_Vector",["RetBaseType"] = "Single_Single_Single",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Single", ["Op2BaseType"] = "Single", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()", ["ValidateIterResult"] = "false",}), - ("SveLoadVectorx3.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_double", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector_Vector_Vector",["RetBaseType"] = "Double_Double_Double",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Double", ["Op2BaseType"] = "Double", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()", ["ValidateIterResult"] = "false",}), - ("SveLoadVectorx3.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_sbyte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector_Vector_Vector",["RetBaseType"] = "SByte_SByte_SByte",["Op1VectorType"] = "Vector",["Op1BaseType"] = "SByte", ["Op2BaseType"] = "SByte", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["ValidateIterResult"] = "false",}), - ("SveLoadVectorx3.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_short", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector_Vector_Vector",["RetBaseType"] = "Int16_Int16_Int16",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Int16", ["Op2BaseType"] = "Int16", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["ValidateIterResult"] = "false",}), - ("SveLoadVectorx3.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_int", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector_Vector_Vector",["RetBaseType"] = "Int32_Int32_Int32",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Int32", ["Op2BaseType"] = "Int32", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["ValidateIterResult"] = "false",}), - ("SveLoadVectorx3.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_long", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector_Vector_Vector",["RetBaseType"] = "Int64_Int64_Int64",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Int64", ["Op2BaseType"] = "Int64", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["ValidateIterResult"] = "false",}), - ("SveLoadVectorx3.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_byte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector_Vector_Vector",["RetBaseType"] = "Byte_Byte_Byte",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Byte", ["Op2BaseType"] = "Byte", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetByte()", ["ValidateIterResult"] = "false",}), - ("SveLoadVectorx3.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_ushort", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector_Vector_Vector",["RetBaseType"] = "UInt16_UInt16_UInt16",["Op1VectorType"] = "Vector",["Op1BaseType"] = "UInt16", ["Op2BaseType"] = "UInt16", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["ValidateIterResult"] = "false",}), - ("SveLoadVectorx3.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_uint", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector_Vector_Vector",["RetBaseType"] = "UInt32_UInt32_UInt32",["Op1VectorType"] = "Vector",["Op1BaseType"] = "UInt32", ["Op2BaseType"] = "UInt32", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["ValidateIterResult"] = "false",}), - ("SveLoadVectorx3.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_ulong", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector_Vector_Vector",["RetBaseType"] = "UInt64_UInt64_UInt64",["Op1VectorType"] = "Vector",["Op1BaseType"] = "UInt64", ["Op2BaseType"] = "UInt64", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()", ["ValidateIterResult"] = "false",}), - ("SveLoadVectorx4.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_float", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector_Vector_Vector_Vector",["RetBaseType"] = "Single_Single_Single_Single",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Single", ["Op2BaseType"] = "Single", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()", ["ValidateIterResult"] = "false",}), - ("SveLoadVectorx4.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_double", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector_Vector_Vector_Vector",["RetBaseType"] = "Double_Double_Double_Double",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Double", ["Op2BaseType"] = "Double", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()", ["ValidateIterResult"] = "false",}), - ("SveLoadVectorx4.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_sbyte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector_Vector_Vector_Vector",["RetBaseType"] = "SByte_SByte_SByte_SByte",["Op1VectorType"] = "Vector",["Op1BaseType"] = "SByte", ["Op2BaseType"] = "SByte", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["ValidateIterResult"] = "false",}), - ("SveLoadVectorx4.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_short", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector_Vector_Vector_Vector",["RetBaseType"] = "Int16_Int16_Int16_Int16",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Int16", ["Op2BaseType"] = "Int16", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["ValidateIterResult"] = "false",}), - ("SveLoadVectorx4.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_int", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector_Vector_Vector_Vector",["RetBaseType"] = "Int32_Int32_Int32_Int32",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Int32", ["Op2BaseType"] = "Int32", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["ValidateIterResult"] = "false",}), - ("SveLoadVectorx4.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_long", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector_Vector_Vector_Vector",["RetBaseType"] = "Int64_Int64_Int64_Int64",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Int64", ["Op2BaseType"] = "Int64", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["ValidateIterResult"] = "false",}), - ("SveLoadVectorx4.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_byte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector_Vector_Vector_Vector",["RetBaseType"] = "Byte_Byte_Byte_Byte",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Byte", ["Op2BaseType"] = "Byte", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetByte()", ["ValidateIterResult"] = "false",}), - ("SveLoadVectorx4.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_ushort", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector_Vector_Vector_Vector",["RetBaseType"] = "UInt16_UInt16_UInt16_UInt16",["Op1VectorType"] = "Vector",["Op1BaseType"] = "UInt16", ["Op2BaseType"] = "UInt16", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["ValidateIterResult"] = "false",}), - ("SveLoadVectorx4.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_uint", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector_Vector_Vector_Vector",["RetBaseType"] = "UInt32_UInt32_UInt32_UInt32",["Op1VectorType"] = "Vector",["Op1BaseType"] = "UInt32", ["Op2BaseType"] = "UInt32", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["ValidateIterResult"] = "false",}), - ("SveLoadVectorx4.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_ulong", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector_Vector_Vector_Vector",["RetBaseType"] = "UInt64_UInt64_UInt64_UInt64",["Op1VectorType"] = "Vector",["Op1BaseType"] = "UInt64", ["Op2BaseType"] = "UInt64", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()", ["ValidateIterResult"] = "false",}), + ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_float", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector_Vector",["RetBaseType"] = "Single_Single",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Single", ["Op2BaseType"] = "Single", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()", ["ValidateIterResult"] = "false",}), + ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_double", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector_Vector",["RetBaseType"] = "Double_Double",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Double", ["Op2BaseType"] = "Double", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()", ["ValidateIterResult"] = "false",}), + ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_sbyte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector_Vector",["RetBaseType"] = "SByte_SByte",["Op1VectorType"] = "Vector",["Op1BaseType"] = "SByte", ["Op2BaseType"] = "SByte", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["ValidateIterResult"] = "false",}), + ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_short", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector_Vector",["RetBaseType"] = "Int16_Int16",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Int16", ["Op2BaseType"] = "Int16", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["ValidateIterResult"] = "false",}), + ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_int", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector_Vector",["RetBaseType"] = "Int32_Int32",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Int32", ["Op2BaseType"] = "Int32", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["ValidateIterResult"] = "false",}), + ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_long", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector_Vector",["RetBaseType"] = "Int64_Int64",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Int64", ["Op2BaseType"] = "Int64", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["ValidateIterResult"] = "false",}), + ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_byte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector_Vector",["RetBaseType"] = "Byte_Byte",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Byte", ["Op2BaseType"] = "Byte", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetByte()", ["ValidateIterResult"] = "false",}), + ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_ushort", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector_Vector",["RetBaseType"] = "UInt16_UInt16",["Op1VectorType"] = "Vector",["Op1BaseType"] = "UInt16", ["Op2BaseType"] = "UInt16", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["ValidateIterResult"] = "false",}), + ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_uint", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector_Vector",["RetBaseType"] = "UInt32_UInt32",["Op1VectorType"] = "Vector",["Op1BaseType"] = "UInt32", ["Op2BaseType"] = "UInt32", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["ValidateIterResult"] = "false",}), + ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_ulong", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector_Vector",["RetBaseType"] = "UInt64_UInt64",["Op1VectorType"] = "Vector",["Op1BaseType"] = "UInt64", ["Op2BaseType"] = "UInt64", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()", ["ValidateIterResult"] = "false",}), + ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_float", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector_Vector_Vector",["RetBaseType"] = "Single_Single_Single",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Single", ["Op2BaseType"] = "Single", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()", ["ValidateIterResult"] = "false",}), + ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_double", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector_Vector_Vector",["RetBaseType"] = "Double_Double_Double",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Double", ["Op2BaseType"] = "Double", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()", ["ValidateIterResult"] = "false",}), + ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_sbyte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector_Vector_Vector",["RetBaseType"] = "SByte_SByte_SByte",["Op1VectorType"] = "Vector",["Op1BaseType"] = "SByte", ["Op2BaseType"] = "SByte", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["ValidateIterResult"] = "false",}), + ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_short", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector_Vector_Vector",["RetBaseType"] = "Int16_Int16_Int16",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Int16", ["Op2BaseType"] = "Int16", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["ValidateIterResult"] = "false",}), + ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_int", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector_Vector_Vector",["RetBaseType"] = "Int32_Int32_Int32",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Int32", ["Op2BaseType"] = "Int32", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["ValidateIterResult"] = "false",}), + ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_long", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector_Vector_Vector",["RetBaseType"] = "Int64_Int64_Int64",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Int64", ["Op2BaseType"] = "Int64", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["ValidateIterResult"] = "false",}), + ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_byte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector_Vector_Vector",["RetBaseType"] = "Byte_Byte_Byte",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Byte", ["Op2BaseType"] = "Byte", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetByte()", ["ValidateIterResult"] = "false",}), + ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_ushort", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector_Vector_Vector",["RetBaseType"] = "UInt16_UInt16_UInt16",["Op1VectorType"] = "Vector",["Op1BaseType"] = "UInt16", ["Op2BaseType"] = "UInt16", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["ValidateIterResult"] = "false",}), + ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_uint", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector_Vector_Vector",["RetBaseType"] = "UInt32_UInt32_UInt32",["Op1VectorType"] = "Vector",["Op1BaseType"] = "UInt32", ["Op2BaseType"] = "UInt32", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["ValidateIterResult"] = "false",}), + ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_ulong", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector_Vector_Vector",["RetBaseType"] = "UInt64_UInt64_UInt64",["Op1VectorType"] = "Vector",["Op1BaseType"] = "UInt64", ["Op2BaseType"] = "UInt64", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()", ["ValidateIterResult"] = "false",}), + ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_float", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector_Vector_Vector_Vector",["RetBaseType"] = "Single_Single_Single_Single",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Single", ["Op2BaseType"] = "Single", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()", ["ValidateIterResult"] = "false",}), + ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_double", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector_Vector_Vector_Vector",["RetBaseType"] = "Double_Double_Double_Double",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Double", ["Op2BaseType"] = "Double", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()", ["ValidateIterResult"] = "false",}), + ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_sbyte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector_Vector_Vector_Vector",["RetBaseType"] = "SByte_SByte_SByte_SByte",["Op1VectorType"] = "Vector",["Op1BaseType"] = "SByte", ["Op2BaseType"] = "SByte", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["ValidateIterResult"] = "false",}), + ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_short", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector_Vector_Vector_Vector",["RetBaseType"] = "Int16_Int16_Int16_Int16",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Int16", ["Op2BaseType"] = "Int16", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["ValidateIterResult"] = "false",}), + ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_int", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector_Vector_Vector_Vector",["RetBaseType"] = "Int32_Int32_Int32_Int32",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Int32", ["Op2BaseType"] = "Int32", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["ValidateIterResult"] = "false",}), + ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_long", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector_Vector_Vector_Vector",["RetBaseType"] = "Int64_Int64_Int64_Int64",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Int64", ["Op2BaseType"] = "Int64", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["ValidateIterResult"] = "false",}), + ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_byte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector_Vector_Vector_Vector",["RetBaseType"] = "Byte_Byte_Byte_Byte",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Byte", ["Op2BaseType"] = "Byte", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetByte()", ["ValidateIterResult"] = "false",}), + ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_ushort", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector_Vector_Vector_Vector",["RetBaseType"] = "UInt16_UInt16_UInt16_UInt16",["Op1VectorType"] = "Vector",["Op1BaseType"] = "UInt16", ["Op2BaseType"] = "UInt16", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["ValidateIterResult"] = "false",}), + ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_uint", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector_Vector_Vector_Vector",["RetBaseType"] = "UInt32_UInt32_UInt32_UInt32",["Op1VectorType"] = "Vector",["Op1BaseType"] = "UInt32", ["Op2BaseType"] = "UInt32", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["ValidateIterResult"] = "false",}), + ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_ulong", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector_Vector_Vector_Vector",["RetBaseType"] = "UInt64_UInt64_UInt64_UInt64",["Op1VectorType"] = "Vector",["Op1BaseType"] = "UInt64", ["Op2BaseType"] = "UInt64", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()", ["ValidateIterResult"] = "false",}), ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve_Max_float", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "Max", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Single", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Single", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Single", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()", ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()", ["ValidateIterResult"] = "Helpers.Max(left[i], right[i]) != result[i]", ["GetIterResult"] = "Helpers.Max(left[i], right[i])"}), ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve_Max_double", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "Max", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Double", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Double", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Double", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()", ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()", ["ValidateIterResult"] = "Helpers.Max(left[i], right[i]) != result[i]", ["GetIterResult"] = "Helpers.Max(left[i], right[i])"}), From 9b92c12627f003640dcd681378345720314b4768 Mon Sep 17 00:00:00 2001 From: TIHan Date: Mon, 13 May 2024 13:57:07 -0700 Subject: [PATCH 05/22] Added loadvectorx* APIs to ref --- .../ref/System.Runtime.Intrinsics.cs | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) 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 7471010b120785..6e1f6354dc19d0 100644 --- a/src/libraries/System.Runtime.Intrinsics/ref/System.Runtime.Intrinsics.cs +++ b/src/libraries/System.Runtime.Intrinsics/ref/System.Runtime.Intrinsics.cs @@ -4350,6 +4350,37 @@ internal Arm64() { } public static unsafe System.Numerics.Vector LoadVectorUInt32ZeroExtendToInt64(System.Numerics.Vector mask, uint* address) { throw null; } public static unsafe System.Numerics.Vector LoadVectorUInt32ZeroExtendToUInt64(System.Numerics.Vector mask, uint* address) { throw null; } + public static unsafe (System.Numerics.Vector, System.Numerics.Vector) LoadVectorx2(System.Numerics.Vector mask, byte* address) { throw null; } + public static unsafe (System.Numerics.Vector, System.Numerics.Vector) LoadVectorx2(System.Numerics.Vector mask, double* address) { throw null; } + public static unsafe (System.Numerics.Vector, System.Numerics.Vector) LoadVectorx2(System.Numerics.Vector mask, short* address) { throw null; } + public static unsafe (System.Numerics.Vector, System.Numerics.Vector) LoadVectorx2(System.Numerics.Vector mask, int* address) { throw null; } + public static unsafe (System.Numerics.Vector, System.Numerics.Vector) LoadVectorx2(System.Numerics.Vector mask, long* address) { throw null; } + public static unsafe (System.Numerics.Vector, System.Numerics.Vector) LoadVectorx2(System.Numerics.Vector mask, sbyte* address) { throw null; } + public static unsafe (System.Numerics.Vector, System.Numerics.Vector) LoadVectorx2(System.Numerics.Vector mask, float* address) { throw null; } + public static unsafe (System.Numerics.Vector, System.Numerics.Vector) LoadVectorx2(System.Numerics.Vector mask, ushort* address) { throw null; } + public static unsafe (System.Numerics.Vector, System.Numerics.Vector) LoadVectorx2(System.Numerics.Vector mask, uint* address) { throw null; } + public static unsafe (System.Numerics.Vector, System.Numerics.Vector) LoadVectorx2(System.Numerics.Vector mask, ulong* address) { throw null; } + public static unsafe (System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector) LoadVectorx3(System.Numerics.Vector mask, byte* address) { throw null; } + public static unsafe (System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector) LoadVectorx3(System.Numerics.Vector mask, double* address) { throw null; } + public static unsafe (System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector) LoadVectorx3(System.Numerics.Vector mask, short* address) { throw null; } + public static unsafe (System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector) LoadVectorx3(System.Numerics.Vector mask, int* address) { throw null; } + public static unsafe (System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector) LoadVectorx3(System.Numerics.Vector mask, long* address) { throw null; } + public static unsafe (System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector) LoadVectorx3(System.Numerics.Vector mask, sbyte* address) { throw null; } + public static unsafe (System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector) LoadVectorx3(System.Numerics.Vector mask, float* address) { throw null; } + public static unsafe (System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector) LoadVectorx3(System.Numerics.Vector mask, ushort* address) { throw null; } + public static unsafe (System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector) LoadVectorx3(System.Numerics.Vector mask, uint* address) { throw null; } + public static unsafe (System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector) LoadVectorx3(System.Numerics.Vector mask, ulong* address) { throw null; } + public static unsafe (System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector) LoadVectorx4(System.Numerics.Vector mask, byte* address) { throw null; } + public static unsafe (System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector) LoadVectorx4(System.Numerics.Vector mask, double* address) { throw null; } + public static unsafe (System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector) LoadVectorx4(System.Numerics.Vector mask, short* address) { throw null; } + public static unsafe (System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector) LoadVectorx4(System.Numerics.Vector mask, int* address) { throw null; } + public static unsafe (System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector) LoadVectorx4(System.Numerics.Vector mask, long* address) { throw null; } + public static unsafe (System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector) LoadVectorx4(System.Numerics.Vector mask, sbyte* address) { throw null; } + public static unsafe (System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector) LoadVectorx4(System.Numerics.Vector mask, float* address) { throw null; } + public static unsafe (System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector) LoadVectorx4(System.Numerics.Vector mask, ushort* address) { throw null; } + public static unsafe (System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector) LoadVectorx4(System.Numerics.Vector mask, uint* address) { throw null; } + public static unsafe (System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector) LoadVectorx4(System.Numerics.Vector mask, ulong* address) { throw null; } + public static System.Numerics.Vector Max(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } public static System.Numerics.Vector Max(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } public static System.Numerics.Vector Max(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } From 68b0ec7812da86a7e0ca4a5aa3fe539d01549c87 Mon Sep 17 00:00:00 2001 From: TIHan Date: Mon, 13 May 2024 14:13:04 -0700 Subject: [PATCH 06/22] Fixed build --- src/coreclr/jit/hwintrinsiclistarm64sve.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/coreclr/jit/hwintrinsiclistarm64sve.h b/src/coreclr/jit/hwintrinsiclistarm64sve.h index 7bb2c641ecaf3e..94205733033e18 100644 --- a/src/coreclr/jit/hwintrinsiclistarm64sve.h +++ b/src/coreclr/jit/hwintrinsiclistarm64sve.h @@ -89,9 +89,9 @@ HARDWARE_INTRINSIC(Sve, LoadVectorUInt16ZeroExtendToUInt32, HARDWARE_INTRINSIC(Sve, LoadVectorUInt16ZeroExtendToUInt64, -1, 2, false, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_ld1h, INS_invalid, INS_invalid}, HW_Category_MemoryLoad, HW_Flag_Scalable|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation) HARDWARE_INTRINSIC(Sve, LoadVectorUInt32ZeroExtendToInt64, -1, 2, false, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_ld1w, INS_invalid, INS_invalid, INS_invalid}, HW_Category_MemoryLoad, HW_Flag_Scalable|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation) HARDWARE_INTRINSIC(Sve, LoadVectorUInt32ZeroExtendToUInt64, -1, 2, false, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_ld1w, INS_invalid, INS_invalid}, HW_Category_MemoryLoad, HW_Flag_Scalable|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation) -HARDWARE_INTRINSIC(Sve, LoadVectorx2, -1, 2, true, {INS_sve_ld2b, INS_sve_ld2b, INS_sve_ld2h, INS_sve_ld2h, INS_sve_ld2w, INS_sve_ld2w, INS_sve_ld2d, INS_sve_ld2d, INS_sve_ld2w, INS_sve_ld2d}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_MultiReg|HW_Flag_MaskedOperation) -HARDWARE_INTRINSIC(Sve, LoadVectorx3, -1, 2, true, {INS_sve_ld3b, INS_sve_ld3b, INS_sve_ld3h, INS_sve_ld3h, INS_sve_ld3w, INS_sve_ld3w, INS_sve_ld3d, INS_sve_ld3d, INS_sve_ld3w, INS_sve_ld3d}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_MultiReg|HW_Flag_MaskedOperation) -HARDWARE_INTRINSIC(Sve, LoadVectorx4, -1, 2, true, {INS_sve_ld4b, INS_sve_ld4b, INS_sve_ld4h, INS_sve_ld4h, INS_sve_ld4w, INS_sve_ld4w, INS_sve_ld4d, INS_sve_ld4d, INS_sve_ld4w, INS_sve_ld4d}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_MultiReg|HW_Flag_MaskedOperation) +HARDWARE_INTRINSIC(Sve, LoadVectorx2, -1, 2, true, {INS_sve_ld2b, INS_sve_ld2b, INS_sve_ld2h, INS_sve_ld2h, INS_sve_ld2w, INS_sve_ld2w, INS_sve_ld2d, INS_sve_ld2d, INS_sve_ld2w, INS_sve_ld2d}, HW_Category_MemoryLoad, HW_Flag_Scalable|HW_Flag_MultiReg|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation) +HARDWARE_INTRINSIC(Sve, LoadVectorx3, -1, 2, true, {INS_sve_ld3b, INS_sve_ld3b, INS_sve_ld3h, INS_sve_ld3h, INS_sve_ld3w, INS_sve_ld3w, INS_sve_ld3d, INS_sve_ld3d, INS_sve_ld3w, INS_sve_ld3d}, HW_Category_MemoryLoad, HW_Flag_Scalable|HW_Flag_MultiReg|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation) +HARDWARE_INTRINSIC(Sve, LoadVectorx4, -1, 2, true, {INS_sve_ld4b, INS_sve_ld4b, INS_sve_ld4h, INS_sve_ld4h, INS_sve_ld4w, INS_sve_ld4w, INS_sve_ld4d, INS_sve_ld4d, INS_sve_ld4w, INS_sve_ld4d}, HW_Category_MemoryLoad, HW_Flag_Scalable|HW_Flag_MultiReg|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation) HARDWARE_INTRINSIC(Sve, Max, -1, -1, false, {INS_sve_smax, INS_sve_umax, INS_sve_smax, INS_sve_umax, INS_sve_smax, INS_sve_umax, INS_sve_smax, INS_sve_umax, INS_sve_fmax, INS_sve_fmax}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_HasRMWSemantics) HARDWARE_INTRINSIC(Sve, MaxAcross, -1, -1, false, {INS_sve_smaxv, INS_sve_umaxv, INS_sve_smaxv, INS_sve_umaxv, INS_sve_smaxv, INS_sve_umaxv, INS_sve_smaxv, INS_sve_umaxv, INS_sve_fmaxv, INS_sve_fmaxv}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation) HARDWARE_INTRINSIC(Sve, MaxNumber, -1, -1, false, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_fmaxnm, INS_sve_fmaxnm}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_HasRMWSemantics) From 511efc22c0eaa2a9fbbd90cd249e1d6cbe75e0d3 Mon Sep 17 00:00:00 2001 From: TIHan Date: Mon, 13 May 2024 14:21:02 -0700 Subject: [PATCH 07/22] Added APIs to PlatformNotSupported --- .../Arm/Sve.PlatformNotSupported.cs | 220 ++++++++++++++++++ 1 file changed, 220 insertions(+) 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 94f61e573647fe..bc2a2566d8504e 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 @@ -1423,6 +1423,226 @@ internal Arm64() { } /// public static unsafe Vector LoadVectorUInt32ZeroExtendToUInt64(Vector mask, uint* address) { throw new PlatformNotSupportedException(); } + + /// LoadVectorx2 : Load two-element tuples into two vectors + + /// + /// svuint8x2_t svld2[_u8](svbool_t pg, const uint8_t *base) + /// LD2B {Zresult0.B, Zresult1.B}, Pg/Z, [Xarray, Xindex] + /// LD2B {Zresult0.B, Zresult1.B}, Pg/Z, [Xbase, #0, MUL VL] + /// + public static unsafe (Vector, Vector) LoadVectorx2(Vector mask, byte* address) { throw new PlatformNotSupportedException(); } + + /// + /// svfloat64x2_t svld2[_f64](svbool_t pg, const float64_t *base) + /// LD2D {Zresult0.D, Zresult1.D}, Pg/Z, [Xarray, Xindex, LSL #3] + /// LD2D {Zresult0.D, Zresult1.D}, Pg/Z, [Xbase, #0, MUL VL] + /// + public static unsafe (Vector, Vector) LoadVectorx2(Vector mask, double* address) { throw new PlatformNotSupportedException(); } + + /// + /// svint16x2_t svld2[_s16](svbool_t pg, const int16_t *base) + /// LD2H {Zresult0.H, Zresult1.H}, Pg/Z, [Xarray, Xindex, LSL #1] + /// LD2H {Zresult0.H, Zresult1.H}, Pg/Z, [Xbase, #0, MUL VL] + /// + public static unsafe (Vector, Vector) LoadVectorx2(Vector mask, short* address) { throw new PlatformNotSupportedException(); } + + /// + /// svint32x2_t svld2[_s32](svbool_t pg, const int32_t *base) + /// LD2W {Zresult0.S, Zresult1.S}, Pg/Z, [Xarray, Xindex, LSL #2] + /// LD2W {Zresult0.S, Zresult1.S}, Pg/Z, [Xbase, #0, MUL VL] + /// + public static unsafe (Vector, Vector) LoadVectorx2(Vector mask, int* address) { throw new PlatformNotSupportedException(); } + + /// + /// svint64x2_t svld2[_s64](svbool_t pg, const int64_t *base) + /// LD2D {Zresult0.D, Zresult1.D}, Pg/Z, [Xarray, Xindex, LSL #3] + /// LD2D {Zresult0.D, Zresult1.D}, Pg/Z, [Xbase, #0, MUL VL] + /// + public static unsafe (Vector, Vector) LoadVectorx2(Vector mask, long* address) { throw new PlatformNotSupportedException(); } + + /// + /// svint8x2_t svld2[_s8](svbool_t pg, const int8_t *base) + /// LD2B {Zresult0.B, Zresult1.B}, Pg/Z, [Xarray, Xindex] + /// LD2B {Zresult0.B, Zresult1.B}, Pg/Z, [Xbase, #0, MUL VL] + /// + public static unsafe (Vector, Vector) LoadVectorx2(Vector mask, sbyte* address) { throw new PlatformNotSupportedException(); } + + /// + /// svfloat32x2_t svld2[_f32](svbool_t pg, const float32_t *base) + /// LD2W {Zresult0.S, Zresult1.S}, Pg/Z, [Xarray, Xindex, LSL #2] + /// LD2W {Zresult0.S, Zresult1.S}, Pg/Z, [Xbase, #0, MUL VL] + /// + public static unsafe (Vector, Vector) LoadVectorx2(Vector mask, float* address) { throw new PlatformNotSupportedException(); } + + /// + /// svuint16x2_t svld2[_u16](svbool_t pg, const uint16_t *base) + /// LD2H {Zresult0.H, Zresult1.H}, Pg/Z, [Xarray, Xindex, LSL #1] + /// LD2H {Zresult0.H, Zresult1.H}, Pg/Z, [Xbase, #0, MUL VL] + /// + public static unsafe (Vector, Vector) LoadVectorx2(Vector mask, ushort* address) { throw new PlatformNotSupportedException(); } + + /// + /// svuint32x2_t svld2[_u32](svbool_t pg, const uint32_t *base) + /// LD2W {Zresult0.S, Zresult1.S}, Pg/Z, [Xarray, Xindex, LSL #2] + /// LD2W {Zresult0.S, Zresult1.S}, Pg/Z, [Xbase, #0, MUL VL] + /// + public static unsafe (Vector, Vector) LoadVectorx2(Vector mask, uint* address) { throw new PlatformNotSupportedException(); } + + /// + /// svuint64x2_t svld2[_u64](svbool_t pg, const uint64_t *base) + /// LD2D {Zresult0.D, Zresult1.D}, Pg/Z, [Xarray, Xindex, LSL #3] + /// LD2D {Zresult0.D, Zresult1.D}, Pg/Z, [Xbase, #0, MUL VL] + /// + public static unsafe (Vector, Vector) LoadVectorx2(Vector mask, ulong* address) { throw new PlatformNotSupportedException(); } + + + /// LoadVectorx3 : Load three-element tuples into three vectors + + /// + /// svuint8x3_t svld3[_u8](svbool_t pg, const uint8_t *base) + /// LD3B {Zresult0.B - Zresult2.B}, Pg/Z, [Xarray, Xindex] + /// LD3B {Zresult0.B - Zresult2.B}, Pg/Z, [Xbase, #0, MUL VL] + /// + public static unsafe (Vector, Vector, Vector) LoadVectorx3(Vector mask, byte* address) { throw new PlatformNotSupportedException(); } + + /// + /// svfloat64x3_t svld3[_f64](svbool_t pg, const float64_t *base) + /// LD3D {Zresult0.D - Zresult2.D}, Pg/Z, [Xarray, Xindex, LSL #3] + /// LD3D {Zresult0.D - Zresult2.D}, Pg/Z, [Xbase, #0, MUL VL] + /// + public static unsafe (Vector, Vector, Vector) LoadVectorx3(Vector mask, double* address) { throw new PlatformNotSupportedException(); } + + /// + /// svint16x3_t svld3[_s16](svbool_t pg, const int16_t *base) + /// LD3H {Zresult0.H - Zresult2.H}, Pg/Z, [Xarray, Xindex, LSL #1] + /// LD3H {Zresult0.H - Zresult2.H}, Pg/Z, [Xbase, #0, MUL VL] + /// + public static unsafe (Vector, Vector, Vector) LoadVectorx3(Vector mask, short* address) { throw new PlatformNotSupportedException(); } + + /// + /// svint32x3_t svld3[_s32](svbool_t pg, const int32_t *base) + /// LD3W {Zresult0.S - Zresult2.S}, Pg/Z, [Xarray, Xindex, LSL #2] + /// LD3W {Zresult0.S - Zresult2.S}, Pg/Z, [Xbase, #0, MUL VL] + /// + public static unsafe (Vector, Vector, Vector) LoadVectorx3(Vector mask, int* address) { throw new PlatformNotSupportedException(); } + + /// + /// svint64x3_t svld3[_s64](svbool_t pg, const int64_t *base) + /// LD3D {Zresult0.D - Zresult2.D}, Pg/Z, [Xarray, Xindex, LSL #3] + /// LD3D {Zresult0.D - Zresult2.D}, Pg/Z, [Xbase, #0, MUL VL] + /// + public static unsafe (Vector, Vector, Vector) LoadVectorx3(Vector mask, long* address) { throw new PlatformNotSupportedException(); } + + /// + /// svint8x3_t svld3[_s8](svbool_t pg, const int8_t *base) + /// LD3B {Zresult0.B - Zresult2.B}, Pg/Z, [Xarray, Xindex] + /// LD3B {Zresult0.B - Zresult2.B}, Pg/Z, [Xbase, #0, MUL VL] + /// + public static unsafe (Vector, Vector, Vector) LoadVectorx3(Vector mask, sbyte* address) { throw new PlatformNotSupportedException(); } + + /// + /// svfloat32x3_t svld3[_f32](svbool_t pg, const float32_t *base) + /// LD3W {Zresult0.S - Zresult2.S}, Pg/Z, [Xarray, Xindex, LSL #2] + /// LD3W {Zresult0.S - Zresult2.S}, Pg/Z, [Xbase, #0, MUL VL] + /// + public static unsafe (Vector, Vector, Vector) LoadVectorx3(Vector mask, float* address) { throw new PlatformNotSupportedException(); } + + /// + /// svuint16x3_t svld3[_u16](svbool_t pg, const uint16_t *base) + /// LD3H {Zresult0.H - Zresult2.H}, Pg/Z, [Xarray, Xindex, LSL #1] + /// LD3H {Zresult0.H - Zresult2.H}, Pg/Z, [Xbase, #0, MUL VL] + /// + public static unsafe (Vector, Vector, Vector) LoadVectorx3(Vector mask, ushort* address) { throw new PlatformNotSupportedException(); } + + /// + /// svuint32x3_t svld3[_u32](svbool_t pg, const uint32_t *base) + /// LD3W {Zresult0.S - Zresult2.S}, Pg/Z, [Xarray, Xindex, LSL #2] + /// LD3W {Zresult0.S - Zresult2.S}, Pg/Z, [Xbase, #0, MUL VL] + /// + public static unsafe (Vector, Vector, Vector) LoadVectorx3(Vector mask, uint* address) { throw new PlatformNotSupportedException(); } + + /// + /// svuint64x3_t svld3[_u64](svbool_t pg, const uint64_t *base) + /// LD3D {Zresult0.D - Zresult2.D}, Pg/Z, [Xarray, Xindex, LSL #3] + /// LD3D {Zresult0.D - Zresult2.D}, Pg/Z, [Xbase, #0, MUL VL] + /// + public static unsafe (Vector, Vector, Vector) LoadVectorx3(Vector mask, ulong* address) { throw new PlatformNotSupportedException(); } + + + /// LoadVectorx4 : Load four-element tuples into four vectors + + /// + /// svuint8x4_t svld4[_u8](svbool_t pg, const uint8_t *base) + /// LD4B {Zresult0.B - Zresult3.B}, Pg/Z, [Xarray, Xindex] + /// LD4B {Zresult0.B - Zresult3.B}, Pg/Z, [Xbase, #0, MUL VL] + /// + public static unsafe (Vector, Vector, Vector, Vector) LoadVectorx4(Vector mask, byte* address) { throw new PlatformNotSupportedException(); } + + /// + /// svfloat64x4_t svld4[_f64](svbool_t pg, const float64_t *base) + /// LD4D {Zresult0.D - Zresult3.D}, Pg/Z, [Xarray, Xindex, LSL #3] + /// LD4D {Zresult0.D - Zresult3.D}, Pg/Z, [Xbase, #0, MUL VL] + /// + public static unsafe (Vector, Vector, Vector, Vector) LoadVectorx4(Vector mask, double* address) { throw new PlatformNotSupportedException(); } + + /// + /// svint16x4_t svld4[_s16](svbool_t pg, const int16_t *base) + /// LD4H {Zresult0.H - Zresult3.H}, Pg/Z, [Xarray, Xindex, LSL #1] + /// LD4H {Zresult0.H - Zresult3.H}, Pg/Z, [Xbase, #0, MUL VL] + /// + public static unsafe (Vector, Vector, Vector, Vector) LoadVectorx4(Vector mask, short* address) { throw new PlatformNotSupportedException(); } + + /// + /// svint32x4_t svld4[_s32](svbool_t pg, const int32_t *base) + /// LD4W {Zresult0.S - Zresult3.S}, Pg/Z, [Xarray, Xindex, LSL #2] + /// LD4W {Zresult0.S - Zresult3.S}, Pg/Z, [Xbase, #0, MUL VL] + /// + public static unsafe (Vector, Vector, Vector, Vector) LoadVectorx4(Vector mask, int* address) { throw new PlatformNotSupportedException(); } + + /// + /// svint64x4_t svld4[_s64](svbool_t pg, const int64_t *base) + /// LD4D {Zresult0.D - Zresult3.D}, Pg/Z, [Xarray, Xindex, LSL #3] + /// LD4D {Zresult0.D - Zresult3.D}, Pg/Z, [Xbase, #0, MUL VL] + /// + public static unsafe (Vector, Vector, Vector, Vector) LoadVectorx4(Vector mask, long* address) { throw new PlatformNotSupportedException(); } + + /// + /// svint8x4_t svld4[_s8](svbool_t pg, const int8_t *base) + /// LD4B {Zresult0.B - Zresult3.B}, Pg/Z, [Xarray, Xindex] + /// LD4B {Zresult0.B - Zresult3.B}, Pg/Z, [Xbase, #0, MUL VL] + /// + public static unsafe (Vector, Vector, Vector, Vector) LoadVectorx4(Vector mask, sbyte* address) { throw new PlatformNotSupportedException(); } + + /// + /// svfloat32x4_t svld4[_f32](svbool_t pg, const float32_t *base) + /// LD4W {Zresult0.S - Zresult3.S}, Pg/Z, [Xarray, Xindex, LSL #2] + /// LD4W {Zresult0.S - Zresult3.S}, Pg/Z, [Xbase, #0, MUL VL] + /// + public static unsafe (Vector, Vector, Vector, Vector) LoadVectorx4(Vector mask, float* address) { throw new PlatformNotSupportedException(); } + + /// + /// svuint16x4_t svld4[_u16](svbool_t pg, const uint16_t *base) + /// LD4H {Zresult0.H - Zresult3.H}, Pg/Z, [Xarray, Xindex, LSL #1] + /// LD4H {Zresult0.H - Zresult3.H}, Pg/Z, [Xbase, #0, MUL VL] + /// + public static unsafe (Vector, Vector, Vector, Vector) LoadVectorx4(Vector mask, ushort* address) { throw new PlatformNotSupportedException(); } + + /// + /// svuint32x4_t svld4[_u32](svbool_t pg, const uint32_t *base) + /// LD4W {Zresult0.S - Zresult3.S}, Pg/Z, [Xarray, Xindex, LSL #2] + /// LD4W {Zresult0.S - Zresult3.S}, Pg/Z, [Xbase, #0, MUL VL] + /// + public static unsafe (Vector, Vector, Vector, Vector) LoadVectorx4(Vector mask, uint* address) { throw new PlatformNotSupportedException(); } + + /// + /// svuint64x4_t svld4[_u64](svbool_t pg, const uint64_t *base) + /// LD4D {Zresult0.D - Zresult3.D}, Pg/Z, [Xarray, Xindex, LSL #3] + /// LD4D {Zresult0.D - Zresult3.D}, Pg/Z, [Xbase, #0, MUL VL] + /// + public static unsafe (Vector, Vector, Vector, Vector) LoadVectorx4(Vector mask, ulong* address) { throw new PlatformNotSupportedException(); } + + /// Max : Maximum /// From ed8a928e99691c432b3fe6ebec9a65f230dadc91 Mon Sep 17 00:00:00 2001 From: TIHan Date: Mon, 13 May 2024 16:25:46 -0700 Subject: [PATCH 08/22] Fixed test template --- .../GenerateHWIntrinsicTests_Arm.cs | 60 ++-- .../Arm/Shared/SveLoadVectorx2Test.template | 296 ++++++++++++++++ .../Arm/Shared/SveLoadVectorx3Test.template | 313 +++++++++++++++++ .../Arm/Shared/SveLoadVectorx4Test.template | 330 ++++++++++++++++++ 4 files changed, 969 insertions(+), 30 deletions(-) create mode 100644 src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorx2Test.template create mode 100644 src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorx3Test.template create mode 100644 src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorx4Test.template diff --git a/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs b/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs index 5b3b316e9abf5f..efe8967e086a9a 100644 --- a/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs +++ b/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs @@ -3107,36 +3107,36 @@ ("SveLoadMaskedUnOpTest.template", new Dictionary { ["TestName"] = "SveLoadVectorUInt32ZeroExtendToInt64", ["Isa"] = "Sve", ["Method"] = "LoadVectorUInt32ZeroExtendToInt64", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2BaseType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["ValidateIterResult"] = "firstOp[i] != result[i]"}), ("SveLoadMaskedUnOpTest.template", new Dictionary { ["TestName"] = "SveLoadVectorUInt32ZeroExtendToUInt64", ["Isa"] = "Sve", ["Method"] = "LoadVectorUInt32ZeroExtendToUInt64", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt64", ["Op2BaseType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["ValidateIterResult"] = "firstOp[i] != result[i]"}), - ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_float", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector_Vector",["RetBaseType"] = "Single_Single",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Single", ["Op2BaseType"] = "Single", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()", ["ValidateIterResult"] = "false",}), - ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_double", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector_Vector",["RetBaseType"] = "Double_Double",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Double", ["Op2BaseType"] = "Double", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()", ["ValidateIterResult"] = "false",}), - ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_sbyte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector_Vector",["RetBaseType"] = "SByte_SByte",["Op1VectorType"] = "Vector",["Op1BaseType"] = "SByte", ["Op2BaseType"] = "SByte", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["ValidateIterResult"] = "false",}), - ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_short", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector_Vector",["RetBaseType"] = "Int16_Int16",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Int16", ["Op2BaseType"] = "Int16", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["ValidateIterResult"] = "false",}), - ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_int", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector_Vector",["RetBaseType"] = "Int32_Int32",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Int32", ["Op2BaseType"] = "Int32", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["ValidateIterResult"] = "false",}), - ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_long", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector_Vector",["RetBaseType"] = "Int64_Int64",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Int64", ["Op2BaseType"] = "Int64", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["ValidateIterResult"] = "false",}), - ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_byte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector_Vector",["RetBaseType"] = "Byte_Byte",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Byte", ["Op2BaseType"] = "Byte", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetByte()", ["ValidateIterResult"] = "false",}), - ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_ushort", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector_Vector",["RetBaseType"] = "UInt16_UInt16",["Op1VectorType"] = "Vector",["Op1BaseType"] = "UInt16", ["Op2BaseType"] = "UInt16", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["ValidateIterResult"] = "false",}), - ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_uint", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector_Vector",["RetBaseType"] = "UInt32_UInt32",["Op1VectorType"] = "Vector",["Op1BaseType"] = "UInt32", ["Op2BaseType"] = "UInt32", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["ValidateIterResult"] = "false",}), - ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_ulong", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector_Vector",["RetBaseType"] = "UInt64_UInt64",["Op1VectorType"] = "Vector",["Op1BaseType"] = "UInt64", ["Op2BaseType"] = "UInt64", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()", ["ValidateIterResult"] = "false",}), - ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_float", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector_Vector_Vector",["RetBaseType"] = "Single_Single_Single",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Single", ["Op2BaseType"] = "Single", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()", ["ValidateIterResult"] = "false",}), - ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_double", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector_Vector_Vector",["RetBaseType"] = "Double_Double_Double",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Double", ["Op2BaseType"] = "Double", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()", ["ValidateIterResult"] = "false",}), - ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_sbyte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector_Vector_Vector",["RetBaseType"] = "SByte_SByte_SByte",["Op1VectorType"] = "Vector",["Op1BaseType"] = "SByte", ["Op2BaseType"] = "SByte", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["ValidateIterResult"] = "false",}), - ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_short", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector_Vector_Vector",["RetBaseType"] = "Int16_Int16_Int16",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Int16", ["Op2BaseType"] = "Int16", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["ValidateIterResult"] = "false",}), - ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_int", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector_Vector_Vector",["RetBaseType"] = "Int32_Int32_Int32",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Int32", ["Op2BaseType"] = "Int32", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["ValidateIterResult"] = "false",}), - ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_long", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector_Vector_Vector",["RetBaseType"] = "Int64_Int64_Int64",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Int64", ["Op2BaseType"] = "Int64", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["ValidateIterResult"] = "false",}), - ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_byte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector_Vector_Vector",["RetBaseType"] = "Byte_Byte_Byte",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Byte", ["Op2BaseType"] = "Byte", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetByte()", ["ValidateIterResult"] = "false",}), - ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_ushort", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector_Vector_Vector",["RetBaseType"] = "UInt16_UInt16_UInt16",["Op1VectorType"] = "Vector",["Op1BaseType"] = "UInt16", ["Op2BaseType"] = "UInt16", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["ValidateIterResult"] = "false",}), - ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_uint", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector_Vector_Vector",["RetBaseType"] = "UInt32_UInt32_UInt32",["Op1VectorType"] = "Vector",["Op1BaseType"] = "UInt32", ["Op2BaseType"] = "UInt32", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["ValidateIterResult"] = "false",}), - ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_ulong", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector_Vector_Vector",["RetBaseType"] = "UInt64_UInt64_UInt64",["Op1VectorType"] = "Vector",["Op1BaseType"] = "UInt64", ["Op2BaseType"] = "UInt64", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()", ["ValidateIterResult"] = "false",}), - ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_float", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector_Vector_Vector_Vector",["RetBaseType"] = "Single_Single_Single_Single",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Single", ["Op2BaseType"] = "Single", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()", ["ValidateIterResult"] = "false",}), - ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_double", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector_Vector_Vector_Vector",["RetBaseType"] = "Double_Double_Double_Double",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Double", ["Op2BaseType"] = "Double", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()", ["ValidateIterResult"] = "false",}), - ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_sbyte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector_Vector_Vector_Vector",["RetBaseType"] = "SByte_SByte_SByte_SByte",["Op1VectorType"] = "Vector",["Op1BaseType"] = "SByte", ["Op2BaseType"] = "SByte", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["ValidateIterResult"] = "false",}), - ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_short", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector_Vector_Vector_Vector",["RetBaseType"] = "Int16_Int16_Int16_Int16",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Int16", ["Op2BaseType"] = "Int16", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["ValidateIterResult"] = "false",}), - ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_int", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector_Vector_Vector_Vector",["RetBaseType"] = "Int32_Int32_Int32_Int32",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Int32", ["Op2BaseType"] = "Int32", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["ValidateIterResult"] = "false",}), - ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_long", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector_Vector_Vector_Vector",["RetBaseType"] = "Int64_Int64_Int64_Int64",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Int64", ["Op2BaseType"] = "Int64", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["ValidateIterResult"] = "false",}), - ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_byte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector_Vector_Vector_Vector",["RetBaseType"] = "Byte_Byte_Byte_Byte",["Op1VectorType"] = "Vector",["Op1BaseType"] = "Byte", ["Op2BaseType"] = "Byte", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetByte()", ["ValidateIterResult"] = "false",}), - ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_ushort", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector_Vector_Vector_Vector",["RetBaseType"] = "UInt16_UInt16_UInt16_UInt16",["Op1VectorType"] = "Vector",["Op1BaseType"] = "UInt16", ["Op2BaseType"] = "UInt16", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["ValidateIterResult"] = "false",}), - ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_uint", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector_Vector_Vector_Vector",["RetBaseType"] = "UInt32_UInt32_UInt32_UInt32",["Op1VectorType"] = "Vector",["Op1BaseType"] = "UInt32", ["Op2BaseType"] = "UInt32", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["ValidateIterResult"] = "false",}), - ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_ulong", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector_Vector_Vector_Vector",["RetBaseType"] = "UInt64_UInt64_UInt64_UInt64",["Op1VectorType"] = "Vector",["Op1BaseType"] = "UInt64", ["Op2BaseType"] = "UInt64", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()", ["ValidateIterResult"] = "false",}), + ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_float", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Single", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Single", ["Op2BaseType"] = "Single", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()", ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1]"}), + ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_double", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Double", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Double", ["Op2BaseType"] = "Double", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()", ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1]"}), + ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_sbyte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector", ["RetBaseType"] = "SByte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "SByte", ["Op2BaseType"] = "SByte", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1]"}), + ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_short", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2BaseType"] = "Int16", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1]"}), + ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_int", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2BaseType"] = "Int32", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1]"}), + ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_long", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2BaseType"] = "Int64", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1]"}), + ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_byte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Byte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Byte", ["Op2BaseType"] = "Byte", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetByte()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1]"}), + ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_ushort", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["Op2BaseType"] = "UInt16", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt16()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1]"}), + ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_uint", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["Op2BaseType"] = "UInt32", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1]"}), + ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_ulong", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt64", ["Op2BaseType"] = "UInt64", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1]"}), + ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_float", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Single", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Single", ["Op2BaseType"] = "Single", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()", ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2]"}), + ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_double", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Double", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Double", ["Op2BaseType"] = "Double", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()", ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2]"}), + ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_sbyte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector", ["RetBaseType"] = "SByte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "SByte", ["Op2BaseType"] = "SByte", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2]"}), + ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_short", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2BaseType"] = "Int16", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2]"}), + ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_int", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2BaseType"] = "Int32", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2]"}), + ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_long", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2BaseType"] = "Int64", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2]"}), + ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_byte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Byte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Byte", ["Op2BaseType"] = "Byte", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetByte()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2]"}), + ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_ushort", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["Op2BaseType"] = "UInt16", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt16()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2]"}), + ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_uint", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["Op2BaseType"] = "UInt32", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2]"}), + ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_ulong", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt64", ["Op2BaseType"] = "UInt64", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2]"}), + ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_float", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Single", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Single", ["Op2BaseType"] = "Single", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()", ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2] || result4[i] != input[3]"}), + ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_double", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Double", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Double", ["Op2BaseType"] = "Double", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()", ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2] || result4[i] != input[3]"}), + ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_sbyte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector", ["RetBaseType"] = "SByte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "SByte", ["Op2BaseType"] = "SByte", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2] || result4[i] != input[3]"}), + ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_short", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2BaseType"] = "Int16", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2] || result4[i] != input[3]"}), + ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_int", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2BaseType"] = "Int32", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2] || result4[i] != input[3]"}), + ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_long", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2BaseType"] = "Int64", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2] || result4[i] != input[3]"}), + ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_byte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Byte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Byte", ["Op2BaseType"] = "Byte", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetByte()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2] || result4[i] != input[3]"}), + ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_ushort", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["Op2BaseType"] = "UInt16", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt16()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2] || result4[i] != input[3]"}), + ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_uint", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["Op2BaseType"] = "UInt32", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2] || result4[i] != input[3]"}), + ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_ulong", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt64", ["Op2BaseType"] = "UInt64", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2] || result4[i] != input[3]"}), ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve_Max_float", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "Max", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Single", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Single", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Single", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()", ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()", ["ValidateIterResult"] = "Helpers.Max(left[i], right[i]) != result[i]", ["GetIterResult"] = "Helpers.Max(left[i], right[i])"}), ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve_Max_double", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "Max", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Double", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Double", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Double", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()", ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()", ["ValidateIterResult"] = "Helpers.Max(left[i], right[i]) != result[i]", ["GetIterResult"] = "Helpers.Max(left[i], right[i])"}), diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorx2Test.template b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorx2Test.template new file mode 100644 index 00000000000000..72440ddea2fdfd --- /dev/null +++ b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorx2Test.template @@ -0,0 +1,296 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +/****************************************************************************** + * This file is auto-generated from a template file by the GenerateTests.csx * + * script in src\tests\JIT\HardwareIntrinsics\Arm\Shared. In order to make * + * changes, please update the corresponding template and run according to the * + * directions listed in the file. * + ******************************************************************************/ +using System; +using System.Numerics; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Runtime.Intrinsics; +using System.Runtime.Intrinsics.Arm; +using Xunit; + +namespace JIT.HardwareIntrinsics.Arm +{ + public static partial class Program + { + [Fact] + public static void {TestName}() + { + var test = new {TestName}Test(); + if (test.IsSupported) + { + // Validates basic functionality works + test.RunBasicScenario(); + + // Validates calling via reflection works + test.RunReflectionScenario(); + + // Validates passing an instance member of a class works + test.RunClassFldScenario(); + + // Validates passing the field of a local struct works + test.RunStructLclFldScenario(); + + // Validates passing an instance member of a struct works + test.RunStructFldScenario(); + } + else + { + // Validates we throw on unsupported hardware + test.RunUnsupportedScenario(); + } + + if (!test.Succeeded) + { + throw new Exception("One or more scenarios did not complete as expected."); + } + } + } + + public sealed unsafe class {TestName}Test + { + private struct DataTable + { + private byte[] inArray; + private byte[] outArray1; + private byte[] outArray2; + + private GCHandle inHandle; + private GCHandle outHandle1; + private GCHandle outHandle2; + + private ulong alignment; + + public DataTable({Op1BaseType}[] outArray1, {Op1BaseType}[] outArray2, {Op1BaseType}[] inArray, int alignment) + { + int sizeOfInArray = inArray.Length * Unsafe.SizeOf<{Op1BaseType}>(); + int sizeOfOutArray1 = outArray1.Length * Unsafe.SizeOf<{Op1BaseType}>(); + int sizeOfOutArray2 = outArray2.Length * Unsafe.SizeOf<{Op1BaseType}>(); + if ((alignment != 16 && alignment != 8) || (alignment * 2) < sizeOfInArray || (alignment * 2) < sizeOfOutArray1 || (alignment * 2) < sizeOfOutArray2) + { + throw new ArgumentException("Invalid value of alignment"); + } + + this.inArray = new byte[alignment * 2 * 2]; + this.outArray1 = new byte[alignment * 2]; + this.outArray2 = new byte[alignment * 2]; + + this.inHandle = GCHandle.Alloc(this.inArray, GCHandleType.Pinned); + this.outHandle1 = GCHandle.Alloc(this.outArray1, GCHandleType.Pinned); + this.outHandle2 = GCHandle.Alloc(this.outArray2, GCHandleType.Pinned); + + this.alignment = (ulong)alignment; + + Unsafe.CopyBlockUnaligned(ref Unsafe.AsRef(inArrayPtr), ref Unsafe.As<{Op1BaseType}, byte>(ref inArray[0]), (uint)sizeOfInArray); + } + + public void* inArrayPtr => Align((byte*)(inHandle.AddrOfPinnedObject().ToPointer()), alignment); + public void* outArray1Ptr => Align((byte*)(outHandle1.AddrOfPinnedObject().ToPointer()), alignment); + public void* outArray2Ptr => Align((byte*)(outHandle2.AddrOfPinnedObject().ToPointer()), alignment); + + + public void Dispose() + { + inHandle.Free(); + outHandle1.Free(); + outHandle2.Free(); + } + + private static unsafe void* Align(byte* buffer, ulong expectedAlignment) + { + return (void*)(((ulong)buffer + expectedAlignment - 1) & ~(expectedAlignment - 1)); + } + } + + private struct TestStruct + { + public {Op1VectorType}<{Op1BaseType}> _fld1; + public {Op1VectorType}<{Op1BaseType}> _fld2; + + public static TestStruct Create() + { + return new TestStruct(); + } + + public void RunStructFldScenario({TestName}Test testClass) + { + //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable + {Op1VectorType}<{Op1BaseType}> loadMask = Sve.CreateTrueMask{RetBaseType}(SveMaskPattern.All); + + (_fld1, _fld2) = {Isa}.{Method}(loadMask, ({Op1BaseType}*)testClass._dataTable.inArrayPtr); + + testClass.ValidateResult(_fld1, _fld2, testClass._dataTable.inArrayPtr); + } + } + + private static readonly int LargestVectorSize = {LargestVectorSize}; + + private static readonly int OpElementCount = Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>() / sizeof({Op1BaseType}); + private static readonly int DestElementCount = OpElementCount * 2; + + private static {Op1BaseType}[] _data = new {Op1BaseType}[DestElementCount]; + + private {Op1VectorType}<{Op1BaseType}> _fld1; + private {Op1VectorType}<{Op1BaseType}> _fld2; + + private DataTable _dataTable; + + public {TestName}Test() + { + Succeeded = true; + for (var i = 0; i < DestElementCount; i++) { _data[i] = {NextValueOp2}; } + _dataTable = new DataTable(new {Op1BaseType}[OpElementCount], new {Op1BaseType}[OpElementCount], _data, LargestVectorSize); + } + + public bool IsSupported => {Isa}.IsSupported; + + public bool Succeeded { get; set; } + + public void RunBasicScenario() + { + TestLibrary.TestFramework.BeginScenario(nameof(RunBasicScenario)); + + //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable + {Op1VectorType}<{Op1BaseType}> loadMask = Sve.CreateTrueMask{RetBaseType}(SveMaskPattern.All); + + var result = {Isa}.{Method}(loadMask, ({Op1BaseType}*)(_dataTable.inArrayPtr)); + + Unsafe.Write(_dataTable.outArray1Ptr, result.Item1); + Unsafe.Write(_dataTable.outArray2Ptr, result.Item2); + ValidateResult(_dataTable.outArray1Ptr, _dataTable.outArray2Ptr, _dataTable.inArrayPtr); + } + + public void RunReflectionScenario() + { + TestLibrary.TestFramework.BeginScenario(nameof(RunReflectionScenario)); + + //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable + {Op1VectorType}<{Op1BaseType}> loadMask = Sve.CreateTrueMask{RetBaseType}(SveMaskPattern.All); + + var result = typeof({Isa}).GetMethod(nameof({Isa}.{Method}), new Type[] { typeof({Op1BaseType}*) }) + .Invoke(null, new object[] { + loadMask, + Pointer.Box(_dataTable.inArrayPtr, typeof({Op1BaseType}*)) + }); + + var output = (({Op1VectorType}<{Op1BaseType}>,{Op1VectorType}<{Op1BaseType}>))result; + Unsafe.Write(_dataTable.outArray1Ptr, output.Item1); + Unsafe.Write(_dataTable.outArray2Ptr, output.Item2); + ValidateResult(_dataTable.outArray1Ptr, _dataTable.outArray2Ptr, _dataTable.inArrayPtr); + } + + public void RunClassFldScenario() + { + TestLibrary.TestFramework.BeginScenario(nameof(RunClassFldScenario)); + + //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable + {Op1VectorType}<{Op1BaseType}> loadMask = Sve.CreateTrueMask{RetBaseType}(SveMaskPattern.All); + + (_fld1, _fld2) = {Isa}.{Method}(loadMask, ({Op1BaseType}*)_dataTable.inArrayPtr); + + ValidateResult(_fld1, _fld2, _dataTable.inArrayPtr); + } + + public void RunStructLclFldScenario() + { + TestLibrary.TestFramework.BeginScenario(nameof(RunStructLclFldScenario)); + + //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable + {Op1VectorType}<{Op1BaseType}> loadMask = Sve.CreateTrueMask{RetBaseType}(SveMaskPattern.All); + + var test = TestStruct.Create(); + (test._fld1, test._fld2) = {Isa}.{Method}(loadMask, ({Op1BaseType}*)_dataTable.inArrayPtr); + + Unsafe.Write(_dataTable.outArray1Ptr, test._fld1); + Unsafe.Write(_dataTable.outArray2Ptr, test._fld2); + ValidateResult(_dataTable.outArray1Ptr, _dataTable.outArray2Ptr, _dataTable.inArrayPtr); + } + + public void RunStructFldScenario() + { + TestLibrary.TestFramework.BeginScenario(nameof(RunStructFldScenario)); + + var test = TestStruct.Create(); + test.RunStructFldScenario(this); + } + + public void RunUnsupportedScenario() + { + TestLibrary.TestFramework.BeginScenario(nameof(RunUnsupportedScenario)); + + bool succeeded = false; + + try + { + RunClassFldScenario(); + } + catch (PlatformNotSupportedException) + { + succeeded = true; + } + + if (!succeeded) + { + Succeeded = false; + } + } + + private void ValidateResult(void* result1, void* result2, void* input, [CallerMemberName] string method = "") + { + {Op1BaseType}[] inArray = new {Op1BaseType}[DestElementCount]; + {Op1BaseType}[] outArray1 = new {Op1BaseType}[OpElementCount]; + {Op1BaseType}[] outArray2 = new {Op1BaseType}[OpElementCount]; + + Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref inArray[0]), ref Unsafe.AsRef(input), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>() * 2); + Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref outArray1[0]), ref Unsafe.AsRef(result1), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>()); + Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref outArray2[0]), ref Unsafe.AsRef(result2), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>()); + + ValidateResult(inArray, outArray1, outArray2, method); + } + + private void ValidateResult({Op1VectorType}<{Op1BaseType}> result1, {Op1VectorType}<{Op1BaseType}> result2, void* input, [CallerMemberName] string method = "") + { + {Op1BaseType}[] inArray = new {Op1BaseType}[DestElementCount]; + {Op1BaseType}[] outArray1 = new {Op1BaseType}[OpElementCount]; + {Op1BaseType}[] outArray2 = new {Op1BaseType}[OpElementCount]; + + Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref inArray[0]), ref Unsafe.AsRef(input), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>() * 2); + Unsafe.WriteUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref outArray1[0]), result1); + Unsafe.WriteUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref outArray2[0]), result2); + + ValidateResult(inArray, outArray1, outArray2, method); + } + + private void ValidateResult({Op1BaseType}[] input, {Op1BaseType}[] result1, {Op1BaseType}[] result2, [CallerMemberName] string method = "") + { + bool succeeded = true; + + for (int i = 0; i < OpElementCount; i++) + { + if ({ValidateIterResult}) + { + succeeded = false; + break; + } + } + + if (!succeeded) + { + TestLibrary.TestFramework.LogInformation($"{nameof({Isa})}.{nameof({Isa}.{Method})}({Op1VectorType}<{Op1BaseType}>): {Method} failed:"); + TestLibrary.TestFramework.LogInformation($" input: ({string.Join(", ", input)})"); + TestLibrary.TestFramework.LogInformation($" result1: ({string.Join(", ", result1)})"); + TestLibrary.TestFramework.LogInformation($" result2: ({string.Join(", ", result2)})"); + TestLibrary.TestFramework.LogInformation(string.Empty); + + Succeeded = false; + } + } + } +} \ No newline at end of file diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorx3Test.template b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorx3Test.template new file mode 100644 index 00000000000000..ae95cf591b5c3a --- /dev/null +++ b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorx3Test.template @@ -0,0 +1,313 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +/****************************************************************************** + * This file is auto-generated from a template file by the GenerateTests.csx * + * script in src\tests\JIT\HardwareIntrinsics\Arm\Shared. In order to make * + * changes, please update the corresponding template and run according to the * + * directions listed in the file. * + ******************************************************************************/ +using System; +using System.Numerics; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Runtime.Intrinsics; +using System.Runtime.Intrinsics.Arm; +using Xunit; + +namespace JIT.HardwareIntrinsics.Arm +{ + public static partial class Program + { + [Fact] + public static void {TestName}() + { + var test = new {TestName}Test(); + if (test.IsSupported) + { + // Validates basic functionality works + test.RunBasicScenario(); + + // Validates calling via reflection works + test.RunReflectionScenario(); + + // Validates passing an instance member of a class works + test.RunClassFldScenario(); + + // Validates passing the field of a local struct works + test.RunStructLclFldScenario(); + + // Validates passing an instance member of a struct works + test.RunStructFldScenario(); + } + else + { + // Validates we throw on unsupported hardware + test.RunUnsupportedScenario(); + } + + if (!test.Succeeded) + { + throw new Exception("One or more scenarios did not complete as expected."); + } + } + } + + public sealed unsafe class {TestName}Test + { + private struct DataTable + { + private byte[] inArray; + private byte[] outArray1; + private byte[] outArray2; + private byte[] outArray3; + + private GCHandle inHandle; + private GCHandle outHandle1; + private GCHandle outHandle2; + private GCHandle outHandle3; + + private ulong alignment; + + public DataTable({Op1BaseType}[] outArray1, {Op1BaseType}[] outArray2, {Op1BaseType}[] outArray3, {Op1BaseType}[] inArray, int alignment) + { + int sizeOfInArray = inArray.Length * Unsafe.SizeOf<{Op1BaseType}>(); + int sizeOfOutArray1 = outArray1.Length * Unsafe.SizeOf<{Op1BaseType}>(); + int sizeOfOutArray2 = outArray2.Length * Unsafe.SizeOf<{Op1BaseType}>(); + int sizeOfOutArray3 = outArray3.Length * Unsafe.SizeOf<{Op1BaseType}>(); + if ((alignment != 16 && alignment != 8) || (alignment * 3) < sizeOfInArray || (alignment * 2) < sizeOfOutArray1 || (alignment * 2) < sizeOfOutArray2 || (alignment * 2) < sizeOfOutArray3) + { + throw new ArgumentException("Invalid value of alignment"); + } + + this.inArray = new byte[alignment * 2 * 3]; + this.outArray1 = new byte[alignment * 2]; + this.outArray2 = new byte[alignment * 2]; + this.outArray3 = new byte[alignment * 2]; + + this.inHandle = GCHandle.Alloc(this.inArray, GCHandleType.Pinned); + this.outHandle1 = GCHandle.Alloc(this.outArray1, GCHandleType.Pinned); + this.outHandle2 = GCHandle.Alloc(this.outArray2, GCHandleType.Pinned); + this.outHandle3 = GCHandle.Alloc(this.outArray3, GCHandleType.Pinned); + + this.alignment = (ulong)alignment; + + Unsafe.CopyBlockUnaligned(ref Unsafe.AsRef(inArrayPtr), ref Unsafe.As<{Op1BaseType}, byte>(ref inArray[0]), (uint)sizeOfInArray); + } + + public void* inArrayPtr => Align((byte*)(inHandle.AddrOfPinnedObject().ToPointer()), alignment); + public void* outArray1Ptr => Align((byte*)(outHandle1.AddrOfPinnedObject().ToPointer()), alignment); + public void* outArray2Ptr => Align((byte*)(outHandle2.AddrOfPinnedObject().ToPointer()), alignment); + public void* outArray3Ptr => Align((byte*)(outHandle3.AddrOfPinnedObject().ToPointer()), alignment); + + + public void Dispose() + { + inHandle.Free(); + outHandle1.Free(); + outHandle2.Free(); + outHandle3.Free(); + } + + private static unsafe void* Align(byte* buffer, ulong expectedAlignment) + { + return (void*)(((ulong)buffer + expectedAlignment - 1) & ~(expectedAlignment - 1)); + } + } + + private struct TestStruct + { + public {Op1VectorType}<{Op1BaseType}> _fld1; + public {Op1VectorType}<{Op1BaseType}> _fld2; + public {Op1VectorType}<{Op1BaseType}> _fld3; + + public static TestStruct Create() + { + return new TestStruct(); + } + + public void RunStructFldScenario({TestName}Test testClass) + { + //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable + {Op1VectorType}<{Op1BaseType}> loadMask = Sve.CreateTrueMask{RetBaseType}(SveMaskPattern.All); + + (_fld1, _fld2, _fld3) = {Isa}.{Method}(loadMask, ({Op1BaseType}*)testClass._dataTable.inArrayPtr); + + testClass.ValidateResult(_fld1, _fld2, _fld3, testClass._dataTable.inArrayPtr); + } + } + + private static readonly int LargestVectorSize = {LargestVectorSize}; + + private static readonly int OpElementCount = Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>() / sizeof({Op1BaseType}); + private static readonly int DestElementCount = OpElementCount * 3; + + private static {Op1BaseType}[] _data = new {Op1BaseType}[DestElementCount]; + + private {Op1VectorType}<{Op1BaseType}> _fld1; + private {Op1VectorType}<{Op1BaseType}> _fld2; + private {Op1VectorType}<{Op1BaseType}> _fld3; + + private DataTable _dataTable; + + public {TestName}Test() + { + Succeeded = true; + for (var i = 0; i < DestElementCount; i++) { _data[i] = {NextValueOp2}; } + _dataTable = new DataTable(new {Op1BaseType}[OpElementCount], new {Op1BaseType}[OpElementCount], new {Op1BaseType}[OpElementCount], _data, LargestVectorSize); + } + + public bool IsSupported => {Isa}.IsSupported; + + public bool Succeeded { get; set; } + + public void RunBasicScenario() + { + TestLibrary.TestFramework.BeginScenario(nameof(RunBasicScenario)); + + //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable + {Op1VectorType}<{Op1BaseType}> loadMask = Sve.CreateTrueMask{RetBaseType}(SveMaskPattern.All); + + var result = {Isa}.{Method}(loadMask, ({Op1BaseType}*)(_dataTable.inArrayPtr)); + + Unsafe.Write(_dataTable.outArray1Ptr, result.Item1); + Unsafe.Write(_dataTable.outArray2Ptr, result.Item2); + Unsafe.Write(_dataTable.outArray3Ptr, result.Item3); + ValidateResult(_dataTable.outArray1Ptr, _dataTable.outArray2Ptr, _dataTable.outArray3Ptr, _dataTable.inArrayPtr); + } + + public void RunReflectionScenario() + { + TestLibrary.TestFramework.BeginScenario(nameof(RunReflectionScenario)); + + //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable + {Op1VectorType}<{Op1BaseType}> loadMask = Sve.CreateTrueMask{RetBaseType}(SveMaskPattern.All); + + var result = typeof({Isa}).GetMethod(nameof({Isa}.{Method}), new Type[] { typeof({Op1BaseType}*) }) + .Invoke(null, new object[] { + loadMask, + Pointer.Box(_dataTable.inArrayPtr, typeof({Op1BaseType}*)) + }); + + var output = (({Op1VectorType}<{Op1BaseType}>,{Op1VectorType}<{Op1BaseType}>,{Op1VectorType}<{Op1BaseType}>))result; + Unsafe.Write(_dataTable.outArray1Ptr, output.Item1); + Unsafe.Write(_dataTable.outArray2Ptr, output.Item2); + Unsafe.Write(_dataTable.outArray3Ptr, output.Item3); + ValidateResult(_dataTable.outArray1Ptr, _dataTable.outArray2Ptr, _dataTable.outArray3Ptr, _dataTable.inArrayPtr); + } + + public void RunClassFldScenario() + { + TestLibrary.TestFramework.BeginScenario(nameof(RunClassFldScenario)); + + //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable + {Op1VectorType}<{Op1BaseType}> loadMask = Sve.CreateTrueMask{RetBaseType}(SveMaskPattern.All); + + (_fld1, _fld2, _fld3) = {Isa}.{Method}(loadMask, ({Op1BaseType}*)_dataTable.inArrayPtr); + + ValidateResult(_fld1, _fld2, _fld3, _dataTable.inArrayPtr); + } + + public void RunStructLclFldScenario() + { + TestLibrary.TestFramework.BeginScenario(nameof(RunStructLclFldScenario)); + + //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable + {Op1VectorType}<{Op1BaseType}> loadMask = Sve.CreateTrueMask{RetBaseType}(SveMaskPattern.All); + + var test = TestStruct.Create(); + (test._fld1, test._fld2, test._fld3) = {Isa}.{Method}(loadMask, ({Op1BaseType}*)_dataTable.inArrayPtr); + + Unsafe.Write(_dataTable.outArray1Ptr, test._fld1); + Unsafe.Write(_dataTable.outArray2Ptr, test._fld2); + Unsafe.Write(_dataTable.outArray3Ptr, test._fld3); + ValidateResult(_dataTable.outArray1Ptr, _dataTable.outArray2Ptr, _dataTable.outArray3Ptr, _dataTable.inArrayPtr); + } + + public void RunStructFldScenario() + { + TestLibrary.TestFramework.BeginScenario(nameof(RunStructFldScenario)); + + var test = TestStruct.Create(); + test.RunStructFldScenario(this); + } + + public void RunUnsupportedScenario() + { + TestLibrary.TestFramework.BeginScenario(nameof(RunUnsupportedScenario)); + + bool succeeded = false; + + try + { + RunClassFldScenario(); + } + catch (PlatformNotSupportedException) + { + succeeded = true; + } + + if (!succeeded) + { + Succeeded = false; + } + } + + private void ValidateResult(void* result1, void* result2, void* result3, void* input, [CallerMemberName] string method = "") + { + {Op1BaseType}[] inArray = new {Op1BaseType}[DestElementCount]; + {Op1BaseType}[] outArray1 = new {Op1BaseType}[OpElementCount]; + {Op1BaseType}[] outArray2 = new {Op1BaseType}[OpElementCount]; + {Op1BaseType}[] outArray3 = new {Op1BaseType}[OpElementCount]; + + Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref inArray[0]), ref Unsafe.AsRef(input), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>() * 3); + Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref outArray1[0]), ref Unsafe.AsRef(result1), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>()); + Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref outArray2[0]), ref Unsafe.AsRef(result2), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>()); + Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref outArray3[0]), ref Unsafe.AsRef(result3), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>()); + + ValidateResult(inArray, outArray1, outArray2, outArray3, method); + } + + private void ValidateResult({Op1VectorType}<{Op1BaseType}> result1, {Op1VectorType}<{Op1BaseType}> result2, {Op1VectorType}<{Op1BaseType}> result3, void* input, [CallerMemberName] string method = "") + { + {Op1BaseType}[] inArray = new {Op1BaseType}[DestElementCount]; + {Op1BaseType}[] outArray1 = new {Op1BaseType}[OpElementCount]; + {Op1BaseType}[] outArray2 = new {Op1BaseType}[OpElementCount]; + {Op1BaseType}[] outArray3 = new {Op1BaseType}[OpElementCount]; + + Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref inArray[0]), ref Unsafe.AsRef(input), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>() * 3); + Unsafe.WriteUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref outArray1[0]), result1); + Unsafe.WriteUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref outArray2[0]), result2); + Unsafe.WriteUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref outArray3[0]), result3); + + ValidateResult(inArray, outArray1, outArray2, outArray3, method); + } + + private void ValidateResult({Op1BaseType}[] input, {Op1BaseType}[] result1, {Op1BaseType}[] result2, {Op1BaseType}[] result3, [CallerMemberName] string method = "") + { + bool succeeded = true; + + for (int i = 0; i < OpElementCount; i++) + { + if ({ValidateIterResult}) + { + succeeded = false; + break; + } + } + + if (!succeeded) + { + TestLibrary.TestFramework.LogInformation($"{nameof({Isa})}.{nameof({Isa}.{Method})}({Op1VectorType}<{Op1BaseType}>): {Method} failed:"); + TestLibrary.TestFramework.LogInformation($" input: ({string.Join(", ", input)})"); + TestLibrary.TestFramework.LogInformation($" result1: ({string.Join(", ", result1)})"); + TestLibrary.TestFramework.LogInformation($" result2: ({string.Join(", ", result2)})"); + TestLibrary.TestFramework.LogInformation($" result3: ({string.Join(", ", result3)})"); + TestLibrary.TestFramework.LogInformation(string.Empty); + + Succeeded = false; + } + } + } +} \ No newline at end of file diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorx4Test.template b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorx4Test.template new file mode 100644 index 00000000000000..80b5b9e1b6adb5 --- /dev/null +++ b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorx4Test.template @@ -0,0 +1,330 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +/****************************************************************************** + * This file is auto-generated from a template file by the GenerateTests.csx * + * script in src\tests\JIT\HardwareIntrinsics\Arm\Shared. In order to make * + * changes, please update the corresponding template and run according to the * + * directions listed in the file. * + ******************************************************************************/ +using System; +using System.Numerics; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Runtime.Intrinsics; +using System.Runtime.Intrinsics.Arm; +using Xunit; + +namespace JIT.HardwareIntrinsics.Arm +{ + public static partial class Program + { + [Fact] + public static void {TestName}() + { + var test = new {TestName}Test(); + if (test.IsSupported) + { + // Validates basic functionality works + test.RunBasicScenario(); + + // Validates calling via reflection works + test.RunReflectionScenario(); + + // Validates passing an instance member of a class works + test.RunClassFldScenario(); + + // Validates passing the field of a local struct works + test.RunStructLclFldScenario(); + + // Validates passing an instance member of a struct works + test.RunStructFldScenario(); + } + else + { + // Validates we throw on unsupported hardware + test.RunUnsupportedScenario(); + } + + if (!test.Succeeded) + { + throw new Exception("One or more scenarios did not complete as expected."); + } + } + } + + public sealed unsafe class {TestName}Test + { + private struct DataTable + { + private byte[] inArray; + private byte[] outArray1; + private byte[] outArray2; + private byte[] outArray3; + private byte[] outArray4; + + private GCHandle inHandle; + private GCHandle outHandle1; + private GCHandle outHandle2; + private GCHandle outHandle3; + private GCHandle outHandle4; + + private ulong alignment; + + public DataTable({Op1BaseType}[] outArray1, {Op1BaseType}[] outArray2, {Op1BaseType}[] outArray3, {Op1BaseType}[] outArray4, {Op1BaseType}[] inArray, int alignment) + { + int sizeOfInArray = inArray.Length * Unsafe.SizeOf<{Op1BaseType}>(); + int sizeOfOutArray1 = outArray1.Length * Unsafe.SizeOf<{Op1BaseType}>(); + int sizeOfOutArray2 = outArray2.Length * Unsafe.SizeOf<{Op1BaseType}>(); + int sizeOfOutArray3 = outArray3.Length * Unsafe.SizeOf<{Op1BaseType}>(); + int sizeOfOutArray4 = outArray4.Length * Unsafe.SizeOf<{Op1BaseType}>(); + if ((alignment != 16 && alignment != 8) || (alignment * 4) < sizeOfInArray || (alignment * 2) < sizeOfOutArray1 || (alignment * 2) < sizeOfOutArray2 || (alignment * 2) < sizeOfOutArray3 || (alignment * 2) < sizeOfOutArray4) + { + throw new ArgumentException("Invalid value of alignment"); + } + + this.inArray = new byte[alignment * 2 * 4]; + this.outArray1 = new byte[alignment * 2]; + this.outArray2 = new byte[alignment * 2]; + this.outArray3 = new byte[alignment * 2]; + this.outArray4 = new byte[alignment * 2]; + + this.inHandle = GCHandle.Alloc(this.inArray, GCHandleType.Pinned); + this.outHandle1 = GCHandle.Alloc(this.outArray1, GCHandleType.Pinned); + this.outHandle2 = GCHandle.Alloc(this.outArray2, GCHandleType.Pinned); + this.outHandle3 = GCHandle.Alloc(this.outArray3, GCHandleType.Pinned); + this.outHandle4 = GCHandle.Alloc(this.outArray4, GCHandleType.Pinned); + + this.alignment = (ulong)alignment; + + Unsafe.CopyBlockUnaligned(ref Unsafe.AsRef(inArrayPtr), ref Unsafe.As<{Op1BaseType}, byte>(ref inArray[0]), (uint)sizeOfInArray); + } + + public void* inArrayPtr => Align((byte*)(inHandle.AddrOfPinnedObject().ToPointer()), alignment); + public void* outArray1Ptr => Align((byte*)(outHandle1.AddrOfPinnedObject().ToPointer()), alignment); + public void* outArray2Ptr => Align((byte*)(outHandle2.AddrOfPinnedObject().ToPointer()), alignment); + public void* outArray3Ptr => Align((byte*)(outHandle3.AddrOfPinnedObject().ToPointer()), alignment); + public void* outArray4Ptr => Align((byte*)(outHandle4.AddrOfPinnedObject().ToPointer()), alignment); + + + public void Dispose() + { + inHandle.Free(); + outHandle1.Free(); + outHandle2.Free(); + outHandle3.Free(); + outHandle4.Free(); + } + + private static unsafe void* Align(byte* buffer, ulong expectedAlignment) + { + return (void*)(((ulong)buffer + expectedAlignment - 1) & ~(expectedAlignment - 1)); + } + } + + private struct TestStruct + { + public {Op1VectorType}<{Op1BaseType}> _fld1; + public {Op1VectorType}<{Op1BaseType}> _fld2; + public {Op1VectorType}<{Op1BaseType}> _fld3; + public {Op1VectorType}<{Op1BaseType}> _fld4; + + public static TestStruct Create() + { + return new TestStruct(); + } + + public void RunStructFldScenario({TestName}Test testClass) + { + //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable + {Op1VectorType}<{Op1BaseType}> loadMask = Sve.CreateTrueMask{RetBaseType}(SveMaskPattern.All); + + (_fld1, _fld2, _fld3, _fld4) = {Isa}.{Method}(loadMask, ({Op1BaseType}*)testClass._dataTable.inArrayPtr); + + testClass.ValidateResult(_fld1, _fld2, _fld3, _fld4, testClass._dataTable.inArrayPtr); + } + } + + private static readonly int LargestVectorSize = {LargestVectorSize}; + + private static readonly int OpElementCount = Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>() / sizeof({Op1BaseType}); + private static readonly int DestElementCount = OpElementCount * 4; + + private static {Op1BaseType}[] _data = new {Op1BaseType}[DestElementCount]; + + private {Op1VectorType}<{Op1BaseType}> _fld1; + private {Op1VectorType}<{Op1BaseType}> _fld2; + private {Op1VectorType}<{Op1BaseType}> _fld3; + private {Op1VectorType}<{Op1BaseType}> _fld4; + + private DataTable _dataTable; + + public {TestName}Test() + { + Succeeded = true; + for (var i = 0; i < DestElementCount; i++) { _data[i] = {NextValueOp2}; } + _dataTable = new DataTable(new {Op1BaseType}[OpElementCount], new {Op1BaseType}[OpElementCount], new {Op1BaseType}[OpElementCount], new {Op1BaseType}[OpElementCount], _data, LargestVectorSize); + } + + public bool IsSupported => {Isa}.IsSupported; + + public bool Succeeded { get; set; } + + public void RunBasicScenario() + { + TestLibrary.TestFramework.BeginScenario(nameof(RunBasicScenario)); + + //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable + {Op1VectorType}<{Op1BaseType}> loadMask = Sve.CreateTrueMask{RetBaseType}(SveMaskPattern.All); + + var result = {Isa}.{Method}(loadMask, ({Op1BaseType}*)(_dataTable.inArrayPtr)); + + Unsafe.Write(_dataTable.outArray1Ptr, result.Item1); + Unsafe.Write(_dataTable.outArray2Ptr, result.Item2); + Unsafe.Write(_dataTable.outArray3Ptr, result.Item3); + Unsafe.Write(_dataTable.outArray4Ptr, result.Item4); + ValidateResult(_dataTable.outArray1Ptr, _dataTable.outArray2Ptr, _dataTable.outArray3Ptr, _dataTable.outArray4Ptr, _dataTable.inArrayPtr); + } + + public void RunReflectionScenario() + { + TestLibrary.TestFramework.BeginScenario(nameof(RunReflectionScenario)); + + //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable + {Op1VectorType}<{Op1BaseType}> loadMask = Sve.CreateTrueMask{RetBaseType}(SveMaskPattern.All); + + var result = typeof({Isa}).GetMethod(nameof({Isa}.{Method}), new Type[] { typeof({Op1BaseType}*) }) + .Invoke(null, new object[] { + loadMask, + Pointer.Box(_dataTable.inArrayPtr, typeof({Op1BaseType}*)) + }); + + var output = (({Op1VectorType}<{Op1BaseType}>,{Op1VectorType}<{Op1BaseType}>,{Op1VectorType}<{Op1BaseType}>,{Op1VectorType}<{Op1BaseType}>))result; + Unsafe.Write(_dataTable.outArray1Ptr, output.Item1); + Unsafe.Write(_dataTable.outArray2Ptr, output.Item2); + Unsafe.Write(_dataTable.outArray3Ptr, output.Item3); + Unsafe.Write(_dataTable.outArray4Ptr, output.Item4); + ValidateResult(_dataTable.outArray1Ptr, _dataTable.outArray2Ptr, _dataTable.outArray3Ptr, _dataTable.outArray4Ptr, _dataTable.inArrayPtr); + } + + public void RunClassFldScenario() + { + TestLibrary.TestFramework.BeginScenario(nameof(RunClassFldScenario)); + + //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable + {Op1VectorType}<{Op1BaseType}> loadMask = Sve.CreateTrueMask{RetBaseType}(SveMaskPattern.All); + + (_fld1, _fld2, _fld3, _fld4) = {Isa}.{Method}(loadMask, ({Op1BaseType}*)_dataTable.inArrayPtr); + + ValidateResult(_fld1, _fld2, _fld3, _fld4, _dataTable.inArrayPtr); + } + + public void RunStructLclFldScenario() + { + TestLibrary.TestFramework.BeginScenario(nameof(RunStructLclFldScenario)); + + //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable + {Op1VectorType}<{Op1BaseType}> loadMask = Sve.CreateTrueMask{RetBaseType}(SveMaskPattern.All); + + var test = TestStruct.Create(); + (test._fld1, test._fld2, test._fld3, test._fld4) = {Isa}.{Method}(loadMask, ({Op1BaseType}*)_dataTable.inArrayPtr); + + Unsafe.Write(_dataTable.outArray1Ptr, test._fld1); + Unsafe.Write(_dataTable.outArray2Ptr, test._fld2); + Unsafe.Write(_dataTable.outArray3Ptr, test._fld3); + Unsafe.Write(_dataTable.outArray4Ptr, test._fld4); + ValidateResult(_dataTable.outArray1Ptr, _dataTable.outArray2Ptr, _dataTable.outArray3Ptr, _dataTable.outArray4Ptr, _dataTable.inArrayPtr); + } + + public void RunStructFldScenario() + { + TestLibrary.TestFramework.BeginScenario(nameof(RunStructFldScenario)); + + var test = TestStruct.Create(); + test.RunStructFldScenario(this); + } + + public void RunUnsupportedScenario() + { + TestLibrary.TestFramework.BeginScenario(nameof(RunUnsupportedScenario)); + + bool succeeded = false; + + try + { + RunClassFldScenario(); + } + catch (PlatformNotSupportedException) + { + succeeded = true; + } + + if (!succeeded) + { + Succeeded = false; + } + } + + private void ValidateResult(void* result1, void* result2, void* result3, void* result4, void* input, [CallerMemberName] string method = "") + { + {Op1BaseType}[] inArray = new {Op1BaseType}[DestElementCount]; + {Op1BaseType}[] outArray1 = new {Op1BaseType}[OpElementCount]; + {Op1BaseType}[] outArray2 = new {Op1BaseType}[OpElementCount]; + {Op1BaseType}[] outArray3 = new {Op1BaseType}[OpElementCount]; + {Op1BaseType}[] outArray4 = new {Op1BaseType}[OpElementCount]; + + Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref inArray[0]), ref Unsafe.AsRef(input), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>() * 4); + Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref outArray1[0]), ref Unsafe.AsRef(result1), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>()); + Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref outArray2[0]), ref Unsafe.AsRef(result2), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>()); + Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref outArray3[0]), ref Unsafe.AsRef(result3), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>()); + Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref outArray4[0]), ref Unsafe.AsRef(result4), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>()); + + ValidateResult(inArray, outArray1, outArray2, outArray3, outArray4, method); + } + + private void ValidateResult({Op1VectorType}<{Op1BaseType}> result1, {Op1VectorType}<{Op1BaseType}> result2, {Op1VectorType}<{Op1BaseType}> result3, {Op1VectorType}<{Op1BaseType}> result4, void* input, [CallerMemberName] string method = "") + { + {Op1BaseType}[] inArray = new {Op1BaseType}[DestElementCount]; + {Op1BaseType}[] outArray1 = new {Op1BaseType}[OpElementCount]; + {Op1BaseType}[] outArray2 = new {Op1BaseType}[OpElementCount]; + {Op1BaseType}[] outArray3 = new {Op1BaseType}[OpElementCount]; + {Op1BaseType}[] outArray4 = new {Op1BaseType}[OpElementCount]; + + Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref inArray[0]), ref Unsafe.AsRef(input), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>() * 4); + Unsafe.WriteUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref outArray1[0]), result1); + Unsafe.WriteUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref outArray2[0]), result2); + Unsafe.WriteUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref outArray3[0]), result3); + Unsafe.WriteUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref outArray4[0]), result4); + + ValidateResult(inArray, outArray1, outArray2, outArray3, outArray4, method); + } + + private void ValidateResult({Op1BaseType}[] input, {Op1BaseType}[] result1, {Op1BaseType}[] result2, {Op1BaseType}[] result3, {Op1BaseType}[] result4, [CallerMemberName] string method = "") + { + bool succeeded = true; + + for (int i = 0; i < OpElementCount; i++) + { + if ({ValidateIterResult}) + { + succeeded = false; + break; + } + } + + if (!succeeded) + { + TestLibrary.TestFramework.LogInformation($"{nameof({Isa})}.{nameof({Isa}.{Method})}({Op1VectorType}<{Op1BaseType}>): {Method} failed:"); + TestLibrary.TestFramework.LogInformation($" input: ({string.Join(", ", input)})"); + TestLibrary.TestFramework.LogInformation($" result1: ({string.Join(", ", result1)})"); + TestLibrary.TestFramework.LogInformation($" result2: ({string.Join(", ", result2)})"); + TestLibrary.TestFramework.LogInformation($" result3: ({string.Join(", ", result3)})"); + TestLibrary.TestFramework.LogInformation($" result4: ({string.Join(", ", result4)})"); + TestLibrary.TestFramework.LogInformation(string.Empty); + + Succeeded = false; + } + } + } +} \ No newline at end of file From 2f0efe7fe7e20e76907514dbc14b774bbc766017 Mon Sep 17 00:00:00 2001 From: TIHan Date: Tue, 14 May 2024 11:54:02 -0700 Subject: [PATCH 09/22] Feedback --- .../Arm/Sve.PlatformNotSupported.cs | 39 ------------ .../src/System/Runtime/Intrinsics/Arm/Sve.cs | 39 ------------ .../GenerateHWIntrinsicTests_Arm.cs | 60 +++++++++---------- .../Arm/Shared/SveLoadVectorx2Test.template | 2 +- .../Arm/Shared/SveLoadVectorx3Test.template | 2 +- .../Arm/Shared/SveLoadVectorx4Test.template | 2 +- 6 files changed, 33 insertions(+), 111 deletions(-) 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 bc2a2566d8504e..be0e2e669e8059 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 @@ -1423,221 +1423,182 @@ internal Arm64() { } /// public static unsafe Vector LoadVectorUInt32ZeroExtendToUInt64(Vector mask, uint* address) { throw new PlatformNotSupportedException(); } - - /// LoadVectorx2 : Load two-element tuples into two vectors - /// /// svuint8x2_t svld2[_u8](svbool_t pg, const uint8_t *base) - /// LD2B {Zresult0.B, Zresult1.B}, Pg/Z, [Xarray, Xindex] /// LD2B {Zresult0.B, Zresult1.B}, Pg/Z, [Xbase, #0, MUL VL] /// public static unsafe (Vector, Vector) LoadVectorx2(Vector mask, byte* address) { throw new PlatformNotSupportedException(); } /// /// svfloat64x2_t svld2[_f64](svbool_t pg, const float64_t *base) - /// LD2D {Zresult0.D, Zresult1.D}, Pg/Z, [Xarray, Xindex, LSL #3] /// LD2D {Zresult0.D, Zresult1.D}, Pg/Z, [Xbase, #0, MUL VL] /// public static unsafe (Vector, Vector) LoadVectorx2(Vector mask, double* address) { throw new PlatformNotSupportedException(); } /// /// svint16x2_t svld2[_s16](svbool_t pg, const int16_t *base) - /// LD2H {Zresult0.H, Zresult1.H}, Pg/Z, [Xarray, Xindex, LSL #1] /// LD2H {Zresult0.H, Zresult1.H}, Pg/Z, [Xbase, #0, MUL VL] /// public static unsafe (Vector, Vector) LoadVectorx2(Vector mask, short* address) { throw new PlatformNotSupportedException(); } /// /// svint32x2_t svld2[_s32](svbool_t pg, const int32_t *base) - /// LD2W {Zresult0.S, Zresult1.S}, Pg/Z, [Xarray, Xindex, LSL #2] /// LD2W {Zresult0.S, Zresult1.S}, Pg/Z, [Xbase, #0, MUL VL] /// public static unsafe (Vector, Vector) LoadVectorx2(Vector mask, int* address) { throw new PlatformNotSupportedException(); } /// /// svint64x2_t svld2[_s64](svbool_t pg, const int64_t *base) - /// LD2D {Zresult0.D, Zresult1.D}, Pg/Z, [Xarray, Xindex, LSL #3] /// LD2D {Zresult0.D, Zresult1.D}, Pg/Z, [Xbase, #0, MUL VL] /// public static unsafe (Vector, Vector) LoadVectorx2(Vector mask, long* address) { throw new PlatformNotSupportedException(); } /// /// svint8x2_t svld2[_s8](svbool_t pg, const int8_t *base) - /// LD2B {Zresult0.B, Zresult1.B}, Pg/Z, [Xarray, Xindex] /// LD2B {Zresult0.B, Zresult1.B}, Pg/Z, [Xbase, #0, MUL VL] /// public static unsafe (Vector, Vector) LoadVectorx2(Vector mask, sbyte* address) { throw new PlatformNotSupportedException(); } /// /// svfloat32x2_t svld2[_f32](svbool_t pg, const float32_t *base) - /// LD2W {Zresult0.S, Zresult1.S}, Pg/Z, [Xarray, Xindex, LSL #2] /// LD2W {Zresult0.S, Zresult1.S}, Pg/Z, [Xbase, #0, MUL VL] /// public static unsafe (Vector, Vector) LoadVectorx2(Vector mask, float* address) { throw new PlatformNotSupportedException(); } /// /// svuint16x2_t svld2[_u16](svbool_t pg, const uint16_t *base) - /// LD2H {Zresult0.H, Zresult1.H}, Pg/Z, [Xarray, Xindex, LSL #1] /// LD2H {Zresult0.H, Zresult1.H}, Pg/Z, [Xbase, #0, MUL VL] /// public static unsafe (Vector, Vector) LoadVectorx2(Vector mask, ushort* address) { throw new PlatformNotSupportedException(); } /// /// svuint32x2_t svld2[_u32](svbool_t pg, const uint32_t *base) - /// LD2W {Zresult0.S, Zresult1.S}, Pg/Z, [Xarray, Xindex, LSL #2] /// LD2W {Zresult0.S, Zresult1.S}, Pg/Z, [Xbase, #0, MUL VL] /// public static unsafe (Vector, Vector) LoadVectorx2(Vector mask, uint* address) { throw new PlatformNotSupportedException(); } /// /// svuint64x2_t svld2[_u64](svbool_t pg, const uint64_t *base) - /// LD2D {Zresult0.D, Zresult1.D}, Pg/Z, [Xarray, Xindex, LSL #3] /// LD2D {Zresult0.D, Zresult1.D}, Pg/Z, [Xbase, #0, MUL VL] /// public static unsafe (Vector, Vector) LoadVectorx2(Vector mask, ulong* address) { throw new PlatformNotSupportedException(); } - - /// LoadVectorx3 : Load three-element tuples into three vectors - /// /// svuint8x3_t svld3[_u8](svbool_t pg, const uint8_t *base) - /// LD3B {Zresult0.B - Zresult2.B}, Pg/Z, [Xarray, Xindex] /// LD3B {Zresult0.B - Zresult2.B}, Pg/Z, [Xbase, #0, MUL VL] /// public static unsafe (Vector, Vector, Vector) LoadVectorx3(Vector mask, byte* address) { throw new PlatformNotSupportedException(); } /// /// svfloat64x3_t svld3[_f64](svbool_t pg, const float64_t *base) - /// LD3D {Zresult0.D - Zresult2.D}, Pg/Z, [Xarray, Xindex, LSL #3] /// LD3D {Zresult0.D - Zresult2.D}, Pg/Z, [Xbase, #0, MUL VL] /// public static unsafe (Vector, Vector, Vector) LoadVectorx3(Vector mask, double* address) { throw new PlatformNotSupportedException(); } /// /// svint16x3_t svld3[_s16](svbool_t pg, const int16_t *base) - /// LD3H {Zresult0.H - Zresult2.H}, Pg/Z, [Xarray, Xindex, LSL #1] /// LD3H {Zresult0.H - Zresult2.H}, Pg/Z, [Xbase, #0, MUL VL] /// public static unsafe (Vector, Vector, Vector) LoadVectorx3(Vector mask, short* address) { throw new PlatformNotSupportedException(); } /// /// svint32x3_t svld3[_s32](svbool_t pg, const int32_t *base) - /// LD3W {Zresult0.S - Zresult2.S}, Pg/Z, [Xarray, Xindex, LSL #2] /// LD3W {Zresult0.S - Zresult2.S}, Pg/Z, [Xbase, #0, MUL VL] /// public static unsafe (Vector, Vector, Vector) LoadVectorx3(Vector mask, int* address) { throw new PlatformNotSupportedException(); } /// /// svint64x3_t svld3[_s64](svbool_t pg, const int64_t *base) - /// LD3D {Zresult0.D - Zresult2.D}, Pg/Z, [Xarray, Xindex, LSL #3] /// LD3D {Zresult0.D - Zresult2.D}, Pg/Z, [Xbase, #0, MUL VL] /// public static unsafe (Vector, Vector, Vector) LoadVectorx3(Vector mask, long* address) { throw new PlatformNotSupportedException(); } /// /// svint8x3_t svld3[_s8](svbool_t pg, const int8_t *base) - /// LD3B {Zresult0.B - Zresult2.B}, Pg/Z, [Xarray, Xindex] /// LD3B {Zresult0.B - Zresult2.B}, Pg/Z, [Xbase, #0, MUL VL] /// public static unsafe (Vector, Vector, Vector) LoadVectorx3(Vector mask, sbyte* address) { throw new PlatformNotSupportedException(); } /// /// svfloat32x3_t svld3[_f32](svbool_t pg, const float32_t *base) - /// LD3W {Zresult0.S - Zresult2.S}, Pg/Z, [Xarray, Xindex, LSL #2] /// LD3W {Zresult0.S - Zresult2.S}, Pg/Z, [Xbase, #0, MUL VL] /// public static unsafe (Vector, Vector, Vector) LoadVectorx3(Vector mask, float* address) { throw new PlatformNotSupportedException(); } /// /// svuint16x3_t svld3[_u16](svbool_t pg, const uint16_t *base) - /// LD3H {Zresult0.H - Zresult2.H}, Pg/Z, [Xarray, Xindex, LSL #1] /// LD3H {Zresult0.H - Zresult2.H}, Pg/Z, [Xbase, #0, MUL VL] /// public static unsafe (Vector, Vector, Vector) LoadVectorx3(Vector mask, ushort* address) { throw new PlatformNotSupportedException(); } /// /// svuint32x3_t svld3[_u32](svbool_t pg, const uint32_t *base) - /// LD3W {Zresult0.S - Zresult2.S}, Pg/Z, [Xarray, Xindex, LSL #2] /// LD3W {Zresult0.S - Zresult2.S}, Pg/Z, [Xbase, #0, MUL VL] /// public static unsafe (Vector, Vector, Vector) LoadVectorx3(Vector mask, uint* address) { throw new PlatformNotSupportedException(); } /// /// svuint64x3_t svld3[_u64](svbool_t pg, const uint64_t *base) - /// LD3D {Zresult0.D - Zresult2.D}, Pg/Z, [Xarray, Xindex, LSL #3] /// LD3D {Zresult0.D - Zresult2.D}, Pg/Z, [Xbase, #0, MUL VL] /// public static unsafe (Vector, Vector, Vector) LoadVectorx3(Vector mask, ulong* address) { throw new PlatformNotSupportedException(); } - - /// LoadVectorx4 : Load four-element tuples into four vectors - /// /// svuint8x4_t svld4[_u8](svbool_t pg, const uint8_t *base) - /// LD4B {Zresult0.B - Zresult3.B}, Pg/Z, [Xarray, Xindex] /// LD4B {Zresult0.B - Zresult3.B}, Pg/Z, [Xbase, #0, MUL VL] /// public static unsafe (Vector, Vector, Vector, Vector) LoadVectorx4(Vector mask, byte* address) { throw new PlatformNotSupportedException(); } /// /// svfloat64x4_t svld4[_f64](svbool_t pg, const float64_t *base) - /// LD4D {Zresult0.D - Zresult3.D}, Pg/Z, [Xarray, Xindex, LSL #3] /// LD4D {Zresult0.D - Zresult3.D}, Pg/Z, [Xbase, #0, MUL VL] /// public static unsafe (Vector, Vector, Vector, Vector) LoadVectorx4(Vector mask, double* address) { throw new PlatformNotSupportedException(); } /// /// svint16x4_t svld4[_s16](svbool_t pg, const int16_t *base) - /// LD4H {Zresult0.H - Zresult3.H}, Pg/Z, [Xarray, Xindex, LSL #1] /// LD4H {Zresult0.H - Zresult3.H}, Pg/Z, [Xbase, #0, MUL VL] /// public static unsafe (Vector, Vector, Vector, Vector) LoadVectorx4(Vector mask, short* address) { throw new PlatformNotSupportedException(); } /// /// svint32x4_t svld4[_s32](svbool_t pg, const int32_t *base) - /// LD4W {Zresult0.S - Zresult3.S}, Pg/Z, [Xarray, Xindex, LSL #2] /// LD4W {Zresult0.S - Zresult3.S}, Pg/Z, [Xbase, #0, MUL VL] /// public static unsafe (Vector, Vector, Vector, Vector) LoadVectorx4(Vector mask, int* address) { throw new PlatformNotSupportedException(); } /// /// svint64x4_t svld4[_s64](svbool_t pg, const int64_t *base) - /// LD4D {Zresult0.D - Zresult3.D}, Pg/Z, [Xarray, Xindex, LSL #3] /// LD4D {Zresult0.D - Zresult3.D}, Pg/Z, [Xbase, #0, MUL VL] /// public static unsafe (Vector, Vector, Vector, Vector) LoadVectorx4(Vector mask, long* address) { throw new PlatformNotSupportedException(); } /// /// svint8x4_t svld4[_s8](svbool_t pg, const int8_t *base) - /// LD4B {Zresult0.B - Zresult3.B}, Pg/Z, [Xarray, Xindex] /// LD4B {Zresult0.B - Zresult3.B}, Pg/Z, [Xbase, #0, MUL VL] /// public static unsafe (Vector, Vector, Vector, Vector) LoadVectorx4(Vector mask, sbyte* address) { throw new PlatformNotSupportedException(); } /// /// svfloat32x4_t svld4[_f32](svbool_t pg, const float32_t *base) - /// LD4W {Zresult0.S - Zresult3.S}, Pg/Z, [Xarray, Xindex, LSL #2] /// LD4W {Zresult0.S - Zresult3.S}, Pg/Z, [Xbase, #0, MUL VL] /// public static unsafe (Vector, Vector, Vector, Vector) LoadVectorx4(Vector mask, float* address) { throw new PlatformNotSupportedException(); } /// /// svuint16x4_t svld4[_u16](svbool_t pg, const uint16_t *base) - /// LD4H {Zresult0.H - Zresult3.H}, Pg/Z, [Xarray, Xindex, LSL #1] /// LD4H {Zresult0.H - Zresult3.H}, Pg/Z, [Xbase, #0, MUL VL] /// public static unsafe (Vector, Vector, Vector, Vector) LoadVectorx4(Vector mask, ushort* address) { throw new PlatformNotSupportedException(); } /// /// svuint32x4_t svld4[_u32](svbool_t pg, const uint32_t *base) - /// LD4W {Zresult0.S - Zresult3.S}, Pg/Z, [Xarray, Xindex, LSL #2] /// LD4W {Zresult0.S - Zresult3.S}, Pg/Z, [Xbase, #0, MUL VL] /// public static unsafe (Vector, Vector, Vector, Vector) LoadVectorx4(Vector mask, uint* address) { throw new PlatformNotSupportedException(); } /// /// svuint64x4_t svld4[_u64](svbool_t pg, const uint64_t *base) - /// LD4D {Zresult0.D - Zresult3.D}, Pg/Z, [Xarray, Xindex, LSL #3] /// LD4D {Zresult0.D - Zresult3.D}, Pg/Z, [Xbase, #0, MUL VL] /// public static unsafe (Vector, Vector, Vector, Vector) LoadVectorx4(Vector mask, ulong* address) { throw new PlatformNotSupportedException(); } 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 49b82d2bf09256..f8c00358e9b446 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 @@ -1480,221 +1480,182 @@ internal Arm64() { } /// public static unsafe Vector LoadVectorUInt32ZeroExtendToUInt64(Vector mask, uint* address) => LoadVectorUInt32ZeroExtendToUInt64(mask, address); - - /// LoadVectorx2 : Load two-element tuples into two vectors - /// /// svuint8x2_t svld2[_u8](svbool_t pg, const uint8_t *base) - /// LD2B {Zresult0.B, Zresult1.B}, Pg/Z, [Xarray, Xindex] /// LD2B {Zresult0.B, Zresult1.B}, Pg/Z, [Xbase, #0, MUL VL] /// public static unsafe (Vector, Vector) LoadVectorx2(Vector mask, byte* address) => LoadVectorx2(mask, address); /// /// svfloat64x2_t svld2[_f64](svbool_t pg, const float64_t *base) - /// LD2D {Zresult0.D, Zresult1.D}, Pg/Z, [Xarray, Xindex, LSL #3] /// LD2D {Zresult0.D, Zresult1.D}, Pg/Z, [Xbase, #0, MUL VL] /// public static unsafe (Vector, Vector) LoadVectorx2(Vector mask, double* address) => LoadVectorx2(mask, address); /// /// svint16x2_t svld2[_s16](svbool_t pg, const int16_t *base) - /// LD2H {Zresult0.H, Zresult1.H}, Pg/Z, [Xarray, Xindex, LSL #1] /// LD2H {Zresult0.H, Zresult1.H}, Pg/Z, [Xbase, #0, MUL VL] /// public static unsafe (Vector, Vector) LoadVectorx2(Vector mask, short* address) => LoadVectorx2(mask, address); /// /// svint32x2_t svld2[_s32](svbool_t pg, const int32_t *base) - /// LD2W {Zresult0.S, Zresult1.S}, Pg/Z, [Xarray, Xindex, LSL #2] /// LD2W {Zresult0.S, Zresult1.S}, Pg/Z, [Xbase, #0, MUL VL] /// public static unsafe (Vector, Vector) LoadVectorx2(Vector mask, int* address) => LoadVectorx2(mask, address); /// /// svint64x2_t svld2[_s64](svbool_t pg, const int64_t *base) - /// LD2D {Zresult0.D, Zresult1.D}, Pg/Z, [Xarray, Xindex, LSL #3] /// LD2D {Zresult0.D, Zresult1.D}, Pg/Z, [Xbase, #0, MUL VL] /// public static unsafe (Vector, Vector) LoadVectorx2(Vector mask, long* address) => LoadVectorx2(mask, address); /// /// svint8x2_t svld2[_s8](svbool_t pg, const int8_t *base) - /// LD2B {Zresult0.B, Zresult1.B}, Pg/Z, [Xarray, Xindex] /// LD2B {Zresult0.B, Zresult1.B}, Pg/Z, [Xbase, #0, MUL VL] /// public static unsafe (Vector, Vector) LoadVectorx2(Vector mask, sbyte* address) => LoadVectorx2(mask, address); /// /// svfloat32x2_t svld2[_f32](svbool_t pg, const float32_t *base) - /// LD2W {Zresult0.S, Zresult1.S}, Pg/Z, [Xarray, Xindex, LSL #2] /// LD2W {Zresult0.S, Zresult1.S}, Pg/Z, [Xbase, #0, MUL VL] /// public static unsafe (Vector, Vector) LoadVectorx2(Vector mask, float* address) => LoadVectorx2(mask, address); /// /// svuint16x2_t svld2[_u16](svbool_t pg, const uint16_t *base) - /// LD2H {Zresult0.H, Zresult1.H}, Pg/Z, [Xarray, Xindex, LSL #1] /// LD2H {Zresult0.H, Zresult1.H}, Pg/Z, [Xbase, #0, MUL VL] /// public static unsafe (Vector, Vector) LoadVectorx2(Vector mask, ushort* address) => LoadVectorx2(mask, address); /// /// svuint32x2_t svld2[_u32](svbool_t pg, const uint32_t *base) - /// LD2W {Zresult0.S, Zresult1.S}, Pg/Z, [Xarray, Xindex, LSL #2] /// LD2W {Zresult0.S, Zresult1.S}, Pg/Z, [Xbase, #0, MUL VL] /// public static unsafe (Vector, Vector) LoadVectorx2(Vector mask, uint* address) => LoadVectorx2(mask, address); /// /// svuint64x2_t svld2[_u64](svbool_t pg, const uint64_t *base) - /// LD2D {Zresult0.D, Zresult1.D}, Pg/Z, [Xarray, Xindex, LSL #3] /// LD2D {Zresult0.D, Zresult1.D}, Pg/Z, [Xbase, #0, MUL VL] /// public static unsafe (Vector, Vector) LoadVectorx2(Vector mask, ulong* address) => LoadVectorx2(mask, address); - - /// LoadVectorx3 : Load three-element tuples into three vectors - /// /// svuint8x3_t svld3[_u8](svbool_t pg, const uint8_t *base) - /// LD3B {Zresult0.B - Zresult2.B}, Pg/Z, [Xarray, Xindex] /// LD3B {Zresult0.B - Zresult2.B}, Pg/Z, [Xbase, #0, MUL VL] /// public static unsafe (Vector, Vector, Vector) LoadVectorx3(Vector mask, byte* address) => LoadVectorx3(mask, address); /// /// svfloat64x3_t svld3[_f64](svbool_t pg, const float64_t *base) - /// LD3D {Zresult0.D - Zresult2.D}, Pg/Z, [Xarray, Xindex, LSL #3] /// LD3D {Zresult0.D - Zresult2.D}, Pg/Z, [Xbase, #0, MUL VL] /// public static unsafe (Vector, Vector, Vector) LoadVectorx3(Vector mask, double* address) => LoadVectorx3(mask, address); /// /// svint16x3_t svld3[_s16](svbool_t pg, const int16_t *base) - /// LD3H {Zresult0.H - Zresult2.H}, Pg/Z, [Xarray, Xindex, LSL #1] /// LD3H {Zresult0.H - Zresult2.H}, Pg/Z, [Xbase, #0, MUL VL] /// public static unsafe (Vector, Vector, Vector) LoadVectorx3(Vector mask, short* address) => LoadVectorx3(mask, address); /// /// svint32x3_t svld3[_s32](svbool_t pg, const int32_t *base) - /// LD3W {Zresult0.S - Zresult2.S}, Pg/Z, [Xarray, Xindex, LSL #2] /// LD3W {Zresult0.S - Zresult2.S}, Pg/Z, [Xbase, #0, MUL VL] /// public static unsafe (Vector, Vector, Vector) LoadVectorx3(Vector mask, int* address) => LoadVectorx3(mask, address); /// /// svint64x3_t svld3[_s64](svbool_t pg, const int64_t *base) - /// LD3D {Zresult0.D - Zresult2.D}, Pg/Z, [Xarray, Xindex, LSL #3] /// LD3D {Zresult0.D - Zresult2.D}, Pg/Z, [Xbase, #0, MUL VL] /// public static unsafe (Vector, Vector, Vector) LoadVectorx3(Vector mask, long* address) => LoadVectorx3(mask, address); /// /// svint8x3_t svld3[_s8](svbool_t pg, const int8_t *base) - /// LD3B {Zresult0.B - Zresult2.B}, Pg/Z, [Xarray, Xindex] /// LD3B {Zresult0.B - Zresult2.B}, Pg/Z, [Xbase, #0, MUL VL] /// public static unsafe (Vector, Vector, Vector) LoadVectorx3(Vector mask, sbyte* address) => LoadVectorx3(mask, address); /// /// svfloat32x3_t svld3[_f32](svbool_t pg, const float32_t *base) - /// LD3W {Zresult0.S - Zresult2.S}, Pg/Z, [Xarray, Xindex, LSL #2] /// LD3W {Zresult0.S - Zresult2.S}, Pg/Z, [Xbase, #0, MUL VL] /// public static unsafe (Vector, Vector, Vector) LoadVectorx3(Vector mask, float* address) => LoadVectorx3(mask, address); /// /// svuint16x3_t svld3[_u16](svbool_t pg, const uint16_t *base) - /// LD3H {Zresult0.H - Zresult2.H}, Pg/Z, [Xarray, Xindex, LSL #1] /// LD3H {Zresult0.H - Zresult2.H}, Pg/Z, [Xbase, #0, MUL VL] /// public static unsafe (Vector, Vector, Vector) LoadVectorx3(Vector mask, ushort* address) => LoadVectorx3(mask, address); /// /// svuint32x3_t svld3[_u32](svbool_t pg, const uint32_t *base) - /// LD3W {Zresult0.S - Zresult2.S}, Pg/Z, [Xarray, Xindex, LSL #2] /// LD3W {Zresult0.S - Zresult2.S}, Pg/Z, [Xbase, #0, MUL VL] /// public static unsafe (Vector, Vector, Vector) LoadVectorx3(Vector mask, uint* address) => LoadVectorx3(mask, address); /// /// svuint64x3_t svld3[_u64](svbool_t pg, const uint64_t *base) - /// LD3D {Zresult0.D - Zresult2.D}, Pg/Z, [Xarray, Xindex, LSL #3] /// LD3D {Zresult0.D - Zresult2.D}, Pg/Z, [Xbase, #0, MUL VL] /// public static unsafe (Vector, Vector, Vector) LoadVectorx3(Vector mask, ulong* address) => LoadVectorx3(mask, address); - - /// LoadVectorx4 : Load four-element tuples into four vectors - /// /// svuint8x4_t svld4[_u8](svbool_t pg, const uint8_t *base) - /// LD4B {Zresult0.B - Zresult3.B}, Pg/Z, [Xarray, Xindex] /// LD4B {Zresult0.B - Zresult3.B}, Pg/Z, [Xbase, #0, MUL VL] /// public static unsafe (Vector, Vector, Vector, Vector) LoadVectorx4(Vector mask, byte* address) => LoadVectorx4(mask, address); /// /// svfloat64x4_t svld4[_f64](svbool_t pg, const float64_t *base) - /// LD4D {Zresult0.D - Zresult3.D}, Pg/Z, [Xarray, Xindex, LSL #3] /// LD4D {Zresult0.D - Zresult3.D}, Pg/Z, [Xbase, #0, MUL VL] /// public static unsafe (Vector, Vector, Vector, Vector) LoadVectorx4(Vector mask, double* address) => LoadVectorx4(mask, address); /// /// svint16x4_t svld4[_s16](svbool_t pg, const int16_t *base) - /// LD4H {Zresult0.H - Zresult3.H}, Pg/Z, [Xarray, Xindex, LSL #1] /// LD4H {Zresult0.H - Zresult3.H}, Pg/Z, [Xbase, #0, MUL VL] /// public static unsafe (Vector, Vector, Vector, Vector) LoadVectorx4(Vector mask, short* address) => LoadVectorx4(mask, address); /// /// svint32x4_t svld4[_s32](svbool_t pg, const int32_t *base) - /// LD4W {Zresult0.S - Zresult3.S}, Pg/Z, [Xarray, Xindex, LSL #2] /// LD4W {Zresult0.S - Zresult3.S}, Pg/Z, [Xbase, #0, MUL VL] /// public static unsafe (Vector, Vector, Vector, Vector) LoadVectorx4(Vector mask, int* address) => LoadVectorx4(mask, address); /// /// svint64x4_t svld4[_s64](svbool_t pg, const int64_t *base) - /// LD4D {Zresult0.D - Zresult3.D}, Pg/Z, [Xarray, Xindex, LSL #3] /// LD4D {Zresult0.D - Zresult3.D}, Pg/Z, [Xbase, #0, MUL VL] /// public static unsafe (Vector, Vector, Vector, Vector) LoadVectorx4(Vector mask, long* address) => LoadVectorx4(mask, address); /// /// svint8x4_t svld4[_s8](svbool_t pg, const int8_t *base) - /// LD4B {Zresult0.B - Zresult3.B}, Pg/Z, [Xarray, Xindex] /// LD4B {Zresult0.B - Zresult3.B}, Pg/Z, [Xbase, #0, MUL VL] /// public static unsafe (Vector, Vector, Vector, Vector) LoadVectorx4(Vector mask, sbyte* address) => LoadVectorx4(mask, address); /// /// svfloat32x4_t svld4[_f32](svbool_t pg, const float32_t *base) - /// LD4W {Zresult0.S - Zresult3.S}, Pg/Z, [Xarray, Xindex, LSL #2] /// LD4W {Zresult0.S - Zresult3.S}, Pg/Z, [Xbase, #0, MUL VL] /// public static unsafe (Vector, Vector, Vector, Vector) LoadVectorx4(Vector mask, float* address) => LoadVectorx4(mask, address); /// /// svuint16x4_t svld4[_u16](svbool_t pg, const uint16_t *base) - /// LD4H {Zresult0.H - Zresult3.H}, Pg/Z, [Xarray, Xindex, LSL #1] /// LD4H {Zresult0.H - Zresult3.H}, Pg/Z, [Xbase, #0, MUL VL] /// public static unsafe (Vector, Vector, Vector, Vector) LoadVectorx4(Vector mask, ushort* address) => LoadVectorx4(mask, address); /// /// svuint32x4_t svld4[_u32](svbool_t pg, const uint32_t *base) - /// LD4W {Zresult0.S - Zresult3.S}, Pg/Z, [Xarray, Xindex, LSL #2] /// LD4W {Zresult0.S - Zresult3.S}, Pg/Z, [Xbase, #0, MUL VL] /// public static unsafe (Vector, Vector, Vector, Vector) LoadVectorx4(Vector mask, uint* address) => LoadVectorx4(mask, address); /// /// svuint64x4_t svld4[_u64](svbool_t pg, const uint64_t *base) - /// LD4D {Zresult0.D - Zresult3.D}, Pg/Z, [Xarray, Xindex, LSL #3] /// LD4D {Zresult0.D - Zresult3.D}, Pg/Z, [Xbase, #0, MUL VL] /// public static unsafe (Vector, Vector, Vector, Vector) LoadVectorx4(Vector mask, ulong* address) => LoadVectorx4(mask, address); diff --git a/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs b/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs index efe8967e086a9a..969399b1db1ebd 100644 --- a/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs +++ b/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs @@ -3107,36 +3107,36 @@ ("SveLoadMaskedUnOpTest.template", new Dictionary { ["TestName"] = "SveLoadVectorUInt32ZeroExtendToInt64", ["Isa"] = "Sve", ["Method"] = "LoadVectorUInt32ZeroExtendToInt64", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2BaseType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["ValidateIterResult"] = "firstOp[i] != result[i]"}), ("SveLoadMaskedUnOpTest.template", new Dictionary { ["TestName"] = "SveLoadVectorUInt32ZeroExtendToUInt64", ["Isa"] = "Sve", ["Method"] = "LoadVectorUInt32ZeroExtendToUInt64", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt64", ["Op2BaseType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["ValidateIterResult"] = "firstOp[i] != result[i]"}), - ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_float", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Single", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Single", ["Op2BaseType"] = "Single", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()", ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1]"}), - ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_double", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Double", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Double", ["Op2BaseType"] = "Double", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()", ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1]"}), - ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_sbyte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector", ["RetBaseType"] = "SByte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "SByte", ["Op2BaseType"] = "SByte", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1]"}), - ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_short", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2BaseType"] = "Int16", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1]"}), - ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_int", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2BaseType"] = "Int32", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1]"}), - ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_long", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2BaseType"] = "Int64", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1]"}), - ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_byte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Byte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Byte", ["Op2BaseType"] = "Byte", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetByte()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1]"}), - ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_ushort", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["Op2BaseType"] = "UInt16", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt16()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1]"}), - ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_uint", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["Op2BaseType"] = "UInt32", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1]"}), - ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_ulong", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt64", ["Op2BaseType"] = "UInt64", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1]"}), - ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_float", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Single", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Single", ["Op2BaseType"] = "Single", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()", ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2]"}), - ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_double", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Double", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Double", ["Op2BaseType"] = "Double", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()", ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2]"}), - ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_sbyte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector", ["RetBaseType"] = "SByte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "SByte", ["Op2BaseType"] = "SByte", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2]"}), - ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_short", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2BaseType"] = "Int16", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2]"}), - ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_int", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2BaseType"] = "Int32", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2]"}), - ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_long", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2BaseType"] = "Int64", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2]"}), - ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_byte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Byte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Byte", ["Op2BaseType"] = "Byte", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetByte()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2]"}), - ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_ushort", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["Op2BaseType"] = "UInt16", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt16()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2]"}), - ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_uint", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["Op2BaseType"] = "UInt32", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2]"}), - ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_ulong", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt64", ["Op2BaseType"] = "UInt64", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2]"}), - ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_float", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Single", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Single", ["Op2BaseType"] = "Single", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()", ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2] || result4[i] != input[3]"}), - ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_double", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Double", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Double", ["Op2BaseType"] = "Double", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()", ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2] || result4[i] != input[3]"}), - ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_sbyte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector", ["RetBaseType"] = "SByte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "SByte", ["Op2BaseType"] = "SByte", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2] || result4[i] != input[3]"}), - ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_short", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2BaseType"] = "Int16", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2] || result4[i] != input[3]"}), - ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_int", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2BaseType"] = "Int32", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2] || result4[i] != input[3]"}), - ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_long", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2BaseType"] = "Int64", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2] || result4[i] != input[3]"}), - ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_byte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Byte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Byte", ["Op2BaseType"] = "Byte", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetByte()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2] || result4[i] != input[3]"}), - ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_ushort", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["Op2BaseType"] = "UInt16", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt16()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2] || result4[i] != input[3]"}), - ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_uint", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["Op2BaseType"] = "UInt32", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2] || result4[i] != input[3]"}), - ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_ulong", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt64", ["Op2BaseType"] = "UInt64", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2] || result4[i] != input[3]"}), + ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_float", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Single", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Single", ["Op2BaseType"] = "Single", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()", ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1]"}), + ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_double", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Double", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Double", ["Op2BaseType"] = "Double", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()", ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1]"}), + ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_sbyte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector", ["RetBaseType"] = "SByte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "SByte", ["Op2BaseType"] = "SByte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1]"}), + ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_short", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2BaseType"] = "Int16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1]"}), + ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_int", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2BaseType"] = "Int32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1]"}), + ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_long", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2BaseType"] = "Int64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1]"}), + ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_byte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Byte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Byte", ["Op2BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetByte()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1]"}), + ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_ushort", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["Op2BaseType"] = "UInt16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt16()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1]"}), + ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_uint", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["Op2BaseType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1]"}), + ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_ulong", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt64", ["Op2BaseType"] = "UInt64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1]"}), + ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_float", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Single", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Single", ["Op2BaseType"] = "Single", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()", ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2]"}), + ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_double", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Double", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Double", ["Op2BaseType"] = "Double", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()", ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2]"}), + ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_sbyte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector", ["RetBaseType"] = "SByte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "SByte", ["Op2BaseType"] = "SByte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2]"}), + ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_short", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2BaseType"] = "Int16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2]"}), + ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_int", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2BaseType"] = "Int32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2]"}), + ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_long", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2BaseType"] = "Int64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2]"}), + ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_byte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Byte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Byte", ["Op2BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetByte()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2]"}), + ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_ushort", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["Op2BaseType"] = "UInt16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt16()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2]"}), + ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_uint", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["Op2BaseType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2]"}), + ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_ulong", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt64", ["Op2BaseType"] = "UInt64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2]"}), + ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_float", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Single", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Single", ["Op2BaseType"] = "Single", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()", ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2] || result4[i] != input[3]"}), + ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_double", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Double", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Double", ["Op2BaseType"] = "Double", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()", ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2] || result4[i] != input[3]"}), + ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_sbyte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector", ["RetBaseType"] = "SByte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "SByte", ["Op2BaseType"] = "SByte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2] || result4[i] != input[3]"}), + ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_short", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2BaseType"] = "Int16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2] || result4[i] != input[3]"}), + ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_int", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2BaseType"] = "Int32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2] || result4[i] != input[3]"}), + ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_long", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2BaseType"] = "Int64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2] || result4[i] != input[3]"}), + ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_byte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Byte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Byte", ["Op2BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetByte()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2] || result4[i] != input[3]"}), + ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_ushort", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["Op2BaseType"] = "UInt16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt16()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2] || result4[i] != input[3]"}), + ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_uint", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["Op2BaseType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2] || result4[i] != input[3]"}), + ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_ulong", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt64", ["Op2BaseType"] = "UInt64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2] || result4[i] != input[3]"}), ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve_Max_float", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "Max", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Single", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Single", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Single", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()", ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()", ["ValidateIterResult"] = "Helpers.Max(left[i], right[i]) != result[i]", ["GetIterResult"] = "Helpers.Max(left[i], right[i])"}), ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve_Max_double", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "Max", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Double", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Double", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Double", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()", ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()", ["ValidateIterResult"] = "Helpers.Max(left[i], right[i]) != result[i]", ["GetIterResult"] = "Helpers.Max(left[i], right[i])"}), diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorx2Test.template b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorx2Test.template index 72440ddea2fdfd..45dc218bd0d476 100644 --- a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorx2Test.template +++ b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorx2Test.template @@ -73,7 +73,7 @@ namespace JIT.HardwareIntrinsics.Arm int sizeOfInArray = inArray.Length * Unsafe.SizeOf<{Op1BaseType}>(); int sizeOfOutArray1 = outArray1.Length * Unsafe.SizeOf<{Op1BaseType}>(); int sizeOfOutArray2 = outArray2.Length * Unsafe.SizeOf<{Op1BaseType}>(); - if ((alignment != 16 && alignment != 8) || (alignment * 2) < sizeOfInArray || (alignment * 2) < sizeOfOutArray1 || (alignment * 2) < sizeOfOutArray2) + if ((alignment != 64 && alignment != 8) || (alignment * 2) < sizeOfInArray || (alignment * 2) < sizeOfOutArray1 || (alignment * 2) < sizeOfOutArray2) { throw new ArgumentException("Invalid value of alignment"); } diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorx3Test.template b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorx3Test.template index ae95cf591b5c3a..4f9af8d85074d9 100644 --- a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorx3Test.template +++ b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorx3Test.template @@ -76,7 +76,7 @@ namespace JIT.HardwareIntrinsics.Arm int sizeOfOutArray1 = outArray1.Length * Unsafe.SizeOf<{Op1BaseType}>(); int sizeOfOutArray2 = outArray2.Length * Unsafe.SizeOf<{Op1BaseType}>(); int sizeOfOutArray3 = outArray3.Length * Unsafe.SizeOf<{Op1BaseType}>(); - if ((alignment != 16 && alignment != 8) || (alignment * 3) < sizeOfInArray || (alignment * 2) < sizeOfOutArray1 || (alignment * 2) < sizeOfOutArray2 || (alignment * 2) < sizeOfOutArray3) + if ((alignment != 64 && alignment != 8) || (alignment * 3) < sizeOfInArray || (alignment * 2) < sizeOfOutArray1 || (alignment * 2) < sizeOfOutArray2 || (alignment * 2) < sizeOfOutArray3) { throw new ArgumentException("Invalid value of alignment"); } diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorx4Test.template b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorx4Test.template index 80b5b9e1b6adb5..baa86094285f28 100644 --- a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorx4Test.template +++ b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorx4Test.template @@ -79,7 +79,7 @@ namespace JIT.HardwareIntrinsics.Arm int sizeOfOutArray2 = outArray2.Length * Unsafe.SizeOf<{Op1BaseType}>(); int sizeOfOutArray3 = outArray3.Length * Unsafe.SizeOf<{Op1BaseType}>(); int sizeOfOutArray4 = outArray4.Length * Unsafe.SizeOf<{Op1BaseType}>(); - if ((alignment != 16 && alignment != 8) || (alignment * 4) < sizeOfInArray || (alignment * 2) < sizeOfOutArray1 || (alignment * 2) < sizeOfOutArray2 || (alignment * 2) < sizeOfOutArray3 || (alignment * 2) < sizeOfOutArray4) + if ((alignment != 64 && alignment != 8) || (alignment * 4) < sizeOfInArray || (alignment * 2) < sizeOfOutArray1 || (alignment * 2) < sizeOfOutArray2 || (alignment * 2) < sizeOfOutArray3 || (alignment * 2) < sizeOfOutArray4) { throw new ArgumentException("Invalid value of alignment"); } From 99fe12ad6994bbc55c9373624ead5cf5331e0261 Mon Sep 17 00:00:00 2001 From: TIHan Date: Tue, 14 May 2024 17:33:07 -0700 Subject: [PATCH 10/22] Handling multi-reg --- src/coreclr/jit/gentree.cpp | 6 ++++++ src/coreclr/jit/hwintrinsic.h | 3 +++ src/coreclr/jit/hwintrinsicarm64.cpp | 3 +++ src/coreclr/jit/lsraarm64.cpp | 3 +++ 4 files changed, 15 insertions(+) diff --git a/src/coreclr/jit/gentree.cpp b/src/coreclr/jit/gentree.cpp index 21d8349ef81e77..ec0b0dc3147ef1 100644 --- a/src/coreclr/jit/gentree.cpp +++ b/src/coreclr/jit/gentree.cpp @@ -26540,6 +26540,9 @@ bool GenTreeHWIntrinsic::OperIsMemoryLoad(GenTree** pAddr) const case NI_Sve_LoadVectorUInt16ZeroExtendToUInt64: case NI_Sve_LoadVectorUInt32ZeroExtendToInt64: case NI_Sve_LoadVectorUInt32ZeroExtendToUInt64: + case NI_Sve_LoadVectorx2: + case NI_Sve_LoadVectorx3: + case NI_Sve_LoadVectorx4: addr = Op(2); break; #endif // TARGET_ARM64 @@ -27022,6 +27025,7 @@ ClassLayout* GenTreeHWIntrinsic::GetLayout(Compiler* compiler) const case NI_AdvSimd_LoadVector64x2: case NI_AdvSimd_LoadAndInsertScalarVector64x2: case NI_AdvSimd_LoadAndReplicateToVector64x2: + case NI_Sve_LoadVectorx2: return compiler->typGetBlkLayout(16); case NI_AdvSimd_Arm64_LoadPairVector128: @@ -27034,12 +27038,14 @@ ClassLayout* GenTreeHWIntrinsic::GetLayout(Compiler* compiler) const case NI_AdvSimd_Arm64_LoadAndReplicateToVector128x2: case NI_AdvSimd_Arm64_LoadAndInsertScalarVector128x2: case NI_AdvSimd_LoadAndInsertScalarVector64x4: + case NI_Sve_LoadVectorx4: return compiler->typGetBlkLayout(32); case NI_AdvSimd_LoadVector64x3AndUnzip: case NI_AdvSimd_LoadVector64x3: case NI_AdvSimd_LoadAndInsertScalarVector64x3: case NI_AdvSimd_LoadAndReplicateToVector64x3: + case NI_Sve_LoadVectorx3: return compiler->typGetBlkLayout(24); case NI_AdvSimd_Arm64_LoadVector128x3AndUnzip: diff --git a/src/coreclr/jit/hwintrinsic.h b/src/coreclr/jit/hwintrinsic.h index 1dec44d4e6df90..097a1a60623f22 100644 --- a/src/coreclr/jit/hwintrinsic.h +++ b/src/coreclr/jit/hwintrinsic.h @@ -826,6 +826,7 @@ struct HWIntrinsicInfo case NI_AdvSimd_Arm64_LoadAndInsertScalarVector128x2: case NI_AdvSimd_LoadAndReplicateToVector64x2: case NI_AdvSimd_Arm64_LoadAndReplicateToVector128x2: + case NI_Sve_LoadVectorx2: return 2; case NI_AdvSimd_LoadVector64x3AndUnzip: @@ -836,6 +837,7 @@ struct HWIntrinsicInfo case NI_AdvSimd_Arm64_LoadAndInsertScalarVector128x3: case NI_AdvSimd_LoadAndReplicateToVector64x3: case NI_AdvSimd_Arm64_LoadAndReplicateToVector128x3: + case NI_Sve_LoadVectorx3: return 3; case NI_AdvSimd_LoadVector64x4AndUnzip: @@ -846,6 +848,7 @@ struct HWIntrinsicInfo case NI_AdvSimd_Arm64_LoadAndInsertScalarVector128x4: case NI_AdvSimd_LoadAndReplicateToVector64x4: case NI_AdvSimd_Arm64_LoadAndReplicateToVector128x4: + case NI_Sve_LoadVectorx4: return 4; #endif diff --git a/src/coreclr/jit/hwintrinsicarm64.cpp b/src/coreclr/jit/hwintrinsicarm64.cpp index 84b7e6b31387d0..a9f4e94a3785a7 100644 --- a/src/coreclr/jit/hwintrinsicarm64.cpp +++ b/src/coreclr/jit/hwintrinsicarm64.cpp @@ -2043,6 +2043,9 @@ GenTree* Compiler::impSpecialIntrinsic(NamedIntrinsic intrinsic, case NI_AdvSimd_Arm64_LoadAndReplicateToVector128x2: case NI_AdvSimd_Arm64_LoadAndReplicateToVector128x3: case NI_AdvSimd_Arm64_LoadAndReplicateToVector128x4: + case NI_Sve_LoadVectorx2: + case NI_Sve_LoadVectorx3: + case NI_Sve_LoadVectorx4: info.compNeedsConsecutiveRegisters = true; FALLTHROUGH; case NI_AdvSimd_Arm64_LoadPairScalarVector64: diff --git a/src/coreclr/jit/lsraarm64.cpp b/src/coreclr/jit/lsraarm64.cpp index e548fc3feec669..3b228976d3df37 100644 --- a/src/coreclr/jit/lsraarm64.cpp +++ b/src/coreclr/jit/lsraarm64.cpp @@ -1751,6 +1751,9 @@ int LinearScan::BuildHWIntrinsic(GenTreeHWIntrinsic* intrinsicTree, int* pDstCou case NI_AdvSimd_Arm64_LoadAndReplicateToVector128x2: case NI_AdvSimd_Arm64_LoadAndReplicateToVector128x3: case NI_AdvSimd_Arm64_LoadAndReplicateToVector128x4: + case NI_Sve_LoadVectorx2: + case NI_Sve_LoadVectorx3: + case NI_Sve_LoadVectorx4: { assert(intrin.op1 != nullptr); BuildConsecutiveRegistersForDef(intrinsicTree, dstCount); From d01738b73c0037aab12a3ba2c095d3b8b006132a Mon Sep 17 00:00:00 2001 From: TIHan Date: Tue, 14 May 2024 18:13:14 -0700 Subject: [PATCH 11/22] Remove layout --- src/coreclr/jit/gentree.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/coreclr/jit/gentree.cpp b/src/coreclr/jit/gentree.cpp index ec0b0dc3147ef1..612cf76fe753fb 100644 --- a/src/coreclr/jit/gentree.cpp +++ b/src/coreclr/jit/gentree.cpp @@ -27025,7 +27025,6 @@ ClassLayout* GenTreeHWIntrinsic::GetLayout(Compiler* compiler) const case NI_AdvSimd_LoadVector64x2: case NI_AdvSimd_LoadAndInsertScalarVector64x2: case NI_AdvSimd_LoadAndReplicateToVector64x2: - case NI_Sve_LoadVectorx2: return compiler->typGetBlkLayout(16); case NI_AdvSimd_Arm64_LoadPairVector128: @@ -27038,14 +27037,12 @@ ClassLayout* GenTreeHWIntrinsic::GetLayout(Compiler* compiler) const case NI_AdvSimd_Arm64_LoadAndReplicateToVector128x2: case NI_AdvSimd_Arm64_LoadAndInsertScalarVector128x2: case NI_AdvSimd_LoadAndInsertScalarVector64x4: - case NI_Sve_LoadVectorx4: return compiler->typGetBlkLayout(32); case NI_AdvSimd_LoadVector64x3AndUnzip: case NI_AdvSimd_LoadVector64x3: case NI_AdvSimd_LoadAndInsertScalarVector64x3: case NI_AdvSimd_LoadAndReplicateToVector64x3: - case NI_Sve_LoadVectorx3: return compiler->typGetBlkLayout(24); case NI_AdvSimd_Arm64_LoadVector128x3AndUnzip: From 6cc2fa1809063e16f8bf9701b48a9172a0fa7e18 Mon Sep 17 00:00:00 2001 From: TIHan Date: Tue, 14 May 2024 18:26:58 -0700 Subject: [PATCH 12/22] This might fix it --- src/coreclr/jit/hwintrinsiclistarm64sve.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/coreclr/jit/hwintrinsiclistarm64sve.h b/src/coreclr/jit/hwintrinsiclistarm64sve.h index 94205733033e18..7360f9e921c723 100644 --- a/src/coreclr/jit/hwintrinsiclistarm64sve.h +++ b/src/coreclr/jit/hwintrinsiclistarm64sve.h @@ -89,9 +89,9 @@ HARDWARE_INTRINSIC(Sve, LoadVectorUInt16ZeroExtendToUInt32, HARDWARE_INTRINSIC(Sve, LoadVectorUInt16ZeroExtendToUInt64, -1, 2, false, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_ld1h, INS_invalid, INS_invalid}, HW_Category_MemoryLoad, HW_Flag_Scalable|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation) HARDWARE_INTRINSIC(Sve, LoadVectorUInt32ZeroExtendToInt64, -1, 2, false, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_ld1w, INS_invalid, INS_invalid, INS_invalid}, HW_Category_MemoryLoad, HW_Flag_Scalable|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation) HARDWARE_INTRINSIC(Sve, LoadVectorUInt32ZeroExtendToUInt64, -1, 2, false, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_ld1w, INS_invalid, INS_invalid}, HW_Category_MemoryLoad, HW_Flag_Scalable|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation) -HARDWARE_INTRINSIC(Sve, LoadVectorx2, -1, 2, true, {INS_sve_ld2b, INS_sve_ld2b, INS_sve_ld2h, INS_sve_ld2h, INS_sve_ld2w, INS_sve_ld2w, INS_sve_ld2d, INS_sve_ld2d, INS_sve_ld2w, INS_sve_ld2d}, HW_Category_MemoryLoad, HW_Flag_Scalable|HW_Flag_MultiReg|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation) -HARDWARE_INTRINSIC(Sve, LoadVectorx3, -1, 2, true, {INS_sve_ld3b, INS_sve_ld3b, INS_sve_ld3h, INS_sve_ld3h, INS_sve_ld3w, INS_sve_ld3w, INS_sve_ld3d, INS_sve_ld3d, INS_sve_ld3w, INS_sve_ld3d}, HW_Category_MemoryLoad, HW_Flag_Scalable|HW_Flag_MultiReg|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation) -HARDWARE_INTRINSIC(Sve, LoadVectorx4, -1, 2, true, {INS_sve_ld4b, INS_sve_ld4b, INS_sve_ld4h, INS_sve_ld4h, INS_sve_ld4w, INS_sve_ld4w, INS_sve_ld4d, INS_sve_ld4d, INS_sve_ld4w, INS_sve_ld4d}, HW_Category_MemoryLoad, HW_Flag_Scalable|HW_Flag_MultiReg|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation) +HARDWARE_INTRINSIC(Sve, LoadVectorx2, -1, 2, true, {INS_sve_ld2b, INS_sve_ld2b, INS_sve_ld2h, INS_sve_ld2h, INS_sve_ld2w, INS_sve_ld2w, INS_sve_ld2d, INS_sve_ld2d, INS_sve_ld2w, INS_sve_ld2d}, HW_Category_MemoryLoad, HW_Flag_Scalable|HW_Flag_BaseTypeFromFirstArg|HW_Flag_MultiReg|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation) +HARDWARE_INTRINSIC(Sve, LoadVectorx3, -1, 2, true, {INS_sve_ld3b, INS_sve_ld3b, INS_sve_ld3h, INS_sve_ld3h, INS_sve_ld3w, INS_sve_ld3w, INS_sve_ld3d, INS_sve_ld3d, INS_sve_ld3w, INS_sve_ld3d}, HW_Category_MemoryLoad, HW_Flag_Scalable|HW_Flag_BaseTypeFromFirstArg|HW_Flag_MultiReg|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation) +HARDWARE_INTRINSIC(Sve, LoadVectorx4, -1, 2, true, {INS_sve_ld4b, INS_sve_ld4b, INS_sve_ld4h, INS_sve_ld4h, INS_sve_ld4w, INS_sve_ld4w, INS_sve_ld4d, INS_sve_ld4d, INS_sve_ld4w, INS_sve_ld4d}, HW_Category_MemoryLoad, HW_Flag_Scalable|HW_Flag_BaseTypeFromFirstArg|HW_Flag_MultiReg|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation) HARDWARE_INTRINSIC(Sve, Max, -1, -1, false, {INS_sve_smax, INS_sve_umax, INS_sve_smax, INS_sve_umax, INS_sve_smax, INS_sve_umax, INS_sve_smax, INS_sve_umax, INS_sve_fmax, INS_sve_fmax}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_HasRMWSemantics) HARDWARE_INTRINSIC(Sve, MaxAcross, -1, -1, false, {INS_sve_smaxv, INS_sve_umaxv, INS_sve_smaxv, INS_sve_umaxv, INS_sve_smaxv, INS_sve_umaxv, INS_sve_smaxv, INS_sve_umaxv, INS_sve_fmaxv, INS_sve_fmaxv}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation) HARDWARE_INTRINSIC(Sve, MaxNumber, -1, -1, false, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_fmaxnm, INS_sve_fmaxnm}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_HasRMWSemantics) From 692660e1da939e79bcefa395a25a356e2941b1b4 Mon Sep 17 00:00:00 2001 From: TIHan Date: Wed, 15 May 2024 19:38:14 -0700 Subject: [PATCH 13/22] LoadVectorx2/3/4 is working --- src/coreclr/jit/emitarm64sve.cpp | 12 ++++ src/coreclr/jit/gentree.cpp | 7 +++ src/coreclr/jit/hwintrinsic.cpp | 10 +++- src/coreclr/jit/hwintrinsicarm64.cpp | 32 +++++++++- src/coreclr/jit/hwintrinsiclistarm64sve.h | 6 +- src/coreclr/jit/lsraarm64.cpp | 21 ++++++- .../GenerateHWIntrinsicTests_Arm.cs | 60 +++++++++---------- .../Arm/Shared/SveLoadVectorx2Test.template | 2 +- .../Arm/Shared/SveLoadVectorx3Test.template | 2 +- .../Arm/Shared/SveLoadVectorx4Test.template | 2 +- 10 files changed, 112 insertions(+), 42 deletions(-) diff --git a/src/coreclr/jit/emitarm64sve.cpp b/src/coreclr/jit/emitarm64sve.cpp index ef8770703e0088..c7358a7cb06233 100644 --- a/src/coreclr/jit/emitarm64sve.cpp +++ b/src/coreclr/jit/emitarm64sve.cpp @@ -4381,6 +4381,18 @@ void emitter::emitInsSve_R_R_R(instruction ins, case INS_sve_ld1w: case INS_sve_ld1sw: case INS_sve_ld1d: + case INS_sve_ld2b: + case INS_sve_ld2h: + case INS_sve_ld2w: + case INS_sve_ld2d: + case INS_sve_ld3b: + case INS_sve_ld3h: + case INS_sve_ld3w: + case INS_sve_ld3d: + case INS_sve_ld4b: + case INS_sve_ld4h: + case INS_sve_ld4w: + case INS_sve_ld4d: return emitIns_R_R_R_I(ins, size, reg1, reg2, reg3, 0, opt); default: diff --git a/src/coreclr/jit/gentree.cpp b/src/coreclr/jit/gentree.cpp index 612cf76fe753fb..5bdb985517b599 100644 --- a/src/coreclr/jit/gentree.cpp +++ b/src/coreclr/jit/gentree.cpp @@ -27057,6 +27057,13 @@ ClassLayout* GenTreeHWIntrinsic::GetLayout(Compiler* compiler) const case NI_AdvSimd_Arm64_LoadAndReplicateToVector128x4: return compiler->typGetBlkLayout(64); + case NI_Sve_LoadVectorx2: + return compiler->typGetBlkLayout(compiler->getVectorTByteLength() * 2); + case NI_Sve_LoadVectorx3: + return compiler->typGetBlkLayout(compiler->getVectorTByteLength() * 3); + case NI_Sve_LoadVectorx4: + return compiler->typGetBlkLayout(compiler->getVectorTByteLength() * 4); + #endif // TARGET_ARM64 default: diff --git a/src/coreclr/jit/hwintrinsic.cpp b/src/coreclr/jit/hwintrinsic.cpp index 3187c3e5c2e044..642724ac3fcacf 100644 --- a/src/coreclr/jit/hwintrinsic.cpp +++ b/src/coreclr/jit/hwintrinsic.cpp @@ -1635,7 +1635,15 @@ GenTree* Compiler::impHWIntrinsic(NamedIntrinsic intrinsic, if (!varTypeIsMask(op1)) { // Op1 input is a vector. HWInstrinsic requires a mask. - retNode->AsHWIntrinsic()->Op(1) = gtNewSimdConvertVectorToMaskNode(retType, op1, simdBaseJitType, simdSize); + retNode->AsHWIntrinsic()->Op(1) = + gtNewSimdConvertVectorToMaskNode(retType, op1, simdBaseJitType, simdSize); + } + + if (HWIntrinsicInfo::IsMultiReg(intrinsic)) + { + assert(HWIntrinsicInfo::IsExplicitMaskedOperation(retNode->AsHWIntrinsic()->GetHWIntrinsicId())); + assert(HWIntrinsicInfo::IsMultiReg(retNode->AsHWIntrinsic()->GetHWIntrinsicId())); + retNode = impStoreMultiRegValueToVar(retNode, sig->retTypeSigClass DEBUGARG(CorInfoCallConvExtension::Managed)); } } diff --git a/src/coreclr/jit/hwintrinsicarm64.cpp b/src/coreclr/jit/hwintrinsicarm64.cpp index a9f4e94a3785a7..8051473958c863 100644 --- a/src/coreclr/jit/hwintrinsicarm64.cpp +++ b/src/coreclr/jit/hwintrinsicarm64.cpp @@ -2043,9 +2043,6 @@ GenTree* Compiler::impSpecialIntrinsic(NamedIntrinsic intrinsic, case NI_AdvSimd_Arm64_LoadAndReplicateToVector128x2: case NI_AdvSimd_Arm64_LoadAndReplicateToVector128x3: case NI_AdvSimd_Arm64_LoadAndReplicateToVector128x4: - case NI_Sve_LoadVectorx2: - case NI_Sve_LoadVectorx3: - case NI_Sve_LoadVectorx4: info.compNeedsConsecutiveRegisters = true; FALLTHROUGH; case NI_AdvSimd_Arm64_LoadPairScalarVector64: @@ -2073,6 +2070,35 @@ GenTree* Compiler::impSpecialIntrinsic(NamedIntrinsic intrinsic, retNode = impStoreMultiRegValueToVar(op1, sig->retTypeSigClass DEBUGARG(CorInfoCallConvExtension::Managed)); break; } + + case NI_Sve_LoadVectorx2: + case NI_Sve_LoadVectorx3: + case NI_Sve_LoadVectorx4: + { + info.compNeedsConsecutiveRegisters = true; + + assert(sig->numArgs == 2); + + op2 = impPopStack().val; + op1 = impPopStack().val; + + if (op1->OperIs(GT_CAST)) + { + // Although the API specifies a pointer, if what we have is a BYREF, that's what + // we really want, so throw away the cast. + if (op1->gtGetOp1()->TypeGet() == TYP_BYREF) + { + op1 = op1->gtGetOp1(); + } + } + + assert(HWIntrinsicInfo::IsMultiReg(intrinsic)); + assert(HWIntrinsicInfo::IsExplicitMaskedOperation(intrinsic)); + + retNode = gtNewSimdHWIntrinsicNode(retType, op1, op2, intrinsic, simdBaseJitType, simdSize); + break; + } + case NI_AdvSimd_LoadAndInsertScalarVector64x2: case NI_AdvSimd_LoadAndInsertScalarVector64x3: case NI_AdvSimd_LoadAndInsertScalarVector64x4: diff --git a/src/coreclr/jit/hwintrinsiclistarm64sve.h b/src/coreclr/jit/hwintrinsiclistarm64sve.h index 7360f9e921c723..e2e3cb5847c78b 100644 --- a/src/coreclr/jit/hwintrinsiclistarm64sve.h +++ b/src/coreclr/jit/hwintrinsiclistarm64sve.h @@ -89,9 +89,9 @@ HARDWARE_INTRINSIC(Sve, LoadVectorUInt16ZeroExtendToUInt32, HARDWARE_INTRINSIC(Sve, LoadVectorUInt16ZeroExtendToUInt64, -1, 2, false, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_ld1h, INS_invalid, INS_invalid}, HW_Category_MemoryLoad, HW_Flag_Scalable|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation) HARDWARE_INTRINSIC(Sve, LoadVectorUInt32ZeroExtendToInt64, -1, 2, false, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_ld1w, INS_invalid, INS_invalid, INS_invalid}, HW_Category_MemoryLoad, HW_Flag_Scalable|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation) HARDWARE_INTRINSIC(Sve, LoadVectorUInt32ZeroExtendToUInt64, -1, 2, false, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_ld1w, INS_invalid, INS_invalid}, HW_Category_MemoryLoad, HW_Flag_Scalable|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation) -HARDWARE_INTRINSIC(Sve, LoadVectorx2, -1, 2, true, {INS_sve_ld2b, INS_sve_ld2b, INS_sve_ld2h, INS_sve_ld2h, INS_sve_ld2w, INS_sve_ld2w, INS_sve_ld2d, INS_sve_ld2d, INS_sve_ld2w, INS_sve_ld2d}, HW_Category_MemoryLoad, HW_Flag_Scalable|HW_Flag_BaseTypeFromFirstArg|HW_Flag_MultiReg|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation) -HARDWARE_INTRINSIC(Sve, LoadVectorx3, -1, 2, true, {INS_sve_ld3b, INS_sve_ld3b, INS_sve_ld3h, INS_sve_ld3h, INS_sve_ld3w, INS_sve_ld3w, INS_sve_ld3d, INS_sve_ld3d, INS_sve_ld3w, INS_sve_ld3d}, HW_Category_MemoryLoad, HW_Flag_Scalable|HW_Flag_BaseTypeFromFirstArg|HW_Flag_MultiReg|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation) -HARDWARE_INTRINSIC(Sve, LoadVectorx4, -1, 2, true, {INS_sve_ld4b, INS_sve_ld4b, INS_sve_ld4h, INS_sve_ld4h, INS_sve_ld4w, INS_sve_ld4w, INS_sve_ld4d, INS_sve_ld4d, INS_sve_ld4w, INS_sve_ld4d}, HW_Category_MemoryLoad, HW_Flag_Scalable|HW_Flag_BaseTypeFromFirstArg|HW_Flag_MultiReg|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation) +HARDWARE_INTRINSIC(Sve, LoadVectorx2, -1, 2, true, {INS_sve_ld2b, INS_sve_ld2b, INS_sve_ld2h, INS_sve_ld2h, INS_sve_ld2w, INS_sve_ld2w, INS_sve_ld2d, INS_sve_ld2d, INS_sve_ld2w, INS_sve_ld2d}, HW_Category_MemoryLoad, HW_Flag_Scalable|HW_Flag_SpecialImport|HW_Flag_BaseTypeFromFirstArg|HW_Flag_MultiReg|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation|HW_Flag_NeedsConsecutiveRegisters) +HARDWARE_INTRINSIC(Sve, LoadVectorx3, -1, 2, true, {INS_sve_ld3b, INS_sve_ld3b, INS_sve_ld3h, INS_sve_ld3h, INS_sve_ld3w, INS_sve_ld3w, INS_sve_ld3d, INS_sve_ld3d, INS_sve_ld3w, INS_sve_ld3d}, HW_Category_MemoryLoad, HW_Flag_Scalable|HW_Flag_SpecialImport|HW_Flag_BaseTypeFromFirstArg|HW_Flag_MultiReg|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation|HW_Flag_NeedsConsecutiveRegisters) +HARDWARE_INTRINSIC(Sve, LoadVectorx4, -1, 2, true, {INS_sve_ld4b, INS_sve_ld4b, INS_sve_ld4h, INS_sve_ld4h, INS_sve_ld4w, INS_sve_ld4w, INS_sve_ld4d, INS_sve_ld4d, INS_sve_ld4w, INS_sve_ld4d}, HW_Category_MemoryLoad, HW_Flag_Scalable|HW_Flag_SpecialImport|HW_Flag_BaseTypeFromFirstArg|HW_Flag_MultiReg|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation|HW_Flag_NeedsConsecutiveRegisters) HARDWARE_INTRINSIC(Sve, Max, -1, -1, false, {INS_sve_smax, INS_sve_umax, INS_sve_smax, INS_sve_umax, INS_sve_smax, INS_sve_umax, INS_sve_smax, INS_sve_umax, INS_sve_fmax, INS_sve_fmax}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_HasRMWSemantics) HARDWARE_INTRINSIC(Sve, MaxAcross, -1, -1, false, {INS_sve_smaxv, INS_sve_umaxv, INS_sve_smaxv, INS_sve_umaxv, INS_sve_smaxv, INS_sve_umaxv, INS_sve_smaxv, INS_sve_umaxv, INS_sve_fmaxv, INS_sve_fmaxv}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation) HARDWARE_INTRINSIC(Sve, MaxNumber, -1, -1, false, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_fmaxnm, INS_sve_fmaxnm}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_HasRMWSemantics) diff --git a/src/coreclr/jit/lsraarm64.cpp b/src/coreclr/jit/lsraarm64.cpp index 3b228976d3df37..2a7670870bd789 100644 --- a/src/coreclr/jit/lsraarm64.cpp +++ b/src/coreclr/jit/lsraarm64.cpp @@ -1751,11 +1751,20 @@ int LinearScan::BuildHWIntrinsic(GenTreeHWIntrinsic* intrinsicTree, int* pDstCou case NI_AdvSimd_Arm64_LoadAndReplicateToVector128x2: case NI_AdvSimd_Arm64_LoadAndReplicateToVector128x3: case NI_AdvSimd_Arm64_LoadAndReplicateToVector128x4: + { + assert(intrin.op1 != nullptr); + BuildConsecutiveRegistersForDef(intrinsicTree, dstCount); + *pDstCount = dstCount; + break; + } + case NI_Sve_LoadVectorx2: case NI_Sve_LoadVectorx3: case NI_Sve_LoadVectorx4: { assert(intrin.op1 != nullptr); + assert(intrin.op2 != nullptr); + srcCount += BuildOperandUses(intrin.op2); BuildConsecutiveRegistersForDef(intrinsicTree, dstCount); *pDstCount = dstCount; break; @@ -1927,14 +1936,22 @@ int LinearScan::BuildHWIntrinsic(GenTreeHWIntrinsic* intrinsicTree, int* pDstCou buildInternalRegisterUses(); - if ((dstCount == 1) || (dstCount == 2)) + if ((dstCount == 1) || (dstCount == 2) || (dstCount == 3) || (dstCount == 4)) { BuildDef(intrinsicTree, dstCandidates); - if (dstCount == 2) + if (dstCount >= 2) { BuildDef(intrinsicTree, dstCandidates, 1); } + if (dstCount >= 3) + { + BuildDef(intrinsicTree, dstCandidates, 2); + } + if (dstCount == 4) + { + BuildDef(intrinsicTree, dstCandidates, 3); + } } else { diff --git a/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs b/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs index 969399b1db1ebd..fee106ba8bf0f3 100644 --- a/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs +++ b/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs @@ -3107,36 +3107,36 @@ ("SveLoadMaskedUnOpTest.template", new Dictionary { ["TestName"] = "SveLoadVectorUInt32ZeroExtendToInt64", ["Isa"] = "Sve", ["Method"] = "LoadVectorUInt32ZeroExtendToInt64", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2BaseType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["ValidateIterResult"] = "firstOp[i] != result[i]"}), ("SveLoadMaskedUnOpTest.template", new Dictionary { ["TestName"] = "SveLoadVectorUInt32ZeroExtendToUInt64", ["Isa"] = "Sve", ["Method"] = "LoadVectorUInt32ZeroExtendToUInt64", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt64", ["Op2BaseType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["ValidateIterResult"] = "firstOp[i] != result[i]"}), - ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_float", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Single", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Single", ["Op2BaseType"] = "Single", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()", ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1]"}), - ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_double", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Double", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Double", ["Op2BaseType"] = "Double", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()", ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1]"}), - ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_sbyte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector", ["RetBaseType"] = "SByte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "SByte", ["Op2BaseType"] = "SByte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1]"}), - ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_short", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2BaseType"] = "Int16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1]"}), - ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_int", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2BaseType"] = "Int32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1]"}), - ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_long", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2BaseType"] = "Int64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1]"}), - ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_byte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Byte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Byte", ["Op2BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetByte()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1]"}), - ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_ushort", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["Op2BaseType"] = "UInt16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt16()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1]"}), - ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_uint", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["Op2BaseType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1]"}), - ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_ulong", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt64", ["Op2BaseType"] = "UInt64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1]"}), - ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_float", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Single", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Single", ["Op2BaseType"] = "Single", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()", ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2]"}), - ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_double", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Double", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Double", ["Op2BaseType"] = "Double", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()", ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2]"}), - ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_sbyte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector", ["RetBaseType"] = "SByte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "SByte", ["Op2BaseType"] = "SByte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2]"}), - ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_short", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2BaseType"] = "Int16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2]"}), - ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_int", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2BaseType"] = "Int32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2]"}), - ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_long", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2BaseType"] = "Int64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2]"}), - ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_byte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Byte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Byte", ["Op2BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetByte()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2]"}), - ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_ushort", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["Op2BaseType"] = "UInt16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt16()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2]"}), - ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_uint", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["Op2BaseType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2]"}), - ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_ulong", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt64", ["Op2BaseType"] = "UInt64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2]"}), - ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_float", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Single", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Single", ["Op2BaseType"] = "Single", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()", ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2] || result4[i] != input[3]"}), - ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_double", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Double", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Double", ["Op2BaseType"] = "Double", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()", ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2] || result4[i] != input[3]"}), - ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_sbyte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector", ["RetBaseType"] = "SByte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "SByte", ["Op2BaseType"] = "SByte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2] || result4[i] != input[3]"}), - ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_short", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2BaseType"] = "Int16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2] || result4[i] != input[3]"}), - ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_int", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2BaseType"] = "Int32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2] || result4[i] != input[3]"}), - ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_long", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2BaseType"] = "Int64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2] || result4[i] != input[3]"}), - ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_byte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Byte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Byte", ["Op2BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetByte()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2] || result4[i] != input[3]"}), - ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_ushort", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["Op2BaseType"] = "UInt16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt16()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2] || result4[i] != input[3]"}), - ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_uint", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["Op2BaseType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2] || result4[i] != input[3]"}), - ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_ulong", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt64", ["Op2BaseType"] = "UInt64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()", ["ValidateIterResult"] = "result1[i] != input[0] || result2[i] != input[1] || result3[i] != input[2] || result4[i] != input[3]"}), + ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_float", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Single", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Single", ["Op2BaseType"] = "Single", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()", ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()", ["ValidateIterResult"] = "result1[i] != input[i * 2] || result2[i] != input[i * 2 + 1]"}), + ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_double", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Double", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Double", ["Op2BaseType"] = "Double", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()", ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()", ["ValidateIterResult"] = "result1[i] != input[i * 2] || result2[i] != input[i * 2 + 1]"}), + ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_sbyte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector", ["RetBaseType"] = "SByte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "SByte", ["Op2BaseType"] = "SByte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["ValidateIterResult"] = "result1[i] != input[i * 2] || result2[i] != input[i * 2 + 1]"}), + ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_short", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2BaseType"] = "Int16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["ValidateIterResult"] = "result1[i] != input[i * 2] || result2[i] != input[i * 2 + 1]"}), + ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_int", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2BaseType"] = "Int32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["ValidateIterResult"] = "result1[i] != input[i * 2] || result2[i] != input[i * 2 + 1]"}), + ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_long", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2BaseType"] = "Int64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()", ["ValidateIterResult"] = "result1[i] != input[i * 2] || result2[i] != input[i * 2 + 1]"}), + ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_byte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Byte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Byte", ["Op2BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetByte()", ["ValidateIterResult"] = "result1[i] != input[i * 2] || result2[i] != input[i * 2 + 1]"}), + ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_ushort", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["Op2BaseType"] = "UInt16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt16()", ["ValidateIterResult"] = "result1[i] != input[i * 2] || result2[i] != input[i * 2 + 1]"}), + ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_uint", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["Op2BaseType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["ValidateIterResult"] = "result1[i] != input[i * 2] || result2[i] != input[i * 2 + 1]"}), + ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_ulong", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt64", ["Op2BaseType"] = "UInt64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()", ["ValidateIterResult"] = "result1[i] != input[i * 2] || result2[i] != input[i * 2 + 1]"}), + ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_float", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Single", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Single", ["Op2BaseType"] = "Single", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()", ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()", ["ValidateIterResult"] = "result1[i] != input[i * 3] || result2[i] != input[i * 3 + 1] || result3[i] != input[i * 3 + 2]"}), + ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_double", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Double", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Double", ["Op2BaseType"] = "Double", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()", ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()", ["ValidateIterResult"] = "result1[i] != input[i * 3] || result2[i] != input[i * 3 + 1] || result3[i] != input[i * 3 + 2]"}), + ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_sbyte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector", ["RetBaseType"] = "SByte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "SByte", ["Op2BaseType"] = "SByte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["ValidateIterResult"] = "result1[i] != input[i * 3] || result2[i] != input[i * 3 + 1] || result3[i] != input[i * 3 + 2]"}), + ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_short", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2BaseType"] = "Int16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["ValidateIterResult"] = "result1[i] != input[i * 3] || result2[i] != input[i * 3 + 1] || result3[i] != input[i * 3 + 2]"}), + ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_int", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2BaseType"] = "Int32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["ValidateIterResult"] = "result1[i] != input[i * 3] || result2[i] != input[i * 3 + 1] || result3[i] != input[i * 3 + 2]"}), + ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_long", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2BaseType"] = "Int64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()", ["ValidateIterResult"] = "result1[i] != input[i * 3] || result2[i] != input[i * 3 + 1] || result3[i] != input[i * 3 + 2]"}), + ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_byte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Byte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Byte", ["Op2BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetByte()", ["ValidateIterResult"] = "result1[i] != input[i * 3] || result2[i] != input[i * 3 + 1] || result3[i] != input[i * 3 + 2]"}), + ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_ushort", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["Op2BaseType"] = "UInt16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt16()", ["ValidateIterResult"] = "result1[i] != input[i * 3] || result2[i] != input[i * 3 + 1] || result3[i] != input[i * 3 + 2]"}), + ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_uint", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["Op2BaseType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["ValidateIterResult"] = "result1[i] != input[i * 3] || result2[i] != input[i * 3 + 1] || result3[i] != input[i * 3 + 2]"}), + ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_ulong", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt64", ["Op2BaseType"] = "UInt64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()", ["ValidateIterResult"] = "result1[i] != input[i * 3] || result2[i] != input[i * 3 + 1] || result3[i] != input[i * 3 + 2]"}), + ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_float", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Single", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Single", ["Op2BaseType"] = "Single", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()", ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()", ["ValidateIterResult"] = "result1[i] != input[i * 4] || result2[i] != input[i * 4 + 1] || result3[i] != input[i * 4 + 2] || result4[i] != input[i * 4 + 3]"}), + ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_double", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Double", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Double", ["Op2BaseType"] = "Double", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()", ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()", ["ValidateIterResult"] = "result1[i] != input[i * 4] || result2[i] != input[i * 4 + 1] || result3[i] != input[i * 4 + 2] || result4[i] != input[i * 4 + 3]"}), + ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_sbyte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector", ["RetBaseType"] = "SByte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "SByte", ["Op2BaseType"] = "SByte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["ValidateIterResult"] = "result1[i] != input[i * 4] || result2[i] != input[i * 4 + 1] || result3[i] != input[i * 4 + 2] || result4[i] != input[i * 4 + 3]"}), + ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_short", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2BaseType"] = "Int16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["ValidateIterResult"] = "result1[i] != input[i * 4] || result2[i] != input[i * 4 + 1] || result3[i] != input[i * 4 + 2] || result4[i] != input[i * 4 + 3]"}), + ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_int", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2BaseType"] = "Int32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["ValidateIterResult"] = "result1[i] != input[i * 4] || result2[i] != input[i * 4 + 1] || result3[i] != input[i * 4 + 2] || result4[i] != input[i * 4 + 3]"}), + ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_long", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2BaseType"] = "Int64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()", ["ValidateIterResult"] = "result1[i] != input[i * 4] || result2[i] != input[i * 4 + 1] || result3[i] != input[i * 4 + 2] || result4[i] != input[i * 4 + 3]"}), + ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_byte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Byte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Byte", ["Op2BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetByte()", ["ValidateIterResult"] = "result1[i] != input[i * 4] || result2[i] != input[i * 4 + 1] || result3[i] != input[i * 4 + 2] || result4[i] != input[i * 4 + 3]"}), + ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_ushort", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["Op2BaseType"] = "UInt16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt16()", ["ValidateIterResult"] = "result1[i] != input[i * 4] || result2[i] != input[i * 4 + 1] || result3[i] != input[i * 4 + 2] || result4[i] != input[i * 4 + 3]"}), + ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_uint", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["Op2BaseType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["ValidateIterResult"] = "result1[i] != input[i * 4] || result2[i] != input[i * 4 + 1] || result3[i] != input[i * 4 + 2] || result4[i] != input[i * 4 + 3]"}), + ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_ulong", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt64", ["Op2BaseType"] = "UInt64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()", ["ValidateIterResult"] = "result1[i] != input[i * 4] || result2[i] != input[i * 4 + 1] || result3[i] != input[i * 4 + 2] || result4[i] != input[i * 4 + 3]"}), ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve_Max_float", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "Max", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Single", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Single", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Single", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()", ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()", ["ValidateIterResult"] = "Helpers.Max(left[i], right[i]) != result[i]", ["GetIterResult"] = "Helpers.Max(left[i], right[i])"}), ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve_Max_double", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "Max", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Double", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Double", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Double", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()", ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()", ["ValidateIterResult"] = "Helpers.Max(left[i], right[i]) != result[i]", ["GetIterResult"] = "Helpers.Max(left[i], right[i])"}), diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorx2Test.template b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorx2Test.template index 45dc218bd0d476..154bd47f8b952c 100644 --- a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorx2Test.template +++ b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorx2Test.template @@ -174,7 +174,7 @@ namespace JIT.HardwareIntrinsics.Arm //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable {Op1VectorType}<{Op1BaseType}> loadMask = Sve.CreateTrueMask{RetBaseType}(SveMaskPattern.All); - var result = typeof({Isa}).GetMethod(nameof({Isa}.{Method}), new Type[] { typeof({Op1BaseType}*) }) + var result = typeof({Isa}).GetMethod(nameof({Isa}.{Method}), new Type[] { typeof(Vector<{Op1BaseType}>), typeof({Op1BaseType}*) }) .Invoke(null, new object[] { loadMask, Pointer.Box(_dataTable.inArrayPtr, typeof({Op1BaseType}*)) diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorx3Test.template b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorx3Test.template index 4f9af8d85074d9..4668c2cc4a2362 100644 --- a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorx3Test.template +++ b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorx3Test.template @@ -184,7 +184,7 @@ namespace JIT.HardwareIntrinsics.Arm //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable {Op1VectorType}<{Op1BaseType}> loadMask = Sve.CreateTrueMask{RetBaseType}(SveMaskPattern.All); - var result = typeof({Isa}).GetMethod(nameof({Isa}.{Method}), new Type[] { typeof({Op1BaseType}*) }) + var result = typeof({Isa}).GetMethod(nameof({Isa}.{Method}), new Type[] { typeof(Vector<{Op1BaseType}>), typeof({Op1BaseType}*) }) .Invoke(null, new object[] { loadMask, Pointer.Box(_dataTable.inArrayPtr, typeof({Op1BaseType}*)) diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorx4Test.template b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorx4Test.template index baa86094285f28..8320ee8fb48990 100644 --- a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorx4Test.template +++ b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorx4Test.template @@ -194,7 +194,7 @@ namespace JIT.HardwareIntrinsics.Arm //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable {Op1VectorType}<{Op1BaseType}> loadMask = Sve.CreateTrueMask{RetBaseType}(SveMaskPattern.All); - var result = typeof({Isa}).GetMethod(nameof({Isa}.{Method}), new Type[] { typeof({Op1BaseType}*) }) + var result = typeof({Isa}).GetMethod(nameof({Isa}.{Method}), new Type[] { typeof(Vector<{Op1BaseType}>), typeof({Op1BaseType}*) }) .Invoke(null, new object[] { loadMask, Pointer.Box(_dataTable.inArrayPtr, typeof({Op1BaseType}*)) From 8fd8319301d4ca76e34a0129d2129e2ed6989163 Mon Sep 17 00:00:00 2001 From: TIHan Date: Thu, 16 May 2024 08:52:49 -0700 Subject: [PATCH 14/22] Revert dstCount changes --- src/coreclr/jit/lsraarm64.cpp | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/src/coreclr/jit/lsraarm64.cpp b/src/coreclr/jit/lsraarm64.cpp index 2a7670870bd789..2868a441ea0890 100644 --- a/src/coreclr/jit/lsraarm64.cpp +++ b/src/coreclr/jit/lsraarm64.cpp @@ -1936,22 +1936,14 @@ int LinearScan::BuildHWIntrinsic(GenTreeHWIntrinsic* intrinsicTree, int* pDstCou buildInternalRegisterUses(); - if ((dstCount == 1) || (dstCount == 2) || (dstCount == 3) || (dstCount == 4)) + if ((dstCount == 1) || (dstCount == 2)) { BuildDef(intrinsicTree, dstCandidates); - if (dstCount >= 2) + if (dstCount == 2) { BuildDef(intrinsicTree, dstCandidates, 1); } - if (dstCount >= 3) - { - BuildDef(intrinsicTree, dstCandidates, 2); - } - if (dstCount == 4) - { - BuildDef(intrinsicTree, dstCandidates, 3); - } } else { From 0f969a904d59528c7605320cc45861aca7586b8d Mon Sep 17 00:00:00 2001 From: TIHan Date: Thu, 16 May 2024 10:30:45 -0700 Subject: [PATCH 15/22] Formatting --- src/coreclr/jit/hwintrinsic.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/coreclr/jit/hwintrinsic.cpp b/src/coreclr/jit/hwintrinsic.cpp index 642724ac3fcacf..94d480a31dc184 100644 --- a/src/coreclr/jit/hwintrinsic.cpp +++ b/src/coreclr/jit/hwintrinsic.cpp @@ -1635,15 +1635,15 @@ GenTree* Compiler::impHWIntrinsic(NamedIntrinsic intrinsic, if (!varTypeIsMask(op1)) { // Op1 input is a vector. HWInstrinsic requires a mask. - retNode->AsHWIntrinsic()->Op(1) = - gtNewSimdConvertVectorToMaskNode(retType, op1, simdBaseJitType, simdSize); + retNode->AsHWIntrinsic()->Op(1) = gtNewSimdConvertVectorToMaskNode(retType, op1, simdBaseJitType, simdSize); } if (HWIntrinsicInfo::IsMultiReg(intrinsic)) { assert(HWIntrinsicInfo::IsExplicitMaskedOperation(retNode->AsHWIntrinsic()->GetHWIntrinsicId())); assert(HWIntrinsicInfo::IsMultiReg(retNode->AsHWIntrinsic()->GetHWIntrinsicId())); - retNode = impStoreMultiRegValueToVar(retNode, sig->retTypeSigClass DEBUGARG(CorInfoCallConvExtension::Managed)); + retNode = + impStoreMultiRegValueToVar(retNode, sig->retTypeSigClass DEBUGARG(CorInfoCallConvExtension::Managed)); } } From 3f80fc65a717a94bbc5ed35e5d5c68f57d9d70b2 Mon Sep 17 00:00:00 2001 From: TIHan Date: Fri, 17 May 2024 15:18:48 -0700 Subject: [PATCH 16/22] Feedback and re-naming APIs --- src/coreclr/jit/gentree.cpp | 12 ++-- src/coreclr/jit/hwintrinsic.h | 6 +- src/coreclr/jit/hwintrinsicarm64.cpp | 6 +- src/coreclr/jit/hwintrinsiclistarm64sve.h | 6 +- src/coreclr/jit/lsraarm64.cpp | 18 ++---- .../Arm/Sve.PlatformNotSupported.cs | 58 +++++++++--------- .../src/System/Runtime/Intrinsics/Arm/Sve.cs | 60 +++++++++---------- .../ref/System.Runtime.Intrinsics.cs | 60 +++++++++---------- .../GenerateHWIntrinsicTests_Arm.cs | 60 +++++++++---------- ...e => SveLoad2xVectorAndUnzipTest.template} | 0 ...e => SveLoad3xVectorAndUnzipTest.template} | 0 ...e => SveLoad4xVectorAndUnzipTest.template} | 0 12 files changed, 140 insertions(+), 146 deletions(-) rename src/tests/JIT/HardwareIntrinsics/Arm/Shared/{SveLoadVectorx2Test.template => SveLoad2xVectorAndUnzipTest.template} (100%) rename src/tests/JIT/HardwareIntrinsics/Arm/Shared/{SveLoadVectorx3Test.template => SveLoad3xVectorAndUnzipTest.template} (100%) rename src/tests/JIT/HardwareIntrinsics/Arm/Shared/{SveLoadVectorx4Test.template => SveLoad4xVectorAndUnzipTest.template} (100%) diff --git a/src/coreclr/jit/gentree.cpp b/src/coreclr/jit/gentree.cpp index 5bdb985517b599..8c8cc2b728a085 100644 --- a/src/coreclr/jit/gentree.cpp +++ b/src/coreclr/jit/gentree.cpp @@ -26540,9 +26540,9 @@ bool GenTreeHWIntrinsic::OperIsMemoryLoad(GenTree** pAddr) const case NI_Sve_LoadVectorUInt16ZeroExtendToUInt64: case NI_Sve_LoadVectorUInt32ZeroExtendToInt64: case NI_Sve_LoadVectorUInt32ZeroExtendToUInt64: - case NI_Sve_LoadVectorx2: - case NI_Sve_LoadVectorx3: - case NI_Sve_LoadVectorx4: + case NI_Sve_Load2xVectorAndUnzip: + case NI_Sve_Load3xVectorAndUnzip: + case NI_Sve_Load4xVectorAndUnzip: addr = Op(2); break; #endif // TARGET_ARM64 @@ -27057,11 +27057,11 @@ ClassLayout* GenTreeHWIntrinsic::GetLayout(Compiler* compiler) const case NI_AdvSimd_Arm64_LoadAndReplicateToVector128x4: return compiler->typGetBlkLayout(64); - case NI_Sve_LoadVectorx2: + case NI_Sve_Load2xVectorAndUnzip: return compiler->typGetBlkLayout(compiler->getVectorTByteLength() * 2); - case NI_Sve_LoadVectorx3: + case NI_Sve_Load3xVectorAndUnzip: return compiler->typGetBlkLayout(compiler->getVectorTByteLength() * 3); - case NI_Sve_LoadVectorx4: + case NI_Sve_Load4xVectorAndUnzip: return compiler->typGetBlkLayout(compiler->getVectorTByteLength() * 4); #endif // TARGET_ARM64 diff --git a/src/coreclr/jit/hwintrinsic.h b/src/coreclr/jit/hwintrinsic.h index 097a1a60623f22..b0a697589c5ced 100644 --- a/src/coreclr/jit/hwintrinsic.h +++ b/src/coreclr/jit/hwintrinsic.h @@ -826,7 +826,7 @@ struct HWIntrinsicInfo case NI_AdvSimd_Arm64_LoadAndInsertScalarVector128x2: case NI_AdvSimd_LoadAndReplicateToVector64x2: case NI_AdvSimd_Arm64_LoadAndReplicateToVector128x2: - case NI_Sve_LoadVectorx2: + case NI_Sve_Load2xVectorAndUnzip: return 2; case NI_AdvSimd_LoadVector64x3AndUnzip: @@ -837,7 +837,7 @@ struct HWIntrinsicInfo case NI_AdvSimd_Arm64_LoadAndInsertScalarVector128x3: case NI_AdvSimd_LoadAndReplicateToVector64x3: case NI_AdvSimd_Arm64_LoadAndReplicateToVector128x3: - case NI_Sve_LoadVectorx3: + case NI_Sve_Load3xVectorAndUnzip: return 3; case NI_AdvSimd_LoadVector64x4AndUnzip: @@ -848,7 +848,7 @@ struct HWIntrinsicInfo case NI_AdvSimd_Arm64_LoadAndInsertScalarVector128x4: case NI_AdvSimd_LoadAndReplicateToVector64x4: case NI_AdvSimd_Arm64_LoadAndReplicateToVector128x4: - case NI_Sve_LoadVectorx4: + case NI_Sve_Load4xVectorAndUnzip: return 4; #endif diff --git a/src/coreclr/jit/hwintrinsicarm64.cpp b/src/coreclr/jit/hwintrinsicarm64.cpp index 8051473958c863..5596413728ea86 100644 --- a/src/coreclr/jit/hwintrinsicarm64.cpp +++ b/src/coreclr/jit/hwintrinsicarm64.cpp @@ -2071,9 +2071,9 @@ GenTree* Compiler::impSpecialIntrinsic(NamedIntrinsic intrinsic, break; } - case NI_Sve_LoadVectorx2: - case NI_Sve_LoadVectorx3: - case NI_Sve_LoadVectorx4: + case NI_Sve_Load2xVectorAndUnzip: + case NI_Sve_Load3xVectorAndUnzip: + case NI_Sve_Load4xVectorAndUnzip: { info.compNeedsConsecutiveRegisters = true; diff --git a/src/coreclr/jit/hwintrinsiclistarm64sve.h b/src/coreclr/jit/hwintrinsiclistarm64sve.h index e2e3cb5847c78b..54d01cd841a95c 100644 --- a/src/coreclr/jit/hwintrinsiclistarm64sve.h +++ b/src/coreclr/jit/hwintrinsiclistarm64sve.h @@ -89,9 +89,9 @@ HARDWARE_INTRINSIC(Sve, LoadVectorUInt16ZeroExtendToUInt32, HARDWARE_INTRINSIC(Sve, LoadVectorUInt16ZeroExtendToUInt64, -1, 2, false, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_ld1h, INS_invalid, INS_invalid}, HW_Category_MemoryLoad, HW_Flag_Scalable|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation) HARDWARE_INTRINSIC(Sve, LoadVectorUInt32ZeroExtendToInt64, -1, 2, false, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_ld1w, INS_invalid, INS_invalid, INS_invalid}, HW_Category_MemoryLoad, HW_Flag_Scalable|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation) HARDWARE_INTRINSIC(Sve, LoadVectorUInt32ZeroExtendToUInt64, -1, 2, false, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_ld1w, INS_invalid, INS_invalid}, HW_Category_MemoryLoad, HW_Flag_Scalable|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation) -HARDWARE_INTRINSIC(Sve, LoadVectorx2, -1, 2, true, {INS_sve_ld2b, INS_sve_ld2b, INS_sve_ld2h, INS_sve_ld2h, INS_sve_ld2w, INS_sve_ld2w, INS_sve_ld2d, INS_sve_ld2d, INS_sve_ld2w, INS_sve_ld2d}, HW_Category_MemoryLoad, HW_Flag_Scalable|HW_Flag_SpecialImport|HW_Flag_BaseTypeFromFirstArg|HW_Flag_MultiReg|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation|HW_Flag_NeedsConsecutiveRegisters) -HARDWARE_INTRINSIC(Sve, LoadVectorx3, -1, 2, true, {INS_sve_ld3b, INS_sve_ld3b, INS_sve_ld3h, INS_sve_ld3h, INS_sve_ld3w, INS_sve_ld3w, INS_sve_ld3d, INS_sve_ld3d, INS_sve_ld3w, INS_sve_ld3d}, HW_Category_MemoryLoad, HW_Flag_Scalable|HW_Flag_SpecialImport|HW_Flag_BaseTypeFromFirstArg|HW_Flag_MultiReg|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation|HW_Flag_NeedsConsecutiveRegisters) -HARDWARE_INTRINSIC(Sve, LoadVectorx4, -1, 2, true, {INS_sve_ld4b, INS_sve_ld4b, INS_sve_ld4h, INS_sve_ld4h, INS_sve_ld4w, INS_sve_ld4w, INS_sve_ld4d, INS_sve_ld4d, INS_sve_ld4w, INS_sve_ld4d}, HW_Category_MemoryLoad, HW_Flag_Scalable|HW_Flag_SpecialImport|HW_Flag_BaseTypeFromFirstArg|HW_Flag_MultiReg|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation|HW_Flag_NeedsConsecutiveRegisters) +HARDWARE_INTRINSIC(Sve, Load2xVectorAndUnzip, -1, 2, true, {INS_sve_ld2b, INS_sve_ld2b, INS_sve_ld2h, INS_sve_ld2h, INS_sve_ld2w, INS_sve_ld2w, INS_sve_ld2d, INS_sve_ld2d, INS_sve_ld2w, INS_sve_ld2d}, HW_Category_MemoryLoad, HW_Flag_Scalable|HW_Flag_SpecialImport|HW_Flag_MultiReg|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation|HW_Flag_NeedsConsecutiveRegisters|HW_Flag_BaseTypeFromFirstArg) +HARDWARE_INTRINSIC(Sve, Load3xVectorAndUnzip, -1, 2, true, {INS_sve_ld3b, INS_sve_ld3b, INS_sve_ld3h, INS_sve_ld3h, INS_sve_ld3w, INS_sve_ld3w, INS_sve_ld3d, INS_sve_ld3d, INS_sve_ld3w, INS_sve_ld3d}, HW_Category_MemoryLoad, HW_Flag_Scalable|HW_Flag_SpecialImport|HW_Flag_MultiReg|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation|HW_Flag_NeedsConsecutiveRegisters|HW_Flag_BaseTypeFromFirstArg) +HARDWARE_INTRINSIC(Sve, Load4xVectorAndUnzip, -1, 2, true, {INS_sve_ld4b, INS_sve_ld4b, INS_sve_ld4h, INS_sve_ld4h, INS_sve_ld4w, INS_sve_ld4w, INS_sve_ld4d, INS_sve_ld4d, INS_sve_ld4w, INS_sve_ld4d}, HW_Category_MemoryLoad, HW_Flag_Scalable|HW_Flag_SpecialImport|HW_Flag_MultiReg|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation|HW_Flag_NeedsConsecutiveRegisters|HW_Flag_BaseTypeFromFirstArg) HARDWARE_INTRINSIC(Sve, Max, -1, -1, false, {INS_sve_smax, INS_sve_umax, INS_sve_smax, INS_sve_umax, INS_sve_smax, INS_sve_umax, INS_sve_smax, INS_sve_umax, INS_sve_fmax, INS_sve_fmax}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_HasRMWSemantics) HARDWARE_INTRINSIC(Sve, MaxAcross, -1, -1, false, {INS_sve_smaxv, INS_sve_umaxv, INS_sve_smaxv, INS_sve_umaxv, INS_sve_smaxv, INS_sve_umaxv, INS_sve_smaxv, INS_sve_umaxv, INS_sve_fmaxv, INS_sve_fmaxv}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation) HARDWARE_INTRINSIC(Sve, MaxNumber, -1, -1, false, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_fmaxnm, INS_sve_fmaxnm}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_HasRMWSemantics) diff --git a/src/coreclr/jit/lsraarm64.cpp b/src/coreclr/jit/lsraarm64.cpp index 2868a441ea0890..326623bafe2fc9 100644 --- a/src/coreclr/jit/lsraarm64.cpp +++ b/src/coreclr/jit/lsraarm64.cpp @@ -1733,6 +1733,12 @@ int LinearScan::BuildHWIntrinsic(GenTreeHWIntrinsic* intrinsicTree, int* pDstCou FALLTHROUGH; } + case NI_Sve_Load2xVectorAndUnzip: + case NI_Sve_Load3xVectorAndUnzip: + case NI_Sve_Load4xVectorAndUnzip: + assert(intrin.op2 != nullptr); + srcCount += BuildOperandUses(intrin.op2); + FALLTHROUGH; case NI_AdvSimd_LoadVector64x2AndUnzip: case NI_AdvSimd_LoadVector64x3AndUnzip: case NI_AdvSimd_LoadVector64x4AndUnzip: @@ -1758,18 +1764,6 @@ int LinearScan::BuildHWIntrinsic(GenTreeHWIntrinsic* intrinsicTree, int* pDstCou break; } - case NI_Sve_LoadVectorx2: - case NI_Sve_LoadVectorx3: - case NI_Sve_LoadVectorx4: - { - assert(intrin.op1 != nullptr); - assert(intrin.op2 != nullptr); - srcCount += BuildOperandUses(intrin.op2); - BuildConsecutiveRegistersForDef(intrinsicTree, dstCount); - *pDstCount = dstCount; - break; - } - default: noway_assert(!"Not a supported as multiple consecutive register intrinsic"); } 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 be0e2e669e8059..0b20ad25988850 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 @@ -1427,145 +1427,145 @@ internal Arm64() { } /// svuint8x2_t svld2[_u8](svbool_t pg, const uint8_t *base) /// LD2B {Zresult0.B, Zresult1.B}, Pg/Z, [Xbase, #0, MUL VL] /// - public static unsafe (Vector, Vector) LoadVectorx2(Vector mask, byte* address) { throw new PlatformNotSupportedException(); } + public static unsafe (Vector, Vector) Load2xVectorAndUnzip(Vector mask, byte* address) { throw new PlatformNotSupportedException(); } /// /// svfloat64x2_t svld2[_f64](svbool_t pg, const float64_t *base) /// LD2D {Zresult0.D, Zresult1.D}, Pg/Z, [Xbase, #0, MUL VL] /// - public static unsafe (Vector, Vector) LoadVectorx2(Vector mask, double* address) { throw new PlatformNotSupportedException(); } + public static unsafe (Vector, Vector) Load2xVectorAndUnzip(Vector mask, double* address) { throw new PlatformNotSupportedException(); } /// /// svint16x2_t svld2[_s16](svbool_t pg, const int16_t *base) /// LD2H {Zresult0.H, Zresult1.H}, Pg/Z, [Xbase, #0, MUL VL] /// - public static unsafe (Vector, Vector) LoadVectorx2(Vector mask, short* address) { throw new PlatformNotSupportedException(); } + public static unsafe (Vector, Vector) Load2xVectorAndUnzip(Vector mask, short* address) { throw new PlatformNotSupportedException(); } /// /// svint32x2_t svld2[_s32](svbool_t pg, const int32_t *base) /// LD2W {Zresult0.S, Zresult1.S}, Pg/Z, [Xbase, #0, MUL VL] /// - public static unsafe (Vector, Vector) LoadVectorx2(Vector mask, int* address) { throw new PlatformNotSupportedException(); } + public static unsafe (Vector, Vector) Load2xVectorAndUnzip(Vector mask, int* address) { throw new PlatformNotSupportedException(); } /// /// svint64x2_t svld2[_s64](svbool_t pg, const int64_t *base) /// LD2D {Zresult0.D, Zresult1.D}, Pg/Z, [Xbase, #0, MUL VL] /// - public static unsafe (Vector, Vector) LoadVectorx2(Vector mask, long* address) { throw new PlatformNotSupportedException(); } + public static unsafe (Vector, Vector) Load2xVectorAndUnzip(Vector mask, long* address) { throw new PlatformNotSupportedException(); } /// /// svint8x2_t svld2[_s8](svbool_t pg, const int8_t *base) /// LD2B {Zresult0.B, Zresult1.B}, Pg/Z, [Xbase, #0, MUL VL] /// - public static unsafe (Vector, Vector) LoadVectorx2(Vector mask, sbyte* address) { throw new PlatformNotSupportedException(); } + public static unsafe (Vector, Vector) Load2xVectorAndUnzip(Vector mask, sbyte* address) { throw new PlatformNotSupportedException(); } /// /// svfloat32x2_t svld2[_f32](svbool_t pg, const float32_t *base) /// LD2W {Zresult0.S, Zresult1.S}, Pg/Z, [Xbase, #0, MUL VL] /// - public static unsafe (Vector, Vector) LoadVectorx2(Vector mask, float* address) { throw new PlatformNotSupportedException(); } + public static unsafe (Vector, Vector) Load2xVectorAndUnzip(Vector mask, float* address) { throw new PlatformNotSupportedException(); } /// /// svuint16x2_t svld2[_u16](svbool_t pg, const uint16_t *base) /// LD2H {Zresult0.H, Zresult1.H}, Pg/Z, [Xbase, #0, MUL VL] /// - public static unsafe (Vector, Vector) LoadVectorx2(Vector mask, ushort* address) { throw new PlatformNotSupportedException(); } + public static unsafe (Vector, Vector) Load2xVectorAndUnzip(Vector mask, ushort* address) { throw new PlatformNotSupportedException(); } /// /// svuint32x2_t svld2[_u32](svbool_t pg, const uint32_t *base) /// LD2W {Zresult0.S, Zresult1.S}, Pg/Z, [Xbase, #0, MUL VL] /// - public static unsafe (Vector, Vector) LoadVectorx2(Vector mask, uint* address) { throw new PlatformNotSupportedException(); } + public static unsafe (Vector, Vector) Load2xVectorAndUnzip(Vector mask, uint* address) { throw new PlatformNotSupportedException(); } /// /// svuint64x2_t svld2[_u64](svbool_t pg, const uint64_t *base) /// LD2D {Zresult0.D, Zresult1.D}, Pg/Z, [Xbase, #0, MUL VL] /// - public static unsafe (Vector, Vector) LoadVectorx2(Vector mask, ulong* address) { throw new PlatformNotSupportedException(); } + public static unsafe (Vector, Vector) Load2xVectorAndUnzip(Vector mask, ulong* address) { throw new PlatformNotSupportedException(); } /// /// svuint8x3_t svld3[_u8](svbool_t pg, const uint8_t *base) /// LD3B {Zresult0.B - Zresult2.B}, Pg/Z, [Xbase, #0, MUL VL] /// - public static unsafe (Vector, Vector, Vector) LoadVectorx3(Vector mask, byte* address) { throw new PlatformNotSupportedException(); } + public static unsafe (Vector, Vector, Vector) Load3xVectorAndUnzip(Vector mask, byte* address) { throw new PlatformNotSupportedException(); } /// /// svfloat64x3_t svld3[_f64](svbool_t pg, const float64_t *base) /// LD3D {Zresult0.D - Zresult2.D}, Pg/Z, [Xbase, #0, MUL VL] /// - public static unsafe (Vector, Vector, Vector) LoadVectorx3(Vector mask, double* address) { throw new PlatformNotSupportedException(); } + public static unsafe (Vector, Vector, Vector) Load3xVectorAndUnzip(Vector mask, double* address) { throw new PlatformNotSupportedException(); } /// /// svint16x3_t svld3[_s16](svbool_t pg, const int16_t *base) /// LD3H {Zresult0.H - Zresult2.H}, Pg/Z, [Xbase, #0, MUL VL] /// - public static unsafe (Vector, Vector, Vector) LoadVectorx3(Vector mask, short* address) { throw new PlatformNotSupportedException(); } + public static unsafe (Vector, Vector, Vector) Load3xVectorAndUnzip(Vector mask, short* address) { throw new PlatformNotSupportedException(); } /// /// svint32x3_t svld3[_s32](svbool_t pg, const int32_t *base) /// LD3W {Zresult0.S - Zresult2.S}, Pg/Z, [Xbase, #0, MUL VL] /// - public static unsafe (Vector, Vector, Vector) LoadVectorx3(Vector mask, int* address) { throw new PlatformNotSupportedException(); } + public static unsafe (Vector, Vector, Vector) Load3xVectorAndUnzip(Vector mask, int* address) { throw new PlatformNotSupportedException(); } /// /// svint64x3_t svld3[_s64](svbool_t pg, const int64_t *base) /// LD3D {Zresult0.D - Zresult2.D}, Pg/Z, [Xbase, #0, MUL VL] /// - public static unsafe (Vector, Vector, Vector) LoadVectorx3(Vector mask, long* address) { throw new PlatformNotSupportedException(); } + public static unsafe (Vector, Vector, Vector) Load3xVectorAndUnzip(Vector mask, long* address) { throw new PlatformNotSupportedException(); } /// /// svint8x3_t svld3[_s8](svbool_t pg, const int8_t *base) /// LD3B {Zresult0.B - Zresult2.B}, Pg/Z, [Xbase, #0, MUL VL] /// - public static unsafe (Vector, Vector, Vector) LoadVectorx3(Vector mask, sbyte* address) { throw new PlatformNotSupportedException(); } + public static unsafe (Vector, Vector, Vector) Load3xVectorAndUnzip(Vector mask, sbyte* address) { throw new PlatformNotSupportedException(); } /// /// svfloat32x3_t svld3[_f32](svbool_t pg, const float32_t *base) /// LD3W {Zresult0.S - Zresult2.S}, Pg/Z, [Xbase, #0, MUL VL] /// - public static unsafe (Vector, Vector, Vector) LoadVectorx3(Vector mask, float* address) { throw new PlatformNotSupportedException(); } + public static unsafe (Vector, Vector, Vector) Load3xVectorAndUnzip(Vector mask, float* address) { throw new PlatformNotSupportedException(); } /// /// svuint16x3_t svld3[_u16](svbool_t pg, const uint16_t *base) /// LD3H {Zresult0.H - Zresult2.H}, Pg/Z, [Xbase, #0, MUL VL] /// - public static unsafe (Vector, Vector, Vector) LoadVectorx3(Vector mask, ushort* address) { throw new PlatformNotSupportedException(); } + public static unsafe (Vector, Vector, Vector) Load3xVectorAndUnzip(Vector mask, ushort* address) { throw new PlatformNotSupportedException(); } /// /// svuint32x3_t svld3[_u32](svbool_t pg, const uint32_t *base) /// LD3W {Zresult0.S - Zresult2.S}, Pg/Z, [Xbase, #0, MUL VL] /// - public static unsafe (Vector, Vector, Vector) LoadVectorx3(Vector mask, uint* address) { throw new PlatformNotSupportedException(); } + public static unsafe (Vector, Vector, Vector) Load3xVectorAndUnzip(Vector mask, uint* address) { throw new PlatformNotSupportedException(); } /// /// svuint64x3_t svld3[_u64](svbool_t pg, const uint64_t *base) /// LD3D {Zresult0.D - Zresult2.D}, Pg/Z, [Xbase, #0, MUL VL] /// - public static unsafe (Vector, Vector, Vector) LoadVectorx3(Vector mask, ulong* address) { throw new PlatformNotSupportedException(); } + public static unsafe (Vector, Vector, Vector) Load3xVectorAndUnzip(Vector mask, ulong* address) { throw new PlatformNotSupportedException(); } /// /// svuint8x4_t svld4[_u8](svbool_t pg, const uint8_t *base) /// LD4B {Zresult0.B - Zresult3.B}, Pg/Z, [Xbase, #0, MUL VL] /// - public static unsafe (Vector, Vector, Vector, Vector) LoadVectorx4(Vector mask, byte* address) { throw new PlatformNotSupportedException(); } + public static unsafe (Vector, Vector, Vector, Vector) Load4xVectorAndUnzip(Vector mask, byte* address) { throw new PlatformNotSupportedException(); } /// /// svfloat64x4_t svld4[_f64](svbool_t pg, const float64_t *base) /// LD4D {Zresult0.D - Zresult3.D}, Pg/Z, [Xbase, #0, MUL VL] /// - public static unsafe (Vector, Vector, Vector, Vector) LoadVectorx4(Vector mask, double* address) { throw new PlatformNotSupportedException(); } + public static unsafe (Vector, Vector, Vector, Vector) Load4xVectorAndUnzip(Vector mask, double* address) { throw new PlatformNotSupportedException(); } /// /// svint16x4_t svld4[_s16](svbool_t pg, const int16_t *base) /// LD4H {Zresult0.H - Zresult3.H}, Pg/Z, [Xbase, #0, MUL VL] /// - public static unsafe (Vector, Vector, Vector, Vector) LoadVectorx4(Vector mask, short* address) { throw new PlatformNotSupportedException(); } + public static unsafe (Vector, Vector, Vector, Vector) Load4xVectorAndUnzip(Vector mask, short* address) { throw new PlatformNotSupportedException(); } /// /// svint32x4_t svld4[_s32](svbool_t pg, const int32_t *base) /// LD4W {Zresult0.S - Zresult3.S}, Pg/Z, [Xbase, #0, MUL VL] /// - public static unsafe (Vector, Vector, Vector, Vector) LoadVectorx4(Vector mask, int* address) { throw new PlatformNotSupportedException(); } + public static unsafe (Vector, Vector, Vector, Vector) Load4xVectorAndUnzip(Vector mask, int* address) { throw new PlatformNotSupportedException(); } /// /// svint64x4_t svld4[_s64](svbool_t pg, const int64_t *base) @@ -1577,31 +1577,31 @@ internal Arm64() { } /// svint8x4_t svld4[_s8](svbool_t pg, const int8_t *base) /// LD4B {Zresult0.B - Zresult3.B}, Pg/Z, [Xbase, #0, MUL VL] /// - public static unsafe (Vector, Vector, Vector, Vector) LoadVectorx4(Vector mask, sbyte* address) { throw new PlatformNotSupportedException(); } + public static unsafe (Vector, Vector, Vector, Vector) Load4xVectorAndUnzip(Vector mask, sbyte* address) { throw new PlatformNotSupportedException(); } /// /// svfloat32x4_t svld4[_f32](svbool_t pg, const float32_t *base) /// LD4W {Zresult0.S - Zresult3.S}, Pg/Z, [Xbase, #0, MUL VL] /// - public static unsafe (Vector, Vector, Vector, Vector) LoadVectorx4(Vector mask, float* address) { throw new PlatformNotSupportedException(); } + public static unsafe (Vector, Vector, Vector, Vector) Load4xVectorAndUnzip(Vector mask, float* address) { throw new PlatformNotSupportedException(); } /// /// svuint16x4_t svld4[_u16](svbool_t pg, const uint16_t *base) /// LD4H {Zresult0.H - Zresult3.H}, Pg/Z, [Xbase, #0, MUL VL] /// - public static unsafe (Vector, Vector, Vector, Vector) LoadVectorx4(Vector mask, ushort* address) { throw new PlatformNotSupportedException(); } + public static unsafe (Vector, Vector, Vector, Vector) Load4xVectorAndUnzip(Vector mask, ushort* address) { throw new PlatformNotSupportedException(); } /// /// svuint32x4_t svld4[_u32](svbool_t pg, const uint32_t *base) /// LD4W {Zresult0.S - Zresult3.S}, Pg/Z, [Xbase, #0, MUL VL] /// - public static unsafe (Vector, Vector, Vector, Vector) LoadVectorx4(Vector mask, uint* address) { throw new PlatformNotSupportedException(); } + public static unsafe (Vector, Vector, Vector, Vector) Load4xVectorAndUnzip(Vector mask, uint* address) { throw new PlatformNotSupportedException(); } /// /// svuint64x4_t svld4[_u64](svbool_t pg, const uint64_t *base) /// LD4D {Zresult0.D - Zresult3.D}, Pg/Z, [Xbase, #0, MUL VL] /// - public static unsafe (Vector, Vector, Vector, Vector) LoadVectorx4(Vector mask, ulong* address) { throw new PlatformNotSupportedException(); } + public static unsafe (Vector, Vector, Vector, Vector) Load4xVectorAndUnzip(Vector mask, ulong* address) { throw new PlatformNotSupportedException(); } /// Max : Maximum 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 f8c00358e9b446..850855765b61c7 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 @@ -1484,181 +1484,181 @@ internal Arm64() { } /// svuint8x2_t svld2[_u8](svbool_t pg, const uint8_t *base) /// LD2B {Zresult0.B, Zresult1.B}, Pg/Z, [Xbase, #0, MUL VL] /// - public static unsafe (Vector, Vector) LoadVectorx2(Vector mask, byte* address) => LoadVectorx2(mask, address); + public static unsafe (Vector, Vector) Load2xVectorAndUnzip(Vector mask, byte* address) => Load2xVectorAndUnzip(mask, address); /// /// svfloat64x2_t svld2[_f64](svbool_t pg, const float64_t *base) /// LD2D {Zresult0.D, Zresult1.D}, Pg/Z, [Xbase, #0, MUL VL] /// - public static unsafe (Vector, Vector) LoadVectorx2(Vector mask, double* address) => LoadVectorx2(mask, address); + public static unsafe (Vector, Vector) Load2xVectorAndUnzip(Vector mask, double* address) => Load2xVectorAndUnzip(mask, address); /// /// svint16x2_t svld2[_s16](svbool_t pg, const int16_t *base) /// LD2H {Zresult0.H, Zresult1.H}, Pg/Z, [Xbase, #0, MUL VL] /// - public static unsafe (Vector, Vector) LoadVectorx2(Vector mask, short* address) => LoadVectorx2(mask, address); + public static unsafe (Vector, Vector) Load2xVectorAndUnzip(Vector mask, short* address) => Load2xVectorAndUnzip(mask, address); /// /// svint32x2_t svld2[_s32](svbool_t pg, const int32_t *base) /// LD2W {Zresult0.S, Zresult1.S}, Pg/Z, [Xbase, #0, MUL VL] /// - public static unsafe (Vector, Vector) LoadVectorx2(Vector mask, int* address) => LoadVectorx2(mask, address); + public static unsafe (Vector, Vector) Load2xVectorAndUnzip(Vector mask, int* address) => Load2xVectorAndUnzip(mask, address); /// /// svint64x2_t svld2[_s64](svbool_t pg, const int64_t *base) /// LD2D {Zresult0.D, Zresult1.D}, Pg/Z, [Xbase, #0, MUL VL] /// - public static unsafe (Vector, Vector) LoadVectorx2(Vector mask, long* address) => LoadVectorx2(mask, address); + public static unsafe (Vector, Vector) Load2xVectorAndUnzip(Vector mask, long* address) => Load2xVectorAndUnzip(mask, address); /// /// svint8x2_t svld2[_s8](svbool_t pg, const int8_t *base) /// LD2B {Zresult0.B, Zresult1.B}, Pg/Z, [Xbase, #0, MUL VL] /// - public static unsafe (Vector, Vector) LoadVectorx2(Vector mask, sbyte* address) => LoadVectorx2(mask, address); + public static unsafe (Vector, Vector) Load2xVectorAndUnzip(Vector mask, sbyte* address) => Load2xVectorAndUnzip(mask, address); /// /// svfloat32x2_t svld2[_f32](svbool_t pg, const float32_t *base) /// LD2W {Zresult0.S, Zresult1.S}, Pg/Z, [Xbase, #0, MUL VL] /// - public static unsafe (Vector, Vector) LoadVectorx2(Vector mask, float* address) => LoadVectorx2(mask, address); + public static unsafe (Vector, Vector) Load2xVectorAndUnzip(Vector mask, float* address) => Load2xVectorAndUnzip(mask, address); /// /// svuint16x2_t svld2[_u16](svbool_t pg, const uint16_t *base) /// LD2H {Zresult0.H, Zresult1.H}, Pg/Z, [Xbase, #0, MUL VL] /// - public static unsafe (Vector, Vector) LoadVectorx2(Vector mask, ushort* address) => LoadVectorx2(mask, address); + public static unsafe (Vector, Vector) Load2xVectorAndUnzip(Vector mask, ushort* address) => Load2xVectorAndUnzip(mask, address); /// /// svuint32x2_t svld2[_u32](svbool_t pg, const uint32_t *base) /// LD2W {Zresult0.S, Zresult1.S}, Pg/Z, [Xbase, #0, MUL VL] /// - public static unsafe (Vector, Vector) LoadVectorx2(Vector mask, uint* address) => LoadVectorx2(mask, address); + public static unsafe (Vector, Vector) Load2xVectorAndUnzip(Vector mask, uint* address) => Load2xVectorAndUnzip(mask, address); /// /// svuint64x2_t svld2[_u64](svbool_t pg, const uint64_t *base) /// LD2D {Zresult0.D, Zresult1.D}, Pg/Z, [Xbase, #0, MUL VL] /// - public static unsafe (Vector, Vector) LoadVectorx2(Vector mask, ulong* address) => LoadVectorx2(mask, address); + public static unsafe (Vector, Vector) Load2xVectorAndUnzip(Vector mask, ulong* address) => Load2xVectorAndUnzip(mask, address); /// /// svuint8x3_t svld3[_u8](svbool_t pg, const uint8_t *base) /// LD3B {Zresult0.B - Zresult2.B}, Pg/Z, [Xbase, #0, MUL VL] /// - public static unsafe (Vector, Vector, Vector) LoadVectorx3(Vector mask, byte* address) => LoadVectorx3(mask, address); + public static unsafe (Vector, Vector, Vector) Load3xVectorAndUnzip(Vector mask, byte* address) => Load3xVectorAndUnzip(mask, address); /// /// svfloat64x3_t svld3[_f64](svbool_t pg, const float64_t *base) /// LD3D {Zresult0.D - Zresult2.D}, Pg/Z, [Xbase, #0, MUL VL] /// - public static unsafe (Vector, Vector, Vector) LoadVectorx3(Vector mask, double* address) => LoadVectorx3(mask, address); + public static unsafe (Vector, Vector, Vector) Load3xVectorAndUnzip(Vector mask, double* address) => Load3xVectorAndUnzip(mask, address); /// /// svint16x3_t svld3[_s16](svbool_t pg, const int16_t *base) /// LD3H {Zresult0.H - Zresult2.H}, Pg/Z, [Xbase, #0, MUL VL] /// - public static unsafe (Vector, Vector, Vector) LoadVectorx3(Vector mask, short* address) => LoadVectorx3(mask, address); + public static unsafe (Vector, Vector, Vector) Load3xVectorAndUnzip(Vector mask, short* address) => Load3xVectorAndUnzip(mask, address); /// /// svint32x3_t svld3[_s32](svbool_t pg, const int32_t *base) /// LD3W {Zresult0.S - Zresult2.S}, Pg/Z, [Xbase, #0, MUL VL] /// - public static unsafe (Vector, Vector, Vector) LoadVectorx3(Vector mask, int* address) => LoadVectorx3(mask, address); + public static unsafe (Vector, Vector, Vector) Load3xVectorAndUnzip(Vector mask, int* address) => Load3xVectorAndUnzip(mask, address); /// /// svint64x3_t svld3[_s64](svbool_t pg, const int64_t *base) /// LD3D {Zresult0.D - Zresult2.D}, Pg/Z, [Xbase, #0, MUL VL] /// - public static unsafe (Vector, Vector, Vector) LoadVectorx3(Vector mask, long* address) => LoadVectorx3(mask, address); + public static unsafe (Vector, Vector, Vector) Load3xVectorAndUnzip(Vector mask, long* address) => Load3xVectorAndUnzip(mask, address); /// /// svint8x3_t svld3[_s8](svbool_t pg, const int8_t *base) /// LD3B {Zresult0.B - Zresult2.B}, Pg/Z, [Xbase, #0, MUL VL] /// - public static unsafe (Vector, Vector, Vector) LoadVectorx3(Vector mask, sbyte* address) => LoadVectorx3(mask, address); + public static unsafe (Vector, Vector, Vector) Load3xVectorAndUnzip(Vector mask, sbyte* address) => Load3xVectorAndUnzip(mask, address); /// /// svfloat32x3_t svld3[_f32](svbool_t pg, const float32_t *base) /// LD3W {Zresult0.S - Zresult2.S}, Pg/Z, [Xbase, #0, MUL VL] /// - public static unsafe (Vector, Vector, Vector) LoadVectorx3(Vector mask, float* address) => LoadVectorx3(mask, address); + public static unsafe (Vector, Vector, Vector) Load3xVectorAndUnzip(Vector mask, float* address) => Load3xVectorAndUnzip(mask, address); /// /// svuint16x3_t svld3[_u16](svbool_t pg, const uint16_t *base) /// LD3H {Zresult0.H - Zresult2.H}, Pg/Z, [Xbase, #0, MUL VL] /// - public static unsafe (Vector, Vector, Vector) LoadVectorx3(Vector mask, ushort* address) => LoadVectorx3(mask, address); + public static unsafe (Vector, Vector, Vector) Load3xVectorAndUnzip(Vector mask, ushort* address) => Load3xVectorAndUnzip(mask, address); /// /// svuint32x3_t svld3[_u32](svbool_t pg, const uint32_t *base) /// LD3W {Zresult0.S - Zresult2.S}, Pg/Z, [Xbase, #0, MUL VL] /// - public static unsafe (Vector, Vector, Vector) LoadVectorx3(Vector mask, uint* address) => LoadVectorx3(mask, address); + public static unsafe (Vector, Vector, Vector) Load3xVectorAndUnzip(Vector mask, uint* address) => Load3xVectorAndUnzip(mask, address); /// /// svuint64x3_t svld3[_u64](svbool_t pg, const uint64_t *base) /// LD3D {Zresult0.D - Zresult2.D}, Pg/Z, [Xbase, #0, MUL VL] /// - public static unsafe (Vector, Vector, Vector) LoadVectorx3(Vector mask, ulong* address) => LoadVectorx3(mask, address); + public static unsafe (Vector, Vector, Vector) Load3xVectorAndUnzip(Vector mask, ulong* address) => Load3xVectorAndUnzip(mask, address); /// /// svuint8x4_t svld4[_u8](svbool_t pg, const uint8_t *base) /// LD4B {Zresult0.B - Zresult3.B}, Pg/Z, [Xbase, #0, MUL VL] /// - public static unsafe (Vector, Vector, Vector, Vector) LoadVectorx4(Vector mask, byte* address) => LoadVectorx4(mask, address); + public static unsafe (Vector, Vector, Vector, Vector) Load4xVectorAndUnzip(Vector mask, byte* address) => Load4xVectorAndUnzip(mask, address); /// /// svfloat64x4_t svld4[_f64](svbool_t pg, const float64_t *base) /// LD4D {Zresult0.D - Zresult3.D}, Pg/Z, [Xbase, #0, MUL VL] /// - public static unsafe (Vector, Vector, Vector, Vector) LoadVectorx4(Vector mask, double* address) => LoadVectorx4(mask, address); + public static unsafe (Vector, Vector, Vector, Vector) Load4xVectorAndUnzip(Vector mask, double* address) => Load4xVectorAndUnzip(mask, address); /// /// svint16x4_t svld4[_s16](svbool_t pg, const int16_t *base) /// LD4H {Zresult0.H - Zresult3.H}, Pg/Z, [Xbase, #0, MUL VL] /// - public static unsafe (Vector, Vector, Vector, Vector) LoadVectorx4(Vector mask, short* address) => LoadVectorx4(mask, address); + public static unsafe (Vector, Vector, Vector, Vector) Load4xVectorAndUnzip(Vector mask, short* address) => Load4xVectorAndUnzip(mask, address); /// /// svint32x4_t svld4[_s32](svbool_t pg, const int32_t *base) /// LD4W {Zresult0.S - Zresult3.S}, Pg/Z, [Xbase, #0, MUL VL] /// - public static unsafe (Vector, Vector, Vector, Vector) LoadVectorx4(Vector mask, int* address) => LoadVectorx4(mask, address); + public static unsafe (Vector, Vector, Vector, Vector) Load4xVectorAndUnzip(Vector mask, int* address) => Load4xVectorAndUnzip(mask, address); /// /// svint64x4_t svld4[_s64](svbool_t pg, const int64_t *base) /// LD4D {Zresult0.D - Zresult3.D}, Pg/Z, [Xbase, #0, MUL VL] /// - public static unsafe (Vector, Vector, Vector, Vector) LoadVectorx4(Vector mask, long* address) => LoadVectorx4(mask, address); + public static unsafe (Vector, Vector, Vector, Vector) Load4xVectorAndUnzip(Vector mask, long* address) => Load4xVectorAndUnzip(mask, address); /// /// svint8x4_t svld4[_s8](svbool_t pg, const int8_t *base) /// LD4B {Zresult0.B - Zresult3.B}, Pg/Z, [Xbase, #0, MUL VL] /// - public static unsafe (Vector, Vector, Vector, Vector) LoadVectorx4(Vector mask, sbyte* address) => LoadVectorx4(mask, address); + public static unsafe (Vector, Vector, Vector, Vector) Load4xVectorAndUnzip(Vector mask, sbyte* address) => Load4xVectorAndUnzip(mask, address); /// /// svfloat32x4_t svld4[_f32](svbool_t pg, const float32_t *base) /// LD4W {Zresult0.S - Zresult3.S}, Pg/Z, [Xbase, #0, MUL VL] /// - public static unsafe (Vector, Vector, Vector, Vector) LoadVectorx4(Vector mask, float* address) => LoadVectorx4(mask, address); + public static unsafe (Vector, Vector, Vector, Vector) Load4xVectorAndUnzip(Vector mask, float* address) => Load4xVectorAndUnzip(mask, address); /// /// svuint16x4_t svld4[_u16](svbool_t pg, const uint16_t *base) /// LD4H {Zresult0.H - Zresult3.H}, Pg/Z, [Xbase, #0, MUL VL] /// - public static unsafe (Vector, Vector, Vector, Vector) LoadVectorx4(Vector mask, ushort* address) => LoadVectorx4(mask, address); + public static unsafe (Vector, Vector, Vector, Vector) Load4xVectorAndUnzip(Vector mask, ushort* address) => Load4xVectorAndUnzip(mask, address); /// /// svuint32x4_t svld4[_u32](svbool_t pg, const uint32_t *base) /// LD4W {Zresult0.S - Zresult3.S}, Pg/Z, [Xbase, #0, MUL VL] /// - public static unsafe (Vector, Vector, Vector, Vector) LoadVectorx4(Vector mask, uint* address) => LoadVectorx4(mask, address); + public static unsafe (Vector, Vector, Vector, Vector) Load4xVectorAndUnzip(Vector mask, uint* address) => Load4xVectorAndUnzip(mask, address); /// /// svuint64x4_t svld4[_u64](svbool_t pg, const uint64_t *base) /// LD4D {Zresult0.D - Zresult3.D}, Pg/Z, [Xbase, #0, MUL VL] /// - public static unsafe (Vector, Vector, Vector, Vector) LoadVectorx4(Vector mask, ulong* address) => LoadVectorx4(mask, address); + public static unsafe (Vector, Vector, Vector, Vector) Load4xVectorAndUnzip(Vector mask, ulong* address) => Load4xVectorAndUnzip(mask, address); /// Max : Maximum 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 6e1f6354dc19d0..813463194f2a85 100644 --- a/src/libraries/System.Runtime.Intrinsics/ref/System.Runtime.Intrinsics.cs +++ b/src/libraries/System.Runtime.Intrinsics/ref/System.Runtime.Intrinsics.cs @@ -4350,36 +4350,36 @@ internal Arm64() { } public static unsafe System.Numerics.Vector LoadVectorUInt32ZeroExtendToInt64(System.Numerics.Vector mask, uint* address) { throw null; } public static unsafe System.Numerics.Vector LoadVectorUInt32ZeroExtendToUInt64(System.Numerics.Vector mask, uint* address) { throw null; } - public static unsafe (System.Numerics.Vector, System.Numerics.Vector) LoadVectorx2(System.Numerics.Vector mask, byte* address) { throw null; } - public static unsafe (System.Numerics.Vector, System.Numerics.Vector) LoadVectorx2(System.Numerics.Vector mask, double* address) { throw null; } - public static unsafe (System.Numerics.Vector, System.Numerics.Vector) LoadVectorx2(System.Numerics.Vector mask, short* address) { throw null; } - public static unsafe (System.Numerics.Vector, System.Numerics.Vector) LoadVectorx2(System.Numerics.Vector mask, int* address) { throw null; } - public static unsafe (System.Numerics.Vector, System.Numerics.Vector) LoadVectorx2(System.Numerics.Vector mask, long* address) { throw null; } - public static unsafe (System.Numerics.Vector, System.Numerics.Vector) LoadVectorx2(System.Numerics.Vector mask, sbyte* address) { throw null; } - public static unsafe (System.Numerics.Vector, System.Numerics.Vector) LoadVectorx2(System.Numerics.Vector mask, float* address) { throw null; } - public static unsafe (System.Numerics.Vector, System.Numerics.Vector) LoadVectorx2(System.Numerics.Vector mask, ushort* address) { throw null; } - public static unsafe (System.Numerics.Vector, System.Numerics.Vector) LoadVectorx2(System.Numerics.Vector mask, uint* address) { throw null; } - public static unsafe (System.Numerics.Vector, System.Numerics.Vector) LoadVectorx2(System.Numerics.Vector mask, ulong* address) { throw null; } - public static unsafe (System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector) LoadVectorx3(System.Numerics.Vector mask, byte* address) { throw null; } - public static unsafe (System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector) LoadVectorx3(System.Numerics.Vector mask, double* address) { throw null; } - public static unsafe (System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector) LoadVectorx3(System.Numerics.Vector mask, short* address) { throw null; } - public static unsafe (System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector) LoadVectorx3(System.Numerics.Vector mask, int* address) { throw null; } - public static unsafe (System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector) LoadVectorx3(System.Numerics.Vector mask, long* address) { throw null; } - public static unsafe (System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector) LoadVectorx3(System.Numerics.Vector mask, sbyte* address) { throw null; } - public static unsafe (System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector) LoadVectorx3(System.Numerics.Vector mask, float* address) { throw null; } - public static unsafe (System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector) LoadVectorx3(System.Numerics.Vector mask, ushort* address) { throw null; } - public static unsafe (System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector) LoadVectorx3(System.Numerics.Vector mask, uint* address) { throw null; } - public static unsafe (System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector) LoadVectorx3(System.Numerics.Vector mask, ulong* address) { throw null; } - public static unsafe (System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector) LoadVectorx4(System.Numerics.Vector mask, byte* address) { throw null; } - public static unsafe (System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector) LoadVectorx4(System.Numerics.Vector mask, double* address) { throw null; } - public static unsafe (System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector) LoadVectorx4(System.Numerics.Vector mask, short* address) { throw null; } - public static unsafe (System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector) LoadVectorx4(System.Numerics.Vector mask, int* address) { throw null; } - public static unsafe (System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector) LoadVectorx4(System.Numerics.Vector mask, long* address) { throw null; } - public static unsafe (System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector) LoadVectorx4(System.Numerics.Vector mask, sbyte* address) { throw null; } - public static unsafe (System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector) LoadVectorx4(System.Numerics.Vector mask, float* address) { throw null; } - public static unsafe (System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector) LoadVectorx4(System.Numerics.Vector mask, ushort* address) { throw null; } - public static unsafe (System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector) LoadVectorx4(System.Numerics.Vector mask, uint* address) { throw null; } - public static unsafe (System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector) LoadVectorx4(System.Numerics.Vector mask, ulong* address) { throw null; } + public static unsafe (System.Numerics.Vector, System.Numerics.Vector) Load2xVectorAndUnzip(System.Numerics.Vector mask, byte* address) { throw null; } + public static unsafe (System.Numerics.Vector, System.Numerics.Vector) Load2xVectorAndUnzip(System.Numerics.Vector mask, double* address) { throw null; } + public static unsafe (System.Numerics.Vector, System.Numerics.Vector) Load2xVectorAndUnzip(System.Numerics.Vector mask, short* address) { throw null; } + public static unsafe (System.Numerics.Vector, System.Numerics.Vector) Load2xVectorAndUnzip(System.Numerics.Vector mask, int* address) { throw null; } + public static unsafe (System.Numerics.Vector, System.Numerics.Vector) Load2xVectorAndUnzip(System.Numerics.Vector mask, long* address) { throw null; } + public static unsafe (System.Numerics.Vector, System.Numerics.Vector) Load2xVectorAndUnzip(System.Numerics.Vector mask, sbyte* address) { throw null; } + public static unsafe (System.Numerics.Vector, System.Numerics.Vector) Load2xVectorAndUnzip(System.Numerics.Vector mask, float* address) { throw null; } + public static unsafe (System.Numerics.Vector, System.Numerics.Vector) Load2xVectorAndUnzip(System.Numerics.Vector mask, ushort* address) { throw null; } + public static unsafe (System.Numerics.Vector, System.Numerics.Vector) Load2xVectorAndUnzip(System.Numerics.Vector mask, uint* address) { throw null; } + public static unsafe (System.Numerics.Vector, System.Numerics.Vector) Load2xVectorAndUnzip(System.Numerics.Vector mask, ulong* address) { throw null; } + public static unsafe (System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector) Load3xVectorAndUnzip(System.Numerics.Vector mask, byte* address) { throw null; } + public static unsafe (System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector) Load3xVectorAndUnzip(System.Numerics.Vector mask, double* address) { throw null; } + public static unsafe (System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector) Load3xVectorAndUnzip(System.Numerics.Vector mask, short* address) { throw null; } + public static unsafe (System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector) Load3xVectorAndUnzip(System.Numerics.Vector mask, int* address) { throw null; } + public static unsafe (System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector) Load3xVectorAndUnzip(System.Numerics.Vector mask, long* address) { throw null; } + public static unsafe (System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector) Load3xVectorAndUnzip(System.Numerics.Vector mask, sbyte* address) { throw null; } + public static unsafe (System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector) Load3xVectorAndUnzip(System.Numerics.Vector mask, float* address) { throw null; } + public static unsafe (System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector) Load3xVectorAndUnzip(System.Numerics.Vector mask, ushort* address) { throw null; } + public static unsafe (System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector) Load3xVectorAndUnzip(System.Numerics.Vector mask, uint* address) { throw null; } + public static unsafe (System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector) Load3xVectorAndUnzip(System.Numerics.Vector mask, ulong* address) { throw null; } + public static unsafe (System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector) Load4xVectorAndUnzip(System.Numerics.Vector mask, byte* address) { throw null; } + public static unsafe (System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector) Load4xVectorAndUnzip(System.Numerics.Vector mask, double* address) { throw null; } + public static unsafe (System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector) Load4xVectorAndUnzip(System.Numerics.Vector mask, short* address) { throw null; } + public static unsafe (System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector) Load4xVectorAndUnzip(System.Numerics.Vector mask, int* address) { throw null; } + public static unsafe (System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector) Load4xVectorAndUnzip(System.Numerics.Vector mask, long* address) { throw null; } + public static unsafe (System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector) Load4xVectorAndUnzip(System.Numerics.Vector mask, sbyte* address) { throw null; } + public static unsafe (System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector) Load4xVectorAndUnzip(System.Numerics.Vector mask, float* address) { throw null; } + public static unsafe (System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector) Load4xVectorAndUnzip(System.Numerics.Vector mask, ushort* address) { throw null; } + public static unsafe (System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector) Load4xVectorAndUnzip(System.Numerics.Vector mask, uint* address) { throw null; } + public static unsafe (System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector, System.Numerics.Vector) Load4xVectorAndUnzip(System.Numerics.Vector mask, ulong* address) { throw null; } public static System.Numerics.Vector Max(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } public static System.Numerics.Vector Max(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } diff --git a/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs b/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs index fee106ba8bf0f3..bda5863fef2fff 100644 --- a/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs +++ b/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs @@ -3107,36 +3107,36 @@ ("SveLoadMaskedUnOpTest.template", new Dictionary { ["TestName"] = "SveLoadVectorUInt32ZeroExtendToInt64", ["Isa"] = "Sve", ["Method"] = "LoadVectorUInt32ZeroExtendToInt64", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2BaseType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["ValidateIterResult"] = "firstOp[i] != result[i]"}), ("SveLoadMaskedUnOpTest.template", new Dictionary { ["TestName"] = "SveLoadVectorUInt32ZeroExtendToUInt64", ["Isa"] = "Sve", ["Method"] = "LoadVectorUInt32ZeroExtendToUInt64", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt64", ["Op2BaseType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["ValidateIterResult"] = "firstOp[i] != result[i]"}), - ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_float", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Single", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Single", ["Op2BaseType"] = "Single", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()", ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()", ["ValidateIterResult"] = "result1[i] != input[i * 2] || result2[i] != input[i * 2 + 1]"}), - ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_double", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Double", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Double", ["Op2BaseType"] = "Double", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()", ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()", ["ValidateIterResult"] = "result1[i] != input[i * 2] || result2[i] != input[i * 2 + 1]"}), - ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_sbyte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector", ["RetBaseType"] = "SByte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "SByte", ["Op2BaseType"] = "SByte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["ValidateIterResult"] = "result1[i] != input[i * 2] || result2[i] != input[i * 2 + 1]"}), - ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_short", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2BaseType"] = "Int16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["ValidateIterResult"] = "result1[i] != input[i * 2] || result2[i] != input[i * 2 + 1]"}), - ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_int", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2BaseType"] = "Int32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["ValidateIterResult"] = "result1[i] != input[i * 2] || result2[i] != input[i * 2 + 1]"}), - ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_long", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2BaseType"] = "Int64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()", ["ValidateIterResult"] = "result1[i] != input[i * 2] || result2[i] != input[i * 2 + 1]"}), - ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_byte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Byte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Byte", ["Op2BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetByte()", ["ValidateIterResult"] = "result1[i] != input[i * 2] || result2[i] != input[i * 2 + 1]"}), - ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_ushort", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["Op2BaseType"] = "UInt16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt16()", ["ValidateIterResult"] = "result1[i] != input[i * 2] || result2[i] != input[i * 2 + 1]"}), - ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_uint", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["Op2BaseType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["ValidateIterResult"] = "result1[i] != input[i * 2] || result2[i] != input[i * 2 + 1]"}), - ("SveLoadVectorx2Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx2_ulong", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx2", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt64", ["Op2BaseType"] = "UInt64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()", ["ValidateIterResult"] = "result1[i] != input[i * 2] || result2[i] != input[i * 2 + 1]"}), - ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_float", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Single", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Single", ["Op2BaseType"] = "Single", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()", ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()", ["ValidateIterResult"] = "result1[i] != input[i * 3] || result2[i] != input[i * 3 + 1] || result3[i] != input[i * 3 + 2]"}), - ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_double", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Double", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Double", ["Op2BaseType"] = "Double", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()", ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()", ["ValidateIterResult"] = "result1[i] != input[i * 3] || result2[i] != input[i * 3 + 1] || result3[i] != input[i * 3 + 2]"}), - ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_sbyte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector", ["RetBaseType"] = "SByte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "SByte", ["Op2BaseType"] = "SByte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["ValidateIterResult"] = "result1[i] != input[i * 3] || result2[i] != input[i * 3 + 1] || result3[i] != input[i * 3 + 2]"}), - ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_short", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2BaseType"] = "Int16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["ValidateIterResult"] = "result1[i] != input[i * 3] || result2[i] != input[i * 3 + 1] || result3[i] != input[i * 3 + 2]"}), - ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_int", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2BaseType"] = "Int32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["ValidateIterResult"] = "result1[i] != input[i * 3] || result2[i] != input[i * 3 + 1] || result3[i] != input[i * 3 + 2]"}), - ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_long", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2BaseType"] = "Int64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()", ["ValidateIterResult"] = "result1[i] != input[i * 3] || result2[i] != input[i * 3 + 1] || result3[i] != input[i * 3 + 2]"}), - ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_byte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Byte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Byte", ["Op2BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetByte()", ["ValidateIterResult"] = "result1[i] != input[i * 3] || result2[i] != input[i * 3 + 1] || result3[i] != input[i * 3 + 2]"}), - ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_ushort", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["Op2BaseType"] = "UInt16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt16()", ["ValidateIterResult"] = "result1[i] != input[i * 3] || result2[i] != input[i * 3 + 1] || result3[i] != input[i * 3 + 2]"}), - ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_uint", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["Op2BaseType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["ValidateIterResult"] = "result1[i] != input[i * 3] || result2[i] != input[i * 3 + 1] || result3[i] != input[i * 3 + 2]"}), - ("SveLoadVectorx3Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx3_ulong", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx3", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt64", ["Op2BaseType"] = "UInt64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()", ["ValidateIterResult"] = "result1[i] != input[i * 3] || result2[i] != input[i * 3 + 1] || result3[i] != input[i * 3 + 2]"}), - ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_float", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Single", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Single", ["Op2BaseType"] = "Single", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()", ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()", ["ValidateIterResult"] = "result1[i] != input[i * 4] || result2[i] != input[i * 4 + 1] || result3[i] != input[i * 4 + 2] || result4[i] != input[i * 4 + 3]"}), - ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_double", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Double", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Double", ["Op2BaseType"] = "Double", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()", ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()", ["ValidateIterResult"] = "result1[i] != input[i * 4] || result2[i] != input[i * 4 + 1] || result3[i] != input[i * 4 + 2] || result4[i] != input[i * 4 + 3]"}), - ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_sbyte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector", ["RetBaseType"] = "SByte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "SByte", ["Op2BaseType"] = "SByte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["ValidateIterResult"] = "result1[i] != input[i * 4] || result2[i] != input[i * 4 + 1] || result3[i] != input[i * 4 + 2] || result4[i] != input[i * 4 + 3]"}), - ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_short", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2BaseType"] = "Int16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["ValidateIterResult"] = "result1[i] != input[i * 4] || result2[i] != input[i * 4 + 1] || result3[i] != input[i * 4 + 2] || result4[i] != input[i * 4 + 3]"}), - ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_int", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2BaseType"] = "Int32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["ValidateIterResult"] = "result1[i] != input[i * 4] || result2[i] != input[i * 4 + 1] || result3[i] != input[i * 4 + 2] || result4[i] != input[i * 4 + 3]"}), - ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_long", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2BaseType"] = "Int64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()", ["ValidateIterResult"] = "result1[i] != input[i * 4] || result2[i] != input[i * 4 + 1] || result3[i] != input[i * 4 + 2] || result4[i] != input[i * 4 + 3]"}), - ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_byte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Byte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Byte", ["Op2BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetByte()", ["ValidateIterResult"] = "result1[i] != input[i * 4] || result2[i] != input[i * 4 + 1] || result3[i] != input[i * 4 + 2] || result4[i] != input[i * 4 + 3]"}), - ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_ushort", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["Op2BaseType"] = "UInt16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt16()", ["ValidateIterResult"] = "result1[i] != input[i * 4] || result2[i] != input[i * 4 + 1] || result3[i] != input[i * 4 + 2] || result4[i] != input[i * 4 + 3]"}), - ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_uint", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["Op2BaseType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["ValidateIterResult"] = "result1[i] != input[i * 4] || result2[i] != input[i * 4 + 1] || result3[i] != input[i * 4 + 2] || result4[i] != input[i * 4 + 3]"}), - ("SveLoadVectorx4Test.template", new Dictionary { ["TestName"] = "Sve_LoadVectorx4_ulong", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "LoadVectorx4", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt64", ["Op2BaseType"] = "UInt64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()", ["ValidateIterResult"] = "result1[i] != input[i * 4] || result2[i] != input[i * 4 + 1] || result3[i] != input[i * 4 + 2] || result4[i] != input[i * 4 + 3]"}), + ("SveLoad2xVectorAndUnzipTest.template", new Dictionary { ["TestName"] = "Sve_Load2xVectorAndUnzip_float", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "Load2xVectorAndUnzip", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Single", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Single", ["Op2BaseType"] = "Single", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()", ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()", ["ValidateIterResult"] = "result1[i] != input[i * 2] || result2[i] != input[i * 2 + 1]"}), + ("SveLoad2xVectorAndUnzipTest.template", new Dictionary { ["TestName"] = "Sve_Load2xVectorAndUnzip_double", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "Load2xVectorAndUnzip", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Double", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Double", ["Op2BaseType"] = "Double", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()", ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()", ["ValidateIterResult"] = "result1[i] != input[i * 2] || result2[i] != input[i * 2 + 1]"}), + ("SveLoad2xVectorAndUnzipTest.template", new Dictionary { ["TestName"] = "Sve_Load2xVectorAndUnzip_sbyte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "Load2xVectorAndUnzip", ["RetVectorType"] = "Vector", ["RetBaseType"] = "SByte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "SByte", ["Op2BaseType"] = "SByte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["ValidateIterResult"] = "result1[i] != input[i * 2] || result2[i] != input[i * 2 + 1]"}), + ("SveLoad2xVectorAndUnzipTest.template", new Dictionary { ["TestName"] = "Sve_Load2xVectorAndUnzip_short", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "Load2xVectorAndUnzip", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2BaseType"] = "Int16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["ValidateIterResult"] = "result1[i] != input[i * 2] || result2[i] != input[i * 2 + 1]"}), + ("SveLoad2xVectorAndUnzipTest.template", new Dictionary { ["TestName"] = "Sve_Load2xVectorAndUnzip_int", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "Load2xVectorAndUnzip", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2BaseType"] = "Int32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["ValidateIterResult"] = "result1[i] != input[i * 2] || result2[i] != input[i * 2 + 1]"}), + ("SveLoad2xVectorAndUnzipTest.template", new Dictionary { ["TestName"] = "Sve_Load2xVectorAndUnzip_long", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "Load2xVectorAndUnzip", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2BaseType"] = "Int64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()", ["ValidateIterResult"] = "result1[i] != input[i * 2] || result2[i] != input[i * 2 + 1]"}), + ("SveLoad2xVectorAndUnzipTest.template", new Dictionary { ["TestName"] = "Sve_Load2xVectorAndUnzip_byte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "Load2xVectorAndUnzip", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Byte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Byte", ["Op2BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetByte()", ["ValidateIterResult"] = "result1[i] != input[i * 2] || result2[i] != input[i * 2 + 1]"}), + ("SveLoad2xVectorAndUnzipTest.template", new Dictionary { ["TestName"] = "Sve_Load2xVectorAndUnzip_ushort", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "Load2xVectorAndUnzip", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["Op2BaseType"] = "UInt16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt16()", ["ValidateIterResult"] = "result1[i] != input[i * 2] || result2[i] != input[i * 2 + 1]"}), + ("SveLoad2xVectorAndUnzipTest.template", new Dictionary { ["TestName"] = "Sve_Load2xVectorAndUnzip_uint", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "Load2xVectorAndUnzip", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["Op2BaseType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["ValidateIterResult"] = "result1[i] != input[i * 2] || result2[i] != input[i * 2 + 1]"}), + ("SveLoad2xVectorAndUnzipTest.template", new Dictionary { ["TestName"] = "Sve_Load2xVectorAndUnzip_ulong", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "Load2xVectorAndUnzip", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt64", ["Op2BaseType"] = "UInt64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()", ["ValidateIterResult"] = "result1[i] != input[i * 2] || result2[i] != input[i * 2 + 1]"}), + ("SveLoad3xVectorAndUnzipTest.template", new Dictionary { ["TestName"] = "Sve_Load3xVectorAndUnzip_float", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "Load3xVectorAndUnzip", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Single", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Single", ["Op2BaseType"] = "Single", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()", ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()", ["ValidateIterResult"] = "result1[i] != input[i * 3] || result2[i] != input[i * 3 + 1] || result3[i] != input[i * 3 + 2]"}), + ("SveLoad3xVectorAndUnzipTest.template", new Dictionary { ["TestName"] = "Sve_Load3xVectorAndUnzip_double", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "Load3xVectorAndUnzip", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Double", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Double", ["Op2BaseType"] = "Double", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()", ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()", ["ValidateIterResult"] = "result1[i] != input[i * 3] || result2[i] != input[i * 3 + 1] || result3[i] != input[i * 3 + 2]"}), + ("SveLoad3xVectorAndUnzipTest.template", new Dictionary { ["TestName"] = "Sve_Load3xVectorAndUnzip_sbyte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "Load3xVectorAndUnzip", ["RetVectorType"] = "Vector", ["RetBaseType"] = "SByte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "SByte", ["Op2BaseType"] = "SByte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["ValidateIterResult"] = "result1[i] != input[i * 3] || result2[i] != input[i * 3 + 1] || result3[i] != input[i * 3 + 2]"}), + ("SveLoad3xVectorAndUnzipTest.template", new Dictionary { ["TestName"] = "Sve_Load3xVectorAndUnzip_short", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "Load3xVectorAndUnzip", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2BaseType"] = "Int16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["ValidateIterResult"] = "result1[i] != input[i * 3] || result2[i] != input[i * 3 + 1] || result3[i] != input[i * 3 + 2]"}), + ("SveLoad3xVectorAndUnzipTest.template", new Dictionary { ["TestName"] = "Sve_Load3xVectorAndUnzip_int", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "Load3xVectorAndUnzip", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2BaseType"] = "Int32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["ValidateIterResult"] = "result1[i] != input[i * 3] || result2[i] != input[i * 3 + 1] || result3[i] != input[i * 3 + 2]"}), + ("SveLoad3xVectorAndUnzipTest.template", new Dictionary { ["TestName"] = "Sve_Load3xVectorAndUnzip_long", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "Load3xVectorAndUnzip", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2BaseType"] = "Int64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()", ["ValidateIterResult"] = "result1[i] != input[i * 3] || result2[i] != input[i * 3 + 1] || result3[i] != input[i * 3 + 2]"}), + ("SveLoad3xVectorAndUnzipTest.template", new Dictionary { ["TestName"] = "Sve_Load3xVectorAndUnzip_byte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "Load3xVectorAndUnzip", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Byte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Byte", ["Op2BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetByte()", ["ValidateIterResult"] = "result1[i] != input[i * 3] || result2[i] != input[i * 3 + 1] || result3[i] != input[i * 3 + 2]"}), + ("SveLoad3xVectorAndUnzipTest.template", new Dictionary { ["TestName"] = "Sve_Load3xVectorAndUnzip_ushort", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "Load3xVectorAndUnzip", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["Op2BaseType"] = "UInt16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt16()", ["ValidateIterResult"] = "result1[i] != input[i * 3] || result2[i] != input[i * 3 + 1] || result3[i] != input[i * 3 + 2]"}), + ("SveLoad3xVectorAndUnzipTest.template", new Dictionary { ["TestName"] = "Sve_Load3xVectorAndUnzip_uint", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "Load3xVectorAndUnzip", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["Op2BaseType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["ValidateIterResult"] = "result1[i] != input[i * 3] || result2[i] != input[i * 3 + 1] || result3[i] != input[i * 3 + 2]"}), + ("SveLoad3xVectorAndUnzipTest.template", new Dictionary { ["TestName"] = "Sve_Load3xVectorAndUnzip_ulong", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "Load3xVectorAndUnzip", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt64", ["Op2BaseType"] = "UInt64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()", ["ValidateIterResult"] = "result1[i] != input[i * 3] || result2[i] != input[i * 3 + 1] || result3[i] != input[i * 3 + 2]"}), + ("SveLoad4xVectorAndUnzipTest.template", new Dictionary { ["TestName"] = "Sve_Load4xVectorAndUnzip_float", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "Load4xVectorAndUnzip", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Single", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Single", ["Op2BaseType"] = "Single", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()", ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()", ["ValidateIterResult"] = "result1[i] != input[i * 4] || result2[i] != input[i * 4 + 1] || result3[i] != input[i * 4 + 2] || result4[i] != input[i * 4 + 3]"}), + ("SveLoad4xVectorAndUnzipTest.template", new Dictionary { ["TestName"] = "Sve_Load4xVectorAndUnzip_double", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "Load4xVectorAndUnzip", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Double", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Double", ["Op2BaseType"] = "Double", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()", ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()", ["ValidateIterResult"] = "result1[i] != input[i * 4] || result2[i] != input[i * 4 + 1] || result3[i] != input[i * 4 + 2] || result4[i] != input[i * 4 + 3]"}), + ("SveLoad4xVectorAndUnzipTest.template", new Dictionary { ["TestName"] = "Sve_Load4xVectorAndUnzip_sbyte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "Load4xVectorAndUnzip", ["RetVectorType"] = "Vector", ["RetBaseType"] = "SByte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "SByte", ["Op2BaseType"] = "SByte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["ValidateIterResult"] = "result1[i] != input[i * 4] || result2[i] != input[i * 4 + 1] || result3[i] != input[i * 4 + 2] || result4[i] != input[i * 4 + 3]"}), + ("SveLoad4xVectorAndUnzipTest.template", new Dictionary { ["TestName"] = "Sve_Load4xVectorAndUnzip_short", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "Load4xVectorAndUnzip", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2BaseType"] = "Int16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["ValidateIterResult"] = "result1[i] != input[i * 4] || result2[i] != input[i * 4 + 1] || result3[i] != input[i * 4 + 2] || result4[i] != input[i * 4 + 3]"}), + ("SveLoad4xVectorAndUnzipTest.template", new Dictionary { ["TestName"] = "Sve_Load4xVectorAndUnzip_int", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "Load4xVectorAndUnzip", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2BaseType"] = "Int32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["ValidateIterResult"] = "result1[i] != input[i * 4] || result2[i] != input[i * 4 + 1] || result3[i] != input[i * 4 + 2] || result4[i] != input[i * 4 + 3]"}), + ("SveLoad4xVectorAndUnzipTest.template", new Dictionary { ["TestName"] = "Sve_Load4xVectorAndUnzip_long", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "Load4xVectorAndUnzip", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2BaseType"] = "Int64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()", ["ValidateIterResult"] = "result1[i] != input[i * 4] || result2[i] != input[i * 4 + 1] || result3[i] != input[i * 4 + 2] || result4[i] != input[i * 4 + 3]"}), + ("SveLoad4xVectorAndUnzipTest.template", new Dictionary { ["TestName"] = "Sve_Load4xVectorAndUnzip_byte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "Load4xVectorAndUnzip", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Byte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Byte", ["Op2BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetByte()", ["ValidateIterResult"] = "result1[i] != input[i * 4] || result2[i] != input[i * 4 + 1] || result3[i] != input[i * 4 + 2] || result4[i] != input[i * 4 + 3]"}), + ("SveLoad4xVectorAndUnzipTest.template", new Dictionary { ["TestName"] = "Sve_Load4xVectorAndUnzip_ushort", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "Load4xVectorAndUnzip", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["Op2BaseType"] = "UInt16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt16()", ["ValidateIterResult"] = "result1[i] != input[i * 4] || result2[i] != input[i * 4 + 1] || result3[i] != input[i * 4 + 2] || result4[i] != input[i * 4 + 3]"}), + ("SveLoad4xVectorAndUnzipTest.template", new Dictionary { ["TestName"] = "Sve_Load4xVectorAndUnzip_uint", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "Load4xVectorAndUnzip", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["Op2BaseType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["ValidateIterResult"] = "result1[i] != input[i * 4] || result2[i] != input[i * 4 + 1] || result3[i] != input[i * 4 + 2] || result4[i] != input[i * 4 + 3]"}), + ("SveLoad4xVectorAndUnzipTest.template", new Dictionary { ["TestName"] = "Sve_Load4xVectorAndUnzip_ulong", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "Load4xVectorAndUnzip", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt64", ["Op2BaseType"] = "UInt64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()", ["ValidateIterResult"] = "result1[i] != input[i * 4] || result2[i] != input[i * 4 + 1] || result3[i] != input[i * 4 + 2] || result4[i] != input[i * 4 + 3]"}), ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve_Max_float", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "Max", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Single", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Single", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Single", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()", ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()", ["ValidateIterResult"] = "Helpers.Max(left[i], right[i]) != result[i]", ["GetIterResult"] = "Helpers.Max(left[i], right[i])"}), ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve_Max_double", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "Max", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Double", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Double", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Double", ["LargestVectorSize"] = "8", ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()", ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()", ["ValidateIterResult"] = "Helpers.Max(left[i], right[i]) != result[i]", ["GetIterResult"] = "Helpers.Max(left[i], right[i])"}), diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorx2Test.template b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoad2xVectorAndUnzipTest.template similarity index 100% rename from src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorx2Test.template rename to src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoad2xVectorAndUnzipTest.template diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorx3Test.template b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoad3xVectorAndUnzipTest.template similarity index 100% rename from src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorx3Test.template rename to src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoad3xVectorAndUnzipTest.template diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorx4Test.template b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoad4xVectorAndUnzipTest.template similarity index 100% rename from src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorx4Test.template rename to src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoad4xVectorAndUnzipTest.template From bb85fd420c45a60173f16ad49ef2c70c89000299 Mon Sep 17 00:00:00 2001 From: TIHan Date: Fri, 17 May 2024 15:37:39 -0700 Subject: [PATCH 17/22] Fix build --- .../System/Runtime/Intrinsics/Arm/Sve.PlatformNotSupported.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 0b20ad25988850..1753b327edb536 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 @@ -1571,7 +1571,7 @@ internal Arm64() { } /// svint64x4_t svld4[_s64](svbool_t pg, const int64_t *base) /// LD4D {Zresult0.D - Zresult3.D}, Pg/Z, [Xbase, #0, MUL VL] /// - public static unsafe (Vector, Vector, Vector, Vector) LoadVectorx4(Vector mask, long* address) { throw new PlatformNotSupportedException(); } + public static unsafe (Vector, Vector, Vector, Vector) Load4xVectorAndUnzip(Vector mask, long* address) { throw new PlatformNotSupportedException(); } /// /// svint8x4_t svld4[_s8](svbool_t pg, const int8_t *base) From da1548812f082b5b8802d8e466e27a7b1afb8b5b Mon Sep 17 00:00:00 2001 From: TIHan Date: Mon, 20 May 2024 13:48:40 -0700 Subject: [PATCH 18/22] Trying to fix failing test --- src/coreclr/jit/lsraarm64.cpp | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/coreclr/jit/lsraarm64.cpp b/src/coreclr/jit/lsraarm64.cpp index 04de8aaf3a5075..2a7a338711f4e0 100644 --- a/src/coreclr/jit/lsraarm64.cpp +++ b/src/coreclr/jit/lsraarm64.cpp @@ -1733,12 +1733,6 @@ int LinearScan::BuildHWIntrinsic(GenTreeHWIntrinsic* intrinsicTree, int* pDstCou FALLTHROUGH; } - case NI_Sve_Load2xVectorAndUnzip: - case NI_Sve_Load3xVectorAndUnzip: - case NI_Sve_Load4xVectorAndUnzip: - assert(intrin.op2 != nullptr); - srcCount += BuildOperandUses(intrin.op2); - FALLTHROUGH; case NI_AdvSimd_LoadVector64x2AndUnzip: case NI_AdvSimd_LoadVector64x3AndUnzip: case NI_AdvSimd_LoadVector64x4AndUnzip: @@ -1764,6 +1758,18 @@ int LinearScan::BuildHWIntrinsic(GenTreeHWIntrinsic* intrinsicTree, int* pDstCou break; } + case NI_Sve_Load2xVectorAndUnzip: + case NI_Sve_Load3xVectorAndUnzip: + case NI_Sve_Load4xVectorAndUnzip: + { + assert(intrin.op1 != nullptr); + assert(intrin.op2 != nullptr); + srcCount += BuildOperandUses(intrin.op2); + BuildConsecutiveRegistersForDef(intrinsicTree, dstCount); + *pDstCount = dstCount; + break; + } + default: noway_assert(!"Not a supported as multiple consecutive register intrinsic"); } From aa82babdae461f402cd3e8ae66c8353a519b108f Mon Sep 17 00:00:00 2001 From: TIHan Date: Tue, 21 May 2024 11:20:38 -0700 Subject: [PATCH 19/22] Tweaks --- src/coreclr/jit/hwintrinsicarm64.cpp | 7 ++++--- src/coreclr/jit/lsraarm64.cpp | 3 ++- .../Arm/Shared/SveLoad2xVectorAndUnzipTest.template | 2 +- .../Arm/Shared/SveLoad3xVectorAndUnzipTest.template | 2 +- .../Arm/Shared/SveLoad4xVectorAndUnzipTest.template | 2 +- 5 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/coreclr/jit/hwintrinsicarm64.cpp b/src/coreclr/jit/hwintrinsicarm64.cpp index 015ba5535d632c..080b4c3ef3f15d 100644 --- a/src/coreclr/jit/hwintrinsicarm64.cpp +++ b/src/coreclr/jit/hwintrinsicarm64.cpp @@ -2304,17 +2304,18 @@ GenTree* Compiler::impSpecialIntrinsic(NamedIntrinsic intrinsic, info.compNeedsConsecutiveRegisters = true; assert(sig->numArgs == 2); + assert(simdSize == 0); // scalable op2 = impPopStack().val; op1 = impPopStack().val; - if (op1->OperIs(GT_CAST)) + if (op2->OperIs(GT_CAST)) { // Although the API specifies a pointer, if what we have is a BYREF, that's what // we really want, so throw away the cast. - if (op1->gtGetOp1()->TypeGet() == TYP_BYREF) + if (op2->gtGetOp1()->TypeGet() == TYP_BYREF) { - op1 = op1->gtGetOp1(); + op2 = op2->gtGetOp1(); } } diff --git a/src/coreclr/jit/lsraarm64.cpp b/src/coreclr/jit/lsraarm64.cpp index 2a7a338711f4e0..326242b3093a11 100644 --- a/src/coreclr/jit/lsraarm64.cpp +++ b/src/coreclr/jit/lsraarm64.cpp @@ -1764,7 +1764,8 @@ int LinearScan::BuildHWIntrinsic(GenTreeHWIntrinsic* intrinsicTree, int* pDstCou { assert(intrin.op1 != nullptr); assert(intrin.op2 != nullptr); - srcCount += BuildOperandUses(intrin.op2); + assert(intrinsicTree->OperIsMemoryLoadOrStore()); + srcCount += BuildAddrUses(intrin.op2); BuildConsecutiveRegistersForDef(intrinsicTree, dstCount); *pDstCount = dstCount; break; diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoad2xVectorAndUnzipTest.template b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoad2xVectorAndUnzipTest.template index 154bd47f8b952c..d6c773b1e07c36 100644 --- a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoad2xVectorAndUnzipTest.template +++ b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoad2xVectorAndUnzipTest.template @@ -283,7 +283,7 @@ namespace JIT.HardwareIntrinsics.Arm if (!succeeded) { - TestLibrary.TestFramework.LogInformation($"{nameof({Isa})}.{nameof({Isa}.{Method})}({Op1VectorType}<{Op1BaseType}>): {Method} failed:"); + TestLibrary.TestFramework.LogInformation($"{nameof({Isa})}.{nameof({Isa}.{Method})}({Op1VectorType}<{Op1BaseType}>): {Method} failed:"); TestLibrary.TestFramework.LogInformation($" input: ({string.Join(", ", input)})"); TestLibrary.TestFramework.LogInformation($" result1: ({string.Join(", ", result1)})"); TestLibrary.TestFramework.LogInformation($" result2: ({string.Join(", ", result2)})"); diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoad3xVectorAndUnzipTest.template b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoad3xVectorAndUnzipTest.template index 4668c2cc4a2362..1d567ff555bdae 100644 --- a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoad3xVectorAndUnzipTest.template +++ b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoad3xVectorAndUnzipTest.template @@ -299,7 +299,7 @@ namespace JIT.HardwareIntrinsics.Arm if (!succeeded) { - TestLibrary.TestFramework.LogInformation($"{nameof({Isa})}.{nameof({Isa}.{Method})}({Op1VectorType}<{Op1BaseType}>): {Method} failed:"); + TestLibrary.TestFramework.LogInformation($"{nameof({Isa})}.{nameof({Isa}.{Method})}({Op1VectorType}<{Op1BaseType}>): {Method} failed:"); TestLibrary.TestFramework.LogInformation($" input: ({string.Join(", ", input)})"); TestLibrary.TestFramework.LogInformation($" result1: ({string.Join(", ", result1)})"); TestLibrary.TestFramework.LogInformation($" result2: ({string.Join(", ", result2)})"); diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoad4xVectorAndUnzipTest.template b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoad4xVectorAndUnzipTest.template index 8320ee8fb48990..078fdaa1593803 100644 --- a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoad4xVectorAndUnzipTest.template +++ b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoad4xVectorAndUnzipTest.template @@ -315,7 +315,7 @@ namespace JIT.HardwareIntrinsics.Arm if (!succeeded) { - TestLibrary.TestFramework.LogInformation($"{nameof({Isa})}.{nameof({Isa}.{Method})}({Op1VectorType}<{Op1BaseType}>): {Method} failed:"); + TestLibrary.TestFramework.LogInformation($"{nameof({Isa})}.{nameof({Isa}.{Method})}({Op1VectorType}<{Op1BaseType}>): {Method} failed:"); TestLibrary.TestFramework.LogInformation($" input: ({string.Join(", ", input)})"); TestLibrary.TestFramework.LogInformation($" result1: ({string.Join(", ", result1)})"); TestLibrary.TestFramework.LogInformation($" result2: ({string.Join(", ", result2)})"); From bdb3b1387733fe067879f6f016c75b8bfc7a8fd0 Mon Sep 17 00:00:00 2001 From: TIHan Date: Tue, 21 May 2024 11:32:47 -0700 Subject: [PATCH 20/22] quick fix --- src/coreclr/jit/hwintrinsicarm64.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/coreclr/jit/hwintrinsicarm64.cpp b/src/coreclr/jit/hwintrinsicarm64.cpp index 080b4c3ef3f15d..f595166c69edbe 100644 --- a/src/coreclr/jit/hwintrinsicarm64.cpp +++ b/src/coreclr/jit/hwintrinsicarm64.cpp @@ -2304,7 +2304,6 @@ GenTree* Compiler::impSpecialIntrinsic(NamedIntrinsic intrinsic, info.compNeedsConsecutiveRegisters = true; assert(sig->numArgs == 2); - assert(simdSize == 0); // scalable op2 = impPopStack().val; op1 = impPopStack().val; From ce587afba0c4d85fda36db5382e5bb56df2574d5 Mon Sep 17 00:00:00 2001 From: TIHan Date: Fri, 24 May 2024 17:28:51 -0700 Subject: [PATCH 21/22] Added FalseMask and NonFaulting test cases --- .../SveLoad2xVectorAndUnzipTest.template | 270 ++++++++++++++++ .../SveLoad3xVectorAndUnzipTest.template | 281 +++++++++++++++++ .../SveLoad4xVectorAndUnzipTest.template | 292 ++++++++++++++++++ 3 files changed, 843 insertions(+) diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoad2xVectorAndUnzipTest.template b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoad2xVectorAndUnzipTest.template index d6c773b1e07c36..f31bbf44da061d 100644 --- a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoad2xVectorAndUnzipTest.template +++ b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoad2xVectorAndUnzipTest.template @@ -28,18 +28,28 @@ namespace JIT.HardwareIntrinsics.Arm { // Validates basic functionality works test.RunBasicScenario(); + test.RunBasicScenario_FalseMask(); + test.RunBasicScenario_NonFaulting(); // Validates calling via reflection works test.RunReflectionScenario(); + test.RunReflectionScenario_FalseMask(); + test.RunReflectionScenario_NonFaulting(); // Validates passing an instance member of a class works test.RunClassFldScenario(); + test.RunClassFldScenario_FalseMask(); + test.RunClassFldScenario_NonFaulting(); // Validates passing the field of a local struct works test.RunStructLclFldScenario(); + test.RunStructLclFldScenario_FalseMask(); + test.RunStructLclFldScenario_NonFaulting(); // Validates passing an instance member of a struct works test.RunStructFldScenario(); + test.RunStructFldScenario_FalseMask(); + test.RunStructFldScenario_NonFaulting(); } else { @@ -128,6 +138,28 @@ namespace JIT.HardwareIntrinsics.Arm testClass.ValidateResult(_fld1, _fld2, testClass._dataTable.inArrayPtr); } + + public void RunStructFldScenario_FalseMask({TestName}Test testClass) + { + //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable + {Op1VectorType}<{Op1BaseType}> loadMask = Sve.CreateFalseMask{RetBaseType}(); + + (_fld1, _fld2) = {Isa}.{Method}(loadMask, ({Op1BaseType}*)testClass._dataTable.inArrayPtr); + + testClass.ValidateZeroResult(_fld1, _fld2, testClass._dataTable.inArrayPtr); + } + + public void RunStructFldScenario_NonFaulting({TestName}Test testClass) + { + //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable + {Op1VectorType}<{Op1BaseType}> loadTrueMask = Sve.CreateTrueMask{RetBaseType}(SveMaskPattern.All); + {Op1VectorType}<{Op1BaseType}> loadFalseMask = Sve.CreateFalseMask{RetBaseType}(); + + (_fld1, _fld2) = {Isa}.{Method}(loadTrueMask, ({Op1BaseType}*)testClass._dataTable.inArrayPtr); + (_fld1, _fld2) = {Isa}.{Method}(loadFalseMask, default); + + testClass.ValidateZeroResult(_fld1, _fld2, testClass._dataTable.inArrayPtr); + } } private static readonly int LargestVectorSize = {LargestVectorSize}; @@ -167,6 +199,44 @@ namespace JIT.HardwareIntrinsics.Arm ValidateResult(_dataTable.outArray1Ptr, _dataTable.outArray2Ptr, _dataTable.inArrayPtr); } + public void RunBasicScenario_FalseMask() + { + TestLibrary.TestFramework.BeginScenario(nameof(RunBasicScenario_FalseMask)); + + //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable + {Op1VectorType}<{Op1BaseType}> loadMask = Sve.CreateFalseMask{RetBaseType}(); + + var result = {Isa}.{Method}(loadMask, ({Op1BaseType}*)(_dataTable.inArrayPtr)); + + Unsafe.Write(_dataTable.outArray1Ptr, result.Item1); + Unsafe.Write(_dataTable.outArray2Ptr, result.Item2); + ValidateZeroResult(_dataTable.outArray1Ptr, _dataTable.outArray2Ptr, _dataTable.inArrayPtr); + } + + public void RunBasicScenario_NonFaulting() + { + TestLibrary.TestFramework.BeginScenario(nameof(RunBasicScenario_NonFaulting)); + + //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable + {Op1VectorType}<{Op1BaseType}> loadTrueMask = Sve.CreateTrueMask{RetBaseType}(SveMaskPattern.All); + {Op1VectorType}<{Op1BaseType}> loadFalseMask = Sve.CreateFalseMask{RetBaseType}(); + + var result = {Isa}.{Method}(loadTrueMask, ({Op1BaseType}*)(_dataTable.inArrayPtr)); + + try + { + result = {Isa}.{Method}(loadFalseMask, default); + + Unsafe.Write(_dataTable.outArray1Ptr, result.Item1); + Unsafe.Write(_dataTable.outArray2Ptr, result.Item2); + ValidateZeroResult(_dataTable.outArray1Ptr, _dataTable.outArray2Ptr, _dataTable.inArrayPtr); + } + catch + { + Succeeded = false; + } + } + public void RunReflectionScenario() { TestLibrary.TestFramework.BeginScenario(nameof(RunReflectionScenario)); @@ -186,6 +256,58 @@ namespace JIT.HardwareIntrinsics.Arm ValidateResult(_dataTable.outArray1Ptr, _dataTable.outArray2Ptr, _dataTable.inArrayPtr); } + public void RunReflectionScenario_FalseMask() + { + TestLibrary.TestFramework.BeginScenario(nameof(RunReflectionScenario_FalseMask)); + + //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable + {Op1VectorType}<{Op1BaseType}> loadMask = Sve.CreateFalseMask{RetBaseType}(); + + var result = typeof({Isa}).GetMethod(nameof({Isa}.{Method}), new Type[] { typeof(Vector<{Op1BaseType}>), typeof({Op1BaseType}*) }) + .Invoke(null, new object[] { + loadMask, + Pointer.Box(_dataTable.inArrayPtr, typeof({Op1BaseType}*)) + }); + + var output = (({Op1VectorType}<{Op1BaseType}>,{Op1VectorType}<{Op1BaseType}>))result; + Unsafe.Write(_dataTable.outArray1Ptr, output.Item1); + Unsafe.Write(_dataTable.outArray2Ptr, output.Item2); + ValidateZeroResult(_dataTable.outArray1Ptr, _dataTable.outArray2Ptr, _dataTable.inArrayPtr); + } + + public void RunReflectionScenario_NonFaulting() + { + TestLibrary.TestFramework.BeginScenario(nameof(RunReflectionScenario_NonFaulting)); + + //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable + {Op1VectorType}<{Op1BaseType}> loadTrueMask = Sve.CreateTrueMask{RetBaseType}(SveMaskPattern.All); + {Op1VectorType}<{Op1BaseType}> loadFalseMask = Sve.CreateFalseMask{RetBaseType}(); + + var result = typeof({Isa}).GetMethod(nameof({Isa}.{Method}), new Type[] { typeof(Vector<{Op1BaseType}>), typeof({Op1BaseType}*) }) + .Invoke(null, new object[] { + loadTrueMask, + Pointer.Box(_dataTable.inArrayPtr, typeof({Op1BaseType}*)) + }); + + try + { + result = typeof({Isa}).GetMethod(nameof({Isa}.{Method}), new Type[] { typeof(Vector<{Op1BaseType}>), typeof({Op1BaseType}*) }) + .Invoke(null, new object[] { + loadFalseMask, + Pointer.Box(default, typeof({Op1BaseType}*)) + }); + + var output = (({Op1VectorType}<{Op1BaseType}>,{Op1VectorType}<{Op1BaseType}>))result; + Unsafe.Write(_dataTable.outArray1Ptr, output.Item1); + Unsafe.Write(_dataTable.outArray2Ptr, output.Item2); + ValidateZeroResult(_dataTable.outArray1Ptr, _dataTable.outArray2Ptr, _dataTable.inArrayPtr); + } + catch + { + Succeeded = false; + } + } + public void RunClassFldScenario() { TestLibrary.TestFramework.BeginScenario(nameof(RunClassFldScenario)); @@ -198,6 +320,40 @@ namespace JIT.HardwareIntrinsics.Arm ValidateResult(_fld1, _fld2, _dataTable.inArrayPtr); } + public void RunClassFldScenario_FalseMask() + { + TestLibrary.TestFramework.BeginScenario(nameof(RunClassFldScenario_FalseMask)); + + //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable + {Op1VectorType}<{Op1BaseType}> loadMask = Sve.CreateFalseMask{RetBaseType}(); + + (_fld1, _fld2) = {Isa}.{Method}(loadMask, ({Op1BaseType}*)_dataTable.inArrayPtr); + + ValidateZeroResult(_fld1, _fld2, _dataTable.inArrayPtr); + } + + public void RunClassFldScenario_NonFaulting() + { + TestLibrary.TestFramework.BeginScenario(nameof(RunClassFldScenario_NonFaulting)); + + //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable + {Op1VectorType}<{Op1BaseType}> loadTrueMask = Sve.CreateTrueMask{RetBaseType}(SveMaskPattern.All); + {Op1VectorType}<{Op1BaseType}> loadFalseMask = Sve.CreateFalseMask{RetBaseType}(); + + (_fld1, _fld2) = {Isa}.{Method}(loadTrueMask, ({Op1BaseType}*)_dataTable.inArrayPtr); + + try + { + (_fld1, _fld2) = {Isa}.{Method}(loadFalseMask, default); + + ValidateZeroResult(_fld1, _fld2, _dataTable.inArrayPtr); + } + catch + { + Succeeded = false; + } + } + public void RunStructLclFldScenario() { TestLibrary.TestFramework.BeginScenario(nameof(RunStructLclFldScenario)); @@ -213,6 +369,46 @@ namespace JIT.HardwareIntrinsics.Arm ValidateResult(_dataTable.outArray1Ptr, _dataTable.outArray2Ptr, _dataTable.inArrayPtr); } + public void RunStructLclFldScenario_FalseMask() + { + TestLibrary.TestFramework.BeginScenario(nameof(RunStructLclFldScenario_FalseMask)); + + //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable + {Op1VectorType}<{Op1BaseType}> loadMask = Sve.CreateFalseMask{RetBaseType}(); + + var test = TestStruct.Create(); + (test._fld1, test._fld2) = {Isa}.{Method}(loadMask, ({Op1BaseType}*)_dataTable.inArrayPtr); + + Unsafe.Write(_dataTable.outArray1Ptr, test._fld1); + Unsafe.Write(_dataTable.outArray2Ptr, test._fld2); + ValidateZeroResult(_dataTable.outArray1Ptr, _dataTable.outArray2Ptr, _dataTable.inArrayPtr); + } + + public void RunStructLclFldScenario_NonFaulting() + { + TestLibrary.TestFramework.BeginScenario(nameof(RunStructLclFldScenario_NonFaulting)); + + //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable + {Op1VectorType}<{Op1BaseType}> loadTrueMask = Sve.CreateTrueMask{RetBaseType}(SveMaskPattern.All); + {Op1VectorType}<{Op1BaseType}> loadFalseMask = Sve.CreateFalseMask{RetBaseType}(); + + var test = TestStruct.Create(); + (test._fld1, test._fld2) = {Isa}.{Method}(loadTrueMask, ({Op1BaseType}*)_dataTable.inArrayPtr); + + try + { + (test._fld1, test._fld2) = {Isa}.{Method}(loadFalseMask, default); + + Unsafe.Write(_dataTable.outArray1Ptr, test._fld1); + Unsafe.Write(_dataTable.outArray2Ptr, test._fld2); + ValidateZeroResult(_dataTable.outArray1Ptr, _dataTable.outArray2Ptr, _dataTable.inArrayPtr); + } + catch + { + Succeeded = false; + } + } + public void RunStructFldScenario() { TestLibrary.TestFramework.BeginScenario(nameof(RunStructFldScenario)); @@ -221,6 +417,29 @@ namespace JIT.HardwareIntrinsics.Arm test.RunStructFldScenario(this); } + public void RunStructFldScenario_FalseMask() + { + TestLibrary.TestFramework.BeginScenario(nameof(RunStructFldScenario_FalseMask)); + + var test = TestStruct.Create(); + test.RunStructFldScenario_FalseMask(this); + } + + public void RunStructFldScenario_NonFaulting() + { + TestLibrary.TestFramework.BeginScenario(nameof(RunStructFldScenario_NonFaulting)); + + try + { + var test = TestStruct.Create(); + test.RunStructFldScenario_NonFaulting(this); + } + catch + { + Succeeded = false; + } + } + public void RunUnsupportedScenario() { TestLibrary.TestFramework.BeginScenario(nameof(RunUnsupportedScenario)); @@ -292,5 +511,56 @@ namespace JIT.HardwareIntrinsics.Arm Succeeded = false; } } + + private void ValidateZeroResult(void* result1, void* result2, void* input, [CallerMemberName] string method = "") + { + {Op1BaseType}[] inArray = new {Op1BaseType}[DestElementCount]; + {Op1BaseType}[] outArray1 = new {Op1BaseType}[OpElementCount]; + {Op1BaseType}[] outArray2 = new {Op1BaseType}[OpElementCount]; + + Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref inArray[0]), ref Unsafe.AsRef(input), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>() * 2); + Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref outArray1[0]), ref Unsafe.AsRef(result1), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>()); + Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref outArray2[0]), ref Unsafe.AsRef(result2), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>()); + + ValidateZeroResult(inArray, outArray1, outArray2, method); + } + + private void ValidateZeroResult({Op1VectorType}<{Op1BaseType}> result1, {Op1VectorType}<{Op1BaseType}> result2, void* input, [CallerMemberName] string method = "") + { + {Op1BaseType}[] inArray = new {Op1BaseType}[DestElementCount]; + {Op1BaseType}[] outArray1 = new {Op1BaseType}[OpElementCount]; + {Op1BaseType}[] outArray2 = new {Op1BaseType}[OpElementCount]; + + Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref inArray[0]), ref Unsafe.AsRef(input), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>() * 2); + Unsafe.WriteUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref outArray1[0]), result1); + Unsafe.WriteUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref outArray2[0]), result2); + + ValidateZeroResult(inArray, outArray1, outArray2, method); + } + + private void ValidateZeroResult({Op1BaseType}[] input, {Op1BaseType}[] result1, {Op1BaseType}[] result2, [CallerMemberName] string method = "") + { + bool succeeded = true; + + for (int i = 0; i < OpElementCount; i++) + { + if (result1[i] != 0 || result2[i] != 0) + { + succeeded = false; + break; + } + } + + if (!succeeded) + { + TestLibrary.TestFramework.LogInformation($"{nameof({Isa})}.{nameof({Isa}.{Method})}({Op1VectorType}<{Op1BaseType}>): {Method} failed:"); + TestLibrary.TestFramework.LogInformation($" input: ({string.Join(", ", input)})"); + TestLibrary.TestFramework.LogInformation($" result1: ({string.Join(", ", result1)})"); + TestLibrary.TestFramework.LogInformation($" result2: ({string.Join(", ", result2)})"); + TestLibrary.TestFramework.LogInformation(string.Empty); + + Succeeded = false; + } + } } } \ No newline at end of file diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoad3xVectorAndUnzipTest.template b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoad3xVectorAndUnzipTest.template index 1d567ff555bdae..a1314f89a657da 100644 --- a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoad3xVectorAndUnzipTest.template +++ b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoad3xVectorAndUnzipTest.template @@ -28,18 +28,28 @@ namespace JIT.HardwareIntrinsics.Arm { // Validates basic functionality works test.RunBasicScenario(); + test.RunBasicScenario_FalseMask(); + test.RunBasicScenario_NonFaulting(); // Validates calling via reflection works test.RunReflectionScenario(); + test.RunReflectionScenario_FalseMask(); + test.RunReflectionScenario_NonFaulting(); // Validates passing an instance member of a class works test.RunClassFldScenario(); + test.RunClassFldScenario_FalseMask(); + test.RunClassFldScenario_NonFaulting(); // Validates passing the field of a local struct works test.RunStructLclFldScenario(); + test.RunStructLclFldScenario_FalseMask(); + test.RunStructLclFldScenario_NonFaulting(); // Validates passing an instance member of a struct works test.RunStructFldScenario(); + test.RunStructFldScenario_FalseMask(); + test.RunStructFldScenario_NonFaulting(); } else { @@ -136,6 +146,28 @@ namespace JIT.HardwareIntrinsics.Arm testClass.ValidateResult(_fld1, _fld2, _fld3, testClass._dataTable.inArrayPtr); } + + public void RunStructFldScenario_FalseMask({TestName}Test testClass) + { + //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable + {Op1VectorType}<{Op1BaseType}> loadMask = Sve.CreateFalseMask{RetBaseType}(); + + (_fld1, _fld2, _fld3) = {Isa}.{Method}(loadMask, ({Op1BaseType}*)testClass._dataTable.inArrayPtr); + + testClass.ValidateZeroResult(_fld1, _fld2, _fld3, testClass._dataTable.inArrayPtr); + } + + public void RunStructFldScenario_NonFaulting({TestName}Test testClass) + { + //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable + {Op1VectorType}<{Op1BaseType}> loadTrueMask = Sve.CreateTrueMask{RetBaseType}(SveMaskPattern.All); + {Op1VectorType}<{Op1BaseType}> loadFalseMask = Sve.CreateFalseMask{RetBaseType}(); + + (_fld1, _fld2, _fld3) = {Isa}.{Method}(loadTrueMask, ({Op1BaseType}*)testClass._dataTable.inArrayPtr); + (_fld1, _fld2, _fld3) = {Isa}.{Method}(loadFalseMask, default); + + testClass.ValidateZeroResult(_fld1, _fld2, _fld3, testClass._dataTable.inArrayPtr); + } } private static readonly int LargestVectorSize = {LargestVectorSize}; @@ -177,6 +209,46 @@ namespace JIT.HardwareIntrinsics.Arm ValidateResult(_dataTable.outArray1Ptr, _dataTable.outArray2Ptr, _dataTable.outArray3Ptr, _dataTable.inArrayPtr); } + public void RunBasicScenario_FalseMask() + { + TestLibrary.TestFramework.BeginScenario(nameof(RunBasicScenario_FalseMask)); + + //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable + {Op1VectorType}<{Op1BaseType}> loadMask = Sve.CreateFalseMask{RetBaseType}(); + + var result = {Isa}.{Method}(loadMask, ({Op1BaseType}*)(_dataTable.inArrayPtr)); + + Unsafe.Write(_dataTable.outArray1Ptr, result.Item1); + Unsafe.Write(_dataTable.outArray2Ptr, result.Item2); + Unsafe.Write(_dataTable.outArray3Ptr, result.Item3); + ValidateZeroResult(_dataTable.outArray1Ptr, _dataTable.outArray2Ptr, _dataTable.outArray3Ptr, _dataTable.inArrayPtr); + } + + public void RunBasicScenario_NonFaulting() + { + TestLibrary.TestFramework.BeginScenario(nameof(RunBasicScenario_NonFaulting)); + + //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable + {Op1VectorType}<{Op1BaseType}> loadTrueMask = Sve.CreateTrueMask{RetBaseType}(SveMaskPattern.All); + {Op1VectorType}<{Op1BaseType}> loadFalseMask = Sve.CreateFalseMask{RetBaseType}(); + + var result = {Isa}.{Method}(loadTrueMask, ({Op1BaseType}*)(_dataTable.inArrayPtr)); + + try + { + result = {Isa}.{Method}(loadFalseMask, default); + + Unsafe.Write(_dataTable.outArray1Ptr, result.Item1); + Unsafe.Write(_dataTable.outArray2Ptr, result.Item2); + Unsafe.Write(_dataTable.outArray3Ptr, result.Item3); + ValidateZeroResult(_dataTable.outArray1Ptr, _dataTable.outArray2Ptr, _dataTable.outArray3Ptr, _dataTable.inArrayPtr); + } + catch + { + Succeeded = false; + } + } + public void RunReflectionScenario() { TestLibrary.TestFramework.BeginScenario(nameof(RunReflectionScenario)); @@ -197,6 +269,60 @@ namespace JIT.HardwareIntrinsics.Arm ValidateResult(_dataTable.outArray1Ptr, _dataTable.outArray2Ptr, _dataTable.outArray3Ptr, _dataTable.inArrayPtr); } + public void RunReflectionScenario_FalseMask() + { + TestLibrary.TestFramework.BeginScenario(nameof(RunReflectionScenario_FalseMask)); + + //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable + {Op1VectorType}<{Op1BaseType}> loadMask = Sve.CreateFalseMask{RetBaseType}(); + + var result = typeof({Isa}).GetMethod(nameof({Isa}.{Method}), new Type[] { typeof(Vector<{Op1BaseType}>), typeof({Op1BaseType}*) }) + .Invoke(null, new object[] { + loadMask, + Pointer.Box(_dataTable.inArrayPtr, typeof({Op1BaseType}*)) + }); + + var output = (({Op1VectorType}<{Op1BaseType}>,{Op1VectorType}<{Op1BaseType}>,{Op1VectorType}<{Op1BaseType}>))result; + Unsafe.Write(_dataTable.outArray1Ptr, output.Item1); + Unsafe.Write(_dataTable.outArray2Ptr, output.Item2); + Unsafe.Write(_dataTable.outArray3Ptr, output.Item3); + ValidateZeroResult(_dataTable.outArray1Ptr, _dataTable.outArray2Ptr, _dataTable.outArray3Ptr, _dataTable.inArrayPtr); + } + + public void RunReflectionScenario_NonFaulting() + { + TestLibrary.TestFramework.BeginScenario(nameof(RunReflectionScenario_NonFaulting)); + + //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable + {Op1VectorType}<{Op1BaseType}> loadTrueMask = Sve.CreateTrueMask{RetBaseType}(SveMaskPattern.All); + {Op1VectorType}<{Op1BaseType}> loadFalseMask = Sve.CreateFalseMask{RetBaseType}(); + + var result = typeof({Isa}).GetMethod(nameof({Isa}.{Method}), new Type[] { typeof(Vector<{Op1BaseType}>), typeof({Op1BaseType}*) }) + .Invoke(null, new object[] { + loadTrueMask, + Pointer.Box(_dataTable.inArrayPtr, typeof({Op1BaseType}*)) + }); + + try + { + result = typeof({Isa}).GetMethod(nameof({Isa}.{Method}), new Type[] { typeof(Vector<{Op1BaseType}>), typeof({Op1BaseType}*) }) + .Invoke(null, new object[] { + loadFalseMask, + Pointer.Box(default, typeof({Op1BaseType}*)) + }); + + var output = (({Op1VectorType}<{Op1BaseType}>,{Op1VectorType}<{Op1BaseType}>,{Op1VectorType}<{Op1BaseType}>))result; + Unsafe.Write(_dataTable.outArray1Ptr, output.Item1); + Unsafe.Write(_dataTable.outArray2Ptr, output.Item2); + Unsafe.Write(_dataTable.outArray3Ptr, output.Item3); + ValidateZeroResult(_dataTable.outArray1Ptr, _dataTable.outArray2Ptr, _dataTable.outArray3Ptr, _dataTable.inArrayPtr); + } + catch + { + Succeeded = false; + } + } + public void RunClassFldScenario() { TestLibrary.TestFramework.BeginScenario(nameof(RunClassFldScenario)); @@ -209,6 +335,40 @@ namespace JIT.HardwareIntrinsics.Arm ValidateResult(_fld1, _fld2, _fld3, _dataTable.inArrayPtr); } + public void RunClassFldScenario_FalseMask() + { + TestLibrary.TestFramework.BeginScenario(nameof(RunClassFldScenario_FalseMask)); + + //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable + {Op1VectorType}<{Op1BaseType}> loadMask = Sve.CreateFalseMask{RetBaseType}(); + + (_fld1, _fld2, _fld3) = {Isa}.{Method}(loadMask, ({Op1BaseType}*)_dataTable.inArrayPtr); + + ValidateZeroResult(_fld1, _fld2, _fld3, _dataTable.inArrayPtr); + } + + public void RunClassFldScenario_NonFaulting() + { + TestLibrary.TestFramework.BeginScenario(nameof(RunClassFldScenario_NonFaulting)); + + //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable + {Op1VectorType}<{Op1BaseType}> loadTrueMask = Sve.CreateTrueMask{RetBaseType}(SveMaskPattern.All); + {Op1VectorType}<{Op1BaseType}> loadFalseMask = Sve.CreateFalseMask{RetBaseType}(); + + (_fld1, _fld2, _fld3) = {Isa}.{Method}(loadTrueMask, ({Op1BaseType}*)_dataTable.inArrayPtr); + + try + { + (_fld1, _fld2, _fld3) = {Isa}.{Method}(loadFalseMask, default); + + ValidateZeroResult(_fld1, _fld2, _fld3, _dataTable.inArrayPtr); + } + catch + { + Succeeded = false; + } + } + public void RunStructLclFldScenario() { TestLibrary.TestFramework.BeginScenario(nameof(RunStructLclFldScenario)); @@ -225,6 +385,48 @@ namespace JIT.HardwareIntrinsics.Arm ValidateResult(_dataTable.outArray1Ptr, _dataTable.outArray2Ptr, _dataTable.outArray3Ptr, _dataTable.inArrayPtr); } + public void RunStructLclFldScenario_FalseMask() + { + TestLibrary.TestFramework.BeginScenario(nameof(RunStructLclFldScenario_FalseMask)); + + //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable + {Op1VectorType}<{Op1BaseType}> loadMask = Sve.CreateFalseMask{RetBaseType}(); + + var test = TestStruct.Create(); + (test._fld1, test._fld2, test._fld3) = {Isa}.{Method}(loadMask, ({Op1BaseType}*)_dataTable.inArrayPtr); + + Unsafe.Write(_dataTable.outArray1Ptr, test._fld1); + Unsafe.Write(_dataTable.outArray2Ptr, test._fld2); + Unsafe.Write(_dataTable.outArray3Ptr, test._fld3); + ValidateZeroResult(_dataTable.outArray1Ptr, _dataTable.outArray2Ptr, _dataTable.outArray3Ptr, _dataTable.inArrayPtr); + } + + public void RunStructLclFldScenario_NonFaulting() + { + TestLibrary.TestFramework.BeginScenario(nameof(RunStructLclFldScenario_NonFaulting)); + + //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable + {Op1VectorType}<{Op1BaseType}> loadTrueMask = Sve.CreateTrueMask{RetBaseType}(SveMaskPattern.All); + {Op1VectorType}<{Op1BaseType}> loadFalseMask = Sve.CreateFalseMask{RetBaseType}(); + + var test = TestStruct.Create(); + (test._fld1, test._fld2, test._fld3) = {Isa}.{Method}(loadTrueMask, ({Op1BaseType}*)_dataTable.inArrayPtr); + + try + { + (test._fld1, test._fld2, test._fld3) = {Isa}.{Method}(loadFalseMask, default); + + Unsafe.Write(_dataTable.outArray1Ptr, test._fld1); + Unsafe.Write(_dataTable.outArray2Ptr, test._fld2); + Unsafe.Write(_dataTable.outArray3Ptr, test._fld3); + ValidateZeroResult(_dataTable.outArray1Ptr, _dataTable.outArray2Ptr, _dataTable.outArray3Ptr, _dataTable.inArrayPtr); + } + catch + { + Succeeded = false; + } + } + public void RunStructFldScenario() { TestLibrary.TestFramework.BeginScenario(nameof(RunStructFldScenario)); @@ -233,6 +435,29 @@ namespace JIT.HardwareIntrinsics.Arm test.RunStructFldScenario(this); } + public void RunStructFldScenario_FalseMask() + { + TestLibrary.TestFramework.BeginScenario(nameof(RunStructFldScenario_FalseMask)); + + var test = TestStruct.Create(); + test.RunStructFldScenario_FalseMask(this); + } + + public void RunStructFldScenario_NonFaulting() + { + TestLibrary.TestFramework.BeginScenario(nameof(RunStructFldScenario_NonFaulting)); + + try + { + var test = TestStruct.Create(); + test.RunStructFldScenario_NonFaulting(this); + } + catch + { + Succeeded = false; + } + } + public void RunUnsupportedScenario() { TestLibrary.TestFramework.BeginScenario(nameof(RunUnsupportedScenario)); @@ -309,5 +534,61 @@ namespace JIT.HardwareIntrinsics.Arm Succeeded = false; } } + + private void ValidateZeroResult(void* result1, void* result2, void* result3, void* input, [CallerMemberName] string method = "") + { + {Op1BaseType}[] inArray = new {Op1BaseType}[DestElementCount]; + {Op1BaseType}[] outArray1 = new {Op1BaseType}[OpElementCount]; + {Op1BaseType}[] outArray2 = new {Op1BaseType}[OpElementCount]; + {Op1BaseType}[] outArray3 = new {Op1BaseType}[OpElementCount]; + + Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref inArray[0]), ref Unsafe.AsRef(input), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>() * 3); + Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref outArray1[0]), ref Unsafe.AsRef(result1), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>()); + Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref outArray2[0]), ref Unsafe.AsRef(result2), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>()); + Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref outArray3[0]), ref Unsafe.AsRef(result3), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>()); + + ValidateZeroResult(inArray, outArray1, outArray2, outArray3, method); + } + + private void ValidateZeroResult({Op1VectorType}<{Op1BaseType}> result1, {Op1VectorType}<{Op1BaseType}> result2, {Op1VectorType}<{Op1BaseType}> result3, void* input, [CallerMemberName] string method = "") + { + {Op1BaseType}[] inArray = new {Op1BaseType}[DestElementCount]; + {Op1BaseType}[] outArray1 = new {Op1BaseType}[OpElementCount]; + {Op1BaseType}[] outArray2 = new {Op1BaseType}[OpElementCount]; + {Op1BaseType}[] outArray3 = new {Op1BaseType}[OpElementCount]; + + Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref inArray[0]), ref Unsafe.AsRef(input), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>() * 3); + Unsafe.WriteUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref outArray1[0]), result1); + Unsafe.WriteUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref outArray2[0]), result2); + Unsafe.WriteUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref outArray3[0]), result3); + + ValidateZeroResult(inArray, outArray1, outArray2, outArray3, method); + } + + private void ValidateZeroResult({Op1BaseType}[] input, {Op1BaseType}[] result1, {Op1BaseType}[] result2, {Op1BaseType}[] result3, [CallerMemberName] string method = "") + { + bool succeeded = true; + + for (int i = 0; i < OpElementCount; i++) + { + if (result1[i] != 0 || result2[i] != 0 || result3[i] != 0) + { + succeeded = false; + break; + } + } + + if (!succeeded) + { + TestLibrary.TestFramework.LogInformation($"{nameof({Isa})}.{nameof({Isa}.{Method})}({Op1VectorType}<{Op1BaseType}>): {Method} failed:"); + TestLibrary.TestFramework.LogInformation($" input: ({string.Join(", ", input)})"); + TestLibrary.TestFramework.LogInformation($" result1: ({string.Join(", ", result1)})"); + TestLibrary.TestFramework.LogInformation($" result2: ({string.Join(", ", result2)})"); + TestLibrary.TestFramework.LogInformation($" result3: ({string.Join(", ", result3)})"); + TestLibrary.TestFramework.LogInformation(string.Empty); + + Succeeded = false; + } + } } } \ No newline at end of file diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoad4xVectorAndUnzipTest.template b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoad4xVectorAndUnzipTest.template index 078fdaa1593803..57db947dabd635 100644 --- a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoad4xVectorAndUnzipTest.template +++ b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoad4xVectorAndUnzipTest.template @@ -28,18 +28,28 @@ namespace JIT.HardwareIntrinsics.Arm { // Validates basic functionality works test.RunBasicScenario(); + test.RunBasicScenario_FalseMask(); + test.RunBasicScenario_NonFaulting(); // Validates calling via reflection works test.RunReflectionScenario(); + test.RunReflectionScenario_FalseMask(); + test.RunReflectionScenario_NonFaulting(); // Validates passing an instance member of a class works test.RunClassFldScenario(); + test.RunClassFldScenario_FalseMask(); + test.RunClassFldScenario_NonFaulting(); // Validates passing the field of a local struct works test.RunStructLclFldScenario(); + test.RunStructLclFldScenario_FalseMask(); + test.RunStructLclFldScenario_NonFaulting(); // Validates passing an instance member of a struct works test.RunStructFldScenario(); + test.RunStructFldScenario_FalseMask(); + test.RunStructFldScenario_NonFaulting(); } else { @@ -144,6 +154,28 @@ namespace JIT.HardwareIntrinsics.Arm testClass.ValidateResult(_fld1, _fld2, _fld3, _fld4, testClass._dataTable.inArrayPtr); } + + public void RunStructFldScenario_FalseMask({TestName}Test testClass) + { + //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable + {Op1VectorType}<{Op1BaseType}> loadMask = Sve.CreateFalseMask{RetBaseType}(); + + (_fld1, _fld2, _fld3, _fld4) = {Isa}.{Method}(loadMask, ({Op1BaseType}*)testClass._dataTable.inArrayPtr); + + testClass.ValidateZeroResult(_fld1, _fld2, _fld3, _fld4, testClass._dataTable.inArrayPtr); + } + + public void RunStructFldScenario_NonFaulting({TestName}Test testClass) + { + //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable + {Op1VectorType}<{Op1BaseType}> loadTrueMask = Sve.CreateTrueMask{RetBaseType}(SveMaskPattern.All); + {Op1VectorType}<{Op1BaseType}> loadFalseMask = Sve.CreateFalseMask{RetBaseType}(); + + (_fld1, _fld2, _fld3, _fld4) = {Isa}.{Method}(loadTrueMask, ({Op1BaseType}*)testClass._dataTable.inArrayPtr); + (_fld1, _fld2, _fld3, _fld4) = {Isa}.{Method}(loadFalseMask, default); + + testClass.ValidateZeroResult(_fld1, _fld2, _fld3, _fld4, testClass._dataTable.inArrayPtr); + } } private static readonly int LargestVectorSize = {LargestVectorSize}; @@ -187,6 +219,48 @@ namespace JIT.HardwareIntrinsics.Arm ValidateResult(_dataTable.outArray1Ptr, _dataTable.outArray2Ptr, _dataTable.outArray3Ptr, _dataTable.outArray4Ptr, _dataTable.inArrayPtr); } + public void RunBasicScenario_FalseMask() + { + TestLibrary.TestFramework.BeginScenario(nameof(RunBasicScenario_FalseMask)); + + //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable + {Op1VectorType}<{Op1BaseType}> loadMask = Sve.CreateFalseMask{RetBaseType}(); + + var result = {Isa}.{Method}(loadMask, ({Op1BaseType}*)(_dataTable.inArrayPtr)); + + Unsafe.Write(_dataTable.outArray1Ptr, result.Item1); + Unsafe.Write(_dataTable.outArray2Ptr, result.Item2); + Unsafe.Write(_dataTable.outArray3Ptr, result.Item3); + Unsafe.Write(_dataTable.outArray4Ptr, result.Item4); + ValidateZeroResult(_dataTable.outArray1Ptr, _dataTable.outArray2Ptr, _dataTable.outArray3Ptr, _dataTable.outArray4Ptr, _dataTable.inArrayPtr); + } + + public void RunBasicScenario_NonFaulting() + { + TestLibrary.TestFramework.BeginScenario(nameof(RunBasicScenario_NonFaulting)); + + //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable + {Op1VectorType}<{Op1BaseType}> loadTrueMask = Sve.CreateTrueMask{RetBaseType}(SveMaskPattern.All); + {Op1VectorType}<{Op1BaseType}> loadFalseMask = Sve.CreateFalseMask{RetBaseType}(); + + var result = {Isa}.{Method}(loadTrueMask, ({Op1BaseType}*)(_dataTable.inArrayPtr)); + + try + { + result = {Isa}.{Method}(loadFalseMask, default); + + Unsafe.Write(_dataTable.outArray1Ptr, result.Item1); + Unsafe.Write(_dataTable.outArray2Ptr, result.Item2); + Unsafe.Write(_dataTable.outArray3Ptr, result.Item3); + Unsafe.Write(_dataTable.outArray4Ptr, result.Item4); + ValidateZeroResult(_dataTable.outArray1Ptr, _dataTable.outArray2Ptr, _dataTable.outArray3Ptr, _dataTable.outArray4Ptr, _dataTable.inArrayPtr); + } + catch + { + Succeeded = false; + } + } + public void RunReflectionScenario() { TestLibrary.TestFramework.BeginScenario(nameof(RunReflectionScenario)); @@ -208,6 +282,62 @@ namespace JIT.HardwareIntrinsics.Arm ValidateResult(_dataTable.outArray1Ptr, _dataTable.outArray2Ptr, _dataTable.outArray3Ptr, _dataTable.outArray4Ptr, _dataTable.inArrayPtr); } + public void RunReflectionScenario_FalseMask() + { + TestLibrary.TestFramework.BeginScenario(nameof(RunReflectionScenario_FalseMask)); + + //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable + {Op1VectorType}<{Op1BaseType}> loadMask = Sve.CreateFalseMask{RetBaseType}(); + + var result = typeof({Isa}).GetMethod(nameof({Isa}.{Method}), new Type[] { typeof(Vector<{Op1BaseType}>), typeof({Op1BaseType}*) }) + .Invoke(null, new object[] { + loadMask, + Pointer.Box(_dataTable.inArrayPtr, typeof({Op1BaseType}*)) + }); + + var output = (({Op1VectorType}<{Op1BaseType}>,{Op1VectorType}<{Op1BaseType}>,{Op1VectorType}<{Op1BaseType}>,{Op1VectorType}<{Op1BaseType}>))result; + Unsafe.Write(_dataTable.outArray1Ptr, output.Item1); + Unsafe.Write(_dataTable.outArray2Ptr, output.Item2); + Unsafe.Write(_dataTable.outArray3Ptr, output.Item3); + Unsafe.Write(_dataTable.outArray4Ptr, output.Item4); + ValidateZeroResult(_dataTable.outArray1Ptr, _dataTable.outArray2Ptr, _dataTable.outArray3Ptr, _dataTable.outArray4Ptr, _dataTable.inArrayPtr); + } + + public void RunReflectionScenario_NonFaulting() + { + TestLibrary.TestFramework.BeginScenario(nameof(RunReflectionScenario_NonFaulting)); + + //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable + {Op1VectorType}<{Op1BaseType}> loadTrueMask = Sve.CreateTrueMask{RetBaseType}(SveMaskPattern.All); + {Op1VectorType}<{Op1BaseType}> loadFalseMask = Sve.CreateFalseMask{RetBaseType}(); + + var result = typeof({Isa}).GetMethod(nameof({Isa}.{Method}), new Type[] { typeof(Vector<{Op1BaseType}>), typeof({Op1BaseType}*) }) + .Invoke(null, new object[] { + loadTrueMask, + Pointer.Box(_dataTable.inArrayPtr, typeof({Op1BaseType}*)) + }); + + try + { + result = typeof({Isa}).GetMethod(nameof({Isa}.{Method}), new Type[] { typeof(Vector<{Op1BaseType}>), typeof({Op1BaseType}*) }) + .Invoke(null, new object[] { + loadFalseMask, + Pointer.Box(default, typeof({Op1BaseType}*)) + }); + + var output = (({Op1VectorType}<{Op1BaseType}>,{Op1VectorType}<{Op1BaseType}>,{Op1VectorType}<{Op1BaseType}>,{Op1VectorType}<{Op1BaseType}>))result; + Unsafe.Write(_dataTable.outArray1Ptr, output.Item1); + Unsafe.Write(_dataTable.outArray2Ptr, output.Item2); + Unsafe.Write(_dataTable.outArray3Ptr, output.Item3); + Unsafe.Write(_dataTable.outArray4Ptr, output.Item4); + ValidateZeroResult(_dataTable.outArray1Ptr, _dataTable.outArray2Ptr, _dataTable.outArray3Ptr, _dataTable.outArray4Ptr, _dataTable.inArrayPtr); + } + catch + { + Succeeded = false; + } + } + public void RunClassFldScenario() { TestLibrary.TestFramework.BeginScenario(nameof(RunClassFldScenario)); @@ -220,6 +350,84 @@ namespace JIT.HardwareIntrinsics.Arm ValidateResult(_fld1, _fld2, _fld3, _fld4, _dataTable.inArrayPtr); } + public void RunClassFldScenario_FalseMask() + { + TestLibrary.TestFramework.BeginScenario(nameof(RunClassFldScenario_FalseMask)); + + //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable + {Op1VectorType}<{Op1BaseType}> loadMask = Sve.CreateFalseMask{RetBaseType}(); + + (_fld1, _fld2, _fld3, _fld4) = {Isa}.{Method}(loadMask, ({Op1BaseType}*)_dataTable.inArrayPtr); + + ValidateZeroResult(_fld1, _fld2, _fld3, _fld4, _dataTable.inArrayPtr); + } + + public void RunClassFldScenario_NonFaulting() + { + TestLibrary.TestFramework.BeginScenario(nameof(RunClassFldScenario_NonFaulting)); + + //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable + {Op1VectorType}<{Op1BaseType}> loadTrueMask = Sve.CreateTrueMask{RetBaseType}(SveMaskPattern.All); + {Op1VectorType}<{Op1BaseType}> loadFalseMask = Sve.CreateFalseMask{RetBaseType}(); + + (_fld1, _fld2, _fld3, _fld4) = {Isa}.{Method}(loadTrueMask, ({Op1BaseType}*)_dataTable.inArrayPtr); + + try + { + (_fld1, _fld2, _fld3, _fld4) = {Isa}.{Method}(loadFalseMask, default); + + ValidateZeroResult(_fld1, _fld2, _fld3, _fld4, _dataTable.inArrayPtr); + } + catch + { + Succeeded = false; + } + } + + public void RunStructLclFldScenario_FalseMask() + { + TestLibrary.TestFramework.BeginScenario(nameof(RunStructLclFldScenario_FalseMask)); + + //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable + {Op1VectorType}<{Op1BaseType}> loadMask = Sve.CreateFalseMask{RetBaseType}(); + + var test = TestStruct.Create(); + (test._fld1, test._fld2, test._fld3, test._fld4) = {Isa}.{Method}(loadMask, ({Op1BaseType}*)_dataTable.inArrayPtr); + + Unsafe.Write(_dataTable.outArray1Ptr, test._fld1); + Unsafe.Write(_dataTable.outArray2Ptr, test._fld2); + Unsafe.Write(_dataTable.outArray3Ptr, test._fld3); + Unsafe.Write(_dataTable.outArray4Ptr, test._fld4); + ValidateZeroResult(_dataTable.outArray1Ptr, _dataTable.outArray2Ptr, _dataTable.outArray3Ptr, _dataTable.outArray4Ptr, _dataTable.inArrayPtr); + } + + public void RunStructLclFldScenario_NonFaulting() + { + TestLibrary.TestFramework.BeginScenario(nameof(RunStructLclFldScenario_NonFaulting)); + + //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable + {Op1VectorType}<{Op1BaseType}> loadTrueMask = Sve.CreateTrueMask{RetBaseType}(SveMaskPattern.All); + {Op1VectorType}<{Op1BaseType}> loadFalseMask = Sve.CreateFalseMask{RetBaseType}(); + + var test = TestStruct.Create(); + (test._fld1, test._fld2, test._fld3, test._fld4) = {Isa}.{Method}(loadTrueMask, ({Op1BaseType}*)_dataTable.inArrayPtr); + + try + { + (test._fld1, test._fld2, test._fld3, test._fld4) = {Isa}.{Method}(loadFalseMask, default); + + Unsafe.Write(_dataTable.outArray1Ptr, test._fld1); + Unsafe.Write(_dataTable.outArray2Ptr, test._fld2); + Unsafe.Write(_dataTable.outArray3Ptr, test._fld3); + Unsafe.Write(_dataTable.outArray4Ptr, test._fld4); + ValidateZeroResult(_dataTable.outArray1Ptr, _dataTable.outArray2Ptr, _dataTable.outArray3Ptr, _dataTable.outArray4Ptr, _dataTable.inArrayPtr); + } + catch + { + Succeeded = false; + } + } + public void RunStructLclFldScenario() { TestLibrary.TestFramework.BeginScenario(nameof(RunStructLclFldScenario)); @@ -245,6 +453,29 @@ namespace JIT.HardwareIntrinsics.Arm test.RunStructFldScenario(this); } + public void RunStructFldScenario_FalseMask() + { + TestLibrary.TestFramework.BeginScenario(nameof(RunStructFldScenario_FalseMask)); + + var test = TestStruct.Create(); + test.RunStructFldScenario_FalseMask(this); + } + + public void RunStructFldScenario_NonFaulting() + { + TestLibrary.TestFramework.BeginScenario(nameof(RunStructFldScenario_NonFaulting)); + + try + { + var test = TestStruct.Create(); + test.RunStructFldScenario_NonFaulting(this); + } + catch + { + Succeeded = false; + } + } + public void RunUnsupportedScenario() { TestLibrary.TestFramework.BeginScenario(nameof(RunUnsupportedScenario)); @@ -326,5 +557,66 @@ namespace JIT.HardwareIntrinsics.Arm Succeeded = false; } } + + private void ValidateZeroResult(void* result1, void* result2, void* result3, void* result4, void* input, [CallerMemberName] string method = "") + { + {Op1BaseType}[] inArray = new {Op1BaseType}[DestElementCount]; + {Op1BaseType}[] outArray1 = new {Op1BaseType}[OpElementCount]; + {Op1BaseType}[] outArray2 = new {Op1BaseType}[OpElementCount]; + {Op1BaseType}[] outArray3 = new {Op1BaseType}[OpElementCount]; + {Op1BaseType}[] outArray4 = new {Op1BaseType}[OpElementCount]; + + Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref inArray[0]), ref Unsafe.AsRef(input), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>() * 4); + Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref outArray1[0]), ref Unsafe.AsRef(result1), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>()); + Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref outArray2[0]), ref Unsafe.AsRef(result2), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>()); + Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref outArray3[0]), ref Unsafe.AsRef(result3), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>()); + Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref outArray4[0]), ref Unsafe.AsRef(result4), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>()); + + ValidateZeroResult(inArray, outArray1, outArray2, outArray3, outArray4, method); + } + + private void ValidateZeroResult({Op1VectorType}<{Op1BaseType}> result1, {Op1VectorType}<{Op1BaseType}> result2, {Op1VectorType}<{Op1BaseType}> result3, {Op1VectorType}<{Op1BaseType}> result4, void* input, [CallerMemberName] string method = "") + { + {Op1BaseType}[] inArray = new {Op1BaseType}[DestElementCount]; + {Op1BaseType}[] outArray1 = new {Op1BaseType}[OpElementCount]; + {Op1BaseType}[] outArray2 = new {Op1BaseType}[OpElementCount]; + {Op1BaseType}[] outArray3 = new {Op1BaseType}[OpElementCount]; + {Op1BaseType}[] outArray4 = new {Op1BaseType}[OpElementCount]; + + Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref inArray[0]), ref Unsafe.AsRef(input), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>() * 4); + Unsafe.WriteUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref outArray1[0]), result1); + Unsafe.WriteUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref outArray2[0]), result2); + Unsafe.WriteUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref outArray3[0]), result3); + Unsafe.WriteUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref outArray4[0]), result4); + + ValidateZeroResult(inArray, outArray1, outArray2, outArray3, outArray4, method); + } + + private void ValidateZeroResult({Op1BaseType}[] input, {Op1BaseType}[] result1, {Op1BaseType}[] result2, {Op1BaseType}[] result3, {Op1BaseType}[] result4, [CallerMemberName] string method = "") + { + bool succeeded = true; + + for (int i = 0; i < OpElementCount; i++) + { + if (result1[i] != 0 || result2[i] != 0 || result3[i] != 0 || result4[i] != 0) + { + succeeded = false; + break; + } + } + + if (!succeeded) + { + TestLibrary.TestFramework.LogInformation($"{nameof({Isa})}.{nameof({Isa}.{Method})}({Op1VectorType}<{Op1BaseType}>): {Method} failed:"); + TestLibrary.TestFramework.LogInformation($" input: ({string.Join(", ", input)})"); + TestLibrary.TestFramework.LogInformation($" result1: ({string.Join(", ", result1)})"); + TestLibrary.TestFramework.LogInformation($" result2: ({string.Join(", ", result2)})"); + TestLibrary.TestFramework.LogInformation($" result3: ({string.Join(", ", result3)})"); + TestLibrary.TestFramework.LogInformation($" result4: ({string.Join(", ", result4)})"); + TestLibrary.TestFramework.LogInformation(string.Empty); + + Succeeded = false; + } + } } } \ No newline at end of file From d36b6538b639f4bde4cba980c279d5fc21cd9b59 Mon Sep 17 00:00:00 2001 From: TIHan Date: Tue, 28 May 2024 13:32:16 -0700 Subject: [PATCH 22/22] Feedback --- src/coreclr/jit/emitarm64sve.cpp | 12 -- src/coreclr/jit/hwintrinsiccodegenarm64.cpp | 20 ++ src/coreclr/jit/hwintrinsiclistarm64sve.h | 6 +- .../SveLoad2xVectorAndUnzipTest.template | 179 ----------------- .../SveLoad3xVectorAndUnzipTest.template | 183 ----------------- .../SveLoad4xVectorAndUnzipTest.template | 187 ------------------ 6 files changed, 23 insertions(+), 564 deletions(-) diff --git a/src/coreclr/jit/emitarm64sve.cpp b/src/coreclr/jit/emitarm64sve.cpp index d0568a701e3c70..80f1d55e97fd2d 100644 --- a/src/coreclr/jit/emitarm64sve.cpp +++ b/src/coreclr/jit/emitarm64sve.cpp @@ -4383,18 +4383,6 @@ void emitter::emitInsSve_R_R_R(instruction ins, case INS_sve_ld1w: case INS_sve_ld1sw: case INS_sve_ld1d: - case INS_sve_ld2b: - case INS_sve_ld2h: - case INS_sve_ld2w: - case INS_sve_ld2d: - case INS_sve_ld3b: - case INS_sve_ld3h: - case INS_sve_ld3w: - case INS_sve_ld3d: - case INS_sve_ld4b: - case INS_sve_ld4h: - case INS_sve_ld4w: - case INS_sve_ld4d: return emitIns_R_R_R_I(ins, size, reg1, reg2, reg3, 0, opt); default: diff --git a/src/coreclr/jit/hwintrinsiccodegenarm64.cpp b/src/coreclr/jit/hwintrinsiccodegenarm64.cpp index 572b6f24e46cc3..5d94d452a62d59 100644 --- a/src/coreclr/jit/hwintrinsiccodegenarm64.cpp +++ b/src/coreclr/jit/hwintrinsiccodegenarm64.cpp @@ -1356,6 +1356,26 @@ void CodeGen::genHWIntrinsic(GenTreeHWIntrinsic* node) } break; + case NI_Sve_Load2xVectorAndUnzip: + case NI_Sve_Load3xVectorAndUnzip: + case NI_Sve_Load4xVectorAndUnzip: + { +#ifdef DEBUG + // Validates that consecutive registers were used properly. + + assert(node->GetMultiRegCount(compiler) == (unsigned int)GetEmitter()->insGetSveReg1ListSize(ins)); + + regNumber argReg = targetReg; + for (unsigned int i = 0; i < node->GetMultiRegCount(compiler); i++) + { + assert(argReg == node->GetRegNumByIdx(i)); + argReg = getNextSIMDRegWithWraparound(argReg); + } +#endif // DEBUG + GetEmitter()->emitIns_R_R_R_I(ins, emitSize, targetReg, op1Reg, op2Reg, 0, opt); + break; + } + case NI_Sve_StoreAndZipx2: case NI_Sve_StoreAndZipx3: case NI_Sve_StoreAndZipx4: diff --git a/src/coreclr/jit/hwintrinsiclistarm64sve.h b/src/coreclr/jit/hwintrinsiclistarm64sve.h index 1b5ce806fe09b1..a220594a1724b1 100644 --- a/src/coreclr/jit/hwintrinsiclistarm64sve.h +++ b/src/coreclr/jit/hwintrinsiclistarm64sve.h @@ -93,9 +93,9 @@ HARDWARE_INTRINSIC(Sve, LoadVectorUInt16ZeroExtendToUInt32, HARDWARE_INTRINSIC(Sve, LoadVectorUInt16ZeroExtendToUInt64, -1, 2, false, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_ld1h, INS_invalid, INS_invalid}, HW_Category_MemoryLoad, HW_Flag_Scalable|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation) HARDWARE_INTRINSIC(Sve, LoadVectorUInt32ZeroExtendToInt64, -1, 2, false, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_ld1w, INS_invalid, INS_invalid, INS_invalid}, HW_Category_MemoryLoad, HW_Flag_Scalable|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation) HARDWARE_INTRINSIC(Sve, LoadVectorUInt32ZeroExtendToUInt64, -1, 2, false, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_ld1w, INS_invalid, INS_invalid}, HW_Category_MemoryLoad, HW_Flag_Scalable|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation) -HARDWARE_INTRINSIC(Sve, Load2xVectorAndUnzip, -1, 2, true, {INS_sve_ld2b, INS_sve_ld2b, INS_sve_ld2h, INS_sve_ld2h, INS_sve_ld2w, INS_sve_ld2w, INS_sve_ld2d, INS_sve_ld2d, INS_sve_ld2w, INS_sve_ld2d}, HW_Category_MemoryLoad, HW_Flag_Scalable|HW_Flag_SpecialImport|HW_Flag_MultiReg|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation|HW_Flag_NeedsConsecutiveRegisters|HW_Flag_BaseTypeFromFirstArg) -HARDWARE_INTRINSIC(Sve, Load3xVectorAndUnzip, -1, 2, true, {INS_sve_ld3b, INS_sve_ld3b, INS_sve_ld3h, INS_sve_ld3h, INS_sve_ld3w, INS_sve_ld3w, INS_sve_ld3d, INS_sve_ld3d, INS_sve_ld3w, INS_sve_ld3d}, HW_Category_MemoryLoad, HW_Flag_Scalable|HW_Flag_SpecialImport|HW_Flag_MultiReg|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation|HW_Flag_NeedsConsecutiveRegisters|HW_Flag_BaseTypeFromFirstArg) -HARDWARE_INTRINSIC(Sve, Load4xVectorAndUnzip, -1, 2, true, {INS_sve_ld4b, INS_sve_ld4b, INS_sve_ld4h, INS_sve_ld4h, INS_sve_ld4w, INS_sve_ld4w, INS_sve_ld4d, INS_sve_ld4d, INS_sve_ld4w, INS_sve_ld4d}, HW_Category_MemoryLoad, HW_Flag_Scalable|HW_Flag_SpecialImport|HW_Flag_MultiReg|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation|HW_Flag_NeedsConsecutiveRegisters|HW_Flag_BaseTypeFromFirstArg) +HARDWARE_INTRINSIC(Sve, Load2xVectorAndUnzip, -1, 2, true, {INS_sve_ld2b, INS_sve_ld2b, INS_sve_ld2h, INS_sve_ld2h, INS_sve_ld2w, INS_sve_ld2w, INS_sve_ld2d, INS_sve_ld2d, INS_sve_ld2w, INS_sve_ld2d}, HW_Category_MemoryLoad, HW_Flag_Scalable|HW_Flag_SpecialImport|HW_Flag_SpecialCodeGen|HW_Flag_MultiReg|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation|HW_Flag_NeedsConsecutiveRegisters|HW_Flag_BaseTypeFromFirstArg) +HARDWARE_INTRINSIC(Sve, Load3xVectorAndUnzip, -1, 2, true, {INS_sve_ld3b, INS_sve_ld3b, INS_sve_ld3h, INS_sve_ld3h, INS_sve_ld3w, INS_sve_ld3w, INS_sve_ld3d, INS_sve_ld3d, INS_sve_ld3w, INS_sve_ld3d}, HW_Category_MemoryLoad, HW_Flag_Scalable|HW_Flag_SpecialImport|HW_Flag_SpecialCodeGen|HW_Flag_MultiReg|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation|HW_Flag_NeedsConsecutiveRegisters|HW_Flag_BaseTypeFromFirstArg) +HARDWARE_INTRINSIC(Sve, Load4xVectorAndUnzip, -1, 2, true, {INS_sve_ld4b, INS_sve_ld4b, INS_sve_ld4h, INS_sve_ld4h, INS_sve_ld4w, INS_sve_ld4w, INS_sve_ld4d, INS_sve_ld4d, INS_sve_ld4w, INS_sve_ld4d}, HW_Category_MemoryLoad, HW_Flag_Scalable|HW_Flag_SpecialImport|HW_Flag_SpecialCodeGen|HW_Flag_MultiReg|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation|HW_Flag_NeedsConsecutiveRegisters|HW_Flag_BaseTypeFromFirstArg) HARDWARE_INTRINSIC(Sve, Max, -1, -1, false, {INS_sve_smax, INS_sve_umax, INS_sve_smax, INS_sve_umax, INS_sve_smax, INS_sve_umax, INS_sve_smax, INS_sve_umax, INS_sve_fmax, INS_sve_fmax}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_HasRMWSemantics|HW_Flag_LowMaskedOperation) HARDWARE_INTRINSIC(Sve, MaxAcross, -1, -1, false, {INS_sve_smaxv, INS_sve_umaxv, INS_sve_smaxv, INS_sve_umaxv, INS_sve_smaxv, INS_sve_umaxv, INS_sve_smaxv, INS_sve_umaxv, INS_sve_fmaxv, INS_sve_fmaxv}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation) HARDWARE_INTRINSIC(Sve, MaxNumber, -1, -1, false, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_fmaxnm, INS_sve_fmaxnm}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_HasRMWSemantics|HW_Flag_LowMaskedOperation) diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoad2xVectorAndUnzipTest.template b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoad2xVectorAndUnzipTest.template index f31bbf44da061d..089e06915159fc 100644 --- a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoad2xVectorAndUnzipTest.template +++ b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoad2xVectorAndUnzipTest.template @@ -33,23 +33,15 @@ namespace JIT.HardwareIntrinsics.Arm // Validates calling via reflection works test.RunReflectionScenario(); - test.RunReflectionScenario_FalseMask(); - test.RunReflectionScenario_NonFaulting(); // Validates passing an instance member of a class works test.RunClassFldScenario(); - test.RunClassFldScenario_FalseMask(); - test.RunClassFldScenario_NonFaulting(); // Validates passing the field of a local struct works test.RunStructLclFldScenario(); - test.RunStructLclFldScenario_FalseMask(); - test.RunStructLclFldScenario_NonFaulting(); // Validates passing an instance member of a struct works test.RunStructFldScenario(); - test.RunStructFldScenario_FalseMask(); - test.RunStructFldScenario_NonFaulting(); } else { @@ -138,28 +130,6 @@ namespace JIT.HardwareIntrinsics.Arm testClass.ValidateResult(_fld1, _fld2, testClass._dataTable.inArrayPtr); } - - public void RunStructFldScenario_FalseMask({TestName}Test testClass) - { - //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable - {Op1VectorType}<{Op1BaseType}> loadMask = Sve.CreateFalseMask{RetBaseType}(); - - (_fld1, _fld2) = {Isa}.{Method}(loadMask, ({Op1BaseType}*)testClass._dataTable.inArrayPtr); - - testClass.ValidateZeroResult(_fld1, _fld2, testClass._dataTable.inArrayPtr); - } - - public void RunStructFldScenario_NonFaulting({TestName}Test testClass) - { - //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable - {Op1VectorType}<{Op1BaseType}> loadTrueMask = Sve.CreateTrueMask{RetBaseType}(SveMaskPattern.All); - {Op1VectorType}<{Op1BaseType}> loadFalseMask = Sve.CreateFalseMask{RetBaseType}(); - - (_fld1, _fld2) = {Isa}.{Method}(loadTrueMask, ({Op1BaseType}*)testClass._dataTable.inArrayPtr); - (_fld1, _fld2) = {Isa}.{Method}(loadFalseMask, default); - - testClass.ValidateZeroResult(_fld1, _fld2, testClass._dataTable.inArrayPtr); - } } private static readonly int LargestVectorSize = {LargestVectorSize}; @@ -256,58 +226,6 @@ namespace JIT.HardwareIntrinsics.Arm ValidateResult(_dataTable.outArray1Ptr, _dataTable.outArray2Ptr, _dataTable.inArrayPtr); } - public void RunReflectionScenario_FalseMask() - { - TestLibrary.TestFramework.BeginScenario(nameof(RunReflectionScenario_FalseMask)); - - //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable - {Op1VectorType}<{Op1BaseType}> loadMask = Sve.CreateFalseMask{RetBaseType}(); - - var result = typeof({Isa}).GetMethod(nameof({Isa}.{Method}), new Type[] { typeof(Vector<{Op1BaseType}>), typeof({Op1BaseType}*) }) - .Invoke(null, new object[] { - loadMask, - Pointer.Box(_dataTable.inArrayPtr, typeof({Op1BaseType}*)) - }); - - var output = (({Op1VectorType}<{Op1BaseType}>,{Op1VectorType}<{Op1BaseType}>))result; - Unsafe.Write(_dataTable.outArray1Ptr, output.Item1); - Unsafe.Write(_dataTable.outArray2Ptr, output.Item2); - ValidateZeroResult(_dataTable.outArray1Ptr, _dataTable.outArray2Ptr, _dataTable.inArrayPtr); - } - - public void RunReflectionScenario_NonFaulting() - { - TestLibrary.TestFramework.BeginScenario(nameof(RunReflectionScenario_NonFaulting)); - - //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable - {Op1VectorType}<{Op1BaseType}> loadTrueMask = Sve.CreateTrueMask{RetBaseType}(SveMaskPattern.All); - {Op1VectorType}<{Op1BaseType}> loadFalseMask = Sve.CreateFalseMask{RetBaseType}(); - - var result = typeof({Isa}).GetMethod(nameof({Isa}.{Method}), new Type[] { typeof(Vector<{Op1BaseType}>), typeof({Op1BaseType}*) }) - .Invoke(null, new object[] { - loadTrueMask, - Pointer.Box(_dataTable.inArrayPtr, typeof({Op1BaseType}*)) - }); - - try - { - result = typeof({Isa}).GetMethod(nameof({Isa}.{Method}), new Type[] { typeof(Vector<{Op1BaseType}>), typeof({Op1BaseType}*) }) - .Invoke(null, new object[] { - loadFalseMask, - Pointer.Box(default, typeof({Op1BaseType}*)) - }); - - var output = (({Op1VectorType}<{Op1BaseType}>,{Op1VectorType}<{Op1BaseType}>))result; - Unsafe.Write(_dataTable.outArray1Ptr, output.Item1); - Unsafe.Write(_dataTable.outArray2Ptr, output.Item2); - ValidateZeroResult(_dataTable.outArray1Ptr, _dataTable.outArray2Ptr, _dataTable.inArrayPtr); - } - catch - { - Succeeded = false; - } - } - public void RunClassFldScenario() { TestLibrary.TestFramework.BeginScenario(nameof(RunClassFldScenario)); @@ -320,40 +238,6 @@ namespace JIT.HardwareIntrinsics.Arm ValidateResult(_fld1, _fld2, _dataTable.inArrayPtr); } - public void RunClassFldScenario_FalseMask() - { - TestLibrary.TestFramework.BeginScenario(nameof(RunClassFldScenario_FalseMask)); - - //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable - {Op1VectorType}<{Op1BaseType}> loadMask = Sve.CreateFalseMask{RetBaseType}(); - - (_fld1, _fld2) = {Isa}.{Method}(loadMask, ({Op1BaseType}*)_dataTable.inArrayPtr); - - ValidateZeroResult(_fld1, _fld2, _dataTable.inArrayPtr); - } - - public void RunClassFldScenario_NonFaulting() - { - TestLibrary.TestFramework.BeginScenario(nameof(RunClassFldScenario_NonFaulting)); - - //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable - {Op1VectorType}<{Op1BaseType}> loadTrueMask = Sve.CreateTrueMask{RetBaseType}(SveMaskPattern.All); - {Op1VectorType}<{Op1BaseType}> loadFalseMask = Sve.CreateFalseMask{RetBaseType}(); - - (_fld1, _fld2) = {Isa}.{Method}(loadTrueMask, ({Op1BaseType}*)_dataTable.inArrayPtr); - - try - { - (_fld1, _fld2) = {Isa}.{Method}(loadFalseMask, default); - - ValidateZeroResult(_fld1, _fld2, _dataTable.inArrayPtr); - } - catch - { - Succeeded = false; - } - } - public void RunStructLclFldScenario() { TestLibrary.TestFramework.BeginScenario(nameof(RunStructLclFldScenario)); @@ -369,46 +253,6 @@ namespace JIT.HardwareIntrinsics.Arm ValidateResult(_dataTable.outArray1Ptr, _dataTable.outArray2Ptr, _dataTable.inArrayPtr); } - public void RunStructLclFldScenario_FalseMask() - { - TestLibrary.TestFramework.BeginScenario(nameof(RunStructLclFldScenario_FalseMask)); - - //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable - {Op1VectorType}<{Op1BaseType}> loadMask = Sve.CreateFalseMask{RetBaseType}(); - - var test = TestStruct.Create(); - (test._fld1, test._fld2) = {Isa}.{Method}(loadMask, ({Op1BaseType}*)_dataTable.inArrayPtr); - - Unsafe.Write(_dataTable.outArray1Ptr, test._fld1); - Unsafe.Write(_dataTable.outArray2Ptr, test._fld2); - ValidateZeroResult(_dataTable.outArray1Ptr, _dataTable.outArray2Ptr, _dataTable.inArrayPtr); - } - - public void RunStructLclFldScenario_NonFaulting() - { - TestLibrary.TestFramework.BeginScenario(nameof(RunStructLclFldScenario_NonFaulting)); - - //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable - {Op1VectorType}<{Op1BaseType}> loadTrueMask = Sve.CreateTrueMask{RetBaseType}(SveMaskPattern.All); - {Op1VectorType}<{Op1BaseType}> loadFalseMask = Sve.CreateFalseMask{RetBaseType}(); - - var test = TestStruct.Create(); - (test._fld1, test._fld2) = {Isa}.{Method}(loadTrueMask, ({Op1BaseType}*)_dataTable.inArrayPtr); - - try - { - (test._fld1, test._fld2) = {Isa}.{Method}(loadFalseMask, default); - - Unsafe.Write(_dataTable.outArray1Ptr, test._fld1); - Unsafe.Write(_dataTable.outArray2Ptr, test._fld2); - ValidateZeroResult(_dataTable.outArray1Ptr, _dataTable.outArray2Ptr, _dataTable.inArrayPtr); - } - catch - { - Succeeded = false; - } - } - public void RunStructFldScenario() { TestLibrary.TestFramework.BeginScenario(nameof(RunStructFldScenario)); @@ -417,29 +261,6 @@ namespace JIT.HardwareIntrinsics.Arm test.RunStructFldScenario(this); } - public void RunStructFldScenario_FalseMask() - { - TestLibrary.TestFramework.BeginScenario(nameof(RunStructFldScenario_FalseMask)); - - var test = TestStruct.Create(); - test.RunStructFldScenario_FalseMask(this); - } - - public void RunStructFldScenario_NonFaulting() - { - TestLibrary.TestFramework.BeginScenario(nameof(RunStructFldScenario_NonFaulting)); - - try - { - var test = TestStruct.Create(); - test.RunStructFldScenario_NonFaulting(this); - } - catch - { - Succeeded = false; - } - } - public void RunUnsupportedScenario() { TestLibrary.TestFramework.BeginScenario(nameof(RunUnsupportedScenario)); diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoad3xVectorAndUnzipTest.template b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoad3xVectorAndUnzipTest.template index a1314f89a657da..ea9e9e25eda881 100644 --- a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoad3xVectorAndUnzipTest.template +++ b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoad3xVectorAndUnzipTest.template @@ -33,23 +33,15 @@ namespace JIT.HardwareIntrinsics.Arm // Validates calling via reflection works test.RunReflectionScenario(); - test.RunReflectionScenario_FalseMask(); - test.RunReflectionScenario_NonFaulting(); // Validates passing an instance member of a class works test.RunClassFldScenario(); - test.RunClassFldScenario_FalseMask(); - test.RunClassFldScenario_NonFaulting(); // Validates passing the field of a local struct works test.RunStructLclFldScenario(); - test.RunStructLclFldScenario_FalseMask(); - test.RunStructLclFldScenario_NonFaulting(); // Validates passing an instance member of a struct works test.RunStructFldScenario(); - test.RunStructFldScenario_FalseMask(); - test.RunStructFldScenario_NonFaulting(); } else { @@ -146,28 +138,6 @@ namespace JIT.HardwareIntrinsics.Arm testClass.ValidateResult(_fld1, _fld2, _fld3, testClass._dataTable.inArrayPtr); } - - public void RunStructFldScenario_FalseMask({TestName}Test testClass) - { - //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable - {Op1VectorType}<{Op1BaseType}> loadMask = Sve.CreateFalseMask{RetBaseType}(); - - (_fld1, _fld2, _fld3) = {Isa}.{Method}(loadMask, ({Op1BaseType}*)testClass._dataTable.inArrayPtr); - - testClass.ValidateZeroResult(_fld1, _fld2, _fld3, testClass._dataTable.inArrayPtr); - } - - public void RunStructFldScenario_NonFaulting({TestName}Test testClass) - { - //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable - {Op1VectorType}<{Op1BaseType}> loadTrueMask = Sve.CreateTrueMask{RetBaseType}(SveMaskPattern.All); - {Op1VectorType}<{Op1BaseType}> loadFalseMask = Sve.CreateFalseMask{RetBaseType}(); - - (_fld1, _fld2, _fld3) = {Isa}.{Method}(loadTrueMask, ({Op1BaseType}*)testClass._dataTable.inArrayPtr); - (_fld1, _fld2, _fld3) = {Isa}.{Method}(loadFalseMask, default); - - testClass.ValidateZeroResult(_fld1, _fld2, _fld3, testClass._dataTable.inArrayPtr); - } } private static readonly int LargestVectorSize = {LargestVectorSize}; @@ -269,60 +239,6 @@ namespace JIT.HardwareIntrinsics.Arm ValidateResult(_dataTable.outArray1Ptr, _dataTable.outArray2Ptr, _dataTable.outArray3Ptr, _dataTable.inArrayPtr); } - public void RunReflectionScenario_FalseMask() - { - TestLibrary.TestFramework.BeginScenario(nameof(RunReflectionScenario_FalseMask)); - - //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable - {Op1VectorType}<{Op1BaseType}> loadMask = Sve.CreateFalseMask{RetBaseType}(); - - var result = typeof({Isa}).GetMethod(nameof({Isa}.{Method}), new Type[] { typeof(Vector<{Op1BaseType}>), typeof({Op1BaseType}*) }) - .Invoke(null, new object[] { - loadMask, - Pointer.Box(_dataTable.inArrayPtr, typeof({Op1BaseType}*)) - }); - - var output = (({Op1VectorType}<{Op1BaseType}>,{Op1VectorType}<{Op1BaseType}>,{Op1VectorType}<{Op1BaseType}>))result; - Unsafe.Write(_dataTable.outArray1Ptr, output.Item1); - Unsafe.Write(_dataTable.outArray2Ptr, output.Item2); - Unsafe.Write(_dataTable.outArray3Ptr, output.Item3); - ValidateZeroResult(_dataTable.outArray1Ptr, _dataTable.outArray2Ptr, _dataTable.outArray3Ptr, _dataTable.inArrayPtr); - } - - public void RunReflectionScenario_NonFaulting() - { - TestLibrary.TestFramework.BeginScenario(nameof(RunReflectionScenario_NonFaulting)); - - //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable - {Op1VectorType}<{Op1BaseType}> loadTrueMask = Sve.CreateTrueMask{RetBaseType}(SveMaskPattern.All); - {Op1VectorType}<{Op1BaseType}> loadFalseMask = Sve.CreateFalseMask{RetBaseType}(); - - var result = typeof({Isa}).GetMethod(nameof({Isa}.{Method}), new Type[] { typeof(Vector<{Op1BaseType}>), typeof({Op1BaseType}*) }) - .Invoke(null, new object[] { - loadTrueMask, - Pointer.Box(_dataTable.inArrayPtr, typeof({Op1BaseType}*)) - }); - - try - { - result = typeof({Isa}).GetMethod(nameof({Isa}.{Method}), new Type[] { typeof(Vector<{Op1BaseType}>), typeof({Op1BaseType}*) }) - .Invoke(null, new object[] { - loadFalseMask, - Pointer.Box(default, typeof({Op1BaseType}*)) - }); - - var output = (({Op1VectorType}<{Op1BaseType}>,{Op1VectorType}<{Op1BaseType}>,{Op1VectorType}<{Op1BaseType}>))result; - Unsafe.Write(_dataTable.outArray1Ptr, output.Item1); - Unsafe.Write(_dataTable.outArray2Ptr, output.Item2); - Unsafe.Write(_dataTable.outArray3Ptr, output.Item3); - ValidateZeroResult(_dataTable.outArray1Ptr, _dataTable.outArray2Ptr, _dataTable.outArray3Ptr, _dataTable.inArrayPtr); - } - catch - { - Succeeded = false; - } - } - public void RunClassFldScenario() { TestLibrary.TestFramework.BeginScenario(nameof(RunClassFldScenario)); @@ -335,40 +251,6 @@ namespace JIT.HardwareIntrinsics.Arm ValidateResult(_fld1, _fld2, _fld3, _dataTable.inArrayPtr); } - public void RunClassFldScenario_FalseMask() - { - TestLibrary.TestFramework.BeginScenario(nameof(RunClassFldScenario_FalseMask)); - - //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable - {Op1VectorType}<{Op1BaseType}> loadMask = Sve.CreateFalseMask{RetBaseType}(); - - (_fld1, _fld2, _fld3) = {Isa}.{Method}(loadMask, ({Op1BaseType}*)_dataTable.inArrayPtr); - - ValidateZeroResult(_fld1, _fld2, _fld3, _dataTable.inArrayPtr); - } - - public void RunClassFldScenario_NonFaulting() - { - TestLibrary.TestFramework.BeginScenario(nameof(RunClassFldScenario_NonFaulting)); - - //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable - {Op1VectorType}<{Op1BaseType}> loadTrueMask = Sve.CreateTrueMask{RetBaseType}(SveMaskPattern.All); - {Op1VectorType}<{Op1BaseType}> loadFalseMask = Sve.CreateFalseMask{RetBaseType}(); - - (_fld1, _fld2, _fld3) = {Isa}.{Method}(loadTrueMask, ({Op1BaseType}*)_dataTable.inArrayPtr); - - try - { - (_fld1, _fld2, _fld3) = {Isa}.{Method}(loadFalseMask, default); - - ValidateZeroResult(_fld1, _fld2, _fld3, _dataTable.inArrayPtr); - } - catch - { - Succeeded = false; - } - } - public void RunStructLclFldScenario() { TestLibrary.TestFramework.BeginScenario(nameof(RunStructLclFldScenario)); @@ -385,48 +267,6 @@ namespace JIT.HardwareIntrinsics.Arm ValidateResult(_dataTable.outArray1Ptr, _dataTable.outArray2Ptr, _dataTable.outArray3Ptr, _dataTable.inArrayPtr); } - public void RunStructLclFldScenario_FalseMask() - { - TestLibrary.TestFramework.BeginScenario(nameof(RunStructLclFldScenario_FalseMask)); - - //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable - {Op1VectorType}<{Op1BaseType}> loadMask = Sve.CreateFalseMask{RetBaseType}(); - - var test = TestStruct.Create(); - (test._fld1, test._fld2, test._fld3) = {Isa}.{Method}(loadMask, ({Op1BaseType}*)_dataTable.inArrayPtr); - - Unsafe.Write(_dataTable.outArray1Ptr, test._fld1); - Unsafe.Write(_dataTable.outArray2Ptr, test._fld2); - Unsafe.Write(_dataTable.outArray3Ptr, test._fld3); - ValidateZeroResult(_dataTable.outArray1Ptr, _dataTable.outArray2Ptr, _dataTable.outArray3Ptr, _dataTable.inArrayPtr); - } - - public void RunStructLclFldScenario_NonFaulting() - { - TestLibrary.TestFramework.BeginScenario(nameof(RunStructLclFldScenario_NonFaulting)); - - //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable - {Op1VectorType}<{Op1BaseType}> loadTrueMask = Sve.CreateTrueMask{RetBaseType}(SveMaskPattern.All); - {Op1VectorType}<{Op1BaseType}> loadFalseMask = Sve.CreateFalseMask{RetBaseType}(); - - var test = TestStruct.Create(); - (test._fld1, test._fld2, test._fld3) = {Isa}.{Method}(loadTrueMask, ({Op1BaseType}*)_dataTable.inArrayPtr); - - try - { - (test._fld1, test._fld2, test._fld3) = {Isa}.{Method}(loadFalseMask, default); - - Unsafe.Write(_dataTable.outArray1Ptr, test._fld1); - Unsafe.Write(_dataTable.outArray2Ptr, test._fld2); - Unsafe.Write(_dataTable.outArray3Ptr, test._fld3); - ValidateZeroResult(_dataTable.outArray1Ptr, _dataTable.outArray2Ptr, _dataTable.outArray3Ptr, _dataTable.inArrayPtr); - } - catch - { - Succeeded = false; - } - } - public void RunStructFldScenario() { TestLibrary.TestFramework.BeginScenario(nameof(RunStructFldScenario)); @@ -435,29 +275,6 @@ namespace JIT.HardwareIntrinsics.Arm test.RunStructFldScenario(this); } - public void RunStructFldScenario_FalseMask() - { - TestLibrary.TestFramework.BeginScenario(nameof(RunStructFldScenario_FalseMask)); - - var test = TestStruct.Create(); - test.RunStructFldScenario_FalseMask(this); - } - - public void RunStructFldScenario_NonFaulting() - { - TestLibrary.TestFramework.BeginScenario(nameof(RunStructFldScenario_NonFaulting)); - - try - { - var test = TestStruct.Create(); - test.RunStructFldScenario_NonFaulting(this); - } - catch - { - Succeeded = false; - } - } - public void RunUnsupportedScenario() { TestLibrary.TestFramework.BeginScenario(nameof(RunUnsupportedScenario)); diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoad4xVectorAndUnzipTest.template b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoad4xVectorAndUnzipTest.template index 57db947dabd635..ccedc85e7aae1c 100644 --- a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoad4xVectorAndUnzipTest.template +++ b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoad4xVectorAndUnzipTest.template @@ -33,23 +33,15 @@ namespace JIT.HardwareIntrinsics.Arm // Validates calling via reflection works test.RunReflectionScenario(); - test.RunReflectionScenario_FalseMask(); - test.RunReflectionScenario_NonFaulting(); // Validates passing an instance member of a class works test.RunClassFldScenario(); - test.RunClassFldScenario_FalseMask(); - test.RunClassFldScenario_NonFaulting(); // Validates passing the field of a local struct works test.RunStructLclFldScenario(); - test.RunStructLclFldScenario_FalseMask(); - test.RunStructLclFldScenario_NonFaulting(); // Validates passing an instance member of a struct works test.RunStructFldScenario(); - test.RunStructFldScenario_FalseMask(); - test.RunStructFldScenario_NonFaulting(); } else { @@ -154,28 +146,6 @@ namespace JIT.HardwareIntrinsics.Arm testClass.ValidateResult(_fld1, _fld2, _fld3, _fld4, testClass._dataTable.inArrayPtr); } - - public void RunStructFldScenario_FalseMask({TestName}Test testClass) - { - //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable - {Op1VectorType}<{Op1BaseType}> loadMask = Sve.CreateFalseMask{RetBaseType}(); - - (_fld1, _fld2, _fld3, _fld4) = {Isa}.{Method}(loadMask, ({Op1BaseType}*)testClass._dataTable.inArrayPtr); - - testClass.ValidateZeroResult(_fld1, _fld2, _fld3, _fld4, testClass._dataTable.inArrayPtr); - } - - public void RunStructFldScenario_NonFaulting({TestName}Test testClass) - { - //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable - {Op1VectorType}<{Op1BaseType}> loadTrueMask = Sve.CreateTrueMask{RetBaseType}(SveMaskPattern.All); - {Op1VectorType}<{Op1BaseType}> loadFalseMask = Sve.CreateFalseMask{RetBaseType}(); - - (_fld1, _fld2, _fld3, _fld4) = {Isa}.{Method}(loadTrueMask, ({Op1BaseType}*)testClass._dataTable.inArrayPtr); - (_fld1, _fld2, _fld3, _fld4) = {Isa}.{Method}(loadFalseMask, default); - - testClass.ValidateZeroResult(_fld1, _fld2, _fld3, _fld4, testClass._dataTable.inArrayPtr); - } } private static readonly int LargestVectorSize = {LargestVectorSize}; @@ -282,62 +252,6 @@ namespace JIT.HardwareIntrinsics.Arm ValidateResult(_dataTable.outArray1Ptr, _dataTable.outArray2Ptr, _dataTable.outArray3Ptr, _dataTable.outArray4Ptr, _dataTable.inArrayPtr); } - public void RunReflectionScenario_FalseMask() - { - TestLibrary.TestFramework.BeginScenario(nameof(RunReflectionScenario_FalseMask)); - - //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable - {Op1VectorType}<{Op1BaseType}> loadMask = Sve.CreateFalseMask{RetBaseType}(); - - var result = typeof({Isa}).GetMethod(nameof({Isa}.{Method}), new Type[] { typeof(Vector<{Op1BaseType}>), typeof({Op1BaseType}*) }) - .Invoke(null, new object[] { - loadMask, - Pointer.Box(_dataTable.inArrayPtr, typeof({Op1BaseType}*)) - }); - - var output = (({Op1VectorType}<{Op1BaseType}>,{Op1VectorType}<{Op1BaseType}>,{Op1VectorType}<{Op1BaseType}>,{Op1VectorType}<{Op1BaseType}>))result; - Unsafe.Write(_dataTable.outArray1Ptr, output.Item1); - Unsafe.Write(_dataTable.outArray2Ptr, output.Item2); - Unsafe.Write(_dataTable.outArray3Ptr, output.Item3); - Unsafe.Write(_dataTable.outArray4Ptr, output.Item4); - ValidateZeroResult(_dataTable.outArray1Ptr, _dataTable.outArray2Ptr, _dataTable.outArray3Ptr, _dataTable.outArray4Ptr, _dataTable.inArrayPtr); - } - - public void RunReflectionScenario_NonFaulting() - { - TestLibrary.TestFramework.BeginScenario(nameof(RunReflectionScenario_NonFaulting)); - - //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable - {Op1VectorType}<{Op1BaseType}> loadTrueMask = Sve.CreateTrueMask{RetBaseType}(SveMaskPattern.All); - {Op1VectorType}<{Op1BaseType}> loadFalseMask = Sve.CreateFalseMask{RetBaseType}(); - - var result = typeof({Isa}).GetMethod(nameof({Isa}.{Method}), new Type[] { typeof(Vector<{Op1BaseType}>), typeof({Op1BaseType}*) }) - .Invoke(null, new object[] { - loadTrueMask, - Pointer.Box(_dataTable.inArrayPtr, typeof({Op1BaseType}*)) - }); - - try - { - result = typeof({Isa}).GetMethod(nameof({Isa}.{Method}), new Type[] { typeof(Vector<{Op1BaseType}>), typeof({Op1BaseType}*) }) - .Invoke(null, new object[] { - loadFalseMask, - Pointer.Box(default, typeof({Op1BaseType}*)) - }); - - var output = (({Op1VectorType}<{Op1BaseType}>,{Op1VectorType}<{Op1BaseType}>,{Op1VectorType}<{Op1BaseType}>,{Op1VectorType}<{Op1BaseType}>))result; - Unsafe.Write(_dataTable.outArray1Ptr, output.Item1); - Unsafe.Write(_dataTable.outArray2Ptr, output.Item2); - Unsafe.Write(_dataTable.outArray3Ptr, output.Item3); - Unsafe.Write(_dataTable.outArray4Ptr, output.Item4); - ValidateZeroResult(_dataTable.outArray1Ptr, _dataTable.outArray2Ptr, _dataTable.outArray3Ptr, _dataTable.outArray4Ptr, _dataTable.inArrayPtr); - } - catch - { - Succeeded = false; - } - } - public void RunClassFldScenario() { TestLibrary.TestFramework.BeginScenario(nameof(RunClassFldScenario)); @@ -350,84 +264,6 @@ namespace JIT.HardwareIntrinsics.Arm ValidateResult(_fld1, _fld2, _fld3, _fld4, _dataTable.inArrayPtr); } - public void RunClassFldScenario_FalseMask() - { - TestLibrary.TestFramework.BeginScenario(nameof(RunClassFldScenario_FalseMask)); - - //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable - {Op1VectorType}<{Op1BaseType}> loadMask = Sve.CreateFalseMask{RetBaseType}(); - - (_fld1, _fld2, _fld3, _fld4) = {Isa}.{Method}(loadMask, ({Op1BaseType}*)_dataTable.inArrayPtr); - - ValidateZeroResult(_fld1, _fld2, _fld3, _fld4, _dataTable.inArrayPtr); - } - - public void RunClassFldScenario_NonFaulting() - { - TestLibrary.TestFramework.BeginScenario(nameof(RunClassFldScenario_NonFaulting)); - - //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable - {Op1VectorType}<{Op1BaseType}> loadTrueMask = Sve.CreateTrueMask{RetBaseType}(SveMaskPattern.All); - {Op1VectorType}<{Op1BaseType}> loadFalseMask = Sve.CreateFalseMask{RetBaseType}(); - - (_fld1, _fld2, _fld3, _fld4) = {Isa}.{Method}(loadTrueMask, ({Op1BaseType}*)_dataTable.inArrayPtr); - - try - { - (_fld1, _fld2, _fld3, _fld4) = {Isa}.{Method}(loadFalseMask, default); - - ValidateZeroResult(_fld1, _fld2, _fld3, _fld4, _dataTable.inArrayPtr); - } - catch - { - Succeeded = false; - } - } - - public void RunStructLclFldScenario_FalseMask() - { - TestLibrary.TestFramework.BeginScenario(nameof(RunStructLclFldScenario_FalseMask)); - - //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable - {Op1VectorType}<{Op1BaseType}> loadMask = Sve.CreateFalseMask{RetBaseType}(); - - var test = TestStruct.Create(); - (test._fld1, test._fld2, test._fld3, test._fld4) = {Isa}.{Method}(loadMask, ({Op1BaseType}*)_dataTable.inArrayPtr); - - Unsafe.Write(_dataTable.outArray1Ptr, test._fld1); - Unsafe.Write(_dataTable.outArray2Ptr, test._fld2); - Unsafe.Write(_dataTable.outArray3Ptr, test._fld3); - Unsafe.Write(_dataTable.outArray4Ptr, test._fld4); - ValidateZeroResult(_dataTable.outArray1Ptr, _dataTable.outArray2Ptr, _dataTable.outArray3Ptr, _dataTable.outArray4Ptr, _dataTable.inArrayPtr); - } - - public void RunStructLclFldScenario_NonFaulting() - { - TestLibrary.TestFramework.BeginScenario(nameof(RunStructLclFldScenario_NonFaulting)); - - //TODO-SVE: Once register allocation exists for predicates, move loadMask into DataTable - {Op1VectorType}<{Op1BaseType}> loadTrueMask = Sve.CreateTrueMask{RetBaseType}(SveMaskPattern.All); - {Op1VectorType}<{Op1BaseType}> loadFalseMask = Sve.CreateFalseMask{RetBaseType}(); - - var test = TestStruct.Create(); - (test._fld1, test._fld2, test._fld3, test._fld4) = {Isa}.{Method}(loadTrueMask, ({Op1BaseType}*)_dataTable.inArrayPtr); - - try - { - (test._fld1, test._fld2, test._fld3, test._fld4) = {Isa}.{Method}(loadFalseMask, default); - - Unsafe.Write(_dataTable.outArray1Ptr, test._fld1); - Unsafe.Write(_dataTable.outArray2Ptr, test._fld2); - Unsafe.Write(_dataTable.outArray3Ptr, test._fld3); - Unsafe.Write(_dataTable.outArray4Ptr, test._fld4); - ValidateZeroResult(_dataTable.outArray1Ptr, _dataTable.outArray2Ptr, _dataTable.outArray3Ptr, _dataTable.outArray4Ptr, _dataTable.inArrayPtr); - } - catch - { - Succeeded = false; - } - } - public void RunStructLclFldScenario() { TestLibrary.TestFramework.BeginScenario(nameof(RunStructLclFldScenario)); @@ -453,29 +289,6 @@ namespace JIT.HardwareIntrinsics.Arm test.RunStructFldScenario(this); } - public void RunStructFldScenario_FalseMask() - { - TestLibrary.TestFramework.BeginScenario(nameof(RunStructFldScenario_FalseMask)); - - var test = TestStruct.Create(); - test.RunStructFldScenario_FalseMask(this); - } - - public void RunStructFldScenario_NonFaulting() - { - TestLibrary.TestFramework.BeginScenario(nameof(RunStructFldScenario_NonFaulting)); - - try - { - var test = TestStruct.Create(); - test.RunStructFldScenario_NonFaulting(this); - } - catch - { - Succeeded = false; - } - } - public void RunUnsupportedScenario() { TestLibrary.TestFramework.BeginScenario(nameof(RunUnsupportedScenario));