diff --git a/src/coreclr/jit/hwintrinsiclistarm64sve.h b/src/coreclr/jit/hwintrinsiclistarm64sve.h index 381ad84a8e47af..fe1853df4017e3 100644 --- a/src/coreclr/jit/hwintrinsiclistarm64sve.h +++ b/src/coreclr/jit/hwintrinsiclistarm64sve.h @@ -357,6 +357,8 @@ HARDWARE_INTRINSIC(Sve2, MultiplyBySelectedScalarWideningEvenAndSubtrac HARDWARE_INTRINSIC(Sve2, MultiplyBySelectedScalarWideningOdd, -1, 3, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_smullt, INS_sve_umullt, INS_sve_smullt, INS_sve_umullt, INS_invalid, INS_invalid}, HW_Category_SIMDByIndexedElement, HW_Flag_Scalable|HW_Flag_HasImmediateOperand|HW_Flag_LowVectorOperation) HARDWARE_INTRINSIC(Sve2, MultiplyBySelectedScalarWideningOddAndAdd, -1, 4, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_smlalt, INS_sve_umlalt, INS_sve_smlalt, INS_sve_umlalt, INS_invalid, INS_invalid}, HW_Category_SIMDByIndexedElement, HW_Flag_Scalable|HW_Flag_HasRMWSemantics|HW_Flag_HasImmediateOperand|HW_Flag_LowVectorOperation) HARDWARE_INTRINSIC(Sve2, MultiplyBySelectedScalarWideningOddAndSubtract, -1, 4, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_smlslt, INS_sve_umlslt, INS_sve_smlslt, INS_sve_umlslt, INS_invalid, INS_invalid}, HW_Category_SIMDByIndexedElement, HW_Flag_Scalable|HW_Flag_HasRMWSemantics|HW_Flag_HasImmediateOperand|HW_Flag_LowVectorOperation) +HARDWARE_INTRINSIC(Sve2, MultiplyDoublingBySelectedScalarSaturateHigh, -1, 3, {INS_invalid, INS_invalid, INS_sve_sqdmulh, INS_invalid, INS_sve_sqdmulh, INS_invalid, INS_sve_sqdmulh, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMDByIndexedElement, HW_Flag_Scalable|HW_Flag_HasImmediateOperand|HW_Flag_LowVectorOperation) +HARDWARE_INTRINSIC(Sve2, MultiplyDoublingSaturateHigh, -1, 2, {INS_sve_sqdmulh, INS_invalid, INS_sve_sqdmulh, INS_invalid, INS_sve_sqdmulh, INS_invalid, INS_sve_sqdmulh, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable) HARDWARE_INTRINSIC(Sve2, MultiplyDoublingWideningAndAddSaturateEven, -1, 3, {INS_invalid, INS_invalid, INS_sve_sqdmlalb, INS_invalid, INS_sve_sqdmlalb, INS_invalid, INS_sve_sqdmlalb, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_HasRMWSemantics) HARDWARE_INTRINSIC(Sve2, MultiplyDoublingWideningAndAddSaturateEvenOdd, -1, 3, {INS_invalid, INS_invalid, INS_sve_sqdmlalbt, INS_invalid, INS_sve_sqdmlalbt, INS_invalid, INS_sve_sqdmlalbt, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_HasRMWSemantics) HARDWARE_INTRINSIC(Sve2, MultiplyDoublingWideningAndAddSaturateOdd, -1, 3, {INS_invalid, INS_invalid, INS_sve_sqdmlalt, INS_invalid, INS_sve_sqdmlalt, INS_invalid, INS_sve_sqdmlalt, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_HasRMWSemantics) diff --git a/src/coreclr/jit/lsraarm64.cpp b/src/coreclr/jit/lsraarm64.cpp index ca516ad63616df..b736fe3debf27f 100644 --- a/src/coreclr/jit/lsraarm64.cpp +++ b/src/coreclr/jit/lsraarm64.cpp @@ -2185,6 +2185,7 @@ SingleTypeRegSet LinearScan::getOperandCandidates(GenTreeHWIntrinsic* intrinsicT case NI_Sve2_MultiplyBySelectedScalar: case NI_Sve2_MultiplyBySelectedScalarWideningEven: case NI_Sve2_MultiplyBySelectedScalarWideningOdd: + case NI_Sve2_MultiplyDoublingBySelectedScalarSaturateHigh: case NI_Sve2_MultiplyDoublingWideningSaturateEvenBySelectedScalar: case NI_Sve2_MultiplyDoublingWideningSaturateOddBySelectedScalar: case NI_Sve2_MultiplyRoundedDoublingBySelectedScalarSaturateHigh: 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 1b5a0e5110c9f1..2341fdebd6c5f2 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 @@ -2007,6 +2007,54 @@ internal Arm64() { } public static Vector MultiplyBySelectedScalarWideningOddAndSubtract(Vector minuend, Vector left, Vector right, [ConstantExpected] byte rightIndex) { throw new PlatformNotSupportedException(); } + // Saturating doubling multiply high with index + + /// + /// svint16_t svqdmulh_lane[_s16](svint16_t op1, svint16_t op2, uint64_t imm_index) + /// SQDMULH Zresult.H, Zop1.H, Zop2.H[imm_index] + /// + public static Vector MultiplyDoublingBySelectedScalarSaturateHigh(Vector left, Vector right, [ConstantExpected] byte rightIndex) { throw new PlatformNotSupportedException(); } + + /// + /// svint32_t svqdmulh_lane[_s32](svint32_t op1, svint32_t op2, uint64_t imm_index) + /// SQDMULH Zresult.S, Zop1.S, Zop2.S[imm_index] + /// + public static Vector MultiplyDoublingBySelectedScalarSaturateHigh(Vector left, Vector right, [ConstantExpected] byte rightIndex) { throw new PlatformNotSupportedException(); } + + /// + /// svint64_t svqdmulh_lane[_s64](svint64_t op1, svint64_t op2, uint64_t imm_index) + /// SQDMULH Zresult.D, Zop1.D, Zop2.D[imm_index] + /// + public static Vector MultiplyDoublingBySelectedScalarSaturateHigh(Vector left, Vector right, [ConstantExpected] byte rightIndex) { throw new PlatformNotSupportedException(); } + + + // Saturating doubling multiply high + + /// + /// svint8_t svqdmulh[_s8](svint8_t op1, svint8_t op2) + /// SQDMULH Zresult.B, Zop1.B, Zop2.B + /// + public static Vector MultiplyDoublingSaturateHigh(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svint16_t svqdmulh[_s16](svint16_t op1, svint16_t op2) + /// SQDMULH Zresult.H, Zop1.H, Zop2.H + /// + public static Vector MultiplyDoublingSaturateHigh(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svint32_t svqdmulh[_s32](svint32_t op1, svint32_t op2) + /// SQDMULH Zresult.S, Zop1.S, Zop2.S + /// + public static Vector MultiplyDoublingSaturateHigh(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + /// + /// svint64_t svqdmulh[_s64](svint64_t op1, svint64_t op2) + /// SQDMULH Zresult.D, Zop1.D, Zop2.D + /// + public static Vector MultiplyDoublingSaturateHigh(Vector left, Vector right) { throw new PlatformNotSupportedException(); } + + // Multiply long (bottom) /// 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 14ff8a87dd5b97..2267c002b056eb 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 @@ -2030,6 +2030,54 @@ internal Arm64() { } public static Vector MultiplyBySelectedScalarWideningOddAndSubtract(Vector minuend, Vector left, Vector right, [ConstantExpected] byte rightIndex) => MultiplyBySelectedScalarWideningOddAndSubtract(minuend, left, right, rightIndex); + // Saturating doubling multiply high with index + + /// + /// svint16_t svqdmulh_lane[_s16](svint16_t op1, svint16_t op2, uint64_t imm_index) + /// SQDMULH Zresult.H, Zop1.H, Zop2.H[imm_index] + /// + public static Vector MultiplyDoublingBySelectedScalarSaturateHigh(Vector left, Vector right, [ConstantExpected] byte rightIndex) => MultiplyDoublingBySelectedScalarSaturateHigh(left, right, rightIndex); + + /// + /// svint32_t svqdmulh_lane[_s32](svint32_t op1, svint32_t op2, uint64_t imm_index) + /// SQDMULH Zresult.S, Zop1.S, Zop2.S[imm_index] + /// + public static Vector MultiplyDoublingBySelectedScalarSaturateHigh(Vector left, Vector right, [ConstantExpected] byte rightIndex) => MultiplyDoublingBySelectedScalarSaturateHigh(left, right, rightIndex); + + /// + /// svint64_t svqdmulh_lane[_s64](svint64_t op1, svint64_t op2, uint64_t imm_index) + /// SQDMULH Zresult.D, Zop1.D, Zop2.D[imm_index] + /// + public static Vector MultiplyDoublingBySelectedScalarSaturateHigh(Vector left, Vector right, [ConstantExpected] byte rightIndex) => MultiplyDoublingBySelectedScalarSaturateHigh(left, right, rightIndex); + + + // Saturating doubling multiply high + + /// + /// svint8_t svqdmulh[_s8](svint8_t op1, svint8_t op2) + /// SQDMULH Zresult.B, Zop1.B, Zop2.B + /// + public static Vector MultiplyDoublingSaturateHigh(Vector left, Vector right) => MultiplyDoublingSaturateHigh(left, right); + + /// + /// svint16_t svqdmulh[_s16](svint16_t op1, svint16_t op2) + /// SQDMULH Zresult.H, Zop1.H, Zop2.H + /// + public static Vector MultiplyDoublingSaturateHigh(Vector left, Vector right) => MultiplyDoublingSaturateHigh(left, right); + + /// + /// svint32_t svqdmulh[_s32](svint32_t op1, svint32_t op2) + /// SQDMULH Zresult.S, Zop1.S, Zop2.S + /// + public static Vector MultiplyDoublingSaturateHigh(Vector left, Vector right) => MultiplyDoublingSaturateHigh(left, right); + + /// + /// svint64_t svqdmulh[_s64](svint64_t op1, svint64_t op2) + /// SQDMULH Zresult.D, Zop1.D, Zop2.D + /// + public static Vector MultiplyDoublingSaturateHigh(Vector left, Vector right) => MultiplyDoublingSaturateHigh(left, right); + + // Multiply long (bottom) /// 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 c144a719b07484..83e78d108bf104 100644 --- a/src/libraries/System.Runtime.Intrinsics/ref/System.Runtime.Intrinsics.cs +++ b/src/libraries/System.Runtime.Intrinsics/ref/System.Runtime.Intrinsics.cs @@ -6372,6 +6372,13 @@ internal Arm64() { } public static System.Numerics.Vector MultiplyBySelectedScalarWideningOddAndSubtract(System.Numerics.Vector minuend, System.Numerics.Vector left, System.Numerics.Vector right, [ConstantExpected] byte rightIndex) { throw null; } public static System.Numerics.Vector MultiplyBySelectedScalarWideningOddAndSubtract(System.Numerics.Vector minuend, System.Numerics.Vector left, System.Numerics.Vector right, [ConstantExpected] byte rightIndex) { throw null; } public static System.Numerics.Vector MultiplyBySelectedScalarWideningOddAndSubtract(System.Numerics.Vector minuend, System.Numerics.Vector left, System.Numerics.Vector right, [ConstantExpected] byte rightIndex) { throw null; } + public static System.Numerics.Vector MultiplyDoublingBySelectedScalarSaturateHigh(System.Numerics.Vector left, System.Numerics.Vector right, [ConstantExpected] byte rightIndex) { throw null; } + public static System.Numerics.Vector MultiplyDoublingBySelectedScalarSaturateHigh(System.Numerics.Vector left, System.Numerics.Vector right, [ConstantExpected] byte rightIndex) { throw null; } + public static System.Numerics.Vector MultiplyDoublingBySelectedScalarSaturateHigh(System.Numerics.Vector left, System.Numerics.Vector right, [ConstantExpected] byte rightIndex) { throw null; } + public static System.Numerics.Vector MultiplyDoublingSaturateHigh(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector MultiplyDoublingSaturateHigh(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector MultiplyDoublingSaturateHigh(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector MultiplyDoublingSaturateHigh(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } public static System.Numerics.Vector MultiplyDoublingWideningAndAddSaturateEven(System.Numerics.Vector addend, System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } public static System.Numerics.Vector MultiplyDoublingWideningAndAddSaturateEven(System.Numerics.Vector addend, System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } public static System.Numerics.Vector MultiplyDoublingWideningAndAddSaturateEven(System.Numerics.Vector addend, System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } diff --git a/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs b/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs index fa53ad2d531163..103098d791f76d 100644 --- a/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs +++ b/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs @@ -5179,6 +5179,15 @@ ("SveVecImmTernOpTest.template",new Dictionary {["TestName"] = "Sve2_MultiplyBySelectedScalarWideningOddAndSubtract_uint_ushort", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyBySelectedScalarWideningOddAndSubtract", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "UInt16",["Op4BaseType"] = "UInt64",["LargestVectorSize"] = "64",["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()",["NextValueOp2"] = "TestLibrary.Generator.GetUInt16()",["NextValueOp3"] = "TestLibrary.Generator.GetUInt16()", ["NextValueMask"] = "Helpers.getMaskUInt32()", ["Imm"] = "6", ["InvalidImm"] = "8", ["ConvertFunc"] = "", ["ValidateIterResult"] = "result[i] != Helpers.MultiplySubtractWidening(firstOp[i], secondOp[2 * i + 1], thirdOp[Imm])", ["GetIterResult"] = "Helpers.MultiplySubtractWidening(firstOp[i], secondOp[2 * i + 1], thirdOp[Imm])"}), ("SveVecImmTernOpTest.template",new Dictionary {["TestName"] = "Sve2_MultiplyBySelectedScalarWideningOddAndSubtract_ulong_uint", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyBySelectedScalarWideningOddAndSubtract", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt32", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "UInt32",["Op4BaseType"] = "UInt64",["LargestVectorSize"] = "64",["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()",["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()",["NextValueOp3"] = "TestLibrary.Generator.GetUInt32()", ["NextValueMask"] = "Helpers.getMaskUInt64()", ["Imm"] = "2", ["InvalidImm"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "result[i] != Helpers.MultiplySubtractWidening(firstOp[i], secondOp[2 * i + 1], thirdOp[Imm])", ["GetIterResult"] = "Helpers.MultiplySubtractWidening(firstOp[i], secondOp[2 * i + 1], thirdOp[Imm])"}), + ("SveVecImmBinOpTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyDoublingBySelectedScalarSaturateHigh_short", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyDoublingBySelectedScalarSaturateHigh", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3BaseType"] = "UInt64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskInt16()", ["Imm"] = "6", ["InvalidImm"] = "8", ["ConvertFunc"] = "", ["ValidateIterResult"] = "result[i] != Helpers.MultiplyDoublingSaturateHigh(firstOp[i], secondOp[Imm])", ["GetIterResult"] = "Helpers.MultiplyDoublingSaturateHigh(firstOp[i], secondOp[Imm])"}), + ("SveVecImmBinOpTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyDoublingBySelectedScalarSaturateHigh_int", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyDoublingBySelectedScalarSaturateHigh", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int32", ["Op3BaseType"] = "UInt64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["NextValueMask"] = "Helpers.getMaskInt16()", ["Imm"] = "2", ["InvalidImm"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "result[i] != Helpers.MultiplyDoublingSaturateHigh(firstOp[i], secondOp[Imm])", ["GetIterResult"] = "Helpers.MultiplyDoublingSaturateHigh(firstOp[i], secondOp[Imm])"}), + ("SveVecImmBinOpTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyDoublingBySelectedScalarSaturateHigh_long", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyDoublingBySelectedScalarSaturateHigh", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int64", ["Op3BaseType"] = "UInt64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()", ["NextValueMask"] = "Helpers.getMaskInt16()", ["Imm"] = "1", ["InvalidImm"] = "2", ["ConvertFunc"] = "", ["ValidateIterResult"] = "result[i] != Helpers.MultiplyDoublingSaturateHigh(firstOp[i], secondOp[Imm])", ["GetIterResult"] = "Helpers.MultiplyDoublingSaturateHigh(firstOp[i], secondOp[Imm])"}), + + ("SveVecBinOpTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyDoublingSaturateHigh_sbyte", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyDoublingSaturateHigh", ["RetVectorType"] = "Vector", ["RetBaseType"] = "SByte", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "SByte", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "result[i] != Helpers.MultiplyDoublingSaturateHigh(left[i], right[i])", ["GetIterResult"] = "Helpers.MultiplyDoublingSaturateHigh(leftOp[i], rightOp[i])"}), + ("SveVecBinOpTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyDoublingSaturateHigh_short", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyDoublingSaturateHigh", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "result[i] != Helpers.MultiplyDoublingSaturateHigh(left[i], right[i])", ["GetIterResult"] = "Helpers.MultiplyDoublingSaturateHigh(leftOp[i], rightOp[i])"}), + ("SveVecBinOpTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyDoublingSaturateHigh_int", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyDoublingSaturateHigh", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "result[i] != Helpers.MultiplyDoublingSaturateHigh(left[i], right[i])", ["GetIterResult"] = "Helpers.MultiplyDoublingSaturateHigh(leftOp[i], rightOp[i])"}), + ("SveVecBinOpTest.template", new Dictionary {["TestName"] = "Sve2_MultiplyDoublingSaturateHigh_long", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyDoublingSaturateHigh", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "result[i] != Helpers.MultiplyDoublingSaturateHigh(left[i], right[i])", ["GetIterResult"] = "Helpers.MultiplyDoublingSaturateHigh(leftOp[i], rightOp[i])"}), + ("SveVecBinOpDifferentRetType.template",new Dictionary { ["TestName"] = "Sve2_MultiplyWideningEven_short_sbyte", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyWideningEven", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "SByte", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueMask"] = "Helpers.getMaskInt16()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "result[i] != Helpers.MultiplyWidening(left[2 * i], right[2 * i])", ["GetIterResult"] = "Helpers.MultiplyWidening(leftOp[2 * i], rightOp[2 * i])"}), ("SveVecBinOpDifferentRetType.template",new Dictionary { ["TestName"] = "Sve2_MultiplyWideningEven_int_short", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyWideningEven", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskInt32()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "result[i] != Helpers.MultiplyWidening(left[2 * i], right[2 * i])", ["GetIterResult"] = "Helpers.MultiplyWidening(leftOp[2 * i], rightOp[2 * i])"}), ("SveVecBinOpDifferentRetType.template",new Dictionary { ["TestName"] = "Sve2_MultiplyWideningEven_long_int", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "MultiplyWideningEven", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()", ["NextValueMask"] = "Helpers.getMaskInt64()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "result[i] != Helpers.MultiplyWidening(left[2 * i], right[2 * i])", ["GetIterResult"] = "Helpers.MultiplyWidening(leftOp[2 * i], rightOp[2 * i])"}), diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Helpers.cs b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Helpers.cs index ae4060fdae8599..a63ba615cacbaf 100644 --- a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Helpers.cs +++ b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Helpers.cs @@ -2524,6 +2524,11 @@ public static int MultiplyRoundedDoublingAndSubtractSaturateHigh(int op1, int op public static long MultiplyDoublingWideningUpperAndSubtractSaturate(long[] op1, int[] op2, int[] op3, int i) => MultiplyDoublingWideningAndSubtractSaturate(op1[i], op2[i + op2.Length / 2], op3[i + op3.Length / 2]); + public static long MultiplyDoublingSaturateHigh(long op1, long op2) + { + return MultiplyDoublingSaturate(op1, op2, rounding: false, 0, subOp: false); + } + public static long MultiplyRoundedDoublingSaturateHigh(long op1, long op2) { return MultiplyDoublingSaturate(op1, op2, rounding: true, 0, subOp: false);