From 1374fcbcb822143985384933ed3a00a077561510 Mon Sep 17 00:00:00 2001 From: TIHan Date: Tue, 25 Jun 2024 18:29:23 -0700 Subject: [PATCH] Feedback --- src/coreclr/jit/hwintrinsic.h | 2 +- src/coreclr/jit/hwintrinsiccodegenarm64.cpp | 27 +- src/coreclr/jit/lowerarmarch.cpp | 6 +- .../GenerateHWIntrinsicTests_Arm.cs | 87 +++--- .../HardwareIntrinsics/Arm/Shared/Helpers.cs | 159 ++++++++++ .../Arm/Shared/SveExtractTest.template | 282 ------------------ .../Shared/_SveUnaryOpTestTemplate.template | 1 + 7 files changed, 223 insertions(+), 341 deletions(-) delete mode 100644 src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveExtractTest.template diff --git a/src/coreclr/jit/hwintrinsic.h b/src/coreclr/jit/hwintrinsic.h index 52649a4c699b5..8b618c2be7255 100644 --- a/src/coreclr/jit/hwintrinsic.h +++ b/src/coreclr/jit/hwintrinsic.h @@ -934,7 +934,7 @@ struct HWIntrinsicInfo } // Checks if the intrinsic has an embedded mask operation and the intrinsic returns a scalar. - static bool IsEmbeddedMaskForScalarResultOperation(NamedIntrinsic id) + static bool IsEmbeddedMaskForScalarResult(NamedIntrinsic id) { if (IsEmbeddedMaskedOperation(id)) { diff --git a/src/coreclr/jit/hwintrinsiccodegenarm64.cpp b/src/coreclr/jit/hwintrinsiccodegenarm64.cpp index 59ecf4001c97f..eafd89b0f6e95 100644 --- a/src/coreclr/jit/hwintrinsiccodegenarm64.cpp +++ b/src/coreclr/jit/hwintrinsiccodegenarm64.cpp @@ -463,6 +463,8 @@ void CodeGen::genHWIntrinsic(GenTreeHWIntrinsic* node) regNumber embMaskOp3Reg = REG_NA; regNumber falseReg = op3Reg; + insOpts optEmb = opt; + switch (intrinEmbMask.numOperands) { case 3: @@ -505,7 +507,7 @@ void CodeGen::genHWIntrinsic(GenTreeHWIntrinsic* node) case NI_Sve_ConvertToInt32: case NI_Sve_ConvertToUInt32: { - opt = intrinEmbMask.baseType == TYP_DOUBLE ? INS_OPTS_D_TO_S : INS_OPTS_SCALABLE_S; + optEmb = intrinEmbMask.baseType == TYP_DOUBLE ? INS_OPTS_D_TO_S : INS_OPTS_SCALABLE_S; break; } @@ -534,7 +536,7 @@ void CodeGen::genHWIntrinsic(GenTreeHWIntrinsic* node) // If falseValue is zero, just zero out those lanes of targetReg using `movprfx` // and /Z GetEmitter()->emitIns_R_R_R(INS_sve_movprfx, emitSize, targetReg, maskReg, targetReg, - opt, soptEmb); + opt); } } else if (emitter::isVectorRegister(embMaskOp1Reg) && (targetReg == embMaskOp1Reg)) @@ -545,7 +547,7 @@ void CodeGen::genHWIntrinsic(GenTreeHWIntrinsic* node) // We cannot use use `movprfx` here to move falseReg to targetReg because that will // overwrite the value of embMaskOp1Reg which is present in targetReg. - GetEmitter()->emitIns_R_R_R(insEmbMask, emitSize, targetReg, maskReg, embMaskOp1Reg, opt, + GetEmitter()->emitIns_R_R_R(insEmbMask, emitSize, targetReg, maskReg, embMaskOp1Reg, optEmb, soptEmb); GetEmitter()->emitIns_R_R_R_R(INS_sve_sel, emitSize, targetReg, maskReg, targetReg, @@ -560,7 +562,8 @@ void CodeGen::genHWIntrinsic(GenTreeHWIntrinsic* node) } } - GetEmitter()->emitIns_R_R_R(insEmbMask, emitSize, targetReg, maskReg, embMaskOp1Reg, opt, soptEmb); + GetEmitter()->emitIns_R_R_R(insEmbMask, emitSize, targetReg, maskReg, embMaskOp1Reg, optEmb, + soptEmb); break; } @@ -578,7 +581,7 @@ void CodeGen::genHWIntrinsic(GenTreeHWIntrinsic* node) // Finally, perform the actual "predicated" operation so that `targetReg` is the first operand // and `embMaskOp2Reg` is the second operand. - GetEmitter()->emitIns_R_R_R(insEmbMask, emitSize, targetReg, maskReg, embMaskOp2Reg, opt); + GetEmitter()->emitIns_R_R_R(insEmbMask, emitSize, targetReg, maskReg, embMaskOp2Reg, optEmb); } else if (targetReg != falseReg) { @@ -593,7 +596,7 @@ void CodeGen::genHWIntrinsic(GenTreeHWIntrinsic* node) // If the embedded instruction supports optional mask operation, use the "unpredicated" // version of the instruction, followed by "sel" to select the active lanes. GetEmitter()->emitIns_R_R_R(insEmbMask, emitSize, targetReg, embMaskOp1Reg, - embMaskOp2Reg, opt); + embMaskOp2Reg, optEmb); } else { @@ -608,7 +611,7 @@ void CodeGen::genHWIntrinsic(GenTreeHWIntrinsic* node) GetEmitter()->emitIns_R_R(INS_sve_movprfx, EA_SCALABLE, targetReg, embMaskOp1Reg); GetEmitter()->emitIns_R_R_R(insEmbMask, emitSize, targetReg, maskReg, embMaskOp2Reg, - opt); + optEmb); } GetEmitter()->emitIns_R_R_R_R(INS_sve_sel, emitSize, targetReg, maskReg, targetReg, @@ -625,13 +628,13 @@ void CodeGen::genHWIntrinsic(GenTreeHWIntrinsic* node) // Finally, perform the actual "predicated" operation so that `targetReg` is the first operand // and `embMaskOp2Reg` is the second operand. - GetEmitter()->emitIns_R_R_R(insEmbMask, emitSize, targetReg, maskReg, embMaskOp2Reg, opt); + GetEmitter()->emitIns_R_R_R(insEmbMask, emitSize, targetReg, maskReg, embMaskOp2Reg, optEmb); } else { // Just perform the actual "predicated" operation so that `targetReg` is the first operand // and `embMaskOp2Reg` is the second operand. - GetEmitter()->emitIns_R_R_R(insEmbMask, emitSize, targetReg, maskReg, embMaskOp2Reg, opt); + GetEmitter()->emitIns_R_R_R(insEmbMask, emitSize, targetReg, maskReg, embMaskOp2Reg, optEmb); } break; @@ -800,7 +803,7 @@ void CodeGen::genHWIntrinsic(GenTreeHWIntrinsic* node) // Finally, perform the desired operation. GetEmitter()->emitIns_R_R_R_R(insEmbMask, emitSize, targetReg, maskReg, embMaskOp2Reg, - embMaskOp3Reg, opt); + embMaskOp3Reg, optEmb); break; } @@ -2139,9 +2142,7 @@ void CodeGen::genHWIntrinsic(GenTreeHWIntrinsic* node) case NI_Sve_ExtractAfterLastScalar: case NI_Sve_ExtractLastScalar: - assert(HWIntrinsicInfo::IsEmbeddedMaskForScalarResultOperation(intrin.id)); - assert(op1Reg != REG_NA); // this is the embedded mask - assert(op2Reg != REG_NA); + assert(HWIntrinsicInfo::IsEmbeddedMaskForScalarResult(intrin.id)); if (varTypeIsFloating(node)) { diff --git a/src/coreclr/jit/lowerarmarch.cpp b/src/coreclr/jit/lowerarmarch.cpp index 0647381df230c..351596b282ee3 100644 --- a/src/coreclr/jit/lowerarmarch.cpp +++ b/src/coreclr/jit/lowerarmarch.cpp @@ -1331,8 +1331,10 @@ GenTree* Lowering::LowerHWIntrinsic(GenTreeHWIntrinsic* node) var_types simdType = Compiler::getSIMDTypeForSize(simdSize); GenTree* trueMask = comp->gtNewSimdAllTrueMaskNode(simdBaseJitType, simdSize); - - if (HWIntrinsicInfo::IsEmbeddedMaskForScalarResultOperation(intrinsicId)) + // The instruction uses "predicate" to pick lanes, but at the same time returns a scalar result. + // As such, we cannot wrap it inside ConditionalSelect because that node operates on TYP_SIMD. + // Hence, we will just add an operand so that we have a predicate register for such instructions. + if (HWIntrinsicInfo::IsEmbeddedMaskForScalarResult(intrinsicId)) { // Create the same node with an additional operand to pass the mask. GenTreeHWIntrinsic* newNode = diff --git a/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs b/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs index 494941f610c32..a6af091b31c38 100644 --- a/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs +++ b/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs @@ -177,6 +177,7 @@ ("_BinaryOpTestTemplate.template", "SecureHashBinOpTest.template", new Dictionary { ["TemplateName"] = "SecureHash", ["TemplateValidationLogic"] = SecureHashOpTest_ValidationLogic }), ("_TernaryOpTestTemplate.template", "SecureHashTernOpTest.template", new Dictionary { ["TemplateName"] = "SecureHash", ["TemplateValidationLogic"] = SecureHashOpTest_ValidationLogic }), ("_SveUnaryOpTestTemplate.template", "SveSimpleVecOpTest.template", new Dictionary { ["TemplateName"] = "Simple", ["TemplateValidationLogic"] = SimpleVecOpTest_ValidationLogic, ["TemplateValidationLogicForCndSel"] = SimpleVecOpTest_ValidationLogicForCndSel }), + ("_SveUnaryOpTestTemplate.template", "SveSimpleVecOpVecTest.template", new Dictionary { ["TemplateName"] = "Simple", ["TemplateValidationLogic"] = SimpleVecOpTest_VectorValidationLogic, ["TemplateValidationLogicForCndSel"] = SimpleVecOpTest_VectorValidationLogicForCndSel }), ("_SveUnaryOpDifferentRetTypeTestTemplate.template", "SveSimpleVecOpDifferentRetTypeTest.template", new Dictionary { ["TemplateName"] = "Simple", ["TemplateValidationLogic"] = SimpleVecOpTest_ValidationLogicForNarrowing, ["TemplateValidationLogicForCndSel"] = SimpleVecOpTest_ValidationLogicForCndSelForNarrowing }), ("_SveBinaryOpTestTemplate.template", "SveVecBinOpTest.template", new Dictionary { ["TemplateName"] = "Simple", ["TemplateValidationLogic"] = SimpleVecOpTest_ValidationLogic, ["TemplateValidationLogicForCndSel"] = SimpleVecOpTest_ValidationLogicForCndSel }), ("_SveBinaryOpTestTemplate.template", "SveVecBinOpVecTest.template", new Dictionary { ["TemplateName"] = "Simple", ["TemplateValidationLogic"] = SimpleVecOpTest_VectorValidationLogic, ["TemplateValidationLogicForCndSel"] = SimpleVecOpTest_VectorValidationLogicForCndSel }), @@ -4020,49 +4021,49 @@ ("SveVecPairBinOpTest.template", new Dictionary { ["TestName"] = "SveTransposeOdd_uint", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "TransposeOdd", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt32", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()", ["ValidateEntry"] = "result[i] != left[index * 2 + 1] || result[i + 1] != right[index * 2 + 1]"}), ("SveVecPairBinOpTest.template", new Dictionary { ["TestName"] = "SveTransposeOdd_ulong", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "TransposeOdd", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt64", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()", ["ValidateEntry"] = "result[i] != left[index * 2 + 1] || result[i + 1] != right[index * 2 + 1]"}), - ("SveExtractTest.template", new Dictionary { ["TestName"] = "SveExtractLastVector_Byte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractLastVector", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Byte", ["RetType"] = "Vector", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetByte()", ["ValidateResult"] = "firstOp[firstOp.Length - 1] != result[0] || result[1] != 0"}), - ("SveExtractTest.template", new Dictionary { ["TestName"] = "SveExtractLastVector_Double", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractLastVector", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Double", ["RetType"] = "Vector", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()", ["ValidateResult"] = "BitConverter.DoubleToInt64Bits(firstOp[firstOp.Length - 1]) != BitConverter.DoubleToInt64Bits(result[0]) || result[1] != 0"}), - ("SveExtractTest.template", new Dictionary { ["TestName"] = "SveExtractLastVector_Int16", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractLastVector", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["RetType"] = "Vector", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["ValidateResult"] = "firstOp[firstOp.Length - 1] != result[0] || result[1] != 0"}), - ("SveExtractTest.template", new Dictionary { ["TestName"] = "SveExtractLastVector_Int32", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractLastVector", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["RetType"] = "Vector", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["ValidateResult"] = "firstOp[firstOp.Length - 1] != result[0] || result[1] != 0"}), - ("SveExtractTest.template", new Dictionary { ["TestName"] = "SveExtractLastVector_Int64", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractLastVector", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["RetType"] = "Vector", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["ValidateResult"] = "firstOp[firstOp.Length - 1] != result[0] || result[1] != 0"}), - ("SveExtractTest.template", new Dictionary { ["TestName"] = "SveExtractLastVector_SByte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractLastVector", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "SByte", ["RetType"] = "Vector", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["ValidateResult"] = "firstOp[firstOp.Length - 1] != result[0] || result[1] != 0"}), - ("SveExtractTest.template", new Dictionary { ["TestName"] = "SveExtractLastVector_Single", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractLastVector", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Single", ["RetType"] = "Vector", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()", ["ValidateResult"] = "BitConverter.SingleToInt32Bits(firstOp[firstOp.Length - 1]) != BitConverter.SingleToInt32Bits(result[0]) || result[1] != 0"}), - ("SveExtractTest.template", new Dictionary { ["TestName"] = "SveExtractLastVector_UInt16", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractLastVector", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["RetType"] = "Vector", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["ValidateResult"] = "firstOp[firstOp.Length - 1] != result[0] || result[1] != 0"}), - ("SveExtractTest.template", new Dictionary { ["TestName"] = "SveExtractLastVector_UInt32", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractLastVector", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["RetType"] = "Vector", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["ValidateResult"] = "firstOp[firstOp.Length - 1] != result[0] || result[1] != 0"}), - ("SveExtractTest.template", new Dictionary { ["TestName"] = "SveExtractLastVector_UInt64", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractLastVector", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt64", ["RetType"] = "Vector", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()", ["ValidateResult"] = "firstOp[firstOp.Length - 1] != result[0] || result[1] != 0"}), - - ("SveExtractTest.template", new Dictionary { ["TestName"] = "SveExtractLastScalar_Byte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractLastScalar", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Byte", ["RetType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetByte()", ["ValidateResult"] = "firstOp[firstOp.Length - 1] != result"}), - ("SveExtractTest.template", new Dictionary { ["TestName"] = "SveExtractLastScalar_Double", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractLastScalar", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Double", ["RetType"] = "Double", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()", ["ValidateResult"] = "BitConverter.DoubleToInt64Bits(firstOp[firstOp.Length - 1]) != BitConverter.DoubleToInt64Bits(result)"}), - ("SveExtractTest.template", new Dictionary { ["TestName"] = "SveExtractLastScalar_Int16", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractLastScalar", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["RetType"] = "Int16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["ValidateResult"] = "firstOp[firstOp.Length - 1] != result"}), - ("SveExtractTest.template", new Dictionary { ["TestName"] = "SveExtractLastScalar_Int32", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractLastScalar", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["RetType"] = "Int32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["ValidateResult"] = "firstOp[firstOp.Length - 1] != result"}), - ("SveExtractTest.template", new Dictionary { ["TestName"] = "SveExtractLastScalar_Int64", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractLastScalar", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["RetType"] = "Int64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["ValidateResult"] = "firstOp[firstOp.Length - 1] != result"}), - ("SveExtractTest.template", new Dictionary { ["TestName"] = "SveExtractLastScalar_SByte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractLastScalar", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "SByte", ["RetType"] = "SByte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["ValidateResult"] = "firstOp[firstOp.Length - 1] != result"}), - ("SveExtractTest.template", new Dictionary { ["TestName"] = "SveExtractLastScalar_Single", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractLastScalar", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Single", ["RetType"] = "Single", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()", ["ValidateResult"] = "BitConverter.SingleToInt32Bits(firstOp[firstOp.Length - 1]) != BitConverter.SingleToInt32Bits(result)"}), - ("SveExtractTest.template", new Dictionary { ["TestName"] = "SveExtractLastScalar_UInt16", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractLastScalar", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["RetType"] = "UInt16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["ValidateResult"] = "firstOp[firstOp.Length - 1] != result"}), - ("SveExtractTest.template", new Dictionary { ["TestName"] = "SveExtractLastScalar_UInt32", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractLastScalar", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["RetType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["ValidateResult"] = "firstOp[firstOp.Length - 1] != result"}), - ("SveExtractTest.template", new Dictionary { ["TestName"] = "SveExtractLastScalar_UInt64", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractLastScalar", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt64", ["RetType"] = "UInt64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()", ["ValidateResult"] = "firstOp[firstOp.Length - 1] != result"}), - - ("SveExtractTest.template", new Dictionary { ["TestName"] = "SveExtractAfterLastVector_Byte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractAfterLastVector", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Byte", ["RetType"] = "Vector", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetByte()", ["ValidateResult"] = "firstOp[0] != result[0]"}), - ("SveExtractTest.template", new Dictionary { ["TestName"] = "SveExtractAfterLastVector_Double", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractAfterLastVector", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Double", ["RetType"] = "Vector", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()", ["ValidateResult"] = "BitConverter.DoubleToInt64Bits(firstOp[0]) != BitConverter.DoubleToInt64Bits(result[0])"}), - ("SveExtractTest.template", new Dictionary { ["TestName"] = "SveExtractAfterLastVector_Int16", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractAfterLastVector", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["RetType"] = "Vector", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["ValidateResult"] = "firstOp[0] != result[0]"}), - ("SveExtractTest.template", new Dictionary { ["TestName"] = "SveExtractAfterLastVector_Int32", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractAfterLastVector", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["RetType"] = "Vector", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["ValidateResult"] = "firstOp[0] != result[0]"}), - ("SveExtractTest.template", new Dictionary { ["TestName"] = "SveExtractAfterLastVector_Int64", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractAfterLastVector", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["RetType"] = "Vector", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["ValidateResult"] = "firstOp[0] != result[0]"}), - ("SveExtractTest.template", new Dictionary { ["TestName"] = "SveExtractAfterLastVector_SByte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractAfterLastVector", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "SByte", ["RetType"] = "Vector", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["ValidateResult"] = "firstOp[0] != result[0]"}), - ("SveExtractTest.template", new Dictionary { ["TestName"] = "SveExtractAfterLastVector_Single", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractAfterLastVector", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Single", ["RetType"] = "Vector", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()", ["ValidateResult"] = "BitConverter.SingleToInt32Bits(firstOp[0]) != BitConverter.SingleToInt32Bits(result[0])"}), - ("SveExtractTest.template", new Dictionary { ["TestName"] = "SveExtractAfterLastVector_UInt16", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractAfterLastVector", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["RetType"] = "Vector", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["ValidateResult"] = "firstOp[0] != result[0]"}), - ("SveExtractTest.template", new Dictionary { ["TestName"] = "SveExtractAfterLastVector_UInt32", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractAfterLastVector", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["RetType"] = "Vector", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["ValidateResult"] = "firstOp[0] != result[0]"}), - ("SveExtractTest.template", new Dictionary { ["TestName"] = "SveExtractAfterLastVector_UInt64", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractAfterLastVector", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt64", ["RetType"] = "Vector", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()", ["ValidateResult"] = "firstOp[0] != result[0]"}), - - ("SveExtractTest.template", new Dictionary { ["TestName"] = "SveExtractAfterLastScalar_Byte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractAfterLastScalar", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Byte", ["RetType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetByte()", ["ValidateResult"] = "firstOp[0] != result"}), - ("SveExtractTest.template", new Dictionary { ["TestName"] = "SveExtractAfterLastScalar_Double", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractAfterLastScalar", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Double", ["RetType"] = "Double", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()", ["ValidateResult"] = "BitConverter.DoubleToInt64Bits(firstOp[0]) != BitConverter.DoubleToInt64Bits(result)"}), - ("SveExtractTest.template", new Dictionary { ["TestName"] = "SveExtractAfterLastScalar_Int16", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractAfterLastScalar", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["RetType"] = "Int16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["ValidateResult"] = "firstOp[0] != result"}), - ("SveExtractTest.template", new Dictionary { ["TestName"] = "SveExtractAfterLastScalar_Int32", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractAfterLastScalar", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["RetType"] = "Int32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["ValidateResult"] = "firstOp[0] != result"}), - ("SveExtractTest.template", new Dictionary { ["TestName"] = "SveExtractAfterLastScalar_Int64", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractAfterLastScalar", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["RetType"] = "Int64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["ValidateResult"] = "firstOp[0] != result"}), - ("SveExtractTest.template", new Dictionary { ["TestName"] = "SveExtractAfterLastScalar_SByte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractAfterLastScalar", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "SByte", ["RetType"] = "SByte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["ValidateResult"] = "firstOp[0] != result"}), - ("SveExtractTest.template", new Dictionary { ["TestName"] = "SveExtractAfterLastScalar_Single", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractAfterLastScalar", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Single", ["RetType"] = "Single", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()", ["ValidateResult"] = "BitConverter.SingleToInt32Bits(firstOp[0]) != BitConverter.SingleToInt32Bits(result)"}), - ("SveExtractTest.template", new Dictionary { ["TestName"] = "SveExtractAfterLastScalar_UInt16", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractAfterLastScalar", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["RetType"] = "UInt16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["ValidateResult"] = "firstOp[0] != result"}), - ("SveExtractTest.template", new Dictionary { ["TestName"] = "SveExtractAfterLastScalar_UInt32", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractAfterLastScalar", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["RetType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["ValidateResult"] = "firstOp[0] != result"}), - ("SveExtractTest.template", new Dictionary { ["TestName"] = "SveExtractAfterLastScalar_UInt64", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractAfterLastScalar", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt64", ["RetType"] = "UInt64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()", ["ValidateResult"] = "firstOp[0] != result"}), + ("SveSimpleVecOpVecTest.template", new Dictionary { ["TestName"] = "SveExtractLastVector_Byte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractLastVector", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Byte", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetByte()", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.ExtractLastVector(firstOp))", ["GetVectorResult"] = "Helpers.ExtractLastVector(left)"}), + ("SveSimpleVecOpVecTest.template", new Dictionary { ["TestName"] = "SveExtractLastVector_Double", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractLastVector", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Double", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Double", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.ExtractLastVector(firstOp))", ["GetVectorResult"] = "Helpers.ExtractLastVector(left)"}), + ("SveSimpleVecOpVecTest.template", new Dictionary { ["TestName"] = "SveExtractLastVector_Int16", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractLastVector", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.ExtractLastVector(firstOp))", ["GetVectorResult"] = "Helpers.ExtractLastVector(left)"}), + ("SveSimpleVecOpVecTest.template", new Dictionary { ["TestName"] = "SveExtractLastVector_Int32", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractLastVector", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.ExtractLastVector(firstOp))", ["GetVectorResult"] = "Helpers.ExtractLastVector(left)"}), + ("SveSimpleVecOpVecTest.template", new Dictionary { ["TestName"] = "SveExtractLastVector_Int64", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractLastVector", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.ExtractLastVector(firstOp))", ["GetVectorResult"] = "Helpers.ExtractLastVector(left)"}), + ("SveSimpleVecOpVecTest.template", new Dictionary { ["TestName"] = "SveExtractLastVector_SByte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractLastVector", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "SByte", ["RetVectorType"] = "Vector", ["RetBaseType"] = "SByte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.ExtractLastVector(firstOp))", ["GetVectorResult"] = "Helpers.ExtractLastVector(left)"}), + ("SveSimpleVecOpVecTest.template", new Dictionary { ["TestName"] = "SveExtractLastVector_Single", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractLastVector", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Single", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Single", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.ExtractLastVector(firstOp))", ["GetVectorResult"] = "Helpers.ExtractLastVector(left)"}), + ("SveSimpleVecOpVecTest.template", new Dictionary { ["TestName"] = "SveExtractLastVector_UInt16", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractLastVector", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.ExtractLastVector(firstOp))", ["GetVectorResult"] = "Helpers.ExtractLastVector(left)"}), + ("SveSimpleVecOpVecTest.template", new Dictionary { ["TestName"] = "SveExtractLastVector_UInt32", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractLastVector", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.ExtractLastVector(firstOp))", ["GetVectorResult"] = "Helpers.ExtractLastVector(left)"}), + ("SveSimpleVecOpVecTest.template", new Dictionary { ["TestName"] = "SveExtractLastVector_UInt64", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractLastVector", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt64", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.ExtractLastVector(firstOp))", ["GetVectorResult"] = "Helpers.ExtractLastVector(left)"}), + + ("SveExtractScalarTest.template", new Dictionary { ["TestName"] = "SveExtractLastScalar_Byte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractLastScalar", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Byte", ["RetType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetByte()", ["ValidateResult"] = "firstOp[firstOp.Length - 1] != result"}), + ("SveExtractScalarTest.template", new Dictionary { ["TestName"] = "SveExtractLastScalar_Double", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractLastScalar", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Double", ["RetType"] = "Double", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()", ["ValidateResult"] = "BitConverter.DoubleToInt64Bits(firstOp[firstOp.Length - 1]) != BitConverter.DoubleToInt64Bits(result)"}), + ("SveExtractScalarTest.template", new Dictionary { ["TestName"] = "SveExtractLastScalar_Int16", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractLastScalar", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["RetType"] = "Int16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["ValidateResult"] = "firstOp[firstOp.Length - 1] != result"}), + ("SveExtractScalarTest.template", new Dictionary { ["TestName"] = "SveExtractLastScalar_Int32", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractLastScalar", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["RetType"] = "Int32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["ValidateResult"] = "firstOp[firstOp.Length - 1] != result"}), + ("SveExtractScalarTest.template", new Dictionary { ["TestName"] = "SveExtractLastScalar_Int64", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractLastScalar", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["RetType"] = "Int64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["ValidateResult"] = "firstOp[firstOp.Length - 1] != result"}), + ("SveExtractScalarTest.template", new Dictionary { ["TestName"] = "SveExtractLastScalar_SByte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractLastScalar", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "SByte", ["RetType"] = "SByte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["ValidateResult"] = "firstOp[firstOp.Length - 1] != result"}), + ("SveExtractScalarTest.template", new Dictionary { ["TestName"] = "SveExtractLastScalar_Single", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractLastScalar", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Single", ["RetType"] = "Single", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()", ["ValidateResult"] = "BitConverter.SingleToInt32Bits(firstOp[firstOp.Length - 1]) != BitConverter.SingleToInt32Bits(result)"}), + ("SveExtractScalarTest.template", new Dictionary { ["TestName"] = "SveExtractLastScalar_UInt16", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractLastScalar", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["RetType"] = "UInt16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["ValidateResult"] = "firstOp[firstOp.Length - 1] != result"}), + ("SveExtractScalarTest.template", new Dictionary { ["TestName"] = "SveExtractLastScalar_UInt32", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractLastScalar", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["RetType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["ValidateResult"] = "firstOp[firstOp.Length - 1] != result"}), + ("SveExtractScalarTest.template", new Dictionary { ["TestName"] = "SveExtractLastScalar_UInt64", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractLastScalar", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt64", ["RetType"] = "UInt64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()", ["ValidateResult"] = "firstOp[firstOp.Length - 1] != result"}), + + ("SveSimpleVecOpVecTest.template", new Dictionary { ["TestName"] = "SveExtractAfterLastVector_Byte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractAfterLastVector", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Byte", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetByte()", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.ExtractAfterLastVector(firstOp))", ["GetVectorResult"] = "Helpers.ExtractAfterLastVector(left)"}), + ("SveSimpleVecOpVecTest.template", new Dictionary { ["TestName"] = "SveExtractAfterLastVector_Double", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractAfterLastVector", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Double", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Double", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.ExtractAfterLastVector(firstOp))", ["GetVectorResult"] = "Helpers.ExtractAfterLastVector(left)"}), + ("SveSimpleVecOpVecTest.template", new Dictionary { ["TestName"] = "SveExtractAfterLastVector_Int16", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractAfterLastVector", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.ExtractAfterLastVector(firstOp))", ["GetVectorResult"] = "Helpers.ExtractAfterLastVector(left)"}), + ("SveSimpleVecOpVecTest.template", new Dictionary { ["TestName"] = "SveExtractAfterLastVector_Int32", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractAfterLastVector", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.ExtractAfterLastVector(firstOp))", ["GetVectorResult"] = "Helpers.ExtractAfterLastVector(left)"}), + ("SveSimpleVecOpVecTest.template", new Dictionary { ["TestName"] = "SveExtractAfterLastVector_Int64", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractAfterLastVector", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Int64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.ExtractAfterLastVector(firstOp))", ["GetVectorResult"] = "Helpers.ExtractAfterLastVector(left)"}), + ("SveSimpleVecOpVecTest.template", new Dictionary { ["TestName"] = "SveExtractAfterLastVector_SByte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractAfterLastVector", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "SByte", ["RetVectorType"] = "Vector", ["RetBaseType"] = "SByte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.ExtractAfterLastVector(firstOp))", ["GetVectorResult"] = "Helpers.ExtractAfterLastVector(left)"}), + ("SveSimpleVecOpVecTest.template", new Dictionary { ["TestName"] = "SveExtractAfterLastVector_Single", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractAfterLastVector", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Single", ["RetVectorType"] = "Vector", ["RetBaseType"] = "Single", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.ExtractAfterLastVector(firstOp))", ["GetVectorResult"] = "Helpers.ExtractAfterLastVector(left)"}), + ("SveSimpleVecOpVecTest.template", new Dictionary { ["TestName"] = "SveExtractAfterLastVector_UInt16", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractAfterLastVector", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.ExtractAfterLastVector(firstOp))", ["GetVectorResult"] = "Helpers.ExtractAfterLastVector(left)"}), + ("SveSimpleVecOpVecTest.template", new Dictionary { ["TestName"] = "SveExtractAfterLastVector_UInt32", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractAfterLastVector", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.ExtractAfterLastVector(firstOp))", ["GetVectorResult"] = "Helpers.ExtractAfterLastVector(left)"}), + ("SveSimpleVecOpVecTest.template", new Dictionary { ["TestName"] = "SveExtractAfterLastVector_UInt64", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractAfterLastVector", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt64", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()", ["ValidateVectorResult"] = "!result.SequenceEqual(Helpers.ExtractAfterLastVector(firstOp))", ["GetVectorResult"] = "Helpers.ExtractAfterLastVector(left)"}), + + ("SveExtractScalarTest.template", new Dictionary { ["TestName"] = "SveExtractAfterLastScalar_Byte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractAfterLastScalar", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Byte", ["RetType"] = "Byte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetByte()", ["ValidateResult"] = "firstOp[0] != result"}), + ("SveExtractScalarTest.template", new Dictionary { ["TestName"] = "SveExtractAfterLastScalar_Double", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractAfterLastScalar", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Double", ["RetType"] = "Double", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()", ["ValidateResult"] = "BitConverter.DoubleToInt64Bits(firstOp[0]) != BitConverter.DoubleToInt64Bits(result)"}), + ("SveExtractScalarTest.template", new Dictionary { ["TestName"] = "SveExtractAfterLastScalar_Int16", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractAfterLastScalar", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int16", ["RetType"] = "Int16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()", ["ValidateResult"] = "firstOp[0] != result"}), + ("SveExtractScalarTest.template", new Dictionary { ["TestName"] = "SveExtractAfterLastScalar_Int32", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractAfterLastScalar", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int32", ["RetType"] = "Int32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()", ["ValidateResult"] = "firstOp[0] != result"}), + ("SveExtractScalarTest.template", new Dictionary { ["TestName"] = "SveExtractAfterLastScalar_Int64", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractAfterLastScalar", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Int64", ["RetType"] = "Int64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()", ["ValidateResult"] = "firstOp[0] != result"}), + ("SveExtractScalarTest.template", new Dictionary { ["TestName"] = "SveExtractAfterLastScalar_SByte", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractAfterLastScalar", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "SByte", ["RetType"] = "SByte", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()", ["ValidateResult"] = "firstOp[0] != result"}), + ("SveExtractScalarTest.template", new Dictionary { ["TestName"] = "SveExtractAfterLastScalar_Single", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractAfterLastScalar", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "Single", ["RetType"] = "Single", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()", ["ValidateResult"] = "BitConverter.SingleToInt32Bits(firstOp[0]) != BitConverter.SingleToInt32Bits(result)"}), + ("SveExtractScalarTest.template", new Dictionary { ["TestName"] = "SveExtractAfterLastScalar_UInt16", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractAfterLastScalar", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["RetType"] = "UInt16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["ValidateResult"] = "firstOp[0] != result"}), + ("SveExtractScalarTest.template", new Dictionary { ["TestName"] = "SveExtractAfterLastScalar_UInt32", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractAfterLastScalar", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["RetType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()", ["ValidateResult"] = "firstOp[0] != result"}), + ("SveExtractScalarTest.template", new Dictionary { ["TestName"] = "SveExtractAfterLastScalar_UInt64", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "ExtractAfterLastScalar", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt64", ["RetType"] = "UInt64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()", ["ValidateResult"] = "firstOp[0] != result"}), }; diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Helpers.cs b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Helpers.cs index 5cdd61a162c82..b31622c03e904 100644 --- a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Helpers.cs +++ b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Helpers.cs @@ -7316,5 +7316,164 @@ public static ulong Splice(ulong[] first, ulong[] second, ulong[] maskArray, int return (index < rangeSize) ? first[start + index] : second[index - rangeSize]; } + public static byte[] ExtractLastVector(byte[] value) + { + var count = Vector.Count; + var arr = new byte[count]; + arr[0] = value[count - 1]; + return arr; + } + + public static double[] ExtractLastVector(double[] value) + { + var count = Vector.Count; + var arr = new double[count]; + arr[0] = value[count - 1]; + return arr; + } + + public static short[] ExtractLastVector(short[] value) + { + var count = Vector.Count; + var arr = new short[count]; + arr[0] = value[count - 1]; + return arr; + } + + public static int[] ExtractLastVector(int[] value) + { + var count = Vector.Count; + var arr = new int[count]; + arr[0] = value[count - 1]; + return arr; + } + + public static long[] ExtractLastVector(long[] value) + { + var count = Vector.Count; + var arr = new long[count]; + arr[0] = value[count - 1]; + return arr; + } + + public static sbyte[] ExtractLastVector(sbyte[] value) + { + var count = Vector.Count; + var arr = new sbyte[count]; + arr[0] = value[count - 1]; + return arr; + } + + public static float[] ExtractLastVector(float[] value) + { + var count = Vector.Count; + var arr = new float[count]; + arr[0] = value[count - 1]; + return arr; + } + + public static ushort[] ExtractLastVector(ushort[] value) + { + var count = Vector.Count; + var arr = new ushort[count]; + arr[0] = value[count - 1]; + return arr; + } + + public static uint[] ExtractLastVector(uint[] value) + { + var count = Vector.Count; + var arr = new uint[count]; + arr[0] = value[count - 1]; + return arr; + } + + public static ulong[] ExtractLastVector(ulong[] value) + { + var count = Vector.Count; + var arr = new ulong[count]; + arr[0] = value[count - 1]; + return arr; + } + + public static byte[] ExtractAfterLastVector(byte[] value) + { + var count = Vector.Count; + var arr = new byte[count]; + arr[0] = value[0]; + return arr; + } + + public static double[] ExtractAfterLastVector(double[] value) + { + var count = Vector.Count; + var arr = new double[count]; + arr[0] = value[0]; + return arr; + } + + public static short[] ExtractAfterLastVector(short[] value) + { + var count = Vector.Count; + var arr = new short[count]; + arr[0] = value[0]; + return arr; + } + + public static int[] ExtractAfterLastVector(int[] value) + { + var count = Vector.Count; + var arr = new int[count]; + arr[0] = value[0]; + return arr; + } + + public static long[] ExtractAfterLastVector(long[] value) + { + var count = Vector.Count; + var arr = new long[count]; + arr[0] = value[count - 1]; + return arr; + } + + public static sbyte[] ExtractAfterLastVector(sbyte[] value) + { + var count = Vector.Count; + var arr = new sbyte[count]; + arr[0] = value[0]; + return arr; + } + + public static float[] ExtractAfterLastVector(float[] value) + { + var count = Vector.Count; + var arr = new float[count]; + arr[0] = value[0]; + return arr; + } + + public static ushort[] ExtractAfterLastVector(ushort[] value) + { + var count = Vector.Count; + var arr = new ushort[count]; + arr[0] = value[0]; + return arr; + } + + public static uint[] ExtractAfterLastVector(uint[] value) + { + var count = Vector.Count; + var arr = new uint[count]; + arr[0] = value[0]; + return arr; + } + + public static ulong[] ExtractAfterLastVector(ulong[] value) + { + var count = Vector.Count; + var arr = new ulong[count]; + arr[0] = value[0]; + return arr; + } } } diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveExtractTest.template b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveExtractTest.template deleted file mode 100644 index 8b249644f0dfa..0000000000000 --- a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveExtractTest.template +++ /dev/null @@ -1,282 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -/****************************************************************************** - * This file is auto-generated from a template file by the GenerateTests.csx * - * script in tests\src\JIT\HardwareIntrinsics\Arm\Shared. In order to make * - * changes, please update the corresponding template and run according to the * - * directions listed in the file. * - ******************************************************************************/ - -using System; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using System.Runtime.Intrinsics; -using System.Runtime.Intrinsics.Arm; -using Xunit; - -namespace JIT.HardwareIntrinsics.Arm -{ - public static partial class Program - { - [Fact] - public static void {TestName}() - { - var test = new SveExtractTest__{TestName}(); - - if (test.IsSupported) - { - // Validates basic functionality works, using Unsafe.Read - test.RunBasicScenario_UnsafeRead(); - - if ({LoadIsa}.IsSupported) - { - // Validates basic functionality works, using Load - test.RunBasicScenario_Load(); - } - - // Validates calling via reflection works, using Unsafe.Read - test.RunReflectionScenario_UnsafeRead(); - - // Validates passing a local works, using Unsafe.Read - test.RunLclVarScenario_UnsafeRead(); - - // Validates passing an instance member of a class works - test.RunClassFldScenario(); - - // Validates passing the field of a local struct works - test.RunStructLclFldScenario(); - - // Validates passing an instance member of a struct works - test.RunStructFldScenario(); - } - else - { - // Validates we throw on unsupported hardware - test.RunUnsupportedScenario(); - } - - if (!test.Succeeded) - { - throw new Exception("One or more scenarios did not complete as expected."); - } - } - } - - public sealed unsafe class SveExtractTest__{TestName} - { - private struct DataTable - { - private byte[] inArray1; - - private GCHandle inHandle1; - - private ulong alignment; - - public DataTable({Op1BaseType}[] inArray1, int alignment) - { - int sizeOfinArray1 = inArray1.Length * Unsafe.SizeOf<{Op1BaseType}>(); - if ((alignment != 64 && alignment != 16 && alignment != 8) || (alignment * 2) < sizeOfinArray1) - { - throw new ArgumentException("Invalid value of alignment"); - } - - this.inArray1 = new byte[alignment * 2]; - this.inHandle1 = GCHandle.Alloc(this.inArray1, GCHandleType.Pinned); - this.alignment = (ulong)alignment; - - Unsafe.CopyBlockUnaligned(ref Unsafe.AsRef(inArray1Ptr), ref Unsafe.As<{Op1BaseType}, byte>(ref inArray1[0]), (uint)sizeOfinArray1); - } - - public void* inArray1Ptr => Align((byte*)(inHandle1.AddrOfPinnedObject().ToPointer()), alignment); - - public void Dispose() - { - inHandle1.Free(); - } - - private static unsafe void* Align(byte* buffer, ulong expectedAlignment) - { - return (void*)(((ulong)buffer + expectedAlignment - 1) & ~(expectedAlignment - 1)); - } - } - - private struct TestStruct - { - public {Op1VectorType}<{Op1BaseType}> _fld1; - - public static TestStruct Create() - { - var testStruct = new TestStruct(); - - 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}>>()); - - return testStruct; - } - - public void RunStructFldScenario(SveExtractTest__{TestName} testClass) - { - var result = {Isa}.{Method}(_fld1); - - testClass.ValidateResult(_fld1, result); - } - } - - private static readonly int LargestVectorSize = {LargestVectorSize}; - - private static readonly int Op1ElementCount = Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>() / sizeof({Op1BaseType}); - - private static {Op1BaseType}[] _data1 = new {Op1BaseType}[Op1ElementCount]; - - private {Op1VectorType}<{Op1BaseType}> _fld1; - - private DataTable _dataTable; - - public SveExtractTest__{TestName}() - { - Succeeded = true; - - 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++) { _data1[i] = {NextValueOp1}; } - _dataTable = new DataTable(_data1, LargestVectorSize); - } - - public bool IsSupported => {Isa}.IsSupported; - - public bool Succeeded { get; set; } - - public void RunBasicScenario_UnsafeRead() - { - TestLibrary.TestFramework.BeginScenario(nameof(RunBasicScenario_UnsafeRead)); - - var result = {Isa}.{Method}( - Unsafe.Read<{Op1VectorType}<{Op1BaseType}>>(_dataTable.inArray1Ptr) - ); - - ValidateResult(_dataTable.inArray1Ptr, result); - } - - public void RunBasicScenario_Load() - { - TestLibrary.TestFramework.BeginScenario(nameof(RunBasicScenario_Load)); - - var result = {Isa}.{Method}( - {LoadIsa}.Load{Op1VectorType}(Sve.CreateTrueMask{Op1BaseType}(SveMaskPattern.All), ({Op1BaseType}*)(_dataTable.inArray1Ptr)) - ); - - ValidateResult(_dataTable.inArray1Ptr, result); - } - - public void RunReflectionScenario_UnsafeRead() - { - TestLibrary.TestFramework.BeginScenario(nameof(RunReflectionScenario_UnsafeRead)); - - var result = typeof({Isa}).GetMethod(nameof({Isa}.{Method}), new Type[] { typeof({Op1VectorType}<{Op1BaseType}>) }) - .Invoke(null, new object[] { - Unsafe.Read<{Op1VectorType}<{Op1BaseType}>>(_dataTable.inArray1Ptr) - }); - - ValidateResult(_dataTable.inArray1Ptr, ({RetType})result); - } - - public void RunLclVarScenario_UnsafeRead() - { - TestLibrary.TestFramework.BeginScenario(nameof(RunLclVarScenario_UnsafeRead)); - - var op1 = Unsafe.Read<{Op1VectorType}<{Op1BaseType}>>(_dataTable.inArray1Ptr); - var result = {Isa}.{Method}(op1); - - ValidateResult(op1, result); - } - - public void RunClassFldScenario() - { - TestLibrary.TestFramework.BeginScenario(nameof(RunClassFldScenario)); - - var result = {Isa}.{Method}(_fld1); - - ValidateResult(_fld1, result); - } - - public void RunStructLclFldScenario() - { - TestLibrary.TestFramework.BeginScenario(nameof(RunStructLclFldScenario)); - - var test = TestStruct.Create(); - var result = {Isa}.{Method}(test._fld1); - - ValidateResult(test._fld1, result); - } - - public void RunStructFldScenario() - { - TestLibrary.TestFramework.BeginScenario(nameof(RunStructFldScenario)); - - var test = TestStruct.Create(); - test.RunStructFldScenario(this); - } - - public void RunUnsupportedScenario() - { - TestLibrary.TestFramework.BeginScenario(nameof(RunUnsupportedScenario)); - - bool succeeded = false; - - try - { - RunBasicScenario_UnsafeRead(); - } - catch (PlatformNotSupportedException) - { - succeeded = true; - } - - if (!succeeded) - { - Succeeded = false; - } - } - - private void ValidateResult({Op1VectorType}<{Op1BaseType}> op1, {RetType} result, [CallerMemberName] string method = "") - { - {Op1BaseType}[] inArray1 = new {Op1BaseType}[Op1ElementCount]; - - Unsafe.WriteUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref inArray1[0]), op1); - - ValidateResult(inArray1, result, method); - } - - private void ValidateResult(void* op1, {RetType} result, [CallerMemberName] string method = "") - { - {Op1BaseType}[] inArray1 = new {Op1BaseType}[Op1ElementCount]; - - Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref inArray1[0]), ref Unsafe.AsRef(op1), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>()); - - ValidateResult(inArray1, result, method); - } - - private void ValidateResult({Op1BaseType}[] firstOp, {RetType} result, [CallerMemberName] string method = "") - { - bool succeeded = true; - - if ({ValidateResult}) - { - succeeded = false; - } - - if (!succeeded) - { - TestLibrary.TestFramework.LogInformation($"{nameof({Isa})}.{nameof({Isa}.{Method})}({Op1VectorType}<{Op1BaseType}>): {method} failed:"); - TestLibrary.TestFramework.LogInformation($" firstOp: ({string.Join(", ", firstOp)})"); - TestLibrary.TestFramework.LogInformation($" result: {result}"); - TestLibrary.TestFramework.LogInformation(string.Empty); - - Succeeded = false; - } - } - } -} diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/_SveUnaryOpTestTemplate.template b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/_SveUnaryOpTestTemplate.template index 119cc5d88cb6f..1802380b62918 100644 --- a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/_SveUnaryOpTestTemplate.template +++ b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/_SveUnaryOpTestTemplate.template @@ -9,6 +9,7 @@ ******************************************************************************/ using System; +using System.Linq; using System.Numerics; using System.Runtime.CompilerServices; using System.Runtime.InteropServices;