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`
48 lines
No EOL
3 KiB
C#
48 lines
No EOL
3 KiB
C#
using ARMeilleure.CodeGen.X86;
|
|
|
|
namespace ARMeilleure
|
|
{
|
|
public static class Optimizations
|
|
{
|
|
public static bool FastFP { get; set; } = true;
|
|
|
|
public static bool AllowLcqInFunctionTable { get; set; } = true;
|
|
public static bool UseUnmanagedDispatchLoop { get; set; } = true;
|
|
|
|
public static bool UseSseIfAvailable { get; set; } = true;
|
|
public static bool UseSse2IfAvailable { get; set; } = true;
|
|
public static bool UseSse3IfAvailable { get; set; } = true;
|
|
public static bool UseSsse3IfAvailable { get; set; } = true;
|
|
public static bool UseSse41IfAvailable { get; set; } = true;
|
|
public static bool UseSse42IfAvailable { get; set; } = true;
|
|
public static bool UsePopCntIfAvailable { get; set; } = true;
|
|
public static bool UseAvxIfAvailable { get; set; } = true;
|
|
public static bool UseF16cIfAvailable { get; set; } = true;
|
|
public static bool UseFmaIfAvailable { get; set; } = true;
|
|
public static bool UseAesniIfAvailable { get; set; } = true;
|
|
public static bool UsePclmulqdqIfAvailable { get; set; } = true;
|
|
public static bool UseShaIfAvailable { get; set; } = true;
|
|
public static bool UseGfniIfAvailable { get; set; } = true;
|
|
|
|
public static bool ForceLegacySse
|
|
{
|
|
get => HardwareCapabilities.ForceLegacySse;
|
|
set => HardwareCapabilities.ForceLegacySse = value;
|
|
}
|
|
|
|
internal static bool UseSse => UseSseIfAvailable && HardwareCapabilities.SupportsSse;
|
|
internal static bool UseSse2 => UseSse2IfAvailable && HardwareCapabilities.SupportsSse2;
|
|
internal static bool UseSse3 => UseSse3IfAvailable && HardwareCapabilities.SupportsSse3;
|
|
internal static bool UseSsse3 => UseSsse3IfAvailable && HardwareCapabilities.SupportsSsse3;
|
|
internal static bool UseSse41 => UseSse41IfAvailable && HardwareCapabilities.SupportsSse41;
|
|
internal static bool UseSse42 => UseSse42IfAvailable && HardwareCapabilities.SupportsSse42;
|
|
internal static bool UsePopCnt => UsePopCntIfAvailable && HardwareCapabilities.SupportsPopcnt;
|
|
internal static bool UseAvx => UseAvxIfAvailable && HardwareCapabilities.SupportsAvx && !ForceLegacySse;
|
|
internal static bool UseF16c => UseF16cIfAvailable && HardwareCapabilities.SupportsF16c;
|
|
internal static bool UseFma => UseFmaIfAvailable && HardwareCapabilities.SupportsFma;
|
|
internal static bool UseAesni => UseAesniIfAvailable && HardwareCapabilities.SupportsAesni;
|
|
internal static bool UsePclmulqdq => UsePclmulqdqIfAvailable && HardwareCapabilities.SupportsPclmulqdq;
|
|
internal static bool UseSha => UseShaIfAvailable && HardwareCapabilities.SupportsSha;
|
|
internal static bool UseGfni => UseGfniIfAvailable && HardwareCapabilities.SupportsGfni;
|
|
}
|
|
} |