diff --git a/src/coreclr/jit/hwintrinsic.h b/src/coreclr/jit/hwintrinsic.h index 1a959ec50e7972..0957e3d1656fea 100644 --- a/src/coreclr/jit/hwintrinsic.h +++ b/src/coreclr/jit/hwintrinsic.h @@ -935,6 +935,24 @@ struct HWIntrinsicInfo return (flags & HW_Flag_ExplicitMaskedOperation) != 0; } + // Checks if the intrinsic has an embedded mask operation and the intrinsic returns a scalar. + static bool IsEmbeddedMaskForScalarResult(NamedIntrinsic id) + { + if (IsEmbeddedMaskedOperation(id)) + { + switch (id) + { + case NI_Sve_ExtractAfterLastScalar: + case NI_Sve_ExtractLastScalar: + return true; + + default: + break; + } + } + return false; + } + static bool HasEnumOperand(NamedIntrinsic id) { const HWIntrinsicFlag flags = lookupFlags(id); diff --git a/src/coreclr/jit/hwintrinsiccodegenarm64.cpp b/src/coreclr/jit/hwintrinsiccodegenarm64.cpp index 69f2d1111a4e91..04c16458cc2fa8 100644 --- a/src/coreclr/jit/hwintrinsiccodegenarm64.cpp +++ b/src/coreclr/jit/hwintrinsiccodegenarm64.cpp @@ -482,6 +482,8 @@ void CodeGen::genHWIntrinsic(GenTreeHWIntrinsic* node) regNumber embMaskOp3Reg = REG_NA; regNumber falseReg = op3Reg; + insOpts optEmb = opt; + switch (intrinEmbMask.numOperands) { case 3: @@ -509,16 +511,25 @@ void CodeGen::genHWIntrinsic(GenTreeHWIntrinsic* node) { assert(!instrIsRMW); - // Special handling for ConvertTo* APIs - // Just need to change the opt here. + insScalableOpts soptEmb = INS_SCALABLE_OPTS_NONE; switch (intrinEmbMask.id) { + case NI_Sve_ExtractAfterLastVector: + case NI_Sve_ExtractLastVector: + { + soptEmb = INS_SCALABLE_OPTS_WITH_SIMD_SCALAR; + break; + } + + // Special handling for ConvertTo* APIs + // Just need to change the opt here. 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; } + default: break; } @@ -555,7 +566,8 @@ 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, falseReg, opt); @@ -569,7 +581,8 @@ void CodeGen::genHWIntrinsic(GenTreeHWIntrinsic* node) } } - GetEmitter()->emitIns_R_R_R(insEmbMask, emitSize, targetReg, maskReg, embMaskOp1Reg, opt); + GetEmitter()->emitIns_R_R_R(insEmbMask, emitSize, targetReg, maskReg, embMaskOp1Reg, optEmb, + soptEmb); break; } @@ -587,7 +600,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) { @@ -602,7 +615,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 { @@ -617,7 +630,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, @@ -634,13 +647,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; @@ -809,7 +822,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; } @@ -2142,6 +2155,21 @@ void CodeGen::genHWIntrinsic(GenTreeHWIntrinsic* node) break; } + case NI_Sve_ExtractAfterLastScalar: + case NI_Sve_ExtractLastScalar: + assert(HWIntrinsicInfo::IsEmbeddedMaskForScalarResult(intrin.id)); + + if (varTypeIsFloating(node)) + { + GetEmitter()->emitIns_R_R_R(ins, EA_SCALABLE, targetReg, /* mask */ op1Reg, op2Reg, opt, + INS_SCALABLE_OPTS_WITH_SIMD_SCALAR); + } + else + { + GetEmitter()->emitIns_R_R_R(ins, emitTypeSize(node), targetReg, /* mask */ op1Reg, op2Reg, opt); + } + break; + case NI_Sve_TestAnyTrue: case NI_Sve_TestFirstTrue: case NI_Sve_TestLastTrue: diff --git a/src/coreclr/jit/hwintrinsiclistarm64sve.h b/src/coreclr/jit/hwintrinsiclistarm64sve.h index 11da6f5c891d48..7399918770f1a9 100644 --- a/src/coreclr/jit/hwintrinsiclistarm64sve.h +++ b/src/coreclr/jit/hwintrinsiclistarm64sve.h @@ -69,6 +69,10 @@ HARDWARE_INTRINSIC(Sve, Divide, HARDWARE_INTRINSIC(Sve, DotProduct, -1, 3, true, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_sdot, INS_sve_udot, INS_sve_sdot, INS_sve_udot, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_HasRMWSemantics) HARDWARE_INTRINSIC(Sve, DotProductBySelectedScalar, -1, 4, true, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_sdot, INS_sve_udot, INS_sve_sdot, INS_sve_udot, INS_invalid, INS_invalid}, HW_Category_SIMDByIndexedElement, HW_Flag_Scalable|HW_Flag_BaseTypeFromFirstArg|HW_Flag_HasImmediateOperand|HW_Flag_HasRMWSemantics|HW_Flag_LowVectorOperation) HARDWARE_INTRINSIC(Sve, DuplicateSelectedScalarToVector, -1, 2, true, {INS_sve_dup, INS_sve_dup, INS_sve_dup, INS_sve_dup, INS_sve_dup, INS_sve_dup, INS_sve_dup, INS_sve_dup, INS_sve_dup, INS_sve_dup}, HW_Category_SIMDByIndexedElement, HW_Flag_Scalable|HW_Flag_HasImmediateOperand) +HARDWARE_INTRINSIC(Sve, ExtractAfterLastScalar, -1, -1, false, {INS_sve_lasta, INS_sve_lasta, INS_sve_lasta, INS_sve_lasta, INS_sve_lasta, INS_sve_lasta, INS_sve_lasta, INS_sve_lasta, INS_sve_lasta, INS_sve_lasta}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation|HW_Flag_BaseTypeFromFirstArg|HW_Flag_SpecialCodeGen) +HARDWARE_INTRINSIC(Sve, ExtractAfterLastVector, -1, -1, false, {INS_sve_lasta, INS_sve_lasta, INS_sve_lasta, INS_sve_lasta, INS_sve_lasta, INS_sve_lasta, INS_sve_lasta, INS_sve_lasta, INS_sve_lasta, INS_sve_lasta}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation) +HARDWARE_INTRINSIC(Sve, ExtractLastScalar, -1, -1, false, {INS_sve_lastb, INS_sve_lastb, INS_sve_lastb, INS_sve_lastb, INS_sve_lastb, INS_sve_lastb, INS_sve_lastb, INS_sve_lastb, INS_sve_lastb, INS_sve_lastb}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation|HW_Flag_BaseTypeFromFirstArg|HW_Flag_SpecialCodeGen) +HARDWARE_INTRINSIC(Sve, ExtractLastVector, -1, -1, false, {INS_sve_lastb, INS_sve_lastb, INS_sve_lastb, INS_sve_lastb, INS_sve_lastb, INS_sve_lastb, INS_sve_lastb, INS_sve_lastb, INS_sve_lastb, INS_sve_lastb}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation) HARDWARE_INTRINSIC(Sve, ExtractVector, -1, 3, true, {INS_sve_ext, INS_sve_ext, INS_sve_ext, INS_sve_ext, INS_sve_ext, INS_sve_ext, INS_sve_ext, INS_sve_ext, INS_sve_ext, INS_sve_ext}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_HasImmediateOperand|HW_Flag_HasRMWSemantics|HW_Flag_SpecialCodeGen) HARDWARE_INTRINSIC(Sve, FusedMultiplyAdd, -1, -1, false, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_fmla, INS_sve_fmla}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_HasRMWSemantics|HW_Flag_LowMaskedOperation|HW_Flag_FmaIntrinsic|HW_Flag_SpecialCodeGen) HARDWARE_INTRINSIC(Sve, FusedMultiplyAddBySelectedScalar, -1, 4, true, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_fmla, INS_sve_fmla}, HW_Category_SIMDByIndexedElement, HW_Flag_Scalable|HW_Flag_HasImmediateOperand|HW_Flag_HasRMWSemantics|HW_Flag_FmaIntrinsic|HW_Flag_LowVectorOperation) diff --git a/src/coreclr/jit/lowerarmarch.cpp b/src/coreclr/jit/lowerarmarch.cpp index 49f47338276fe0..26561d86dfc9ce 100644 --- a/src/coreclr/jit/lowerarmarch.cpp +++ b/src/coreclr/jit/lowerarmarch.cpp @@ -1330,17 +1330,37 @@ GenTree* Lowering::LowerHWIntrinsic(GenTreeHWIntrinsic* node) unsigned simdSize = node->GetSimdSize(); var_types simdType = Compiler::getSIMDTypeForSize(simdSize); GenTree* trueMask = comp->gtNewSimdAllTrueMaskNode(simdBaseJitType, simdSize); - GenTree* trueVal = node; - GenTree* falseVal = comp->gtNewZeroConNode(simdType); - GenTreeHWIntrinsic* condSelNode = - comp->gtNewSimdHWIntrinsicNode(simdType, trueMask, trueVal, falseVal, NI_Sve_ConditionalSelect, - simdBaseJitType, simdSize); + // 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 = + comp->gtNewSimdHWIntrinsicNode(node->TypeGet(), trueMask, node->Op(1), intrinsicId, + simdBaseJitType, simdSize); + + BlockRange().InsertAfter(node->Op(1), trueMask); + BlockRange().InsertAfter(trueMask, newNode); + BlockRange().Remove(node); + use.ReplaceWith(newNode); - BlockRange().InsertBefore(node, trueMask); - BlockRange().InsertBefore(node, falseVal); - BlockRange().InsertAfter(node, condSelNode); - use.ReplaceWith(condSelNode); + node = newNode; + } + else + { + GenTree* trueVal = node; + GenTree* falseVal = comp->gtNewZeroConNode(simdType); + GenTreeHWIntrinsic* condSelNode = + comp->gtNewSimdHWIntrinsicNode(simdType, trueMask, trueVal, falseVal, NI_Sve_ConditionalSelect, + simdBaseJitType, simdSize); + + BlockRange().InsertBefore(node, trueMask); + BlockRange().InsertBefore(node, falseVal); + BlockRange().InsertAfter(node, condSelNode); + use.ReplaceWith(condSelNode); + } } } } diff --git a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve.PlatformNotSupported.cs b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve.PlatformNotSupported.cs index 488d50db89f366..bca64e5725cbbb 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve.PlatformNotSupported.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve.PlatformNotSupported.cs @@ -1466,6 +1466,286 @@ internal Arm64() { } public static unsafe Vector DuplicateSelectedScalarToVector(Vector data, [ConstantExpected(Min = 0, Max = (byte)(7))] byte index) { throw new PlatformNotSupportedException(); } + /// + /// uint8_t svlasta[_u8](svbool_t pg, svuint8_t op) + /// LASTA Wresult, Pg, Zop.B + /// LASTA Bresult, Pg, Zop.B + /// + public static unsafe byte ExtractAfterLastScalar(Vector value) { throw new PlatformNotSupportedException(); } + + /// + /// float64_t svlasta[_f64](svbool_t pg, svfloat64_t op) + /// LASTA Xresult, Pg, Zop.D + /// LASTA Dresult, Pg, Zop.D + /// + public static unsafe double ExtractAfterLastScalar(Vector value) { throw new PlatformNotSupportedException(); } + + /// + /// int16_t svlasta[_s16](svbool_t pg, svint16_t op) + /// LASTA Wresult, Pg, Zop.H + /// LASTA Hresult, Pg, Zop.H + /// + public static unsafe short ExtractAfterLastScalar(Vector value) { throw new PlatformNotSupportedException(); } + + /// + /// int32_t svlasta[_s32](svbool_t pg, svint32_t op) + /// LASTA Wresult, Pg, Zop.S + /// LASTA Sresult, Pg, Zop.S + /// + public static unsafe int ExtractAfterLastScalar(Vector value) { throw new PlatformNotSupportedException(); } + + /// + /// int64_t svlasta[_s64](svbool_t pg, svint64_t op) + /// LASTA Xresult, Pg, Zop.D + /// LASTA Dresult, Pg, Zop.D + /// + public static unsafe long ExtractAfterLastScalar(Vector value) { throw new PlatformNotSupportedException(); } + + /// + /// int8_t svlasta[_s8](svbool_t pg, svint8_t op) + /// LASTA Wresult, Pg, Zop.B + /// LASTA Bresult, Pg, Zop.B + /// + public static unsafe sbyte ExtractAfterLastScalar(Vector value) { throw new PlatformNotSupportedException(); } + + /// + /// float32_t svlasta[_f32](svbool_t pg, svfloat32_t op) + /// LASTA Wresult, Pg, Zop.S + /// LASTA Sresult, Pg, Zop.S + /// + public static unsafe float ExtractAfterLastScalar(Vector value) { throw new PlatformNotSupportedException(); } + + /// + /// uint16_t svlasta[_u16](svbool_t pg, svuint16_t op) + /// LASTA Wresult, Pg, Zop.H + /// LASTA Hresult, Pg, Zop.H + /// + public static unsafe ushort ExtractAfterLastScalar(Vector value) { throw new PlatformNotSupportedException(); } + + /// + /// uint32_t svlasta[_u32](svbool_t pg, svuint32_t op) + /// LASTA Wresult, Pg, Zop.S + /// LASTA Sresult, Pg, Zop.S + /// + public static unsafe uint ExtractAfterLastScalar(Vector value) { throw new PlatformNotSupportedException(); } + + /// + /// uint64_t svlasta[_u64](svbool_t pg, svuint64_t op) + /// LASTA Xresult, Pg, Zop.D + /// LASTA Dresult, Pg, Zop.D + /// + public static unsafe ulong ExtractAfterLastScalar(Vector value) { throw new PlatformNotSupportedException(); } + + /// + /// uint8_t svlasta[_u8](svbool_t pg, svuint8_t op) + /// LASTA Wresult, Pg, Zop.B + /// LASTA Bresult, Pg, Zop.B + /// + public static unsafe Vector ExtractAfterLastVector(Vector value) { throw new PlatformNotSupportedException(); } + + /// + /// float64_t svlasta[_f64](svbool_t pg, svfloat64_t op) + /// LASTA Xresult, Pg, Zop.D + /// LASTA Dresult, Pg, Zop.D + /// + public static unsafe Vector ExtractAfterLastVector(Vector value) { throw new PlatformNotSupportedException(); } + + /// + /// int16_t svlasta[_s16](svbool_t pg, svint16_t op) + /// LASTA Wresult, Pg, Zop.H + /// LASTA Hresult, Pg, Zop.H + /// + public static unsafe Vector ExtractAfterLastVector(Vector value) { throw new PlatformNotSupportedException(); } + + /// + /// int32_t svlasta[_s32](svbool_t pg, svint32_t op) + /// LASTA Wresult, Pg, Zop.S + /// LASTA Sresult, Pg, Zop.S + /// + public static unsafe Vector ExtractAfterLastVector(Vector value) { throw new PlatformNotSupportedException(); } + + /// + /// int64_t svlasta[_s64](svbool_t pg, svint64_t op) + /// LASTA Xresult, Pg, Zop.D + /// LASTA Dresult, Pg, Zop.D + /// + public static unsafe Vector ExtractAfterLastVector(Vector value) { throw new PlatformNotSupportedException(); } + + /// + /// int8_t svlasta[_s8](svbool_t pg, svint8_t op) + /// LASTA Wresult, Pg, Zop.B + /// LASTA Bresult, Pg, Zop.B + /// + public static unsafe Vector ExtractAfterLastVector(Vector value) { throw new PlatformNotSupportedException(); } + + /// + /// float32_t svlasta[_f32](svbool_t pg, svfloat32_t op) + /// LASTA Wresult, Pg, Zop.S + /// LASTA Sresult, Pg, Zop.S + /// + public static unsafe Vector ExtractAfterLastVector(Vector value) { throw new PlatformNotSupportedException(); } + + /// + /// uint16_t svlasta[_u16](svbool_t pg, svuint16_t op) + /// LASTA Wresult, Pg, Zop.H + /// LASTA Hresult, Pg, Zop.H + /// + public static unsafe Vector ExtractAfterLastVector(Vector value) { throw new PlatformNotSupportedException(); } + + /// + /// uint32_t svlasta[_u32](svbool_t pg, svuint32_t op) + /// LASTA Wresult, Pg, Zop.S + /// LASTA Sresult, Pg, Zop.S + /// + public static unsafe Vector ExtractAfterLastVector(Vector value) { throw new PlatformNotSupportedException(); } + + /// + /// uint64_t svlasta[_u64](svbool_t pg, svuint64_t op) + /// LASTA Xresult, Pg, Zop.D + /// LASTA Dresult, Pg, Zop.D + /// + public static unsafe Vector ExtractAfterLastVector(Vector value) { throw new PlatformNotSupportedException(); } + + /// + /// uint8_t svlastb[_u8](svbool_t pg, svuint8_t op) + /// LASTB Wresult, Pg, Zop.B + /// LASTB Bresult, Pg, Zop.B + /// + public static unsafe byte ExtractLastScalar(Vector value) { throw new PlatformNotSupportedException(); } + + /// + /// float64_t svlastb[_f64](svbool_t pg, svfloat64_t op) + /// LASTB Xresult, Pg, Zop.D + /// LASTB Dresult, Pg, Zop.D + /// + public static unsafe double ExtractLastScalar(Vector value) { throw new PlatformNotSupportedException(); } + + /// + /// int16_t svlastb[_s16](svbool_t pg, svint16_t op) + /// LASTB Wresult, Pg, Zop.H + /// LASTB Hresult, Pg, Zop.H + /// + public static unsafe short ExtractLastScalar(Vector value) { throw new PlatformNotSupportedException(); } + + /// + /// int32_t svlastb[_s32](svbool_t pg, svint32_t op) + /// LASTB Wresult, Pg, Zop.S + /// LASTB Sresult, Pg, Zop.S + /// + public static unsafe int ExtractLastScalar(Vector value) { throw new PlatformNotSupportedException(); } + + /// + /// int64_t svlastb[_s64](svbool_t pg, svint64_t op) + /// LASTB Xresult, Pg, Zop.D + /// LASTB Dresult, Pg, Zop.D + /// + public static unsafe long ExtractLastScalar(Vector value) { throw new PlatformNotSupportedException(); } + + /// + /// int8_t svlastb[_s8](svbool_t pg, svint8_t op) + /// LASTB Wresult, Pg, Zop.B + /// LASTB Bresult, Pg, Zop.B + /// + public static unsafe sbyte ExtractLastScalar(Vector value) { throw new PlatformNotSupportedException(); } + + /// + /// float32_t svlastb[_f32](svbool_t pg, svfloat32_t op) + /// LASTB Wresult, Pg, Zop.S + /// LASTB Sresult, Pg, Zop.S + /// + public static unsafe float ExtractLastScalar(Vector value) { throw new PlatformNotSupportedException(); } + + /// + /// uint16_t svlastb[_u16](svbool_t pg, svuint16_t op) + /// LASTB Wresult, Pg, Zop.H + /// LASTB Hresult, Pg, Zop.H + /// + public static unsafe ushort ExtractLastScalar(Vector value) { throw new PlatformNotSupportedException(); } + + /// + /// uint32_t svlastb[_u32](svbool_t pg, svuint32_t op) + /// LASTB Wresult, Pg, Zop.S + /// LASTB Sresult, Pg, Zop.S + /// + public static unsafe uint ExtractLastScalar(Vector value) { throw new PlatformNotSupportedException(); } + + /// + /// uint64_t svlastb[_u64](svbool_t pg, svuint64_t op) + /// LASTB Xresult, Pg, Zop.D + /// LASTB Dresult, Pg, Zop.D + /// + public static unsafe ulong ExtractLastScalar(Vector value) { throw new PlatformNotSupportedException(); } + + /// + /// uint8_t svlastb[_u8](svbool_t pg, svuint8_t op) + /// LASTB Wresult, Pg, Zop.B + /// LASTB Bresult, Pg, Zop.B + /// + public static unsafe Vector ExtractLastVector(Vector value) { throw new PlatformNotSupportedException(); } + + /// + /// float64_t svlastb[_f64](svbool_t pg, svfloat64_t op) + /// LASTB Xresult, Pg, Zop.D + /// LASTB Dresult, Pg, Zop.D + /// + public static unsafe Vector ExtractLastVector(Vector value) { throw new PlatformNotSupportedException(); } + + /// + /// int16_t svlastb[_s16](svbool_t pg, svint16_t op) + /// LASTB Wresult, Pg, Zop.H + /// LASTB Hresult, Pg, Zop.H + /// + public static unsafe Vector ExtractLastVector(Vector value) { throw new PlatformNotSupportedException(); } + + /// + /// int32_t svlastb[_s32](svbool_t pg, svint32_t op) + /// LASTB Wresult, Pg, Zop.S + /// LASTB Sresult, Pg, Zop.S + /// + public static unsafe Vector ExtractLastVector(Vector value) { throw new PlatformNotSupportedException(); } + + /// + /// int64_t svlastb[_s64](svbool_t pg, svint64_t op) + /// LASTB Xresult, Pg, Zop.D + /// LASTB Dresult, Pg, Zop.D + /// + public static unsafe Vector ExtractLastVector(Vector value) { throw new PlatformNotSupportedException(); } + + /// + /// int8_t svlastb[_s8](svbool_t pg, svint8_t op) + /// LASTB Wresult, Pg, Zop.B + /// LASTB Bresult, Pg, Zop.B + /// + public static unsafe Vector ExtractLastVector(Vector value) { throw new PlatformNotSupportedException(); } + + /// + /// float32_t svlastb[_f32](svbool_t pg, svfloat32_t op) + /// LASTB Wresult, Pg, Zop.S + /// LASTB Sresult, Pg, Zop.S + /// + public static unsafe Vector ExtractLastVector(Vector value) { throw new PlatformNotSupportedException(); } + + /// + /// uint16_t svlastb[_u16](svbool_t pg, svuint16_t op) + /// LASTB Wresult, Pg, Zop.H + /// LASTB Hresult, Pg, Zop.H + /// + public static unsafe Vector ExtractLastVector(Vector value) { throw new PlatformNotSupportedException(); } + + /// + /// uint32_t svlastb[_u32](svbool_t pg, svuint32_t op) + /// LASTB Wresult, Pg, Zop.S + /// LASTB Sresult, Pg, Zop.S + /// + public static unsafe Vector ExtractLastVector(Vector value) { throw new PlatformNotSupportedException(); } + + /// + /// uint64_t svlastb[_u64](svbool_t pg, svuint64_t op) + /// LASTB Xresult, Pg, Zop.D + /// LASTB Dresult, Pg, Zop.D + /// + public static unsafe Vector ExtractLastVector(Vector value) { throw new PlatformNotSupportedException(); } + /// /// svuint8_t svext[_u8](svuint8_t op1, svuint8_t op2, uint64_t imm3) /// EXT Ztied1.B, Ztied1.B, Zop2.B, #imm3 diff --git a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve.cs b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve.cs index 328c2a30288c98..75fab0affbb200 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve.cs @@ -1522,6 +1522,286 @@ internal Arm64() { } public static unsafe Vector DuplicateSelectedScalarToVector(Vector data, [ConstantExpected(Min = 0, Max = (byte)(7))] byte index) => DuplicateSelectedScalarToVector(data, index); + /// + /// uint8_t svlasta[_u8](svbool_t pg, svuint8_t op) + /// LASTA Wresult, Pg, Zop.B + /// LASTA Bresult, Pg, Zop.B + /// + public static unsafe byte ExtractAfterLastScalar(Vector value) => ExtractAfterLastScalar(value); + + /// + /// float64_t svlasta[_f64](svbool_t pg, svfloat64_t op) + /// LASTA Xresult, Pg, Zop.D + /// LASTA Dresult, Pg, Zop.D + /// + public static unsafe double ExtractAfterLastScalar(Vector value) => ExtractAfterLastScalar(value); + + /// + /// int16_t svlasta[_s16](svbool_t pg, svint16_t op) + /// LASTA Wresult, Pg, Zop.H + /// LASTA Hresult, Pg, Zop.H + /// + public static unsafe short ExtractAfterLastScalar(Vector value) => ExtractAfterLastScalar(value); + + /// + /// int32_t svlasta[_s32](svbool_t pg, svint32_t op) + /// LASTA Wresult, Pg, Zop.S + /// LASTA Sresult, Pg, Zop.S + /// + public static unsafe int ExtractAfterLastScalar(Vector value) => ExtractAfterLastScalar(value); + + /// + /// int64_t svlasta[_s64](svbool_t pg, svint64_t op) + /// LASTA Xresult, Pg, Zop.D + /// LASTA Dresult, Pg, Zop.D + /// + public static unsafe long ExtractAfterLastScalar(Vector value) => ExtractAfterLastScalar(value); + + /// + /// int8_t svlasta[_s8](svbool_t pg, svint8_t op) + /// LASTA Wresult, Pg, Zop.B + /// LASTA Bresult, Pg, Zop.B + /// + public static unsafe sbyte ExtractAfterLastScalar(Vector value) => ExtractAfterLastScalar(value); + + /// + /// float32_t svlasta[_f32](svbool_t pg, svfloat32_t op) + /// LASTA Wresult, Pg, Zop.S + /// LASTA Sresult, Pg, Zop.S + /// + public static unsafe float ExtractAfterLastScalar(Vector value) => ExtractAfterLastScalar(value); + + /// + /// uint16_t svlasta[_u16](svbool_t pg, svuint16_t op) + /// LASTA Wresult, Pg, Zop.H + /// LASTA Hresult, Pg, Zop.H + /// + public static unsafe ushort ExtractAfterLastScalar(Vector value) => ExtractAfterLastScalar(value); + + /// + /// uint32_t svlasta[_u32](svbool_t pg, svuint32_t op) + /// LASTA Wresult, Pg, Zop.S + /// LASTA Sresult, Pg, Zop.S + /// + public static unsafe uint ExtractAfterLastScalar(Vector value) => ExtractAfterLastScalar(value); + + /// + /// uint64_t svlasta[_u64](svbool_t pg, svuint64_t op) + /// LASTA Xresult, Pg, Zop.D + /// LASTA Dresult, Pg, Zop.D + /// + public static unsafe ulong ExtractAfterLastScalar(Vector value) => ExtractAfterLastScalar(value); + + /// + /// uint8_t svlasta[_u8](svbool_t pg, svuint8_t op) + /// LASTA Wresult, Pg, Zop.B + /// LASTA Bresult, Pg, Zop.B + /// + public static unsafe Vector ExtractAfterLastVector(Vector value) => ExtractAfterLastVector(value); + + /// + /// float64_t svlasta[_f64](svbool_t pg, svfloat64_t op) + /// LASTA Xresult, Pg, Zop.D + /// LASTA Dresult, Pg, Zop.D + /// + public static unsafe Vector ExtractAfterLastVector(Vector value) => ExtractAfterLastVector(value); + + /// + /// int16_t svlasta[_s16](svbool_t pg, svint16_t op) + /// LASTA Wresult, Pg, Zop.H + /// LASTA Hresult, Pg, Zop.H + /// + public static unsafe Vector ExtractAfterLastVector(Vector value) => ExtractAfterLastVector(value); + + /// + /// int32_t svlasta[_s32](svbool_t pg, svint32_t op) + /// LASTA Wresult, Pg, Zop.S + /// LASTA Sresult, Pg, Zop.S + /// + public static unsafe Vector ExtractAfterLastVector(Vector value) => ExtractAfterLastVector(value); + + /// + /// int64_t svlasta[_s64](svbool_t pg, svint64_t op) + /// LASTA Xresult, Pg, Zop.D + /// LASTA Dresult, Pg, Zop.D + /// + public static unsafe Vector ExtractAfterLastVector(Vector value) => ExtractAfterLastVector(value); + + /// + /// int8_t svlasta[_s8](svbool_t pg, svint8_t op) + /// LASTA Wresult, Pg, Zop.B + /// LASTA Bresult, Pg, Zop.B + /// + public static unsafe Vector ExtractAfterLastVector(Vector value) => ExtractAfterLastVector(value); + + /// + /// float32_t svlasta[_f32](svbool_t pg, svfloat32_t op) + /// LASTA Wresult, Pg, Zop.S + /// LASTA Sresult, Pg, Zop.S + /// + public static unsafe Vector ExtractAfterLastVector(Vector value) => ExtractAfterLastVector(value); + + /// + /// uint16_t svlasta[_u16](svbool_t pg, svuint16_t op) + /// LASTA Wresult, Pg, Zop.H + /// LASTA Hresult, Pg, Zop.H + /// + public static unsafe Vector ExtractAfterLastVector(Vector value) => ExtractAfterLastVector(value); + + /// + /// uint32_t svlasta[_u32](svbool_t pg, svuint32_t op) + /// LASTA Wresult, Pg, Zop.S + /// LASTA Sresult, Pg, Zop.S + /// + public static unsafe Vector ExtractAfterLastVector(Vector value) => ExtractAfterLastVector(value); + + /// + /// uint64_t svlasta[_u64](svbool_t pg, svuint64_t op) + /// LASTA Xresult, Pg, Zop.D + /// LASTA Dresult, Pg, Zop.D + /// + public static unsafe Vector ExtractAfterLastVector(Vector value) => ExtractAfterLastVector(value); + + /// + /// uint8_t svlastb[_u8](svbool_t pg, svuint8_t op) + /// LASTB Wresult, Pg, Zop.B + /// LASTB Bresult, Pg, Zop.B + /// + public static unsafe byte ExtractLastScalar(Vector value) => ExtractLastScalar(value); + + /// + /// float64_t svlastb[_f64](svbool_t pg, svfloat64_t op) + /// LASTB Xresult, Pg, Zop.D + /// LASTB Dresult, Pg, Zop.D + /// + public static unsafe double ExtractLastScalar(Vector value) => ExtractLastScalar(value); + + /// + /// int16_t svlastb[_s16](svbool_t pg, svint16_t op) + /// LASTB Wresult, Pg, Zop.H + /// LASTB Hresult, Pg, Zop.H + /// + public static unsafe short ExtractLastScalar(Vector value) => ExtractLastScalar(value); + + /// + /// int32_t svlastb[_s32](svbool_t pg, svint32_t op) + /// LASTB Wresult, Pg, Zop.S + /// LASTB Sresult, Pg, Zop.S + /// + public static unsafe int ExtractLastScalar(Vector value) => ExtractLastScalar(value); + + /// + /// int64_t svlastb[_s64](svbool_t pg, svint64_t op) + /// LASTB Xresult, Pg, Zop.D + /// LASTB Dresult, Pg, Zop.D + /// + public static unsafe long ExtractLastScalar(Vector value) => ExtractLastScalar(value); + + /// + /// int8_t svlastb[_s8](svbool_t pg, svint8_t op) + /// LASTB Wresult, Pg, Zop.B + /// LASTB Bresult, Pg, Zop.B + /// + public static unsafe sbyte ExtractLastScalar(Vector value) => ExtractLastScalar(value); + + /// + /// float32_t svlastb[_f32](svbool_t pg, svfloat32_t op) + /// LASTB Wresult, Pg, Zop.S + /// LASTB Sresult, Pg, Zop.S + /// + public static unsafe float ExtractLastScalar(Vector value) => ExtractLastScalar(value); + + /// + /// uint16_t svlastb[_u16](svbool_t pg, svuint16_t op) + /// LASTB Wresult, Pg, Zop.H + /// LASTB Hresult, Pg, Zop.H + /// + public static unsafe ushort ExtractLastScalar(Vector value) => ExtractLastScalar(value); + + /// + /// uint32_t svlastb[_u32](svbool_t pg, svuint32_t op) + /// LASTB Wresult, Pg, Zop.S + /// LASTB Sresult, Pg, Zop.S + /// + public static unsafe uint ExtractLastScalar(Vector value) => ExtractLastScalar(value); + + /// + /// uint64_t svlastb[_u64](svbool_t pg, svuint64_t op) + /// LASTB Xresult, Pg, Zop.D + /// LASTB Dresult, Pg, Zop.D + /// + public static unsafe ulong ExtractLastScalar(Vector value) => ExtractLastScalar(value); + + /// + /// uint8_t svlastb[_u8](svbool_t pg, svuint8_t op) + /// LASTB Wresult, Pg, Zop.B + /// LASTB Bresult, Pg, Zop.B + /// + public static unsafe Vector ExtractLastVector(Vector value) => ExtractLastVector(value); + + /// + /// float64_t svlastb[_f64](svbool_t pg, svfloat64_t op) + /// LASTB Xresult, Pg, Zop.D + /// LASTB Dresult, Pg, Zop.D + /// + public static unsafe Vector ExtractLastVector(Vector value) => ExtractLastVector(value); + + /// + /// int16_t svlastb[_s16](svbool_t pg, svint16_t op) + /// LASTB Wresult, Pg, Zop.H + /// LASTB Hresult, Pg, Zop.H + /// + public static unsafe Vector ExtractLastVector(Vector value) => ExtractLastVector(value); + + /// + /// int32_t svlastb[_s32](svbool_t pg, svint32_t op) + /// LASTB Wresult, Pg, Zop.S + /// LASTB Sresult, Pg, Zop.S + /// + public static unsafe Vector ExtractLastVector(Vector value) => ExtractLastVector(value); + + /// + /// int64_t svlastb[_s64](svbool_t pg, svint64_t op) + /// LASTB Xresult, Pg, Zop.D + /// LASTB Dresult, Pg, Zop.D + /// + public static unsafe Vector ExtractLastVector(Vector value) => ExtractLastVector(value); + + /// + /// int8_t svlastb[_s8](svbool_t pg, svint8_t op) + /// LASTB Wresult, Pg, Zop.B + /// LASTB Bresult, Pg, Zop.B + /// + public static unsafe Vector ExtractLastVector(Vector value) => ExtractLastVector(value); + + /// + /// float32_t svlastb[_f32](svbool_t pg, svfloat32_t op) + /// LASTB Wresult, Pg, Zop.S + /// LASTB Sresult, Pg, Zop.S + /// + public static unsafe Vector ExtractLastVector(Vector value) => ExtractLastVector(value); + + /// + /// uint16_t svlastb[_u16](svbool_t pg, svuint16_t op) + /// LASTB Wresult, Pg, Zop.H + /// LASTB Hresult, Pg, Zop.H + /// + public static unsafe Vector ExtractLastVector(Vector value) => ExtractLastVector(value); + + /// + /// uint32_t svlastb[_u32](svbool_t pg, svuint32_t op) + /// LASTB Wresult, Pg, Zop.S + /// LASTB Sresult, Pg, Zop.S + /// + public static unsafe Vector ExtractLastVector(Vector value) => ExtractLastVector(value); + + /// + /// uint64_t svlastb[_u64](svbool_t pg, svuint64_t op) + /// LASTB Xresult, Pg, Zop.D + /// LASTB Dresult, Pg, Zop.D + /// + public static unsafe Vector ExtractLastVector(Vector value) => ExtractLastVector(value); + /// /// svuint8_t svext[_u8](svuint8_t op1, svuint8_t op2, uint64_t imm3) /// EXT Ztied1.B, Ztied1.B, Zop2.B, #imm3 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 2804c47b500e8b..6affdf0ad2080d 100644 --- a/src/libraries/System.Runtime.Intrinsics/ref/System.Runtime.Intrinsics.cs +++ b/src/libraries/System.Runtime.Intrinsics/ref/System.Runtime.Intrinsics.cs @@ -4401,6 +4401,47 @@ internal Arm64() { } public static System.Numerics.Vector DuplicateSelectedScalarToVector(System.Numerics.Vector data, [ConstantExpected(Min = 0, Max = (byte)(31))] byte index) { throw null; } public static System.Numerics.Vector DuplicateSelectedScalarToVector(System.Numerics.Vector data, [ConstantExpected(Min = 0, Max = (byte)(15))] byte index) { throw null; } public static System.Numerics.Vector DuplicateSelectedScalarToVector(System.Numerics.Vector data, [ConstantExpected(Min = 0, Max = (byte)(7))] byte index) { throw null; } + + public static unsafe byte ExtractAfterLastScalar(System.Numerics.Vector value) { throw null; } + public static unsafe double ExtractAfterLastScalar(System.Numerics.Vector value) { throw null; } + public static unsafe short ExtractAfterLastScalar(System.Numerics.Vector value) { throw null; } + public static unsafe int ExtractAfterLastScalar(System.Numerics.Vector value) { throw null; } + public static unsafe long ExtractAfterLastScalar(System.Numerics.Vector value) { throw null; } + public static unsafe sbyte ExtractAfterLastScalar(System.Numerics.Vector value) { throw null; } + public static unsafe float ExtractAfterLastScalar(System.Numerics.Vector value) { throw null; } + public static unsafe ushort ExtractAfterLastScalar(System.Numerics.Vector value) { throw null; } + public static unsafe uint ExtractAfterLastScalar(System.Numerics.Vector value) { throw null; } + public static unsafe ulong ExtractAfterLastScalar(System.Numerics.Vector value) { throw null; } + public static unsafe System.Numerics.Vector ExtractAfterLastVector(System.Numerics.Vector value) { throw null; } + public static unsafe System.Numerics.Vector ExtractAfterLastVector(System.Numerics.Vector value) { throw null; } + public static unsafe System.Numerics.Vector ExtractAfterLastVector(System.Numerics.Vector value) { throw null; } + public static unsafe System.Numerics.Vector ExtractAfterLastVector(System.Numerics.Vector value) { throw null; } + public static unsafe System.Numerics.Vector ExtractAfterLastVector(System.Numerics.Vector value) { throw null; } + public static unsafe System.Numerics.Vector ExtractAfterLastVector(System.Numerics.Vector value) { throw null; } + public static unsafe System.Numerics.Vector ExtractAfterLastVector(System.Numerics.Vector value) { throw null; } + public static unsafe System.Numerics.Vector ExtractAfterLastVector(System.Numerics.Vector value) { throw null; } + public static unsafe System.Numerics.Vector ExtractAfterLastVector(System.Numerics.Vector value) { throw null; } + public static unsafe System.Numerics.Vector ExtractAfterLastVector(System.Numerics.Vector value) { throw null; } + public static unsafe byte ExtractLastScalar(System.Numerics.Vector value) { throw null; } + public static unsafe double ExtractLastScalar(System.Numerics.Vector value) { throw null; } + public static unsafe short ExtractLastScalar(System.Numerics.Vector value) { throw null; } + public static unsafe int ExtractLastScalar(System.Numerics.Vector value) { throw null; } + public static unsafe long ExtractLastScalar(System.Numerics.Vector value) { throw null; } + public static unsafe sbyte ExtractLastScalar(System.Numerics.Vector value) { throw null; } + public static unsafe float ExtractLastScalar(System.Numerics.Vector value) { throw null; } + public static unsafe ushort ExtractLastScalar(System.Numerics.Vector value) { throw null; } + public static unsafe uint ExtractLastScalar(System.Numerics.Vector value) { throw null; } + public static unsafe ulong ExtractLastScalar(System.Numerics.Vector value) { throw null; } + public static unsafe System.Numerics.Vector ExtractLastVector(System.Numerics.Vector value) { throw null; } + public static unsafe System.Numerics.Vector ExtractLastVector(System.Numerics.Vector value) { throw null; } + public static unsafe System.Numerics.Vector ExtractLastVector(System.Numerics.Vector value) { throw null; } + public static unsafe System.Numerics.Vector ExtractLastVector(System.Numerics.Vector value) { throw null; } + public static unsafe System.Numerics.Vector ExtractLastVector(System.Numerics.Vector value) { throw null; } + public static unsafe System.Numerics.Vector ExtractLastVector(System.Numerics.Vector value) { throw null; } + public static unsafe System.Numerics.Vector ExtractLastVector(System.Numerics.Vector value) { throw null; } + public static unsafe System.Numerics.Vector ExtractLastVector(System.Numerics.Vector value) { throw null; } + public static unsafe System.Numerics.Vector ExtractLastVector(System.Numerics.Vector value) { throw null; } + public static unsafe System.Numerics.Vector ExtractLastVector(System.Numerics.Vector value) { throw null; } public static unsafe System.Numerics.Vector ExtractVector(System.Numerics.Vector upper, System.Numerics.Vector lower, [ConstantExpected] byte index) { throw null; } public static unsafe System.Numerics.Vector ExtractVector(System.Numerics.Vector upper, System.Numerics.Vector lower, [ConstantExpected] byte index) { throw null; } diff --git a/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs b/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs index eff5ba80442fa4..4eae7ef05b289e 100644 --- a/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs +++ b/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs @@ -100,6 +100,7 @@ if (!result.SequenceEqual(maskedVectorResult)) { + TestLibrary.TestFramework.LogInformation($"" maskedVectorResult: ({string.Join("", "", maskedVectorResult)})""); succeeded = false; } }"; @@ -177,6 +178,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 }), @@ -4042,6 +4044,50 @@ ("SveVecPairBinOpTest.template", new Dictionary { ["TestName"] = "SveTransposeOdd_ushort", ["Isa"] = "Sve", ["LoadIsa"] = "Sve", ["Method"] = "TransposeOdd", ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt16", ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt16", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()", ["NextValueOp2"] = "TestLibrary.Generator.GetUInt16()", ["ValidateEntry"] = "result[i] != left[index * 2 + 1] || result[i + 1] != right[index * 2 + 1]"}), ("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]"}), + + ("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 5cdd61a162c82f..665a7206b1ecd0 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[0]; + 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/_SveUnaryOpTestTemplate.template b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/_SveUnaryOpTestTemplate.template index 119cc5d88cb6fa..1802380b62918d 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;