From 9221de62576de1126dfeab125ad9418c6e7c16da Mon Sep 17 00:00:00 2001 From: Jacob Crawley Date: Thu, 3 Jul 2025 13:21:50 +0000 Subject: [PATCH 1/4] SVE2 DotProductComplex* Implementation for DotProductComplex and DotProductComplexBySelectedIndex --- src/coreclr/jit/emitarm64sve.cpp | 23 +- src/coreclr/jit/hwintrinsic.h | 1 + src/coreclr/jit/hwintrinsicarm64.cpp | 19 ++ src/coreclr/jit/hwintrinsiccodegenarm64.cpp | 110 +++++++++ src/coreclr/jit/hwintrinsiclistarm64sve.h | 2 + src/coreclr/jit/lowerarmarch.cpp | 2 + src/coreclr/jit/lsraarm64.cpp | 7 + .../Arm/Sve2.PlatformNotSupported.cs | 27 +++ .../src/System/Runtime/Intrinsics/Arm/Sve2.cs | 27 +++ .../ref/System.Runtime.Intrinsics.cs | 4 + .../GenerateHWIntrinsicTests_Arm.cs | 37 ++++ .../HardwareIntrinsics/Arm/Shared/Helpers.cs | 119 ++++++++++ .../_SveImm2TernOpTestTemplate.template | 209 +++++++++--------- 13 files changed, 476 insertions(+), 111 deletions(-) diff --git a/src/coreclr/jit/emitarm64sve.cpp b/src/coreclr/jit/emitarm64sve.cpp index 25f1817ae45c9a..f19eef30021f0f 100644 --- a/src/coreclr/jit/emitarm64sve.cpp +++ b/src/coreclr/jit/emitarm64sve.cpp @@ -4560,14 +4560,13 @@ void emitter::emitInsSve_R_R_R_I(instruction ins, case INS_sve_cdot: assert(insScalableOptsNone(sopt)); assert(insOptsScalableWords(opt)); - assert(isVectorRegister(reg1)); // ddddd - assert(isVectorRegister(reg2)); // nnnnn - assert(isVectorRegister(reg3)); // mmmmm - assert(isValidRot(imm)); // rr - assert(isValidVectorElemsize(optGetSveElemsize(opt))); // xx + assert(isVectorRegister(reg1)); // ddddd + assert(isVectorRegister(reg2)); // nnnnn + assert(isVectorRegister(reg3)); // mmmmm + assert(isValidRot(emitDecodeRotationImm0_to_270(imm))); // rr + assert(isValidVectorElemsize(optGetSveElemsize(opt))); // xx // Convert rot to bitwise representation - imm = emitEncodeRotationImm0_to_270(imm); fmt = IF_SVE_EJ_3A; break; @@ -5764,12 +5763,12 @@ void emitter::emitInsSve_R_R_R_I_I(instruction ins, switch (ins) { case INS_sve_cdot: - assert(isVectorRegister(reg1)); // ddddd - assert(isVectorRegister(reg2)); // nnnnn - assert(isLowVectorRegister(reg3)); // mmmm - assert(isValidRot(imm2)); // rr - // Convert imm2 from rotation value (0-270) to bitwise representation (0-3) - imm = (imm1 << 2) | emitEncodeRotationImm0_to_270(imm2); + assert(isVectorRegister(reg1)); // ddddd + assert(isVectorRegister(reg2)); // nnnnn + assert(isLowVectorRegister(reg3)); // mmmm + assert(isValidRot(emitDecodeRotationImm0_to_270(imm2))); // rr + + imm = (imm1 << 2) | imm2; if (opt == INS_OPTS_SCALABLE_B) { diff --git a/src/coreclr/jit/hwintrinsic.h b/src/coreclr/jit/hwintrinsic.h index 6cacd4a1ae17f1..47b1b0e29d20be 100644 --- a/src/coreclr/jit/hwintrinsic.h +++ b/src/coreclr/jit/hwintrinsic.h @@ -1275,6 +1275,7 @@ struct HWIntrinsicInfo } case NI_Sve_MultiplyAddRotateComplexBySelectedScalar: + case NI_Sve2_DotProductComplexBySelectedIndex: { assert(sig->numArgs == 5); *imm1Pos = 0; diff --git a/src/coreclr/jit/hwintrinsicarm64.cpp b/src/coreclr/jit/hwintrinsicarm64.cpp index 18ba7125359aff..abc908c069d42a 100644 --- a/src/coreclr/jit/hwintrinsicarm64.cpp +++ b/src/coreclr/jit/hwintrinsicarm64.cpp @@ -485,6 +485,7 @@ void HWIntrinsicInfo::lookupImmBounds( break; case NI_Sve_MultiplyAddRotateComplex: + case NI_Sve2_DotProductComplex: immLowerBound = 0; immUpperBound = 3; break; @@ -510,6 +511,23 @@ void HWIntrinsicInfo::lookupImmBounds( } break; + case NI_Sve2_DotProductComplexBySelectedIndex: + if (immNumber == 1) + { + // Bounds for rotation + immLowerBound = 0; + immUpperBound = 3; + } + else + { + // Bounds for index + assert(immNumber == 2); + assert(baseType == TYP_BYTE || baseType == TYP_SHORT); + immLowerBound = 0; + immUpperBound = (baseType == TYP_BYTE) ? 3 : 1; + } + break; + case NI_Sve_TrigonometricMultiplyAddCoefficient: immLowerBound = 0; immUpperBound = 7; @@ -3197,6 +3215,7 @@ GenTree* Compiler::impSpecialIntrinsic(NamedIntrinsic intrinsic, } case NI_Sve_MultiplyAddRotateComplexBySelectedScalar: + case NI_Sve2_DotProductComplexBySelectedIndex: { assert(sig->numArgs == 5); assert(!isScalar); diff --git a/src/coreclr/jit/hwintrinsiccodegenarm64.cpp b/src/coreclr/jit/hwintrinsiccodegenarm64.cpp index 6f825a38c45fee..75cb5ddb98a0b1 100644 --- a/src/coreclr/jit/hwintrinsiccodegenarm64.cpp +++ b/src/coreclr/jit/hwintrinsiccodegenarm64.cpp @@ -2737,6 +2737,116 @@ void CodeGen::genHWIntrinsic(GenTreeHWIntrinsic* node) GetEmitter()->emitInsSve_R_R_R(ins, emitSize, targetReg, op3Reg, op1Reg, INS_OPTS_SCALABLE_D); break; + case NI_Sve2_DotProductComplex: + { + assert(isRMW); + assert(hasImmediateOperand); + + HWIntrinsicImmOpHelper helper(this, intrin.op4, node, (targetReg != op1Reg) ? 2 : 1); + + for (helper.EmitBegin(); !helper.Done(); helper.EmitCaseEnd()) + { + if (targetReg != op1Reg) + { + assert(targetReg != op2Reg); + + GetEmitter()->emitInsSve_R_R(INS_sve_movprfx, EA_SCALABLE, targetReg, op1Reg); + } + + GetEmitter()->emitInsSve_R_R_R_I(ins, emitSize, targetReg, op2Reg, op3Reg, helper.ImmValue(), opt); + } + break; + } + + case NI_Sve2_DotProductComplexBySelectedIndex: + { + assert(isRMW); + assert(hasImmediateOperand); + + // If both immediates are constant, we don't need a jump table + if (intrin.op4->IsCnsIntOrI() && intrin.op5->IsCnsIntOrI()) + { + if (targetReg != op1Reg) + { + assert(targetReg != op2Reg); + assert(targetReg != op3Reg); + GetEmitter()->emitInsSve_R_R(INS_sve_movprfx, EA_SCALABLE, targetReg, op1Reg); + } + + assert(intrin.op4->isContainedIntOrIImmed() && intrin.op5->isContainedIntOrIImmed()); + GetEmitter()->emitInsSve_R_R_R_I_I(ins, emitSize, targetReg, op2Reg, op3Reg, + intrin.op4->AsIntCon()->gtIconVal, + intrin.op5->AsIntCon()->gtIconVal, opt); + } + else + { + // Use the helper to generate a table. The table can only use a single lookup value, therefore + // the two immediates index and rotation must be combined to a single value + assert(!intrin.op4->isContainedIntOrIImmed() && !intrin.op5->isContainedIntOrIImmed()); + emitAttr scalarSize = emitActualTypeSize(node->GetSimdBaseType()); + + var_types baseType = node->GetSimdBaseType(); + + if (baseType == TYP_BYTE) + { + GetEmitter()->emitIns_R_R_I(INS_lsl, scalarSize, op5Reg, op5Reg, 2); + GetEmitter()->emitIns_R_R_R(INS_orr, scalarSize, op4Reg, op4Reg, op5Reg); + + // index and rotation both take values 0 to 3 so must be + // combined to a single value (0 to 15) + HWIntrinsicImmOpHelper helper(this, op4Reg, 0, 15, node, (targetReg != op1Reg) ? 2 : 1); + for (helper.EmitBegin(); !helper.Done(); helper.EmitCaseEnd()) + { + if (targetReg != op1Reg) + { + assert(targetReg != op2Reg); + assert(targetReg != op3Reg); + GetEmitter()->emitInsSve_R_R(INS_sve_movprfx, EA_SCALABLE, targetReg, op1Reg); + } + + const int value = helper.ImmValue(); + const ssize_t index = value & 3; + const ssize_t rotation = (value >> 2) & 3; + GetEmitter()->emitInsSve_R_R_R_I_I(ins, emitSize, targetReg, op2Reg, op3Reg, index, + rotation, opt); + } + + GetEmitter()->emitIns_R_R_I(INS_and, scalarSize, op4Reg, op4Reg, 3); + GetEmitter()->emitIns_R_R_I(INS_lsr, scalarSize, op5Reg, op5Reg, 2); + } + else + { + assert(baseType == TYP_SHORT); + GetEmitter()->emitIns_R_R_I(INS_lsl, scalarSize, op5Reg, op5Reg, 1); + GetEmitter()->emitIns_R_R_R(INS_orr, scalarSize, op4Reg, op4Reg, op5Reg); + + // index (0 to 1, in op4Reg) and rotation (0 to 3, in op5Reg) must be + // combined to a single value (0 to 7) + HWIntrinsicImmOpHelper helper(this, op4Reg, 0, 7, node, (targetReg != op1Reg) ? 2 : 1); + for (helper.EmitBegin(); !helper.Done(); helper.EmitCaseEnd()) + { + if (targetReg != op1Reg) + { + assert(targetReg != op2Reg); + assert(targetReg != op3Reg); + GetEmitter()->emitInsSve_R_R(INS_sve_movprfx, EA_SCALABLE, targetReg, op1Reg); + } + + const int value = helper.ImmValue(); + const ssize_t index = value & 1; + const ssize_t rotation = value >> 1; + GetEmitter()->emitInsSve_R_R_R_I_I(ins, emitSize, targetReg, op2Reg, op3Reg, index, + rotation, opt); + } + + GetEmitter()->emitIns_R_R_I(INS_and, scalarSize, op4Reg, op4Reg, 1); + GetEmitter()->emitIns_R_R_I(INS_lsr, scalarSize, op5Reg, op5Reg, 1); + } + } + + break; + } + case NI_Sve2_SubtractWideningEven: { var_types returnType = node->AsHWIntrinsic()->GetSimdBaseType(); diff --git a/src/coreclr/jit/hwintrinsiclistarm64sve.h b/src/coreclr/jit/hwintrinsiclistarm64sve.h index e29129dde947bc..e0b97ac1d5918e 100644 --- a/src/coreclr/jit/hwintrinsiclistarm64sve.h +++ b/src/coreclr/jit/hwintrinsiclistarm64sve.h @@ -336,6 +336,8 @@ HARDWARE_INTRINSIC(Sve2, BitwiseClearXor, HARDWARE_INTRINSIC(Sve2, BitwiseSelect, -1, 3, {INS_sve_bsl, INS_sve_bsl, INS_sve_bsl, INS_sve_bsl, INS_sve_bsl, INS_sve_bsl, INS_sve_bsl, INS_sve_bsl, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_HasRMWSemantics) HARDWARE_INTRINSIC(Sve2, BitwiseSelectLeftInverted, -1, 3, {INS_sve_bsl1n, INS_sve_bsl1n, INS_sve_bsl1n, INS_sve_bsl1n, INS_sve_bsl1n, INS_sve_bsl1n, INS_sve_bsl1n, INS_sve_bsl1n, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_HasRMWSemantics) HARDWARE_INTRINSIC(Sve2, BitwiseSelectRightInverted, -1, 3, {INS_sve_bsl2n, INS_sve_bsl2n, INS_sve_bsl2n, INS_sve_bsl2n, INS_sve_bsl2n, INS_sve_bsl2n, INS_sve_bsl2n, INS_sve_bsl2n, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_HasRMWSemantics) +HARDWARE_INTRINSIC(Sve2, DotProductComplex, -1, 4, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_cdot, INS_invalid, INS_sve_cdot, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_HasRMWSemantics|HW_Flag_SpecialCodeGen|HW_Flag_HasImmediateOperand) +HARDWARE_INTRINSIC(Sve2, DotProductComplexBySelectedIndex, -1, 5, {INS_sve_cdot, INS_invalid, INS_sve_cdot, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_HasRMWSemantics|HW_Flag_SpecialCodeGen|HW_Flag_HasImmediateOperand|HW_Flag_LowVectorOperation|HW_Flag_SpecialImport|HW_Flag_BaseTypeFromSecondArg) HARDWARE_INTRINSIC(Sve2, FusedAddHalving, -1, -1, {INS_sve_shadd, INS_sve_uhadd, INS_sve_shadd, INS_sve_uhadd, INS_sve_shadd, INS_sve_uhadd, INS_sve_shadd, INS_sve_uhadd, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_HasRMWSemantics|HW_Flag_LowMaskedOperation) HARDWARE_INTRINSIC(Sve2, FusedAddRoundedHalving, -1, -1, {INS_sve_srhadd, INS_sve_urhadd, INS_sve_srhadd, INS_sve_urhadd, INS_sve_srhadd, INS_sve_urhadd, INS_sve_srhadd, INS_sve_urhadd, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_HasRMWSemantics|HW_Flag_LowMaskedOperation) HARDWARE_INTRINSIC(Sve2, FusedSubtractHalving, -1, -1, {INS_sve_shsub, INS_sve_uhsub, INS_sve_shsub, INS_sve_uhsub, INS_sve_shsub, INS_sve_uhsub, INS_sve_shsub, INS_sve_uhsub, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_HasRMWSemantics|HW_Flag_LowMaskedOperation) diff --git a/src/coreclr/jit/lowerarmarch.cpp b/src/coreclr/jit/lowerarmarch.cpp index cca3358639202e..541169efc6dbb6 100644 --- a/src/coreclr/jit/lowerarmarch.cpp +++ b/src/coreclr/jit/lowerarmarch.cpp @@ -4091,6 +4091,7 @@ void Lowering::ContainCheckHWIntrinsic(GenTreeHWIntrinsic* node) case NI_Sve_FusedMultiplyAddBySelectedScalar: case NI_Sve_FusedMultiplySubtractBySelectedScalar: case NI_Sve_MultiplyAddRotateComplex: + case NI_Sve2_DotProductComplex: assert(hasImmediateOperand); assert(varTypeIsIntegral(intrin.op4)); if (intrin.op4->IsCnsIntOrI()) @@ -4148,6 +4149,7 @@ void Lowering::ContainCheckHWIntrinsic(GenTreeHWIntrinsic* node) break; case NI_Sve_MultiplyAddRotateComplexBySelectedScalar: + case NI_Sve2_DotProductComplexBySelectedIndex: assert(hasImmediateOperand); assert(varTypeIsIntegral(intrin.op4)); assert(varTypeIsIntegral(intrin.op5)); diff --git a/src/coreclr/jit/lsraarm64.cpp b/src/coreclr/jit/lsraarm64.cpp index 87d73acd0da7e6..93936db45d61cc 100644 --- a/src/coreclr/jit/lsraarm64.cpp +++ b/src/coreclr/jit/lsraarm64.cpp @@ -1710,6 +1710,7 @@ void LinearScan::BuildHWIntrinsicImmediate(GenTreeHWIntrinsic* intrinsicTree, co break; case NI_Sve_MultiplyAddRotateComplexBySelectedScalar: + case NI_Sve2_DotProductComplexBySelectedIndex: // This API has two immediates, one of which is used to index pairs of floats in a vector. // For a vector width of 128 bits, this means the index's range is [0, 1], // which means we will skip the above jump table register check, @@ -1734,6 +1735,7 @@ void LinearScan::BuildHWIntrinsicImmediate(GenTreeHWIntrinsic* intrinsicTree, co break; case NI_Sve_MultiplyAddRotateComplex: + case NI_Sve2_DotProductComplex: needBranchTargetReg = !intrin.op4->isContainedIntOrIImmed(); break; @@ -2164,6 +2166,7 @@ SingleTypeRegSet LinearScan::getOperandCandidates(GenTreeHWIntrinsic* intrinsicT case NI_Sve_FusedMultiplyAddBySelectedScalar: case NI_Sve_FusedMultiplySubtractBySelectedScalar: case NI_Sve_MultiplyAddRotateComplexBySelectedScalar: + case NI_Sve2_DotProductComplexBySelectedIndex: case NI_Sve2_MultiplyAddBySelectedScalar: case NI_Sve2_MultiplyBySelectedScalarWideningEvenAndAdd: case NI_Sve2_MultiplyBySelectedScalarWideningOddAndAdd: @@ -2185,6 +2188,10 @@ SingleTypeRegSet LinearScan::getOperandCandidates(GenTreeHWIntrinsic* intrinsicT if (isLowVectorOpNum) { unsigned baseElementSize = genTypeSize(intrin.baseType); + if (intrin.id == NI_Sve2_DotProductComplexBySelectedIndex) + { + baseElementSize = intrin.baseType == TYP_BYTE ? 4 : 8; + } if (baseElementSize == 8) { diff --git a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve2.PlatformNotSupported.cs b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve2.PlatformNotSupported.cs index d725b3d06f6bfd..0681e525a4a9dd 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 @@ -1081,6 +1081,33 @@ internal Arm64() { } /// public static Vector BitwiseSelectRightInverted(Vector select, Vector left, Vector right) { throw new PlatformNotSupportedException(); } + // Complex dot product + + /// + /// svint32_t svcdot[_s32](svint32_t op1, svint8_t op2, svint8_t op3, uint64_t imm_rotation) + /// CDOT Ztied1.S, Zop2.B, Zop3.B, #imm_rotation + /// + public static Vector DotProductComplex(Vector op1, Vector op2, Vector op3, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) { throw new PlatformNotSupportedException(); } + + /// + /// svint64_t svcdot[_s64](svint64_t op1, svint16_t op2, svint16_t op3, uint64_t imm_rotation) + /// CDOT Ztied1.D, Zop2.H, Zop3.H, #imm_rotation + /// + public static Vector DotProductComplex(Vector op1, Vector op2, Vector op3, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) { throw new PlatformNotSupportedException(); } + + /// + /// svint32_t svcdot_lane[_s32](svint32_t op1, svint8_t op2, svint8_t op3, uint64_t imm_index, uint64_t imm_rotation) + /// CDOT Ztied1.S, Zop2.B, Zop3.B[imm_index], #imm_rotation + /// + public static Vector DotProductComplexBySelectedIndex(Vector op1, Vector op2, Vector op3, byte imm_index, [ConstantExpected] byte rotation) { throw new PlatformNotSupportedException(); } + + /// + /// svint64_t svcdot_lane[_s64](svint64_t op1, svint16_t op2, svint16_t op3, uint64_t imm_index, uint64_t imm_rotation) + /// CDOT Ztied1.D, Zop2.H, Zop3.H[imm_index], #imm_rotation + /// + public static Vector DotProductComplexBySelectedIndex(Vector op1, Vector op2, Vector op3, byte imm_index, [ConstantExpected] byte rotation) { throw new PlatformNotSupportedException(); } + + // Halving add /// diff --git a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve2.cs b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve2.cs index 542c142c54c1a3..cd516d0a64fc5c 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 @@ -1080,6 +1080,33 @@ internal Arm64() { } /// public static Vector BitwiseSelectRightInverted(Vector select, Vector left, Vector right) => BitwiseSelectRightInverted(select, left, right); + // Complex dot product + + /// + /// svint32_t svcdot[_s32](svint32_t op1, svint8_t op2, svint8_t op3, uint64_t imm_rotation) + /// CDOT Ztied1.S, Zop2.B, Zop3.B, #imm_rotation + /// + public static Vector DotProductComplex(Vector op1, Vector op2, Vector op3, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) => DotProductComplex(op1, op2, op3, rotation); + + /// + /// svint64_t svcdot[_s64](svint64_t op1, svint16_t op2, svint16_t op3, uint64_t imm_rotation) + /// CDOT Ztied1.D, Zop2.H, Zop3.H, #imm_rotation + /// + public static Vector DotProductComplex(Vector op1, Vector op2, Vector op3, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) => DotProductComplex(op1, op2, op3, rotation); + + /// + /// svint32_t svcdot_lane[_s32](svint32_t op1, svint8_t op2, svint8_t op3, uint64_t imm_index, uint64_t imm_rotation) + /// CDOT Ztied1.S, Zop2.B, Zop3.B[imm_index], #imm_rotation + /// + public static Vector DotProductComplexBySelectedIndex(Vector op1, Vector op2, Vector op3, [ConstantExpected(Min = 0, Max = (byte)(3))] byte imm_index, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) => DotProductComplexBySelectedIndex(op1, op2, op3, imm_index, rotation); + + /// + /// svint64_t svcdot_lane[_s64](svint64_t op1, svint16_t op2, svint16_t op3, uint64_t imm_index, uint64_t imm_rotation) + /// CDOT Ztied1.D, Zop2.H, Zop3.H[imm_index], #imm_rotation + /// + public static Vector DotProductComplexBySelectedIndex(Vector op1, Vector op2, Vector op3, [ConstantExpected(Min = 0, Max = (byte)(1))] byte imm_index, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) => DotProductComplexBySelectedIndex(op1, op2, op3, imm_index, rotation); + + // Halving add /// diff --git a/src/libraries/System.Runtime.Intrinsics/ref/System.Runtime.Intrinsics.cs b/src/libraries/System.Runtime.Intrinsics/ref/System.Runtime.Intrinsics.cs index cc1757f072fe88..c178335a0bf17a 100644 --- a/src/libraries/System.Runtime.Intrinsics/ref/System.Runtime.Intrinsics.cs +++ b/src/libraries/System.Runtime.Intrinsics/ref/System.Runtime.Intrinsics.cs @@ -6264,6 +6264,10 @@ internal Arm64() { } public static System.Numerics.Vector BitwiseSelectRightInverted(System.Numerics.Vector select, System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } public static System.Numerics.Vector BitwiseSelectRightInverted(System.Numerics.Vector select, System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } public static System.Numerics.Vector BitwiseSelectRightInverted(System.Numerics.Vector select, System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } + public static System.Numerics.Vector DotProductComplex(System.Numerics.Vector op1, System.Numerics.Vector op2, System.Numerics.Vector op3, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) { throw null; } + public static System.Numerics.Vector DotProductComplex(System.Numerics.Vector op1, System.Numerics.Vector op2, System.Numerics.Vector op3, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) { throw null; } + public static System.Numerics.Vector DotProductComplexBySelectedIndex(System.Numerics.Vector op1, System.Numerics.Vector op2, System.Numerics.Vector op3, byte imm_index, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) { throw null; } + public static System.Numerics.Vector DotProductComplexBySelectedIndex(System.Numerics.Vector op1, System.Numerics.Vector op2, System.Numerics.Vector op3, byte imm_index, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) { throw null; } public static System.Numerics.Vector FusedAddRoundedHalving(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } public static System.Numerics.Vector FusedAddRoundedHalving(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } public static System.Numerics.Vector FusedAddRoundedHalving(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } diff --git a/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs b/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs index 38f6d51b32af07..af2d1ae0ba5286 100644 --- a/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs +++ b/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs @@ -347,6 +347,7 @@ ("_SveImm2TernOpTestTemplate.template", "SveVecImm2TernOpVecTest.template", new Dictionary { ["TemplateName"] = "Simple", ["TemplateValidationLogic"] = SimpleVecOpTest_VectorValidationLogic, ["TemplateValidationLogicForCndSel"] = SimpleVecOpTest_VectorValidationLogicForCndSel, ["TemplateValidationLogicForCndSel_FalseValue"] = SimpleVecOpTest_VectorValidationLogicForCndSel_FalseValue }), ("_SveTernOpMaskedOpTestTemplate.template", "SveVecTernOpMaskedTest.template", new Dictionary { ["TemplateName"] = "Simple", ["TemplateValidationLogic"] = SimpleVecOpTest_ValidationLogic, ["TemplateValidationLogicForCndSel"] = SimpleTernVecOpTest_ValidationLogicForCndSel, ["TemplateValidationLogicForCndSel_FalseValue"] = SimpleTernVecOpTest_ValidationLogicForCndSel_FalseValue }), ("_SveImmTernOpFirstArgTestTemplate.template", "SveVecImmTernOpFirstArgTest.template", new Dictionary { ["TemplateName"] = "Simple", ["TemplateValidationLogic"] = SimpleVecOpTest_ValidationLogic, ["TemplateValidationLogicForCndSel"] = SimpleTernVecOpTest_ValidationLogicForCndSel, ["TemplateValidationLogicForCndSel_FalseValue"] = SimpleTernVecOpTest_ValidationLogicForCndSel_FalseValue }), + ("_SveImm2TernOpTestTemplate.template", "SveVecTernOpImm2Test.template", new Dictionary { ["TemplateName"] = "Simple", ["TemplateValidationLogic"] = SimpleVecOpTest_ValidationLogic, ["TemplateValidationLogicForCndSel"] = SimpleTernVecOpTest_ValidationLogicForCndSel, ["TemplateValidationLogicForCndSel_FalseValue"] = SimpleTernVecOpTest_ValidationLogicForCndSel_FalseValue }), ("_SveScalarBinOpTestTemplate.template", "SveScalarBinOpTest.template", new Dictionary { ["TemplateName"] = "Simple", ["TemplateValidationLogic"] = SimpleScalarOpTest_ValidationLogic }), ("_SveScalarTernOpTestTemplate.template", "SveScalarTernOpTest.template", new Dictionary { ["TemplateName"] = "Simple", ["TemplateValidationLogic"] = SimpleScalarOpTest_ValidationLogic }), ("_SveImm2UnaryOpTestTemplate.template", "SveVecImm2UnOpTest.template", new Dictionary { ["TemplateName"] = "Imm", ["TemplateValidationLogic"] = SimpleVecOpTest_ValidationLogic }), @@ -4995,6 +4996,42 @@ ("SveVecTernOpTest.template", new Dictionary { ["TestName"] = "Sve2_BitwiseSelectRightInverted_uint", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "BitwiseSelectRightInverted", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt32", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp3"] = "TestLibrary.Generator.GetUInt32()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "result[i] != Helpers.BitwiseSelectRightInverted(firstOp[i], secondOp[i], thirdOp[i])", ["GetIterResult"] = "Helpers.BitwiseSelectRightInverted(firstOp[i], secondOp[i], thirdOp[i])"}), ("SveVecTernOpTest.template", new Dictionary { ["TestName"] = "Sve2_BitwiseSelectRightInverted_ulong", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "BitwiseSelectRightInverted", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt64", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "UInt64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()", ["NextValueOp3"] = "TestLibrary.Generator.GetUInt64()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "result[i] != Helpers.BitwiseSelectRightInverted(firstOp[i], secondOp[i], thirdOp[i])", ["GetIterResult"] = "Helpers.BitwiseSelectRightInverted(firstOp[i], secondOp[i], thirdOp[i])"}), + ("SveVecImmTernOpFirstArgTest.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplex_int_sbyte_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["Imm"] = "0", ["InvalidImm"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplex(first[i], second, 4 * i, third, Imm) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplex(first[i], second, 4 * i, third, Imm)"}), + ("SveVecImmTernOpFirstArgTest.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplex_int_sbyte_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["Imm"] = "1", ["InvalidImm"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplex(first[i], second, 4 * i, third, Imm) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplex(first[i], second, 4 * i, third, Imm)"}), + ("SveVecImmTernOpFirstArgTest.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplex_int_sbyte_2", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["Imm"] = "2", ["InvalidImm"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplex(first[i], second, 4 * i, third, Imm) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplex(first[i], second, 4 * i, third, Imm)"}), + ("SveVecImmTernOpFirstArgTest.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplex_int_sbyte_3", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["Imm"] = "3", ["InvalidImm"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplex(first[i], second, 4 * i, third, Imm) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplex(first[i], second, 4 * i, third, Imm)"}), + + ("SveVecImmTernOpFirstArgTest.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplex_long_short_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16",["Op4BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["Imm"] = "0", ["InvalidImm"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplex(first[i], second, 4 * i, third, Imm) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplex(first[i], second, 4 * i, third, Imm)"}), + ("SveVecImmTernOpFirstArgTest.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplex_long_short_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16",["Op4BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["Imm"] = "1", ["InvalidImm"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplex(first[i], second, 4 * i, third, Imm) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplex(first[i], second, 4 * i, third, Imm)"}), + ("SveVecImmTernOpFirstArgTest.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplex_long_short_2", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16",["Op4BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["Imm"] = "2", ["InvalidImm"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplex(first[i], second, 4 * i, third, Imm) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplex(first[i], second, 4 * i, third, Imm)"}), + ("SveVecImmTernOpFirstArgTest.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplex_long_short_3", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16",["Op4BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["Imm"] = "3", ["InvalidImm"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplex(first[i], second, 4 * i, third, Imm) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplex(first[i], second, 4 * i, third, Imm)"}), + + ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplexBySelectedIndex_int_sbyte_0_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()",["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "0", ["Imm2"] = "0", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), + ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplexBySelectedIndex_int_sbyte_0_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()",["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "0", ["Imm2"] = "1", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), + ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplexBySelectedIndex_int_sbyte_0_2", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()",["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "0", ["Imm2"] = "2", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), + ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplexBySelectedIndex_int_sbyte_0_3", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()",["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "0", ["Imm2"] = "3", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), + ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplexBySelectedIndex_int_sbyte_1_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()",["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "1", ["Imm2"] = "0", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), + ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplexBySelectedIndex_int_sbyte_1_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()",["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "1", ["Imm2"] = "1", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), + ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplexBySelectedIndex_int_sbyte_1_2", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()",["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "1", ["Imm2"] = "2", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), + ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplexBySelectedIndex_int_sbyte_1_3", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()",["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "1", ["Imm2"] = "3", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), + ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplexBySelectedIndex_int_sbyte_2_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()",["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "2", ["Imm2"] = "0", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), + ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplexBySelectedIndex_int_sbyte_2_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()",["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "2", ["Imm2"] = "1", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), + ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplexBySelectedIndex_int_sbyte_2_2", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()",["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "2", ["Imm2"] = "2", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), + ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplexBySelectedIndex_int_sbyte_2_3", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()",["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "2", ["Imm2"] = "3", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), + ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplexBySelectedIndex_int_sbyte_3_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()",["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "3", ["Imm2"] = "0", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), + ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplexBySelectedIndex_int_sbyte_3_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()",["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "3", ["Imm2"] = "1", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), + ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplexBySelectedIndex_int_sbyte_3_2", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()",["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "3", ["Imm2"] = "2", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), + ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplexBySelectedIndex_int_sbyte_3_3", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()",["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "3", ["Imm2"] = "3", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), + + ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplexBySelectedIndex_long_short_0_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()",["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "0", ["Imm2"] = "0", ["InvalidImm1"] = "2", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), + ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplexBySelectedIndex_long_short_0_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()",["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "0", ["Imm2"] = "1", ["InvalidImm1"] = "2", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), + ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplexBySelectedIndex_long_short_0_2", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()",["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "0", ["Imm2"] = "2", ["InvalidImm1"] = "2", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), + ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplexBySelectedIndex_long_short_0_3", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()",["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "0", ["Imm2"] = "3", ["InvalidImm1"] = "2", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), + ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplexBySelectedIndex_long_short_1_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()",["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "1", ["Imm2"] = "0", ["InvalidImm1"] = "2", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), + ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplexBySelectedIndex_long_short_1_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()",["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "1", ["Imm2"] = "1", ["InvalidImm1"] = "2", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), + ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplexBySelectedIndex_long_short_1_2", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()",["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "1", ["Imm2"] = "2", ["InvalidImm1"] = "2", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), + ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplexBySelectedIndex_long_short_1_3", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()",["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "1", ["Imm2"] = "3", ["InvalidImm1"] = "2", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), + ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve2_FusedAddHalving_sbyte", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "FusedAddHalving", ["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.FusedAddHalving(left[i], right[i]) != result[i]", ["GetIterResult"] = "Helpers.FusedAddHalving(left[i], right[i])"}), ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve2_FusedAddHalving_short", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "FusedAddHalving", ["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.FusedAddHalving(left[i], right[i]) != result[i]", ["GetIterResult"] = "Helpers.FusedAddHalving(left[i], right[i])"}), ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve2_FusedAddHalving_int", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "FusedAddHalving", ["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.FusedAddHalving(left[i], right[i]) != result[i]", ["GetIterResult"] = "Helpers.FusedAddHalving(left[i], right[i])"}), diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Helpers.cs b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Helpers.cs index d8643e94617d3b..9ac6aa47f449a5 100644 --- a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Helpers.cs +++ b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Helpers.cs @@ -8100,6 +8100,125 @@ public static long DotProduct(long op1, short[] op2, int s, short[] op3, int t) return result; } + public static int DotProductComplex(int op1, sbyte[] op2, int s, sbyte[] op3, byte rotation) + { + int result = op1; + + int r1 = s; + int i1 = s + 1; + int r2 = s + 2; + int i2 = s + 3; + + switch (rotation) + { + case 0: + result += ((int)op2[r1] * (int)op3[r1]) - ((int)op2[i1] * (int)op3[i1]) + ((int)op2[r2] * (int)op3[r2]) - ((int)op2[i2] * (int)op3[i2]); + break; + case 1: + result += ((int)op2[r1] * (int)op3[i1]) + ((int)op2[i1] * (int)op3[r1]) + ((int)op2[r2] * (int)op3[i2]) + ((int)op2[i2] * (int)op3[r2]); + break; + case 2: + result += ((int)op2[r1] * (int)op3[r1]) + ((int)op2[i1] * (int)op3[i1]) + ((int)op2[r2] * (int)op3[r2]) + ((int)op2[i2] * (int)op3[i2]); + break; + case 3: + result += ((int)op2[r1] * (int)op3[i1]) - ((int)op2[i1] * (int)op3[r1]) + ((int)op2[r2] * (int)op3[i2]) - ((int)op2[i2] * (int)op3[r2]); + break; + default: + throw new ArgumentOutOfRangeException(nameof(rotation), "Invalid rotation value."); + } + + return result; + } + + public static int DotProductComplexBySelectedIndex(int op1, sbyte[] op2, int s, sbyte[] op3, int immIndex, byte rotation) + { + int result = op1; + int r1 = s; + int i1 = s + 1; + int r2 = s + 2; + int i2 = s + 3; + + switch (rotation) + { + case 0: + result += ((int)op2[r1] * (int)op3[immIndex]) - ((int)op2[i1] * (int)op3[immIndex + 1]) + ((int)op2[r2] * (int)op3[immIndex + 2]) - ((int)op2[i2] * (int)op3[immIndex + 3]); + break; + case 1: + result += ((int)op2[r1] * (int)op3[immIndex + 1]) + ((int)op2[i1] * (int)op3[immIndex]) + ((int)op2[r2] * (int)op3[immIndex + 3]) + ((int)op2[i2] * (int)op3[immIndex + 2]); + break; + case 2: + result += ((int)op2[r1] * (int)op3[immIndex]) + ((int)op2[i1] * (int)op3[immIndex + 1]) + ((int)op2[r2] * (int)op3[immIndex + 2]) + ((int)op2[i2] * (int)op3[immIndex + 3]); + break; + case 3: + result += ((int)op2[r1] * (int)op3[immIndex + 1]) - ((int)op2[i1] * (int)op3[immIndex]) + ((int)op2[r2] * (int)op3[immIndex + 3]) - ((int)op2[i2] * (int)op3[immIndex + 2]); + break; + default: + throw new ArgumentOutOfRangeException(nameof(rotation), "Invalid rotation value."); + } + + return result; + } + + + public static long DotProductComplex(long op1, short[] op2, int s, short[] op3, byte rotation) + { + long result = op1; + + int r1 = s; + int i1 = s + 1; + int r2 = s + 2; + int i2 = s + 3; + + switch (rotation) + { + case 0: + result += ((long)op2[r1] * (long)op3[r1]) - ((long)op2[i1] * (long)op3[i1]) + ((long)op2[r2] * (long)op3[r2]) - ((long)op2[i2] * (long)op3[i2]); + break; + case 1: + result += ((long)op2[r1] * (long)op3[i1]) + ((long)op2[i1] * (long)op3[r1]) + ((long)op2[r2] * (long)op3[i2]) + ((long)op2[i2] * (long)op3[r2]); + break; + case 2: + result += ((long)op2[r1] * (long)op3[r1]) + ((long)op2[i1] * (long)op3[i1]) + ((long)op2[r2] * (long)op3[r2]) + ((long)op2[i2] * (long)op3[i2]); + break; + case 3: + result += ((long)op2[r1] * (long)op3[i1]) - ((long)op2[i1] * (long)op3[r1]) + ((long)op2[r2] * (long)op3[i2]) - ((long)op2[i2] * (long)op3[r2]); + break; + default: + throw new ArgumentOutOfRangeException(nameof(rotation), "Invalid rotation value."); + } + + return result; + } + + public static long DotProductComplexBySelectedIndex(long op1, short[] op2, int s, short[] op3, int immIndex, byte rotation) + { + long result = op1; + int r1 = s; + int i1 = s + 1; + int r2 = s + 2; + int i2 = s + 3; + + switch (rotation) + { + case 0: + result += ((long)op2[r1] * (long)op3[immIndex]) - ((long)op2[i1] * (long)op3[immIndex + 1]) + ((long)op2[r2] * (long)op3[immIndex + 2]) - ((long)op2[i2] * (long)op3[immIndex + 3]); + break; + case 1: + result += ((long)op2[r1] * (long)op3[immIndex + 1]) + ((long)op2[i1] * (long)op3[immIndex]) + ((long)op2[r2] * (long)op3[immIndex + 3]) + ((long)op2[i2] * (long)op3[immIndex + 2]); + break; + case 2: + result += ((long)op2[r1] * (long)op3[immIndex]) + ((long)op2[i1] * (long)op3[immIndex + 1]) + ((long)op2[r2] * (long)op3[immIndex + 2]) + ((long)op2[i2] * (long)op3[immIndex + 3]); + break; + case 3: + result += ((long)op2[r1] * (long)op3[immIndex + 1]) - ((long)op2[i1] * (long)op3[immIndex]) + ((long)op2[r2] * (long)op3[immIndex + 3]) - ((long)op2[i2] * (long)op3[immIndex + 2]); + break; + default: + throw new ArgumentOutOfRangeException(nameof(rotation), "Invalid rotation value."); + } + + return result; + } + public static int WhileLessThanMask(int op1, int op2) { return (op1 < op2) ? 1 : 0; diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/_SveImm2TernOpTestTemplate.template b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/_SveImm2TernOpTestTemplate.template index aaa8c0718bee08..b347522c05a587 100644 --- a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/_SveImm2TernOpTestTemplate.template +++ b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/_SveImm2TernOpTestTemplate.template @@ -100,11 +100,11 @@ namespace JIT.HardwareIntrinsics.Arm private ulong alignment; - public DataTable({Op1BaseType}[] inArray1, {Op1BaseType}[] inArray2, {Op1BaseType}[] inArray3, {RetBaseType}[] outArray, int alignment) + public DataTable({Op1BaseType}[] inArray1, {Op2BaseType}[] inArray2, {Op3BaseType}[] inArray3, {RetBaseType}[] outArray, int alignment) { int sizeOfinArray1 = inArray1.Length * Unsafe.SizeOf<{Op1BaseType}>(); - int sizeOfinArray2 = inArray2.Length * Unsafe.SizeOf<{Op1BaseType}>(); - int sizeOfinArray3 = inArray3.Length * Unsafe.SizeOf<{Op1BaseType}>(); + int sizeOfinArray2 = inArray2.Length * Unsafe.SizeOf<{Op2BaseType}>(); + int sizeOfinArray3 = inArray3.Length * Unsafe.SizeOf<{Op3BaseType}>(); int sizeOfoutArray = outArray.Length * Unsafe.SizeOf<{RetBaseType}>(); if ((alignment != 64 && alignment != 16 && alignment != 8) || (alignment * 2) < sizeOfinArray1 || (alignment * 2) < sizeOfinArray2 || (alignment * 2) < sizeOfinArray3 || (alignment * 2) < sizeOfoutArray) { @@ -124,8 +124,8 @@ namespace JIT.HardwareIntrinsics.Arm this.alignment = (ulong)alignment; Unsafe.CopyBlockUnaligned(ref Unsafe.AsRef(inArray1Ptr), ref Unsafe.As<{Op1BaseType}, byte>(ref inArray1[0]), (uint)sizeOfinArray1); - Unsafe.CopyBlockUnaligned(ref Unsafe.AsRef(inArray2Ptr), ref Unsafe.As<{Op1BaseType}, byte>(ref inArray2[0]), (uint)sizeOfinArray2); - Unsafe.CopyBlockUnaligned(ref Unsafe.AsRef(inArray3Ptr), ref Unsafe.As<{Op1BaseType}, byte>(ref inArray3[0]), (uint)sizeOfinArray3); + Unsafe.CopyBlockUnaligned(ref Unsafe.AsRef(inArray2Ptr), ref Unsafe.As<{Op2BaseType}, byte>(ref inArray2[0]), (uint)sizeOfinArray2); + Unsafe.CopyBlockUnaligned(ref Unsafe.AsRef(inArray3Ptr), ref Unsafe.As<{Op3BaseType}, byte>(ref inArray3[0]), (uint)sizeOfinArray3); } public void* inArray1Ptr => Align((byte*)(inHandle1.AddrOfPinnedObject().ToPointer()), alignment); @@ -150,8 +150,8 @@ namespace JIT.HardwareIntrinsics.Arm private struct TestStruct { public {Op1VectorType}<{Op1BaseType}> _fld1; - public {Op1VectorType}<{Op1BaseType}> _fld2; - public {Op1VectorType}<{Op1BaseType}> _fld3; + public {Op2VectorType}<{Op2BaseType}> _fld2; + public {Op3VectorType}<{Op3BaseType}> _fld3; public static TestStruct Create() { @@ -159,10 +159,10 @@ namespace JIT.HardwareIntrinsics.Arm for (var i = 0; i < Op1ElementCount; i++) { _data1[i] = {NextValueOp1}; } Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1VectorType}<{Op1BaseType}>, byte>(ref testStruct._fld1), ref Unsafe.As<{Op1BaseType}, byte>(ref _data1[0]), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>()); - for (var i = 0; i < Op1ElementCount; i++) { _data2[i] = {NextValueOp2}; } - Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1VectorType}<{Op1BaseType}>, byte>(ref testStruct._fld2), ref Unsafe.As<{Op1BaseType}, byte>(ref _data2[0]), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>()); - for (var i = 0; i < Op1ElementCount; i++) { _data3[i] = {NextValueOp3}; } - Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1VectorType}<{Op1BaseType}>, byte>(ref testStruct._fld3), ref Unsafe.As<{Op1BaseType}, byte>(ref _data3[0]), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>()); + for (var i = 0; i < Op2ElementCount; i++) { _data2[i] = {NextValueOp2}; } + Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op2VectorType}<{Op2BaseType}>, byte>(ref testStruct._fld2), ref Unsafe.As<{Op2BaseType}, byte>(ref _data2[0]), (uint)Unsafe.SizeOf<{Op2VectorType}<{Op2BaseType}>>()); + for (var i = 0; i < Op3ElementCount; i++) { _data3[i] = {NextValueOp3}; } + Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op3VectorType}<{Op3BaseType}>, byte>(ref testStruct._fld3), ref Unsafe.As<{Op3BaseType}, byte>(ref _data3[0]), (uint)Unsafe.SizeOf<{Op3VectorType}<{Op3BaseType}>>()); return testStruct; } @@ -179,20 +179,25 @@ namespace JIT.HardwareIntrinsics.Arm private static readonly int LargestVectorSize = {LargestVectorSize}; private static readonly int Op1ElementCount = Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>() / sizeof({Op1BaseType}); + private static readonly int Op2ElementCount = Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>() / sizeof({Op2BaseType}); + private static readonly int Op3ElementCount = Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>() / sizeof({Op3BaseType}); private static readonly int RetElementCount = Unsafe.SizeOf<{RetVectorType}<{RetBaseType}>>() / sizeof({RetBaseType}); private static readonly byte Imm1 = {Imm1}; private static readonly byte Imm2 = {Imm2}; - private static {Op1BaseType}[] _maskData = new {Op1BaseType}[Op1ElementCount]; + private static {RetBaseType}[] _maskData = new {Op1BaseType}[Op1ElementCount]; private static {Op1BaseType}[] _data1 = new {Op1BaseType}[Op1ElementCount]; - private static {Op1BaseType}[] _data2 = new {Op1BaseType}[Op1ElementCount]; - private static {Op1BaseType}[] _data3 = new {Op1BaseType}[Op1ElementCount]; + private static {Op2BaseType}[] _data2 = new {Op2BaseType}[Op2ElementCount]; + private static {Op3BaseType}[] _data3 = new {Op3BaseType}[Op3ElementCount]; - private {Op1VectorType}<{Op1BaseType}> _mask; + private {RetVectorType}<{RetBaseType}> _mask; private {Op1VectorType}<{Op1BaseType}> _fld1; - private {Op1VectorType}<{Op1BaseType}> _fld2; - private {Op1VectorType}<{Op1BaseType}> _fld3; - private {Op1VectorType}<{Op1BaseType}> _falseFld; + private {Op2VectorType}<{Op2BaseType}> _fld2; + private {Op3VectorType}<{Op3BaseType}> _fld3; + + private {RetVectorType}<{RetBaseType}> _trueFld; + private {RetVectorType}<{RetBaseType}> _falseFld; + private {RetVectorType}<{RetBaseType}> _fld2_retType; private DataTable _dataTable; @@ -200,19 +205,22 @@ namespace JIT.HardwareIntrinsics.Arm { Succeeded = true; - for (var i = 0; i < Op1ElementCount; i++) { _maskData[i] = ({Op1BaseType})({NextValueMask} % 2); } - Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1VectorType}<{Op1BaseType}>, byte>(ref _mask), ref Unsafe.As<{Op1BaseType}, byte>(ref _maskData[0]), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>()); + for (var i = 0; i < Op1ElementCount; i++) { _maskData[i] = ({RetBaseType})({NextValueMask} % 2); } + Unsafe.CopyBlockUnaligned(ref Unsafe.As<{RetVectorType}<{RetBaseType}>, byte>(ref _mask), ref Unsafe.As<{RetBaseType}, byte>(ref _maskData[0]), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>()); for (var i = 0; i < Op1ElementCount; i++) { _data1[i] = {NextValueOp1}; } Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1VectorType}<{Op1BaseType}>, byte>(ref _fld1), ref Unsafe.As<{Op1BaseType}, byte>(ref _data1[0]), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>()); for (var i = 0; i < Op1ElementCount; i++) { _data2[i] = {NextValueOp2}; } - Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1VectorType}<{Op1BaseType}>, byte>(ref _fld2), ref Unsafe.As<{Op1BaseType}, byte>(ref _data2[0]), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>()); + Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op2VectorType}<{Op2BaseType}>, byte>(ref _fld2), ref Unsafe.As<{Op2BaseType}, byte>(ref _data2[0]), (uint)Unsafe.SizeOf<{Op2VectorType}<{Op2BaseType}>>()); for (var i = 0; i < Op1ElementCount; i++) { _data3[i] = {NextValueOp3}; } - Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1VectorType}<{Op1BaseType}>, byte>(ref _fld3), ref Unsafe.As<{Op1BaseType}, byte>(ref _data3[0]), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>()); - Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1VectorType}<{Op1BaseType}>, byte>(ref _falseFld), ref Unsafe.As<{Op1BaseType}, byte>(ref _data3[0]), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>()); + Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op3VectorType}<{Op3BaseType}>, byte>(ref _fld3), ref Unsafe.As<{Op3BaseType}, byte>(ref _data3[0]), (uint)Unsafe.SizeOf<{Op3VectorType}<{Op3BaseType}>>()); + Unsafe.CopyBlockUnaligned(ref Unsafe.As<{RetVectorType}<{RetBaseType}>, byte>(ref _falseFld), ref Unsafe.As<{Op3BaseType}, byte>(ref _data3[0]), (uint)Unsafe.SizeOf<{RetVectorType}<{RetBaseType}>>()); + Unsafe.CopyBlockUnaligned(ref Unsafe.As<{RetVectorType}<{RetBaseType}>, byte>(ref _trueFld), ref Unsafe.As<{Op1BaseType}, byte>(ref _data1[0]), (uint)Unsafe.SizeOf<{RetVectorType}<{RetBaseType}>>()); + Unsafe.CopyBlockUnaligned(ref Unsafe.As<{RetVectorType}<{RetBaseType}>, byte>(ref _fld2_retType), ref Unsafe.As<{Op2BaseType}, byte>(ref _data2[0]), (uint)Unsafe.SizeOf<{RetVectorType}<{RetBaseType}>>()); + for (var i = 0; i < Op1ElementCount; i++) { _data1[i] = {NextValueOp1}; } - for (var i = 0; i < Op1ElementCount; i++) { _data2[i] = {NextValueOp2}; } - for (var i = 0; i < Op1ElementCount; i++) { _data3[i] = {NextValueOp3}; } + for (var i = 0; i < Op2ElementCount; i++) { _data2[i] = {NextValueOp2}; } + for (var i = 0; i < Op3ElementCount; i++) { _data3[i] = {NextValueOp3}; } _dataTable = new DataTable(_data1, _data2, _data3, new {RetBaseType}[RetElementCount], LargestVectorSize); } @@ -226,8 +234,8 @@ namespace JIT.HardwareIntrinsics.Arm var result = {Isa}.{Method}( Unsafe.Read<{Op1VectorType}<{Op1BaseType}>>(_dataTable.inArray1Ptr), - Unsafe.Read<{Op1VectorType}<{Op1BaseType}>>(_dataTable.inArray2Ptr), - Unsafe.Read<{Op1VectorType}<{Op1BaseType}>>(_dataTable.inArray3Ptr), + Unsafe.Read<{Op2VectorType}<{Op2BaseType}>>(_dataTable.inArray2Ptr), + Unsafe.Read<{Op3VectorType}<{Op3BaseType}>>(_dataTable.inArray3Ptr), {Imm1}, {Imm2} ); @@ -245,8 +253,8 @@ namespace JIT.HardwareIntrinsics.Arm { var result = {Isa}.{Method}( Unsafe.Read<{Op1VectorType}<{Op1BaseType}>>(_dataTable.inArray1Ptr), - Unsafe.Read<{Op1VectorType}<{Op1BaseType}>>(_dataTable.inArray2Ptr), - Unsafe.Read<{Op1VectorType}<{Op1BaseType}>>(_dataTable.inArray3Ptr), + Unsafe.Read<{Op2VectorType}<{Op2BaseType}>>(_dataTable.inArray2Ptr), + Unsafe.Read<{Op3VectorType}<{Op3BaseType}>>(_dataTable.inArray3Ptr), {InvalidImm1}, {Imm2} ); @@ -272,8 +280,8 @@ namespace JIT.HardwareIntrinsics.Arm { var result = {Isa}.{Method}( Unsafe.Read<{Op1VectorType}<{Op1BaseType}>>(_dataTable.inArray1Ptr), - Unsafe.Read<{Op1VectorType}<{Op1BaseType}>>(_dataTable.inArray2Ptr), - Unsafe.Read<{Op1VectorType}<{Op1BaseType}>>(_dataTable.inArray3Ptr), + Unsafe.Read<{Op2VectorType}<{Op2BaseType}>>(_dataTable.inArray2Ptr), + Unsafe.Read<{Op3VectorType}<{Op3BaseType}>>(_dataTable.inArray3Ptr), {Imm1}, {InvalidImm2} ); @@ -294,12 +302,14 @@ namespace JIT.HardwareIntrinsics.Arm { TestLibrary.TestFramework.BeginScenario(nameof(RunBasicScenario_Load)); - {Op1VectorType}<{Op1BaseType}> loadMask = Sve.CreateTrueMask{RetBaseType}(SveMaskPattern.All); + {Op1VectorType}<{Op1BaseType}> loadMask1 = Sve.CreateTrueMask{Op1BaseType}(SveMaskPattern.All); + {Op2VectorType}<{Op2BaseType}> loadMask2 = Sve.CreateTrueMask{Op2BaseType}(SveMaskPattern.All); + {Op3VectorType}<{Op3BaseType}> loadMask3 = Sve.CreateTrueMask{Op3BaseType}(SveMaskPattern.All); var result = {Isa}.{Method}( - {LoadIsa}.Load{Op1VectorType}(loadMask, ({Op1BaseType}*)(_dataTable.inArray1Ptr)), - {LoadIsa}.Load{Op1VectorType}(loadMask, ({Op1BaseType}*)(_dataTable.inArray2Ptr)), - {LoadIsa}.Load{Op1VectorType}(loadMask, ({Op1BaseType}*)(_dataTable.inArray3Ptr)), + {LoadIsa}.Load{Op1VectorType}(loadMask1, ({Op1BaseType}*)(_dataTable.inArray1Ptr)), + {LoadIsa}.Load{Op2VectorType}(loadMask2, ({Op2BaseType}*)(_dataTable.inArray2Ptr)), + {LoadIsa}.Load{Op3VectorType}(loadMask3, ({Op3BaseType}*)(_dataTable.inArray3Ptr)), {Imm1}, {Imm2} ); @@ -312,11 +322,11 @@ namespace JIT.HardwareIntrinsics.Arm { TestLibrary.TestFramework.BeginScenario(nameof(RunReflectionScenario_UnsafeRead)); - var result = typeof({Isa}).GetMethod(nameof({Isa}.{Method}), new Type[] { typeof({Op1VectorType}<{Op1BaseType}>), typeof({Op1VectorType}<{Op1BaseType}>), typeof({Op1VectorType}<{Op1BaseType}>), typeof(byte), typeof(byte) }) + var result = typeof({Isa}).GetMethod(nameof({Isa}.{Method}), new Type[] { typeof({Op1VectorType}<{Op1BaseType}>), typeof({Op2VectorType}<{Op2BaseType}>), typeof({Op3VectorType}<{Op3BaseType}>), typeof(byte), typeof(byte) }) .Invoke(null, new object[] { Unsafe.Read<{Op1VectorType}<{Op1BaseType}>>(_dataTable.inArray1Ptr), - Unsafe.Read<{Op1VectorType}<{Op1BaseType}>>(_dataTable.inArray2Ptr), - Unsafe.Read<{Op1VectorType}<{Op1BaseType}>>(_dataTable.inArray3Ptr), + Unsafe.Read<{Op2VectorType}<{Op2BaseType}>>(_dataTable.inArray2Ptr), + Unsafe.Read<{Op3VectorType}<{Op3BaseType}>>(_dataTable.inArray3Ptr), (byte){Imm1}, (byte){Imm2} }); @@ -330,8 +340,8 @@ namespace JIT.HardwareIntrinsics.Arm TestLibrary.TestFramework.BeginScenario(nameof(RunLclVarScenario_UnsafeRead)); var op1 = Unsafe.Read<{Op1VectorType}<{Op1BaseType}>>(_dataTable.inArray1Ptr); - var op2 = Unsafe.Read<{Op1VectorType}<{Op1BaseType}>>(_dataTable.inArray2Ptr); - var op3 = Unsafe.Read<{Op1VectorType}<{Op1BaseType}>>(_dataTable.inArray3Ptr); + var op2 = Unsafe.Read<{Op2VectorType}<{Op2BaseType}>>(_dataTable.inArray2Ptr); + var op3 = Unsafe.Read<{Op3VectorType}<{Op3BaseType}>>(_dataTable.inArray3Ptr); var result = {Isa}.{Method}(op1, op2, op3, {Imm1}, {Imm2}); Unsafe.Write(_dataTable.outArrayPtr, result); @@ -370,64 +380,64 @@ namespace JIT.HardwareIntrinsics.Arm public void ConditionalSelect_Op1() { TestLibrary.TestFramework.BeginScenario("ConditionalSelect_Op1_mask - operation in TrueValue"); - ConditionalSelectScenario_TrueValue(_mask, _fld1, _fld2, _fld3, _fld1); + ConditionalSelectScenario_TrueValue(_mask, _fld1, _fld2, _fld3, _trueFld); TestLibrary.TestFramework.BeginScenario("ConditionalSelect_Op1_zero - operation in TrueValue"); - ConditionalSelectScenario_TrueValue({Op1VectorType}<{Op1BaseType}>.Zero, _fld1, _fld2, _fld3, _fld1); + ConditionalSelectScenario_TrueValue({RetVectorType}<{RetBaseType}>.Zero, _fld1, _fld2, _fld3, _trueFld); TestLibrary.TestFramework.BeginScenario("ConditionalSelect_Op1_all - operation in TrueValue"); - ConditionalSelectScenario_TrueValue({Op1VectorType}<{Op1BaseType}>.AllBitsSet, _fld1, _fld2, _fld3, _fld1); + ConditionalSelectScenario_TrueValue({RetVectorType}<{RetBaseType}>.AllBitsSet, _fld1, _fld2, _fld3, _trueFld); TestLibrary.TestFramework.BeginScenario("ConditionalSelect_Op1_mask - operation in FalseValue"); - ConditionalSelectScenario_FalseValue(_mask, _fld1, _fld2, _fld3, _fld1); + ConditionalSelectScenario_FalseValue(_mask, _fld1, _fld2, _fld3, _trueFld); TestLibrary.TestFramework.BeginScenario("ConditionalSelect_Op1_zero - operation in FalseValue"); - ConditionalSelectScenario_FalseValue({Op1VectorType}<{Op1BaseType}>.Zero, _fld1, _fld2, _fld3, _fld1); + ConditionalSelectScenario_FalseValue({RetVectorType}<{RetBaseType}>.Zero, _fld1, _fld2, _fld3, _trueFld); TestLibrary.TestFramework.BeginScenario("ConditionalSelect_Op1_all - operation in FalseValue"); - ConditionalSelectScenario_FalseValue({Op1VectorType}<{Op1BaseType}>.AllBitsSet, _fld1, _fld2, _fld3, _fld1); + ConditionalSelectScenario_FalseValue({RetVectorType}<{RetBaseType}>.AllBitsSet, _fld1, _fld2, _fld3, _trueFld); } public void ConditionalSelect_Op2() { TestLibrary.TestFramework.BeginScenario("ConditionalSelect_Op2_mask - operation in TrueValue"); - ConditionalSelectScenario_TrueValue(_mask, _fld1, _fld2, _fld3, _fld2); + ConditionalSelectScenario_TrueValue(_mask, _fld1, _fld2, _fld3, _fld2_retType); TestLibrary.TestFramework.BeginScenario("ConditionalSelect_Op2_zero - operation in TrueValue"); - ConditionalSelectScenario_TrueValue({Op1VectorType}<{Op1BaseType}>.Zero, _fld1, _fld2, _fld3, _fld2); + ConditionalSelectScenario_TrueValue({RetVectorType}<{RetBaseType}>.Zero, _fld1, _fld2, _fld3, _fld2_retType); TestLibrary.TestFramework.BeginScenario("ConditionalSelect_Op2_all - operation in TrueValue"); - ConditionalSelectScenario_TrueValue({Op1VectorType}<{Op1BaseType}>.AllBitsSet, _fld1, _fld2, _fld3, _fld2); + ConditionalSelectScenario_TrueValue({RetVectorType}<{RetBaseType}>.AllBitsSet, _fld1, _fld2, _fld3, _fld2_retType); TestLibrary.TestFramework.BeginScenario("ConditionalSelect_Op2_mask - operation in FalseValue"); - ConditionalSelectScenario_FalseValue(_mask, _fld1, _fld2, _fld3, _fld2); + ConditionalSelectScenario_FalseValue(_mask, _fld1, _fld2, _fld3, _fld2_retType); TestLibrary.TestFramework.BeginScenario("ConditionalSelect_Op2_zero - operation in FalseValue"); - ConditionalSelectScenario_FalseValue({Op1VectorType}<{Op1BaseType}>.Zero, _fld1, _fld2, _fld3, _fld2); + ConditionalSelectScenario_FalseValue({RetVectorType}<{RetBaseType}>.Zero, _fld1, _fld2, _fld3, _fld2_retType); TestLibrary.TestFramework.BeginScenario("ConditionalSelect_Op2_all - operation in FalseValue"); - ConditionalSelectScenario_FalseValue({Op1VectorType}<{Op1BaseType}>.AllBitsSet, _fld1, _fld2, _fld3, _fld2); + ConditionalSelectScenario_FalseValue({RetVectorType}<{RetBaseType}>.AllBitsSet, _fld1, _fld2, _fld3, _fld2_retType); } public void ConditionalSelect_Op3() { TestLibrary.TestFramework.BeginScenario("ConditionalSelect_Op3_mask - operation in TrueValue"); - ConditionalSelectScenario_TrueValue(_mask, _fld1, _fld2, _fld3, _fld3); + ConditionalSelectScenario_TrueValue(_mask, _fld1, _fld2, _fld3, _falseFld); TestLibrary.TestFramework.BeginScenario("ConditionalSelect_Op3_zero - operation in TrueValue"); - ConditionalSelectScenario_TrueValue({Op1VectorType}<{Op1BaseType}>.Zero, _fld1, _fld2, _fld3, _fld3); + ConditionalSelectScenario_TrueValue({RetVectorType}<{RetBaseType}>.Zero, _fld1, _fld2, _fld3, _falseFld); TestLibrary.TestFramework.BeginScenario("ConditionalSelect_Op3_all - operation in TrueValue"); - ConditionalSelectScenario_TrueValue({Op1VectorType}<{Op1BaseType}>.AllBitsSet, _fld1, _fld2, _fld3, _fld3); + ConditionalSelectScenario_TrueValue({RetVectorType}<{RetBaseType}>.AllBitsSet, _fld1, _fld2, _fld3, _falseFld); TestLibrary.TestFramework.BeginScenario("ConditionalSelect_Op3_mask - operation in FalseValue"); - ConditionalSelectScenario_FalseValue(_mask, _fld1, _fld2, _fld3, _fld3); + ConditionalSelectScenario_FalseValue(_mask, _fld1, _fld2, _fld3, _falseFld); TestLibrary.TestFramework.BeginScenario("ConditionalSelect_Op3_zero - operation in FalseValue"); - ConditionalSelectScenario_FalseValue({Op1VectorType}<{Op1BaseType}>.Zero, _fld1, _fld2, _fld3, _fld3); + ConditionalSelectScenario_FalseValue({RetVectorType}<{RetBaseType}>.Zero, _fld1, _fld2, _fld3, _falseFld); TestLibrary.TestFramework.BeginScenario("ConditionalSelect_Op3_all - operation in FalseValue"); - ConditionalSelectScenario_FalseValue({Op1VectorType}<{Op1BaseType}>.AllBitsSet, _fld1, _fld2, _fld3, _fld3); + ConditionalSelectScenario_FalseValue({RetVectorType}<{RetBaseType}>.AllBitsSet, _fld1, _fld2, _fld3, _falseFld); } public void ConditionalSelect_FalseOp() @@ -436,19 +446,19 @@ namespace JIT.HardwareIntrinsics.Arm ConditionalSelectScenario_TrueValue(_mask, _fld1, _fld2, _fld3, _falseFld); TestLibrary.TestFramework.BeginScenario("ConditionalSelect_FalseOp_zero - operation in TrueValue"); - ConditionalSelectScenario_TrueValue({Op1VectorType}<{Op1BaseType}>.Zero, _fld1, _fld2, _fld3, _falseFld); + ConditionalSelectScenario_TrueValue({RetVectorType}<{RetBaseType}>.Zero, _fld1, _fld2, _fld3, _falseFld); TestLibrary.TestFramework.BeginScenario("ConditionalSelect_FalseOp_all - operation in TrueValue"); - ConditionalSelectScenario_TrueValue({Op1VectorType}<{Op1BaseType}>.AllBitsSet, _fld1, _fld2, _fld3, _falseFld); + ConditionalSelectScenario_TrueValue({RetVectorType}<{RetBaseType}>.AllBitsSet, _fld1, _fld2, _fld3, _falseFld); TestLibrary.TestFramework.BeginScenario("ConditionalSelect_FalseOp_mask - operation in FalseValue"); ConditionalSelectScenario_FalseValue(_mask, _fld1, _fld2, _fld3, _falseFld); TestLibrary.TestFramework.BeginScenario("ConditionalSelect_FalseOp_zero - operation in FalseValue"); - ConditionalSelectScenario_FalseValue({Op1VectorType}<{Op1BaseType}>.Zero, _fld1, _fld2, _fld3, _falseFld); + ConditionalSelectScenario_FalseValue({RetVectorType}<{RetBaseType}>.Zero, _fld1, _fld2, _fld3, _falseFld); TestLibrary.TestFramework.BeginScenario("ConditionalSelect_FalseOp_all - operation in FalseValue"); - ConditionalSelectScenario_FalseValue({Op1VectorType}<{Op1BaseType}>.AllBitsSet, _fld1, _fld2, _fld3, _falseFld); + ConditionalSelectScenario_FalseValue({RetVectorType}<{RetBaseType}>.AllBitsSet, _fld1, _fld2, _fld3, _falseFld); } public void ConditionalSelect_ZeroOp() @@ -457,23 +467,23 @@ namespace JIT.HardwareIntrinsics.Arm ConditionalSelectScenario_TrueValue(_mask, _fld1, _fld2, _fld3, {Op1VectorType}<{Op1BaseType}>.Zero); TestLibrary.TestFramework.BeginScenario("ConditionalSelect_ZeroOp_zero - operation in TrueValue"); - ConditionalSelectScenario_TrueValue({Op1VectorType}<{Op1BaseType}>.Zero, _fld1, _fld2, _fld3, {Op1VectorType}<{Op1BaseType}>.Zero); + ConditionalSelectScenario_TrueValue({RetVectorType}<{RetBaseType}>.Zero, _fld1, _fld2, _fld3, {RetVectorType}<{RetBaseType}>.Zero); TestLibrary.TestFramework.BeginScenario("ConditionalSelect_ZeroOp_all - operation in TrueValue"); - ConditionalSelectScenario_TrueValue({Op1VectorType}<{Op1BaseType}>.AllBitsSet, _fld1, _fld2, _fld3, {Op1VectorType}<{Op1BaseType}>.Zero); + ConditionalSelectScenario_TrueValue({RetVectorType}<{RetBaseType}>.AllBitsSet, _fld1, _fld2, _fld3, {RetVectorType}<{RetBaseType}>.Zero); TestLibrary.TestFramework.BeginScenario("ConditionalSelect_ZeroOp_mask - operation in FalseValue"); ConditionalSelectScenario_FalseValue(_mask, _fld1, _fld2, _fld3, {Op1VectorType}<{Op1BaseType}>.Zero); TestLibrary.TestFramework.BeginScenario("ConditionalSelect_ZeroOp_zero - operation in FalseValue"); - ConditionalSelectScenario_FalseValue({Op1VectorType}<{Op1BaseType}>.Zero, _fld1, _fld2, _fld3, {Op1VectorType}<{Op1BaseType}>.Zero); + ConditionalSelectScenario_FalseValue({RetVectorType}<{RetBaseType}>.Zero, _fld1, _fld2, _fld3, {RetVectorType}<{RetBaseType}>.Zero); TestLibrary.TestFramework.BeginScenario("ConditionalSelect_ZeroOp_all - operation in FalseValue"); - ConditionalSelectScenario_FalseValue({Op1VectorType}<{Op1BaseType}>.AllBitsSet, _fld1, _fld2, _fld3, {Op1VectorType}<{Op1BaseType}>.Zero); + ConditionalSelectScenario_FalseValue({RetVectorType}<{RetBaseType}>.AllBitsSet, _fld1, _fld2, _fld3, {RetVectorType}<{RetBaseType}>.Zero); } [method: MethodImpl(MethodImplOptions.AggressiveInlining)] - private void ConditionalSelectScenario_TrueValue({Op1VectorType}<{Op1BaseType}> mask, {Op1VectorType}<{Op1BaseType}> op1, {Op1VectorType}<{Op1BaseType}> op2, {Op1VectorType}<{Op1BaseType}> op3, {Op1VectorType}<{Op1BaseType}> falseOp) + private void ConditionalSelectScenario_TrueValue({RetVectorType}<{RetBaseType}> mask, {Op1VectorType}<{Op1BaseType}> op1, {Op2VectorType}<{Op2BaseType}> op2, {Op3VectorType}<{Op3BaseType}> op3, {RetVectorType}<{RetBaseType}> falseOp) { var result = Sve.ConditionalSelect(mask, {Isa}.{Method}(op1, op2, op3, {Imm1}, {Imm2}), falseOp); Unsafe.Write(_dataTable.outArrayPtr, result); @@ -481,7 +491,7 @@ namespace JIT.HardwareIntrinsics.Arm } [method: MethodImpl(MethodImplOptions.AggressiveInlining)] - private void ConditionalSelectScenario_FalseValue({Op1VectorType}<{Op1BaseType}> mask, {Op1VectorType}<{Op1BaseType}> op1, {Op1VectorType}<{Op1BaseType}> op2, {Op1VectorType}<{Op1BaseType}> op3, {Op1VectorType}<{Op1BaseType}> trueOp) + private void ConditionalSelectScenario_FalseValue({RetVectorType}<{RetBaseType}> mask, {Op1VectorType}<{Op1BaseType}> op1, {Op2VectorType}<{Op2BaseType}> op2, {Op3VectorType}<{Op3BaseType}> op3, {RetVectorType}<{RetBaseType}> trueOp) { var result = Sve.ConditionalSelect(mask, trueOp, {Isa}.{Method}(op1, op2, op3, {Imm1}, {Imm2})); Unsafe.Write(_dataTable.outArrayPtr, result); @@ -509,25 +519,25 @@ namespace JIT.HardwareIntrinsics.Arm } } - private void ValidateConditionalSelectResult_TrueValue({Op1VectorType}<{Op1BaseType}> maskOp, {Op1VectorType}<{Op1BaseType}> firstOp, {Op1VectorType}<{Op1BaseType}> secondOp, {Op1VectorType}<{Op1BaseType}> thirdOp, {Op1VectorType}<{Op1BaseType}> falseOp, void* output, [CallerMemberName] string method = "") + private void ValidateConditionalSelectResult_TrueValue({RetVectorType}<{RetBaseType}> maskOp, {Op1VectorType}<{Op1BaseType}> firstOp, {Op2VectorType}<{Op2BaseType}> secondOp, {Op3VectorType}<{Op3BaseType}> thirdOp, {RetVectorType}<{RetBaseType}> falseOp, void* output, [CallerMemberName] string method = "") { - {Op1BaseType}[] mask = new {Op1BaseType}[Op1ElementCount]; + {RetBaseType}[] mask = new {RetBaseType}[RetElementCount]; {Op1BaseType}[] first = new {Op1BaseType}[Op1ElementCount]; - {Op1BaseType}[] second = new {Op1BaseType}[Op1ElementCount]; - {Op1BaseType}[] third = new {Op1BaseType}[Op1ElementCount]; - {Op1BaseType}[] falseVal = new {Op1BaseType}[Op1ElementCount]; + {Op2BaseType}[] second = new {Op2BaseType}[Op2ElementCount]; + {Op3BaseType}[] third = new {Op3BaseType}[Op3ElementCount]; + {RetBaseType}[] falseVal = new {Op1BaseType}[Op1ElementCount]; {RetBaseType}[] result = new {RetBaseType}[RetElementCount]; - Unsafe.WriteUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref mask[0]), maskOp); + Unsafe.WriteUnaligned(ref Unsafe.As<{RetBaseType}, byte>(ref mask[0]), maskOp); Unsafe.WriteUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref first[0]), firstOp); - Unsafe.WriteUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref second[0]), secondOp); - Unsafe.WriteUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref third[0]), thirdOp); - Unsafe.WriteUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref falseVal[0]), falseOp); + Unsafe.WriteUnaligned(ref Unsafe.As<{Op2BaseType}, byte>(ref second[0]), secondOp); + Unsafe.WriteUnaligned(ref Unsafe.As<{Op3BaseType}, byte>(ref third[0]), thirdOp); + Unsafe.WriteUnaligned(ref Unsafe.As<{RetBaseType}, byte>(ref falseVal[0]), falseOp); Unsafe.CopyBlockUnaligned(ref Unsafe.As<{RetBaseType}, byte>(ref result[0]), ref Unsafe.AsRef(output), (uint)Unsafe.SizeOf<{RetVectorType}<{RetBaseType}>>()); bool succeeded = true; {TemplateValidationLogicForCndSel} if (!succeeded) { - TestLibrary.TestFramework.LogInformation($"{nameof({Isa})}.{nameof({Isa}.{Method})}<{RetBaseType}>({Op1VectorType}<{Op1BaseType}>, {Op1VectorType}<{Op1BaseType}>, {Op1VectorType}<{Op1BaseType}>): {method} failed:"); + TestLibrary.TestFramework.LogInformation($"{nameof({Isa})}.{nameof({Isa}.{Method})}<{RetBaseType}>({Op1VectorType}<{Op1BaseType}>, {Op2VectorType}<{Op2BaseType}>, {Op3VectorType}<{Op3BaseType}>): {method} failed:"); TestLibrary.TestFramework.LogInformation($" mask: ({string.Join(", ", mask)})"); TestLibrary.TestFramework.LogInformation($" first: ({string.Join(", ", first)})"); TestLibrary.TestFramework.LogInformation($" second: ({string.Join(", ", second)})"); @@ -539,27 +549,28 @@ namespace JIT.HardwareIntrinsics.Arm } } - private void ValidateConditionalSelectResult_FalseValue({Op1VectorType}<{Op1BaseType}> maskOp, {Op1VectorType}<{Op1BaseType}> firstOp, {Op1VectorType}<{Op1BaseType}> secondOp, {Op1VectorType}<{Op1BaseType}> thirdOp, {Op1VectorType}<{Op1BaseType}> trueOp, void* output, [CallerMemberName] string method = "") + private void ValidateConditionalSelectResult_FalseValue({RetVectorType}<{RetBaseType}> maskOp, {Op1VectorType}<{Op1BaseType}> firstOp, {Op2VectorType}<{Op2BaseType}> secondOp, {Op3VectorType}<{Op3BaseType}> thirdOp, {RetVectorType}<{RetBaseType}> trueOp, void* output, [CallerMemberName] string method = "") { - {Op1BaseType}[] mask = new {Op1BaseType}[Op1ElementCount]; + {RetBaseType}[] mask = new {RetBaseType}[RetElementCount]; {Op1BaseType}[] first = new {Op1BaseType}[Op1ElementCount]; - {Op1BaseType}[] second = new {Op1BaseType}[Op1ElementCount]; - {Op1BaseType}[] third = new {Op1BaseType}[Op1ElementCount]; - {Op1BaseType}[] trueVal = new {Op1BaseType}[Op1ElementCount]; + {Op2BaseType}[] second = new {Op2BaseType}[Op2ElementCount]; + {Op3BaseType}[] third = new {Op3BaseType}[Op3ElementCount]; + {RetBaseType}[] trueVal = new {RetBaseType}[RetElementCount]; {RetBaseType}[] result = new {RetBaseType}[RetElementCount]; - Unsafe.WriteUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref mask[0]), maskOp); + Unsafe.WriteUnaligned(ref Unsafe.As<{RetBaseType}, byte>(ref mask[0]), maskOp); Unsafe.WriteUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref first[0]), firstOp); - Unsafe.WriteUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref second[0]), secondOp); - Unsafe.WriteUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref third[0]), thirdOp); - Unsafe.WriteUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref trueVal[0]), trueOp); + Unsafe.WriteUnaligned(ref Unsafe.As<{Op2BaseType}, byte>(ref second[0]), secondOp); + Unsafe.WriteUnaligned(ref Unsafe.As<{Op3BaseType}, byte>(ref third[0]), thirdOp); + Unsafe.WriteUnaligned(ref Unsafe.As<{RetBaseType}, byte>(ref trueVal[0]), trueOp); Unsafe.CopyBlockUnaligned(ref Unsafe.As<{RetBaseType}, byte>(ref result[0]), ref Unsafe.AsRef(output), (uint)Unsafe.SizeOf<{RetVectorType}<{RetBaseType}>>()); + bool succeeded = true; {TemplateValidationLogicForCndSel_FalseValue} - + if (!succeeded) { - TestLibrary.TestFramework.LogInformation($"{nameof({Isa})}.{nameof({Isa}.{Method})}<{RetBaseType}>({Op1VectorType}<{Op1BaseType}>, {Op1VectorType}<{Op1BaseType}>, {Op1VectorType}<{Op1BaseType}>): {method} failed:"); + TestLibrary.TestFramework.LogInformation($"{nameof({Isa})}.{nameof({Isa}.{Method})}<{RetBaseType}>({Op1VectorType}<{Op1BaseType}>, {Op2VectorType}<{Op2BaseType}>, {Op3VectorType}<{Op3BaseType}>): {method} failed:"); TestLibrary.TestFramework.LogInformation($" mask: ({string.Join(", ", mask)})"); TestLibrary.TestFramework.LogInformation($" first: ({string.Join(", ", first)})"); TestLibrary.TestFramework.LogInformation($" second: ({string.Join(", ", second)})"); @@ -571,16 +582,16 @@ namespace JIT.HardwareIntrinsics.Arm } } - private void ValidateResult({Op1VectorType}<{Op1BaseType}> op1, {Op1VectorType}<{Op1BaseType}> op2, {Op1VectorType}<{Op1BaseType}> op3, void* result, [CallerMemberName] string method = "") + private void ValidateResult({Op1VectorType}<{Op1BaseType}> op1, {Op2VectorType}<{Op2BaseType}> op2, {Op3VectorType}<{Op3BaseType}> op3, void* result, [CallerMemberName] string method = "") { {Op1BaseType}[] inArray1 = new {Op1BaseType}[Op1ElementCount]; - {Op1BaseType}[] inArray2 = new {Op1BaseType}[Op1ElementCount]; - {Op1BaseType}[] inArray3 = new {Op1BaseType}[Op1ElementCount]; + {Op2BaseType}[] inArray2 = new {Op2BaseType}[Op2ElementCount]; + {Op3BaseType}[] inArray3 = new {Op3BaseType}[Op3ElementCount]; {RetBaseType}[] outArray = new {RetBaseType}[RetElementCount]; Unsafe.WriteUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref inArray1[0]), op1); - Unsafe.WriteUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref inArray2[0]), op2); - Unsafe.WriteUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref inArray3[0]), op3); + Unsafe.WriteUnaligned(ref Unsafe.As<{Op2BaseType}, byte>(ref inArray2[0]), op2); + Unsafe.WriteUnaligned(ref Unsafe.As<{Op3BaseType}, byte>(ref inArray3[0]), op3); Unsafe.CopyBlockUnaligned(ref Unsafe.As<{RetBaseType}, byte>(ref outArray[0]), ref Unsafe.AsRef(result), (uint)Unsafe.SizeOf<{RetVectorType}<{RetBaseType}>>()); ValidateResult(inArray1, inArray2, inArray3, outArray, method); @@ -589,19 +600,19 @@ namespace JIT.HardwareIntrinsics.Arm private void ValidateResult(void* op1, void* op2, void* op3, void* result, [CallerMemberName] string method = "") { {Op1BaseType}[] inArray1 = new {Op1BaseType}[Op1ElementCount]; - {Op1BaseType}[] inArray2 = new {Op1BaseType}[Op1ElementCount]; - {Op1BaseType}[] inArray3 = new {Op1BaseType}[Op1ElementCount]; + {Op2BaseType}[] inArray2 = new {Op2BaseType}[Op2ElementCount]; + {Op3BaseType}[] inArray3 = new {Op3BaseType}[Op3ElementCount]; {RetBaseType}[] outArray = new {RetBaseType}[RetElementCount]; Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref inArray1[0]), ref Unsafe.AsRef(op1), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>()); - Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref inArray2[0]), ref Unsafe.AsRef(op2), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>()); - Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref inArray3[0]), ref Unsafe.AsRef(op3), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>()); + Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op2BaseType}, byte>(ref inArray2[0]), ref Unsafe.AsRef(op2), (uint)Unsafe.SizeOf<{Op2VectorType}<{Op2BaseType}>>()); + Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op3BaseType}, byte>(ref inArray3[0]), ref Unsafe.AsRef(op3), (uint)Unsafe.SizeOf<{Op3VectorType}<{Op3BaseType}>>()); Unsafe.CopyBlockUnaligned(ref Unsafe.As<{RetBaseType}, byte>(ref outArray[0]), ref Unsafe.AsRef(result), (uint)Unsafe.SizeOf<{RetVectorType}<{RetBaseType}>>()); ValidateResult(inArray1, inArray2, inArray3, outArray, method); } - private void ValidateResult({Op1BaseType}[] firstOp, {Op1BaseType}[] secondOp, {Op1BaseType}[] thirdOp, {RetBaseType}[] result, [CallerMemberName] string method = "") + private void ValidateResult({Op1BaseType}[] firstOp, {Op2BaseType}[] secondOp, {Op3BaseType}[] thirdOp, {RetBaseType}[] result, [CallerMemberName] string method = "") { bool succeeded = true; From 471dab6820c19ddaa8b45d7f68e47fcf2ca95241 Mon Sep 17 00:00:00 2001 From: Jacob Crawley Date: Wed, 16 Jul 2025 16:40:07 +0100 Subject: [PATCH 2/4] Renaming to DotProductRotateComplex --- src/coreclr/jit/hwintrinsic.h | 2 +- src/coreclr/jit/hwintrinsicarm64.cpp | 6 +- src/coreclr/jit/hwintrinsiccodegenarm64.cpp | 4 +- src/coreclr/jit/hwintrinsiclistarm64sve.h | 4 +- src/coreclr/jit/lowerarmarch.cpp | 4 +- src/coreclr/jit/lsraarm64.cpp | 8 +-- .../Arm/Sve2.PlatformNotSupported.cs | 8 +-- .../src/System/Runtime/Intrinsics/Arm/Sve2.cs | 8 +-- .../ref/System.Runtime.Intrinsics.cs | 8 +-- .../GenerateHWIntrinsicTests_Arm.cs | 70 +++++++++---------- .../HardwareIntrinsics/Arm/Shared/Helpers.cs | 8 +-- 11 files changed, 65 insertions(+), 65 deletions(-) diff --git a/src/coreclr/jit/hwintrinsic.h b/src/coreclr/jit/hwintrinsic.h index 47b1b0e29d20be..2929430ac566c2 100644 --- a/src/coreclr/jit/hwintrinsic.h +++ b/src/coreclr/jit/hwintrinsic.h @@ -1275,7 +1275,7 @@ struct HWIntrinsicInfo } case NI_Sve_MultiplyAddRotateComplexBySelectedScalar: - case NI_Sve2_DotProductComplexBySelectedIndex: + case NI_Sve2_DotProductRotateComplexBySelectedIndex: { assert(sig->numArgs == 5); *imm1Pos = 0; diff --git a/src/coreclr/jit/hwintrinsicarm64.cpp b/src/coreclr/jit/hwintrinsicarm64.cpp index abc908c069d42a..ef8e766249b4c0 100644 --- a/src/coreclr/jit/hwintrinsicarm64.cpp +++ b/src/coreclr/jit/hwintrinsicarm64.cpp @@ -485,7 +485,7 @@ void HWIntrinsicInfo::lookupImmBounds( break; case NI_Sve_MultiplyAddRotateComplex: - case NI_Sve2_DotProductComplex: + case NI_Sve2_DotProductRotateComplex: immLowerBound = 0; immUpperBound = 3; break; @@ -511,7 +511,7 @@ void HWIntrinsicInfo::lookupImmBounds( } break; - case NI_Sve2_DotProductComplexBySelectedIndex: + case NI_Sve2_DotProductRotateComplexBySelectedIndex: if (immNumber == 1) { // Bounds for rotation @@ -3215,7 +3215,7 @@ GenTree* Compiler::impSpecialIntrinsic(NamedIntrinsic intrinsic, } case NI_Sve_MultiplyAddRotateComplexBySelectedScalar: - case NI_Sve2_DotProductComplexBySelectedIndex: + case NI_Sve2_DotProductRotateComplexBySelectedIndex: { assert(sig->numArgs == 5); assert(!isScalar); diff --git a/src/coreclr/jit/hwintrinsiccodegenarm64.cpp b/src/coreclr/jit/hwintrinsiccodegenarm64.cpp index 75cb5ddb98a0b1..2991e4c5ffc866 100644 --- a/src/coreclr/jit/hwintrinsiccodegenarm64.cpp +++ b/src/coreclr/jit/hwintrinsiccodegenarm64.cpp @@ -2737,7 +2737,7 @@ void CodeGen::genHWIntrinsic(GenTreeHWIntrinsic* node) GetEmitter()->emitInsSve_R_R_R(ins, emitSize, targetReg, op3Reg, op1Reg, INS_OPTS_SCALABLE_D); break; - case NI_Sve2_DotProductComplex: + case NI_Sve2_DotProductRotateComplex: { assert(isRMW); assert(hasImmediateOperand); @@ -2758,7 +2758,7 @@ void CodeGen::genHWIntrinsic(GenTreeHWIntrinsic* node) break; } - case NI_Sve2_DotProductComplexBySelectedIndex: + case NI_Sve2_DotProductRotateComplexBySelectedIndex: { assert(isRMW); assert(hasImmediateOperand); diff --git a/src/coreclr/jit/hwintrinsiclistarm64sve.h b/src/coreclr/jit/hwintrinsiclistarm64sve.h index e0b97ac1d5918e..7f1d8eab022c87 100644 --- a/src/coreclr/jit/hwintrinsiclistarm64sve.h +++ b/src/coreclr/jit/hwintrinsiclistarm64sve.h @@ -336,8 +336,8 @@ HARDWARE_INTRINSIC(Sve2, BitwiseClearXor, HARDWARE_INTRINSIC(Sve2, BitwiseSelect, -1, 3, {INS_sve_bsl, INS_sve_bsl, INS_sve_bsl, INS_sve_bsl, INS_sve_bsl, INS_sve_bsl, INS_sve_bsl, INS_sve_bsl, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_HasRMWSemantics) HARDWARE_INTRINSIC(Sve2, BitwiseSelectLeftInverted, -1, 3, {INS_sve_bsl1n, INS_sve_bsl1n, INS_sve_bsl1n, INS_sve_bsl1n, INS_sve_bsl1n, INS_sve_bsl1n, INS_sve_bsl1n, INS_sve_bsl1n, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_HasRMWSemantics) HARDWARE_INTRINSIC(Sve2, BitwiseSelectRightInverted, -1, 3, {INS_sve_bsl2n, INS_sve_bsl2n, INS_sve_bsl2n, INS_sve_bsl2n, INS_sve_bsl2n, INS_sve_bsl2n, INS_sve_bsl2n, INS_sve_bsl2n, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_HasRMWSemantics) -HARDWARE_INTRINSIC(Sve2, DotProductComplex, -1, 4, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_cdot, INS_invalid, INS_sve_cdot, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_HasRMWSemantics|HW_Flag_SpecialCodeGen|HW_Flag_HasImmediateOperand) -HARDWARE_INTRINSIC(Sve2, DotProductComplexBySelectedIndex, -1, 5, {INS_sve_cdot, INS_invalid, INS_sve_cdot, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_HasRMWSemantics|HW_Flag_SpecialCodeGen|HW_Flag_HasImmediateOperand|HW_Flag_LowVectorOperation|HW_Flag_SpecialImport|HW_Flag_BaseTypeFromSecondArg) +HARDWARE_INTRINSIC(Sve2, DotProductRotateComplex, -1, 4, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_cdot, INS_invalid, INS_sve_cdot, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_HasRMWSemantics|HW_Flag_SpecialCodeGen|HW_Flag_HasImmediateOperand) +HARDWARE_INTRINSIC(Sve2, DotProductRotateComplexBySelectedIndex, -1, 5, {INS_sve_cdot, INS_invalid, INS_sve_cdot, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_HasRMWSemantics|HW_Flag_SpecialCodeGen|HW_Flag_HasImmediateOperand|HW_Flag_LowVectorOperation|HW_Flag_SpecialImport|HW_Flag_BaseTypeFromSecondArg) HARDWARE_INTRINSIC(Sve2, FusedAddHalving, -1, -1, {INS_sve_shadd, INS_sve_uhadd, INS_sve_shadd, INS_sve_uhadd, INS_sve_shadd, INS_sve_uhadd, INS_sve_shadd, INS_sve_uhadd, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_HasRMWSemantics|HW_Flag_LowMaskedOperation) HARDWARE_INTRINSIC(Sve2, FusedAddRoundedHalving, -1, -1, {INS_sve_srhadd, INS_sve_urhadd, INS_sve_srhadd, INS_sve_urhadd, INS_sve_srhadd, INS_sve_urhadd, INS_sve_srhadd, INS_sve_urhadd, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_HasRMWSemantics|HW_Flag_LowMaskedOperation) HARDWARE_INTRINSIC(Sve2, FusedSubtractHalving, -1, -1, {INS_sve_shsub, INS_sve_uhsub, INS_sve_shsub, INS_sve_uhsub, INS_sve_shsub, INS_sve_uhsub, INS_sve_shsub, INS_sve_uhsub, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_HasRMWSemantics|HW_Flag_LowMaskedOperation) diff --git a/src/coreclr/jit/lowerarmarch.cpp b/src/coreclr/jit/lowerarmarch.cpp index 541169efc6dbb6..1bf875c48bb304 100644 --- a/src/coreclr/jit/lowerarmarch.cpp +++ b/src/coreclr/jit/lowerarmarch.cpp @@ -4091,7 +4091,7 @@ void Lowering::ContainCheckHWIntrinsic(GenTreeHWIntrinsic* node) case NI_Sve_FusedMultiplyAddBySelectedScalar: case NI_Sve_FusedMultiplySubtractBySelectedScalar: case NI_Sve_MultiplyAddRotateComplex: - case NI_Sve2_DotProductComplex: + case NI_Sve2_DotProductRotateComplex: assert(hasImmediateOperand); assert(varTypeIsIntegral(intrin.op4)); if (intrin.op4->IsCnsIntOrI()) @@ -4149,7 +4149,7 @@ void Lowering::ContainCheckHWIntrinsic(GenTreeHWIntrinsic* node) break; case NI_Sve_MultiplyAddRotateComplexBySelectedScalar: - case NI_Sve2_DotProductComplexBySelectedIndex: + case NI_Sve2_DotProductRotateComplexBySelectedIndex: assert(hasImmediateOperand); assert(varTypeIsIntegral(intrin.op4)); assert(varTypeIsIntegral(intrin.op5)); diff --git a/src/coreclr/jit/lsraarm64.cpp b/src/coreclr/jit/lsraarm64.cpp index 93936db45d61cc..cab20aa0bcba44 100644 --- a/src/coreclr/jit/lsraarm64.cpp +++ b/src/coreclr/jit/lsraarm64.cpp @@ -1710,7 +1710,7 @@ void LinearScan::BuildHWIntrinsicImmediate(GenTreeHWIntrinsic* intrinsicTree, co break; case NI_Sve_MultiplyAddRotateComplexBySelectedScalar: - case NI_Sve2_DotProductComplexBySelectedIndex: + case NI_Sve2_DotProductRotateComplexBySelectedIndex: // This API has two immediates, one of which is used to index pairs of floats in a vector. // For a vector width of 128 bits, this means the index's range is [0, 1], // which means we will skip the above jump table register check, @@ -1735,7 +1735,7 @@ void LinearScan::BuildHWIntrinsicImmediate(GenTreeHWIntrinsic* intrinsicTree, co break; case NI_Sve_MultiplyAddRotateComplex: - case NI_Sve2_DotProductComplex: + case NI_Sve2_DotProductRotateComplex: needBranchTargetReg = !intrin.op4->isContainedIntOrIImmed(); break; @@ -2166,7 +2166,7 @@ SingleTypeRegSet LinearScan::getOperandCandidates(GenTreeHWIntrinsic* intrinsicT case NI_Sve_FusedMultiplyAddBySelectedScalar: case NI_Sve_FusedMultiplySubtractBySelectedScalar: case NI_Sve_MultiplyAddRotateComplexBySelectedScalar: - case NI_Sve2_DotProductComplexBySelectedIndex: + case NI_Sve2_DotProductRotateComplexBySelectedIndex: case NI_Sve2_MultiplyAddBySelectedScalar: case NI_Sve2_MultiplyBySelectedScalarWideningEvenAndAdd: case NI_Sve2_MultiplyBySelectedScalarWideningOddAndAdd: @@ -2188,7 +2188,7 @@ SingleTypeRegSet LinearScan::getOperandCandidates(GenTreeHWIntrinsic* intrinsicT if (isLowVectorOpNum) { unsigned baseElementSize = genTypeSize(intrin.baseType); - if (intrin.id == NI_Sve2_DotProductComplexBySelectedIndex) + if (intrin.id == NI_Sve2_DotProductRotateComplexBySelectedIndex) { baseElementSize = intrin.baseType == TYP_BYTE ? 4 : 8; } 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 0681e525a4a9dd..8b585ba71a2b5f 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 @@ -1087,25 +1087,25 @@ internal Arm64() { } /// svint32_t svcdot[_s32](svint32_t op1, svint8_t op2, svint8_t op3, uint64_t imm_rotation) /// CDOT Ztied1.S, Zop2.B, Zop3.B, #imm_rotation /// - public static Vector DotProductComplex(Vector op1, Vector op2, Vector op3, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) { throw new PlatformNotSupportedException(); } + public static Vector DotProductRotateComplex(Vector op1, Vector op2, Vector op3, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) { throw new PlatformNotSupportedException(); } /// /// svint64_t svcdot[_s64](svint64_t op1, svint16_t op2, svint16_t op3, uint64_t imm_rotation) /// CDOT Ztied1.D, Zop2.H, Zop3.H, #imm_rotation /// - public static Vector DotProductComplex(Vector op1, Vector op2, Vector op3, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) { throw new PlatformNotSupportedException(); } + public static Vector DotProductRotateComplex(Vector op1, Vector op2, Vector op3, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) { throw new PlatformNotSupportedException(); } /// /// svint32_t svcdot_lane[_s32](svint32_t op1, svint8_t op2, svint8_t op3, uint64_t imm_index, uint64_t imm_rotation) /// CDOT Ztied1.S, Zop2.B, Zop3.B[imm_index], #imm_rotation /// - public static Vector DotProductComplexBySelectedIndex(Vector op1, Vector op2, Vector op3, byte imm_index, [ConstantExpected] byte rotation) { throw new PlatformNotSupportedException(); } + public static Vector DotProductRotateComplexBySelectedIndex(Vector op1, Vector op2, Vector op3, [ConstantExpected(Min = 0, Max = (byte)(3))] byte imm_index, [ConstantExpected] byte rotation) { throw new PlatformNotSupportedException(); } /// /// svint64_t svcdot_lane[_s64](svint64_t op1, svint16_t op2, svint16_t op3, uint64_t imm_index, uint64_t imm_rotation) /// CDOT Ztied1.D, Zop2.H, Zop3.H[imm_index], #imm_rotation /// - public static Vector DotProductComplexBySelectedIndex(Vector op1, Vector op2, Vector op3, byte imm_index, [ConstantExpected] byte rotation) { throw new PlatformNotSupportedException(); } + public static Vector DotProductRotateComplexBySelectedIndex(Vector op1, Vector op2, Vector op3, [ConstantExpected(Min = 0, Max = (byte)(1))] byte imm_index, [ConstantExpected] byte rotation) { throw new PlatformNotSupportedException(); } // Halving add 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 cd516d0a64fc5c..e16d2adb1ad01a 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 @@ -1086,25 +1086,25 @@ internal Arm64() { } /// svint32_t svcdot[_s32](svint32_t op1, svint8_t op2, svint8_t op3, uint64_t imm_rotation) /// CDOT Ztied1.S, Zop2.B, Zop3.B, #imm_rotation /// - public static Vector DotProductComplex(Vector op1, Vector op2, Vector op3, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) => DotProductComplex(op1, op2, op3, rotation); + public static Vector DotProductRotateComplex(Vector op1, Vector op2, Vector op3, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) => DotProductRotateComplex(op1, op2, op3, rotation); /// /// svint64_t svcdot[_s64](svint64_t op1, svint16_t op2, svint16_t op3, uint64_t imm_rotation) /// CDOT Ztied1.D, Zop2.H, Zop3.H, #imm_rotation /// - public static Vector DotProductComplex(Vector op1, Vector op2, Vector op3, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) => DotProductComplex(op1, op2, op3, rotation); + public static Vector DotProductRotateComplex(Vector op1, Vector op2, Vector op3, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) => DotProductRotateComplex(op1, op2, op3, rotation); /// /// svint32_t svcdot_lane[_s32](svint32_t op1, svint8_t op2, svint8_t op3, uint64_t imm_index, uint64_t imm_rotation) /// CDOT Ztied1.S, Zop2.B, Zop3.B[imm_index], #imm_rotation /// - public static Vector DotProductComplexBySelectedIndex(Vector op1, Vector op2, Vector op3, [ConstantExpected(Min = 0, Max = (byte)(3))] byte imm_index, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) => DotProductComplexBySelectedIndex(op1, op2, op3, imm_index, rotation); + public static Vector DotProductRotateComplexBySelectedIndex(Vector op1, Vector op2, Vector op3, [ConstantExpected(Min = 0, Max = (byte)(3))] byte imm_index, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) => DotProductRotateComplexBySelectedIndex(op1, op2, op3, imm_index, rotation); /// /// svint64_t svcdot_lane[_s64](svint64_t op1, svint16_t op2, svint16_t op3, uint64_t imm_index, uint64_t imm_rotation) /// CDOT Ztied1.D, Zop2.H, Zop3.H[imm_index], #imm_rotation /// - public static Vector DotProductComplexBySelectedIndex(Vector op1, Vector op2, Vector op3, [ConstantExpected(Min = 0, Max = (byte)(1))] byte imm_index, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) => DotProductComplexBySelectedIndex(op1, op2, op3, imm_index, rotation); + public static Vector DotProductRotateComplexBySelectedIndex(Vector op1, Vector op2, Vector op3, [ConstantExpected(Min = 0, Max = (byte)(1))] byte imm_index, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) => DotProductRotateComplexBySelectedIndex(op1, op2, op3, imm_index, rotation); // Halving add 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 c178335a0bf17a..7f36679abb8029 100644 --- a/src/libraries/System.Runtime.Intrinsics/ref/System.Runtime.Intrinsics.cs +++ b/src/libraries/System.Runtime.Intrinsics/ref/System.Runtime.Intrinsics.cs @@ -6264,10 +6264,10 @@ internal Arm64() { } public static System.Numerics.Vector BitwiseSelectRightInverted(System.Numerics.Vector select, System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } public static System.Numerics.Vector BitwiseSelectRightInverted(System.Numerics.Vector select, System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } public static System.Numerics.Vector BitwiseSelectRightInverted(System.Numerics.Vector select, System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } - public static System.Numerics.Vector DotProductComplex(System.Numerics.Vector op1, System.Numerics.Vector op2, System.Numerics.Vector op3, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) { throw null; } - public static System.Numerics.Vector DotProductComplex(System.Numerics.Vector op1, System.Numerics.Vector op2, System.Numerics.Vector op3, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) { throw null; } - public static System.Numerics.Vector DotProductComplexBySelectedIndex(System.Numerics.Vector op1, System.Numerics.Vector op2, System.Numerics.Vector op3, byte imm_index, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) { throw null; } - public static System.Numerics.Vector DotProductComplexBySelectedIndex(System.Numerics.Vector op1, System.Numerics.Vector op2, System.Numerics.Vector op3, byte imm_index, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) { throw null; } + public static System.Numerics.Vector DotProductRotateComplex(System.Numerics.Vector op1, System.Numerics.Vector op2, System.Numerics.Vector op3, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) { throw null; } + public static System.Numerics.Vector DotProductRotateComplex(System.Numerics.Vector op1, System.Numerics.Vector op2, System.Numerics.Vector op3, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) { throw null; } + public static System.Numerics.Vector DotProductRotateComplexBySelectedIndex(System.Numerics.Vector op1, System.Numerics.Vector op2, System.Numerics.Vector op3, [ConstantExpected(Min = 0, Max = (byte)(3))] byte imm_index, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) { throw null; } + public static System.Numerics.Vector DotProductRotateComplexBySelectedIndex(System.Numerics.Vector op1, System.Numerics.Vector op2, System.Numerics.Vector op3, [ConstantExpected(Min = 0, Max = (byte)(1))] byte imm_index, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) { throw null; } public static System.Numerics.Vector FusedAddRoundedHalving(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } public static System.Numerics.Vector FusedAddRoundedHalving(System.Numerics.Vector left, System.Numerics.Vector right) { throw null; } public static System.Numerics.Vector FusedAddRoundedHalving(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 af2d1ae0ba5286..f4c4f204587da2 100644 --- a/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs +++ b/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs @@ -4996,41 +4996,41 @@ ("SveVecTernOpTest.template", new Dictionary { ["TestName"] = "Sve2_BitwiseSelectRightInverted_uint", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "BitwiseSelectRightInverted", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt32", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp3"] = "TestLibrary.Generator.GetUInt32()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "result[i] != Helpers.BitwiseSelectRightInverted(firstOp[i], secondOp[i], thirdOp[i])", ["GetIterResult"] = "Helpers.BitwiseSelectRightInverted(firstOp[i], secondOp[i], thirdOp[i])"}), ("SveVecTernOpTest.template", new Dictionary { ["TestName"] = "Sve2_BitwiseSelectRightInverted_ulong", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "BitwiseSelectRightInverted", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt64", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "UInt64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()", ["NextValueOp3"] = "TestLibrary.Generator.GetUInt64()", ["ConvertFunc"] = "", ["ValidateIterResult"] = "result[i] != Helpers.BitwiseSelectRightInverted(firstOp[i], secondOp[i], thirdOp[i])", ["GetIterResult"] = "Helpers.BitwiseSelectRightInverted(firstOp[i], secondOp[i], thirdOp[i])"}), - ("SveVecImmTernOpFirstArgTest.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplex_int_sbyte_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["Imm"] = "0", ["InvalidImm"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplex(first[i], second, 4 * i, third, Imm) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplex(first[i], second, 4 * i, third, Imm)"}), - ("SveVecImmTernOpFirstArgTest.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplex_int_sbyte_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["Imm"] = "1", ["InvalidImm"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplex(first[i], second, 4 * i, third, Imm) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplex(first[i], second, 4 * i, third, Imm)"}), - ("SveVecImmTernOpFirstArgTest.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplex_int_sbyte_2", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["Imm"] = "2", ["InvalidImm"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplex(first[i], second, 4 * i, third, Imm) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplex(first[i], second, 4 * i, third, Imm)"}), - ("SveVecImmTernOpFirstArgTest.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplex_int_sbyte_3", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["Imm"] = "3", ["InvalidImm"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplex(first[i], second, 4 * i, third, Imm) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplex(first[i], second, 4 * i, third, Imm)"}), - - ("SveVecImmTernOpFirstArgTest.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplex_long_short_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16",["Op4BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["Imm"] = "0", ["InvalidImm"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplex(first[i], second, 4 * i, third, Imm) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplex(first[i], second, 4 * i, third, Imm)"}), - ("SveVecImmTernOpFirstArgTest.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplex_long_short_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16",["Op4BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["Imm"] = "1", ["InvalidImm"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplex(first[i], second, 4 * i, third, Imm) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplex(first[i], second, 4 * i, third, Imm)"}), - ("SveVecImmTernOpFirstArgTest.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplex_long_short_2", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16",["Op4BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["Imm"] = "2", ["InvalidImm"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplex(first[i], second, 4 * i, third, Imm) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplex(first[i], second, 4 * i, third, Imm)"}), - ("SveVecImmTernOpFirstArgTest.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplex_long_short_3", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16",["Op4BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["Imm"] = "3", ["InvalidImm"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplex(first[i], second, 4 * i, third, Imm) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplex(first[i], second, 4 * i, third, Imm)"}), - - ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplexBySelectedIndex_int_sbyte_0_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()",["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "0", ["Imm2"] = "0", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), - ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplexBySelectedIndex_int_sbyte_0_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()",["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "0", ["Imm2"] = "1", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), - ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplexBySelectedIndex_int_sbyte_0_2", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()",["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "0", ["Imm2"] = "2", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), - ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplexBySelectedIndex_int_sbyte_0_3", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()",["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "0", ["Imm2"] = "3", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), - ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplexBySelectedIndex_int_sbyte_1_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()",["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "1", ["Imm2"] = "0", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), - ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplexBySelectedIndex_int_sbyte_1_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()",["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "1", ["Imm2"] = "1", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), - ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplexBySelectedIndex_int_sbyte_1_2", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()",["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "1", ["Imm2"] = "2", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), - ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplexBySelectedIndex_int_sbyte_1_3", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()",["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "1", ["Imm2"] = "3", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), - ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplexBySelectedIndex_int_sbyte_2_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()",["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "2", ["Imm2"] = "0", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), - ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplexBySelectedIndex_int_sbyte_2_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()",["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "2", ["Imm2"] = "1", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), - ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplexBySelectedIndex_int_sbyte_2_2", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()",["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "2", ["Imm2"] = "2", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), - ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplexBySelectedIndex_int_sbyte_2_3", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()",["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "2", ["Imm2"] = "3", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), - ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplexBySelectedIndex_int_sbyte_3_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()",["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "3", ["Imm2"] = "0", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), - ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplexBySelectedIndex_int_sbyte_3_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()",["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "3", ["Imm2"] = "1", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), - ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplexBySelectedIndex_int_sbyte_3_2", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()",["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "3", ["Imm2"] = "2", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), - ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplexBySelectedIndex_int_sbyte_3_3", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()",["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "3", ["Imm2"] = "3", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), - - ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplexBySelectedIndex_long_short_0_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()",["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "0", ["Imm2"] = "0", ["InvalidImm1"] = "2", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), - ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplexBySelectedIndex_long_short_0_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()",["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "0", ["Imm2"] = "1", ["InvalidImm1"] = "2", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), - ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplexBySelectedIndex_long_short_0_2", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()",["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "0", ["Imm2"] = "2", ["InvalidImm1"] = "2", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), - ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplexBySelectedIndex_long_short_0_3", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()",["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "0", ["Imm2"] = "3", ["InvalidImm1"] = "2", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), - ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplexBySelectedIndex_long_short_1_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()",["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "1", ["Imm2"] = "0", ["InvalidImm1"] = "2", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), - ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplexBySelectedIndex_long_short_1_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()",["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "1", ["Imm2"] = "1", ["InvalidImm1"] = "2", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), - ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplexBySelectedIndex_long_short_1_2", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()",["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "1", ["Imm2"] = "2", ["InvalidImm1"] = "2", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), - ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductComplexBySelectedIndex_long_short_1_3", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()",["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "1", ["Imm2"] = "3", ["InvalidImm1"] = "2", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), + ("SveVecImmTernOpFirstArgTest.template", new Dictionary { ["TestName"] = "Sve2_DotProductRotateComplex_int_sbyte_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["Imm"] = "0", ["InvalidImm"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductRotateComplex(first[i], second, 4 * i, third, Imm) != result[i]", ["GetIterResult"] = "Helpers.DotProductRotateComplex(first[i], second, 4 * i, third, Imm)"}), + ("SveVecImmTernOpFirstArgTest.template", new Dictionary { ["TestName"] = "Sve2_DotProductRotateComplex_int_sbyte_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["Imm"] = "1", ["InvalidImm"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductRotateComplex(first[i], second, 4 * i, third, Imm) != result[i]", ["GetIterResult"] = "Helpers.DotProductRotateComplex(first[i], second, 4 * i, third, Imm)"}), + ("SveVecImmTernOpFirstArgTest.template", new Dictionary { ["TestName"] = "Sve2_DotProductRotateComplex_int_sbyte_2", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["Imm"] = "2", ["InvalidImm"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductRotateComplex(first[i], second, 4 * i, third, Imm) != result[i]", ["GetIterResult"] = "Helpers.DotProductRotateComplex(first[i], second, 4 * i, third, Imm)"}), + ("SveVecImmTernOpFirstArgTest.template", new Dictionary { ["TestName"] = "Sve2_DotProductRotateComplex_int_sbyte_3", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["Imm"] = "3", ["InvalidImm"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductRotateComplex(first[i], second, 4 * i, third, Imm) != result[i]", ["GetIterResult"] = "Helpers.DotProductRotateComplex(first[i], second, 4 * i, third, Imm)"}), + + ("SveVecImmTernOpFirstArgTest.template", new Dictionary { ["TestName"] = "Sve2_DotProductRotateComplex_long_short_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16",["Op4BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["Imm"] = "0", ["InvalidImm"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductRotateComplex(first[i], second, 4 * i, third, Imm) != result[i]", ["GetIterResult"] = "Helpers.DotProductRotateComplex(first[i], second, 4 * i, third, Imm)"}), + ("SveVecImmTernOpFirstArgTest.template", new Dictionary { ["TestName"] = "Sve2_DotProductRotateComplex_long_short_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16",["Op4BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["Imm"] = "1", ["InvalidImm"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductRotateComplex(first[i], second, 4 * i, third, Imm) != result[i]", ["GetIterResult"] = "Helpers.DotProductRotateComplex(first[i], second, 4 * i, third, Imm)"}), + ("SveVecImmTernOpFirstArgTest.template", new Dictionary { ["TestName"] = "Sve2_DotProductRotateComplex_long_short_2", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16",["Op4BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["Imm"] = "2", ["InvalidImm"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductRotateComplex(first[i], second, 4 * i, third, Imm) != result[i]", ["GetIterResult"] = "Helpers.DotProductRotateComplex(first[i], second, 4 * i, third, Imm)"}), + ("SveVecImmTernOpFirstArgTest.template", new Dictionary { ["TestName"] = "Sve2_DotProductRotateComplex_long_short_3", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductRotateComplex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16",["Op4BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["Imm"] = "3", ["InvalidImm"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductRotateComplex(first[i], second, 4 * i, third, Imm) != result[i]", ["GetIterResult"] = "Helpers.DotProductRotateComplex(first[i], second, 4 * i, third, Imm)"}), + + ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductRotateComplexBySelectedIndex_int_sbyte_0_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductRotateComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()",["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "0", ["Imm2"] = "0", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductRotateComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductRotateComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), + ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductRotateComplexBySelectedIndex_int_sbyte_0_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductRotateComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()",["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "0", ["Imm2"] = "1", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductRotateComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductRotateComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), + ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductRotateComplexBySelectedIndex_int_sbyte_0_2", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductRotateComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()",["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "0", ["Imm2"] = "2", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductRotateComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductRotateComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), + ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductRotateComplexBySelectedIndex_int_sbyte_0_3", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductRotateComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()",["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "0", ["Imm2"] = "3", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductRotateComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductRotateComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), + ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductRotateComplexBySelectedIndex_int_sbyte_1_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductRotateComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()",["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "1", ["Imm2"] = "0", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductRotateComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductRotateComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), + ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductRotateComplexBySelectedIndex_int_sbyte_1_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductRotateComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()",["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "1", ["Imm2"] = "1", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductRotateComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductRotateComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), + ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductRotateComplexBySelectedIndex_int_sbyte_1_2", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductRotateComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()",["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "1", ["Imm2"] = "2", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductRotateComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductRotateComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), + ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductRotateComplexBySelectedIndex_int_sbyte_1_3", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductRotateComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()",["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "1", ["Imm2"] = "3", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductRotateComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductRotateComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), + ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductRotateComplexBySelectedIndex_int_sbyte_2_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductRotateComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()",["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "2", ["Imm2"] = "0", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductRotateComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductRotateComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), + ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductRotateComplexBySelectedIndex_int_sbyte_2_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductRotateComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()",["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "2", ["Imm2"] = "1", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductRotateComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductRotateComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), + ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductRotateComplexBySelectedIndex_int_sbyte_2_2", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductRotateComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()",["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "2", ["Imm2"] = "2", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductRotateComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductRotateComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), + ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductRotateComplexBySelectedIndex_int_sbyte_2_3", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductRotateComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()",["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "2", ["Imm2"] = "3", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductRotateComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductRotateComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), + ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductRotateComplexBySelectedIndex_int_sbyte_3_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductRotateComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()",["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "3", ["Imm2"] = "0", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductRotateComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductRotateComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), + ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductRotateComplexBySelectedIndex_int_sbyte_3_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductRotateComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()",["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "3", ["Imm2"] = "1", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductRotateComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductRotateComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), + ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductRotateComplexBySelectedIndex_int_sbyte_3_2", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductRotateComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()",["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "3", ["Imm2"] = "2", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductRotateComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductRotateComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), + ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductRotateComplexBySelectedIndex_int_sbyte_3_3", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductRotateComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "SByte", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "SByte", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()",["NextValueOp2"] = "TestLibrary.Generator.GetSByte()", ["NextValueOp3"] = "TestLibrary.Generator.GetSByte()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "3", ["Imm2"] = "3", ["InvalidImm1"] = "4", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductRotateComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductRotateComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), + + ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductRotateComplexBySelectedIndex_long_short_0_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductRotateComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()",["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "0", ["Imm2"] = "0", ["InvalidImm1"] = "2", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductRotateComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductRotateComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), + ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductRotateComplexBySelectedIndex_long_short_0_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductRotateComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()",["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "0", ["Imm2"] = "1", ["InvalidImm1"] = "2", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductRotateComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductRotateComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), + ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductRotateComplexBySelectedIndex_long_short_0_2", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductRotateComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()",["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "0", ["Imm2"] = "2", ["InvalidImm1"] = "2", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductRotateComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductRotateComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), + ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductRotateComplexBySelectedIndex_long_short_0_3", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductRotateComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()",["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "0", ["Imm2"] = "3", ["InvalidImm1"] = "2", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductRotateComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductRotateComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), + ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductRotateComplexBySelectedIndex_long_short_1_0", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductRotateComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()",["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "1", ["Imm2"] = "0", ["InvalidImm1"] = "2", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductRotateComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductRotateComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), + ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductRotateComplexBySelectedIndex_long_short_1_1", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductRotateComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()",["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "1", ["Imm2"] = "1", ["InvalidImm1"] = "2", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductRotateComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductRotateComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), + ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductRotateComplexBySelectedIndex_long_short_1_2", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductRotateComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()",["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "1", ["Imm2"] = "2", ["InvalidImm1"] = "2", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductRotateComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductRotateComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), + ("SveVecTernOpImm2Test.template", new Dictionary { ["TestName"] = "Sve2_DotProductRotateComplexBySelectedIndex_long_short_1_3", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "DotProductRotateComplexBySelectedIndex", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "Int16", ["Op3VectorType"] = "Vector", ["Op3BaseType"] = "Int16", ["Op4BaseType"] = "Byte", ["Op5BaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()",["NextValueOp2"] = "TestLibrary.Generator.GetInt16()", ["NextValueOp3"] = "TestLibrary.Generator.GetInt16()", ["NextValueMask"] = "Helpers.getMaskSingle()", ["Imm1"] = "1", ["Imm2"] = "3", ["InvalidImm1"] = "2", ["InvalidImm2"] = "4", ["ConvertFunc"] = "", ["ValidateIterResult"] = "Helpers.DotProductRotateComplexBySelectedIndex(firstOp[i], secondOp, 4 * i, thirdOp, Imm1 * 4, Imm2) != result[i]", ["GetIterResult"] = "Helpers.DotProductRotateComplexBySelectedIndex(first[i], second, 4 * i, third, Imm1 * 4, Imm2)"}), ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve2_FusedAddHalving_sbyte", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "FusedAddHalving", ["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.FusedAddHalving(left[i], right[i]) != result[i]", ["GetIterResult"] = "Helpers.FusedAddHalving(left[i], right[i])"}), ("SveVecBinOpTest.template", new Dictionary { ["TestName"] = "Sve2_FusedAddHalving_short", ["Isa"] = "Sve2", ["LoadIsa"] = "Sve2", ["Method"] = "FusedAddHalving", ["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.FusedAddHalving(left[i], right[i]) != result[i]", ["GetIterResult"] = "Helpers.FusedAddHalving(left[i], right[i])"}), diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Helpers.cs b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Helpers.cs index 9ac6aa47f449a5..b2b2804aecb3c9 100644 --- a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Helpers.cs +++ b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Helpers.cs @@ -8100,7 +8100,7 @@ public static long DotProduct(long op1, short[] op2, int s, short[] op3, int t) return result; } - public static int DotProductComplex(int op1, sbyte[] op2, int s, sbyte[] op3, byte rotation) + public static int DotProductRotateComplex(int op1, sbyte[] op2, int s, sbyte[] op3, byte rotation) { int result = op1; @@ -8130,7 +8130,7 @@ public static int DotProductComplex(int op1, sbyte[] op2, int s, sbyte[] op3, by return result; } - public static int DotProductComplexBySelectedIndex(int op1, sbyte[] op2, int s, sbyte[] op3, int immIndex, byte rotation) + public static int DotProductRotateComplexBySelectedIndex(int op1, sbyte[] op2, int s, sbyte[] op3, int immIndex, byte rotation) { int result = op1; int r1 = s; @@ -8160,7 +8160,7 @@ public static int DotProductComplexBySelectedIndex(int op1, sbyte[] op2, int s, } - public static long DotProductComplex(long op1, short[] op2, int s, short[] op3, byte rotation) + public static long DotProductRotateComplex(long op1, short[] op2, int s, short[] op3, byte rotation) { long result = op1; @@ -8190,7 +8190,7 @@ public static long DotProductComplex(long op1, short[] op2, int s, short[] op3, return result; } - public static long DotProductComplexBySelectedIndex(long op1, short[] op2, int s, short[] op3, int immIndex, byte rotation) + public static long DotProductRotateComplexBySelectedIndex(long op1, short[] op2, int s, short[] op3, int immIndex, byte rotation) { long result = op1; int r1 = s; From 3cff0ab13fba974f8fa6a5634d92882344fb70ad Mon Sep 17 00:00:00 2001 From: Jacob Crawley Date: Thu, 17 Jul 2025 08:40:19 +0000 Subject: [PATCH 3/4] Adding constant range to rotation parameter --- .../Runtime/Intrinsics/Arm/Sve2.PlatformNotSupported.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 8b585ba71a2b5f..d9aa2b14343684 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 @@ -1099,13 +1099,13 @@ internal Arm64() { } /// svint32_t svcdot_lane[_s32](svint32_t op1, svint8_t op2, svint8_t op3, uint64_t imm_index, uint64_t imm_rotation) /// CDOT Ztied1.S, Zop2.B, Zop3.B[imm_index], #imm_rotation /// - public static Vector DotProductRotateComplexBySelectedIndex(Vector op1, Vector op2, Vector op3, [ConstantExpected(Min = 0, Max = (byte)(3))] byte imm_index, [ConstantExpected] byte rotation) { throw new PlatformNotSupportedException(); } + public static Vector DotProductRotateComplexBySelectedIndex(Vector op1, Vector op2, Vector op3, [ConstantExpected(Min = 0, Max = (byte)(3))] byte imm_index, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) { throw new PlatformNotSupportedException(); } /// /// svint64_t svcdot_lane[_s64](svint64_t op1, svint16_t op2, svint16_t op3, uint64_t imm_index, uint64_t imm_rotation) /// CDOT Ztied1.D, Zop2.H, Zop3.H[imm_index], #imm_rotation /// - public static Vector DotProductRotateComplexBySelectedIndex(Vector op1, Vector op2, Vector op3, [ConstantExpected(Min = 0, Max = (byte)(1))] byte imm_index, [ConstantExpected] byte rotation) { throw new PlatformNotSupportedException(); } + public static Vector DotProductRotateComplexBySelectedIndex(Vector op1, Vector op2, Vector op3, [ConstantExpected(Min = 0, Max = (byte)(1))] byte imm_index, [ConstantExpected(Min = 0, Max = (byte)(3))] byte rotation) { throw new PlatformNotSupportedException(); } // Halving add From fed179dfdfe917fb219768fa666a153a244991aa Mon Sep 17 00:00:00 2001 From: Aman Khalid Date: Fri, 18 Jul 2025 14:27:01 -0400 Subject: [PATCH 4/4] Update src/coreclr/jit/hwintrinsiccodegenarm64.cpp --- src/coreclr/jit/hwintrinsiccodegenarm64.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/coreclr/jit/hwintrinsiccodegenarm64.cpp b/src/coreclr/jit/hwintrinsiccodegenarm64.cpp index 2991e4c5ffc866..a39224dcb338c1 100644 --- a/src/coreclr/jit/hwintrinsiccodegenarm64.cpp +++ b/src/coreclr/jit/hwintrinsiccodegenarm64.cpp @@ -2781,7 +2781,7 @@ void CodeGen::genHWIntrinsic(GenTreeHWIntrinsic* node) else { // Use the helper to generate a table. The table can only use a single lookup value, therefore - // the two immediates index and rotation must be combined to a single value + // the two immediates index and rotation must be combined to a single value assert(!intrin.op4->isContainedIntOrIImmed() && !intrin.op5->isContainedIntOrIImmed()); emitAttr scalarSize = emitActualTypeSize(node->GetSimdBaseType());