Skip to content

Commit

Permalink
Make Vector256 dependent on AVX instruction set (dotnet#36895)
Browse files Browse the repository at this point in the history
  • Loading branch information
kunalspathak authored May 23, 2020
1 parent fdef317 commit 75141e1
Show file tree
Hide file tree
Showing 4 changed files with 48 additions and 8 deletions.
4 changes: 4 additions & 0 deletions src/coreclr/src/inc/corinfoinstructionset.h
Original file line number Diff line number Diff line change
Expand Up @@ -274,6 +274,8 @@ inline CORINFO_InstructionSetFlags EnsureInstructionSetFlagsAreValid(CORINFO_Ins
resultflags.RemoveInstructionSet(InstructionSet_PCLMULQDQ);
if (resultflags.HasInstructionSet(InstructionSet_POPCNT) && !resultflags.HasInstructionSet(InstructionSet_SSE42))
resultflags.RemoveInstructionSet(InstructionSet_POPCNT);
if (resultflags.HasInstructionSet(InstructionSet_Vector256) && !resultflags.HasInstructionSet(InstructionSet_AVX))
resultflags.RemoveInstructionSet(InstructionSet_Vector256);
#endif // TARGET_AMD64
#ifdef TARGET_X86
if (resultflags.HasInstructionSet(InstructionSet_SSE) && !resultflags.HasInstructionSet(InstructionSet_X86Base))
Expand Down Expand Up @@ -304,6 +306,8 @@ inline CORINFO_InstructionSetFlags EnsureInstructionSetFlagsAreValid(CORINFO_Ins
resultflags.RemoveInstructionSet(InstructionSet_PCLMULQDQ);
if (resultflags.HasInstructionSet(InstructionSet_POPCNT) && !resultflags.HasInstructionSet(InstructionSet_SSE42))
resultflags.RemoveInstructionSet(InstructionSet_POPCNT);
if (resultflags.HasInstructionSet(InstructionSet_Vector256) && !resultflags.HasInstructionSet(InstructionSet_AVX))
resultflags.RemoveInstructionSet(InstructionSet_Vector256);
#endif // TARGET_X86

} while (!oldflags.Equals(resultflags));
Expand Down
43 changes: 35 additions & 8 deletions src/coreclr/src/jit/hwintrinsic.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -607,15 +607,42 @@ static bool isSupportedBaseType(NamedIntrinsic intrinsic, var_types baseType)
}

#ifdef TARGET_XARCH
assert((intrinsic >= NI_Vector128_As && intrinsic <= NI_Vector128_AsUInt64) ||
(intrinsic >= NI_Vector128_get_AllBitsSet && intrinsic <= NI_Vector128_WithElement) ||
(intrinsic >= NI_Vector256_As && intrinsic <= NI_Vector256_AsUInt64) ||
(intrinsic >= NI_Vector256_get_AllBitsSet && intrinsic <= NI_Vector256_WithElement));
assert((intrinsic == NI_Vector128_As) || (intrinsic == NI_Vector128_AsByte) ||
(intrinsic == NI_Vector128_AsDouble) || (intrinsic == NI_Vector128_AsInt16) ||
(intrinsic == NI_Vector128_AsInt32) || (intrinsic == NI_Vector128_AsInt64) ||
(intrinsic == NI_Vector128_AsSByte) || (intrinsic == NI_Vector128_AsSingle) ||
(intrinsic == NI_Vector128_AsUInt16) || (intrinsic == NI_Vector128_AsUInt32) ||
(intrinsic == NI_Vector128_AsUInt64) || (intrinsic == NI_Vector128_get_AllBitsSet) ||
(intrinsic == NI_Vector128_get_Count) || (intrinsic == NI_Vector128_get_Zero) ||
(intrinsic == NI_Vector128_GetElement) || (intrinsic == NI_Vector128_WithElement) ||
(intrinsic == NI_Vector128_ToScalar) || (intrinsic == NI_Vector128_ToVector256) ||
(intrinsic == NI_Vector128_ToVector256Unsafe) || (intrinsic == NI_Vector256_As) ||
(intrinsic == NI_Vector256_AsByte) || (intrinsic == NI_Vector256_AsDouble) ||
(intrinsic == NI_Vector256_AsInt16) || (intrinsic == NI_Vector256_AsInt32) ||
(intrinsic == NI_Vector256_AsInt64) || (intrinsic == NI_Vector256_AsSByte) ||
(intrinsic == NI_Vector256_AsSingle) || (intrinsic == NI_Vector256_AsUInt16) ||
(intrinsic == NI_Vector256_AsUInt32) || (intrinsic == NI_Vector256_AsUInt64) ||
(intrinsic == NI_Vector256_get_AllBitsSet) || (intrinsic == NI_Vector256_get_Count) ||
(intrinsic == NI_Vector256_get_Zero) || (intrinsic == NI_Vector256_GetElement) ||
(intrinsic == NI_Vector256_WithElement) || (intrinsic == NI_Vector256_GetLower) ||
(intrinsic == NI_Vector256_ToScalar));
#else
assert((intrinsic >= NI_Vector64_AsByte && intrinsic <= NI_Vector64_AsUInt32) ||
(intrinsic >= NI_Vector64_get_AllBitsSet && intrinsic <= NI_Vector64_ToVector128Unsafe) ||
(intrinsic >= NI_Vector128_As && intrinsic <= NI_Vector128_AsUInt64) ||
(intrinsic >= NI_Vector128_get_AllBitsSet && intrinsic <= NI_Vector128_ToScalar));
assert((intrinsic == NI_Vector64_AsByte) || (intrinsic == NI_Vector64_AsInt16) ||
(intrinsic == NI_Vector64_AsInt32) || (intrinsic == NI_Vector64_AsSByte) ||
(intrinsic == NI_Vector64_AsSingle) || (intrinsic == NI_Vector64_AsUInt16) ||
(intrinsic == NI_Vector64_AsUInt32) || (intrinsic == NI_Vector64_get_AllBitsSet) ||
(intrinsic == NI_Vector64_get_Count) || (intrinsic == NI_Vector64_get_Zero) ||
(intrinsic == NI_Vector64_GetElement) || (intrinsic == NI_Vector64_ToScalar) ||
(intrinsic == NI_Vector64_ToVector128) || (intrinsic == NI_Vector64_ToVector128Unsafe) ||
(intrinsic == NI_Vector128_As) || (intrinsic == NI_Vector128_AsByte) ||
(intrinsic == NI_Vector128_AsDouble) || (intrinsic == NI_Vector128_AsInt16) ||
(intrinsic == NI_Vector128_AsInt32) || (intrinsic == NI_Vector128_AsInt64) ||
(intrinsic == NI_Vector128_AsSByte) || (intrinsic == NI_Vector128_AsSingle) ||
(intrinsic == NI_Vector128_AsUInt16) || (intrinsic == NI_Vector128_AsUInt32) ||
(intrinsic == NI_Vector128_AsUInt64) || (intrinsic == NI_Vector128_get_AllBitsSet) ||
(intrinsic == NI_Vector128_get_Count) || (intrinsic == NI_Vector128_get_Zero) ||
(intrinsic == NI_Vector128_GetElement) || (intrinsic == NI_Vector128_GetLower) ||
(intrinsic == NI_Vector128_ToScalar));
#endif
return false;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -254,6 +254,8 @@ public static InstructionSetFlags ExpandInstructionSetByImplicationHelper(Target
resultflags.AddInstructionSet(InstructionSet.X64_SSE2);
if (resultflags.HasInstructionSet(InstructionSet.X64_POPCNT))
resultflags.AddInstructionSet(InstructionSet.X64_SSE42);
if (resultflags.HasInstructionSet(InstructionSet.X64_Vector256))
resultflags.AddInstructionSet(InstructionSet.X64_AVX);
break;

case TargetArchitecture.X86:
Expand Down Expand Up @@ -285,6 +287,8 @@ public static InstructionSetFlags ExpandInstructionSetByImplicationHelper(Target
resultflags.AddInstructionSet(InstructionSet.X86_SSE2);
if (resultflags.HasInstructionSet(InstructionSet.X86_POPCNT))
resultflags.AddInstructionSet(InstructionSet.X86_SSE42);
if (resultflags.HasInstructionSet(InstructionSet.X86_Vector256))
resultflags.AddInstructionSet(InstructionSet.X86_AVX);
break;

}
Expand Down Expand Up @@ -373,6 +377,8 @@ private static InstructionSetFlags ExpandInstructionSetByReverseImplicationHelpe
resultflags.AddInstructionSet(InstructionSet.X64_PCLMULQDQ);
if (resultflags.HasInstructionSet(InstructionSet.X64_SSE42))
resultflags.AddInstructionSet(InstructionSet.X64_POPCNT);
if (resultflags.HasInstructionSet(InstructionSet.X64_AVX))
resultflags.AddInstructionSet(InstructionSet.X64_Vector256);
break;

case TargetArchitecture.X86:
Expand Down Expand Up @@ -404,6 +410,8 @@ private static InstructionSetFlags ExpandInstructionSetByReverseImplicationHelpe
resultflags.AddInstructionSet(InstructionSet.X86_PCLMULQDQ);
if (resultflags.HasInstructionSet(InstructionSet.X86_SSE42))
resultflags.AddInstructionSet(InstructionSet.X86_POPCNT);
if (resultflags.HasInstructionSet(InstructionSet.X86_AVX))
resultflags.AddInstructionSet(InstructionSet.X86_Vector256);
break;

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ instructionset ,X86 ,Popcnt , ,15 ,POPCNT ,popcnt
implication ,X86 ,POPCNT ,SSE42
instructionset ,X86 , , , ,Vector128,
instructionset ,X86 , , , ,Vector256,
implication ,X86 ,Vector256 ,AVX

; Definition of X64 instruction sets (Define )
definearch ,X64 ,64Bit ,X64
Expand Down

0 comments on commit 75141e1

Please sign in to comment.