diff --git a/src/coreclr/jit/hwintrinsiclistarm64sve.h b/src/coreclr/jit/hwintrinsiclistarm64sve.h index e29129dde947bc..5464025439b087 100644 --- a/src/coreclr/jit/hwintrinsiclistarm64sve.h +++ b/src/coreclr/jit/hwintrinsiclistarm64sve.h @@ -341,6 +341,10 @@ HARDWARE_INTRINSIC(Sve2, FusedAddRoundedHalving, HARDWARE_INTRINSIC(Sve2, FusedSubtractHalving, -1, -1, {INS_sve_shsub, INS_sve_uhsub, INS_sve_shsub, INS_sve_uhsub, INS_sve_shsub, INS_sve_uhsub, INS_sve_shsub, INS_sve_uhsub, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_HasRMWSemantics|HW_Flag_LowMaskedOperation) HARDWARE_INTRINSIC(Sve2, InterleavingXorEvenOdd, -1, 3, {INS_sve_eorbt, INS_sve_eorbt, INS_sve_eorbt, INS_sve_eorbt, INS_sve_eorbt, INS_sve_eorbt, INS_sve_eorbt, INS_sve_eorbt, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_HasRMWSemantics) HARDWARE_INTRINSIC(Sve2, InterleavingXorOddEven, -1, 3, {INS_sve_eortb, INS_sve_eortb, INS_sve_eortb, INS_sve_eortb, INS_sve_eortb, INS_sve_eortb, INS_sve_eortb, INS_sve_eortb, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_HasRMWSemantics) +HARDWARE_INTRINSIC(Sve2, MaxNumberPairwise, -1, -1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_fmaxnmp, INS_sve_fmaxnmp}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation|HW_Flag_HasRMWSemantics) +HARDWARE_INTRINSIC(Sve2, MaxPairwise, -1, -1, {INS_sve_smaxp, INS_sve_umaxp, INS_sve_smaxp, INS_sve_umaxp, INS_sve_smaxp, INS_sve_umaxp, INS_sve_smaxp, INS_sve_umaxp, INS_sve_fmaxp, INS_sve_fmaxp}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation|HW_Flag_HasRMWSemantics|HW_Flag_ReduceOperation) +HARDWARE_INTRINSIC(Sve2, MinNumberPairwise, -1, -1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_fminnmp, INS_sve_fminnmp}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation|HW_Flag_HasRMWSemantics) +HARDWARE_INTRINSIC(Sve2, MinPairwise, -1, -1, {INS_sve_sminp, INS_sve_uminp, INS_sve_sminp, INS_sve_uminp, INS_sve_sminp, INS_sve_uminp, INS_sve_sminp, INS_sve_uminp, INS_sve_fminp, INS_sve_fminp}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation|HW_Flag_HasRMWSemantics|HW_Flag_ReduceOperation) HARDWARE_INTRINSIC(Sve2, MultiplyAddBySelectedScalar, -1, 4, {INS_invalid, INS_invalid, INS_sve_mla, INS_sve_mla, INS_sve_mla, INS_sve_mla, INS_sve_mla, INS_sve_mla, INS_invalid, INS_invalid}, HW_Category_SIMDByIndexedElement, HW_Flag_Scalable|HW_Flag_HasImmediateOperand|HW_Flag_LowVectorOperation|HW_Flag_HasRMWSemantics) HARDWARE_INTRINSIC(Sve2, MultiplyBySelectedScalar, -1, 3, {INS_invalid, INS_invalid, INS_sve_mul, INS_sve_mul, INS_sve_mul, INS_sve_mul, INS_sve_mul, INS_sve_mul, INS_invalid, INS_invalid}, HW_Category_SIMDByIndexedElement, HW_Flag_Scalable|HW_Flag_HasImmediateOperand|HW_Flag_LowVectorOperation) HARDWARE_INTRINSIC(Sve2, MultiplyBySelectedScalarWideningEven, -1, 3, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_smullb, INS_sve_umullb, INS_sve_smullb, INS_sve_umullb, INS_invalid, INS_invalid}, HW_Category_SIMDByIndexedElement, HW_Flag_Scalable|HW_Flag_HasImmediateOperand|HW_Flag_LowVectorOperation) diff --git a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve2.PlatformNotSupported.cs b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve2.PlatformNotSupported.cs index d725b3d06f6bfd..c52509a02d1b12 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve2.PlatformNotSupported.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve2.PlatformNotSupported.cs @@ -1395,6 +1395,181 @@ internal Arm64() { } /// public static Vector InterleavingXorOddEven(Vector even, Vector left, Vector right) { throw new PlatformNotSupportedException(); } + // Maximum number pairwise + + /// + /// svfloat64_t svmaxnmp[_f64]_m(svbool_t pg, svfloat64_t op1, svfloat64_t op2) + /// svfloat64_t svmaxnmp[_f64]_x(svbool_t pg, svfloat64_t op1, svfloat64_t op2) + /// FMAXNMP Ztied1.D, Pg/M, Ztied1.D, Zop2.D + /// + public static Vector MaxNumberPairwise(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svfloat32_t svmaxnmp[_f32]_m(svbool_t pg, svfloat32_t op1, svfloat32_t op2) + /// svfloat32_t svmaxnmp[_f32]_x(svbool_t pg, svfloat32_t op1, svfloat32_t op2) + /// FMAXNMP Ztied1.S, Pg/M, Ztied1.S, Zop2.S + /// + public static Vector MaxNumberPairwise(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + // Maximum pairwise + + /// + /// svuint8_t svmaxp[_u8]_m(svbool_t pg, svuint8_t op1, svuint8_t op2) + /// svuint8_t svmaxp[_u8]_x(svbool_t pg, svuint8_t op1, svuint8_t op2) + /// UMAXP Ztied1.B, Pg/M, Ztied1.B, Zop2.B + /// + public static Vector MaxPairwise(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svfloat64_t svmaxp[_f64]_m(svbool_t pg, svfloat64_t op1, svfloat64_t op2) + /// svfloat64_t svmaxp[_f64]_x(svbool_t pg, svfloat64_t op1, svfloat64_t op2) + /// FMAXP Ztied1.D, Pg/M, Ztied1.D, Zop2.D + /// + public static Vector MaxPairwise(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svint16_t svmaxp[_s16]_m(svbool_t pg, svint16_t op1, svint16_t op2) + /// svint16_t svmaxp[_s16]_x(svbool_t pg, svint16_t op1, svint16_t op2) + /// SMAXP Ztied1.H, Pg/M, Ztied1.H, Zop2.H + /// + public static Vector MaxPairwise(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svint32_t svmaxp[_s32]_m(svbool_t pg, svint32_t op1, svint32_t op2) + /// svint32_t svmaxp[_s32]_x(svbool_t pg, svint32_t op1, svint32_t op2) + /// SMAXP Ztied1.S, Pg/M, Ztied1.S, Zop2.S + /// + public static Vector MaxPairwise(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svint64_t svmaxp[_s64]_m(svbool_t pg, svint64_t op1, svint64_t op2) + /// svint64_t svmaxp[_s64]_x(svbool_t pg, svint64_t op1, svint64_t op2) + /// SMAXP Ztied1.D, Pg/M, Ztied1.D, Zop2.D + /// + public static Vector MaxPairwise(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svint8_t svmaxp[_s8]_m(svbool_t pg, svint8_t op1, svint8_t op2) + /// svint8_t svmaxp[_s8]_x(svbool_t pg, svint8_t op1, svint8_t op2) + /// SMAXP Ztied1.B, Pg/M, Ztied1.B, Zop2.B + /// + public static Vector MaxPairwise(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svfloat32_t svmaxp[_f32]_m(svbool_t pg, svfloat32_t op1, svfloat32_t op2) + /// svfloat32_t svmaxp[_f32]_x(svbool_t pg, svfloat32_t op1, svfloat32_t op2) + /// FMAXP Ztied1.S, Pg/M, Ztied1.S, Zop2.S + /// + public static Vector MaxPairwise(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svuint16_t svmaxp[_u16]_m(svbool_t pg, svuint16_t op1, svuint16_t op2) + /// svuint16_t svmaxp[_u16]_x(svbool_t pg, svuint16_t op1, svuint16_t op2) + /// UMAXP Ztied1.H, Pg/M, Ztied1.H, Zop2.H + /// + public static Vector MaxPairwise(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svuint32_t svmaxp[_u32]_m(svbool_t pg, svuint32_t op1, svuint32_t op2) + /// svuint32_t svmaxp[_u32]_x(svbool_t pg, svuint32_t op1, svuint32_t op2) + /// UMAXP Ztied1.S, Pg/M, Ztied1.S, Zop2.S + /// + public static Vector MaxPairwise(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svuint64_t svmaxp[_u64]_m(svbool_t pg, svuint64_t op1, svuint64_t op2) + /// svuint64_t svmaxp[_u64]_x(svbool_t pg, svuint64_t op1, svuint64_t op2) + /// UMAXP Ztied1.D, Pg/M, Ztied1.D, Zop2.D + /// + public static Vector MaxPairwise(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + // Minimum number pairwise + + /// + /// svfloat64_t svminnmp[_f64]_m(svbool_t pg, svfloat64_t op1, svfloat64_t op2) + /// svfloat64_t svminnmp[_f64]_x(svbool_t pg, svfloat64_t op1, svfloat64_t op2) + /// FMINNMP Ztied1.D, Pg/M, Ztied1.D, Zop2.D + /// + public static Vector MinNumberPairwise(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svfloat32_t svminnmp[_f32]_m(svbool_t pg, svfloat32_t op1, svfloat32_t op2) + /// svfloat32_t svminnmp[_f32]_x(svbool_t pg, svfloat32_t op1, svfloat32_t op2) + /// FMINNMP Ztied1.S, Pg/M, Ztied1.S, Zop2.S + /// + public static Vector MinNumberPairwise(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + // Minimum pairwise + + /// + /// svuint8_t svminp[_u8]_m(svbool_t pg, svuint8_t op1, svuint8_t op2) + /// svuint8_t svminp[_u8]_x(svbool_t pg, svuint8_t op1, svuint8_t op2) + /// UMINP Ztied1.B, Pg/M, Ztied1.B, Zop2.B + /// + public static Vector MinPairwise(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svfloat64_t svminp[_f64]_m(svbool_t pg, svfloat64_t op1, svfloat64_t op2) + /// svfloat64_t svminp[_f64]_x(svbool_t pg, svfloat64_t op1, svfloat64_t op2) + /// FMINP Ztied1.D, Pg/M, Ztied1.D, Zop2.D + /// + public static Vector MinPairwise(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svint16_t svminp[_s16]_m(svbool_t pg, svint16_t op1, svint16_t op2) + /// svint16_t svminp[_s16]_x(svbool_t pg, svint16_t op1, svint16_t op2) + /// SMINP Ztied1.H, Pg/M, Ztied1.H, Zop2.H + /// + public static Vector MinPairwise(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svint32_t svminp[_s32]_m(svbool_t pg, svint32_t op1, svint32_t op2) + /// svint32_t svminp[_s32]_x(svbool_t pg, svint32_t op1, svint32_t op2) + /// SMINP Ztied1.S, Pg/M, Ztied1.S, Zop2.S + /// + public static Vector MinPairwise(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svint64_t svminp[_s64]_m(svbool_t pg, svint64_t op1, svint64_t op2) + /// svint64_t svminp[_s64]_x(svbool_t pg, svint64_t op1, svint64_t op2) + /// SMINP Ztied1.D, Pg/M, Ztied1.D, Zop2.D + /// + public static Vector MinPairwise(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svint8_t svminp[_s8]_m(svbool_t pg, svint8_t op1, svint8_t op2) + /// svint8_t svminp[_s8]_x(svbool_t pg, svint8_t op1, svint8_t op2) + /// SMINP Ztied1.B, Pg/M, Ztied1.B, Zop2.B + /// + public static Vector MinPairwise(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svfloat32_t svminp[_f32]_m(svbool_t pg, svfloat32_t op1, svfloat32_t op2) + /// svfloat32_t svminp[_f32]_x(svbool_t pg, svfloat32_t op1, svfloat32_t op2) + /// FMINP Ztied1.S, Pg/M, Ztied1.S, Zop2.S + /// + public static Vector MinPairwise(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svuint16_t svminp[_u16]_m(svbool_t pg, svuint16_t op1, svuint16_t op2) + /// svuint16_t svminp[_u16]_x(svbool_t pg, svuint16_t op1, svuint16_t op2) + /// UMINP Ztied1.H, Pg/M, Ztied1.H, Zop2.H + /// + public static Vector MinPairwise(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svuint32_t svminp[_u32]_m(svbool_t pg, svuint32_t op1, svuint32_t op2) + /// svuint32_t svminp[_u32]_x(svbool_t pg, svuint32_t op1, svuint32_t op2) + /// UMINP Ztied1.S, Pg/M, Ztied1.S, Zop2.S + /// + public static Vector MinPairwise(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svuint64_t svminp[_u64]_m(svbool_t pg, svuint64_t op1, svuint64_t op2) + /// svuint64_t svminp[_u64]_x(svbool_t pg, svuint64_t op1, svuint64_t op2) + /// UMINP Ztied1.D, Pg/M, Ztied1.D, Zop2.D + /// + public static Vector MinPairwise(Vector left, Vector right) { throw new PlatformNotSupportedException(); } // Multiply-add, addend first diff --git a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve2.cs b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve2.cs index 542c142c54c1a3..a784dec8b7a998 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve2.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve2.cs @@ -1394,6 +1394,205 @@ internal Arm64() { } /// public static Vector InterleavingXorOddEven(Vector even, Vector left, Vector right) => InterleavingXorOddEven(even, left, right); + // Maximum number pairwise + + /// + /// svfloat64_t svmaxnmp[_f64]_m(svbool_t pg, svfloat64_t op1, svfloat64_t op2) + /// svfloat64_t svmaxnmp[_f64]_x(svbool_t pg, svfloat64_t op1, svfloat64_t op2) + /// FMAXNMP Ztied1.D, Pg/M, Ztied1.D, Zop2.D + /// FMAXNMP Ztied1.D, Pg/M, Ztied1.D, Zop2.D + /// + public static Vector MaxNumberPairwise(Vector left, Vector right) => MaxNumberPairwise(left, right); + + /// + /// svfloat32_t svmaxnmp[_f32]_m(svbool_t pg, svfloat32_t op1, svfloat32_t op2) + /// svfloat32_t svmaxnmp[_f32]_x(svbool_t pg, svfloat32_t op1, svfloat32_t op2) + /// FMAXNMP Ztied1.S, Pg/M, Ztied1.S, Zop2.S + /// FMAXNMP Ztied1.S, Pg/M, Ztied1.S, Zop2.S + /// + public static Vector MaxNumberPairwise(Vector left, Vector right) => MaxNumberPairwise(left, right); + + // Maximum pairwise + + /// + /// svuint8_t svmaxp[_u8]_m(svbool_t pg, svuint8_t op1, svuint8_t op2) + /// svuint8_t svmaxp[_u8]_x(svbool_t pg, svuint8_t op1, svuint8_t op2) + /// UMAXP Ztied1.B, Pg/M, Ztied1.B, Zop2.B + /// UMAXP Ztied1.B, Pg/M, Ztied1.B, Zop2.B + /// + public static Vector MaxPairwise(Vector left, Vector right) => MaxPairwise(left, right); + + /// + /// svfloat64_t svmaxp[_f64]_m(svbool_t pg, svfloat64_t op1, svfloat64_t op2) + /// svfloat64_t svmaxp[_f64]_x(svbool_t pg, svfloat64_t op1, svfloat64_t op2) + /// FMAXP Ztied1.D, Pg/M, Ztied1.D, Zop2.D + /// FMAXP Ztied1.D, Pg/M, Ztied1.D, Zop2.D + /// + public static Vector MaxPairwise(Vector left, Vector right) => MaxPairwise(left, right); + + /// + /// svint16_t svmaxp[_s16]_m(svbool_t pg, svint16_t op1, svint16_t op2) + /// svint16_t svmaxp[_s16]_x(svbool_t pg, svint16_t op1, svint16_t op2) + /// SMAXP Ztied1.H, Pg/M, Ztied1.H, Zop2.H + /// SMAXP Ztied1.H, Pg/M, Ztied1.H, Zop2.H + /// + public static Vector MaxPairwise(Vector left, Vector right) => MaxPairwise(left, right); + + /// + /// svint32_t svmaxp[_s32]_m(svbool_t pg, svint32_t op1, svint32_t op2) + /// svint32_t svmaxp[_s32]_x(svbool_t pg, svint32_t op1, svint32_t op2) + /// SMAXP Ztied1.S, Pg/M, Ztied1.S, Zop2.S + /// SMAXP Ztied1.S, Pg/M, Ztied1.S, Zop2.S + /// + public static Vector MaxPairwise(Vector left, Vector right) => MaxPairwise(left, right); + + /// + /// svint64_t svmaxp[_s64]_m(svbool_t pg, svint64_t op1, svint64_t op2) + /// svint64_t svmaxp[_s64]_x(svbool_t pg, svint64_t op1, svint64_t op2) + /// SMAXP Ztied1.D, Pg/M, Ztied1.D, Zop2.D + /// SMAXP Ztied1.D, Pg/M, Ztied1.D, Zop2.D + /// + public static Vector MaxPairwise(Vector left, Vector right) => MaxPairwise(left, right); + + /// + /// svint8_t svmaxp[_s8]_m(svbool_t pg, svint8_t op1, svint8_t op2) + /// svint8_t svmaxp[_s8]_x(svbool_t pg, svint8_t op1, svint8_t op2) + /// SMAXP Ztied1.B, Pg/M, Ztied1.B, Zop2.B + /// SMAXP Ztied1.B, Pg/M, Ztied1.B, Zop2.B + /// + public static Vector MaxPairwise(Vector left, Vector right) => MaxPairwise(left, right); + + /// + /// svfloat32_t svmaxp[_f32]_m(svbool_t pg, svfloat32_t op1, svfloat32_t op2) + /// svfloat32_t svmaxp[_f32]_x(svbool_t pg, svfloat32_t op1, svfloat32_t op2) + /// FMAXP Ztied1.S, Pg/M, Ztied1.S, Zop2.S + /// FMAXP Ztied1.S, Pg/M, Ztied1.S, Zop2.S + /// + public static Vector MaxPairwise(Vector left, Vector right) => MaxPairwise(left, right); + + /// + /// svuint16_t svmaxp[_u16]_m(svbool_t pg, svuint16_t op1, svuint16_t op2) + /// svuint16_t svmaxp[_u16]_x(svbool_t pg, svuint16_t op1, svuint16_t op2) + /// UMAXP Ztied1.H, Pg/M, Ztied1.H, Zop2.H + /// UMAXP Ztied1.H, Pg/M, Ztied1.H, Zop2.H + /// + public static Vector MaxPairwise(Vector left, Vector right) => MaxPairwise(left, right); + + /// + /// svuint32_t svmaxp[_u32]_m(svbool_t pg, svuint32_t op1, svuint32_t op2) + /// svuint32_t svmaxp[_u32]_x(svbool_t pg, svuint32_t op1, svuint32_t op2) + /// UMAXP Ztied1.S, Pg/M, Ztied1.S, Zop2.S + /// UMAXP Ztied1.S, Pg/M, Ztied1.S, Zop2.S + /// + public static Vector MaxPairwise(Vector left, Vector right) => MaxPairwise(left, right); + + /// + /// svuint64_t svmaxp[_u64]_m(svbool_t pg, svuint64_t op1, svuint64_t op2) + /// svuint64_t svmaxp[_u64]_x(svbool_t pg, svuint64_t op1, svuint64_t op2) + /// UMAXP Ztied1.D, Pg/M, Ztied1.D, Zop2.D + /// UMAXP Ztied1.D, Pg/M, Ztied1.D, Zop2.D + /// + public static Vector MaxPairwise(Vector left, Vector right) => MaxPairwise(left, right); + + // Minimum number pairwise + + /// + /// svfloat64_t svminnmp[_f64]_m(svbool_t pg, svfloat64_t op1, svfloat64_t op2) + /// svfloat64_t svminnmp[_f64]_x(svbool_t pg, svfloat64_t op1, svfloat64_t op2) + /// FMINNMP Ztied1.D, Pg/M, Ztied1.D, Zop2.D + /// FMINNMP Ztied1.D, Pg/M, Ztied1.D, Zop2.D + /// + public static Vector MinNumberPairwise(Vector left, Vector right) => MinNumberPairwise(left, right); + + /// + /// svfloat32_t svminnmp[_f32]_m(svbool_t pg, svfloat32_t op1, svfloat32_t op2) + /// svfloat32_t svminnmp[_f32]_x(svbool_t pg, svfloat32_t op1, svfloat32_t op2) + /// FMINNMP Ztied1.S, Pg/M, Ztied1.S, Zop2.S + /// FMINNMP Ztied1.S, Pg/M, Ztied1.S, Zop2.S + /// + public static Vector MinNumberPairwise(Vector left, Vector right) => MinNumberPairwise(left, right); + + // Minimum pairwise + + /// + /// svuint8_t svminp[_u8]_m(svbool_t pg, svuint8_t op1, svuint8_t op2) + /// svuint8_t svminp[_u8]_x(svbool_t pg, svuint8_t op1, svuint8_t op2) + /// UMINP Ztied1.B, Pg/M, Ztied1.B, Zop2.B + /// UMINP Ztied1.B, Pg/M, Ztied1.B, Zop2.B + /// + public static Vector MinPairwise(Vector left, Vector right) => MinPairwise(left, right); + + /// + /// svfloat64_t svminp[_f64]_m(svbool_t pg, svfloat64_t op1, svfloat64_t op2) + /// svfloat64_t svminp[_f64]_x(svbool_t pg, svfloat64_t op1, svfloat64_t op2) + /// FMINP Ztied1.D, Pg/M, Ztied1.D, Zop2.D + /// FMINP Ztied1.D, Pg/M, Ztied1.D, Zop2.D + /// + public static Vector MinPairwise(Vector left, Vector right) => MinPairwise(left, right); + + /// + /// svint16_t svminp[_s16]_m(svbool_t pg, svint16_t op1, svint16_t op2) + /// svint16_t svminp[_s16]_x(svbool_t pg, svint16_t op1, svint16_t op2) + /// SMINP Ztied1.H, Pg/M, Ztied1.H, Zop2.H + /// SMINP Ztied1.H, Pg/M, Ztied1.H, Zop2.H + /// + public static Vector MinPairwise(Vector left, Vector right) => MinPairwise(left, right); + + /// + /// svint32_t svminp[_s32]_m(svbool_t pg, svint32_t op1, svint32_t op2) + /// svint32_t svminp[_s32]_x(svbool_t pg, svint32_t op1, svint32_t op2) + /// SMINP Ztied1.S, Pg/M, Ztied1.S, Zop2.S + /// SMINP Ztied1.S, Pg/M, Ztied1.S, Zop2.S + /// + public static Vector MinPairwise(Vector left, Vector right) => MinPairwise(left, right); + + /// + /// svint64_t svminp[_s64]_m(svbool_t pg, svint64_t op1, svint64_t op2) + /// svint64_t svminp[_s64]_x(svbool_t pg, svint64_t op1, svint64_t op2) + /// SMINP Ztied1.D, Pg/M, Ztied1.D, Zop2.D + /// SMINP Ztied1.D, Pg/M, Ztied1.D, Zop2.D + /// + public static Vector MinPairwise(Vector left, Vector right) => MinPairwise(left, right); + + /// + /// svint8_t svminp[_s8]_m(svbool_t pg, svint8_t op1, svint8_t op2) + /// svint8_t svminp[_s8]_x(svbool_t pg, svint8_t op1, svint8_t op2) + /// SMINP Ztied1.B, Pg/M, Ztied1.B, Zop2.B + /// SMINP Ztied1.B, Pg/M, Ztied1.B, Zop2.B + /// + public static Vector MinPairwise(Vector left, Vector right) => MinPairwise(left, right); + + /// + /// svfloat32_t svminp[_f32]_m(svbool_t pg, svfloat32_t op1, svfloat32_t op2) + /// svfloat32_t svminp[_f32]_x(svbool_t pg, svfloat32_t op1, svfloat32_t op2) + /// FMINP Ztied1.S, Pg/M, Ztied1.S, Zop2.S + /// FMINP Ztied1.S, Pg/M, Ztied1.S, Zop2.S + /// + public static Vector MinPairwise(Vector left, Vector right) => MinPairwise(left, right); + + /// + /// svuint16_t svminp[_u16]_m(svbool_t pg, svuint16_t op1, svuint16_t op2) + /// svuint16_t svminp[_u16]_x(svbool_t pg, svuint16_t op1, svuint16_t op2) + /// UMINP Ztied1.H, Pg/M, Ztied1.H, Zop2.H + /// UMINP Ztied1.H, Pg/M, Ztied1.H, Zop2.H + /// + public static Vector MinPairwise(Vector left, Vector right) => MinPairwise(left, right); + + /// + /// svuint32_t svminp[_u32]_m(svbool_t pg, svuint32_t op1, svuint32_t op2) + /// svuint32_t svminp[_u32]_x(svbool_t pg, svuint32_t op1, svuint32_t op2) + /// UMINP Ztied1.S, Pg/M, Ztied1.S, Zop2.S + /// UMINP Ztied1.S, Pg/M, Ztied1.S, Zop2.S + /// + public static Vector MinPairwise(Vector left, Vector right) => MinPairwise(left, right); + + /// + /// svuint64_t svminp[_u64]_m(svbool_t pg, svuint64_t op1, svuint64_t op2) + /// svuint64_t svminp[_u64]_x(svbool_t pg, svuint64_t op1, svuint64_t op2) + /// UMINP Ztied1.D, Pg/M, Ztied1.D, Zop2.D + /// UMINP Ztied1.D, Pg/M, Ztied1.D, Zop2.D + /// + public static Vector MinPairwise(Vector left, Vector right) => MinPairwise(left, right); // Multiply-add, addend first 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 cc1757f072fe88..078cb1537d9fa1 100644 --- a/src/libraries/System.Runtime.Intrinsics/ref/System.Runtime.Intrinsics.cs +++ b/src/libraries/System.Runtime.Intrinsics/ref/System.Runtime.Intrinsics.cs @@ -6304,6 +6304,30 @@ internal Arm64() { } public static System.Numerics.Vector InterleavingXorOddEven(System.Numerics.Vector even, System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } public static System.Numerics.Vector InterleavingXorOddEven(System.Numerics.Vector even, System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } public static System.Numerics.Vector InterleavingXorOddEven(System.Numerics.Vector even, System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector MaxNumberPairwise(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector MaxNumberPairwise(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector MaxPairwise(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector MaxPairwise(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector MaxPairwise(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector MaxPairwise(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector MaxPairwise(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector MaxPairwise(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector MaxPairwise(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector MaxPairwise(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector MaxPairwise(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector MaxPairwise(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector MinNumberPairwise(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector MinNumberPairwise(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector MinPairwise(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector MinPairwise(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector MinPairwise(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector MinPairwise(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector MinPairwise(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector MinPairwise(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector MinPairwise(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector MinPairwise(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector MinPairwise(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector MinPairwise(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } public static System.Numerics.Vector MultiplyAddBySelectedScalar(System.Numerics.Vector addend, System.Numerics.Vector left, System.Numerics.Vector right, [ConstantExpected] byte rightIndex) { throw null; } public static System.Numerics.Vector MultiplyAddBySelectedScalar(System.Numerics.Vector addend, System.Numerics.Vector left, System.Numerics.Vector right, [ConstantExpected] byte rightIndex) { throw null; } public static System.Numerics.Vector MultiplyAddBySelectedScalar(System.Numerics.Vector addend, System.Numerics.Vector left, System.Numerics.Vector right, [ConstantExpected] byte rightIndex) { throw null; } diff --git a/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs b/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs index 38f6d51b32af07..87ebbfbbdf8670 100644 --- a/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs +++ b/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs @@ -5039,6 +5039,34 @@ ("SveVecTernOpTest.template", new Dictionary { ["TestName"] = "Sve2_InterleavingXorOddEven_uint", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "InterleavingXorOddEven", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt32", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp3"] = "TestLibrary.Generator.GetUInt32()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "result[i] != Helpers.InterleavingXorOddEven(firstOp, secondOp, thirdOp)[i]", ["GetIterResult"] = "Helpers.InterleavingXorOddEven(first, second, third)[i]"}), ("SveVecTernOpTest.template", new Dictionary { ["TestName"] = "Sve2_InterleavingXorOddEven_ulong", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "InterleavingXorOddEven", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt64", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "UInt64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()", ["NextValueOp3"] = "TestLibrary.Generator.GetUInt64()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "result[i] != Helpers.InterleavingXorOddEven(firstOp, secondOp, thirdOp)[i]", ["GetIterResult"] = "Helpers.InterleavingXorOddEven(first, second, third)[i]"}), + ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve2_MaxNumberPairwise_float", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MaxNumberPairwise", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Single", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Single", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Single", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()", ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.MaxNumberPairwiseSve(left, right, i) != result[i]", ["GetIterResult"] = "Helpers.MaxNumberPairwiseSve(left, right, i)"}), + ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve2_MaxNumberPairwise_double", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MaxNumberPairwise", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Double", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Double", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Double", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()", ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.MaxNumberPairwiseSve(left, right, i) != result[i]", ["GetIterResult"] = "Helpers.MaxNumberPairwiseSve(left, right, i)"}), + + ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve2_MaxPairwise_float", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MaxPairwise", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Single", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Single", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Single", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()", ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.MaxPairwiseSve(left, right, i) != result[i]", ["GetIterResult"] = "Helpers.MaxPairwiseSve(left, right, i)"}), + ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve2_MaxPairwise_double", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MaxPairwise", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Double", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Double", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Double", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()", ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.MaxPairwiseSve(left, right, i) != result[i]", ["GetIterResult"] = "Helpers.MaxPairwiseSve(left, right, i)"}), + ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve2_MaxPairwise_sbyte", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MaxPairwise", ["RetVectorType"] = "Vector", ["RetBaseType"] = "SByte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "SByte", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.MaxPairwiseSve(left, right, i) != result[i]", ["GetIterResult"] = "Helpers.MaxPairwiseSve(left, right, i)"}), + ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve2_MaxPairwise_short", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MaxPairwise", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.MaxPairwiseSve(left, right, i) != result[i]", ["GetIterResult"] = "Helpers.MaxPairwiseSve(left, right, i)"}), + ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve2_MaxPairwise_int", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MaxPairwise", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.MaxPairwiseSve(left, right, i) != result[i]", ["GetIterResult"] = "Helpers.MaxPairwiseSve(left, right, i)"}), + ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve2_MaxPairwise_long", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MaxPairwise", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.MaxPairwiseSve(left, right, i) != result[i]", ["GetIterResult"] = "Helpers.MaxPairwiseSve(left, right, i)"}), + ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve2_MaxPairwise_byte", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MaxPairwise", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Byte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Byte", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetByte()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.MaxPairwiseSve(left, right, i) != result[i]", ["GetIterResult"] = "Helpers.MaxPairwiseSve(left, right, i)"}), + ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve2_MaxPairwise_ushort", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MaxPairwise", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt16()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.MaxPairwiseSve(left, right, i) != result[i]", ["GetIterResult"] = "Helpers.MaxPairwiseSve(left, right, i)"}), + ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve2_MaxPairwise_uint", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MaxPairwise", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.MaxPairwiseSve(left, right, i) != result[i]", ["GetIterResult"] = "Helpers.MaxPairwiseSve(left, right, i)"}), + ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve2_MaxPairwise_ulong", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MaxPairwise", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.MaxPairwiseSve(left, right, i) != result[i]", ["GetIterResult"] = "Helpers.MaxPairwiseSve(left, right, i)"}), + + ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve2_MinNumberPairwise_float", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MinNumberPairwise", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Single", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Single", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Single", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()", ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.MinNumberPairwiseSve(left, right, i) != result[i]", ["GetIterResult"] = "Helpers.MinNumberPairwiseSve(left, right, i)"}), + ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve2_MinNumberPairwise_double", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MinNumberPairwise", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Double", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Double", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Double", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()", ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.MinNumberPairwiseSve(left, right, i) != result[i]", ["GetIterResult"] = "Helpers.MinNumberPairwiseSve(left, right, i)"}), + + ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve2_MinPairwise_float", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MinPairwise", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Single", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Single", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Single", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()", ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.MinPairwiseSve(left, right, i) != result[i]", ["GetIterResult"] = "Helpers.MinPairwiseSve(left, right, i)"}), + ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve2_MinPairwise_double", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MinPairwise", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Double", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Double", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Double", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()", ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.MinPairwiseSve(left, right, i) != result[i]", ["GetIterResult"] = "Helpers.MinPairwiseSve(left, right, i)"}), + ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve2_MinPairwise_sbyte", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MinPairwise", ["RetVectorType"] = "Vector", ["RetBaseType"] = "SByte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "SByte", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.MinPairwiseSve(left, right, i) != result[i]", ["GetIterResult"] = "Helpers.MinPairwiseSve(left, right, i)"}), + ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve2_MinPairwise_short", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MinPairwise", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.MinPairwiseSve(left, right, i) != result[i]", ["GetIterResult"] = "Helpers.MinPairwiseSve(left, right, i)"}), + ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve2_MinPairwise_int", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MinPairwise", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.MinPairwiseSve(left, right, i) != result[i]", ["GetIterResult"] = "Helpers.MinPairwiseSve(left, right, i)"}), + ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve2_MinPairwise_long", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MinPairwise", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.MinPairwiseSve(left, right, i) != result[i]", ["GetIterResult"] = "Helpers.MinPairwiseSve(left, right, i)"}), + ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve2_MinPairwise_byte", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MinPairwise", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Byte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Byte", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetByte()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.MinPairwiseSve(left, right, i) != result[i]", ["GetIterResult"] = "Helpers.MinPairwiseSve(left, right, i)"}), + ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve2_MinPairwise_ushort", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MinPairwise", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt16()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.MinPairwiseSve(left, right, i) != result[i]", ["GetIterResult"] = "Helpers.MinPairwiseSve(left, right, i)"}), + ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve2_MinPairwise_uint", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MinPairwise", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.MinPairwiseSve(left, right, i) != result[i]", ["GetIterResult"] = "Helpers.MinPairwiseSve(left, right, i)"}), + ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve2_MinPairwise_ulong", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MinPairwise", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.MinPairwiseSve(left, right, i) != result[i]", ["GetIterResult"] = "Helpers.MinPairwiseSve(left, right, i)"}), + ("SveVecImmTernOpTest.template",new Dictionary {["TestName"] = "Sve2_MultiplyAddBySelectedScalar_short", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16",["Op4BaseType"] = "Byte",["LargestVectorSize"] = "64",["NextValueOp1"] = "TestLibrary.Generator.GetInt16()",["NextValueOp2"] = "TestLibrary.Generator.GetInt16()",["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskInt16()", ["ConvertFunc"] = "", ["Imm"] = "3", ["InvalidImm"] = "8", ["ValidateIterResult"] = "result[i] != Helpers.MultiplyAdd(firstOp[i], secondOp[i], thirdOp[Imm])", ["GetIterResult"] = "Helpers.MultiplyAdd(firstOp[i], secondOp[i], thirdOp[Imm])",}), ("SveVecImmTernOpTest.template",new Dictionary {["TestName"] = "Sve2_MultiplyAddBySelectedScalar_int", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int32", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int32",["Op4BaseType"] = "Byte",["LargestVectorSize"] = "64",["NextValueOp1"] = "TestLibrary.Generator.GetInt32()",["NextValueOp2"] = "TestLibrary.Generator.GetInt32()",["NextValueOp3"] = "TestLibrary.Generator.GetInt32()", ["NextValueMask"] = "Helpers.getMaskInt32()", ["ConvertFunc"] = "", ["Imm"] = "2", ["InvalidImm"] = "4", ["ValidateIterResult"] = "result[i] != Helpers.MultiplyAdd(firstOp[i], secondOp[i], thirdOp[Imm])", ["GetIterResult"] = "Helpers.MultiplyAdd(firstOp[i], secondOp[i], thirdOp[Imm])",}), ("SveVecImmTernOpTest.template",new Dictionary {["TestName"] = "Sve2_MultiplyAddBySelectedScalar_long", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyAddBySelectedScalar", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int64", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int64",["Op4BaseType"] = "Byte",["LargestVectorSize"] = "64",["NextValueOp1"] = "TestLibrary.Generator.GetInt64()",["NextValueOp2"] = "TestLibrary.Generator.GetInt64()",["NextValueOp3"] = "TestLibrary.Generator.GetInt64()", ["NextValueMask"] = "Helpers.getMaskInt64()", ["ConvertFunc"] = "", ["Imm"] = "1", ["InvalidImm"] = "2", ["ValidateIterResult"] = "result[i] != Helpers.MultiplyAdd(firstOp[i], secondOp[i], thirdOp[Imm])", ["GetIterResult"] = "Helpers.MultiplyAdd(firstOp[i], secondOp[i], thirdOp[Imm])",}), diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Helpers.cs b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Helpers.cs index d8643e94617d3b..98ec949d17ea1d 100644 --- a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Helpers.cs +++ b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Helpers.cs @@ -5617,12 +5617,20 @@ private static (ulong val, bool ovf) ShiftOvf(ulong value, int shift) public static float MaxNumberPairwise(float[] op1, float[] op2, int i) => Pairwise(MaxNumber, op1, op2, i); + public static float MaxNumberPairwiseSve(float[] op1, float[] op2, int i) => (i % 2 == 0) ? MaxNumber(op1[i], op1[i + 1]) : MaxNumber(op2[i - 1], op2[i]); + + public static float MaxPairwiseSve(float[] op1, float[] op2, int i) => (i % 2 == 0) ? Max(op1[i], op1[i + 1]) : Max(op2[i - 1], op2[i]); + public static float MinNumber(float op1, float op2) => float.IsNaN(op1) ? op2 : (float.IsNaN(op2) ? op1 : MathF.Min(op1, op2)); public static float MinNumberPairwise(float[] op1, int i) => Pairwise(MinNumber, op1, i); public static float MinNumberPairwise(float[] op1, float[] op2, int i) => Pairwise(MinNumber, op1, op2, i); + public static float MinNumberPairwiseSve(float[] op1, float[] op2, int i) => (i % 2 == 0) ? MinNumber(op1[i], op1[i + 1]) : MinNumber(op2[i - 1], op2[i]); + + public static float MinPairwiseSve(float[] op1, float[] op2, int i) => (i % 2 == 0) ? Min(op1[i], op1[i + 1]) : Min(op2[i - 1], op2[i]); + public static float[] MultiplyAddRotateComplex(float[] op1, float[] op2, float[] op3, byte imm) { for (int i = 0; i < op1.Length; i += 2) @@ -5839,12 +5847,20 @@ public static float FPExponentialAccelerator(uint op1) public static double MaxNumberPairwise(double[] op1, double[] op2, int i) => Pairwise(MaxNumber, op1, op2, i); + public static double MaxPairwiseSve(double[] op1, double[] op2, int i) => (i % 2 == 0) ? Max(op1[i], op1[i + 1]) : Max(op2[i - 1], op2[i]); + + public static double MaxNumberPairwiseSve(double[] op1, double[] op2, int i) => (i % 2 == 0) ? MaxNumber(op1[i], op1[i + 1]) : MaxNumber(op2[i - 1], op2[i]); + public static double MinNumber(double op1, double op2) => double.IsNaN(op1) ? op2 : (double.IsNaN(op2) ? op1 : Math.Min(op1, op2)); public static double MinNumberPairwise(double[] op1, int i) => Pairwise(MinNumber, op1, i); public static double MinNumberPairwise(double[] op1, double[] op2, int i) => Pairwise(MinNumber, op1, op2, i); + public static double MinNumberPairwiseSve(double[] op1, double[] op2, int i) => (i % 2 == 0) ? MinNumber(op1[i], op1[i + 1]) : MinNumber(op2[i - 1], op2[i]); + + public static double MinPairwiseSve(double[] op1, double[] op2, int i) => (i % 2 == 0) ? Min(op1[i], op1[i + 1]) : Min(op2[i - 1], op2[i]); + public static double[] MultiplyAddRotateComplex(double[] op1, double[] op2, double[] op3, byte imm) { for (int i = 0; i < op1.Length; i += 2) @@ -6158,12 +6174,16 @@ public static sbyte AddPairwiseSve(sbyte[] op1, sbyte[] op2, int i) public static sbyte MaxPairwise(sbyte[] op1, sbyte[] op2, int i) => Pairwise(Max, op1, op2, i); + public static sbyte MaxPairwiseSve(sbyte[] op1, sbyte[] op2, int i) => (i % 2 == 0) ? Max(op1[i], op1[i + 1]) : Max(op2[i - 1], op2[i]); + public static sbyte Min(sbyte op1, sbyte op2) => Math.Min(op1, op2); public static sbyte MinPairwise(sbyte[] op1, int i) => Pairwise(Min, op1, i); public static sbyte MinPairwise(sbyte[] op1, sbyte[] op2, int i) => Pairwise(Min, op1, op2, i); + public static sbyte MinPairwiseSve(sbyte[] op1, sbyte[] op2, int i) => (i % 2 == 0) ? Min(op1[i], op1[i + 1]) : Min(op2[i - 1], op2[i]); + public static sbyte Multiply(sbyte op1, sbyte op2) => (sbyte)(op1 * op2); public static sbyte MultiplyAdd(sbyte op1, sbyte op2, sbyte op3) => (sbyte)(op1 + (sbyte)(op2 * op3)); @@ -6219,12 +6239,16 @@ public static byte AddPairwiseSve(byte[] op1, byte[] op2, int i) public static byte MaxPairwise(byte[] op1, byte[] op2, int i) => Pairwise(Max, op1, op2, i); + public static byte MaxPairwiseSve(byte[] op1, byte[] op2, int i) => (i % 2 == 0) ? Max(op1[i], op1[i + 1]) : Max(op2[i - 1], op2[i]); + public static byte Min(byte op1, byte op2) => Math.Min(op1, op2); public static byte MinPairwise(byte[] op1, int i) => Pairwise(Min, op1, i); public static byte MinPairwise(byte[] op1, byte[] op2, int i) => Pairwise(Min, op1, op2, i); + public static byte MinPairwiseSve(byte[] op1, byte[] op2, int i) => (i % 2 == 0) ? Min(op1[i], op1[i + 1]) : Min(op2[i - 1], op2[i]); + public static byte Multiply(byte op1, byte op2) => (byte)(op1 * op2); public static byte MultiplyAdd(byte op1, byte op2, byte op3) => (byte)(op1 + (byte)(op2 * op3)); @@ -6283,12 +6307,16 @@ public static short AddPairwiseSve(short[] op1, short[] op2, int i) public static short MaxPairwise(short[] op1, short[] op2, int i) => Pairwise(Max, op1, op2, i); + public static short MaxPairwiseSve(short[] op1, short[] op2, int i) => (i % 2 == 0) ? Max(op1[i], op1[i + 1]) : Max(op2[i - 1], op2[i]); + public static short Min(short op1, short op2) => Math.Min(op1, op2); public static short MinPairwise(short[] op1, int i) => Pairwise(Min, op1, i); public static short MinPairwise(short[] op1, short[] op2, int i) => Pairwise(Min, op1, op2, i); + public static short MinPairwiseSve(short[] op1, short[] op2, int i) => (i % 2 == 0) ? Min(op1[i], op1[i + 1]) : Min(op2[i - 1], op2[i]); + public static short Multiply(short op1, short op2) => (short)(op1 * op2); public static short MultiplyAdd(short op1, short op2, short op3) => (short)(op1 + (short)(op2 * op3)); @@ -6347,12 +6375,16 @@ public static ushort AddPairwiseSve(ushort[] op1, ushort[] op2, int i) public static ushort MaxPairwise(ushort[] op1, ushort[] op2, int i) => Pairwise(Max, op1, op2, i); + public static ushort MaxPairwiseSve(ushort[] op1, ushort[] op2, int i) => (i % 2 == 0) ? Max(op1[i], op1[i + 1]) : Max(op2[i - 1], op2[i]); + public static ushort Min(ushort op1, ushort op2) => Math.Min(op1, op2); public static ushort MinPairwise(ushort[] op1, int i) => Pairwise(Min, op1, i); public static ushort MinPairwise(ushort[] op1, ushort[] op2, int i) => Pairwise(Min, op1, op2, i); + public static ushort MinPairwiseSve(ushort[] op1, ushort[] op2, int i) => (i % 2 == 0) ? Min(op1[i], op1[i + 1]) : Min(op2[i - 1], op2[i]); + public static ushort Multiply(ushort op1, ushort op2) => (ushort)(op1 * op2); public static ushort MultiplyAdd(ushort op1, ushort op2, ushort op3) => (ushort)(op1 + (ushort)(op2 * op3)); @@ -6411,12 +6443,16 @@ public static int AddPairwiseSve(int[] op1, int[] op2, int i) public static int MaxPairwise(int[] op1, int[] op2, int i) => Pairwise(Max, op1, op2, i); + public static int MaxPairwiseSve(int[] op1, int[] op2, int i) => (i % 2 == 0) ? Max(op1[i], op1[i + 1]) : Max(op2[i - 1], op2[i]); + public static int Min(int op1, int op2) => Math.Min(op1, op2); public static int MinPairwise(int[] op1, int i) => Pairwise(Min, op1, i); public static int MinPairwise(int[] op1, int[] op2, int i) => Pairwise(Min, op1, op2, i); + public static int MinPairwiseSve(int[] op1, int[] op2, int i) => (i % 2 == 0) ? Min(op1[i], op1[i + 1]) : Min(op2[i - 1], op2[i]); + public static int Multiply(int op1, int op2) => (int)(op1 * op2); public static int MultiplyAdd(int op1, int op2, int op3) => (int)(op1 + (int)(op2 * op3)); @@ -6475,12 +6511,16 @@ public static uint AddPairwiseSve(uint[] op1, uint[] op2, int i) public static uint MaxPairwise(uint[] op1, uint[] op2, int i) => Pairwise(Max, op1, op2, i); + public static uint MaxPairwiseSve(uint[] op1, uint[] op2, int i) => (i % 2 == 0) ? Max(op1[i], op1[i + 1]) : Max(op2[i - 1], op2[i]); + public static uint Min(uint op1, uint op2) => Math.Min(op1, op2); public static uint MinPairwise(uint[] op1, int i) => Pairwise(Min, op1, i); public static uint MinPairwise(uint[] op1, uint[] op2, int i) => Pairwise(Min, op1, op2, i); + public static uint MinPairwiseSve(uint[] op1, uint[] op2, int i) => (i % 2 == 0) ? Min(op1[i], op1[i + 1]) : Min(op2[i - 1], op2[i]); + public static uint Multiply(uint op1, uint op2) => (uint)(op1 * op2); public static uint MultiplyAdd(uint op1, uint op2, uint op3) => (uint)(op1 + (uint)(op2 * op3)); @@ -6539,12 +6579,16 @@ public static long AddPairwiseSve(long[] op1, long[] op2, int i) public static long MaxPairwise(long[] op1, long[] op2, int i) => Pairwise(Max, op1, op2, i); + public static long MaxPairwiseSve(long[] op1, long[] op2, int i) => (i % 2 == 0) ? Max(op1[i], op1[i + 1]) : Max(op2[i - 1], op2[i]); + public static long Min(long op1, long op2) => Math.Min(op1, op2); public static long MinPairwise(long[] op1, int i) => Pairwise(Min, op1, i); public static long MinPairwise(long[] op1, long[] op2, int i) => Pairwise(Min, op1, op2, i); + public static long MinPairwiseSve(long[] op1, long[] op2, int i) => (i % 2 == 0) ? Min(op1[i], op1[i + 1]) : Min(op2[i - 1], op2[i]); + public static long Multiply(long op1, long op2) => (long)(op1 * op2); public static long MultiplyAdd(long op1, long op2, long op3) => (long)(op1 + (long)(op2 * op3)); @@ -6603,12 +6647,16 @@ public static ulong AddPairwiseSve(ulong[] op1, ulong[] op2, int i) public static ulong MaxPairwise(ulong[] op1, ulong[] op2, int i) => Pairwise(Max, op1, op2, i); + public static ulong MaxPairwiseSve(ulong[] op1, ulong[] op2, int i) => (i % 2 == 0) ? Max(op1[i], op1[i + 1]) : Max(op2[i - 1], op2[i]); + public static ulong Min(ulong op1, ulong op2) => Math.Min(op1, op2); public static ulong MinPairwise(ulong[] op1, int i) => Pairwise(Min, op1, i); public static ulong MinPairwise(ulong[] op1, ulong[] op2, int i) => Pairwise(Min, op1, op2, i); + public static ulong MinPairwiseSve(ulong[] op1, ulong[] op2, int i) => (i % 2 == 0) ? Min(op1[i], op1[i + 1]) : Min(op2[i - 1], op2[i]); + public static ulong Multiply(ulong op1, ulong op2) => (ulong)(op1 * op2); public static ulong MultiplyAdd(ulong op1, ulong op2, ulong op3) => (ulong)(op1 + (ulong)(op2 * op3));