Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions src/coreclr/jit/hwintrinsiccodegenxarch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -927,6 +927,10 @@ void CodeGen::genHWIntrinsic(GenTreeHWIntrinsic* node)
case NI_AVXVNNI_MultiplyWideningAndAddSaturate:
case NI_AVX512v3_MultiplyWideningAndAdd:
case NI_AVX512v3_MultiplyWideningAndAddSaturate:
case NI_AVXIFMA_MultiplyAdd52Low:
case NI_AVXIFMA_MultiplyAdd52High:
case NI_AVX512v2_MultiplyAdd52Low:
case NI_AVX512v2_MultiplyAdd52High:
case NI_AVX512BMM_BitMultiplyMatrix16x16WithOrReduction:
case NI_AVX512BMM_BitMultiplyMatrix16x16WithXorReduction:
{
Expand Down
12 changes: 12 additions & 0 deletions src/coreclr/jit/hwintrinsiclistxarch.h
Original file line number Diff line number Diff line change
Expand Up @@ -634,6 +634,8 @@ HARDWARE_INTRINSIC(AVX512_X64, ConvertToUInt64WithTruncation,
// Intrinsics for AVX512-IFMA, AVX512-VBMI
#define FIRST_NI_AVX512v2 NI_AVX512v2_MultiShift
HARDWARE_INTRINSIC(AVX512v2, MultiShift, -1, 2, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_vpmultishiftqb, INS_vpmultishiftqb, INS_invalid, INS_invalid, 3, -1, HW_Category_SimpleSIMD, HW_Flag_BaseTypeFromSecondArg)
HARDWARE_INTRINSIC(AVX512v2, MultiplyAdd52High, -1, 3, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_vpmadd52huq, INS_invalid, INS_invalid, 5, -1, HW_Category_SimpleSIMD, HW_Flag_NoFlag)
HARDWARE_INTRINSIC(AVX512v2, MultiplyAdd52Low, -1, 3, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_vpmadd52luq, INS_invalid, INS_invalid, 5, -1, HW_Category_SimpleSIMD, HW_Flag_NoFlag)
HARDWARE_INTRINSIC(AVX512v2, PermuteVar16x8, 16, 2, INS_vpermb, INS_vpermb, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, 3, -1, HW_Category_SimpleSIMD, HW_Flag_SpecialImport)
HARDWARE_INTRINSIC(AVX512v2, PermuteVar16x8x2, 16, 3, INS_vpermt2b, INS_vpermt2b, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, 4, -1, HW_Category_SimpleSIMD, HW_Flag_SpecialCodeGen|HW_Flag_PermuteVar2x|HW_Flag_RmwIntrinsic)
HARDWARE_INTRINSIC(AVX512v2, PermuteVar32x8, 32, 2, INS_vpermb, INS_vpermb, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, 3, -1, HW_Category_SimpleSIMD, HW_Flag_SpecialImport)
Expand Down Expand Up @@ -709,6 +711,16 @@ HARDWARE_INTRINSIC(AVXVNNI, MultiplyWideningAndAddSaturate,
// ISA Function name SIMD size NumArg Instructions IntCost FltCost Category Flags
// TYP_BYTE, TYP_UBYTE, TYP_SHORT, TYP_USHORT, TYP_INT, TYP_UINT, TYP_LONG, TYP_ULONG, TYP_FLOAT, TYP_DOUBLE
// ***************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************
// Intrinsics for AVX-IFMA (VEX-encoded VPMADD52*UQ on V128 / V256)
#define FIRST_NI_AVXIFMA NI_AVXIFMA_MultiplyAdd52High
HARDWARE_INTRINSIC(AVXIFMA, MultiplyAdd52High, -1, 3, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_vpmadd52huq, INS_invalid, INS_invalid, 5, -1, HW_Category_SimpleSIMD, HW_Flag_NoEvexSemantics)
HARDWARE_INTRINSIC(AVXIFMA, MultiplyAdd52Low, -1, 3, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_vpmadd52luq, INS_invalid, INS_invalid, 5, -1, HW_Category_SimpleSIMD, HW_Flag_NoEvexSemantics)
#define LAST_NI_AVXIFMA NI_AVXIFMA_MultiplyAdd52Low

// ***************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************
// ISA Function name SIMD size NumArg Instructions IntCost FltCost Category Flags
// {TYP_BYTE, TYP_UBYTE, TYP_SHORT, TYP_USHORT, TYP_INT, TYP_UINT, TYP_LONG, TYP_ULONG, TYP_FLOAT, TYP_DOUBLE}
// ***************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************
// AVXVNNIINT Intrinsics
#define FIRST_NI_AVXVNNIINT NI_AVXVNNIINT_MultiplyWideningAndAdd
HARDWARE_INTRINSIC(AVXVNNIINT, MultiplyWideningAndAdd, -1, 3, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, 5, -1, HW_Category_SimpleSIMD, HW_Flag_BaseTypeFromSecondArg|HW_Flag_SpecialCodeGen|HW_Flag_SpecialImport)
Expand Down
17 changes: 16 additions & 1 deletion src/coreclr/jit/hwintrinsicxarch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,14 @@ static CORINFO_InstructionSet V512VersionOfIsa(CORINFO_InstructionSet isa)
return InstructionSet_AVX512v3;
}

case InstructionSet_AVXIFMA:
case InstructionSet_AVX512v2:
{
// AvxIfma.V512 lifts under AVX512v2, which carries the EVEX-encoded
// VPMADD52*UQ on ZMM. Same rationale as AvxVnni.V512 above.
return InstructionSet_AVX512v2;
}

default:
{
return InstructionSet_NONE;
Expand Down Expand Up @@ -276,7 +284,14 @@ CORINFO_InstructionSet Compiler::lookupInstructionSet(const char* className)
}
else if (strcmp(className + 3, "Ifma") == 0)
{
return InstructionSet_AVXIFMA;
if (compSupportsHWIntrinsic(InstructionSet_AVXIFMA))
{
return InstructionSet_AVXIFMA;
}
else
{
return InstructionSet_AVX512v2;
}
}
else if (strncmp(className + 3, "Vnni", 4) == 0)
{
Expand Down
3 changes: 3 additions & 0 deletions src/coreclr/jit/lowerxarch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10175,6 +10175,9 @@ void Lowering::ContainCheckHWIntrinsic(GenTreeHWIntrinsic* node)
assert((intrinsicId == NI_X86Base_DivRem) || (intrinsicId == NI_X86Base_X64_DivRem) ||
(intrinsicId == NI_AVX512v3_MultiplyWideningAndAdd) ||
(intrinsicId == NI_AVX512v3_MultiplyWideningAndAddSaturate) ||
(intrinsicId == NI_AVX512v2_MultiplyAdd52Low) ||
(intrinsicId == NI_AVX512v2_MultiplyAdd52High) ||
(intrinsicId >= FIRST_NI_AVXIFMA && intrinsicId <= LAST_NI_AVXIFMA) ||
(intrinsicId >= FIRST_NI_AVXVNNI && intrinsicId <= LAST_NI_AVXVNNIINT_V512));
TryMakeSrcContainedOrRegOptional(node, op3);
break;
Expand Down
4 changes: 4 additions & 0 deletions src/coreclr/jit/lsraxarch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2734,6 +2734,10 @@ int LinearScan::BuildHWIntrinsic(GenTreeHWIntrinsic* intrinsicTree, int* pDstCou
case NI_AVXVNNI_MultiplyWideningAndAddSaturate:
case NI_AVX512v3_MultiplyWideningAndAdd:
case NI_AVX512v3_MultiplyWideningAndAddSaturate:
case NI_AVXIFMA_MultiplyAdd52Low:
case NI_AVXIFMA_MultiplyAdd52High:
case NI_AVX512v2_MultiplyAdd52Low:
case NI_AVX512v2_MultiplyAdd52High:
case NI_AVXVNNIINT_MultiplyWideningAndAdd:
case NI_AVXVNNIINT_MultiplyWideningAndAddSaturate:
case NI_AVXVNNIINT_V512_MultiplyWideningAndAdd:
Expand Down
1 change: 1 addition & 0 deletions src/coreclr/tools/Common/InstructionSetHelpers.cs
Original file line number Diff line number Diff line change
Expand Up @@ -291,6 +291,7 @@ public static InstructionSetSupport ConfigureInstructionSetSupport(string instru
optimisticInstructionSetSupportBuilder.AddSupportedInstructionSet("avx10v2");
optimisticInstructionSetSupportBuilder.AddSupportedInstructionSet("avxvnniint_v512");
optimisticInstructionSetSupportBuilder.AddSupportedInstructionSet("avxvnni_v512");
optimisticInstructionSetSupportBuilder.AddSupportedInstructionSet("avxifma_v512");
optimisticInstructionSetSupportBuilder.AddSupportedInstructionSet("avx512vp2intersect");
optimisticInstructionSetSupportBuilder.AddSupportedInstructionSet("aes_v512");
optimisticInstructionSetSupportBuilder.AddSupportedInstructionSet("gfni_v512");
Expand Down
Loading
Loading