diff --git a/src/coreclr/jit/emitarm64.h b/src/coreclr/jit/emitarm64.h index b72eda2a585079..54c50a3f0cfeda 100644 --- a/src/coreclr/jit/emitarm64.h +++ b/src/coreclr/jit/emitarm64.h @@ -555,7 +555,7 @@ static code_t insEncodeReg3Scale(bool isScaled); // Returns the encoding to select the 1/2/4/8 byte elemsize for an Arm64 SVE vector instruction static code_t insEncodeSveElemsize(emitAttr size); -// Returns the encoding to select the 1/2/4/8 byte elemsize for an Arm64 Sve vector instruction +// Returns the encoding to select the 1/2/4 byte elemsize for an Arm64 Sve narrowing vector instruction static code_t insEncodeNarrowingSveElemsize(emitAttr size); // Returns the encoding to select the 1/2/4/8 byte elemsize for an Arm64 Sve vector instruction diff --git a/src/coreclr/jit/emitarm64sve.cpp b/src/coreclr/jit/emitarm64sve.cpp index 0cae23420fc080..9d0fe49fbc0520 100644 --- a/src/coreclr/jit/emitarm64sve.cpp +++ b/src/coreclr/jit/emitarm64sve.cpp @@ -7441,7 +7441,7 @@ void emitter::emitIns_PRFOP_R_R_I(instruction ins, /***************************************************************************** * - * Returns the encoding to select the 1/2/4/8 byte elemsize for an Arm64 Sve vector instruction + * Returns the encoding to select the 1/2/4 byte elemsize for an Arm64 Sve narrowing vector instruction */ /*static*/ emitter::code_t emitter::insEncodeNarrowingSveElemsize(emitAttr size) diff --git a/src/coreclr/jit/hwintrinsicarm64.cpp b/src/coreclr/jit/hwintrinsicarm64.cpp index efa6c434d0e6e2..f636ca7c0b0c57 100644 --- a/src/coreclr/jit/hwintrinsicarm64.cpp +++ b/src/coreclr/jit/hwintrinsicarm64.cpp @@ -3405,6 +3405,27 @@ GenTree* Compiler::impSpecialIntrinsic(NamedIntrinsic intrinsic, break; } + case NI_Sve2_SubtractWideningEven: + case NI_Sve2_SubtractWideningOdd: + { + assert(sig->numArgs == 2); + + CORINFO_ARG_LIST_HANDLE arg1 = sig->args; + CORINFO_ARG_LIST_HANDLE arg2 = info.compCompHnd->getArgNext(arg1); + CORINFO_CLASS_HANDLE argClass = NO_CLASS_HANDLE; + + JITtype2varType(strip(info.compCompHnd->getArgType(sig, arg2, &argClass))); + JITtype2varType(strip(info.compCompHnd->getArgType(sig, arg1, &argClass))); + op2 = impPopStack().val; + op1 = impPopStack().val; + + CorInfoType op1BaseJitType = getBaseJitTypeOfSIMDType(argClass); + retNode = gtNewSimdHWIntrinsicNode(retType, op1, op2, intrinsic, simdBaseJitType, simdSize); + retNode->AsHWIntrinsic()->SetSimdBaseJitType(simdBaseJitType); + retNode->AsHWIntrinsic()->SetAuxiliaryJitType(op1BaseJitType); + break; + } + default: { return nullptr; diff --git a/src/coreclr/jit/hwintrinsiccodegenarm64.cpp b/src/coreclr/jit/hwintrinsiccodegenarm64.cpp index cfbb6b516962e8..964a67283a110c 100644 --- a/src/coreclr/jit/hwintrinsiccodegenarm64.cpp +++ b/src/coreclr/jit/hwintrinsiccodegenarm64.cpp @@ -2744,6 +2744,30 @@ void CodeGen::genHWIntrinsic(GenTreeHWIntrinsic* node) GetEmitter()->emitInsSve_R_R_R(ins, emitSize, targetReg, op3Reg, op1Reg, INS_OPTS_SCALABLE_D); break; + case NI_Sve2_SubtractWideningEven: + { + var_types returnType = node->AsHWIntrinsic()->GetSimdBaseType(); + var_types op1Type = node->AsHWIntrinsic()->GetAuxiliaryType(); + if (returnType != op1Type) + { + ins = varTypeIsUnsigned(intrin.baseType) ? INS_sve_usublb : INS_sve_ssublb; + } + GetEmitter()->emitInsSve_R_R_R(ins, emitSize, targetReg, op1Reg, op2Reg, opt); + break; + } + + case NI_Sve2_SubtractWideningOdd: + { + var_types returnType = node->AsHWIntrinsic()->GetSimdBaseType(); + var_types op1Type = node->AsHWIntrinsic()->GetAuxiliaryType(); + if (returnType != op1Type) + { + ins = varTypeIsUnsigned(intrin.baseType) ? INS_sve_usublt : INS_sve_ssublt; + } + GetEmitter()->emitInsSve_R_R_R(ins, emitSize, targetReg, op1Reg, op2Reg, opt); + break; + } + default: unreached(); } diff --git a/src/coreclr/jit/hwintrinsiclistarm64sve.h b/src/coreclr/jit/hwintrinsiclistarm64sve.h index fc1807909ea501..4de5245fafa566 100644 --- a/src/coreclr/jit/hwintrinsiclistarm64sve.h +++ b/src/coreclr/jit/hwintrinsiclistarm64sve.h @@ -370,8 +370,18 @@ HARDWARE_INTRINSIC(Sve2, ShiftRightLogicalRoundedNarrowingEven, HARDWARE_INTRINSIC(Sve2, ShiftRightLogicalRoundedNarrowingOdd, -1, 3, {INS_sve_rshrnt, INS_sve_rshrnt, INS_sve_rshrnt, INS_sve_rshrnt, INS_sve_rshrnt, INS_sve_rshrnt, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_ShiftRightByImmediate, HW_Flag_Scalable|HW_Flag_HasImmediateOperand|HW_Flag_HasRMWSemantics) HARDWARE_INTRINSIC(Sve2, ShiftRightLogicalRoundedNarrowingSaturateEven, -1, 2, {INS_invalid, INS_sve_uqrshrnb, INS_invalid, INS_sve_uqrshrnb, INS_invalid, INS_sve_uqrshrnb, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_ShiftRightByImmediate, HW_Flag_Scalable|HW_Flag_HasImmediateOperand) HARDWARE_INTRINSIC(Sve2, ShiftRightLogicalRoundedNarrowingSaturateOdd, -1, 3, {INS_invalid, INS_sve_uqrshrnt, INS_invalid, INS_sve_uqrshrnt, INS_invalid, INS_sve_uqrshrnt, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_ShiftRightByImmediate, HW_Flag_Scalable|HW_Flag_HasImmediateOperand|HW_Flag_HasRMWSemantics) -HARDWARE_INTRINSIC(Sve2, VectorTableLookup, -1, 2, {INS_sve_tbl, INS_sve_tbl, INS_sve_tbl, INS_sve_tbl, INS_sve_tbl, INS_sve_tbl, INS_sve_tbl, INS_sve_tbl, INS_sve_tbl, INS_sve_tbl}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_NeedsConsecutiveRegisters|HW_Flag_SpecialImport|HW_Flag_SpecialCodeGen) -HARDWARE_INTRINSIC(Sve2, VectorTableLookupExtension, -1, 3, {INS_sve_tbx, INS_sve_tbx, INS_sve_tbx, INS_sve_tbx, INS_sve_tbx, INS_sve_tbx, INS_sve_tbx, INS_sve_tbx, INS_sve_tbx, INS_sve_tbx}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_HasRMWSemantics) +HARDWARE_INTRINSIC(Sve2, SubtractHighNarrowingEven, -1, 2, {INS_sve_subhnb, INS_sve_subhnb, INS_sve_subhnb, INS_sve_subhnb, INS_sve_subhnb, INS_sve_subhnb, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable) +HARDWARE_INTRINSIC(Sve2, SubtractHighNarrowingOdd, -1, 3, {INS_sve_subhnt, INS_sve_subhnt, INS_sve_subhnt, INS_sve_subhnt, INS_sve_subhnt, INS_sve_subhnt, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_HasRMWSemantics) +HARDWARE_INTRINSIC(Sve2, SubtractSaturate, -1, -1, {INS_sve_sqsub, INS_sve_uqsub, INS_sve_sqsub, INS_sve_uqsub, INS_sve_sqsub, INS_sve_uqsub, INS_sve_sqsub, INS_sve_uqsub, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_HasRMWSemantics) +HARDWARE_INTRINSIC(Sve2, SubtractSaturateReversed, -1, -1, {INS_sve_sqsubr, INS_sve_uqsubr, INS_sve_sqsubr, INS_sve_uqsubr, INS_sve_sqsubr, INS_sve_uqsubr, INS_sve_sqsubr, INS_sve_uqsubr, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_HasRMWSemantics) +HARDWARE_INTRINSIC(Sve2, SubtractWideningEven, -1, 2, {INS_invalid, INS_invalid, INS_sve_ssubwb, INS_sve_usubwb, INS_sve_ssubwb, INS_sve_usubwb, INS_sve_ssubwb, INS_sve_usubwb, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_SpecialImport|HW_Flag_SpecialCodeGen) +HARDWARE_INTRINSIC(Sve2, SubtractWideningEvenOdd, -1, 2, {INS_invalid, INS_invalid, INS_sve_ssublbt, INS_invalid, INS_sve_ssublbt, INS_invalid, INS_sve_ssublbt, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable) +HARDWARE_INTRINSIC(Sve2, SubtractWideningOdd, -1, 2, {INS_invalid, INS_invalid, INS_sve_ssubwt, INS_sve_usubwt, INS_sve_ssubwt, INS_sve_usubwt, INS_sve_ssubwt, INS_sve_usubwt, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_SpecialImport|HW_Flag_SpecialCodeGen) +HARDWARE_INTRINSIC(Sve2, SubtractWideningOddEven, -1, 2, {INS_invalid, INS_invalid, INS_sve_ssubltb, INS_invalid, INS_sve_ssubltb, INS_invalid, INS_sve_ssubltb, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable) +HARDWARE_INTRINSIC(Sve2, SubtractWithBorrowWideningLower, -1, 3, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_sbclb, INS_invalid, INS_sve_sbclb, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_HasRMWSemantics) +HARDWARE_INTRINSIC(Sve2, SubtractWithBorrowWideningUpper, -1, 3, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_sbclt, INS_invalid, INS_sve_sbclt, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_HasRMWSemantics) +HARDWARE_INTRINSIC(Sve2, VectorTableLookup, -1, 2, {INS_sve_tbl, INS_sve_tbl, INS_sve_tbl, INS_sve_tbl, INS_sve_tbl, INS_sve_tbl, INS_sve_tbl, INS_sve_tbl, INS_sve_tbl, INS_sve_tbl}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_NeedsConsecutiveRegisters|HW_Flag_SpecialImport|HW_Flag_SpecialCodeGen) +HARDWARE_INTRINSIC(Sve2, VectorTableLookupExtension, -1, 3, {INS_sve_tbx, INS_sve_tbx, INS_sve_tbx, INS_sve_tbx, INS_sve_tbx, INS_sve_tbx, INS_sve_tbx, INS_sve_tbx, INS_sve_tbx, INS_sve_tbx}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_HasRMWSemantics) HARDWARE_INTRINSIC(Sve2, Xor, -1, 3, {INS_sve_eor3, INS_sve_eor3, INS_sve_eor3, INS_sve_eor3, INS_sve_eor3, INS_sve_eor3, INS_sve_eor3, INS_sve_eor3, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_HasRMWSemantics) HARDWARE_INTRINSIC(Sve2, XorRotateRight, -1, 3, {INS_sve_xar, INS_sve_xar, INS_sve_xar, INS_sve_xar, INS_sve_xar, INS_sve_xar, INS_sve_xar, INS_sve_xar, INS_invalid, INS_invalid}, HW_Category_ShiftRightByImmediate, HW_Flag_Scalable|HW_Flag_HasRMWSemantics|HW_Flag_HasImmediateOperand) #define LAST_NI_Sve2 NI_Sve2_XorRotateRight 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 007620866ef41d..8e5b0f107cb668 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 @@ -2038,6 +2038,494 @@ internal Arm64() { } public static Vector ShiftRightLogicalRoundedNarrowingSaturateOdd(Vector even, Vector value, [ConstantExpected] byte count) { throw new PlatformNotSupportedException(); } + // Subtract narrow high part (bottom) + + /// + /// svuint8_t svsubhnb[_u16](svuint16_t op1, svuint16_t op2) + /// SUBHNB Zresult.B, Zop1.H, Zop2.H + /// + public static Vector SubtractHighNarrowingEven(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svint16_t svsubhnb[_s32](svint32_t op1, svint32_t op2) + /// SUBHNB Zresult.H, Zop1.S, Zop2.S + /// + public static Vector SubtractHighNarrowingEven(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svint32_t svsubhnb[_s64](svint64_t op1, svint64_t op2) + /// SUBHNB Zresult.S, Zop1.D, Zop2.D + /// + public static Vector SubtractHighNarrowingEven(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svint8_t svsubhnb[_s16](svint16_t op1, svint16_t op2) + /// SUBHNB Zresult.B, Zop1.H, Zop2.H + /// + public static Vector SubtractHighNarrowingEven(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svuint16_t svsubhnb[_u32](svuint32_t op1, svuint32_t op2) + /// SUBHNB Zresult.H, Zop1.S, Zop2.S + /// + public static Vector SubtractHighNarrowingEven(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svuint32_t svsubhnb[_u64](svuint64_t op1, svuint64_t op2) + /// SUBHNB Zresult.S, Zop1.D, Zop2.D + /// + public static Vector SubtractHighNarrowingEven(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + + // Subtract narrow high part (top) + + /// + /// svuint8_t svsubhnt[_u16](svuint8_t even, svuint16_t op1, svuint16_t op2) + /// SUBHNT Ztied.B, Zop1.H, Zop2.H + /// + public static Vector SubtractHighNarrowingOdd(Vector even, Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svint16_t svsubhnt[_s32](svint16_t even, svint32_t op1, svint32_t op2) + /// SUBHNT Ztied.H, Zop1.S, Zop2.S + /// + public static Vector SubtractHighNarrowingOdd(Vector even, Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svint32_t svsubhnt[_s64](svint32_t even, svint64_t op1, svint64_t op2) + /// SUBHNT Ztied.S, Zop1.D, Zop2.D + /// + public static Vector SubtractHighNarrowingOdd(Vector even, Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svint8_t svsubhnt[_s16](svint8_t even, svint16_t op1, svint16_t op2) + /// SUBHNT Ztied.B, Zop1.H, Zop2.H + /// + public static Vector SubtractHighNarrowingOdd(Vector even, Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svuint16_t svsubhnt[_u32](svuint16_t even, svuint32_t op1, svuint32_t op2) + /// SUBHNT Ztied.H, Zop1.S, Zop2.S + /// + public static Vector SubtractHighNarrowingOdd(Vector even, Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svuint32_t svsubhnt[_u64](svuint32_t even, svuint64_t op1, svuint64_t op2) + /// SUBHNT Ztied.S, Zop1.D, Zop2.D + /// + public static Vector SubtractHighNarrowingOdd(Vector even, Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + + // Saturating subtract + + /// + /// svuint8_t svqsub[_u8]_m(svbool_t pg, svuint8_t op1, svuint8_t op2) + /// svuint8_t svqsub[_u8]_x(svbool_t pg, svuint8_t op1, svuint8_t op2) + /// svuint8_t svqsub[_u8]_z(svbool_t pg, svuint8_t op1, svuint8_t op2) + /// UQSUB Ztied1.B, Pg/M, Ztied1.B, Zop2.B + /// UQSUB Ztied1.B, Pg/M, Ztied1.B, Zop2.B + /// UQSUBR Ztied2.B, Pg/M, Ztied2.B, Zop1.B + /// UQSUB Zresult.B, Zop1.B, Zop2.B + /// + public static new Vector SubtractSaturate(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svint16_t svqsub[_s16]_m(svbool_t pg, svint16_t op1, svint16_t op2) + /// svint16_t svqsub[_s16]_x(svbool_t pg, svint16_t op1, svint16_t op2) + /// svint16_t svqsub[_s16]_z(svbool_t pg, svint16_t op1, svint16_t op2) + /// SQSUB Ztied1.H, Pg/M, Ztied1.H, Zop2.H + /// SQSUB Ztied1.H, Pg/M, Ztied1.H, Zop2.H + /// SQSUBR Ztied2.H, Pg/M, Ztied2.H, Zop1.H + /// SQSUB Zresult.H, Zop1.H, Zop2.H + /// + public static new Vector SubtractSaturate(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svint32_t svqsub[_s32]_m(svbool_t pg, svint32_t op1, svint32_t op2) + /// svint32_t svqsub[_s32]_x(svbool_t pg, svint32_t op1, svint32_t op2) + /// svint32_t svqsub[_s32]_z(svbool_t pg, svint32_t op1, svint32_t op2) + /// SQSUB Ztied1.S, Pg/M, Ztied1.S, Zop2.S + /// SQSUB Ztied1.S, Pg/M, Ztied1.S, Zop2.S + /// SQSUBR Ztied2.S, Pg/M, Ztied2.S, Zop1.S + /// SQSUB Zresult.S, Zop1.S, Zop2.S + /// + public static new Vector SubtractSaturate(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svint64_t svqsub[_s64]_m(svbool_t pg, svint64_t op1, svint64_t op2) + /// svint64_t svqsub[_s64]_x(svbool_t pg, svint64_t op1, svint64_t op2) + /// svint64_t svqsub[_s64]_z(svbool_t pg, svint64_t op1, svint64_t op2) + /// SQSUB Ztied1.D, Pg/M, Ztied1.D, Zop2.D + /// SQSUB Ztied1.D, Pg/M, Ztied1.D, Zop2.D + /// SQSUBR Ztied2.D, Pg/M, Ztied2.D, Zop1.D + /// SQSUB Zresult.D, Zop1.D, Zop2.D + /// + public static new Vector SubtractSaturate(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svint8_t svqsub[_s8]_m(svbool_t pg, svint8_t op1, svint8_t op2) + /// svint8_t svqsub[_s8]_x(svbool_t pg, svint8_t op1, svint8_t op2) + /// svint8_t svqsub[_s8]_z(svbool_t pg, svint8_t op1, svint8_t op2) + /// SQSUB Ztied1.B, Pg/M, Ztied1.B, Zop2.B + /// SQSUB Ztied1.B, Pg/M, Ztied1.B, Zop2.B + /// SQSUBR Ztied2.B, Pg/M, Ztied2.B, Zop1.B + /// SQSUB Zresult.B, Zop1.B, Zop2.B + /// + public static new Vector SubtractSaturate(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svuint16_t svqsub[_u16]_m(svbool_t pg, svuint16_t op1, svuint16_t op2) + /// svuint16_t svqsub[_u16]_x(svbool_t pg, svuint16_t op1, svuint16_t op2) + /// svuint16_t svqsub[_u16]_z(svbool_t pg, svuint16_t op1, svuint16_t op2) + /// UQSUB Ztied1.H, Pg/M, Ztied1.H, Zop2.H + /// UQSUB Ztied1.H, Pg/M, Ztied1.H, Zop2.H + /// UQSUBR Ztied2.H, Pg/M, Ztied2.H, Zop1.H + /// UQSUB Zresult.H, Zop1.H, Zop2.H + /// + public static new Vector SubtractSaturate(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svuint32_t svqsub[_u32]_m(svbool_t pg, svuint32_t op1, svuint32_t op2) + /// svuint32_t svqsub[_u32]_x(svbool_t pg, svuint32_t op1, svuint32_t op2) + /// svuint32_t svqsub[_u32]_z(svbool_t pg, svuint32_t op1, svuint32_t op2) + /// UQSUB Ztied1.S, Pg/M, Ztied1.S, Zop2.S + /// UQSUB Ztied1.S, Pg/M, Ztied1.S, Zop2.S + /// UQSUBR Ztied2.S, Pg/M, Ztied2.S, Zop1.S + /// UQSUB Zresult.S, Zop1.S, Zop2.S + /// + public static new Vector SubtractSaturate(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svuint64_t svqsub[_u64]_m(svbool_t pg, svuint64_t op1, svuint64_t op2) + /// svuint64_t svqsub[_u64]_x(svbool_t pg, svuint64_t op1, svuint64_t op2) + /// svuint64_t svqsub[_u64]_z(svbool_t pg, svuint64_t op1, svuint64_t op2) + /// UQSUB Ztied1.D, Pg/M, Ztied1.D, Zop2.D + /// UQSUB Ztied1.D, Pg/M, Ztied1.D, Zop2.D + /// UQSUBR Ztied2.D, Pg/M, Ztied2.D, Zop1.D + /// UQSUB Zresult.D, Zop1.D, Zop2.D + /// + public static new Vector SubtractSaturate(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + + // Saturating subtract reversed + + /// + /// svuint8_t svqsubr[_u8]_m(svbool_t pg, svuint8_t op1, svuint8_t op2) + /// svuint8_t svqsubr[_u8]_x(svbool_t pg, svuint8_t op1, svuint8_t op2) + /// svuint8_t svqsubr[_u8]_z(svbool_t pg, svuint8_t op1, svuint8_t op2) + /// UQSUBR Ztied1.B, Pg/M, Ztied1.B, Zop2.B + /// UQSUBR Ztied1.B, Pg/M, Ztied1.B, Zop2.B + /// UQSUB Ztied2.B, Pg/M, Ztied2.B, Zop1.B + /// UQSUB Zresult.B, Zop2.B, Zop1.B + /// + public static Vector SubtractSaturateReversed(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svint16_t svqsubr[_s16]_m(svbool_t pg, svint16_t op1, svint16_t op2) + /// svint16_t svqsubr[_s16]_x(svbool_t pg, svint16_t op1, svint16_t op2) + /// svint16_t svqsubr[_s16]_z(svbool_t pg, svint16_t op1, svint16_t op2) + /// SQSUBR Ztied1.H, Pg/M, Ztied1.H, Zop2.H + /// SQSUBR Ztied1.H, Pg/M, Ztied1.H, Zop2.H + /// SQSUB Ztied2.H, Pg/M, Ztied2.H, Zop1.H + /// SQSUB Zresult.H, Zop2.H, Zop1.H + /// + public static Vector SubtractSaturateReversed(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svint32_t svqsubr[_s32]_m(svbool_t pg, svint32_t op1, svint32_t op2) + /// svint32_t svqsubr[_s32]_x(svbool_t pg, svint32_t op1, svint32_t op2) + /// svint32_t svqsubr[_s32]_z(svbool_t pg, svint32_t op1, svint32_t op2) + /// SQSUBR Ztied1.S, Pg/M, Ztied1.S, Zop2.S + /// SQSUBR Ztied1.S, Pg/M, Ztied1.S, Zop2.S + /// SQSUB Ztied2.S, Pg/M, Ztied2.S, Zop1.S + /// SQSUB Zresult.S, Zop2.S, Zop1.S + /// + public static Vector SubtractSaturateReversed(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svint64_t svqsubr[_s64]_m(svbool_t pg, svint64_t op1, svint64_t op2) + /// svint64_t svqsubr[_s64]_x(svbool_t pg, svint64_t op1, svint64_t op2) + /// svint64_t svqsubr[_s64]_z(svbool_t pg, svint64_t op1, svint64_t op2) + /// SQSUBR Ztied1.D, Pg/M, Ztied1.D, Zop2.D + /// SQSUBR Ztied1.D, Pg/M, Ztied1.D, Zop2.D + /// SQSUB Ztied2.D, Pg/M, Ztied2.D, Zop1.D + /// SQSUB Zresult.D, Zop2.D, Zop1.D + /// + public static Vector SubtractSaturateReversed(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svint8_t svqsubr[_s8]_m(svbool_t pg, svint8_t op1, svint8_t op2) + /// svint8_t svqsubr[_s8]_x(svbool_t pg, svint8_t op1, svint8_t op2) + /// svint8_t svqsubr[_s8]_z(svbool_t pg, svint8_t op1, svint8_t op2) + /// SQSUBR Ztied1.B, Pg/M, Ztied1.B, Zop2.B + /// SQSUBR Ztied1.B, Pg/M, Ztied1.B, Zop2.B + /// SQSUB Ztied2.B, Pg/M, Ztied2.B, Zop1.B + /// SQSUB Zresult.B, Zop2.B, Zop1.B + /// + public static Vector SubtractSaturateReversed(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svuint16_t svqsubr[_u16]_m(svbool_t pg, svuint16_t op1, svuint16_t op2) + /// svuint16_t svqsubr[_u16]_x(svbool_t pg, svuint16_t op1, svuint16_t op2) + /// svuint16_t svqsubr[_u16]_z(svbool_t pg, svuint16_t op1, svuint16_t op2) + /// UQSUBR Ztied1.H, Pg/M, Ztied1.H, Zop2.H + /// UQSUBR Ztied1.H, Pg/M, Ztied1.H, Zop2.H + /// UQSUB Ztied2.H, Pg/M, Ztied2.H, Zop1.H + /// UQSUB Zresult.H, Zop2.H, Zop1.H + /// + public static Vector SubtractSaturateReversed(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svuint32_t svqsubr[_u32]_m(svbool_t pg, svuint32_t op1, svuint32_t op2) + /// svuint32_t svqsubr[_u32]_x(svbool_t pg, svuint32_t op1, svuint32_t op2) + /// svuint32_t svqsubr[_u32]_z(svbool_t pg, svuint32_t op1, svuint32_t op2) + /// UQSUBR Ztied1.S, Pg/M, Ztied1.S, Zop2.S + /// UQSUBR Ztied1.S, Pg/M, Ztied1.S, Zop2.S + /// UQSUB Ztied2.S, Pg/M, Ztied2.S, Zop1.S + /// UQSUB Zresult.S, Zop2.S, Zop1.S + /// + public static Vector SubtractSaturateReversed(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svuint64_t svqsubr[_u64]_m(svbool_t pg, svuint64_t op1, svuint64_t op2) + /// svuint64_t svqsubr[_u64]_x(svbool_t pg, svuint64_t op1, svuint64_t op2) + /// svuint64_t svqsubr[_u64]_z(svbool_t pg, svuint64_t op1, svuint64_t op2) + /// UQSUBR Ztied1.D, Pg/M, Ztied1.D, Zop2.D + /// UQSUBR Ztied1.D, Pg/M, Ztied1.D, Zop2.D + /// UQSUB Ztied2.D, Pg/M, Ztied2.D, Zop1.D + /// UQSUB Zresult.D, Zop2.D, Zop1.D + /// + public static Vector SubtractSaturateReversed(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + + // Subtract wide (bottom) + + /// + /// svint16_t svsubwb[_s16](svint16_t op1, svint8_t op2) + /// SSUBWB Zresult.H, Zop1.H, Zop2.B + /// + public static Vector SubtractWideningEven(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svint32_t svsubwb[_s32](svint32_t op1, svint16_t op2) + /// SSUBWB Zresult.S, Zop1.S, Zop2.H + /// + public static Vector SubtractWideningEven(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svint64_t svsubwb[_s64](svint64_t op1, svint32_t op2) + /// SSUBWB Zresult.D, Zop1.D, Zop2.S + /// + public static Vector SubtractWideningEven(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svuint16_t svsubwb[_u16](svuint16_t op1, svuint8_t op2) + /// USUBWB Zresult.H, Zop1.H, Zop2.B + /// + public static Vector SubtractWideningEven(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svuint32_t svsubwb[_u32](svuint32_t op1, svuint16_t op2) + /// USUBWB Zresult.S, Zop1.S, Zop2.H + /// + public static Vector SubtractWideningEven(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svuint64_t svsubwb[_u64](svuint64_t op1, svuint32_t op2) + /// USUBWB Zresult.D, Zop1.D, Zop2.S + /// + public static Vector SubtractWideningEven(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + + // Subtract long (bottom) + + /// + /// svint16_t svsublb[_s16](svint8_t op1, svint8_t op2) + /// SSUBLB Zresult.H, Zop1.B, Zop2.B + /// + public static Vector SubtractWideningEven(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svint32_t svsublb[_s32](svint16_t op1, svint16_t op2) + /// SSUBLB Zresult.S, Zop1.H, Zop2.H + /// + public static Vector SubtractWideningEven(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svint64_t svsublb[_s64](svint32_t op1, svint32_t op2) + /// SSUBLB Zresult.D, Zop1.S, Zop2.S + /// + public static Vector SubtractWideningEven(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svuint16_t svsublb[_u16](svuint8_t op1, svuint8_t op2) + /// USUBLB Zresult.H, Zop1.B, Zop2.B + /// + public static Vector SubtractWideningEven(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svuint32_t svsublb[_u32](svuint16_t op1, svuint16_t op2) + /// USUBLB Zresult.S, Zop1.H, Zop2.H + /// + public static Vector SubtractWideningEven(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svuint64_t svsublb[_u64](svuint32_t op1, svuint32_t op2) + /// USUBLB Zresult.D, Zop1.S, Zop2.S + /// + public static Vector SubtractWideningEven(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + + // Subtract long (bottom - top) + + /// + /// svint16_t svsublbt[_s16](svint8_t op1, svint8_t op2) + /// SSUBLBT Zresult.H, Zop1.B, Zop2.B + /// + public static Vector SubtractWideningEvenOdd(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svint32_t svsublbt[_s32](svint16_t op1, svint16_t op2) + /// SSUBLBT Zresult.S, Zop1.H, Zop2.H + /// + public static Vector SubtractWideningEvenOdd(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svint64_t svsublbt[_s64](svint32_t op1, svint32_t op2) + /// SSUBLBT Zresult.D, Zop1.S, Zop2.S + /// + public static Vector SubtractWideningEvenOdd(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + + // Subtract wide (top) + + /// + /// svint16_t svsubwt[_s16](svint16_t op1, svint8_t op2) + /// SSUBWT Zresult.H, Zop1.H, Zop2.B + /// + public static Vector SubtractWideningOdd(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svint32_t svsubwt[_s32](svint32_t op1, svint16_t op2) + /// SSUBWT Zresult.S, Zop1.S, Zop2.H + /// + public static Vector SubtractWideningOdd(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svint64_t svsubwt[_s64](svint64_t op1, svint32_t op2) + /// SSUBWT Zresult.D, Zop1.D, Zop2.S + /// + public static Vector SubtractWideningOdd(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svuint16_t svsubwt[_u16](svuint16_t op1, svuint8_t op2) + /// USUBWT Zresult.H, Zop1.H, Zop2.B + /// + public static Vector SubtractWideningOdd(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svuint32_t svsubwt[_u32](svuint32_t op1, svuint16_t op2) + /// USUBWT Zresult.S, Zop1.S, Zop2.H + /// + public static Vector SubtractWideningOdd(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svuint64_t svsubwt[_u64](svuint64_t op1, svuint32_t op2) + /// USUBWT Zresult.D, Zop1.D, Zop2.S + /// + public static Vector SubtractWideningOdd(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + + // Subtract long (top) + + /// + /// svint16_t svsublt[_s16](svint8_t op1, svint8_t op2) + /// SSUBLT Zresult.H, Zop1.B, Zop2.B + /// + public static Vector SubtractWideningOdd(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svint32_t svsublt[_s32](svint16_t op1, svint16_t op2) + /// SSUBLT Zresult.S, Zop1.H, Zop2.H + /// + public static Vector SubtractWideningOdd(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svint64_t svsublt[_s64](svint32_t op1, svint32_t op2) + /// SSUBLT Zresult.D, Zop1.S, Zop2.S + /// + public static Vector SubtractWideningOdd(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svuint16_t svsublt[_u16](svuint8_t op1, svuint8_t op2) + /// USUBLT Zresult.H, Zop1.B, Zop2.B + /// + public static Vector SubtractWideningOdd(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svuint32_t svsublt[_u32](svuint16_t op1, svuint16_t op2) + /// USUBLT Zresult.S, Zop1.H, Zop2.H + /// + public static Vector SubtractWideningOdd(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svuint64_t svsublt[_u64](svuint32_t op1, svuint32_t op2) + /// USUBLT Zresult.D, Zop1.S, Zop2.S + /// + public static Vector SubtractWideningOdd(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + + // Subtract long (top - bottom) + + /// + /// svint16_t svsubltb[_s16](svint8_t op1, svint8_t op2) + /// SSUBLTB Zresult.H, Zop1.B, Zop2.B + /// + public static Vector SubtractWideningOddEven(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svint32_t svsubltb[_s32](svint16_t op1, svint16_t op2) + /// SSUBLTB Zresult.S, Zop1.H, Zop2.H + /// + public static Vector SubtractWideningOddEven(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svint64_t svsubltb[_s64](svint32_t op1, svint32_t op2) + /// SSUBLTB Zresult.D, Zop1.S, Zop2.S + /// + public static Vector SubtractWideningOddEven(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + + // Subtract with borrow long (bottom) + + /// + /// svuint32_t svsbclb[_u32](svuint32_t op1, svuint32_t op2, svuint32_t op3) + /// SBCLB Ztied1.S, Zop2.S, Zop3.S + /// + public static Vector SubtractWithBorrowWideningLower(Vector op1, Vector op2, Vector op3) { throw new PlatformNotSupportedException(); } + + /// + /// svuint64_t svsbclb[_u64](svuint64_t op1, svuint64_t op2, svuint64_t op3) + /// SBCLB Ztied1.D, Zop2.D, Zop3.D + /// + public static Vector SubtractWithBorrowWideningLower(Vector op1, Vector op2, Vector op3) { throw new PlatformNotSupportedException(); } + + + // Subtract with borrow long (top) + + /// + /// svuint32_t svsbclt[_u32](svuint32_t op1, svuint32_t op2, svuint32_t op3) + /// SBCLT Ztied1.S, Zop2.S, Zop3.S + /// + public static Vector SubtractWithBorrowWideningUpper(Vector op1, Vector op2, Vector op3) { throw new PlatformNotSupportedException(); } + + /// + /// svuint64_t svsbclt[_u64](svuint64_t op1, svuint64_t op2, svuint64_t op3) + /// SBCLT Ztied1.D, Zop2.D, Zop3.D + /// + public static Vector SubtractWithBorrowWideningUpper(Vector op1, Vector op2, Vector op3) { throw new PlatformNotSupportedException(); } + + // Bit vector table lookups /// 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 464a763d78c6bd..6c1f6a222267a3 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 @@ -2038,6 +2038,494 @@ internal Arm64() { } public static Vector ShiftRightLogicalRoundedNarrowingSaturateOdd(Vector even, Vector value, [ConstantExpected] byte count) => ShiftRightLogicalRoundedNarrowingSaturateOdd(even, value, count); + // Subtract narrow high part (bottom) + + /// + /// svuint8_t svsubhnb[_u16](svuint16_t op1, svuint16_t op2) + /// SUBHNB Zresult.B, Zop1.H, Zop2.H + /// + public static Vector SubtractHighNarrowingEven(Vector left, Vector right) => SubtractHighNarrowingEven(left, right); + + /// + /// svint16_t svsubhnb[_s32](svint32_t op1, svint32_t op2) + /// SUBHNB Zresult.H, Zop1.S, Zop2.S + /// + public static Vector SubtractHighNarrowingEven(Vector left, Vector right) => SubtractHighNarrowingEven(left, right); + + /// + /// svint32_t svsubhnb[_s64](svint64_t op1, svint64_t op2) + /// SUBHNB Zresult.S, Zop1.D, Zop2.D + /// + public static Vector SubtractHighNarrowingEven(Vector left, Vector right) => SubtractHighNarrowingEven(left, right); + + /// + /// svint8_t svsubhnb[_s16](svint16_t op1, svint16_t op2) + /// SUBHNB Zresult.B, Zop1.H, Zop2.H + /// + public static Vector SubtractHighNarrowingEven(Vector left, Vector right) => SubtractHighNarrowingEven(left, right); + + /// + /// svuint16_t svsubhnb[_u32](svuint32_t op1, svuint32_t op2) + /// SUBHNB Zresult.H, Zop1.S, Zop2.S + /// + public static Vector SubtractHighNarrowingEven(Vector left, Vector right) => SubtractHighNarrowingEven(left, right); + + /// + /// svuint32_t svsubhnb[_u64](svuint64_t op1, svuint64_t op2) + /// SUBHNB Zresult.S, Zop1.D, Zop2.D + /// + public static Vector SubtractHighNarrowingEven(Vector left, Vector right) => SubtractHighNarrowingEven(left, right); + + + // Subtract narrow high part (top) + + /// + /// svuint8_t svsubhnt[_u16](svuint8_t even, svuint16_t op1, svuint16_t op2) + /// SUBHNT Ztied.B, Zop1.H, Zop2.H + /// + public static Vector SubtractHighNarrowingOdd(Vector even, Vector left, Vector right) => SubtractHighNarrowingOdd(even, left, right); + + /// + /// svint16_t svsubhnt[_s32](svint16_t even, svint32_t op1, svint32_t op2) + /// SUBHNT Ztied.H, Zop1.S, Zop2.S + /// + public static Vector SubtractHighNarrowingOdd(Vector even, Vector left, Vector right) => SubtractHighNarrowingOdd(even, left, right); + + /// + /// svint32_t svsubhnt[_s64](svint32_t even, svint64_t op1, svint64_t op2) + /// SUBHNT Ztied.S, Zop1.D, Zop2.D + /// + public static Vector SubtractHighNarrowingOdd(Vector even, Vector left, Vector right) => SubtractHighNarrowingOdd(even, left, right); + + /// + /// svint8_t svsubhnt[_s16](svint8_t even, svint16_t op1, svint16_t op2) + /// SUBHNT Ztied.B, Zop1.H, Zop2.H + /// + public static Vector SubtractHighNarrowingOdd(Vector even, Vector left, Vector right) => SubtractHighNarrowingOdd(even, left, right); + + /// + /// svuint16_t svsubhnt[_u32](svuint16_t even, svuint32_t op1, svuint32_t op2) + /// SUBHNT Ztied.H, Zop1.S, Zop2.S + /// + public static Vector SubtractHighNarrowingOdd(Vector even, Vector left, Vector right) => SubtractHighNarrowingOdd(even, left, right); + + /// + /// svuint32_t svsubhnt[_u64](svuint32_t even, svuint64_t op1, svuint64_t op2) + /// SUBHNT Ztied.S, Zop1.D, Zop2.D + /// + public static Vector SubtractHighNarrowingOdd(Vector even, Vector left, Vector right) => SubtractHighNarrowingOdd(even, left, right); + + + // Saturating subtract + + /// + /// svuint8_t svqsub[_u8]_m(svbool_t pg, svuint8_t op1, svuint8_t op2) + /// svuint8_t svqsub[_u8]_x(svbool_t pg, svuint8_t op1, svuint8_t op2) + /// svuint8_t svqsub[_u8]_z(svbool_t pg, svuint8_t op1, svuint8_t op2) + /// UQSUB Ztied1.B, Pg/M, Ztied1.B, Zop2.B + /// UQSUB Ztied1.B, Pg/M, Ztied1.B, Zop2.B + /// UQSUBR Ztied2.B, Pg/M, Ztied2.B, Zop1.B + /// UQSUB Zresult.B, Zop1.B, Zop2.B + /// + public static new Vector SubtractSaturate(Vector left, Vector right) => SubtractSaturate(left, right); + + /// + /// svint16_t svqsub[_s16]_m(svbool_t pg, svint16_t op1, svint16_t op2) + /// svint16_t svqsub[_s16]_x(svbool_t pg, svint16_t op1, svint16_t op2) + /// svint16_t svqsub[_s16]_z(svbool_t pg, svint16_t op1, svint16_t op2) + /// SQSUB Ztied1.H, Pg/M, Ztied1.H, Zop2.H + /// SQSUB Ztied1.H, Pg/M, Ztied1.H, Zop2.H + /// SQSUBR Ztied2.H, Pg/M, Ztied2.H, Zop1.H + /// SQSUB Zresult.H, Zop1.H, Zop2.H + /// + public static new Vector SubtractSaturate(Vector left, Vector right) => SubtractSaturate(left, right); + + /// + /// svint32_t svqsub[_s32]_m(svbool_t pg, svint32_t op1, svint32_t op2) + /// svint32_t svqsub[_s32]_x(svbool_t pg, svint32_t op1, svint32_t op2) + /// svint32_t svqsub[_s32]_z(svbool_t pg, svint32_t op1, svint32_t op2) + /// SQSUB Ztied1.S, Pg/M, Ztied1.S, Zop2.S + /// SQSUB Ztied1.S, Pg/M, Ztied1.S, Zop2.S + /// SQSUBR Ztied2.S, Pg/M, Ztied2.S, Zop1.S + /// SQSUB Zresult.S, Zop1.S, Zop2.S + /// + public static new Vector SubtractSaturate(Vector left, Vector right) => SubtractSaturate(left, right); + + /// + /// svint64_t svqsub[_s64]_m(svbool_t pg, svint64_t op1, svint64_t op2) + /// svint64_t svqsub[_s64]_x(svbool_t pg, svint64_t op1, svint64_t op2) + /// svint64_t svqsub[_s64]_z(svbool_t pg, svint64_t op1, svint64_t op2) + /// SQSUB Ztied1.D, Pg/M, Ztied1.D, Zop2.D + /// SQSUB Ztied1.D, Pg/M, Ztied1.D, Zop2.D + /// SQSUBR Ztied2.D, Pg/M, Ztied2.D, Zop1.D + /// SQSUB Zresult.D, Zop1.D, Zop2.D + /// + public static new Vector SubtractSaturate(Vector left, Vector right) => SubtractSaturate(left, right); + + /// + /// svint8_t svqsub[_s8]_m(svbool_t pg, svint8_t op1, svint8_t op2) + /// svint8_t svqsub[_s8]_x(svbool_t pg, svint8_t op1, svint8_t op2) + /// svint8_t svqsub[_s8]_z(svbool_t pg, svint8_t op1, svint8_t op2) + /// SQSUB Ztied1.B, Pg/M, Ztied1.B, Zop2.B + /// SQSUB Ztied1.B, Pg/M, Ztied1.B, Zop2.B + /// SQSUBR Ztied2.B, Pg/M, Ztied2.B, Zop1.B + /// SQSUB Zresult.B, Zop1.B, Zop2.B + /// + public static new Vector SubtractSaturate(Vector left, Vector right) => SubtractSaturate(left, right); + + /// + /// svuint16_t svqsub[_u16]_m(svbool_t pg, svuint16_t op1, svuint16_t op2) + /// svuint16_t svqsub[_u16]_x(svbool_t pg, svuint16_t op1, svuint16_t op2) + /// svuint16_t svqsub[_u16]_z(svbool_t pg, svuint16_t op1, svuint16_t op2) + /// UQSUB Ztied1.H, Pg/M, Ztied1.H, Zop2.H + /// UQSUB Ztied1.H, Pg/M, Ztied1.H, Zop2.H + /// UQSUBR Ztied2.H, Pg/M, Ztied2.H, Zop1.H + /// UQSUB Zresult.H, Zop1.H, Zop2.H + /// + public static new Vector SubtractSaturate(Vector left, Vector right) => SubtractSaturate(left, right); + + /// + /// svuint32_t svqsub[_u32]_m(svbool_t pg, svuint32_t op1, svuint32_t op2) + /// svuint32_t svqsub[_u32]_x(svbool_t pg, svuint32_t op1, svuint32_t op2) + /// svuint32_t svqsub[_u32]_z(svbool_t pg, svuint32_t op1, svuint32_t op2) + /// UQSUB Ztied1.S, Pg/M, Ztied1.S, Zop2.S + /// UQSUB Ztied1.S, Pg/M, Ztied1.S, Zop2.S + /// UQSUBR Ztied2.S, Pg/M, Ztied2.S, Zop1.S + /// UQSUB Zresult.S, Zop1.S, Zop2.S + /// + public static new Vector SubtractSaturate(Vector left, Vector right) => SubtractSaturate(left, right); + + /// + /// svuint64_t svqsub[_u64]_m(svbool_t pg, svuint64_t op1, svuint64_t op2) + /// svuint64_t svqsub[_u64]_x(svbool_t pg, svuint64_t op1, svuint64_t op2) + /// svuint64_t svqsub[_u64]_z(svbool_t pg, svuint64_t op1, svuint64_t op2) + /// UQSUB Ztied1.D, Pg/M, Ztied1.D, Zop2.D + /// UQSUB Ztied1.D, Pg/M, Ztied1.D, Zop2.D + /// UQSUBR Ztied2.D, Pg/M, Ztied2.D, Zop1.D + /// UQSUB Zresult.D, Zop1.D, Zop2.D + /// + public static new Vector SubtractSaturate(Vector left, Vector right) => SubtractSaturate(left, right); + + + // Saturating subtract reversed + + /// + /// svuint8_t svqsubr[_u8]_m(svbool_t pg, svuint8_t op1, svuint8_t op2) + /// svuint8_t svqsubr[_u8]_x(svbool_t pg, svuint8_t op1, svuint8_t op2) + /// svuint8_t svqsubr[_u8]_z(svbool_t pg, svuint8_t op1, svuint8_t op2) + /// UQSUBR Ztied1.B, Pg/M, Ztied1.B, Zop2.B + /// UQSUBR Ztied1.B, Pg/M, Ztied1.B, Zop2.B + /// UQSUB Ztied2.B, Pg/M, Ztied2.B, Zop1.B + /// UQSUB Zresult.B, Zop2.B, Zop1.B + /// + public static Vector SubtractSaturateReversed(Vector left, Vector right) => SubtractSaturateReversed(left, right); + + /// + /// svint16_t svqsubr[_s16]_m(svbool_t pg, svint16_t op1, svint16_t op2) + /// svint16_t svqsubr[_s16]_x(svbool_t pg, svint16_t op1, svint16_t op2) + /// svint16_t svqsubr[_s16]_z(svbool_t pg, svint16_t op1, svint16_t op2) + /// SQSUBR Ztied1.H, Pg/M, Ztied1.H, Zop2.H + /// SQSUBR Ztied1.H, Pg/M, Ztied1.H, Zop2.H + /// SQSUB Ztied2.H, Pg/M, Ztied2.H, Zop1.H + /// SQSUB Zresult.H, Zop2.H, Zop1.H + /// + public static Vector SubtractSaturateReversed(Vector left, Vector right) => SubtractSaturateReversed(left, right); + + /// + /// svint32_t svqsubr[_s32]_m(svbool_t pg, svint32_t op1, svint32_t op2) + /// svint32_t svqsubr[_s32]_x(svbool_t pg, svint32_t op1, svint32_t op2) + /// svint32_t svqsubr[_s32]_z(svbool_t pg, svint32_t op1, svint32_t op2) + /// SQSUBR Ztied1.S, Pg/M, Ztied1.S, Zop2.S + /// SQSUBR Ztied1.S, Pg/M, Ztied1.S, Zop2.S + /// SQSUB Ztied2.S, Pg/M, Ztied2.S, Zop1.S + /// SQSUB Zresult.S, Zop2.S, Zop1.S + /// + public static Vector SubtractSaturateReversed(Vector left, Vector right) => SubtractSaturateReversed(left, right); + + /// + /// svint64_t svqsubr[_s64]_m(svbool_t pg, svint64_t op1, svint64_t op2) + /// svint64_t svqsubr[_s64]_x(svbool_t pg, svint64_t op1, svint64_t op2) + /// svint64_t svqsubr[_s64]_z(svbool_t pg, svint64_t op1, svint64_t op2) + /// SQSUBR Ztied1.D, Pg/M, Ztied1.D, Zop2.D + /// SQSUBR Ztied1.D, Pg/M, Ztied1.D, Zop2.D + /// SQSUB Ztied2.D, Pg/M, Ztied2.D, Zop1.D + /// SQSUB Zresult.D, Zop2.D, Zop1.D + /// + public static Vector SubtractSaturateReversed(Vector left, Vector right) => SubtractSaturateReversed(left, right); + + /// + /// svint8_t svqsubr[_s8]_m(svbool_t pg, svint8_t op1, svint8_t op2) + /// svint8_t svqsubr[_s8]_x(svbool_t pg, svint8_t op1, svint8_t op2) + /// svint8_t svqsubr[_s8]_z(svbool_t pg, svint8_t op1, svint8_t op2) + /// SQSUBR Ztied1.B, Pg/M, Ztied1.B, Zop2.B + /// SQSUBR Ztied1.B, Pg/M, Ztied1.B, Zop2.B + /// SQSUB Ztied2.B, Pg/M, Ztied2.B, Zop1.B + /// SQSUB Zresult.B, Zop2.B, Zop1.B + /// + public static Vector SubtractSaturateReversed(Vector left, Vector right) => SubtractSaturateReversed(left, right); + + /// + /// svuint16_t svqsubr[_u16]_m(svbool_t pg, svuint16_t op1, svuint16_t op2) + /// svuint16_t svqsubr[_u16]_x(svbool_t pg, svuint16_t op1, svuint16_t op2) + /// svuint16_t svqsubr[_u16]_z(svbool_t pg, svuint16_t op1, svuint16_t op2) + /// UQSUBR Ztied1.H, Pg/M, Ztied1.H, Zop2.H + /// UQSUBR Ztied1.H, Pg/M, Ztied1.H, Zop2.H + /// UQSUB Ztied2.H, Pg/M, Ztied2.H, Zop1.H + /// UQSUB Zresult.H, Zop2.H, Zop1.H + /// + public static Vector SubtractSaturateReversed(Vector left, Vector right) => SubtractSaturateReversed(left, right); + + /// + /// svuint32_t svqsubr[_u32]_m(svbool_t pg, svuint32_t op1, svuint32_t op2) + /// svuint32_t svqsubr[_u32]_x(svbool_t pg, svuint32_t op1, svuint32_t op2) + /// svuint32_t svqsubr[_u32]_z(svbool_t pg, svuint32_t op1, svuint32_t op2) + /// UQSUBR Ztied1.S, Pg/M, Ztied1.S, Zop2.S + /// UQSUBR Ztied1.S, Pg/M, Ztied1.S, Zop2.S + /// UQSUB Ztied2.S, Pg/M, Ztied2.S, Zop1.S + /// UQSUB Zresult.S, Zop2.S, Zop1.S + /// + public static Vector SubtractSaturateReversed(Vector left, Vector right) => SubtractSaturateReversed(left, right); + + /// + /// svuint64_t svqsubr[_u64]_m(svbool_t pg, svuint64_t op1, svuint64_t op2) + /// svuint64_t svqsubr[_u64]_x(svbool_t pg, svuint64_t op1, svuint64_t op2) + /// svuint64_t svqsubr[_u64]_z(svbool_t pg, svuint64_t op1, svuint64_t op2) + /// UQSUBR Ztied1.D, Pg/M, Ztied1.D, Zop2.D + /// UQSUBR Ztied1.D, Pg/M, Ztied1.D, Zop2.D + /// UQSUB Ztied2.D, Pg/M, Ztied2.D, Zop1.D + /// UQSUB Zresult.D, Zop2.D, Zop1.D + /// + public static Vector SubtractSaturateReversed(Vector left, Vector right) => SubtractSaturateReversed(left, right); + + + // Subtract wide (bottom) + + /// + /// svint16_t svsubwb[_s16](svint16_t op1, svint8_t op2) + /// SSUBWB Zresult.H, Zop1.H, Zop2.B + /// + public static Vector SubtractWideningEven(Vector left, Vector right) => SubtractWideningEven(left, right); + + /// + /// svint32_t svsubwb[_s32](svint32_t op1, svint16_t op2) + /// SSUBWB Zresult.S, Zop1.S, Zop2.H + /// + public static Vector SubtractWideningEven(Vector left, Vector right) => SubtractWideningEven(left, right); + + /// + /// svint64_t svsubwb[_s64](svint64_t op1, svint32_t op2) + /// SSUBWB Zresult.D, Zop1.D, Zop2.S + /// + public static Vector SubtractWideningEven(Vector left, Vector right) => SubtractWideningEven(left, right); + + /// + /// svuint16_t svsubwb[_u16](svuint16_t op1, svuint8_t op2) + /// USUBWB Zresult.H, Zop1.H, Zop2.B + /// + public static Vector SubtractWideningEven(Vector left, Vector right) => SubtractWideningEven(left, right); + + /// + /// svuint32_t svsubwb[_u32](svuint32_t op1, svuint16_t op2) + /// USUBWB Zresult.S, Zop1.S, Zop2.H + /// + public static Vector SubtractWideningEven(Vector left, Vector right) => SubtractWideningEven(left, right); + + /// + /// svuint64_t svsubwb[_u64](svuint64_t op1, svuint32_t op2) + /// USUBWB Zresult.D, Zop1.D, Zop2.S + /// + public static Vector SubtractWideningEven(Vector left, Vector right) => SubtractWideningEven(left, right); + + + // Subtract long (bottom) + + /// + /// svint16_t svsublb[_s16](svint8_t op1, svint8_t op2) + /// SSUBLB Zresult.H, Zop1.B, Zop2.B + /// + public static Vector SubtractWideningEven(Vector left, Vector right) => SubtractWideningEven(left, right); + + /// + /// svint32_t svsublb[_s32](svint16_t op1, svint16_t op2) + /// SSUBLB Zresult.S, Zop1.H, Zop2.H + /// + public static Vector SubtractWideningEven(Vector left, Vector right) => SubtractWideningEven(left, right); + + /// + /// svint64_t svsublb[_s64](svint32_t op1, svint32_t op2) + /// SSUBLB Zresult.D, Zop1.S, Zop2.S + /// + public static Vector SubtractWideningEven(Vector left, Vector right) => SubtractWideningEven(left, right); + + /// + /// svuint16_t svsublb[_u16](svuint8_t op1, svuint8_t op2) + /// USUBLB Zresult.H, Zop1.B, Zop2.B + /// + public static Vector SubtractWideningEven(Vector left, Vector right) => SubtractWideningEven(left, right); + + /// + /// svuint32_t svsublb[_u32](svuint16_t op1, svuint16_t op2) + /// USUBLB Zresult.S, Zop1.H, Zop2.H + /// + public static Vector SubtractWideningEven(Vector left, Vector right) => SubtractWideningEven(left, right); + + /// + /// svuint64_t svsublb[_u64](svuint32_t op1, svuint32_t op2) + /// USUBLB Zresult.D, Zop1.S, Zop2.S + /// + public static Vector SubtractWideningEven(Vector left, Vector right) => SubtractWideningEven(left, right); + + + // Subtract long (bottom - top) + + /// + /// svint16_t svsublbt[_s16](svint8_t op1, svint8_t op2) + /// SSUBLBT Zresult.H, Zop1.B, Zop2.B + /// + public static Vector SubtractWideningEvenOdd(Vector left, Vector right) => SubtractWideningEvenOdd(left, right); + + /// + /// svint32_t svsublbt[_s32](svint16_t op1, svint16_t op2) + /// SSUBLBT Zresult.S, Zop1.H, Zop2.H + /// + public static Vector SubtractWideningEvenOdd(Vector left, Vector right) => SubtractWideningEvenOdd(left, right); + + /// + /// svint64_t svsublbt[_s64](svint32_t op1, svint32_t op2) + /// SSUBLBT Zresult.D, Zop1.S, Zop2.S + /// + public static Vector SubtractWideningEvenOdd(Vector left, Vector right) => SubtractWideningEvenOdd(left, right); + + + // Subtract wide (top) + + /// + /// svint16_t svsubwt[_s16](svint16_t op1, svint8_t op2) + /// SSUBWT Zresult.H, Zop1.H, Zop2.B + /// + public static Vector SubtractWideningOdd(Vector left, Vector right) => SubtractWideningOdd(left, right); + + /// + /// svint32_t svsubwt[_s32](svint32_t op1, svint16_t op2) + /// SSUBWT Zresult.S, Zop1.S, Zop2.H + /// + public static Vector SubtractWideningOdd(Vector left, Vector right) => SubtractWideningOdd(left, right); + + /// + /// svint64_t svsubwt[_s64](svint64_t op1, svint32_t op2) + /// SSUBWT Zresult.D, Zop1.D, Zop2.S + /// + public static Vector SubtractWideningOdd(Vector left, Vector right) => SubtractWideningOdd(left, right); + + /// + /// svuint16_t svsubwt[_u16](svuint16_t op1, svuint8_t op2) + /// USUBWT Zresult.H, Zop1.H, Zop2.B + /// + public static Vector SubtractWideningOdd(Vector left, Vector right) => SubtractWideningOdd(left, right); + + /// + /// svuint32_t svsubwt[_u32](svuint32_t op1, svuint16_t op2) + /// USUBWT Zresult.S, Zop1.S, Zop2.H + /// + public static Vector SubtractWideningOdd(Vector left, Vector right) => SubtractWideningOdd(left, right); + + /// + /// svuint64_t svsubwt[_u64](svuint64_t op1, svuint32_t op2) + /// USUBWT Zresult.D, Zop1.D, Zop2.S + /// + public static Vector SubtractWideningOdd(Vector left, Vector right) => SubtractWideningOdd(left, right); + + + // Subtract long (top) + + /// + /// svint16_t svsublt[_s16](svint8_t op1, svint8_t op2) + /// SSUBLT Zresult.H, Zop1.B, Zop2.B + /// + public static Vector SubtractWideningOdd(Vector left, Vector right) => SubtractWideningOdd(left, right); + + /// + /// svint32_t svsublt[_s32](svint16_t op1, svint16_t op2) + /// SSUBLT Zresult.S, Zop1.H, Zop2.H + /// + public static Vector SubtractWideningOdd(Vector left, Vector right) => SubtractWideningOdd(left, right); + + /// + /// svint64_t svsublt[_s64](svint32_t op1, svint32_t op2) + /// SSUBLT Zresult.D, Zop1.S, Zop2.S + /// + public static Vector SubtractWideningOdd(Vector left, Vector right) => SubtractWideningOdd(left, right); + + /// + /// svuint16_t svsublt[_u16](svuint8_t op1, svuint8_t op2) + /// USUBLT Zresult.H, Zop1.B, Zop2.B + /// + public static Vector SubtractWideningOdd(Vector left, Vector right) => SubtractWideningOdd(left, right); + + /// + /// svuint32_t svsublt[_u32](svuint16_t op1, svuint16_t op2) + /// USUBLT Zresult.S, Zop1.H, Zop2.H + /// + public static Vector SubtractWideningOdd(Vector left, Vector right) => SubtractWideningOdd(left, right); + + /// + /// svuint64_t svsublt[_u64](svuint32_t op1, svuint32_t op2) + /// USUBLT Zresult.D, Zop1.S, Zop2.S + /// + public static Vector SubtractWideningOdd(Vector left, Vector right) => SubtractWideningOdd(left, right); + + + // Subtract long (top - bottom) + + /// + /// svint16_t svsubltb[_s16](svint8_t op1, svint8_t op2) + /// SSUBLTB Zresult.H, Zop1.B, Zop2.B + /// + public static Vector SubtractWideningOddEven(Vector left, Vector right) => SubtractWideningOddEven(left, right); + + /// + /// svint32_t svsubltb[_s32](svint16_t op1, svint16_t op2) + /// SSUBLTB Zresult.S, Zop1.H, Zop2.H + /// + public static Vector SubtractWideningOddEven(Vector left, Vector right) => SubtractWideningOddEven(left, right); + + /// + /// svint64_t svsubltb[_s64](svint32_t op1, svint32_t op2) + /// SSUBLTB Zresult.D, Zop1.S, Zop2.S + /// + public static Vector SubtractWideningOddEven(Vector left, Vector right) => SubtractWideningOddEven(left, right); + + + // Subtract with borrow long (bottom) + + /// + /// svuint32_t svsbclb[_u32](svuint32_t op1, svuint32_t op2, svuint32_t op3) + /// SBCLB Ztied1.S, Zop2.S, Zop3.S + /// + public static Vector SubtractWithBorrowWideningLower(Vector op1, Vector op2, Vector op3) => SubtractWithBorrowWideningLower(op1, op2, op3); + + /// + /// svuint64_t svsbclb[_u64](svuint64_t op1, svuint64_t op2, svuint64_t op3) + /// SBCLB Ztied1.D, Zop2.D, Zop3.D + /// + public static Vector SubtractWithBorrowWideningLower(Vector op1, Vector op2, Vector op3) => SubtractWithBorrowWideningLower(op1, op2, op3); + + + // Subtract with borrow long (top) + + /// + /// svuint32_t svsbclt[_u32](svuint32_t op1, svuint32_t op2, svuint32_t op3) + /// SBCLT Ztied1.S, Zop2.S, Zop3.S + /// + public static Vector SubtractWithBorrowWideningUpper(Vector op1, Vector op2, Vector op3) => SubtractWithBorrowWideningUpper(op1, op2, op3); + + /// + /// svuint64_t svsbclt[_u64](svuint64_t op1, svuint64_t op2, svuint64_t op3) + /// SBCLT Ztied1.D, Zop2.D, Zop3.D + /// + public static Vector SubtractWithBorrowWideningUpper(Vector op1, Vector op2, Vector op3) => SubtractWithBorrowWideningUpper(op1, op2, op3); + + // Bit vector table lookups /// 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 9748a2d6cafe29..51abff0c198192 100644 --- a/src/libraries/System.Runtime.Intrinsics/ref/System.Runtime.Intrinsics.cs +++ b/src/libraries/System.Runtime.Intrinsics/ref/System.Runtime.Intrinsics.cs @@ -6409,7 +6409,69 @@ internal Arm64() { } public static System.Numerics.Vector ShiftRightLogicalRoundedNarrowingSaturateOdd(System.Numerics.Vector even, System.Numerics.Vector value, [ConstantExpected] byte count) { throw null; } public static System.Numerics.Vector ShiftRightLogicalRoundedNarrowingSaturateOdd(System.Numerics.Vector even, System.Numerics.Vector value, [ConstantExpected] byte count) { throw null; } public static System.Numerics.Vector ShiftRightLogicalRoundedNarrowingSaturateOdd(System.Numerics.Vector even, System.Numerics.Vector value, [ConstantExpected] byte count) { throw null; } - public static System.Numerics.Vector VectorTableLookup((System.Numerics.Vector data1, System.Numerics.Vector data2) table, System.Numerics.Vector indices) { throw null; } + public static System.Numerics.Vector SubtractHighNarrowingEven(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector SubtractHighNarrowingEven(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector SubtractHighNarrowingEven(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector SubtractHighNarrowingEven(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector SubtractHighNarrowingEven(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector SubtractHighNarrowingEven(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector SubtractHighNarrowingOdd(System.Numerics.Vector even, System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector SubtractHighNarrowingOdd(System.Numerics.Vector even, System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector SubtractHighNarrowingOdd(System.Numerics.Vector even, System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector SubtractHighNarrowingOdd(System.Numerics.Vector even, System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector SubtractHighNarrowingOdd(System.Numerics.Vector even, System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector SubtractHighNarrowingOdd(System.Numerics.Vector even, System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector SubtractSaturateReversed(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector SubtractSaturateReversed(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector SubtractSaturateReversed(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector SubtractSaturateReversed(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector SubtractSaturateReversed(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector SubtractSaturateReversed(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector SubtractSaturateReversed(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector SubtractSaturateReversed(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static new System.Numerics.Vector SubtractSaturate(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static new System.Numerics.Vector SubtractSaturate(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static new System.Numerics.Vector SubtractSaturate(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static new System.Numerics.Vector SubtractSaturate(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static new System.Numerics.Vector SubtractSaturate(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static new System.Numerics.Vector SubtractSaturate(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static new System.Numerics.Vector SubtractSaturate(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static new System.Numerics.Vector SubtractSaturate(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector SubtractWideningEven(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector SubtractWideningEven(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector SubtractWideningEven(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector SubtractWideningEven(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector SubtractWideningEven(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector SubtractWideningEven(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector SubtractWideningEven(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector SubtractWideningEven(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector SubtractWideningEven(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector SubtractWideningEven(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector SubtractWideningEven(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector SubtractWideningEven(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector SubtractWideningEvenOdd(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector SubtractWideningEvenOdd(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector SubtractWideningEvenOdd(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector SubtractWideningOdd(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector SubtractWideningOdd(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector SubtractWideningOdd(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector SubtractWideningOdd(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector SubtractWideningOdd(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector SubtractWideningOdd(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector SubtractWideningOdd(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector SubtractWideningOdd(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector SubtractWideningOdd(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector SubtractWideningOdd(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector SubtractWideningOdd(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector SubtractWideningOdd(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector SubtractWideningOddEven(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector SubtractWideningOddEven(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector SubtractWideningOddEven(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector SubtractWithBorrowWideningLower(System.Numerics.Vector op1, System.Numerics.Vector op2, System.Numerics.Vector op3) { throw null; } + public static System.Numerics.Vector SubtractWithBorrowWideningLower(System.Numerics.Vector op1, System.Numerics.Vector op2, System.Numerics.Vector op3) { throw null; } + public static System.Numerics.Vector SubtractWithBorrowWideningUpper(System.Numerics.Vector op1, System.Numerics.Vector op2, System.Numerics.Vector op3) { throw null; } + public static System.Numerics.Vector SubtractWithBorrowWideningUpper(System.Numerics.Vector op1, System.Numerics.Vector op2, System.Numerics.Vector op3) { throw null; } + public static System.Numerics.Vector VectorTableLookup((System.Numerics.Vector data1, System.Numerics.Vector data2) table, System.Numerics.Vector indices) { throw null; } public static System.Numerics.Vector VectorTableLookup((System.Numerics.Vector data1, System.Numerics.Vector data2) table, System.Numerics.Vector indices) { throw null; } public static System.Numerics.Vector VectorTableLookup((System.Numerics.Vector data1, System.Numerics.Vector data2) table, System.Numerics.Vector indices) { throw null; } public static System.Numerics.Vector VectorTableLookup((System.Numerics.Vector data1, System.Numerics.Vector data2) table, System.Numerics.Vector indices) { throw null; } diff --git a/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs b/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs index 004306beddbd83..1dcde7f26556e2 100644 --- a/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs +++ b/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs @@ -5165,6 +5165,79 @@ ("SveVecImmBinOpTest.template",new Dictionary {["TestName"] = "Sve2_ShiftRightLogicalRoundedNarrowingSaturateOdd_ushort_uint", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "ShiftRightLogicalRoundedNarrowingSaturateOdd", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt32", ["Op3BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["NextValueMask"] = "Helpers.getMaskUInt32()", ["Imm"] = "13", ["InvalidImm"] = "17", ["ValidateIterResult"] = "result[i] != Helpers.ShiftRightLogicalRoundedNarrowingSaturateOdd(firstOp[i], secondOp[Helpers.NarrowIdx(i)], Imm, i)", ["GetIterResult"] = "Helpers.ShiftRightLogicalRoundedNarrowingSaturateOdd(firstOp[i], secondOp[Helpers.NarrowIdx(i)], Imm, i)",}), ("SveVecImmBinOpTest.template",new Dictionary {["TestName"] = "Sve2_ShiftRightLogicalRoundedNarrowingSaturateOdd_uint_ulong", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "ShiftRightLogicalRoundedNarrowingSaturateOdd", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt64", ["Op3BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()", ["NextValueMask"] = "Helpers.getMaskUInt64()", ["Imm"] = "28", ["InvalidImm"] = "33", ["ValidateIterResult"] = "result[i] != Helpers.ShiftRightLogicalRoundedNarrowingSaturateOdd(firstOp[i], secondOp[Helpers.NarrowIdx(i)], Imm, i)", ["GetIterResult"] = "Helpers.ShiftRightLogicalRoundedNarrowingSaturateOdd(firstOp[i], secondOp[Helpers.NarrowIdx(i)], Imm, i)",}), + ("SveVecBinOpDifferentRetType.template", new Dictionary { ["TestName"] = "Sve2_SubtractHighNarrowingEven_sbyte_short", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "SubtractHighNarrowingEven", ["RetVectorType"] = "Vector", ["RetBaseType"] = "SByte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["ValidateIterResult"] = "Helpers.SubtractHighNarrowingEven(left, right, i) != result[i]", ["GetIterResult"] = "Helpers.SubtractHighNarrowingEven(left, right, i)"}), + ("SveVecBinOpDifferentRetType.template", new Dictionary { ["TestName"] = "Sve2_SubtractHighNarrowingEven_short_int", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "SubtractHighNarrowingEven", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["ValidateIterResult"] = "Helpers.SubtractHighNarrowingEven(left, right, i) != result[i]", ["GetIterResult"] = "Helpers.SubtractHighNarrowingEven(left, right, i)"}), + ("SveVecBinOpDifferentRetType.template", new Dictionary { ["TestName"] = "Sve2_SubtractHighNarrowingEven_int_long", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "SubtractHighNarrowingEven", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()", ["ValidateIterResult"] = "Helpers.SubtractHighNarrowingEven(left, right, i) != result[i]", ["GetIterResult"] = "Helpers.SubtractHighNarrowingEven(left, right, i)"}), + ("SveVecBinOpDifferentRetType.template", new Dictionary { ["TestName"] = "Sve2_SubtractHighNarrowingEven_byte_ushort", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "SubtractHighNarrowingEven", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Byte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt16()", ["ValidateIterResult"] = "Helpers.SubtractHighNarrowingEven(left, right, i) != result[i]", ["GetIterResult"] = "Helpers.SubtractHighNarrowingEven(left, right, i)"}), + ("SveVecBinOpDifferentRetType.template", new Dictionary { ["TestName"] = "Sve2_SubtractHighNarrowingEven_ushort_uint", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "SubtractHighNarrowingEven", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["ValidateIterResult"] = "Helpers.SubtractHighNarrowingEven(left, right, i) != result[i]", ["GetIterResult"] = "Helpers.SubtractHighNarrowingEven(left, right, i)"}), + ("SveVecBinOpDifferentRetType.template", new Dictionary { ["TestName"] = "Sve2_SubtractHighNarrowingEven_uint_ulong", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "SubtractHighNarrowingEven", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()", ["ValidateIterResult"] = "Helpers.SubtractHighNarrowingEven(left, right, i) != result[i]", ["GetIterResult"] = "Helpers.SubtractHighNarrowingEven(left, right, i)"}), + + ("SveVecTernOpFirstArgTest.template", new Dictionary { ["TestName"] = "Sve2_SubtractHighNarrowingOdd_sbyte_short", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "SubtractHighNarrowingOdd", ["RetVectorType"] = "Vector", ["RetBaseType"] = "SByte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "SByte", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.SubtractHighNarrowingOdd(first, second, third, i) != result[i]", ["GetIterResult"] = "Helpers.SubtractHighNarrowingOdd(first, second, third, i)"}), + ("SveVecTernOpFirstArgTest.template", new Dictionary { ["TestName"] = "Sve2_SubtractHighNarrowingOdd_short_int", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "SubtractHighNarrowingOdd", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int32", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.SubtractHighNarrowingOdd(first, second, third, i) != result[i]", ["GetIterResult"] = "Helpers.SubtractHighNarrowingOdd(first, second, third, i)"}), + ("SveVecTernOpFirstArgTest.template", new Dictionary { ["TestName"] = "Sve2_SubtractHighNarrowingOdd_int_long", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "SubtractHighNarrowingOdd", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int64", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt64()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.SubtractHighNarrowingOdd(first, second, third, i) != result[i]", ["GetIterResult"] = "Helpers.SubtractHighNarrowingOdd(first, second, third, i)"}), + ("SveVecTernOpFirstArgTest.template", new Dictionary { ["TestName"] = "Sve2_SubtractHighNarrowingOdd_byte_ushort", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "SubtractHighNarrowingOdd", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Byte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Byte", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "UInt16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetUInt16()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.SubtractHighNarrowingOdd(first, second, third, i) != result[i]", ["GetIterResult"] = "Helpers.SubtractHighNarrowingOdd(first, second, third, i)"}), + ("SveVecTernOpFirstArgTest.template", new Dictionary { ["TestName"] = "Sve2_SubtractHighNarrowingOdd_ushort_uint", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "SubtractHighNarrowingOdd", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt32", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp3"] = "TestLibrary.Generator.GetUInt32()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.SubtractHighNarrowingOdd(first, second, third, i) != result[i]", ["GetIterResult"] = "Helpers.SubtractHighNarrowingOdd(first, second, third, i)"}), + ("SveVecTernOpFirstArgTest.template", new Dictionary { ["TestName"] = "Sve2_SubtractHighNarrowingOdd_uint_ulong", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "SubtractHighNarrowingOdd", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt64", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "UInt64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()", ["NextValueOp3"] = "TestLibrary.Generator.GetUInt64()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.SubtractHighNarrowingOdd(first, second, third, i) != result[i]", ["GetIterResult"] = "Helpers.SubtractHighNarrowingOdd(first, second, third, i)"}), + + ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve2_SubtractSaturate_sbyte", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "SubtractSaturate", ["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.SubtractSaturate(left[i], right[i]) != result[i]", ["GetIterResult"] = "Helpers.SubtractSaturate(left[i], right[i])"}), + ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve2_SubtractSaturate_short", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "SubtractSaturate", ["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.SubtractSaturate(left[i], right[i]) != result[i]", ["GetIterResult"] = "Helpers.SubtractSaturate(left[i], right[i])"}), + ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve2_SubtractSaturate_int", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "SubtractSaturate", ["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.SubtractSaturate(left[i], right[i]) != result[i]", ["GetIterResult"] = "Helpers.SubtractSaturate(left[i], right[i])"}), + ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve2_SubtractSaturate_long", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "SubtractSaturate", ["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.SubtractSaturate(left[i], right[i]) != result[i]", ["GetIterResult"] = "Helpers.SubtractSaturate(left[i], right[i])"}), + ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve2_SubtractSaturate_byte", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "SubtractSaturate", ["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.SubtractSaturate(left[i], right[i]) != result[i]", ["GetIterResult"] = "Helpers.SubtractSaturate(left[i], right[i])"}), + ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve2_SubtractSaturate_ushort", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "SubtractSaturate", ["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.SubtractSaturate(left[i], right[i]) != result[i]", ["GetIterResult"] = "Helpers.SubtractSaturate(left[i], right[i])"}), + ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve2_SubtractSaturate_uint", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "SubtractSaturate", ["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.SubtractSaturate(left[i], right[i]) != result[i]", ["GetIterResult"] = "Helpers.SubtractSaturate(left[i], right[i])"}), + ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve2_SubtractSaturate_ulong", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "SubtractSaturate", ["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.SubtractSaturate(left[i], right[i]) != result[i]", ["GetIterResult"] = "Helpers.SubtractSaturate(left[i], right[i])"}), + + ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve2_SubtractSaturateReversed_sbyte", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "SubtractSaturateReversed", ["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.SubtractSaturate(right[i], left[i]) != result[i]", ["GetIterResult"] = "Helpers.SubtractSaturate(right[i], left[i])"}), + ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve2_SubtractSaturateReversed_short", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "SubtractSaturateReversed", ["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.SubtractSaturate(right[i], left[i]) != result[i]", ["GetIterResult"] = "Helpers.SubtractSaturate(right[i], left[i])"}), + ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve2_SubtractSaturateReversed_int", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "SubtractSaturateReversed", ["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.SubtractSaturate(right[i], left[i]) != result[i]", ["GetIterResult"] = "Helpers.SubtractSaturate(right[i], left[i])"}), + ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve2_SubtractSaturateReversed_long", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "SubtractSaturateReversed", ["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.SubtractSaturate(right[i], left[i]) != result[i]", ["GetIterResult"] = "Helpers.SubtractSaturate(right[i], left[i])"}), + ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve2_SubtractSaturateReversed_byte", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "SubtractSaturateReversed", ["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.SubtractSaturate(right[i], left[i]) != result[i]", ["GetIterResult"] = "Helpers.SubtractSaturate(right[i], left[i])"}), + ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve2_SubtractSaturateReversed_ushort", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "SubtractSaturateReversed", ["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.SubtractSaturate(right[i], left[i]) != result[i]", ["GetIterResult"] = "Helpers.SubtractSaturate(right[i], left[i])"}), + ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve2_SubtractSaturateReversed_uint", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "SubtractSaturateReversed", ["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.SubtractSaturate(right[i], left[i]) != result[i]", ["GetIterResult"] = "Helpers.SubtractSaturate(right[i], left[i])"}), + ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve2_SubtractSaturateReversed_ulong", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "SubtractSaturateReversed", ["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.SubtractSaturate(right[i], left[i]) != result[i]", ["GetIterResult"] = "Helpers.SubtractSaturate(right[i], left[i])"}), + + ("SveVecBinOpDifferentRetType.template", new Dictionary { ["TestName"] = "Sve2_SubtractWideningEven_short_short_sbyte", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "SubtractWideningEven", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.SubtractWidening(left[i], right[i * 2]) != result[i]", ["GetIterResult"] = "Helpers.SubtractWidening(left[i], right[i * 2])"}), + ("SveVecBinOpDifferentRetType.template", new Dictionary { ["TestName"] = "Sve2_SubtractWideningEven_int_int_short", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "SubtractWideningEven", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.SubtractWidening(left[i], right[i * 2]) != result[i]", ["GetIterResult"] = "Helpers.SubtractWidening(left[i], right[i * 2])"}), + ("SveVecBinOpDifferentRetType.template", new Dictionary { ["TestName"] = "Sve2_SubtractWideningEven_long_long_int", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "SubtractWideningEven", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.SubtractWidening(left[i], right[i * 2]) != result[i]", ["GetIterResult"] = "Helpers.SubtractWidening(left[i], right[i * 2])"}), + ("SveVecBinOpDifferentRetType.template", new Dictionary { ["TestName"] = "Sve2_SubtractWideningEven_ushort_ushort_byte", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "SubtractWideningEven", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetByte()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.SubtractWidening(left[i], right[i * 2]) != result[i]", ["GetIterResult"] = "Helpers.SubtractWidening(left[i], right[i * 2])"}), + ("SveVecBinOpDifferentRetType.template", new Dictionary { ["TestName"] = "Sve2_SubtractWideningEven_uint_uint_ushort", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "SubtractWideningEven", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt16()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.SubtractWidening(left[i], right[i * 2]) != result[i]", ["GetIterResult"] = "Helpers.SubtractWidening(left[i], right[i * 2])"}), + ("SveVecBinOpDifferentRetType.template", new Dictionary { ["TestName"] = "Sve2_SubtractWideningEven_ulong_ulong_uint", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "SubtractWideningEven", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.SubtractWidening(left[i], right[i * 2]) != result[i]", ["GetIterResult"] = "Helpers.SubtractWidening(left[i], right[i * 2])"}), + + ("SveVecBinOpDifferentRetType.template", new Dictionary { ["TestName"] = "Sve2_SubtractWideningEven_short_sbyte_sbyte", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "SubtractWideningEven", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "SByte", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.SubtractWidening(left[i * 2], right[i * 2]) != result[i]", ["GetIterResult"] = "Helpers.SubtractWidening(left[i * 2], right[i * 2])"}), + ("SveVecBinOpDifferentRetType.template", new Dictionary { ["TestName"] = "Sve2_SubtractWideningEven_int_short_short", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "SubtractWideningEven", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.SubtractWidening(left[i * 2], right[i * 2]) != result[i]", ["GetIterResult"] = "Helpers.SubtractWidening(left[i * 2], right[i * 2])"}), + ("SveVecBinOpDifferentRetType.template", new Dictionary { ["TestName"] = "Sve2_SubtractWideningEven_long_int_int", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "SubtractWideningEven", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.SubtractWidening(left[i * 2], right[i * 2]) != result[i]", ["GetIterResult"] = "Helpers.SubtractWidening(left[i * 2], right[i * 2])"}), + ("SveVecBinOpDifferentRetType.template", new Dictionary { ["TestName"] = "Sve2_SubtractWideningEven_ushort_byte_byte", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "SubtractWideningEven", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Byte", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetByte()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.SubtractWidening(left[i * 2], right[i * 2]) != result[i]", ["GetIterResult"] = "Helpers.SubtractWidening(left[i * 2], right[i * 2])"}), + ("SveVecBinOpDifferentRetType.template", new Dictionary { ["TestName"] = "Sve2_SubtractWideningEven_uint_ushort_ushort", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "SubtractWideningEven", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt16()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.SubtractWidening(left[i * 2], right[i * 2]) != result[i]", ["GetIterResult"] = "Helpers.SubtractWidening(left[i * 2], right[i * 2])"}), + ("SveVecBinOpDifferentRetType.template", new Dictionary { ["TestName"] = "Sve2_SubtractWideningEven_ulong_uint_uint", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "SubtractWideningEven", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.SubtractWidening(left[i * 2], right[i * 2]) != result[i]", ["GetIterResult"] = "Helpers.SubtractWidening(left[i * 2], right[i * 2])"}), + + ("SveVecBinOpDifferentRetType.template", new Dictionary { ["TestName"] = "Sve2_SubtractWideningEvenOdd_short_sbyte", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "SubtractWideningEvenOdd", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "SByte", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.SubtractWidening(left[i * 2], right[i * 2 + 1]) != result[i]", ["GetIterResult"] = "Helpers.SubtractWidening(left[i * 2], right[i * 2 + 1])"}), + ("SveVecBinOpDifferentRetType.template", new Dictionary { ["TestName"] = "Sve2_SubtractWideningEvenOdd_int_short", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "SubtractWideningEvenOdd", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.SubtractWidening(left[i * 2], right[i * 2 + 1]) != result[i]", ["GetIterResult"] = "Helpers.SubtractWidening(left[i * 2], right[i * 2 + 1])"}), + ("SveVecBinOpDifferentRetType.template", new Dictionary { ["TestName"] = "Sve2_SubtractWideningEvenOdd_long_int", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "SubtractWideningEvenOdd", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.SubtractWidening(left[i * 2], right[i * 2 + 1]) != result[i]", ["GetIterResult"] = "Helpers.SubtractWidening(left[i * 2], right[i * 2 + 1])"}), + + ("SveVecBinOpDifferentRetType.template", new Dictionary { ["TestName"] = "Sve2_SubtractWideningOdd_short_short_sbyte", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "SubtractWideningOdd", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.SubtractWidening(left[i], right[i * 2 + 1]) != result[i]", ["GetIterResult"] = "Helpers.SubtractWidening(left[i], right[i * 2 + 1])"}), + ("SveVecBinOpDifferentRetType.template", new Dictionary { ["TestName"] = "Sve2_SubtractWideningOdd_int_int_short", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "SubtractWideningOdd", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.SubtractWidening(left[i], right[i * 2 + 1]) != result[i]", ["GetIterResult"] = "Helpers.SubtractWidening(left[i], right[i * 2 + 1])"}), + ("SveVecBinOpDifferentRetType.template", new Dictionary { ["TestName"] = "Sve2_SubtractWideningOdd_long_long_int", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "SubtractWideningOdd", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.SubtractWidening(left[i], right[i * 2 + 1]) != result[i]", ["GetIterResult"] = "Helpers.SubtractWidening(left[i], right[i * 2 + 1])"}), + ("SveVecBinOpDifferentRetType.template", new Dictionary { ["TestName"] = "Sve2_SubtractWideningOdd_ushort_ushort_byte", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "SubtractWideningOdd", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetByte()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.SubtractWidening(left[i], right[i * 2 + 1]) != result[i]", ["GetIterResult"] = "Helpers.SubtractWidening(left[i], right[i * 2 + 1])"}), + ("SveVecBinOpDifferentRetType.template", new Dictionary { ["TestName"] = "Sve2_SubtractWideningOdd_uint_uint_ushort", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "SubtractWideningOdd", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt16()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.SubtractWidening(left[i], right[i * 2 + 1]) != result[i]", ["GetIterResult"] = "Helpers.SubtractWidening(left[i], right[i * 2 + 1])"}), + ("SveVecBinOpDifferentRetType.template", new Dictionary { ["TestName"] = "Sve2_SubtractWideningOdd_ulong_ulong_uint", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "SubtractWideningOdd", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.SubtractWidening(left[i], right[i * 2 + 1]) != result[i]", ["GetIterResult"] = "Helpers.SubtractWidening(left[i], right[i * 2 + 1])"}), + + ("SveVecBinOpDifferentRetType.template", new Dictionary { ["TestName"] = "Sve2_SubtractWideningOdd_short_sbyte_sbyte", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "SubtractWideningOdd", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "SByte", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.SubtractWidening(left[i * 2 + 1], right[i * 2 + 1]) != result[i]", ["GetIterResult"] = "Helpers.SubtractWidening(left[i * 2 + 1], right[i * 2 + 1])"}), + ("SveVecBinOpDifferentRetType.template", new Dictionary { ["TestName"] = "Sve2_SubtractWideningOdd_int_short_short", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "SubtractWideningOdd", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.SubtractWidening(left[i * 2 + 1], right[i * 2 + 1]) != result[i]", ["GetIterResult"] = "Helpers.SubtractWidening(left[i * 2 + 1], right[i * 2 + 1])"}), + ("SveVecBinOpDifferentRetType.template", new Dictionary { ["TestName"] = "Sve2_SubtractWideningOdd_long_int_int", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "SubtractWideningOdd", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.SubtractWidening(left[i * 2 + 1], right[i * 2 + 1]) != result[i]", ["GetIterResult"] = "Helpers.SubtractWidening(left[i * 2 + 1], right[i * 2 + 1])"}), + ("SveVecBinOpDifferentRetType.template", new Dictionary { ["TestName"] = "Sve2_SubtractWideningOdd_ushort_byte_byte", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "SubtractWideningOdd", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Byte", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetByte()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.SubtractWidening(left[i * 2 + 1], right[i * 2 + 1]) != result[i]", ["GetIterResult"] = "Helpers.SubtractWidening(left[i * 2 + 1], right[i * 2 + 1])"}), + ("SveVecBinOpDifferentRetType.template", new Dictionary { ["TestName"] = "Sve2_SubtractWideningOdd_uint_ushort_ushort", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "SubtractWideningOdd", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt16()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.SubtractWidening(left[i * 2 + 1], right[i * 2 + 1]) != result[i]", ["GetIterResult"] = "Helpers.SubtractWidening(left[i * 2 + 1], right[i * 2 + 1])"}), + ("SveVecBinOpDifferentRetType.template", new Dictionary { ["TestName"] = "Sve2_SubtractWideningOdd_ulong_uint_uint", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "SubtractWideningOdd", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.SubtractWidening(left[i * 2 + 1], right[i * 2 + 1]) != result[i]", ["GetIterResult"] = "Helpers.SubtractWidening(left[i * 2 + 1], right[i * 2 + 1])"}), + + ("SveVecBinOpDifferentRetType.template", new Dictionary { ["TestName"] = "Sve2_SubtractWideningOddEven_short_sbyte", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "SubtractWideningOddEven", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "SByte", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.SubtractWidening(left[i * 2 + 1], right[i * 2]) != result[i]", ["GetIterResult"] = "Helpers.SubtractWidening(left[i * 2 + 1], right[i * 2])"}), + ("SveVecBinOpDifferentRetType.template", new Dictionary { ["TestName"] = "Sve2_SubtractWideningOddEven_int_short", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "SubtractWideningOddEven", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.SubtractWidening(left[i * 2 + 1], right[i * 2]) != result[i]", ["GetIterResult"] = "Helpers.SubtractWidening(left[i * 2 + 1], right[i * 2])"}), + ("SveVecBinOpDifferentRetType.template", new Dictionary { ["TestName"] = "Sve2_SubtractWideningOddEven_long_int", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "SubtractWideningOddEven", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.SubtractWidening(left[i * 2 + 1], right[i * 2]) != result[i]", ["GetIterResult"] = "Helpers.SubtractWidening(left[i * 2 + 1], right[i * 2])"}), + + ("SveVecTernOpVecTest.template", new Dictionary { ["TestName"] = "Sve2_SubtractWithBorrowWideningLower_uint", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "SubtractWithBorrowWideningLower", ["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()", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.SubtractWithBorrowWideningLower(firstOp, secondOp, thirdOp))", ["GetVectorResult"] = "Helpers.SubtractWithBorrowWideningLower(first, second, third)"}), + ("SveVecTernOpVecTest.template", new Dictionary { ["TestName"] = "Sve2_SubtractWithBorrowWideningLower_ulong", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "SubtractWithBorrowWideningLower", ["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()", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.SubtractWithBorrowWideningLower(firstOp, secondOp, thirdOp))", ["GetVectorResult"] = "Helpers.SubtractWithBorrowWideningLower(first, second, third)"}), + ("SveVecTernOpVecTest.template", new Dictionary { ["TestName"] = "Sve2_SubtractWithBorrowWideningUpper_uint", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "SubtractWithBorrowWideningUpper", ["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()", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.SubtractWithBorrowWideningUpper(firstOp, secondOp, thirdOp))", ["GetVectorResult"] = "Helpers.SubtractWithBorrowWideningUpper(first, second, third)"}), + ("SveVecTernOpVecTest.template", new Dictionary { ["TestName"] = "Sve2_SubtractWithBorrowWideningUpper_ulong", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "SubtractWithBorrowWideningUpper", ["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()", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.SubtractWithBorrowWideningUpper(firstOp, secondOp, thirdOp))", ["GetVectorResult"] = "Helpers.SubtractWithBorrowWideningUpper(first, second, third)"}), + ("SveVecBinOpTupleTest.template", new Dictionary { ["TestName"] = "Sve2_VectorTableLookup_byte", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "VectorTableLookup", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Byte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Byte", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetByte()", ["ValidateEntry"] = "(third[i] < (Byte) RetElementCount * 2) ? ((third[i] < (Byte) RetElementCount) ? (result[i] != first[third[i]]) : (result[i] != second[third[i]-(Byte) RetElementCount])) : (result[i] != 0)"}), ("SveVecBinOpTupleTest.template", new Dictionary { ["TestName"] = "Sve2_VectorTableLookup_ushort", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "VectorTableLookup", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt16()", ["ValidateEntry"] = "(third[i] < (UInt16) RetElementCount * 2) ? ((third[i] < (UInt16) RetElementCount) ? (result[i] != first[third[i]]) : (result[i] != second[third[i]-(UInt16) RetElementCount])) : (result[i] != 0)"}), ("SveVecBinOpTupleTest.template", new Dictionary { ["TestName"] = "Sve2_VectorTableLookup_uint", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "VectorTableLookup", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["ValidateEntry"] = "(third[i] < (UInt32) RetElementCount * 2) ? ((third[i] < (UInt32) RetElementCount) ? (result[i] != first[third[i]]) : (result[i] != second[third[i]-(UInt32) RetElementCount])) : (result[i] != 0)"}), diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Helpers.cs b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Helpers.cs index 113cf09a85a2be..1234c422959dc6 100644 --- a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Helpers.cs +++ b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Helpers.cs @@ -10919,6 +10919,170 @@ public static T[] InterleavingXorOddEven(T[] even, T[] left, T[] right) where return even; } + public static sbyte SubtractHighNarrowingEven(short[] left, short[] right, int i) + { + if (i % 2 == 0) + { + return (sbyte) ((left[i / 2] - right[i / 2]) >> 8); + } + + return 0; + } + + public static short SubtractHighNarrowingEven(int[] left, int[] right, int i) + { + if (i % 2 == 0) + { + return (short) ((left[i / 2] - right[i / 2]) >> 16); + } + + return 0; + } + + public static int SubtractHighNarrowingEven(long[] left, long[] right, int i) + { + if (i % 2 == 0) + { + return (int) ((left[i / 2] - right[i / 2]) >> 32); + } + + return 0; + } + + public static byte SubtractHighNarrowingEven(ushort[] left, ushort[] right, int i) + { + if (i % 2 == 0) + { + return (byte)((left[i / 2] - right[i / 2]) >> 8); + } + + return 0; + } + + public static ushort SubtractHighNarrowingEven(uint[] left, uint[] right, int i) + { + if (i % 2 == 0) + { + return (ushort)((left[i / 2] - right[i / 2]) >> 16); + } + + return 0; + } + + public static uint SubtractHighNarrowingEven(ulong[] left, ulong[] right, int i) + { + if (i % 2 == 0) + { + return (uint)((left[i / 2] - right[i / 2]) >> 32); + } + + return 0; + } + + public static sbyte SubtractHighNarrowingOdd(sbyte[] even, short[] left, short[] right, int i) + { + if (i % 2 == 1) + { + return (sbyte) ((left[i / 2] - right[i / 2]) >> 8); + } + + return even[i]; + } + + public static short SubtractHighNarrowingOdd(short[] even, int[] left, int[] right, int i) + { + if (i % 2 == 1) + { + return (short) ((left[i / 2] - right[i / 2]) >> 16); + } + + return even[i]; + } + + public static int SubtractHighNarrowingOdd(int[] even, long[] left, long[] right, int i) + { + if (i % 2 == 1) + { + return (int) ((left[i / 2] - right[i / 2]) >> 32); + } + + return even[i]; + } + + public static byte SubtractHighNarrowingOdd(byte[] even, ushort[] left, ushort[] right, int i) + { + if (i % 2 == 1) + { + return (byte)((left[i / 2] - right[i / 2]) >> 8); + } + + return even[i]; + } + + public static ushort SubtractHighNarrowingOdd(ushort[] even, uint[] left, uint[] right, int i) + { + if (i % 2 == 1) + { + return (ushort)((left[i / 2] - right[i / 2]) >> 16); + } + + return even[i]; + } + + public static uint SubtractHighNarrowingOdd(uint[] even, ulong[] left, ulong[] right, int i) + { + if (i % 2 == 1) + { + return (uint)((left[i / 2] - right[i / 2]) >> 32); + } + + return even[i]; + } + + public static (T sum, T carryOut) AddWithCarry(T a, T b, T carryIn) + where T : unmanaged, IBinaryInteger + { + T sum = a + b + carryIn; + T one = T.One; + T zero = T.Zero; + T carryOut = (sum < a || (sum == a && carryIn == one)) ? one : zero; + return (sum, carryOut); + } + + public static T[] SubtractWithBorrowWideningLower(T[] op1, T[] op2, T[] op3) + where T : unmanaged, IBinaryInteger + { + T[] result = new T[op1.Length]; + for (int i = 0; i < op1.Length; i += 2) + { + T a = op1[i]; + T b = ~op2[i]; + T carryIn = op3[i + 1] & T.One; + (T sum, T carryOut) = AddWithCarry(a, b, carryIn); + result[i] = sum; + result[i + 1] = carryOut; + } + + return result; + } + + public static T[] SubtractWithBorrowWideningUpper(T[] op1, T[] op2, T[] op3) + where T : unmanaged, IBinaryInteger + { + T[] result = new T[op1.Length]; + for (int i = 0; i < op1.Length; i += 2) + { + T a = op1[i]; + T b = ~op2[i+1]; + T carryIn = op3[i + 1] & T.One; + (T sum, T carryOut) = AddWithCarry(a, b, carryIn); + result[i] = sum; + result[i + 1] = carryOut; + } + + return result; + } + public static T Xor(params T[] ops) where T : IBitwiseOperators { T result = ops[0];