From 9160bec20bbda2fdf08dcbbe8123bcb1507d1938 Mon Sep 17 00:00:00 2001 From: Jonathan Davies Date: Thu, 17 Jul 2025 12:40:23 +0000 Subject: [PATCH] arm64: Add Sve2 Saturating functions * Implements #115479 * In the Sve2 Maths API it has MultiplyDoublingWideningAndSubtractSaturateOdd with and without the index argument. In all the other cases the index case has a function name with BySelectedScalar in it. I've added the function MultiplyDoublingWideningBySelectedScalarAndAddSaturateEven to be consistant with the other functions. --- src/coreclr/jit/codegenarm64test.cpp | 4 +- src/coreclr/jit/emitarm64sve.cpp | 4 +- src/coreclr/jit/hwintrinsicarm64.cpp | 8 + src/coreclr/jit/hwintrinsiclistarm64sve.h | 15 +- src/coreclr/jit/lsraarm64.cpp | 4 + .../Arm/Sve2.PlatformNotSupported.cs | 265 ++++++++++++++++++ .../src/System/Runtime/Intrinsics/Arm/Sve2.cs | 265 ++++++++++++++++++ .../ref/System.Runtime.Intrinsics.cs | 34 +++ .../GenerateHWIntrinsicTests_Arm.cs | 46 +++ 9 files changed, 640 insertions(+), 5 deletions(-) diff --git a/src/coreclr/jit/codegenarm64test.cpp b/src/coreclr/jit/codegenarm64test.cpp index aefe56ea0f0429..a1af57722e1389 100644 --- a/src/coreclr/jit/codegenarm64test.cpp +++ b/src/coreclr/jit/codegenarm64test.cpp @@ -5722,13 +5722,13 @@ void CodeGen::genArm64EmitterUnitTestsSve() theEmitter->emitIns_R_R_R(INS_sve_sqdmlslbt, EA_SCALABLE, REG_V6, REG_V7, REG_V8, INS_OPTS_SCALABLE_D); // SQDMLSLBT ., ., . theEmitter->emitIns_R_R_R(INS_sve_sqdmlalb, EA_SCALABLE, REG_V0, REG_V1, REG_V2, - INS_OPTS_SCALABLE_H); // SQDMLALB ., ., . + INS_OPTS_SCALABLE_S); // SQDMLALB ., ., . theEmitter->emitIns_R_R_R(INS_sve_sqdmlalt, EA_SCALABLE, REG_V3, REG_V4, REG_V5, INS_OPTS_SCALABLE_S); // SQDMLALT ., ., . theEmitter->emitIns_R_R_R(INS_sve_sqdmlslb, EA_SCALABLE, REG_V6, REG_V7, REG_V8, INS_OPTS_SCALABLE_D); // SQDMLSLB ., ., . theEmitter->emitIns_R_R_R(INS_sve_sqdmlslt, EA_SCALABLE, REG_V9, REG_V10, REG_V11, - INS_OPTS_SCALABLE_H); // SQDMLSLT ., ., . + INS_OPTS_SCALABLE_D); // SQDMLSLT ., ., . theEmitter->emitIns_R_R_R(INS_sve_sabalb, EA_SCALABLE, REG_V0, REG_V1, REG_V2, INS_OPTS_SCALABLE_H); // SABALB ., ., . theEmitter->emitIns_R_R_R(INS_sve_sabalt, EA_SCALABLE, REG_V3, REG_V4, REG_V5, diff --git a/src/coreclr/jit/emitarm64sve.cpp b/src/coreclr/jit/emitarm64sve.cpp index 25f1817ae45c9a..44117beb21bdae 100644 --- a/src/coreclr/jit/emitarm64sve.cpp +++ b/src/coreclr/jit/emitarm64sve.cpp @@ -5534,7 +5534,7 @@ void emitter::emitInsSve_R_R_R_I(instruction ins, assert(isVectorRegister(reg2)); // nnnnn assert(isLowVectorRegister(reg3)); // mmmm - if (opt == INS_OPTS_SCALABLE_H) + if (opt == INS_OPTS_SCALABLE_S) { assert((REG_V0 <= reg3) && (reg3 <= REG_V7)); // mmm assert(isValidUimm<3>(imm)); // ii i @@ -5542,7 +5542,7 @@ void emitter::emitInsSve_R_R_R_I(instruction ins, } else { - assert(opt == INS_OPTS_SCALABLE_S); + assert(opt == INS_OPTS_SCALABLE_D); assert(isValidUimm<2>(imm)); // ii fmt = IF_SVE_FJ_3B; } diff --git a/src/coreclr/jit/hwintrinsicarm64.cpp b/src/coreclr/jit/hwintrinsicarm64.cpp index 18ba7125359aff..33fa991963e3b6 100644 --- a/src/coreclr/jit/hwintrinsicarm64.cpp +++ b/src/coreclr/jit/hwintrinsicarm64.cpp @@ -306,6 +306,10 @@ void Compiler::getHWIntrinsicImmTypes(NamedIntrinsic intrinsic, intrinsic == NI_Sve2_MultiplyBySelectedScalarWideningOdd || intrinsic == NI_Sve2_MultiplyBySelectedScalarWideningOddAndAdd || intrinsic == NI_Sve2_MultiplyBySelectedScalarWideningOddAndSubtract || + intrinsic == NI_Sve2_MultiplyDoublingWideningBySelectedScalarAndAddSaturateEven || + intrinsic == NI_Sve2_MultiplyDoublingWideningBySelectedScalarAndAddSaturateOdd || + intrinsic == NI_Sve2_MultiplyDoublingWideningBySelectedScalarAndSubtractSaturateEven || + intrinsic == NI_Sve2_MultiplyDoublingWideningBySelectedScalarAndSubtractSaturateOdd || intrinsic == NI_Sve2_MultiplySubtractBySelectedScalar) { indexedElementBaseType = simdBaseType; @@ -386,6 +390,10 @@ void HWIntrinsicInfo::lookupImmBounds( case NI_Sve2_MultiplyBySelectedScalarWideningOdd: case NI_Sve2_MultiplyBySelectedScalarWideningOddAndAdd: case NI_Sve2_MultiplyBySelectedScalarWideningOddAndSubtract: + case NI_Sve2_MultiplyDoublingWideningBySelectedScalarAndAddSaturateEven: + case NI_Sve2_MultiplyDoublingWideningBySelectedScalarAndAddSaturateOdd: + case NI_Sve2_MultiplyDoublingWideningBySelectedScalarAndSubtractSaturateEven: + case NI_Sve2_MultiplyDoublingWideningBySelectedScalarAndSubtractSaturateOdd: // Index is on the half-width vector, hence double the maximum index. immUpperBound = Compiler::getSIMDVectorLength(simdSize, baseType) * 2 - 1; break; diff --git a/src/coreclr/jit/hwintrinsiclistarm64sve.h b/src/coreclr/jit/hwintrinsiclistarm64sve.h index e29129dde947bc..d9baf9d28c497a 100644 --- a/src/coreclr/jit/hwintrinsiclistarm64sve.h +++ b/src/coreclr/jit/hwintrinsiclistarm64sve.h @@ -312,7 +312,9 @@ HARDWARE_INTRINSIC(Sve, ZipLow, // ISA Function name SIMD size NumArg Instructions Category Flags // {TYP_BYTE, TYP_UBYTE, TYP_SHORT, TYP_USHORT, TYP_INT, TYP_UINT, TYP_LONG, TYP_ULONG, TYP_FLOAT, TYP_DOUBLE} // *************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** -#define FIRST_NI_Sve2 NI_Sve2_AbsoluteDifferenceAdd +// SVE2 Intrinsics +#define FIRST_NI_Sve2 NI_Sve2_AbsSaturate +HARDWARE_INTRINSIC(Sve2, AbsSaturate, -1, -1, {INS_sve_sqabs, INS_invalid, INS_sve_sqabs, INS_invalid, INS_sve_sqabs, INS_invalid, INS_sve_sqabs, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation) HARDWARE_INTRINSIC(Sve2, AbsoluteDifferenceAdd, -1, 3, {INS_sve_saba, INS_sve_uaba, INS_sve_saba, INS_sve_uaba, INS_sve_saba, INS_sve_uaba, INS_sve_saba, INS_sve_uaba, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_HasRMWSemantics) HARDWARE_INTRINSIC(Sve2, AbsoluteDifferenceWideningEven, -1, 2, {INS_invalid, INS_invalid, INS_sve_sabdlb, INS_sve_uabdlb, INS_sve_sabdlb, INS_sve_uabdlb, INS_sve_sabdlb, INS_sve_uabdlb, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable) HARDWARE_INTRINSIC(Sve2, AbsoluteDifferenceWideningLowerAndAddEven, -1, 3, {INS_invalid, INS_invalid, INS_sve_sabalb, INS_sve_uabalb, INS_sve_sabalb, INS_sve_uabalb, INS_sve_sabalb, INS_sve_uabalb, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_BaseTypeFromFirstArg|HW_Flag_HasRMWSemantics) @@ -349,6 +351,16 @@ HARDWARE_INTRINSIC(Sve2, MultiplyBySelectedScalarWideningEvenAndSubtrac HARDWARE_INTRINSIC(Sve2, MultiplyBySelectedScalarWideningOdd, -1, 3, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_smullt, INS_sve_umullt, INS_sve_smullt, INS_sve_umullt, INS_invalid, INS_invalid}, HW_Category_SIMDByIndexedElement, HW_Flag_Scalable|HW_Flag_HasImmediateOperand|HW_Flag_LowVectorOperation) HARDWARE_INTRINSIC(Sve2, MultiplyBySelectedScalarWideningOddAndAdd, -1, 4, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_smlalt, INS_sve_umlalt, INS_sve_smlalt, INS_sve_umlalt, INS_invalid, INS_invalid}, HW_Category_SIMDByIndexedElement, HW_Flag_Scalable|HW_Flag_HasRMWSemantics|HW_Flag_HasImmediateOperand|HW_Flag_LowVectorOperation) HARDWARE_INTRINSIC(Sve2, MultiplyBySelectedScalarWideningOddAndSubtract, -1, 4, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_smlslt, INS_sve_umlslt, INS_sve_smlslt, INS_sve_umlslt, INS_invalid, INS_invalid}, HW_Category_SIMDByIndexedElement, HW_Flag_Scalable|HW_Flag_HasRMWSemantics|HW_Flag_HasImmediateOperand|HW_Flag_LowVectorOperation) +HARDWARE_INTRINSIC(Sve2, MultiplyDoublingWideningAndAddSaturateEven, -1, 3, {INS_invalid, INS_invalid, INS_sve_sqdmlalb, INS_invalid, INS_sve_sqdmlalb, INS_invalid, INS_sve_sqdmlalb, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_HasRMWSemantics) +HARDWARE_INTRINSIC(Sve2, MultiplyDoublingWideningAndAddSaturateEvenOdd, -1, 3, {INS_invalid, INS_invalid, INS_sve_sqdmlalbt, INS_invalid, INS_sve_sqdmlalbt, INS_invalid, INS_sve_sqdmlalbt, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_HasRMWSemantics) +HARDWARE_INTRINSIC(Sve2, MultiplyDoublingWideningAndAddSaturateOdd, -1, 3, {INS_invalid, INS_invalid, INS_sve_sqdmlalt, INS_invalid, INS_sve_sqdmlalt, INS_invalid, INS_sve_sqdmlalt, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_HasRMWSemantics) +HARDWARE_INTRINSIC(Sve2, MultiplyDoublingWideningAndSubtractSaturateEven, -1, 3, {INS_invalid, INS_invalid, INS_sve_sqdmlslb, INS_invalid, INS_sve_sqdmlslb, INS_invalid, INS_sve_sqdmlslb, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_HasRMWSemantics) +HARDWARE_INTRINSIC(Sve2, MultiplyDoublingWideningAndSubtractSaturateEvenOdd, -1, 3, {INS_invalid, INS_invalid, INS_sve_sqdmlslbt, INS_invalid, INS_sve_sqdmlslbt, INS_invalid, INS_sve_sqdmlslbt, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_HasRMWSemantics) +HARDWARE_INTRINSIC(Sve2, MultiplyDoublingWideningAndSubtractSaturateOdd, -1, 3, {INS_invalid, INS_invalid, INS_sve_sqdmlslt, INS_invalid, INS_sve_sqdmlslt, INS_invalid, INS_sve_sqdmlslt, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_HasRMWSemantics) +HARDWARE_INTRINSIC(Sve2, MultiplyDoublingWideningBySelectedScalarAndAddSaturateEven, -1, 4, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_sqdmlalb, INS_invalid, INS_sve_sqdmlalb, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMDByIndexedElement, HW_Flag_Scalable|HW_Flag_HasRMWSemantics|HW_Flag_HasImmediateOperand|HW_Flag_LowVectorOperation) +HARDWARE_INTRINSIC(Sve2, MultiplyDoublingWideningBySelectedScalarAndAddSaturateOdd, -1, 4, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_sqdmlalt, INS_invalid, INS_sve_sqdmlalt, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMDByIndexedElement, HW_Flag_Scalable|HW_Flag_HasRMWSemantics|HW_Flag_HasImmediateOperand|HW_Flag_LowVectorOperation) +HARDWARE_INTRINSIC(Sve2, MultiplyDoublingWideningBySelectedScalarAndSubtractSaturateEven, -1, 4, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_sqdmlslb, INS_invalid, INS_sve_sqdmlslb, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMDByIndexedElement, HW_Flag_Scalable|HW_Flag_HasRMWSemantics|HW_Flag_HasImmediateOperand|HW_Flag_LowVectorOperation) +HARDWARE_INTRINSIC(Sve2, MultiplyDoublingWideningBySelectedScalarAndSubtractSaturateOdd, -1, 4, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_sqdmlslt, INS_invalid, INS_sve_sqdmlslt, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMDByIndexedElement, HW_Flag_Scalable|HW_Flag_HasRMWSemantics|HW_Flag_HasImmediateOperand|HW_Flag_LowVectorOperation) HARDWARE_INTRINSIC(Sve2, MultiplySubtractBySelectedScalar, -1, 4, {INS_invalid, INS_invalid, INS_sve_mls, INS_sve_mls, INS_sve_mls, INS_sve_mls, INS_sve_mls, INS_sve_mls, INS_invalid, INS_invalid}, HW_Category_SIMDByIndexedElement, HW_Flag_Scalable|HW_Flag_HasImmediateOperand|HW_Flag_HasRMWSemantics|HW_Flag_LowVectorOperation) HARDWARE_INTRINSIC(Sve2, MultiplyWideningEven, -1, 2, {INS_invalid, INS_invalid, INS_sve_smullb, INS_sve_umullb, INS_sve_smullb, INS_sve_umullb, INS_sve_smullb, INS_sve_umullb, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable) HARDWARE_INTRINSIC(Sve2, MultiplyWideningEvenAndAdd, -1, 3, {INS_invalid, INS_invalid, INS_sve_smlalb, INS_sve_umlalb, INS_sve_smlalb, INS_sve_umlalb, INS_sve_smlalb, INS_sve_umlalb, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_HasRMWSemantics) @@ -356,6 +368,7 @@ HARDWARE_INTRINSIC(Sve2, MultiplyWideningEvenAndSubtract, HARDWARE_INTRINSIC(Sve2, MultiplyWideningOdd, -1, 2, {INS_invalid, INS_invalid, INS_sve_smullt, INS_sve_umullt, INS_sve_smullt, INS_sve_umullt, INS_sve_smullt, INS_sve_umullt, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable) HARDWARE_INTRINSIC(Sve2, MultiplyWideningOddAndAdd, -1, 3, {INS_invalid, INS_invalid, INS_sve_smlalt, INS_sve_umlalt, INS_sve_smlalt, INS_sve_umlalt, INS_sve_smlalt, INS_sve_umlalt, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_HasRMWSemantics) HARDWARE_INTRINSIC(Sve2, MultiplyWideningOddAndSubtract, -1, 3, {INS_invalid, INS_invalid, INS_sve_smlslt, INS_sve_umlslt, INS_sve_smlslt, INS_sve_umlslt, INS_sve_smlslt, INS_sve_umlslt, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_HasRMWSemantics) +HARDWARE_INTRINSIC(Sve2, NegateSaturate, -1, -1, {INS_sve_sqneg, INS_invalid, INS_sve_sqneg, INS_invalid, INS_sve_sqneg, INS_invalid, INS_sve_sqneg, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation) HARDWARE_INTRINSIC(Sve2, PolynomialMultiply, -1, 2, {INS_sve_pmul, INS_sve_pmul, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable) HARDWARE_INTRINSIC(Sve2, PolynomialMultiplyWideningEven, -1, 2, {INS_invalid, INS_invalid, INS_invalid, INS_sve_pmullb, INS_invalid, INS_invalid, INS_invalid, INS_sve_pmullb, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable) HARDWARE_INTRINSIC(Sve2, PolynomialMultiplyWideningOdd, -1, 2, {INS_invalid, INS_invalid, INS_invalid, INS_sve_pmullt, INS_invalid, INS_invalid, INS_invalid, INS_sve_pmullt, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable) diff --git a/src/coreclr/jit/lsraarm64.cpp b/src/coreclr/jit/lsraarm64.cpp index 87d73acd0da7e6..d6c50bb0cbbdb1 100644 --- a/src/coreclr/jit/lsraarm64.cpp +++ b/src/coreclr/jit/lsraarm64.cpp @@ -2170,6 +2170,10 @@ SingleTypeRegSet LinearScan::getOperandCandidates(GenTreeHWIntrinsic* intrinsicT case NI_Sve2_MultiplySubtractBySelectedScalar: case NI_Sve2_MultiplyBySelectedScalarWideningEvenAndSubtract: case NI_Sve2_MultiplyBySelectedScalarWideningOddAndSubtract: + case NI_Sve2_MultiplyDoublingWideningBySelectedScalarAndAddSaturateEven: + case NI_Sve2_MultiplyDoublingWideningBySelectedScalarAndAddSaturateOdd: + case NI_Sve2_MultiplyDoublingWideningBySelectedScalarAndSubtractSaturateEven: + case NI_Sve2_MultiplyDoublingWideningBySelectedScalarAndSubtractSaturateOdd: isLowVectorOpNum = (opNum == 3); break; case NI_Sve_MultiplyBySelectedScalar: 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..e455b093f6b820 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 @@ -28,6 +28,46 @@ internal Arm64() { } public static new bool IsSupported { get => IsSupported; } } + + // Saturating absolute value + + /// + /// svint8_t svqabs[_s8]_m(svint8_t inactive, svbool_t pg, svint8_t op) + /// svint8_t svqabs[_s8]_x(svbool_t pg, svint8_t op) + /// svint8_t svqabs[_s8]_z(svbool_t pg, svint8_t op) + /// SQABS Ztied.B, Pg/M, Zop.B + /// SQABS Ztied.B, Pg/M, Ztied.B + /// + public static Vector AbsSaturate(Vector value) { throw new PlatformNotSupportedException(); } + + /// + /// svint16_t svqabs[_s16]_m(svint16_t inactive, svbool_t pg, svint16_t op) + /// svint16_t svqabs[_s16]_x(svbool_t pg, svint16_t op) + /// svint16_t svqabs[_s16]_z(svbool_t pg, svint16_t op) + /// SQABS Ztied.H, Pg/M, Zop.H + /// SQABS Ztied.H, Pg/M, Ztied.H + /// + public static Vector AbsSaturate(Vector value) { throw new PlatformNotSupportedException(); } + + /// + /// svint32_t svqabs[_s32]_m(svint32_t inactive, svbool_t pg, svint32_t op) + /// svint32_t svqabs[_s32]_x(svbool_t pg, svint32_t op) + /// svint32_t svqabs[_s32]_z(svbool_t pg, svint32_t op) + /// SQABS Ztied.S, Pg/M, Zop.S + /// SQABS Ztied.S, Pg/M, Ztied.S + /// + public static Vector AbsSaturate(Vector value) { throw new PlatformNotSupportedException(); } + + /// + /// svint64_t svqabs[_s64]_m(svint64_t inactive, svbool_t pg, svint64_t op) + /// svint64_t svqabs[_s64]_x(svbool_t pg, svint64_t op) + /// svint64_t svqabs[_s64]_z(svbool_t pg, svint64_t op) + /// SQABS Ztied.D, Pg/M, Zop.D + /// SQABS Ztied.D, Pg/M, Ztied.D + /// + public static Vector AbsSaturate(Vector value) { throw new PlatformNotSupportedException(); } + + // Absolute difference and accumulate /// @@ -1936,6 +1976,231 @@ internal Arm64() { } public static Vector PolynomialMultiplyWideningOdd(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + // Saturating doubling multiply-add long (bottom) + + /// + /// svint16_t svqdmlalb[_s16](svint16_t op1, svint8_t op2, svint8_t op3) + /// SQDMLALB Ztied1.H, Zop2.B, Zop3.B + /// + public static Vector MultiplyDoublingWideningAndAddSaturateEven(Vector addend, Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svint32_t svqdmlalb[_s32](svint32_t op1, svint16_t op2, svint16_t op3) + /// SQDMLALB Ztied1.S, Zop2.H, Zop3.H + /// + public static Vector MultiplyDoublingWideningAndAddSaturateEven(Vector addend, Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svint64_t svqdmlalb[_s64](svint64_t op1, svint32_t op2, svint32_t op3) + /// SQDMLALB Ztied1.D, Zop2.S, Zop3.S + /// + public static Vector MultiplyDoublingWideningAndAddSaturateEven(Vector addend, Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + + // Saturating doubling multiply-add long (bottom × top) + + /// + /// svint16_t svqdmlalbt[_s16](svint16_t op1, svint8_t op2, svint8_t op3) + /// SQDMLALBT Ztied1.H, Zop2.B, Zop3.B + /// + public static Vector MultiplyDoublingWideningAndAddSaturateEvenOdd(Vector addend, Vector leftEven, Vector rightOdd) { throw new PlatformNotSupportedException(); } + + /// + /// svint32_t svqdmlalbt[_s32](svint32_t op1, svint16_t op2, svint16_t op3) + /// SQDMLALBT Ztied1.S, Zop2.H, Zop3.H + /// + public static Vector MultiplyDoublingWideningAndAddSaturateEvenOdd(Vector addend, Vector leftEven, Vector rightOdd) { throw new PlatformNotSupportedException(); } + + /// + /// svint64_t svqdmlalbt[_s64](svint64_t op1, svint32_t op2, svint32_t op3) + /// SQDMLALBT Ztied1.D, Zop2.S, Zop3.S + /// + public static Vector MultiplyDoublingWideningAndAddSaturateEvenOdd(Vector addend, Vector leftEven, Vector rightOdd) { throw new PlatformNotSupportedException(); } + + + // Saturating doubling multiply-add long (top) + + /// + /// svint16_t svqdmlalt[_s16](svint16_t op1, svint8_t op2, svint8_t op3) + /// SQDMLALT Ztied1.H, Zop2.B, Zop3.B + /// + public static Vector MultiplyDoublingWideningAndAddSaturateOdd(Vector addend, Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svint32_t svqdmlalt[_s32](svint32_t op1, svint16_t op2, svint16_t op3) + /// SQDMLALT Ztied1.S, Zop2.H, Zop3.H + /// + public static Vector MultiplyDoublingWideningAndAddSaturateOdd(Vector addend, Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svint64_t svqdmlalt[_s64](svint64_t op1, svint32_t op2, svint32_t op3) + /// SQDMLALT Ztied1.D, Zop2.S, Zop3.S + /// + public static Vector MultiplyDoublingWideningAndAddSaturateOdd(Vector addend, Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + + // Saturating doubling multiply-subtract long (bottom) + + /// + /// svint16_t svqdmlslb[_s16](svint16_t op1, svint8_t op2, svint8_t op3) + /// SQDMLSLB Ztied1.H, Zop2.B, Zop3.B + /// + public static Vector MultiplyDoublingWideningAndSubtractSaturateEven(Vector minuend, Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svint32_t svqdmlslb[_s32](svint32_t op1, svint16_t op2, svint16_t op3) + /// SQDMLSLB Ztied1.S, Zop2.H, Zop3.H + /// + public static Vector MultiplyDoublingWideningAndSubtractSaturateEven(Vector minuend, Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svint64_t svqdmlslb[_s64](svint64_t op1, svint32_t op2, svint32_t op3) + /// SQDMLSLB Ztied1.D, Zop2.S, Zop3.S + /// + public static Vector MultiplyDoublingWideningAndSubtractSaturateEven(Vector minuend, Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + + // Saturating doubling multiply-subtract long (bottom × top) + + /// + /// svint16_t svqdmlslbt[_s16](svint16_t op1, svint8_t op2, svint8_t op3) + /// SQDMLSLBT Ztied1.H, Zop2.B, Zop3.B + /// + public static Vector MultiplyDoublingWideningAndSubtractSaturateEvenOdd(Vector minuend, Vector leftEven, Vector rightOdd) { throw new PlatformNotSupportedException(); } + + /// + /// svint32_t svqdmlslbt[_s32](svint32_t op1, svint16_t op2, svint16_t op3) + /// SQDMLSLBT Ztied1.S, Zop2.H, Zop3.H + /// + public static Vector MultiplyDoublingWideningAndSubtractSaturateEvenOdd(Vector minuend, Vector leftEven, Vector rightOdd) { throw new PlatformNotSupportedException(); } + + /// + /// svint64_t svqdmlslbt[_s64](svint64_t op1, svint32_t op2, svint32_t op3) + /// SQDMLSLBT Ztied1.D, Zop2.S, Zop3.S + /// + public static Vector MultiplyDoublingWideningAndSubtractSaturateEvenOdd(Vector minuend, Vector leftEven, Vector rightOdd) { throw new PlatformNotSupportedException(); } + + + // Saturating doubling multiply-subtract long (top) + + /// + /// svint16_t svqdmlslt[_s16](svint16_t op1, svint8_t op2, svint8_t op3) + /// SQDMLSLT Ztied1.H, Zop2.B, Zop3.B + /// + public static Vector MultiplyDoublingWideningAndSubtractSaturateOdd(Vector minuend, Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svint32_t svqdmlslt[_s32](svint32_t op1, svint16_t op2, svint16_t op3) + /// SQDMLSLT Ztied1.S, Zop2.H, Zop3.H + /// + public static Vector MultiplyDoublingWideningAndSubtractSaturateOdd(Vector minuend, Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svint64_t svqdmlslt[_s64](svint64_t op1, svint32_t op2, svint32_t op3) + /// SQDMLSLT Ztied1.D, Zop2.S, Zop3.S + /// + public static Vector MultiplyDoublingWideningAndSubtractSaturateOdd(Vector minuend, Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + + // Saturating doubling multiply-add long with index (bottom) + + /// + /// svint32_t svqdmlalb_lane[_s32](svint32_t op1, svint16_t op2, svint16_t op3, uint64_t imm_index) + /// SQDMLALB Ztied1.S, Zop2.H, Zop3.H[imm_index] + /// + public static Vector MultiplyDoublingWideningBySelectedScalarAndAddSaturateEven(Vector addend, Vector left, Vector right, [ConstantExpected] byte rightIndex) { throw new PlatformNotSupportedException(); } + + /// + /// svint64_t svqdmlalb_lane[_s64](svint64_t op1, svint32_t op2, svint32_t op3, uint64_t imm_index) + /// SQDMLALB Ztied1.D, Zop2.S, Zop3.S[imm_index] + /// + public static Vector MultiplyDoublingWideningBySelectedScalarAndAddSaturateEven(Vector addend, Vector left, Vector right, [ConstantExpected] byte rightIndex) { throw new PlatformNotSupportedException(); } + + + // Saturating doubling multiply-add long with index (top) + + /// + /// svint32_t svqdmlalt_lane[_s32](svint32_t op1, svint16_t op2, svint16_t op3, uint64_t imm_index) + /// SQDMLALT Ztied1.S, Zop2.H, Zop3.H[imm_index] + /// + public static Vector MultiplyDoublingWideningBySelectedScalarAndAddSaturateOdd(Vector addend, Vector left, Vector right, [ConstantExpected] byte rightIndex) { throw new PlatformNotSupportedException(); } + + /// + /// svint64_t svqdmlalt_lane[_s64](svint64_t op1, svint32_t op2, svint32_t op3, uint64_t imm_index) + /// SQDMLALT Ztied1.D, Zop2.S, Zop3.S[imm_index] + /// + public static Vector MultiplyDoublingWideningBySelectedScalarAndAddSaturateOdd(Vector addend, Vector left, Vector right, [ConstantExpected] byte rightIndex) { throw new PlatformNotSupportedException(); } + + + // Saturating doubling multiply-subtract long with index (bottom) + + /// + /// svint32_t svqdmlslb_lane[_s32](svint32_t op1, svint16_t op2, svint16_t op3, uint64_t imm_index) + /// SQDMLSLB Ztied1.S, Zop2.H, Zop3.H[imm_index] + /// + public static Vector MultiplyDoublingWideningBySelectedScalarAndSubtractSaturateEven(Vector minuend, Vector left, Vector right, [ConstantExpected] byte rightIndex) { throw new PlatformNotSupportedException(); } + + /// + /// svint64_t svqdmlslb_lane[_s64](svint64_t op1, svint32_t op2, svint32_t op3, uint64_t imm_index) + /// SQDMLSLB Ztied1.D, Zop2.S, Zop3.S[imm_index] + /// + public static Vector MultiplyDoublingWideningBySelectedScalarAndSubtractSaturateEven(Vector minuend, Vector left, Vector right, [ConstantExpected] byte rightIndex) { throw new PlatformNotSupportedException(); } + + + // Saturating doubling multiply-subtract long (top) + + /// + /// svint32_t svqdmlslt_lane[_s32](svint32_t op1, svint16_t op2, svint16_t op3, uint64_t imm_index) + /// SQDMLSLT Ztied1.S, Zop2.H, Zop3.H[imm_index] + /// + public static Vector MultiplyDoublingWideningBySelectedScalarAndSubtractSaturateOdd(Vector minuend, Vector left, Vector right, [ConstantExpected] byte rightIndex) { throw new PlatformNotSupportedException(); } + + /// + /// svint64_t svqdmlslt_lane[_s64](svint64_t op1, svint32_t op2, svint32_t op3, uint64_t imm_index) + /// SQDMLSLT Ztied1.D, Zop2.S, Zop3.S[imm_index] + /// + public static Vector MultiplyDoublingWideningBySelectedScalarAndSubtractSaturateOdd(Vector minuend, Vector left, Vector right, [ConstantExpected] byte rightIndex) { throw new PlatformNotSupportedException(); } + + + // Saturating negate + + /// + /// svint8_t svqneg[_s8]_m(svint8_t inactive, svbool_t pg, svint8_t op) + /// svint8_t svqneg[_s8]_x(svbool_t pg, svint8_t op) + /// svint8_t svqneg[_s8]_z(svbool_t pg, svint8_t op) + /// SQNEG Ztied.B, Pg/M, Zop.B + /// SQNEG Ztied.B, Pg/M, Ztied.B + /// + public static Vector NegateSaturate(Vector value) { throw new PlatformNotSupportedException(); } + + /// + /// svint16_t svqneg[_s16]_m(svint16_t inactive, svbool_t pg, svint16_t op) + /// svint16_t svqneg[_s16]_x(svbool_t pg, svint16_t op) + /// svint16_t svqneg[_s16]_z(svbool_t pg, svint16_t op) + /// SQNEG Ztied.H, Pg/M, Zop.H + /// SQNEG Ztied.H, Pg/M, Ztied.H + /// + public static Vector NegateSaturate(Vector value) { throw new PlatformNotSupportedException(); } + + /// + /// svint32_t svqneg[_s32]_m(svint32_t inactive, svbool_t pg, svint32_t op) + /// svint32_t svqneg[_s32]_x(svbool_t pg, svint32_t op) + /// svint32_t svqneg[_s32]_z(svbool_t pg, svint32_t op) + /// SQNEG Ztied.S, Pg/M, Zop.S + /// SQNEG Ztied.S, Pg/M, Ztied.S + /// + public static Vector NegateSaturate(Vector value) { throw new PlatformNotSupportedException(); } + + /// + /// svint64_t svqneg[_s64]_m(svint64_t inactive, svbool_t pg, svint64_t op) + /// svint64_t svqneg[_s64]_x(svbool_t pg, svint64_t op) + /// svint64_t svqneg[_s64]_z(svbool_t pg, svint64_t op) + /// SQNEG Ztied.D, Pg/M, Zop.D + /// SQNEG Ztied.D, Pg/M, Ztied.D + /// + public static Vector NegateSaturate(Vector value) { throw new PlatformNotSupportedException(); } + + // Rounding shift left /// 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..96d1343a8d1b19 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 @@ -28,6 +28,46 @@ internal Arm64() { } public static new bool IsSupported { get => IsSupported; } } + + // Saturating absolute value + + /// + /// svint8_t svqabs[_s8]_m(svint8_t inactive, svbool_t pg, svint8_t op) + /// svint8_t svqabs[_s8]_x(svbool_t pg, svint8_t op) + /// svint8_t svqabs[_s8]_z(svbool_t pg, svint8_t op) + /// SQABS Ztied.B, Pg/M, Zop.B + /// SQABS Ztied.B, Pg/M, Ztied.B + /// + public static Vector AbsSaturate(Vector value) => AbsSaturate(value); + + /// + /// svint16_t svqabs[_s16]_m(svint16_t inactive, svbool_t pg, svint16_t op) + /// svint16_t svqabs[_s16]_x(svbool_t pg, svint16_t op) + /// svint16_t svqabs[_s16]_z(svbool_t pg, svint16_t op) + /// SQABS Ztied.H, Pg/M, Zop.H + /// SQABS Ztied.H, Pg/M, Ztied.H + /// + public static Vector AbsSaturate(Vector value) => AbsSaturate(value); + + /// + /// svint32_t svqabs[_s32]_m(svint32_t inactive, svbool_t pg, svint32_t op) + /// svint32_t svqabs[_s32]_x(svbool_t pg, svint32_t op) + /// svint32_t svqabs[_s32]_z(svbool_t pg, svint32_t op) + /// SQABS Ztied.S, Pg/M, Zop.S + /// SQABS Ztied.S, Pg/M, Ztied.S + /// + public static Vector AbsSaturate(Vector value) => AbsSaturate(value); + + /// + /// svint64_t svqabs[_s64]_m(svint64_t inactive, svbool_t pg, svint64_t op) + /// svint64_t svqabs[_s64]_x(svbool_t pg, svint64_t op) + /// svint64_t svqabs[_s64]_z(svbool_t pg, svint64_t op) + /// SQABS Ztied.D, Pg/M, Zop.D + /// SQABS Ztied.D, Pg/M, Ztied.D + /// + public static Vector AbsSaturate(Vector value) => AbsSaturate(value); + + // Absolute difference and accumulate /// @@ -1935,6 +1975,231 @@ internal Arm64() { } public static Vector PolynomialMultiplyWideningOdd(Vector left, Vector right) => PolynomialMultiplyWideningOdd(left, right); + // Saturating doubling multiply-add long (bottom) + + /// + /// svint16_t svqdmlalb[_s16](svint16_t op1, svint8_t op2, svint8_t op3) + /// SQDMLALB Ztied1.H, Zop2.B, Zop3.B + /// + public static Vector MultiplyDoublingWideningAndAddSaturateEven(Vector addend, Vector left, Vector right) => MultiplyDoublingWideningAndAddSaturateEven(addend, left, right); + + /// + /// svint32_t svqdmlalb[_s32](svint32_t op1, svint16_t op2, svint16_t op3) + /// SQDMLALB Ztied1.S, Zop2.H, Zop3.H + /// + public static Vector MultiplyDoublingWideningAndAddSaturateEven(Vector addend, Vector left, Vector right) => MultiplyDoublingWideningAndAddSaturateEven(addend, left, right); + + /// + /// svint64_t svqdmlalb[_s64](svint64_t op1, svint32_t op2, svint32_t op3) + /// SQDMLALB Ztied1.D, Zop2.S, Zop3.S + /// + public static Vector MultiplyDoublingWideningAndAddSaturateEven(Vector addend, Vector left, Vector right) => MultiplyDoublingWideningAndAddSaturateEven(addend, left, right); + + + // Saturating doubling multiply-add long (bottom × top) + + /// + /// svint16_t svqdmlalbt[_s16](svint16_t op1, svint8_t op2, svint8_t op3) + /// SQDMLALBT Ztied1.H, Zop2.B, Zop3.B + /// + public static Vector MultiplyDoublingWideningAndAddSaturateEvenOdd(Vector addend, Vector leftEven, Vector rightOdd) => MultiplyDoublingWideningAndAddSaturateEvenOdd(addend, leftEven, rightOdd); + + /// + /// svint32_t svqdmlalbt[_s32](svint32_t op1, svint16_t op2, svint16_t op3) + /// SQDMLALBT Ztied1.S, Zop2.H, Zop3.H + /// + public static Vector MultiplyDoublingWideningAndAddSaturateEvenOdd(Vector addend, Vector leftEven, Vector rightOdd) => MultiplyDoublingWideningAndAddSaturateEvenOdd(addend, leftEven, rightOdd); + + /// + /// svint64_t svqdmlalbt[_s64](svint64_t op1, svint32_t op2, svint32_t op3) + /// SQDMLALBT Ztied1.D, Zop2.S, Zop3.S + /// + public static Vector MultiplyDoublingWideningAndAddSaturateEvenOdd(Vector addend, Vector leftEven, Vector rightOdd) => MultiplyDoublingWideningAndAddSaturateEvenOdd(addend, leftEven, rightOdd); + + + // Saturating doubling multiply-add long (top) + + /// + /// svint16_t svqdmlalt[_s16](svint16_t op1, svint8_t op2, svint8_t op3) + /// SQDMLALT Ztied1.H, Zop2.B, Zop3.B + /// + public static Vector MultiplyDoublingWideningAndAddSaturateOdd(Vector addend, Vector left, Vector right) => MultiplyDoublingWideningAndAddSaturateOdd(addend, left, right); + + /// + /// svint32_t svqdmlalt[_s32](svint32_t op1, svint16_t op2, svint16_t op3) + /// SQDMLALT Ztied1.S, Zop2.H, Zop3.H + /// + public static Vector MultiplyDoublingWideningAndAddSaturateOdd(Vector addend, Vector left, Vector right) => MultiplyDoublingWideningAndAddSaturateOdd(addend, left, right); + + /// + /// svint64_t svqdmlalt[_s64](svint64_t op1, svint32_t op2, svint32_t op3) + /// SQDMLALT Ztied1.D, Zop2.S, Zop3.S + /// + public static Vector MultiplyDoublingWideningAndAddSaturateOdd(Vector addend, Vector left, Vector right) => MultiplyDoublingWideningAndAddSaturateOdd(addend, left, right); + + + // Saturating doubling multiply-subtract long (bottom) + + /// + /// svint16_t svqdmlslb[_s16](svint16_t op1, svint8_t op2, svint8_t op3) + /// SQDMLSLB Ztied1.H, Zop2.B, Zop3.B + /// + public static Vector MultiplyDoublingWideningAndSubtractSaturateEven(Vector minuend, Vector left, Vector right) => MultiplyDoublingWideningAndSubtractSaturateEven(minuend, left, right); + + /// + /// svint32_t svqdmlslb[_s32](svint32_t op1, svint16_t op2, svint16_t op3) + /// SQDMLSLB Ztied1.S, Zop2.H, Zop3.H + /// + public static Vector MultiplyDoublingWideningAndSubtractSaturateEven(Vector minuend, Vector left, Vector right) => MultiplyDoublingWideningAndSubtractSaturateEven(minuend, left, right); + + /// + /// svint64_t svqdmlslb[_s64](svint64_t op1, svint32_t op2, svint32_t op3) + /// SQDMLSLB Ztied1.D, Zop2.S, Zop3.S + /// + public static Vector MultiplyDoublingWideningAndSubtractSaturateEven(Vector minuend, Vector left, Vector right) => MultiplyDoublingWideningAndSubtractSaturateEven(minuend, left, right); + + + // Saturating doubling multiply-subtract long (bottom × top) + + /// + /// svint16_t svqdmlslbt[_s16](svint16_t op1, svint8_t op2, svint8_t op3) + /// SQDMLSLBT Ztied1.H, Zop2.B, Zop3.B + /// + public static Vector MultiplyDoublingWideningAndSubtractSaturateEvenOdd(Vector minuend, Vector leftEven, Vector rightOdd) => MultiplyDoublingWideningAndSubtractSaturateEvenOdd(minuend, leftEven, rightOdd); + + /// + /// svint32_t svqdmlslbt[_s32](svint32_t op1, svint16_t op2, svint16_t op3) + /// SQDMLSLBT Ztied1.S, Zop2.H, Zop3.H + /// + public static Vector MultiplyDoublingWideningAndSubtractSaturateEvenOdd(Vector minuend, Vector leftEven, Vector rightOdd) => MultiplyDoublingWideningAndSubtractSaturateEvenOdd(minuend, leftEven, rightOdd); + + /// + /// svint64_t svqdmlslbt[_s64](svint64_t op1, svint32_t op2, svint32_t op3) + /// SQDMLSLBT Ztied1.D, Zop2.S, Zop3.S + /// + public static Vector MultiplyDoublingWideningAndSubtractSaturateEvenOdd(Vector minuend, Vector leftEven, Vector rightOdd) => MultiplyDoublingWideningAndSubtractSaturateEvenOdd(minuend, leftEven, rightOdd); + + + // Saturating doubling multiply-subtract long (top) + + /// + /// svint16_t svqdmlslt[_s16](svint16_t op1, svint8_t op2, svint8_t op3) + /// SQDMLSLT Ztied1.H, Zop2.B, Zop3.B + /// + public static Vector MultiplyDoublingWideningAndSubtractSaturateOdd(Vector minuend, Vector left, Vector right) => MultiplyDoublingWideningAndSubtractSaturateOdd(minuend, left, right); + + /// + /// svint32_t svqdmlslt[_s32](svint32_t op1, svint16_t op2, svint16_t op3) + /// SQDMLSLT Ztied1.S, Zop2.H, Zop3.H + /// + public static Vector MultiplyDoublingWideningAndSubtractSaturateOdd(Vector minuend, Vector left, Vector right) => MultiplyDoublingWideningAndSubtractSaturateOdd(minuend, left, right); + + /// + /// svint64_t svqdmlslt[_s64](svint64_t op1, svint32_t op2, svint32_t op3) + /// SQDMLSLT Ztied1.D, Zop2.S, Zop3.S + /// + public static Vector MultiplyDoublingWideningAndSubtractSaturateOdd(Vector minuend, Vector left, Vector right) => MultiplyDoublingWideningAndSubtractSaturateOdd(minuend, left, right); + + + // Saturating doubling multiply-add long with index (bottom) + + /// + /// svint32_t svqdmlalb_lane[_s32](svint32_t op1, svint16_t op2, svint16_t op3, uint64_t imm_index) + /// SQDMLALB Ztied1.S, Zop2.H, Zop3.H[imm_index] + /// + public static Vector MultiplyDoublingWideningBySelectedScalarAndAddSaturateEven(Vector addend, Vector left, Vector right, [ConstantExpected] byte rightIndex) => MultiplyDoublingWideningBySelectedScalarAndAddSaturateEven(addend, left, right, rightIndex); + + /// + /// svint64_t svqdmlalb_lane[_s64](svint64_t op1, svint32_t op2, svint32_t op3, uint64_t imm_index) + /// SQDMLALB Ztied1.D, Zop2.S, Zop3.S[imm_index] + /// + public static Vector MultiplyDoublingWideningBySelectedScalarAndAddSaturateEven(Vector addend, Vector left, Vector right, [ConstantExpected] byte rightIndex) => MultiplyDoublingWideningBySelectedScalarAndAddSaturateEven(addend, left, right, rightIndex); + + + // Saturating doubling multiply-add long with index (top) + + /// + /// svint32_t svqdmlalt_lane[_s32](svint32_t op1, svint16_t op2, svint16_t op3, uint64_t imm_index) + /// SQDMLALT Ztied1.S, Zop2.H, Zop3.H[imm_index] + /// + public static Vector MultiplyDoublingWideningBySelectedScalarAndAddSaturateOdd(Vector addend, Vector left, Vector right, [ConstantExpected] byte rightIndex) => MultiplyDoublingWideningBySelectedScalarAndAddSaturateOdd(addend, left, right, rightIndex); + + /// + /// svint64_t svqdmlalt_lane[_s64](svint64_t op1, svint32_t op2, svint32_t op3, uint64_t imm_index) + /// SQDMLALT Ztied1.D, Zop2.S, Zop3.S[imm_index] + /// + public static Vector MultiplyDoublingWideningBySelectedScalarAndAddSaturateOdd(Vector addend, Vector left, Vector right, [ConstantExpected] byte rightIndex) => MultiplyDoublingWideningBySelectedScalarAndAddSaturateOdd(addend, left, right, rightIndex); + + + // Saturating doubling multiply-subtract long with index (bottom) + + /// + /// svint32_t svqdmlslb_lane[_s32](svint32_t op1, svint16_t op2, svint16_t op3, uint64_t imm_index) + /// SQDMLSLB Ztied1.S, Zop2.H, Zop3.H[imm_index] + /// + public static Vector MultiplyDoublingWideningBySelectedScalarAndSubtractSaturateEven(Vector minuend, Vector left, Vector right, [ConstantExpected] byte rightIndex) => MultiplyDoublingWideningBySelectedScalarAndSubtractSaturateEven(minuend, left, right, rightIndex); + + /// + /// svint64_t svqdmlslb_lane[_s64](svint64_t op1, svint32_t op2, svint32_t op3, uint64_t imm_index) + /// SQDMLSLB Ztied1.D, Zop2.S, Zop3.S[imm_index] + /// + public static Vector MultiplyDoublingWideningBySelectedScalarAndSubtractSaturateEven(Vector minuend, Vector left, Vector right, [ConstantExpected] byte rightIndex) => MultiplyDoublingWideningBySelectedScalarAndSubtractSaturateEven(minuend, left, right, rightIndex); + + + // Saturating doubling multiply-subtract long (top) + + /// + /// svint32_t svqdmlslt_lane[_s32](svint32_t op1, svint16_t op2, svint16_t op3, uint64_t imm_index) + /// SQDMLSLT Ztied1.S, Zop2.H, Zop3.H[imm_index] + /// + public static Vector MultiplyDoublingWideningBySelectedScalarAndSubtractSaturateOdd(Vector minuend, Vector left, Vector right, [ConstantExpected] byte rightIndex) => MultiplyDoublingWideningBySelectedScalarAndSubtractSaturateOdd(minuend, left, right, rightIndex); + + /// + /// svint64_t svqdmlslt_lane[_s64](svint64_t op1, svint32_t op2, svint32_t op3, uint64_t imm_index) + /// SQDMLSLT Ztied1.D, Zop2.S, Zop3.S[imm_index] + /// + public static Vector MultiplyDoublingWideningBySelectedScalarAndSubtractSaturateOdd(Vector minuend, Vector left, Vector right, [ConstantExpected] byte rightIndex) => MultiplyDoublingWideningBySelectedScalarAndSubtractSaturateOdd(minuend, left, right, rightIndex); + + + // Saturating negate + + /// + /// svint8_t svqneg[_s8]_m(svint8_t inactive, svbool_t pg, svint8_t op) + /// svint8_t svqneg[_s8]_x(svbool_t pg, svint8_t op) + /// svint8_t svqneg[_s8]_z(svbool_t pg, svint8_t op) + /// SQNEG Ztied.B, Pg/M, Zop.B + /// SQNEG Ztied.B, Pg/M, Ztied.B + /// + public static Vector NegateSaturate(Vector value) => NegateSaturate(value); + + /// + /// svint16_t svqneg[_s16]_m(svint16_t inactive, svbool_t pg, svint16_t op) + /// svint16_t svqneg[_s16]_x(svbool_t pg, svint16_t op) + /// svint16_t svqneg[_s16]_z(svbool_t pg, svint16_t op) + /// SQNEG Ztied.H, Pg/M, Zop.H + /// SQNEG Ztied.H, Pg/M, Ztied.H + /// + public static Vector NegateSaturate(Vector value) => NegateSaturate(value); + + /// + /// svint32_t svqneg[_s32]_m(svint32_t inactive, svbool_t pg, svint32_t op) + /// svint32_t svqneg[_s32]_x(svbool_t pg, svint32_t op) + /// svint32_t svqneg[_s32]_z(svbool_t pg, svint32_t op) + /// SQNEG Ztied.S, Pg/M, Zop.S + /// SQNEG Ztied.S, Pg/M, Ztied.S + /// + public static Vector NegateSaturate(Vector value) => NegateSaturate(value); + + /// + /// svint64_t svqneg[_s64]_m(svint64_t inactive, svbool_t pg, svint64_t op) + /// svint64_t svqneg[_s64]_x(svbool_t pg, svint64_t op) + /// svint64_t svqneg[_s64]_z(svbool_t pg, svint64_t op) + /// SQNEG Ztied.D, Pg/M, Zop.D + /// SQNEG Ztied.D, Pg/M, Ztied.D + /// + public static Vector NegateSaturate(Vector value) => NegateSaturate(value); + + // Rounding shift left /// 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..1d71b45dd80931 100644 --- a/src/libraries/System.Runtime.Intrinsics/ref/System.Runtime.Intrinsics.cs +++ b/src/libraries/System.Runtime.Intrinsics/ref/System.Runtime.Intrinsics.cs @@ -6103,6 +6103,10 @@ internal Arm64() { } public static new bool IsSupported { get { throw null; } } } + public static System.Numerics.Vector AbsSaturate(System.Numerics.Vector value) { throw null; } + public static System.Numerics.Vector AbsSaturate(System.Numerics.Vector value) { throw null; } + public static System.Numerics.Vector AbsSaturate(System.Numerics.Vector value) { throw null; } + public static System.Numerics.Vector AbsSaturate(System.Numerics.Vector value) { throw null; } public static System.Numerics.Vector AbsoluteDifferenceAdd(System.Numerics.Vector addend, System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } public static System.Numerics.Vector AbsoluteDifferenceAdd(System.Numerics.Vector addend, System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } public static System.Numerics.Vector AbsoluteDifferenceAdd(System.Numerics.Vector addend, System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } @@ -6340,6 +6344,32 @@ internal Arm64() { } public static System.Numerics.Vector MultiplyBySelectedScalarWideningOddAndSubtract(System.Numerics.Vector minuend, System.Numerics.Vector left, System.Numerics.Vector right, [ConstantExpected] byte rightIndex) { throw null; } public static System.Numerics.Vector MultiplyBySelectedScalarWideningOddAndSubtract(System.Numerics.Vector minuend, System.Numerics.Vector left, System.Numerics.Vector right, [ConstantExpected] byte rightIndex) { throw null; } public static System.Numerics.Vector MultiplyBySelectedScalarWideningOddAndSubtract(System.Numerics.Vector minuend, System.Numerics.Vector left, System.Numerics.Vector right, [ConstantExpected] byte rightIndex) { throw null; } + public static System.Numerics.Vector MultiplyDoublingWideningAndAddSaturateEven(System.Numerics.Vector addend, System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector MultiplyDoublingWideningAndAddSaturateEven(System.Numerics.Vector addend, System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector MultiplyDoublingWideningAndAddSaturateEven(System.Numerics.Vector addend, System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector MultiplyDoublingWideningAndAddSaturateEvenOdd(System.Numerics.Vector addend, System.Numerics.Vector leftEven, System.Numerics.Vector rightOdd) { throw null; } + public static System.Numerics.Vector MultiplyDoublingWideningAndAddSaturateEvenOdd(System.Numerics.Vector addend, System.Numerics.Vector leftEven, System.Numerics.Vector rightOdd) { throw null; } + public static System.Numerics.Vector MultiplyDoublingWideningAndAddSaturateEvenOdd(System.Numerics.Vector addend, System.Numerics.Vector leftEven, System.Numerics.Vector rightOdd) { throw null; } + public static System.Numerics.Vector MultiplyDoublingWideningAndAddSaturateOdd(System.Numerics.Vector addend, System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector MultiplyDoublingWideningAndAddSaturateOdd(System.Numerics.Vector addend, System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector MultiplyDoublingWideningAndAddSaturateOdd(System.Numerics.Vector addend, System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector MultiplyDoublingWideningAndSubtractSaturateEven(System.Numerics.Vector minuend, System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector MultiplyDoublingWideningAndSubtractSaturateEven(System.Numerics.Vector minuend, System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector MultiplyDoublingWideningAndSubtractSaturateEven(System.Numerics.Vector minuend, System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector MultiplyDoublingWideningAndSubtractSaturateEvenOdd(System.Numerics.Vector minuend, System.Numerics.Vector leftEven, System.Numerics.Vector rightOdd) { throw null; } + public static System.Numerics.Vector MultiplyDoublingWideningAndSubtractSaturateEvenOdd(System.Numerics.Vector minuend, System.Numerics.Vector leftEven, System.Numerics.Vector rightOdd) { throw null; } + public static System.Numerics.Vector MultiplyDoublingWideningAndSubtractSaturateEvenOdd(System.Numerics.Vector minuend, System.Numerics.Vector leftEven, System.Numerics.Vector rightOdd) { throw null; } + public static System.Numerics.Vector MultiplyDoublingWideningAndSubtractSaturateOdd(System.Numerics.Vector minuend, System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector MultiplyDoublingWideningAndSubtractSaturateOdd(System.Numerics.Vector minuend, System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector MultiplyDoublingWideningAndSubtractSaturateOdd(System.Numerics.Vector minuend, System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector MultiplyDoublingWideningBySelectedScalarAndAddSaturateEven(System.Numerics.Vector addend, System.Numerics.Vector left, System.Numerics.Vector right, [ConstantExpected] byte rightIndex) { throw null; } + public static System.Numerics.Vector MultiplyDoublingWideningBySelectedScalarAndAddSaturateEven(System.Numerics.Vector addend, System.Numerics.Vector left, System.Numerics.Vector right, [ConstantExpected] byte rightIndex) { throw null; } + public static System.Numerics.Vector MultiplyDoublingWideningBySelectedScalarAndAddSaturateOdd(System.Numerics.Vector addend, System.Numerics.Vector left, System.Numerics.Vector right, [ConstantExpected] byte rightIndex) { throw null; } + public static System.Numerics.Vector MultiplyDoublingWideningBySelectedScalarAndAddSaturateOdd(System.Numerics.Vector addend, System.Numerics.Vector left, System.Numerics.Vector right, [ConstantExpected] byte rightIndex) { throw null; } + public static System.Numerics.Vector MultiplyDoublingWideningBySelectedScalarAndSubtractSaturateEven(System.Numerics.Vector minuend, System.Numerics.Vector left, System.Numerics.Vector right, [ConstantExpected] byte rightIndex) { throw null; } + public static System.Numerics.Vector MultiplyDoublingWideningBySelectedScalarAndSubtractSaturateEven(System.Numerics.Vector minuend, System.Numerics.Vector left, System.Numerics.Vector right, [ConstantExpected] byte rightIndex) { throw null; } + public static System.Numerics.Vector MultiplyDoublingWideningBySelectedScalarAndSubtractSaturateOdd(System.Numerics.Vector minuend, System.Numerics.Vector left, System.Numerics.Vector right, [ConstantExpected] byte rightIndex) { throw null; } + public static System.Numerics.Vector MultiplyDoublingWideningBySelectedScalarAndSubtractSaturateOdd(System.Numerics.Vector minuend, System.Numerics.Vector left, System.Numerics.Vector right, [ConstantExpected] byte rightIndex) { throw null; } public static System.Numerics.Vector MultiplySubtractBySelectedScalar(System.Numerics.Vector minuend, System.Numerics.Vector left, System.Numerics.Vector right, [ConstantExpected] byte rightIndex) { throw null; } public static System.Numerics.Vector MultiplySubtractBySelectedScalar(System.Numerics.Vector minuend, System.Numerics.Vector left, System.Numerics.Vector right, [ConstantExpected] byte rightIndex) { throw null; } public static System.Numerics.Vector MultiplySubtractBySelectedScalar(System.Numerics.Vector minuend, System.Numerics.Vector left, System.Numerics.Vector right, [ConstantExpected] byte rightIndex) { throw null; } @@ -6382,6 +6412,10 @@ internal Arm64() { } public static System.Numerics.Vector MultiplyWideningOddAndSubtract(System.Numerics.Vector minuend, System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } public static System.Numerics.Vector MultiplyWideningOddAndSubtract(System.Numerics.Vector minuend, System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } public static System.Numerics.Vector MultiplyWideningOddAndSubtract(System.Numerics.Vector minuend, System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector NegateSaturate(System.Numerics.Vector value) { throw null; } + public static System.Numerics.Vector NegateSaturate(System.Numerics.Vector value) { throw null; } + public static System.Numerics.Vector NegateSaturate(System.Numerics.Vector value) { throw null; } + public static System.Numerics.Vector NegateSaturate(System.Numerics.Vector value) { throw null; } public static System.Numerics.Vector PolynomialMultiply(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } public static System.Numerics.Vector PolynomialMultiply(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } public static System.Numerics.Vector PolynomialMultiplyWideningEven(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 38f6d51b32af07..2e76b1961b8dcd 100644 --- a/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs +++ b/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs @@ -4822,6 +4822,11 @@ (string templateFileName, Dictionary templateData)[] Sve2Inputs = new[] { + ("SveSimpleVecOpTest.template", new Dictionary { ["TestName"] = "Sve2_AbsSaturate_sbyte", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "AbsSaturate", ["RetVectorType"] = "Vector", ["RetBaseType"] = "SByte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "SByte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["ValidateIterResult"] = "result[i] != Helpers.AbsSaturate(firstOp[i])", ["GetIterResult"] = "Helpers.AbsSaturate(leftOp[i])"}), + ("SveSimpleVecOpTest.template", new Dictionary { ["TestName"] = "Sve2_AbsSaturate_short", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "AbsSaturate", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["ValidateIterResult"] = "result[i] != Helpers.AbsSaturate(firstOp[i])", ["GetIterResult"] = "Helpers.AbsSaturate(leftOp[i])"}), + ("SveSimpleVecOpTest.template", new Dictionary { ["TestName"] = "Sve2_AbsSaturate_int", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "AbsSaturate", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["ValidateIterResult"] = "result[i] != Helpers.AbsSaturate(firstOp[i])", ["GetIterResult"] = "Helpers.AbsSaturate(leftOp[i])"}), + ("SveSimpleVecOpTest.template", new Dictionary { ["TestName"] = "Sve2_AbsSaturate_long", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "AbsSaturate", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["ValidateIterResult"] = "result[i] != Helpers.AbsSaturate(firstOp[i])", ["GetIterResult"] = "Helpers.AbsSaturate(leftOp[i])"}), + ("SveVecTernOpTest.template", new Dictionary { ["TestName"] = "Sve2_AbsoluteDifferenceAdd_sbyte", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "AbsoluteDifferenceAdd", ["RetVectorType"] = "Vector", ["RetBaseType"] = "SByte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "SByte", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.AbsoluteDifferenceAdd(firstOp[i], secondOp[i], thirdOp[i]) != result[i]", ["GetIterResult"] = "(SByte) Helpers.AbsoluteDifferenceAdd(firstOp[i], secondOp[i], thirdOp[i])"}), ("SveVecTernOpTest.template", new Dictionary { ["TestName"] = "Sve2_AbsoluteDifferenceAdd_short", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "AbsoluteDifferenceAdd", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.AbsoluteDifferenceAdd(firstOp[i], secondOp[i], thirdOp[i]) != result[i]", ["GetIterResult"] = "(Int16) Helpers.AbsoluteDifferenceAdd(firstOp[i], secondOp[i], thirdOp[i])"}), ("SveVecTernOpTest.template", new Dictionary { ["TestName"] = "Sve2_AbsoluteDifferenceAdd_int", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "AbsoluteDifferenceAdd", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int32", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.AbsoluteDifferenceAdd(firstOp[i], secondOp[i], thirdOp[i]) != result[i]", ["GetIterResult"] = "(Int32) Helpers.AbsoluteDifferenceAdd(firstOp[i], secondOp[i], thirdOp[i])"}), @@ -5132,6 +5137,47 @@ ("SveVecImmBinOpTest.template",new Dictionary { ["TestName"] = "Sve2_MultiplyBySelectedScalarWideningOdd_uint_ushort", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyBySelectedScalarWideningOdd", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt16", ["Op3BaseType"] = "UInt64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt16()", ["NextValueMask"] = "Helpers.getMaskUInt32()", ["Imm"] = "6", ["InvalidImm"] = "8", ["ConvertFunc"] = "", ["ValidateIterResult"] = "result[i] != Helpers.MultiplyWidening(firstOp[2 * i + 1], secondOp[Imm])", ["GetIterResult"] = "Helpers.MultiplyWidening(firstOp[2 * i + 1], secondOp[Imm])"}), ("SveVecImmBinOpTest.template",new Dictionary { ["TestName"] = "Sve2_MultiplyBySelectedScalarWideningOdd_ulong_uint", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyBySelectedScalarWideningOdd", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt32", ["Op3BaseType"] = "UInt64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["NextValueMask"] = "Helpers.getMaskUInt64()", ["Imm"] = "2", ["InvalidImm"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "result[i] != Helpers.MultiplyWidening(firstOp[2 * i + 1], secondOp[Imm])", ["GetIterResult"] = "Helpers.MultiplyWidening(firstOp[2 * i + 1], secondOp[Imm])"}), + ("SveVecTernOpFirstArgTest.template", new Dictionary { ["TestName"] = "Sve2_MultiplyDoublingWideningAndAddSaturateEven_short", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyDoublingWideningAndAddSaturateEven", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["ValidateIterResult"] = "Helpers.MultiplyDoublingWideningAndAddSaturate(first[i], second[i * 2], third[i * 2]) != result[i]", ["GetIterResult"] = "Helpers.MultiplyDoublingWideningAndAddSaturate(first[i], second[i * 2], third[i * 2])", ["ConvertFunc"] = ""}), + ("SveVecTernOpFirstArgTest.template", new Dictionary { ["TestName"] = "Sve2_MultiplyDoublingWideningAndAddSaturateEven_int", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyDoublingWideningAndAddSaturateEven", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["ValidateIterResult"] = "Helpers.MultiplyDoublingWideningAndAddSaturate(first[i], second[i * 2], third[i * 2]) != result[i]", ["GetIterResult"] = "Helpers.MultiplyDoublingWideningAndAddSaturate(first[i], second[i * 2], third[i * 2])", ["ConvertFunc"] = ""}), + ("SveVecTernOpFirstArgTest.template", new Dictionary { ["TestName"] = "Sve2_MultiplyDoublingWideningAndAddSaturateEven_long", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyDoublingWideningAndAddSaturateEven", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int32", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()", ["ValidateIterResult"] = "Helpers.MultiplyDoublingWideningAndAddSaturate(first[i], second[i * 2], third[i * 2]) != result[i]", ["GetIterResult"] = "Helpers.MultiplyDoublingWideningAndAddSaturate(first[i], second[i * 2], third[i * 2])", ["ConvertFunc"] = ""}), + + ("SveVecTernOpFirstArgTest.template", new Dictionary { ["TestName"] = "Sve2_MultiplyDoublingWideningAndAddSaturateEvenOdd_short", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyDoublingWideningAndAddSaturateEvenOdd", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["ValidateIterResult"] = "Helpers.MultiplyDoublingWideningAndAddSaturate(first[i], second[i * 2], third[i * 2 + 1]) != result[i]", ["GetIterResult"] = "Helpers.MultiplyDoublingWideningAndAddSaturate(first[i], second[i * 2], third[i * 2 + 1])", ["ConvertFunc"] = ""}), + ("SveVecTernOpFirstArgTest.template", new Dictionary { ["TestName"] = "Sve2_MultiplyDoublingWideningAndAddSaturateEvenOdd_int", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyDoublingWideningAndAddSaturateEvenOdd", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["ValidateIterResult"] = "Helpers.MultiplyDoublingWideningAndAddSaturate(first[i], second[i * 2], third[i * 2 + 1]) != result[i]", ["GetIterResult"] = "Helpers.MultiplyDoublingWideningAndAddSaturate(first[i], second[i * 2], third[i * 2 + 1])", ["ConvertFunc"] = ""}), + ("SveVecTernOpFirstArgTest.template", new Dictionary { ["TestName"] = "Sve2_MultiplyDoublingWideningAndAddSaturateEvenOdd_long", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyDoublingWideningAndAddSaturateEvenOdd", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int32", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()", ["ValidateIterResult"] = "Helpers.MultiplyDoublingWideningAndAddSaturate(first[i], second[i * 2], third[i * 2 + 1]) != result[i]", ["GetIterResult"] = "Helpers.MultiplyDoublingWideningAndAddSaturate(first[i], second[i * 2], third[i * 2 + 1])", ["ConvertFunc"] = ""}), + + ("SveVecTernOpFirstArgTest.template", new Dictionary { ["TestName"] = "Sve2_MultiplyDoublingWideningAndAddSaturateOdd_short", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyDoublingWideningAndAddSaturateOdd", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["ValidateIterResult"] = "Helpers.MultiplyDoublingWideningAndAddSaturate(first[i], second[i * 2 + 1], third[i * 2 + 1]) != result[i]", ["GetIterResult"] = "Helpers.MultiplyDoublingWideningAndAddSaturate(first[i], second[i * 2 + 1], third[i * 2 + 1])", ["ConvertFunc"] = ""}), + ("SveVecTernOpFirstArgTest.template", new Dictionary { ["TestName"] = "Sve2_MultiplyDoublingWideningAndAddSaturateOdd_int", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyDoublingWideningAndAddSaturateOdd", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["ValidateIterResult"] = "Helpers.MultiplyDoublingWideningAndAddSaturate(first[i], second[i * 2 + 1], third[i * 2 + 1]) != result[i]", ["GetIterResult"] = "Helpers.MultiplyDoublingWideningAndAddSaturate(first[i], second[i * 2 + 1], third[i * 2 + 1])", ["ConvertFunc"] = ""}), + ("SveVecTernOpFirstArgTest.template", new Dictionary { ["TestName"] = "Sve2_MultiplyDoublingWideningAndAddSaturateOdd_long", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyDoublingWideningAndAddSaturateOdd", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int32", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()", ["ValidateIterResult"] = "Helpers.MultiplyDoublingWideningAndAddSaturate(first[i], second[i * 2 + 1], third[i * 2 + 1]) != result[i]", ["GetIterResult"] = "Helpers.MultiplyDoublingWideningAndAddSaturate(first[i], second[i * 2 + 1], third[i * 2 + 1])", ["ConvertFunc"] = ""}), + + ("SveVecTernOpFirstArgTest.template", new Dictionary { ["TestName"] = "Sve2_MultiplyDoublingWideningAndSubtractSaturateEven_short", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyDoublingWideningAndSubtractSaturateEven", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["ValidateIterResult"] = "Helpers.MultiplyDoublingWideningAndSubtractSaturate(first[i], second[i * 2], third[i * 2]) != result[i]", ["GetIterResult"] = "Helpers.MultiplyDoublingWideningAndSubtractSaturate(first[i], second[i * 2], third[i * 2])", ["ConvertFunc"] = ""}), + ("SveVecTernOpFirstArgTest.template", new Dictionary { ["TestName"] = "Sve2_MultiplyDoublingWideningAndSubtractSaturateEven_int", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyDoublingWideningAndSubtractSaturateEven", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["ValidateIterResult"] = "Helpers.MultiplyDoublingWideningAndSubtractSaturate(first[i], second[i * 2], third[i * 2]) != result[i]", ["GetIterResult"] = "Helpers.MultiplyDoublingWideningAndSubtractSaturate(first[i], second[i * 2], third[i * 2])", ["ConvertFunc"] = ""}), + ("SveVecTernOpFirstArgTest.template", new Dictionary { ["TestName"] = "Sve2_MultiplyDoublingWideningAndSubtractSaturateEven_long", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyDoublingWideningAndSubtractSaturateEven", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int32", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()", ["ValidateIterResult"] = "Helpers.MultiplyDoublingWideningAndSubtractSaturate(first[i], second[i * 2], third[i * 2]) != result[i]", ["GetIterResult"] = "Helpers.MultiplyDoublingWideningAndSubtractSaturate(first[i], second[i * 2], third[i * 2])", ["ConvertFunc"] = ""}), + + ("SveVecTernOpFirstArgTest.template", new Dictionary { ["TestName"] = "Sve2_MultiplyDoublingWideningAndSubtractSaturateEvenOdd_short", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyDoublingWideningAndSubtractSaturateEvenOdd", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["ValidateIterResult"] = "Helpers.MultiplyDoublingWideningAndSubtractSaturate(first[i], second[i * 2], third[i * 2 + 1]) != result[i]", ["GetIterResult"] = "Helpers.MultiplyDoublingWideningAndSubtractSaturate(first[i], second[i * 2], third[i * 2 + 1])", ["ConvertFunc"] = ""}), + ("SveVecTernOpFirstArgTest.template", new Dictionary { ["TestName"] = "Sve2_MultiplyDoublingWideningAndSubtractSaturateEvenOdd_int", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyDoublingWideningAndSubtractSaturateEvenOdd", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["ValidateIterResult"] = "Helpers.MultiplyDoublingWideningAndSubtractSaturate(first[i], second[i * 2], third[i * 2 + 1]) != result[i]", ["GetIterResult"] = "Helpers.MultiplyDoublingWideningAndSubtractSaturate(first[i], second[i * 2], third[i * 2 + 1])", ["ConvertFunc"] = ""}), + ("SveVecTernOpFirstArgTest.template", new Dictionary { ["TestName"] = "Sve2_MultiplyDoublingWideningAndSubtractSaturateEvenOdd_long", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyDoublingWideningAndSubtractSaturateEvenOdd", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int32", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()", ["ValidateIterResult"] = "Helpers.MultiplyDoublingWideningAndSubtractSaturate(first[i], second[i * 2], third[i * 2 + 1]) != result[i]", ["GetIterResult"] = "Helpers.MultiplyDoublingWideningAndSubtractSaturate(first[i], second[i * 2], third[i * 2 + 1])", ["ConvertFunc"] = ""}), + + ("SveVecTernOpFirstArgTest.template", new Dictionary { ["TestName"] = "Sve2_MultiplyDoublingWideningAndSubtractSaturateOdd_short", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyDoublingWideningAndSubtractSaturateOdd", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["ValidateIterResult"] = "Helpers.MultiplyDoublingWideningAndSubtractSaturate(first[i], second[i * 2 + 1], third[i * 2 + 1]) != result[i]", ["GetIterResult"] = "Helpers.MultiplyDoublingWideningAndSubtractSaturate(first[i], second[i * 2 + 1], third[i * 2 + 1])", ["ConvertFunc"] = ""}), + ("SveVecTernOpFirstArgTest.template", new Dictionary { ["TestName"] = "Sve2_MultiplyDoublingWideningAndSubtractSaturateOdd_int", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyDoublingWideningAndSubtractSaturateOdd", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["ValidateIterResult"] = "Helpers.MultiplyDoublingWideningAndSubtractSaturate(first[i], second[i * 2 + 1], third[i * 2 + 1]) != result[i]", ["GetIterResult"] = "Helpers.MultiplyDoublingWideningAndSubtractSaturate(first[i], second[i * 2 + 1], third[i * 2 + 1])", ["ConvertFunc"] = ""}), + ("SveVecTernOpFirstArgTest.template", new Dictionary { ["TestName"] = "Sve2_MultiplyDoublingWideningAndSubtractSaturateOdd_long", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyDoublingWideningAndSubtractSaturateOdd", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int32", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()", ["ValidateIterResult"] = "Helpers.MultiplyDoublingWideningAndSubtractSaturate(first[i], second[i * 2 + 1], third[i * 2 + 1]) != result[i]", ["GetIterResult"] = "Helpers.MultiplyDoublingWideningAndSubtractSaturate(first[i], second[i * 2 + 1], third[i * 2 + 1])", ["ConvertFunc"] = ""}), + + ("SveVecImmTernOpFirstArgTest.template", new Dictionary { ["TestName"] = "Sve2_MultiplyDoublingWideningBySelectedScalarAndAddSaturateEven_int", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyDoublingWideningBySelectedScalarAndAddSaturateEven", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["Imm"] = "5", ["InvalidImm"] = "8", ["ValidateIterResult"] = "Helpers.MultiplyDoublingWideningAndAddSaturate(first[i], second[i * 2], third[Imm]) != result[i]", ["GetIterResult"] = "Helpers.MultiplyDoublingWideningAndAddSaturate(first[i], second[i * 2], third[Imm])", ["ConvertFunc"] = ""}), + ("SveVecImmTernOpFirstArgTest.template", new Dictionary { ["TestName"] = "Sve2_MultiplyDoublingWideningBySelectedScalarAndAddSaturateEven_long", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyDoublingWideningBySelectedScalarAndAddSaturateEven", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int32", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()", ["Imm"] = "1", ["InvalidImm"] = "4", ["ValidateIterResult"] = "Helpers.MultiplyDoublingWideningAndAddSaturate(first[i], second[i * 2], third[Imm]) != result[i]", ["GetIterResult"] = "Helpers.MultiplyDoublingWideningAndAddSaturate(first[i], second[i * 2], third[Imm])", ["ConvertFunc"] = ""}), + + ("SveVecImmTernOpFirstArgTest.template", new Dictionary { ["TestName"] = "Sve2_MultiplyDoublingWideningBySelectedScalarAndAddSaturateOdd_int", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyDoublingWideningBySelectedScalarAndAddSaturateOdd", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["Imm"] = "6", ["InvalidImm"] = "8", ["ValidateIterResult"] = "Helpers.MultiplyDoublingWideningAndAddSaturate(first[i], second[i * 2 + 1], third[Imm]) != result[i]", ["GetIterResult"] = "Helpers.MultiplyDoublingWideningAndAddSaturate(first[i], second[i * 2 + 1], third[Imm])", ["ConvertFunc"] = ""}), + ("SveVecImmTernOpFirstArgTest.template", new Dictionary { ["TestName"] = "Sve2_MultiplyDoublingWideningBySelectedScalarAndAddSaturateOdd_long", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyDoublingWideningBySelectedScalarAndAddSaturateOdd", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int32", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()", ["Imm"] = "3", ["InvalidImm"] = "4", ["ValidateIterResult"] = "Helpers.MultiplyDoublingWideningAndAddSaturate(first[i], second[i * 2 + 1], third[Imm]) != result[i]", ["GetIterResult"] = "Helpers.MultiplyDoublingWideningAndAddSaturate(first[i], second[i * 2 + 1], third[Imm])", ["ConvertFunc"] = ""}), + + ("SveVecImmTernOpFirstArgTest.template", new Dictionary { ["TestName"] = "Sve2_MultiplyDoublingWideningBySelectedScalarAndSubtractSaturateEven_int", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyDoublingWideningBySelectedScalarAndSubtractSaturateEven", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["Imm"] = "4", ["InvalidImm"] = "8", ["ValidateIterResult"] = "Helpers.MultiplyDoublingWideningAndSubtractSaturate(first[i], second[i * 2], third[Imm]) != result[i]", ["GetIterResult"] = "Helpers.MultiplyDoublingWideningAndSubtractSaturate(first[i], second[i * 2], third[Imm])", ["ConvertFunc"] = ""}), + ("SveVecImmTernOpFirstArgTest.template", new Dictionary { ["TestName"] = "Sve2_MultiplyDoublingWideningBySelectedScalarAndSubtractSaturateEven_long", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyDoublingWideningBySelectedScalarAndSubtractSaturateEven", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int32", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()", ["Imm"] = "2", ["InvalidImm"] = "4", ["ValidateIterResult"] = "Helpers.MultiplyDoublingWideningAndSubtractSaturate(first[i], second[i * 2], third[Imm]) != result[i]", ["GetIterResult"] = "Helpers.MultiplyDoublingWideningAndSubtractSaturate(first[i], second[i * 2], third[Imm])", ["ConvertFunc"] = ""}), + + ("SveVecImmTernOpFirstArgTest.template", new Dictionary { ["TestName"] = "Sve2_MultiplyDoublingWideningBySelectedScalarAndSubtractSaturateOdd_int", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyDoublingWideningBySelectedScalarAndSubtractSaturateOdd", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["Imm"] = "4", ["InvalidImm"] = "8", ["ValidateIterResult"] = "Helpers.MultiplyDoublingWideningAndSubtractSaturate(first[i], second[i * 2 + 1], third[Imm]) != result[i]", ["GetIterResult"] = "Helpers.MultiplyDoublingWideningAndSubtractSaturate(first[i], second[i * 2 + 1], third[Imm])", ["ConvertFunc"] = ""}), + ("SveVecImmTernOpFirstArgTest.template", new Dictionary { ["TestName"] = "Sve2_MultiplyDoublingWideningBySelectedScalarAndSubtractSaturateOdd_long", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyDoublingWideningBySelectedScalarAndSubtractSaturateOdd", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int32", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()", ["Imm"] = "2", ["InvalidImm"] = "4", ["ValidateIterResult"] = "Helpers.MultiplyDoublingWideningAndSubtractSaturate(first[i], second[i * 2 + 1], third[Imm]) != result[i]", ["GetIterResult"] = "Helpers.MultiplyDoublingWideningAndSubtractSaturate(first[i], second[i * 2 + 1], third[Imm])", ["ConvertFunc"] = ""}), + + ("SveSimpleVecOpTest.template", new Dictionary { ["TestName"] = "Sve2_NegateSaturate_sbyte", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "NegateSaturate", ["RetVectorType"] = "Vector", ["RetBaseType"] = "SByte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "SByte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["ValidateIterResult"] = "result[i] != Helpers.NegateSaturate(firstOp[i])", ["GetIterResult"] = "Helpers.NegateSaturate(leftOp[i])"}), + ("SveSimpleVecOpTest.template", new Dictionary { ["TestName"] = "Sve2_NegateSaturate_short", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "NegateSaturate", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["ValidateIterResult"] = "result[i] != Helpers.NegateSaturate(firstOp[i])", ["GetIterResult"] = "Helpers.NegateSaturate(leftOp[i])"}), + ("SveSimpleVecOpTest.template", new Dictionary { ["TestName"] = "Sve2_NegateSaturate_int", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "NegateSaturate", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["ValidateIterResult"] = "result[i] != Helpers.NegateSaturate(firstOp[i])", ["GetIterResult"] = "Helpers.NegateSaturate(leftOp[i])"}), + ("SveSimpleVecOpTest.template", new Dictionary { ["TestName"] = "Sve2_NegateSaturate_long", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "NegateSaturate", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["ValidateIterResult"] = "result[i] != Helpers.NegateSaturate(firstOp[i])", ["GetIterResult"] = "Helpers.NegateSaturate(leftOp[i])"}), + ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve2_PolynomialMultiply_byte", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "PolynomialMultiply", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Byte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Byte", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetByte()", ["NextValueMask"] = "Helpers.getMaskByte()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "result[i] != Helpers.PolynomialMultiply(left[i], right[i])", ["GetIterResult"] = "Helpers.PolynomialMultiply(leftOp[i], rightOp[i])"}), ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve2_PolynomialMultiply_sbyte", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "PolynomialMultiply", ["RetVectorType"] = "Vector", ["RetBaseType"] = "SByte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "SByte", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueMask"] = "Helpers.getMaskSByte()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "result[i] != Helpers.PolynomialMultiply(left[i], right[i])", ["GetIterResult"] = "Helpers.PolynomialMultiply(leftOp[i], rightOp[i])"}),