45ce540b9b
* ARMeilleure: Add `GFNI` detection This is intended for utilizing the `gf2p8affineqb` instruction * ARMeilleure: Add `gf2p8affineqb` Not using the VEX or EVEX-form of this instruction is intentional. There are `GFNI`-chips that do not support AVX(so no VEX encoding) such as Tremont(Lakefield) chips as well as Jasper Lake.13df339fe7/GenuineIntel/GenuineIntel00806A1_Lakefield_LC_InstLatX64.txt (L1297-L1299)
13df339fe7/GenuineIntel/GenuineIntel00906C0_JasperLake_InstLatX64.txt (L1252-L1254)
* ARMeilleure: Add `gfni` acceleration of `Rbit_V` Passes all `Rbit_V*` unit tests on my `i9-11900k` * ARMeilleure: Add `gfni` acceleration of `S{l,r}i_V` Also added a fast-path for when the shift amount is greater than the size of the element. * ARMeilleure: Add `gfni` acceleration of `Shl_V` and `Sshr_V` * ARMeilleure: Increment InternalVersion * ARMeilleure: Fix Intrinsic and Assembler Table alignment `gf2p8affineqb` is the longest instruction name I know of. It shouldn't get any wider than this. * ARMeilleure: Remove SSE2+SHA requirement for GFNI * ARMeilleure Add `X86GetGf2p8LogicalShiftLeft` Used to generate GF(2^8) 8x8 bit-matrices for bit-shifting for the `gf2p8affineqb` instruction. * ARMeilleure: Append `FeatureInfo7Ecx` to `FeatureInfo`
89 lines
No EOL
3.2 KiB
C#
89 lines
No EOL
3.2 KiB
C#
using System;
|
|
using System.Runtime.Intrinsics.X86;
|
|
|
|
namespace ARMeilleure.CodeGen.X86
|
|
{
|
|
static class HardwareCapabilities
|
|
{
|
|
static HardwareCapabilities()
|
|
{
|
|
if (!X86Base.IsSupported)
|
|
{
|
|
return;
|
|
}
|
|
|
|
(int maxNum, _, _, _) = X86Base.CpuId(0x00000000, 0x00000000);
|
|
|
|
(_, _, int ecx1, int edx1) = X86Base.CpuId(0x00000001, 0x00000000);
|
|
FeatureInfo1Edx = (FeatureFlags1Edx)edx1;
|
|
FeatureInfo1Ecx = (FeatureFlags1Ecx)ecx1;
|
|
|
|
if (maxNum >= 7)
|
|
{
|
|
(_, int ebx7, int ecx7, _) = X86Base.CpuId(0x00000007, 0x00000000);
|
|
FeatureInfo7Ebx = (FeatureFlags7Ebx)ebx7;
|
|
FeatureInfo7Ecx = (FeatureFlags7Ecx)ecx7;
|
|
}
|
|
}
|
|
|
|
[Flags]
|
|
public enum FeatureFlags1Edx
|
|
{
|
|
Sse = 1 << 25,
|
|
Sse2 = 1 << 26
|
|
}
|
|
|
|
[Flags]
|
|
public enum FeatureFlags1Ecx
|
|
{
|
|
Sse3 = 1 << 0,
|
|
Pclmulqdq = 1 << 1,
|
|
Ssse3 = 1 << 9,
|
|
Fma = 1 << 12,
|
|
Sse41 = 1 << 19,
|
|
Sse42 = 1 << 20,
|
|
Popcnt = 1 << 23,
|
|
Aes = 1 << 25,
|
|
Avx = 1 << 28,
|
|
F16c = 1 << 29
|
|
}
|
|
|
|
[Flags]
|
|
public enum FeatureFlags7Ebx
|
|
{
|
|
Avx2 = 1 << 5,
|
|
Sha = 1 << 29
|
|
}
|
|
|
|
[Flags]
|
|
public enum FeatureFlags7Ecx
|
|
{
|
|
Gfni = 1 << 8,
|
|
}
|
|
|
|
public static FeatureFlags1Edx FeatureInfo1Edx { get; }
|
|
public static FeatureFlags1Ecx FeatureInfo1Ecx { get; }
|
|
public static FeatureFlags7Ebx FeatureInfo7Ebx { get; } = 0;
|
|
public static FeatureFlags7Ecx FeatureInfo7Ecx { get; } = 0;
|
|
|
|
public static bool SupportsSse => FeatureInfo1Edx.HasFlag(FeatureFlags1Edx.Sse);
|
|
public static bool SupportsSse2 => FeatureInfo1Edx.HasFlag(FeatureFlags1Edx.Sse2);
|
|
public static bool SupportsSse3 => FeatureInfo1Ecx.HasFlag(FeatureFlags1Ecx.Sse3);
|
|
public static bool SupportsPclmulqdq => FeatureInfo1Ecx.HasFlag(FeatureFlags1Ecx.Pclmulqdq);
|
|
public static bool SupportsSsse3 => FeatureInfo1Ecx.HasFlag(FeatureFlags1Ecx.Ssse3);
|
|
public static bool SupportsFma => FeatureInfo1Ecx.HasFlag(FeatureFlags1Ecx.Fma);
|
|
public static bool SupportsSse41 => FeatureInfo1Ecx.HasFlag(FeatureFlags1Ecx.Sse41);
|
|
public static bool SupportsSse42 => FeatureInfo1Ecx.HasFlag(FeatureFlags1Ecx.Sse42);
|
|
public static bool SupportsPopcnt => FeatureInfo1Ecx.HasFlag(FeatureFlags1Ecx.Popcnt);
|
|
public static bool SupportsAesni => FeatureInfo1Ecx.HasFlag(FeatureFlags1Ecx.Aes);
|
|
public static bool SupportsAvx => FeatureInfo1Ecx.HasFlag(FeatureFlags1Ecx.Avx);
|
|
public static bool SupportsAvx2 => FeatureInfo7Ebx.HasFlag(FeatureFlags7Ebx.Avx2) && SupportsAvx;
|
|
public static bool SupportsF16c => FeatureInfo1Ecx.HasFlag(FeatureFlags1Ecx.F16c);
|
|
public static bool SupportsSha => FeatureInfo7Ebx.HasFlag(FeatureFlags7Ebx.Sha);
|
|
public static bool SupportsGfni => FeatureInfo7Ecx.HasFlag(FeatureFlags7Ecx.Gfni);
|
|
|
|
public static bool ForceLegacySse { get; set; }
|
|
|
|
public static bool SupportsVexEncoding => SupportsAvx && !ForceLegacySse;
|
|
}
|
|
} |